diff options
author | monty@mysql.com <> | 2005-08-15 18:35:48 +0300 |
---|---|---|
committer | monty@mysql.com <> | 2005-08-15 18:35:48 +0300 |
commit | 1a6f16edd94570eb8359e94149d5393d3dd82888 (patch) | |
tree | 613842f6646a144777e4e07d77c2a89dbb659781 /sql/sql_view.cc | |
parent | d0c66bbaa3446f44a1cdd38ffde7527c0a058e2d (diff) | |
parent | 4880d22b79fc3ab486a4ec0b4f267bfbe06b367c (diff) | |
download | mariadb-git-1a6f16edd94570eb8359e94149d5393d3dd82888.tar.gz |
Merge bk-internal.mysql.com:/home/bk/mysql-5.0
into mysql.com:/home/my/mysql-5.0
Diffstat (limited to 'sql/sql_view.cc')
-rw-r--r-- | sql/sql_view.cc | 103 |
1 files changed, 74 insertions, 29 deletions
diff --git a/sql/sql_view.cc b/sql/sql_view.cc index a910cdb2fbc..c3222f951bb 100644 --- a/sql/sql_view.cc +++ b/sql/sql_view.cc @@ -94,6 +94,71 @@ static void make_unique_view_field_name(Item *target, target->set_name(buff, name_len, system_charset_info); } + +/* + Check if items with same names are present in list and possibly + generate unique names for them. + + SYNOPSIS + item_list list of Items which should be checked for duplicates + gen_unique_view_name flag: generate unique name or return with error when + duplicate names are found. + + DESCRIPTION + This function is used on view creation and preparation of derived tables. + It checks item_list for items with duplicate names. If it founds two + items with same name and conversion to unique names isn't allowed, or + names for both items are set by user - function fails. + Otherwise it generates unique name for one item with autogenerated name + using make_unique_view_field_name() + + RETURN VALUE + FALSE no duplicate names found, or they are converted to unique ones + TRUE duplicate names are found and they can't be converted or conversion + isn't allowed +*/ + +bool check_duplicate_names(List<Item> &item_list, bool gen_unique_view_name) +{ + DBUG_ENTER("check_duplicate_names"); + /* Test absence of duplicates names */ + { + Item *item; + List_iterator_fast<Item> it(item_list); + List_iterator_fast<Item> itc(item_list); + while ((item= it++)) + { + Item *check; + /* treat underlying fields like set by user names */ + if (item->real_item()->type() == Item::FIELD_ITEM) + item->is_autogenerated_name= FALSE; + itc.rewind(); + while ((check= itc++) && check != item) + { + if (my_strcasecmp(system_charset_info, item->name, check->name) == 0) + { + if (!gen_unique_view_name) + { + my_error(ER_DUP_FIELDNAME, MYF(0), item->name); + DBUG_RETURN(TRUE); + } + else if (item->is_autogenerated_name) + make_unique_view_field_name(item, item_list, item); + else if (check->is_autogenerated_name) + make_unique_view_field_name(check, item_list, item); + else + { + my_error(ER_DUP_FIELDNAME, MYF(0), item->name); + DBUG_RETURN(TRUE); + } + } + } + } + } + DBUG_RETURN(FALSE); +} + + /* Creating/altering VIEW procedure @@ -308,35 +373,8 @@ bool mysql_create_view(THD *thd, } } - /* Test absence of duplicates names */ - { - Item *item; - List_iterator_fast<Item> it(select_lex->item_list); - List_iterator_fast<Item> itc(select_lex->item_list); - while ((item= it++)) - { - Item *check; - /* treat underlying fields like set by user names */ - if (item->real_item()->type() == Item::FIELD_ITEM) - item->is_autogenerated_name= FALSE; - itc.rewind(); - while ((check= itc++) && check != item) - { - if (my_strcasecmp(system_charset_info, item->name, check->name) == 0) - { - if (item->is_autogenerated_name) - make_unique_view_field_name(item, select_lex->item_list, item); - else if (check->is_autogenerated_name) - make_unique_view_field_name(check, select_lex->item_list, item); - else - { - my_error(ER_DUP_FIELDNAME, MYF(0), item->name); - DBUG_RETURN(TRUE); - } - } - } - } - } + if (check_duplicate_names(select_lex->item_list, 1)) + DBUG_RETURN(TRUE); #ifndef NO_EMBEDDED_ACCESS_CHECKS /* @@ -844,6 +882,9 @@ mysql_make_view(File_parser *parser, TABLE_LIST *table) view_tables); lex->select_lex.context.outer_context= 0; lex->select_lex.context.select_lex= table->select_lex; + lex->select_lex.select_n_having_items+= + table->select_lex->select_n_having_items; + /* do not check privileges & hide errors for view underlyings */ for (SELECT_LEX *sl= lex->all_selects_list; sl; @@ -864,7 +905,11 @@ mysql_make_view(File_parser *parser, TABLE_LIST *table) { if (view_tables->next_local) + { table->multitable_view= TRUE; + if (table->belong_to_view) + table->belong_to_view->multitable_view= TRUE; + } /* make nested join structure for view tables */ NESTED_JOIN *nested_join; if (!(nested_join= table->nested_join= |