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