mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Merge tulin@bk-internal.mysql.com:/home/bk/mysql-5.0
into dl145b.mysql.com:/home/ndbdev/tomas/mysql-5.1 sql/item.cc: Auto merged sql/sql_yacc.yy: Auto merged
This commit is contained in:
@ -1757,3 +1757,58 @@ select * from v1;
|
|||||||
cast(1 as decimal)
|
cast(1 as decimal)
|
||||||
1.00
|
1.00
|
||||||
drop view v1;
|
drop view v1;
|
||||||
|
create view v1 as select '\\','\\shazam';
|
||||||
|
select * from v1;
|
||||||
|
\ \shazam
|
||||||
|
\ \shazam
|
||||||
|
drop view v1;
|
||||||
|
create view v1 as select '\'','\shazam';
|
||||||
|
select * from v1;
|
||||||
|
' shazam
|
||||||
|
' shazam
|
||||||
|
drop view v1;
|
||||||
|
create view v1 as select 'k','K';
|
||||||
|
select * from v1;
|
||||||
|
k My_exp_K
|
||||||
|
k K
|
||||||
|
drop view v1;
|
||||||
|
create table t1 (s1 int);
|
||||||
|
create view v1 as select s1, 's1' from t1;
|
||||||
|
select * from v1;
|
||||||
|
s1 My_exp_s1
|
||||||
|
drop view v1;
|
||||||
|
create view v1 as select 's1', s1 from t1;
|
||||||
|
select * from v1;
|
||||||
|
My_exp_s1 s1
|
||||||
|
drop view v1;
|
||||||
|
create view v1 as select 's1', s1, 1 as My_exp_s1 from t1;
|
||||||
|
select * from v1;
|
||||||
|
My_exp_1_s1 s1 My_exp_s1
|
||||||
|
drop view v1;
|
||||||
|
create view v1 as select 1 as My_exp_s1, 's1', s1 from t1;
|
||||||
|
select * from v1;
|
||||||
|
My_exp_s1 My_exp_1_s1 s1
|
||||||
|
drop view v1;
|
||||||
|
create view v1 as select 1 as s1, 's1', 's1' from t1;
|
||||||
|
select * from v1;
|
||||||
|
s1 My_exp_s1 My_exp_1_s1
|
||||||
|
drop view v1;
|
||||||
|
create view v1 as select 's1', 's1', 1 as s1 from t1;
|
||||||
|
select * from v1;
|
||||||
|
My_exp_1_s1 My_exp_s1 s1
|
||||||
|
drop view v1;
|
||||||
|
create view v1 as select s1, 's1', 's1' from t1;
|
||||||
|
select * from v1;
|
||||||
|
s1 My_exp_s1 My_exp_1_s1
|
||||||
|
drop view v1;
|
||||||
|
create view v1 as select 's1', 's1', s1 from t1;
|
||||||
|
select * from v1;
|
||||||
|
My_exp_1_s1 My_exp_s1 s1
|
||||||
|
drop view v1;
|
||||||
|
create view v1 as select 1 as s1, 's1', s1 from t1;
|
||||||
|
ERROR 42S21: Duplicate column name 's1'
|
||||||
|
create view v1 as select 's1', s1, 1 as s1 from t1;
|
||||||
|
ERROR 42S21: Duplicate column name 's1'
|
||||||
|
drop table t1;
|
||||||
|
create view v1(k, K) as select 1,2;
|
||||||
|
ERROR 42S21: Duplicate column name 'K'
|
||||||
|
@ -1599,3 +1599,56 @@ drop table t1;
|
|||||||
create view v1 as select cast(1 as decimal);
|
create view v1 as select cast(1 as decimal);
|
||||||
select * from v1;
|
select * from v1;
|
||||||
drop view v1;
|
drop view v1;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Generation unique names for columns, and correct names check (BUG#7448)
|
||||||
|
#
|
||||||
|
# names with ' and \
|
||||||
|
create view v1 as select '\\','\\shazam';
|
||||||
|
select * from v1;
|
||||||
|
drop view v1;
|
||||||
|
create view v1 as select '\'','\shazam';
|
||||||
|
select * from v1;
|
||||||
|
drop view v1;
|
||||||
|
# autogenerated names differ by case only
|
||||||
|
create view v1 as select 'k','K';
|
||||||
|
select * from v1;
|
||||||
|
drop view v1;
|
||||||
|
create table t1 (s1 int);
|
||||||
|
# same autogenerated names
|
||||||
|
create view v1 as select s1, 's1' from t1;
|
||||||
|
select * from v1;
|
||||||
|
drop view v1;
|
||||||
|
create view v1 as select 's1', s1 from t1;
|
||||||
|
select * from v1;
|
||||||
|
drop view v1;
|
||||||
|
# set name as one of expected autogenerated
|
||||||
|
create view v1 as select 's1', s1, 1 as My_exp_s1 from t1;
|
||||||
|
select * from v1;
|
||||||
|
drop view v1;
|
||||||
|
create view v1 as select 1 as My_exp_s1, 's1', s1 from t1;
|
||||||
|
select * from v1;
|
||||||
|
drop view v1;
|
||||||
|
# set name conflict with autogenerated names
|
||||||
|
create view v1 as select 1 as s1, 's1', 's1' from t1;
|
||||||
|
select * from v1;
|
||||||
|
drop view v1;
|
||||||
|
create view v1 as select 's1', 's1', 1 as s1 from t1;
|
||||||
|
select * from v1;
|
||||||
|
drop view v1;
|
||||||
|
# underlying field name conflict with autogenerated names
|
||||||
|
create view v1 as select s1, 's1', 's1' from t1;
|
||||||
|
select * from v1;
|
||||||
|
drop view v1;
|
||||||
|
create view v1 as select 's1', 's1', s1 from t1;
|
||||||
|
select * from v1;
|
||||||
|
drop view v1;
|
||||||
|
# underlying field name conflict with set name
|
||||||
|
-- error 1060
|
||||||
|
create view v1 as select 1 as s1, 's1', s1 from t1;
|
||||||
|
-- error 1060
|
||||||
|
create view v1 as select 's1', s1, 1 as s1 from t1;
|
||||||
|
drop table t1;
|
||||||
|
# set names differ by case only
|
||||||
|
-- error 1060
|
||||||
|
create view v1(k, K) as select 1,2;
|
||||||
|
@ -314,6 +314,7 @@ void *Item::operator new(size_t size, Item *reuse, uint *rsize)
|
|||||||
|
|
||||||
Item::Item():
|
Item::Item():
|
||||||
rsize(0), name(0), orig_name(0), name_length(0), fixed(0),
|
rsize(0), name(0), orig_name(0), name_length(0), fixed(0),
|
||||||
|
is_autogenerated_name(TRUE),
|
||||||
collation(&my_charset_bin, DERIVATION_COERCIBLE)
|
collation(&my_charset_bin, DERIVATION_COERCIBLE)
|
||||||
{
|
{
|
||||||
marker= 0;
|
marker= 0;
|
||||||
|
@ -269,6 +269,8 @@ public:
|
|||||||
my_bool unsigned_flag;
|
my_bool unsigned_flag;
|
||||||
my_bool with_sum_func;
|
my_bool with_sum_func;
|
||||||
my_bool fixed; /* If item fixed with fix_fields */
|
my_bool fixed; /* If item fixed with fix_fields */
|
||||||
|
my_bool is_autogenerated_name; /* indicate was name of this Item
|
||||||
|
autogenerated or set by user */
|
||||||
DTCollation collation;
|
DTCollation collation;
|
||||||
|
|
||||||
// alloc & destruct is done as start of select using sql_alloc
|
// alloc & destruct is done as start of select using sql_alloc
|
||||||
@ -288,7 +290,7 @@ public:
|
|||||||
name=0;
|
name=0;
|
||||||
#endif
|
#endif
|
||||||
} /*lint -e1509 */
|
} /*lint -e1509 */
|
||||||
void set_name(const char *str,uint length, CHARSET_INFO *cs);
|
void set_name(const char *str, uint length, CHARSET_INFO *cs);
|
||||||
void rename(char *new_name);
|
void rename(char *new_name);
|
||||||
void init_make_field(Send_field *tmp_field,enum enum_field_types type);
|
void init_make_field(Send_field *tmp_field,enum enum_field_types type);
|
||||||
virtual void cleanup();
|
virtual void cleanup();
|
||||||
@ -1166,7 +1168,7 @@ public:
|
|||||||
collation.set(cs, dv);
|
collation.set(cs, dv);
|
||||||
str_value.set_or_copy_aligned(str,length,cs);
|
str_value.set_or_copy_aligned(str,length,cs);
|
||||||
max_length= str_value.numchars()*cs->mbmaxlen;
|
max_length= str_value.numchars()*cs->mbmaxlen;
|
||||||
set_name(name_par,0,cs);
|
set_name(name_par, 0, cs);
|
||||||
decimals=NOT_FIXED_DEC;
|
decimals=NOT_FIXED_DEC;
|
||||||
// it is constant => can be used without fix_fields (and frequently used)
|
// it is constant => can be used without fix_fields (and frequently used)
|
||||||
fixed= 1;
|
fixed= 1;
|
||||||
|
@ -4620,7 +4620,7 @@ Item *get_system_var(THD *thd, enum_var_type var_type, const char *var_name,
|
|||||||
if (!(item=var->item(thd, var_type, &null_lex_string)))
|
if (!(item=var->item(thd, var_type, &null_lex_string)))
|
||||||
return 0; // Impossible
|
return 0; // Impossible
|
||||||
thd->lex->uncacheable(UNCACHEABLE_SIDEEFFECT);
|
thd->lex->uncacheable(UNCACHEABLE_SIDEEFFECT);
|
||||||
item->set_name(item_name, 0, system_charset_info); // Will use original name
|
item->set_name(item_name, 0, system_charset_info); // Will use original name
|
||||||
return item;
|
return item;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -35,6 +35,61 @@ TYPELIB updatable_views_with_limit_typelib=
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Make a unique name for an anonymous view column
|
||||||
|
SYNOPSIS
|
||||||
|
target reference to the item for which a new name has to be made
|
||||||
|
item_list list of items within which we should check uniqueness of
|
||||||
|
the created name
|
||||||
|
last_element the last element of the list above
|
||||||
|
|
||||||
|
NOTE
|
||||||
|
Unique names are generated by adding 'My_exp_' to the old name of the
|
||||||
|
column. In case the name that was created this way already exists, we
|
||||||
|
add a numeric postfix to its end (i.e. "1") and increase the number
|
||||||
|
until the name becomes unique. If the generated name is longer than
|
||||||
|
NAME_LEN, it is truncated.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void make_unique_view_field_name(Item *target,
|
||||||
|
List<Item> &item_list,
|
||||||
|
Item *last_element)
|
||||||
|
{
|
||||||
|
char *name= (target->orig_name ?
|
||||||
|
target->orig_name :
|
||||||
|
target->name);
|
||||||
|
uint name_len;
|
||||||
|
uint attempt= 0;
|
||||||
|
char buff[NAME_LEN+1];
|
||||||
|
for (;; attempt++)
|
||||||
|
{
|
||||||
|
Item *check;
|
||||||
|
List_iterator_fast<Item> itc(item_list);
|
||||||
|
bool ok= TRUE;
|
||||||
|
|
||||||
|
if (attempt)
|
||||||
|
name_len= my_snprintf(buff, NAME_LEN, "My_exp_%d_%s", attempt, name);
|
||||||
|
else
|
||||||
|
name_len= my_snprintf(buff, NAME_LEN, "My_exp_%s", name);
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
check= itc++;
|
||||||
|
if (check != target &&
|
||||||
|
my_strcasecmp(system_charset_info, buff, check->name) == 0)
|
||||||
|
{
|
||||||
|
ok= FALSE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} while (check != last_element);
|
||||||
|
if (ok)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
target->orig_name= target->name;
|
||||||
|
target->set_name(buff, name_len, system_charset_info);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Creating/altering VIEW procedure
|
Creating/altering VIEW procedure
|
||||||
|
|
||||||
@ -240,24 +295,36 @@ bool mysql_create_view(THD *thd,
|
|||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
while ((item= it++, name= nm++))
|
while ((item= it++, name= nm++))
|
||||||
|
{
|
||||||
item->set_name(name->str, name->length, system_charset_info);
|
item->set_name(name->str, name->length, system_charset_info);
|
||||||
|
item->is_autogenerated_name= FALSE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Test absence of duplicates names */
|
/* Test absence of duplicates names */
|
||||||
{
|
{
|
||||||
Item *item;
|
Item *item;
|
||||||
List_iterator_fast<Item> it(select_lex->item_list);
|
List_iterator_fast<Item> it(select_lex->item_list);
|
||||||
it++;
|
|
||||||
while ((item= it++))
|
while ((item= it++))
|
||||||
{
|
{
|
||||||
Item *check;
|
Item *check;
|
||||||
List_iterator_fast<Item> itc(select_lex->item_list);
|
List_iterator_fast<Item> itc(select_lex->item_list);
|
||||||
|
/* treat underlying fields like set by user names */
|
||||||
|
if (item->real_item()->type() == Item::FIELD_ITEM)
|
||||||
|
item->is_autogenerated_name= FALSE;
|
||||||
while ((check= itc++) && check != item)
|
while ((check= itc++) && check != item)
|
||||||
{
|
{
|
||||||
if (strcmp(item->name, check->name) == 0)
|
if (my_strcasecmp(system_charset_info, item->name, check->name) == 0)
|
||||||
{
|
{
|
||||||
my_error(ER_DUP_FIELDNAME, MYF(0), item->name);
|
if (item->is_autogenerated_name)
|
||||||
DBUG_RETURN(TRUE);
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4107,7 +4107,10 @@ select_item:
|
|||||||
if (add_item_to_list(YYTHD, $2))
|
if (add_item_to_list(YYTHD, $2))
|
||||||
YYABORT;
|
YYABORT;
|
||||||
if ($4.str)
|
if ($4.str)
|
||||||
$2->set_name($4.str,$4.length,system_charset_info);
|
{
|
||||||
|
$2->set_name($4.str, $4.length, system_charset_info);
|
||||||
|
$2->is_autogenerated_name= FALSE;
|
||||||
|
}
|
||||||
else if (!$2->name) {
|
else if (!$2->name) {
|
||||||
char *str = $1;
|
char *str = $1;
|
||||||
if (str[-1] == '`')
|
if (str[-1] == '`')
|
||||||
@ -4913,9 +4916,12 @@ udf_expr:
|
|||||||
remember_name expr remember_end select_alias
|
remember_name expr remember_end select_alias
|
||||||
{
|
{
|
||||||
if ($4.str)
|
if ($4.str)
|
||||||
$2->set_name($4.str,$4.length,system_charset_info);
|
{
|
||||||
|
$2->set_name($4.str, $4.length, system_charset_info);
|
||||||
|
$2->is_autogenerated_name= FALSE;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
$2->set_name($1,(uint) ($3 - $1), YYTHD->charset());
|
$2->set_name($1, (uint) ($3 - $1), YYTHD->charset());
|
||||||
$$= $2;
|
$$= $2;
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
@ -5691,7 +5697,8 @@ procedure_item:
|
|||||||
if (add_proc_to_list(lex->thd, $2))
|
if (add_proc_to_list(lex->thd, $2))
|
||||||
YYABORT;
|
YYABORT;
|
||||||
if (!$2->name)
|
if (!$2->name)
|
||||||
$2->set_name($1,(uint) ((char*) lex->tok_end - $1), YYTHD->charset());
|
$2->set_name($1,(uint) ((char*) lex->tok_end - $1),
|
||||||
|
YYTHD->charset());
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user