summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIgor Babaev <igor@askmonty.org>2011-08-16 22:48:35 -0700
committerIgor Babaev <igor@askmonty.org>2011-08-16 22:48:35 -0700
commit249a10c7dd879b26665a7d14d9ce4a5c90ca8c77 (patch)
tree77bb0b1d419360de2ce89118c7c3e3081849b123
parent923dc9ea768dac424f27ae8d8634708e953dab0c (diff)
downloadmariadb-git-249a10c7dd879b26665a7d14d9ce4a5c90ca8c77.tar.gz
Fixed LP bug #825035.
The value of maybe_null flag should be saved for the second execution of a prepared statement from SELECT that uses an outer join.
-rw-r--r--mysql-test/r/join_outer.result22
-rw-r--r--mysql-test/r/join_outer_jcl6.result22
-rw-r--r--mysql-test/t/join_outer.test19
-rw-r--r--sql/sql_base.cc1
-rw-r--r--sql/sql_insert.cc1
-rw-r--r--sql/sql_lex.cc4
-rw-r--r--sql/sql_union.cc3
-rw-r--r--sql/table.h1
8 files changed, 73 insertions, 0 deletions
diff --git a/mysql-test/r/join_outer.result b/mysql-test/r/join_outer.result
index cc3723734d8..a400cbc44ed 100644
--- a/mysql-test/r/join_outer.result
+++ b/mysql-test/r/join_outer.result
@@ -1593,3 +1593,25 @@ FROM t1 LEFT JOIN t2 ON (t2.b) IN (SELECT c2 from t3) AND t2.a = 1;
b
NULL
DROP TABLE t1,t2,t3;
+#
+# LP bug #825035: second execution of PS with outer join
+#
+CREATE TABLE t1 (a int);
+INSERT INTO t1 VALUES (1),(2),(3),(4);
+CREATE TABLE t2 (a int);
+PREPARE stmt FROM
+"SELECT * FROM t1 LEFT JOIN t2 ON t1.a = t2.a";
+EXECUTE stmt;
+a a
+1 NULL
+2 NULL
+3 NULL
+4 NULL
+EXECUTE stmt;
+a a
+1 NULL
+2 NULL
+3 NULL
+4 NULL
+DEALLOCATE PREPARE stmt;
+DROP TABLE t1,t2;
diff --git a/mysql-test/r/join_outer_jcl6.result b/mysql-test/r/join_outer_jcl6.result
index 493b5542ebf..735fb514d08 100644
--- a/mysql-test/r/join_outer_jcl6.result
+++ b/mysql-test/r/join_outer_jcl6.result
@@ -1602,6 +1602,28 @@ FROM t1 LEFT JOIN t2 ON (t2.b) IN (SELECT c2 from t3) AND t2.a = 1;
b
NULL
DROP TABLE t1,t2,t3;
+#
+# LP bug #825035: second execution of PS with outer join
+#
+CREATE TABLE t1 (a int);
+INSERT INTO t1 VALUES (1),(2),(3),(4);
+CREATE TABLE t2 (a int);
+PREPARE stmt FROM
+"SELECT * FROM t1 LEFT JOIN t2 ON t1.a = t2.a";
+EXECUTE stmt;
+a a
+1 NULL
+2 NULL
+3 NULL
+4 NULL
+EXECUTE stmt;
+a a
+1 NULL
+2 NULL
+3 NULL
+4 NULL
+DEALLOCATE PREPARE stmt;
+DROP TABLE t1,t2;
set join_cache_level=default;
show variables like 'join_cache_level';
Variable_name Value
diff --git a/mysql-test/t/join_outer.test b/mysql-test/t/join_outer.test
index 253808c4eb7..d47ceab6b74 100644
--- a/mysql-test/t/join_outer.test
+++ b/mysql-test/t/join_outer.test
@@ -1154,3 +1154,22 @@ SELECT t2.b
FROM t1 LEFT JOIN t2 ON (t2.b) IN (SELECT c2 from t3) AND t2.a = 1;
DROP TABLE t1,t2,t3;
+
+--echo #
+--echo # LP bug #825035: second execution of PS with outer join
+--echo #
+
+CREATE TABLE t1 (a int);
+INSERT INTO t1 VALUES (1),(2),(3),(4);
+
+CREATE TABLE t2 (a int);
+
+PREPARE stmt FROM
+"SELECT * FROM t1 LEFT JOIN t2 ON t1.a = t2.a";
+
+EXECUTE stmt;
+EXECUTE stmt;
+
+DEALLOCATE PREPARE stmt;
+
+DROP TABLE t1,t2;
diff --git a/sql/sql_base.cc b/sql/sql_base.cc
index 5f5f8125c79..c025011e8e5 100644
--- a/sql/sql_base.cc
+++ b/sql/sql_base.cc
@@ -7847,6 +7847,7 @@ bool setup_tables(THD *thd, Name_resolution_context *context,
{
table_list->table->tablenr= table_list->tablenr_exec;
table_list->table->map= table_list->map_exec;
+ table_list->table->maybe_null= table_list->maybe_null_exec;
table_list->table->pos_in_table_list= table_list;
}
select_lex->leaf_tables.push_back(table_list);
diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc
index 05a30ab49a4..386650ff99c 100644
--- a/sql/sql_insert.cc
+++ b/sql/sql_insert.cc
@@ -3015,6 +3015,7 @@ bool mysql_insert_select_prepare(THD *thd)
select_lex->leaf_tables_exec.push_back(table);
table->tablenr_exec= table->table->tablenr;
table->map_exec= table->table->map;
+ table->maybe_null_exec= table->table->maybe_null;
}
if (arena)
thd->restore_active_arena(arena, &backup);
diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc
index 021e7a3b5e8..fff1504b969 100644
--- a/sql/sql_lex.cc
+++ b/sql/sql_lex.cc
@@ -3588,6 +3588,10 @@ bool st_select_lex::save_leaf_tables(THD *thd)
return 1;
table->tablenr_exec= table->table->tablenr;
table->map_exec= table->table->map;
+ if (join && (join->select_options & SELECT_DESCRIBE))
+ table->maybe_null_exec= 0;
+ else
+ table->maybe_null_exec= table->table->maybe_null;
}
if (arena)
thd->restore_active_arena(arena, &backup);
diff --git a/sql/sql_union.cc b/sql/sql_union.cc
index d0ec95efc27..d2cb21a59a1 100644
--- a/sql/sql_union.cc
+++ b/sql/sql_union.cc
@@ -371,6 +371,7 @@ bool st_select_lex_unit::prepare(THD *thd_arg, select_result *sel_result,
ulonglong create_options;
uint save_tablenr= 0;
table_map save_map= 0;
+ uint save_maybe_null= 0;
while ((type= tp++))
{
@@ -429,6 +430,7 @@ bool st_select_lex_unit::prepare(THD *thd_arg, select_result *sel_result,
{
save_tablenr= result_table_list.tablenr_exec;
save_map= result_table_list.map_exec;
+ save_maybe_null= result_table_list.maybe_null_exec;
}
bzero((char*) &result_table_list, sizeof(result_table_list));
result_table_list.db= (char*) "";
@@ -438,6 +440,7 @@ bool st_select_lex_unit::prepare(THD *thd_arg, select_result *sel_result,
{
result_table_list.tablenr_exec= save_tablenr;
result_table_list.map_exec= save_map;
+ result_table_list.maybe_null_exec= save_maybe_null;
}
thd_arg->lex->current_select= lex_select_save;
diff --git a/sql/table.h b/sql/table.h
index c38a15df476..5dd464ac876 100644
--- a/sql/table.h
+++ b/sql/table.h
@@ -1448,6 +1448,7 @@ struct TABLE_LIST
table_map map_exec;
/* TODO: check if this can be joined with jtbm_table_no */
uint tablenr_exec;
+ uint maybe_null_exec;
/* Ptr to parent MERGE table list item. See top comment in ha_myisammrg.cc */
TABLE_LIST *parent_l;