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

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
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -207,4 +207,9 @@ test
SELECT NAME_CONST('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
+13 −0
Original line number Diff line number Diff line
@@ -204,5 +204,18 @@ SELECT NAME_CONST('test', 1.0);
SELECT NAME_CONST('test', -1.0);
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
+7 −7
Original line number Diff line number Diff line
@@ -1221,14 +1221,14 @@ bool Item_name_const::fix_fields(THD *thd, Item **ref)
  s.length(0);

  if (value_item->fix_fields(thd, &value_item) ||
      name_item->fix_fields(thd, &name_item))
    return TRUE;
  if (!(value_item->const_item() && name_item->const_item()))
      name_item->fix_fields(thd, &name_item) ||
      !value_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;

  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);
  max_length= value_item->max_length;
  decimals= value_item->decimals;