diff options
-rw-r--r-- | mysql-test/r/view.result | 8 | ||||
-rw-r--r-- | mysql-test/t/view.test | 10 | ||||
-rw-r--r-- | sql/sql_base.cc | 22 |
3 files changed, 34 insertions, 6 deletions
diff --git a/mysql-test/r/view.result b/mysql-test/r/view.result index 7bcfaf8bdc3..0935397a8ff 100644 --- a/mysql-test/r/view.result +++ b/mysql-test/r/view.result @@ -1923,6 +1923,14 @@ ERROR HY000: Field of view 'test.v2' underlying table doesn't have a default val set sql_mode=default; drop view v2,v1; drop table t1; +create table t1 (f1 int); +insert into t1 values (1); +create view v1 as select f1 from t1; +select f1 as alias from v1; +alias +1 +drop view v1; +drop table t1; CREATE TABLE t1 (s1 int, s2 int); INSERT INTO t1 VALUES (1,2); CREATE VIEW v1 AS SELECT s2 AS s1, s1 AS s2 FROM t1; diff --git a/mysql-test/t/view.test b/mysql-test/t/view.test index 6b6b3d8a00f..9ce5004c51c 100644 --- a/mysql-test/t/view.test +++ b/mysql-test/t/view.test @@ -1763,6 +1763,16 @@ drop view v2,v1; drop table t1; # +# Bug#11399 Use an alias in a select statement on a view +# +create table t1 (f1 int); +insert into t1 values (1); +create view v1 as select f1 from t1; +select f1 as alias from v1; +drop view v1; +drop table t1; + +# # Test for bug #6120: SP cache to be invalidated when altering a view # diff --git a/sql/sql_base.cc b/sql/sql_base.cc index 7a7f2292703..a5ca3b393ff 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -2400,9 +2400,11 @@ Field *view_ref_found= (Field*) 0x2; name name of field item_name name of item if it will be created (VIEW) length length of name - ref expression substituted in VIEW should be + ref [in/out] expression substituted in VIEW should be passed using this reference (return view_ref_found) + (*ref != NULL) only if *ref contains + the item that we need to replace. check_grants_table do check columns grants for table? check_grants_view do check columns grants for view? allow_rowid do allow finding of "_rowid" field? @@ -2440,11 +2442,6 @@ find_field_in_table(THD *thd, TABLE_LIST *table_list, { if (!my_strcasecmp(system_charset_info, field_it.name(), name)) { - Item *item= field_it.create_item(thd); - if (!item) - { - DBUG_RETURN(0); - } if (table_list->schema_table_reformed) { /* @@ -2463,6 +2460,19 @@ find_field_in_table(THD *thd, TABLE_LIST *table_list, name, length)) DBUG_RETURN(WRONG_GRANT); #endif + Item *item= field_it.create_item(thd); + if (!item) + { + DBUG_RETURN(0); + } + /* + *ref != NULL means that *ref contains the item that we need to + replace. If the item was aliased by the user, set the alias to + the replacing item. + */ + if (*ref && !(*ref)->is_autogenerated_name) + item->set_name((*ref)->name, (*ref)->name_length, + system_charset_info); if (register_tree_change) thd->change_item_tree(ref, item); else |