Commit c04d3727 authored by igor@olga.mysql.com's avatar igor@olga.mysql.com

Fixed bug #27545.

Both arguments of the function NAME_CONST must be constant expressions.
This constraint is checked in the Item_name_const::fix_fields method. 
Yet if the argument of the function was not a constant expression no
error message was reported. As a result the client hanged waiting for a
response.
Now the function Item_name_const::fix_fields reports an error message
when any of the additional context conditions imposed on the function
NAME_CONST is not satisfied. 
parent 987ec3f3
...@@ -207,4 +207,9 @@ test ...@@ -207,4 +207,9 @@ test
SELECT NAME_CONST('test', 'test'); SELECT NAME_CONST('test', 'test');
test test
test test
CREATE TABLE t1 (a int);
INSERT INTO t1 VALUES (5), (2);
SELECT NAME_CONST(x,2) FROM (SELECT a x FROM t1) t;
ERROR HY000: The 'NAME_CONST' syntax is reserved for purposes internal to the MySQL server
DROP TABLE t1;
End of 5.0 tests End of 5.0 tests
...@@ -204,5 +204,18 @@ SELECT NAME_CONST('test', 1.0); ...@@ -204,5 +204,18 @@ SELECT NAME_CONST('test', 1.0);
SELECT NAME_CONST('test', -1.0); SELECT NAME_CONST('test', -1.0);
SELECT NAME_CONST('test', 'test'); SELECT NAME_CONST('test', 'test');
#
# Bug #27545: erroneous usage of NAME_CONST with a name as the first parameter
# resolved against a column name of a derived table hangs the client
#
CREATE TABLE t1 (a int);
INSERT INTO t1 VALUES (5), (2);
--error ER_RESERVED_SYNTAX
SELECT NAME_CONST(x,2) FROM (SELECT a x FROM t1) t;
DROP TABLE t1;
--echo End of 5.0 tests --echo End of 5.0 tests
...@@ -1221,14 +1221,14 @@ bool Item_name_const::fix_fields(THD *thd, Item **ref) ...@@ -1221,14 +1221,14 @@ bool Item_name_const::fix_fields(THD *thd, Item **ref)
s.length(0); s.length(0);
if (value_item->fix_fields(thd, &value_item) || if (value_item->fix_fields(thd, &value_item) ||
name_item->fix_fields(thd, &name_item)) name_item->fix_fields(thd, &name_item) ||
return TRUE; !value_item->const_item() ||
if (!(value_item->const_item() && name_item->const_item())) !name_item->const_item() ||
!(item_name= name_item->val_str(&s))) // Can't have a NULL name
{
my_error(ER_RESERVED_SYNTAX, MYF(0), "NAME_CONST");
return TRUE; return TRUE;
}
if (!(item_name= name_item->val_str(&s)))
return TRUE; /* Can't have a NULL name */
set_name(item_name->ptr(), (uint) item_name->length(), system_charset_info); set_name(item_name->ptr(), (uint) item_name->length(), system_charset_info);
max_length= value_item->max_length; max_length= value_item->max_length;
decimals= value_item->decimals; decimals= value_item->decimals;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment