Loading mysql-test/r/lowercase_view.result +16 −0 Original line number Diff line number Diff line Loading @@ -22,3 +22,19 @@ insert into v2aA values ((select max(col1) from v1aA)); ERROR HY000: You can't specify target table 'v2aa' for update in FROM clause drop view v2Aa,v1Aa; drop table t1Aa,t2Aa; create table t1Aa (col1 int); create view v1Aa as select col1 from t1Aa as AaA; show create view v1AA; View Create View v1aa CREATE ALGORITHM=UNDEFINED VIEW `test`.`v1aa` AS select `aaa`.`col1` AS `col1` from `test`.`t1aa` `AaA` drop view v1AA; select Aaa.col1 from t1Aa as AaA; col1 create view v1Aa as select Aaa.col1 from t1Aa as AaA; drop view v1AA; create view v1Aa as select AaA.col1 from t1Aa as AaA; show create view v1AA; View Create View v1aa CREATE ALGORITHM=UNDEFINED VIEW `test`.`v1aa` AS select `aaa`.`col1` AS `col1` from `test`.`t1aa` `AaA` drop view v1AA; drop table t1Aa; mysql-test/t/lowercase_view.test +15 −0 Original line number Diff line number Diff line Loading @@ -32,3 +32,18 @@ delete from v2aA where col1 = (select max(col1) from v1aA); insert into v2aA values ((select max(col1) from v1aA)); drop view v2Aa,v1Aa; drop table t1Aa,t2Aa; # # aliases in VIEWs # create table t1Aa (col1 int); create view v1Aa as select col1 from t1Aa as AaA; show create view v1AA; drop view v1AA; select Aaa.col1 from t1Aa as AaA; create view v1Aa as select Aaa.col1 from t1Aa as AaA; drop view v1AA; create view v1Aa as select AaA.col1 from t1Aa as AaA; show create view v1AA; drop view v1AA; drop table t1Aa; sql/item.cc +10 −3 Original line number Diff line number Diff line Loading @@ -138,7 +138,7 @@ bool Item::cleanup_processor(byte *arg) Item_ident::Item_ident(const char *db_name_par,const char *table_name_par, const char *field_name_par) :orig_db_name(db_name_par), orig_table_name(table_name_par), orig_field_name(field_name_par), orig_field_name(field_name_par), alias_name_used(FALSE), db_name(db_name_par), table_name(table_name_par), field_name(field_name_par), cached_field_index(NO_CACHED_FIELD_INDEX), cached_table(0), depended_from(0) Loading @@ -152,6 +152,7 @@ Item_ident::Item_ident(THD *thd, Item_ident *item) orig_db_name(item->orig_db_name), orig_table_name(item->orig_table_name), orig_field_name(item->orig_field_name), alias_name_used(item->alias_name_used), db_name(item->db_name), table_name(item->table_name), field_name(item->field_name), Loading Loading @@ -609,6 +610,7 @@ void Item_field::set_field(Field *field_par) table_name=field_par->table_name; field_name=field_par->field_name; db_name=field_par->table->table_cache_key; alias_name_used= field_par->table->alias_name_used; unsigned_flag=test(field_par->flags & UNSIGNED_FLAG); collation.set(field_par->charset(), DERIVATION_IMPLICIT); fixed= 1; Loading Loading @@ -658,7 +660,8 @@ void Item_ident::print(String *str) THD *thd= current_thd; char d_name_buff[MAX_ALIAS_NAME], t_name_buff[MAX_ALIAS_NAME]; const char *d_name= db_name, *t_name= table_name; if (lower_case_table_names) if (lower_case_table_names== 1 || (lower_case_table_names == 2 && !alias_name_used)) { if (table_name && table_name[0]) { Loading @@ -680,7 +683,7 @@ void Item_ident::print(String *str) append_identifier(thd, str, nm, strlen(nm)); return; } if (db_name && db_name[0]) if (db_name && db_name[0] && !alias_name_used) { append_identifier(thd, str, d_name, strlen(d_name)); str->append('.'); Loading Loading @@ -2937,6 +2940,10 @@ bool Item_ref::fix_fields(THD *thd, TABLE_LIST *tables, Item **reference) decimals= (*ref)->decimals; collation.set((*ref)->collation); with_sum_func= (*ref)->with_sum_func; if ((*ref)->type() == FIELD_ITEM) alias_name_used= ((Item_ident *) (*ref))->alias_name_used; else alias_name_used= TRUE; // it is not field, so it is was resolved by alias fixed= 1; if (ref && (*ref)->check_cols(1)) Loading sql/item.h +1 −0 Original line number Diff line number Diff line Loading @@ -467,6 +467,7 @@ class Item_ident :public Item const char *db_name; const char *table_name; const char *field_name; bool alias_name_used; /* true if item was resolved against alias */ /* Cached value of index for this field in table->field array, used by prep. stmts for speeding up their re-execution. Holds NO_CACHED_FIELD_INDEX Loading sql/sql_base.cc +4 −1 Original line number Diff line number Diff line Loading @@ -1050,6 +1050,9 @@ TABLE *open_table(THD *thd, TABLE_LIST *table_list, MEM_ROOT *mem_root, table->reginfo.lock_type=TL_READ; /* Assume read */ reset: if (thd->lex->need_correct_ident()) table->alias_name_used= my_strcasecmp(table_alias_charset, table->real_name, alias); /* Fix alias if table name changes */ if (strcmp(table->table_name, alias)) { Loading Loading
mysql-test/r/lowercase_view.result +16 −0 Original line number Diff line number Diff line Loading @@ -22,3 +22,19 @@ insert into v2aA values ((select max(col1) from v1aA)); ERROR HY000: You can't specify target table 'v2aa' for update in FROM clause drop view v2Aa,v1Aa; drop table t1Aa,t2Aa; create table t1Aa (col1 int); create view v1Aa as select col1 from t1Aa as AaA; show create view v1AA; View Create View v1aa CREATE ALGORITHM=UNDEFINED VIEW `test`.`v1aa` AS select `aaa`.`col1` AS `col1` from `test`.`t1aa` `AaA` drop view v1AA; select Aaa.col1 from t1Aa as AaA; col1 create view v1Aa as select Aaa.col1 from t1Aa as AaA; drop view v1AA; create view v1Aa as select AaA.col1 from t1Aa as AaA; show create view v1AA; View Create View v1aa CREATE ALGORITHM=UNDEFINED VIEW `test`.`v1aa` AS select `aaa`.`col1` AS `col1` from `test`.`t1aa` `AaA` drop view v1AA; drop table t1Aa;
mysql-test/t/lowercase_view.test +15 −0 Original line number Diff line number Diff line Loading @@ -32,3 +32,18 @@ delete from v2aA where col1 = (select max(col1) from v1aA); insert into v2aA values ((select max(col1) from v1aA)); drop view v2Aa,v1Aa; drop table t1Aa,t2Aa; # # aliases in VIEWs # create table t1Aa (col1 int); create view v1Aa as select col1 from t1Aa as AaA; show create view v1AA; drop view v1AA; select Aaa.col1 from t1Aa as AaA; create view v1Aa as select Aaa.col1 from t1Aa as AaA; drop view v1AA; create view v1Aa as select AaA.col1 from t1Aa as AaA; show create view v1AA; drop view v1AA; drop table t1Aa;
sql/item.cc +10 −3 Original line number Diff line number Diff line Loading @@ -138,7 +138,7 @@ bool Item::cleanup_processor(byte *arg) Item_ident::Item_ident(const char *db_name_par,const char *table_name_par, const char *field_name_par) :orig_db_name(db_name_par), orig_table_name(table_name_par), orig_field_name(field_name_par), orig_field_name(field_name_par), alias_name_used(FALSE), db_name(db_name_par), table_name(table_name_par), field_name(field_name_par), cached_field_index(NO_CACHED_FIELD_INDEX), cached_table(0), depended_from(0) Loading @@ -152,6 +152,7 @@ Item_ident::Item_ident(THD *thd, Item_ident *item) orig_db_name(item->orig_db_name), orig_table_name(item->orig_table_name), orig_field_name(item->orig_field_name), alias_name_used(item->alias_name_used), db_name(item->db_name), table_name(item->table_name), field_name(item->field_name), Loading Loading @@ -609,6 +610,7 @@ void Item_field::set_field(Field *field_par) table_name=field_par->table_name; field_name=field_par->field_name; db_name=field_par->table->table_cache_key; alias_name_used= field_par->table->alias_name_used; unsigned_flag=test(field_par->flags & UNSIGNED_FLAG); collation.set(field_par->charset(), DERIVATION_IMPLICIT); fixed= 1; Loading Loading @@ -658,7 +660,8 @@ void Item_ident::print(String *str) THD *thd= current_thd; char d_name_buff[MAX_ALIAS_NAME], t_name_buff[MAX_ALIAS_NAME]; const char *d_name= db_name, *t_name= table_name; if (lower_case_table_names) if (lower_case_table_names== 1 || (lower_case_table_names == 2 && !alias_name_used)) { if (table_name && table_name[0]) { Loading @@ -680,7 +683,7 @@ void Item_ident::print(String *str) append_identifier(thd, str, nm, strlen(nm)); return; } if (db_name && db_name[0]) if (db_name && db_name[0] && !alias_name_used) { append_identifier(thd, str, d_name, strlen(d_name)); str->append('.'); Loading Loading @@ -2937,6 +2940,10 @@ bool Item_ref::fix_fields(THD *thd, TABLE_LIST *tables, Item **reference) decimals= (*ref)->decimals; collation.set((*ref)->collation); with_sum_func= (*ref)->with_sum_func; if ((*ref)->type() == FIELD_ITEM) alias_name_used= ((Item_ident *) (*ref))->alias_name_used; else alias_name_used= TRUE; // it is not field, so it is was resolved by alias fixed= 1; if (ref && (*ref)->check_cols(1)) Loading
sql/item.h +1 −0 Original line number Diff line number Diff line Loading @@ -467,6 +467,7 @@ class Item_ident :public Item const char *db_name; const char *table_name; const char *field_name; bool alias_name_used; /* true if item was resolved against alias */ /* Cached value of index for this field in table->field array, used by prep. stmts for speeding up their re-execution. Holds NO_CACHED_FIELD_INDEX Loading
sql/sql_base.cc +4 −1 Original line number Diff line number Diff line Loading @@ -1050,6 +1050,9 @@ TABLE *open_table(THD *thd, TABLE_LIST *table_list, MEM_ROOT *mem_root, table->reginfo.lock_type=TL_READ; /* Assume read */ reset: if (thd->lex->need_correct_ident()) table->alias_name_used= my_strcasecmp(table_alias_charset, table->real_name, alias); /* Fix alias if table name changes */ if (strcmp(table->table_name, alias)) { Loading