diff options
author | unknown <igor@rurik.mysql.com> | 2005-08-11 16:10:34 -0700 |
---|---|---|
committer | unknown <igor@rurik.mysql.com> | 2005-08-11 16:10:34 -0700 |
commit | 743fde2404fa423ed3af608b3478f9ee53748bbc (patch) | |
tree | 2e329ec5a7dfefef57fc1f38e7acfadc395104fa | |
parent | fd9c0a92166aa7c63de274731fbf8303517020c9 (diff) | |
download | mariadb-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.result | 14 | ||||
-rw-r--r-- | mysql-test/t/view.test | 19 | ||||
-rw-r--r-- | sql/sql_base.cc | 5 |
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)); } |