summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <igor@rurik.mysql.com>2005-08-11 16:10:34 -0700
committerunknown <igor@rurik.mysql.com>2005-08-11 16:10:34 -0700
commit743fde2404fa423ed3af608b3478f9ee53748bbc (patch)
tree2e329ec5a7dfefef57fc1f38e7acfadc395104fa
parentfd9c0a92166aa7c63de274731fbf8303517020c9 (diff)
downloadmariadb-git-743fde2404fa423ed3af608b3478f9ee53748bbc.tar.gz
sql_base.cc:
Fixed bug #12382. INSERT statement effectively changed thd->set_query_id to 0, while SELECT statement changed it to 0. As a result the insert_fields function that expanded '*' was called with different values of thd->set_query_id for the query SELECT * FROM view depending on whether it was run after an INSERT or after a SELECT statement. This was corrected by restoring the old value of thd->set_query_id when returning from the function setup_fields where possible reset could occur. If the value of thd->set_query_id == 0 then the fields substituted instead of '*' were not registered as used for bitmaps used_keys. This caused selection of an invalid execution plan for the query SELECT * from <view>. view.result, view.test: Added a test case for bug #12382. mysql-test/t/view.test: Added a test case for bug #12382. mysql-test/r/view.result: Added a test case for bug #12382. sql/sql_base.cc: Fixed bug #12382. INSERT statement effectively changed thd->set_query_id to 0, while SELECT statement changed it to 0. As a result the insert_fields function that expanded '*' was called with different values of thd->set_query_id for the query SELECT * FROM view depending on whether it was run after an INSERT or after a SELECT statement. This was corrected by restoring the old value of thd->set_query_id when returning from the function setup_fields where possible reset could occur. If the value of thd->set_query_id == 0 then the fields substituted instead of '*' were not registered as used for bitmaps used_keys. This caused selection of an invalid execution plan for the query SELECT * from <view>.
-rw-r--r--mysql-test/r/view.result14
-rw-r--r--mysql-test/t/view.test19
-rw-r--r--sql/sql_base.cc5
3 files changed, 37 insertions, 1 deletions
diff --git a/mysql-test/r/view.result b/mysql-test/r/view.result
index 98020c7ec33..dcbdf3a99c4 100644
--- a/mysql-test/r/view.result
+++ b/mysql-test/r/view.result
@@ -2065,3 +2065,17 @@ pid GROUP_CONCAT(CONCAT(fn,' ',ln) ORDER BY 1)
2 c d
DROP VIEW v1;
DROP TABLE t1,t2;
+CREATE TABLE t1 (id int PRIMARY KEY, f varchar(255));
+CREATE VIEW v1 AS SELECT id, f FROM t1 WHERE id <= 2;
+INSERT INTO t1 VALUES (2, 'foo2');
+INSERT INTO t1 VALUES (1, 'foo1');
+SELECT * FROM v1;
+id f
+1 foo1
+2 foo2
+SELECT * FROM v1;
+id f
+1 foo1
+2 foo2
+DROP VIEW v1;
+DROP TABLE t1;
diff --git a/mysql-test/t/view.test b/mysql-test/t/view.test
index cba2d75fb7c..07724e8ff8d 100644
--- a/mysql-test/t/view.test
+++ b/mysql-test/t/view.test
@@ -1901,3 +1901,22 @@ SELECT pid,GROUP_CONCAT(CONCAT(fn,' ',ln) ORDER BY 1) FROM v1 GROUP BY pid;
DROP VIEW v1;
DROP TABLE t1,t2;
+
+#
+# Test for bug #12382: SELECT * FROM view after INSERT command
+#
+
+CREATE TABLE t1 (id int PRIMARY KEY, f varchar(255));
+CREATE VIEW v1 AS SELECT id, f FROM t1 WHERE id <= 2;
+INSERT INTO t1 VALUES (2, 'foo2');
+INSERT INTO t1 VALUES (1, 'foo1');
+
+SELECT * FROM v1;
+SELECT * FROM v1;
+
+DROP VIEW v1;
+DROP TABLE t1;
+
+
+
+
diff --git a/sql/sql_base.cc b/sql/sql_base.cc
index 0895901508d..949c398309c 100644
--- a/sql/sql_base.cc
+++ b/sql/sql_base.cc
@@ -3181,6 +3181,7 @@ bool setup_fields(THD *thd, Item **ref_pointer_array,
List<Item> *sum_func_list, bool allow_sum_func)
{
reg2 Item *item;
+ bool save_set_query_id= thd->set_query_id;
List_iterator<Item> it(fields);
DBUG_ENTER("setup_fields");
@@ -3208,6 +3209,7 @@ bool setup_fields(THD *thd, Item **ref_pointer_array,
if (!item->fixed && item->fix_fields(thd, it.ref()) ||
(item= *(it.ref()))->check_cols(1))
{
+ thd->set_query_id= save_set_query_id;
DBUG_RETURN(TRUE); /* purecov: inspected */
}
if (ref)
@@ -3215,8 +3217,9 @@ bool setup_fields(THD *thd, Item **ref_pointer_array,
if (item->with_sum_func && item->type() != Item::SUM_FUNC_ITEM &&
sum_func_list)
item->split_sum_func(thd, ref_pointer_array, *sum_func_list);
- thd->used_tables|=item->used_tables();
+ thd->used_tables|= item->used_tables();
}
+ thd->set_query_id= save_set_query_id;
DBUG_RETURN(test(thd->net.report_error));
}