[Commits] Rev 3379: Merge fix for BUG#912510 in file:///home/psergey/dev2/5.3-look48/

Sergey Petrunya psergey at askmonty.org
Tue Jan 10 16:20:57 EET 2012


At file:///home/psergey/dev2/5.3-look48/

------------------------------------------------------------
revno: 3379 [merge]
revision-id: psergey at askmonty.org-20120110142056-vfrkhr2y6u6va4el
parent: monty at askmonty.org-20120109114947-yzia3ywl2xk0774k
parent: psergey at askmonty.org-20120108104314-xa6cxdbfive3elwf
committer: Sergey Petrunya <psergey at askmonty.org>
branch nick: 5.3-look48
timestamp: Tue 2012-01-10 18:20:56 +0400
message:
  Merge fix for BUG#912510
modified:
  mysql-test/r/subselect_sj.result subselect_sj.result-20100117143926-nrop4ku355g3kv8b-1
  mysql-test/r/subselect_sj_jcl6.result subselect_sj_jcl6.re-20100117143928-7vzk51yaf29cdavp-1
  mysql-test/t/subselect_sj.test subselect_sj.test-20100117143931-qp396ufpe3k0scre-1
  sql/field_conv.cc              sp1f-field_conv.cc-19700101030959-uuzkb66ot4kog3hexkbr2owd2zrkiazt
  sql/sql_select.cc              sp1f-sql_select.cc-19700101030959-egb7whpkh76zzvikycs5nsnuviu4fdlb
=== modified file 'mysql-test/r/subselect_sj.result'
--- a/mysql-test/r/subselect_sj.result	2011-12-24 16:55:10 +0000
+++ b/mysql-test/r/subselect_sj.result	2012-01-08 10:43:14 +0000
@@ -2152,4 +2152,21 @@
 set optimizer_prune_level= @opl_901399;
 set optimizer_switch= @os_091399;
 DROP TABLE t1,t2;
+#
+# BUG#912510: Crash in do_copy_not_null with semijoin=ON, firstmatch=ON, aggregate ...
+#
+CREATE TABLE t1 ( a VARCHAR(1) NOT NULL );
+INSERT INTO t1 VALUES ('k'),('l');
+CREATE TABLE t2 ( b VARCHAR(1) NOT NULL, KEY(b) );
+INSERT INTO t2 VALUES ('k'),('l');
+CREATE TABLE t3 ( c VARCHAR(1) NOT NULL, KEY(c) );
+INSERT INTO t3 VALUES ('m'),('n');
+SELECT a, COUNT(*) FROM t1
+WHERE a IN (
+SELECT b FROM t2 force index(b), t3 force index(c)
+WHERE c = b AND b = a
+);
+a	COUNT(*)
+NULL	0
+DROP TABLE t1, t2, t3;
 set optimizer_switch=@subselect_sj_tmp;

=== modified file 'mysql-test/r/subselect_sj_jcl6.result'
--- a/mysql-test/r/subselect_sj_jcl6.result	2011-12-24 16:55:10 +0000
+++ b/mysql-test/r/subselect_sj_jcl6.result	2012-01-08 10:43:14 +0000
@@ -2166,6 +2166,23 @@
 set optimizer_prune_level= @opl_901399;
 set optimizer_switch= @os_091399;
 DROP TABLE t1,t2;
+#
+# BUG#912510: Crash in do_copy_not_null with semijoin=ON, firstmatch=ON, aggregate ...
+#
+CREATE TABLE t1 ( a VARCHAR(1) NOT NULL );
+INSERT INTO t1 VALUES ('k'),('l');
+CREATE TABLE t2 ( b VARCHAR(1) NOT NULL, KEY(b) );
+INSERT INTO t2 VALUES ('k'),('l');
+CREATE TABLE t3 ( c VARCHAR(1) NOT NULL, KEY(c) );
+INSERT INTO t3 VALUES ('m'),('n');
+SELECT a, COUNT(*) FROM t1
+WHERE a IN (
+SELECT b FROM t2 force index(b), t3 force index(c)
+WHERE c = b AND b = a
+);
+a	COUNT(*)
+NULL	0
+DROP TABLE t1, t2, t3;
 set optimizer_switch=@subselect_sj_tmp;
 #
 # BUG#49129: Wrong result with IN-subquery with join_cache_level=6 and firstmatch=off

=== modified file 'mysql-test/t/subselect_sj.test'
--- a/mysql-test/t/subselect_sj.test	2011-12-24 16:55:10 +0000
+++ b/mysql-test/t/subselect_sj.test	2012-01-08 10:43:14 +0000
@@ -1997,6 +1997,25 @@
 
 DROP TABLE t1,t2;
 
+--echo #
+--echo # BUG#912510: Crash in do_copy_not_null with semijoin=ON, firstmatch=ON, aggregate ...
+--echo #
+CREATE TABLE t1 ( a VARCHAR(1) NOT NULL );
+INSERT INTO t1 VALUES ('k'),('l');
+
+CREATE TABLE t2 ( b VARCHAR(1) NOT NULL, KEY(b) );
+INSERT INTO t2 VALUES ('k'),('l');
+
+CREATE TABLE t3 ( c VARCHAR(1) NOT NULL, KEY(c) );
+INSERT INTO t3 VALUES ('m'),('n');
+
+SELECT a, COUNT(*) FROM t1
+  WHERE a IN (
+    SELECT b FROM t2 force index(b), t3 force index(c)
+    WHERE c = b AND b = a
+  );
+
+DROP TABLE t1, t2, t3;
 
 # The following command must be the last one the file 
 set optimizer_switch=@subselect_sj_tmp;

=== modified file 'sql/field_conv.cc'
--- a/sql/field_conv.cc	2011-12-11 09:34:44 +0000
+++ b/sql/field_conv.cc	2012-01-08 10:43:14 +0000
@@ -248,6 +248,25 @@
   }
 }
 
+/*
+  Copy: (not-NULL field in table that can be NULL-complemented) -> (not-NULL
+  field)
+*/
+static void do_copy_nullable_row_to_notnull(Copy_field *copy)
+{
+  if (*copy->null_row ||
+      (copy->from_null_ptr && (*copy->from_null_ptr & copy->from_bit)))
+  {
+    copy->to_field->set_warning(MYSQL_ERROR::WARN_LEVEL_WARN,
+                                WARN_DATA_TRUNCATED, 1);
+    copy->to_field->reset();
+  }
+  else
+  {
+    (copy->do_copy2)(copy);
+  }
+
+}
 
 /* Copy: (NULL-able field) -> (not NULL-able field) */
 static void do_copy_not_null(Copy_field *copy)
@@ -638,7 +657,15 @@
       else if (to_field == to_field->table->next_number_field)
         do_copy= do_copy_next_number;
       else
-        do_copy= do_copy_not_null;
+      {
+        if (!from_null_ptr)
+        {
+          null_row= &from->table->null_row;
+          do_copy= do_copy_nullable_row_to_notnull;
+        }
+        else
+          do_copy= do_copy_not_null;
+      }
     }
   }
   else if (to_field->real_maybe_null())

=== modified file 'sql/sql_select.cc'
--- a/sql/sql_select.cc	2011-12-24 16:55:10 +0000
+++ b/sql/sql_select.cc	2012-01-08 10:43:14 +0000
@@ -646,6 +646,9 @@
       aggregate functions and non-aggregate fields, any non-aggregated field
       may produce a NULL value. Set all fields of each table as nullable before
       semantic analysis to take into account this change of nullability.
+
+      Note: this loop doesn't touch tables inside merged semi-joins, because
+      subquery-to-semijoin conversion has not been done yet. This is intended.
     */
     if (mixed_implicit_grouping)
       tbl->table->maybe_null= 1;



More information about the commits mailing list