List:Commits« Previous MessageNext Message »
From:Sergey Petrunia Date:May 5 2006 11:04am
Subject:bk commit into 4.1 tree (sergefp:1.2478) BUG#16798
View as plain text  
Below is the list of changes that have just been committed into a local
4.1 repository of psergey. When psergey does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html

ChangeSet
  1.2478 06/05/05 15:04:44 sergefp@stripped +3 -0
  BUG#16798: Inapplicable ref_or_null query plan and bad query result on random occasions 
  The bug was as follows: When merge_key_fields() encounters "t.key=X OR t.key=Y" it will 
  try to join them into ref_or_null access via "t.key=X OR NULL". In order to make this 
  inference it checks if Y<=>NULL, ignoring the fact that value of Y may be not yet known.
  
  The fix is that the check if Y<=>NULL is made only if value of Y is known (i.e. it is a
  constant).

  sql/sql_select.cc
    1.453 06/05/05 15:04:41 sergefp@stripped +2 -1
    BUG#16798: Inapplicable ref_or_null query plan and bad query result on random occasions 
    In merge_key_fields() don't call val->is_null() if the value of val is not known.

  mysql-test/t/innodb_mysql.test
    1.3 06/05/05 15:04:41 sergefp@stripped +55 -1
    Testcase for BUG16798

  mysql-test/r/innodb_mysql.result
    1.3 06/05/05 15:04:41 sergefp@stripped +56 -1
    Testcase for BUG16798

# This is a BitKeeper patch.  What follows are the unified diffs for the
# set of deltas contained in the patch.  The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User:	sergefp
# Host:	newbox.mylan
# Root:	/home/psergey/mysql-4.1-bug16798

--- 1.452/sql/sql_select.cc	2006-04-21 09:15:34 +04:00
+++ 1.453/sql/sql_select.cc	2006-05-05 15:04:41 +04:00
@@ -2090,7 +2090,8 @@
                                 new_fields->null_rejecting);
 	}
 	else if (old->eq_func && new_fields->eq_func &&
-		 (old->val->is_null() || new_fields->val->is_null()))
+		 ((!old->val->used_tables() && old->val->is_null()) || 
+                  new_fields->val->is_null()))
 	{
 	  /* field = expression OR field IS NULL */
 	  old->level= and_level;

--- 1.2/mysql-test/r/innodb_mysql.result	2006-04-26 11:15:06 +04:00
+++ 1.3/mysql-test/r/innodb_mysql.result	2006-05-05 15:04:41 +04:00
@@ -1 +1,56 @@
-drop table if exists t1;
+drop table if exists t1,t2;
+create table t1 (
+c_id int(11) not null default '0',
+org_id int(11) default null,
+unique key contacts$c_id (c_id),
+key contacts$org_id (org_id)
+) engine=innodb;
+insert into t1 values 
+(2,null),(120,null),(141,null),(218,7), (128,1),
+(151,2),(234,2),(236,2),(243,2),(255,2),(259,2),(232,3),(235,3),(238,3),
+(246,3),(253,3),(269,3),(285,3),(291,3),(293,3),(131,4),(230,4),(231,4);
+create table t2 (
+slai_id int(11) not null default '0',
+owner_tbl int(11) default null,
+owner_id int(11) default null,
+sla_id int(11) default null,
+inc_web int(11) default null,
+inc_email int(11) default null,
+inc_chat int(11) default null,
+inc_csr int(11) default null,
+inc_total int(11) default null,
+time_billed int(11) default null,
+activedate timestamp null default null,
+expiredate timestamp null default null,
+state int(11) default null,
+sla_set int(11) default null,
+unique key t2$slai_id (slai_id),
+key t2$owner_id (owner_id),
+key t2$sla_id (sla_id)
+) engine=innodb;
+insert into t2(slai_id, owner_tbl, owner_id, sla_id) values
+(1,3,1,1), (3,3,10,2), (4,3,3,6), (5,3,2,5), (6,3,8,3), (7,3,9,7),
+(8,3,6,8), (9,3,4,9), (10,3,5,10), (11,3,11,11), (12,3,7,12);
+flush tables;
+select si.slai_id
+from t1 c join t2 si on
+((si.owner_tbl = 3 and si.owner_id = c.org_id) or 
+( si.owner_tbl = 2 and si.owner_id = c.c_id)) 
+where 
+c.c_id = 218 and expiredate is null;
+slai_id
+12
+select * from t1 where org_id is null;
+c_id	org_id
+2	NULL
+120	NULL
+141	NULL
+select si.slai_id
+from t1 c join t2 si on
+((si.owner_tbl = 3 and si.owner_id = c.org_id) or 
+( si.owner_tbl = 2 and si.owner_id = c.c_id)) 
+where 
+c.c_id = 218 and expiredate is null;
+slai_id
+12
+drop table t1, t2;

--- 1.2/mysql-test/t/innodb_mysql.test	2006-04-26 11:15:06 +04:00
+++ 1.3/mysql-test/t/innodb_mysql.test	2006-05-05 15:04:41 +04:00
@@ -1,5 +1,59 @@
 -- source include/have_innodb.inc
 
 --disable_warnings
-drop table if exists t1;
+drop table if exists t1,t2;
 --enable_warnings
+
+# BUG#16798: Uninitialized row buffer reads in ref-or-null optimizer
+# (repeatable only w/innodb).
+create table t1 (
+  c_id int(11) not null default '0',
+  org_id int(11) default null,
+  unique key contacts$c_id (c_id),
+  key contacts$org_id (org_id)
+) engine=innodb;
+insert into t1 values 
+  (2,null),(120,null),(141,null),(218,7), (128,1),
+  (151,2),(234,2),(236,2),(243,2),(255,2),(259,2),(232,3),(235,3),(238,3),
+  (246,3),(253,3),(269,3),(285,3),(291,3),(293,3),(131,4),(230,4),(231,4);
+
+create table t2 (
+  slai_id int(11) not null default '0',
+  owner_tbl int(11) default null,
+  owner_id int(11) default null,
+  sla_id int(11) default null,
+  inc_web int(11) default null,
+  inc_email int(11) default null,
+  inc_chat int(11) default null,
+  inc_csr int(11) default null,
+  inc_total int(11) default null,
+  time_billed int(11) default null,
+  activedate timestamp null default null,
+  expiredate timestamp null default null,
+  state int(11) default null,
+  sla_set int(11) default null,
+  unique key t2$slai_id (slai_id),
+  key t2$owner_id (owner_id),
+  key t2$sla_id (sla_id)
+) engine=innodb;
+insert into t2(slai_id, owner_tbl, owner_id, sla_id) values
+  (1,3,1,1), (3,3,10,2), (4,3,3,6), (5,3,2,5), (6,3,8,3), (7,3,9,7),
+  (8,3,6,8), (9,3,4,9), (10,3,5,10), (11,3,11,11), (12,3,7,12);
+
+flush tables;
+select si.slai_id
+from t1 c join t2 si on
+  ((si.owner_tbl = 3 and si.owner_id = c.org_id) or 
+   ( si.owner_tbl = 2 and si.owner_id = c.c_id)) 
+where 
+  c.c_id = 218 and expiredate is null;
+  
+select * from t1 where org_id is null;
+select si.slai_id
+from t1 c join t2 si on
+  ((si.owner_tbl = 3 and si.owner_id = c.org_id) or 
+   ( si.owner_tbl = 2 and si.owner_id = c.c_id)) 
+where 
+  c.c_id = 218 and expiredate is null;
+
+drop table t1, t2;
Thread
bk commit into 4.1 tree (sergefp:1.2478) BUG#16798Sergey Petrunia5 May