diff options
author | Sergey Glukhov <Sergey.Glukhov@sun.com> | 2010-02-12 13:44:20 +0400 |
---|---|---|
committer | Sergey Glukhov <Sergey.Glukhov@sun.com> | 2010-02-12 13:44:20 +0400 |
commit | 46cffd7f5b585527387e2a23d1c3c43d2b14bf2c (patch) | |
tree | eb5fe8ec07789d4b60868b31919ad12b97c01348 | |
parent | 80164ae9a08041e67c65460d9bb2a6b0e1aeb277 (diff) | |
download | mariadb-git-46cffd7f5b585527387e2a23d1c3c43d2b14bf2c.tar.gz |
Bug#48294 assertion when creating a view based on some row() construct in select query
In case of 'CREATE VIEW' subselect transformation does not happen(see JOIN::prepare).
During fix_fields Item_row may call is_null() method for its arugmens which
leads to item calculation(wrong subselect in our case as
transformation did not happen before). This is_null() call
does not make sence for 'CREATE VIEW'.
Note:
Only Item_row is affected because other items don't call is_null()
during fix_fields() for arguments.
mysql-test/r/view.result:
test case
mysql-test/t/view.test:
test case
sql/item_row.cc:
skip is_null() call in case of 'CREATE VIEW' as unnecessary.
-rw-r--r-- | mysql-test/r/view.result | 6 | ||||
-rw-r--r-- | mysql-test/t/view.test | 13 | ||||
-rw-r--r-- | sql/item_row.cc | 7 |
3 files changed, 25 insertions, 1 deletions
diff --git a/mysql-test/r/view.result b/mysql-test/r/view.result index 11457e88eb7..f12c9d6a31d 100644 --- a/mysql-test/r/view.result +++ b/mysql-test/r/view.result @@ -3868,6 +3868,12 @@ Note 1599 View `test`.`v2` has no creation context DROP VIEW v1,v2; DROP TABLE t1,t2; DROP FUNCTION f1; +CREATE TABLE t1(f1 INT); +INSERT INTO t1 VALUES (); +CREATE VIEW v1 AS SELECT 1 FROM t1 WHERE +ROW(1,1) >= ROW(1, (SELECT 1 FROM t1 WHERE f1 >= ANY ( SELECT '1' ))); +DROP VIEW v1; +DROP TABLE t1; # ----------------------------------------------------------------- # -- End of 5.1 tests. # ----------------------------------------------------------------- diff --git a/mysql-test/t/view.test b/mysql-test/t/view.test index 1165c68494b..1d0796469f2 100644 --- a/mysql-test/t/view.test +++ b/mysql-test/t/view.test @@ -3903,6 +3903,19 @@ DROP VIEW v1,v2; DROP TABLE t1,t2; DROP FUNCTION f1; + +# +# Bug#48294 assertion when creating a view based on some row() construct in select query +# +CREATE TABLE t1(f1 INT); +INSERT INTO t1 VALUES (); + +CREATE VIEW v1 AS SELECT 1 FROM t1 WHERE +ROW(1,1) >= ROW(1, (SELECT 1 FROM t1 WHERE f1 >= ANY ( SELECT '1' ))); + +DROP VIEW v1; +DROP TABLE t1; + --echo # ----------------------------------------------------------------- --echo # -- End of 5.1 tests. --echo # ----------------------------------------------------------------- diff --git a/sql/item_row.cc b/sql/item_row.cc index 28de03bf049..29b37eb2bc0 100644 --- a/sql/item_row.cc +++ b/sql/item_row.cc @@ -71,7 +71,12 @@ bool Item_row::fix_fields(THD *thd, Item **ref) Item *item= *arg; used_tables_cache |= item->used_tables(); const_item_cache&= item->const_item() && !with_null; - if (const_item_cache) + /* + Some subqueries transformations aren't done in the view_prepare_mode thus + is_null() will fail. So we skip is_null() calculation for CREATE VIEW as + not necessary. + */ + if (const_item_cache && !thd->lex->view_prepare_mode) { if (item->cols() > 1) with_null|= item->null_inside(); |