Uploaded image for project: 'MariaDB Server'
  1. MariaDB Server
  2. MDEV-12486

Incorrect results with prefix_index_cluster_optimization enabled

Details

    Description

      The following query is supposed to return two rows, containing '1' and '3', but it only returns '1'.

       SELECT blog_id FROM wp_blogs WHERE domain IN ('domain.no') AND path IN ( '/fondsinvesteringer/', '/' ); 

      Using extended explain however, it correctly tells me it is supposed to return 2 rows.

      This is from a wordpress database. 'blog_id' is a bigint(20) primary key. 'domain' and 'path' are: varchar(200) utf8mb4_unicode_ci.

      explain extended SELECT blog_id FROM wp_blogs WHERE domain IN ('domain.no') AND path IN ( '/fondsinvesteringer/', '/' );

      id 	select_type 	table 	type 	possible_keys 	key 	key_len 	ref 	rows 	filtered 	Extra 	
      1 	SIMPLE 	wp_blogs 	range 	domain 	domain 	224 	NULL	2 	100.00 	Using where
      

      show columns from wp_blogs;

      Field 	Type 	Null 	Key 	Default 	Extra 	
      blog_id 	bigint(20) 	NO 	PRI 	NULL	auto_increment
      site_id 	bigint(20) 	NO 		0 	
      domain 	varchar(200) 	NO 	MUL 		
      path 	varchar(100) 	NO 			
      registered 	datetime 	NO 		0000-00-00 00:00:00 	
      last_updated 	datetime 	NO 		0000-00-00 00:00:00 	
      public 	tinyint(2) 	NO 		1 	
      archived 	tinyint(2) 	NO 		0 	
      mature 	tinyint(2) 	NO 		0 	
      spam 	tinyint(2) 	NO 		0 	
      deleted 	tinyint(2) 	NO 		0 	
      lang_id 	int(11) 	NO 	MUL 	0
      

      Attachments

        Issue Links

          Activity

            Thanks for the report.

            MTR-like test case

            --source include/have_innodb.inc
             
            DROP TABLE IF EXISTS wp_blogs;
            CREATE TABLE wp_blogs (
              blog_id bigint(20) NOT NULL auto_increment,
              site_id bigint(20) NOT NULL default '0',
              domain varchar(200) NOT NULL default '',
              path varchar(100) NOT NULL default '',
              registered datetime NOT NULL default '0000-00-00 00:00:00',
              last_updated datetime NOT NULL default '0000-00-00 00:00:00',
              public tinyint(2) NOT NULL default '1',
              archived tinyint(2) NOT NULL default '0',
              mature tinyint(2) NOT NULL default '0',
              spam tinyint(2) NOT NULL default '0',
              deleted tinyint(2) NOT NULL default '0',
              lang_id int(11) NOT NULL default '0',
              PRIMARY KEY  (blog_id),
              KEY domain (domain(50),path(5)),
              KEY lang_id (lang_id)
            ) ENGINE=InnoDB DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
             
             
             
            insert into wp_blogs (domain, path) values ('domain.no', '/fondsinvesteringer/');
            insert into wp_blogs (domain, path) values ('domain.no', '/');
            insert into wp_blogs (domain, path) values ('foo', 'bar');
            insert into wp_blogs (domain, path) values ('bar', 'foo');
            insert into wp_blogs (domain, path) values ('foo', 'foo');
            insert into wp_blogs (domain, path) values ('bar', 'bar');
            insert into wp_blogs (domain, path) values ('foo', 'foobar');
            insert into wp_blogs (domain, path) values ('bar', 'foobar');
            insert into wp_blogs (domain, path) values ('foobar', 'foobar');
             
             
            set global innodb_prefix_index_cluster_optimization=off;
            SELECT blog_id FROM wp_blogs WHERE domain IN ('domain.no') AND path IN ( '/fondsinvesteringer/', '/' );
             
            set global innodb_prefix_index_cluster_optimization=on;
            SELECT blog_id FROM wp_blogs WHERE domain IN ('domain.no') AND path IN ( '/fondsinvesteringer/', '/' );
             
            DROP TABLE wp_blogs;
            SET GLOBAL innodb_prefix_index_cluster_optimization=DEFAULT;
            

            Actual results

            set global innodb_prefix_index_cluster_optimization=off;
            SELECT blog_id FROM wp_blogs WHERE domain IN ('domain.no') AND path IN ( '/fondsinvesteringer/', '/' );
            blog_id
            2
            1
            set global innodb_prefix_index_cluster_optimization=on;
            SELECT blog_id FROM wp_blogs WHERE domain IN ('domain.no') AND path IN ( '/fondsinvesteringer/', '/' );
            blog_id
            2
            

            elenst Elena Stepanova added a comment - Thanks for the report. MTR-like test case --source include/have_innodb.inc   DROP TABLE IF EXISTS wp_blogs; CREATE TABLE wp_blogs ( blog_id bigint (20) NOT NULL auto_increment, site_id bigint (20) NOT NULL default '0' , domain varchar (200) NOT NULL default '' , path varchar (100) NOT NULL default '' , registered datetime NOT NULL default '0000-00-00 00:00:00' , last_updated datetime NOT NULL default '0000-00-00 00:00:00' , public tinyint(2) NOT NULL default '1' , archived tinyint(2) NOT NULL default '0' , mature tinyint(2) NOT NULL default '0' , spam tinyint(2) NOT NULL default '0' , deleted tinyint(2) NOT NULL default '0' , lang_id int (11) NOT NULL default '0' , PRIMARY KEY (blog_id), KEY domain (domain(50),path(5)), KEY lang_id (lang_id) ) ENGINE=InnoDB DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;       insert into wp_blogs (domain, path) values ( 'domain.no' , '/fondsinvesteringer/' ); insert into wp_blogs (domain, path) values ( 'domain.no' , '/' ); insert into wp_blogs (domain, path) values ( 'foo' , 'bar' ); insert into wp_blogs (domain, path) values ( 'bar' , 'foo' ); insert into wp_blogs (domain, path) values ( 'foo' , 'foo' ); insert into wp_blogs (domain, path) values ( 'bar' , 'bar' ); insert into wp_blogs (domain, path) values ( 'foo' , 'foobar' ); insert into wp_blogs (domain, path) values ( 'bar' , 'foobar' ); insert into wp_blogs (domain, path) values ( 'foobar' , 'foobar' );     set global innodb_prefix_index_cluster_optimization= off ; SELECT blog_id FROM wp_blogs WHERE domain IN ( 'domain.no' ) AND path IN ( '/fondsinvesteringer/' , '/' );   set global innodb_prefix_index_cluster_optimization= on ; SELECT blog_id FROM wp_blogs WHERE domain IN ( 'domain.no' ) AND path IN ( '/fondsinvesteringer/' , '/' );   DROP TABLE wp_blogs; SET GLOBAL innodb_prefix_index_cluster_optimization= DEFAULT ; Actual results set global innodb_prefix_index_cluster_optimization=off; SELECT blog_id FROM wp_blogs WHERE domain IN ('domain.no') AND path IN ( '/fondsinvesteringer/', '/' ); blog_id 2 1 set global innodb_prefix_index_cluster_optimization=on; SELECT blog_id FROM wp_blogs WHERE domain IN ('domain.no') AND path IN ( '/fondsinvesteringer/', '/' ); blog_id 2

            In MDEV-23600, I identified and fixed some problems with this option.

            marko Marko Mäkelä added a comment - In MDEV-23600 , I identified and fixed some problems with this option.

            People

              marko Marko Mäkelä
              Dead2 Hans Kristian Rosbach
              Votes:
              0 Vote for this issue
              Watchers:
              3 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved:

                Git Integration

                  Error rendering 'com.xiplink.jira.git.jira_git_plugin:git-issue-webpanel'. Please contact your Jira administrators.