From 8a39147a6adf83a430d7d9bf951238519157603d Mon Sep 17 00:00:00 2001 From: Gleb Shchepa Date: Mon, 18 May 2009 23:43:06 +0500 Subject: [PATCH] Bug#40825: Error 1356 while selecting from a view with a "HAVING" clause though query works SELECT from views defined like: CREATE VIEW v1 (view_column) AS SELECT c AS alias FROM t1 HAVING alias fails with an error 1356: View '...' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them CREATE VIEW form with a (column list) substitutes SELECT column names/aliases with names from a view column list. However, alias references in HAVING clause was not substituted. The Item_ref::print function has been modified to write correct aliased names of underlying items into VIEW definition generation/.frm file. --- mysql-test/r/view.result | 19 +++++++++++++++++++ mysql-test/t/view.test | 23 +++++++++++++++++++++++ sql/item.cc | 3 ++- 3 files changed, 44 insertions(+), 1 deletion(-) diff --git a/mysql-test/r/view.result b/mysql-test/r/view.result index 58aa614c508..a7ac971ef45 100644 --- a/mysql-test/r/view.result +++ b/mysql-test/r/view.result @@ -3704,6 +3704,25 @@ SELECT * FROM v1 IGNORE INDEX (c2) WHERE c2=2; ERROR HY000: Key 'c2' doesn't exist in table 'v1' DROP VIEW v1; DROP TABLE t1; +# ----------------------------------------------------------------- +# -- Bug#40825: Error 1356 while selecting from a view +# -- with a "HAVING" clause though query works +# ----------------------------------------------------------------- + +CREATE TABLE t1 (c INT); + +CREATE VIEW v1 (view_column) AS SELECT c AS alias FROM t1 HAVING alias; +SHOW CREATE VIEW v1; +View Create View +v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select `t1`.`c` AS `view_column` from `t1` having `view_column` +SELECT * FROM v1; +view_column + +DROP VIEW v1; +DROP TABLE t1; + +# -- End of test case for Bug#40825 + # ----------------------------------------------------------------- # -- End of 5.0 tests. # ----------------------------------------------------------------- diff --git a/mysql-test/t/view.test b/mysql-test/t/view.test index 6437e546697..89e68e4bd99 100644 --- a/mysql-test/t/view.test +++ b/mysql-test/t/view.test @@ -3680,6 +3680,29 @@ SELECT * FROM v1 IGNORE INDEX (c2) WHERE c2=2; DROP VIEW v1; DROP TABLE t1; +--echo # ----------------------------------------------------------------- +--echo # -- Bug#40825: Error 1356 while selecting from a view +--echo # -- with a "HAVING" clause though query works +--echo # ----------------------------------------------------------------- +--echo + +CREATE TABLE t1 (c INT); + +--echo + +CREATE VIEW v1 (view_column) AS SELECT c AS alias FROM t1 HAVING alias; +SHOW CREATE VIEW v1; +SELECT * FROM v1; + +--echo + +DROP VIEW v1; +DROP TABLE t1; + +--echo +--echo # -- End of test case for Bug#40825 +--echo + --echo # ----------------------------------------------------------------- --echo # -- End of 5.0 tests. --echo # ----------------------------------------------------------------- diff --git a/sql/item.cc b/sql/item.cc index 13f09914ec6..7c4e86d756f 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -5648,7 +5648,8 @@ void Item_ref::print(String *str) !table_name && name && alias_name_used) { THD *thd= current_thd; - append_identifier(thd, str, name, (uint) strlen(name)); + append_identifier(thd, str, (*ref)->real_item()->name, + (*ref)->real_item()->name_length); } else (*ref)->print(str);