Commit f20c56a9 authored by unknown's avatar unknown
Browse files

Fix handling of NULL fields in FIELD(). (Bug #10944)


mysql-test/r/func_str.result:
  Update results
mysql-test/t/func_str.test:
  Add regression tests
sql/item_func.cc:
  Handle NULL as first argument to FIELD()
parent 853a55ad
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -783,3 +783,9 @@ id aes_decrypt(str, 'bar')
1	foo
2	NULL
DROP TABLE t1, t2;
select field(0,NULL,1,0), field("",NULL,"bar",""), field(0.0,NULL,1.0,0.0);
field(0,NULL,1,0)	field("",NULL,"bar","")	field(0.0,NULL,1.0,0.0)
3	3	3
select field(NULL,1,2,NULL), field(NULL,1,2,0);
field(NULL,1,2,NULL)	field(NULL,1,2,0)
0	0
+6 −0
Original line number Diff line number Diff line
@@ -521,3 +521,9 @@ SELECT t1.id, aes_decrypt(str, 'bar') FROM t1, t2 WHERE t1.id = t2.id

DROP TABLE t1, t2;


#
# Bug #10944: Mishandling of NULL arguments in FIELD()
#
select field(0,NULL,1,0), field("",NULL,"bar",""), field(0.0,NULL,1.0,0.0);
select field(NULL,1,2,NULL), field(NULL,1,2,0);
+8 −4
Original line number Diff line number Diff line
@@ -1488,6 +1488,10 @@ void Item_func_locate::print(String *str)
longlong Item_func_field::val_int()
{
  DBUG_ASSERT(fixed == 1);

  if (args[0]->null_value)
    return 0;

  if (cmp_type == STRING_RESULT)
  {
    String *field;
@@ -1505,7 +1509,7 @@ longlong Item_func_field::val_int()
    longlong val= args[0]->val_int();
    for (uint i=1; i < arg_count ; i++)
    {
      if (val == args[i]->val_int())
      if (!args[i]->null_value && val == args[i]->val_int())
        return (longlong) (i);
    }
  }
@@ -1514,7 +1518,7 @@ longlong Item_func_field::val_int()
    double val= args[0]->val();
    for (uint i=1; i < arg_count ; i++)
    {
      if (val == args[i]->val())
      if (!args[i]->null_value && val == args[i]->val())
        return (longlong) (i);
    }
  }