mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
Merge epotemkin@bk-internal.mysql.com:/home/bk/mysql-5.0
into moonbone.local:/work/mysql-5.0-bug-11864
This commit is contained in:
@ -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
|
||||
/*
|
||||
|
Reference in New Issue
Block a user