Bug #23280699: MYSQLD GOT SIGNAL 11 IN IS_NULL ON SELECT

               FROM I_S

Issue:
------
There is a difference in the field type created when the
following DDLs are used:

1) CREATE TABLE t0 AS SELECT NULL;
2) CREATE TABLE t0 AS SELECT GREATEST(NULL,NULL);

The first statement creates field of type Field_string and
the second one creates a field of type Field_null.

This creates a problem when the query mentioned in this bug
is used. Since the null_ptr is calculated differently for
Field_null.

Solution:
---------
When there is a function returning null in the select list
as mentioned above, the field should be of type
Field_string.

This was fixed in 5.6+ as part of Bug#14021323. This is a
backport to mysql-5.5.

An incorrect comment in innodb_bug54044.test has been
corrected in all versions.
parent 54e887b2
...@@ -6,7 +6,13 @@ table_54044 CREATE TEMPORARY TABLE `table_54044` ( ...@@ -6,7 +6,13 @@ table_54044 CREATE TEMPORARY TABLE `table_54044` (
`IF(NULL IS NOT NULL, NULL, NULL)` binary(0) DEFAULT NULL `IF(NULL IS NOT NULL, NULL, NULL)` binary(0) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ) ENGINE=InnoDB DEFAULT CHARSET=latin1
DROP TABLE table_54044; DROP TABLE table_54044;
CREATE TABLE tmp ENGINE = INNODB AS SELECT COALESCE(NULL, NULL, NULL); CREATE TABLE tmp ENGINE = INNODB
ERROR HY000: Can't create table 'test.tmp' (errno: -1) AS SELECT COALESCE(NULL, NULL, NULL), GREATEST(NULL, NULL), NULL;
CREATE TABLE tmp ENGINE = INNODB AS SELECT GREATEST(NULL, NULL); SHOW CREATE TABLE tmp;
ERROR HY000: Can't create table 'test.tmp' (errno: -1) Table Create Table
tmp CREATE TABLE `tmp` (
`COALESCE(NULL, NULL, NULL)` binary(0) DEFAULT NULL,
`GREATEST(NULL, NULL)` binary(0) DEFAULT NULL,
`NULL` binary(0) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
DROP TABLE tmp;
...@@ -10,10 +10,9 @@ CREATE TEMPORARY TABLE table_54044 ENGINE = INNODB ...@@ -10,10 +10,9 @@ CREATE TEMPORARY TABLE table_54044 ENGINE = INNODB
SHOW CREATE TABLE table_54044; SHOW CREATE TABLE table_54044;
DROP TABLE table_54044; DROP TABLE table_54044;
# These 'create table' operations should fail because of # This 'create table' should pass since it uses a Field_string of size 0.
# using NULL datatype
--error ER_CANT_CREATE_TABLE CREATE TABLE tmp ENGINE = INNODB
CREATE TABLE tmp ENGINE = INNODB AS SELECT COALESCE(NULL, NULL, NULL); AS SELECT COALESCE(NULL, NULL, NULL), GREATEST(NULL, NULL), NULL;
--error ER_CANT_CREATE_TABLE SHOW CREATE TABLE tmp;
CREATE TABLE tmp ENGINE = INNODB AS SELECT GREATEST(NULL, NULL); DROP TABLE tmp;
...@@ -5360,10 +5360,6 @@ Field *Item::tmp_table_field_from_field_type(TABLE *table, bool fixed_length) ...@@ -5360,10 +5360,6 @@ Field *Item::tmp_table_field_from_field_type(TABLE *table, bool fixed_length)
field= new Field_double((uchar*) 0, max_length, null_ptr, 0, Field::NONE, field= new Field_double((uchar*) 0, max_length, null_ptr, 0, Field::NONE,
name, decimals, 0, unsigned_flag); name, decimals, 0, unsigned_flag);
break; break;
case MYSQL_TYPE_NULL:
field= new Field_null((uchar*) 0, max_length, Field::NONE,
name, &my_charset_bin);
break;
case MYSQL_TYPE_INT24: case MYSQL_TYPE_INT24:
field= new Field_medium((uchar*) 0, max_length, null_ptr, 0, Field::NONE, field= new Field_medium((uchar*) 0, max_length, null_ptr, 0, Field::NONE,
name, 0, unsigned_flag); name, 0, unsigned_flag);
...@@ -5394,6 +5390,7 @@ Field *Item::tmp_table_field_from_field_type(TABLE *table, bool fixed_length) ...@@ -5394,6 +5390,7 @@ Field *Item::tmp_table_field_from_field_type(TABLE *table, bool fixed_length)
DBUG_ASSERT(0); DBUG_ASSERT(0);
/* If something goes awfully wrong, it's better to get a string than die */ /* If something goes awfully wrong, it's better to get a string than die */
case MYSQL_TYPE_STRING: case MYSQL_TYPE_STRING:
case MYSQL_TYPE_NULL:
if (fixed_length && max_length < CONVERT_IF_BIGGER_TO_BLOB) if (fixed_length && max_length < CONVERT_IF_BIGGER_TO_BLOB)
{ {
field= new Field_string(max_length, maybe_null, name, field= new Field_string(max_length, maybe_null, name,
......
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