From bbd2fa5c653bf0336f6ec0131ef41b8928c5ab86 Mon Sep 17 00:00:00 2001 From: Alexander Barkov Date: Thu, 12 Dec 2019 17:06:42 +0400 Subject: [PATCH] MDEV-21278 Assertion `is_unsigned() == attr.unsigned_flag' or Assertion `field.is_sane()' failed The type handler and unsigned_flag erroneously went out of sync in Item_func_minus::fix_length_and_dec. --- mysql-test/main/func_math.result | 38 ++++++++++++++++++++++++++++++++ mysql-test/main/func_math.test | 33 +++++++++++++++++++++++++++ sql/item_func.cc | 5 ++--- 3 files changed, 73 insertions(+), 3 deletions(-) diff --git a/mysql-test/main/func_math.result b/mysql-test/main/func_math.result index d50abe00e72..40844c92a2d 100644 --- a/mysql-test/main/func_math.result +++ b/mysql-test/main/func_math.result @@ -2726,3 +2726,41 @@ DROP TABLE t1,t2; # # End of 10.4 tests # +# +# Start of 10.5 tests +# +# +# MDEV-21278 Assertion `is_unsigned() == attr.unsigned_flag' or Assertion `field.is_sane()' failed +# +CREATE TABLE t1 (a TIMESTAMP); +INSERT INTO t1 VALUES (NULL),(NULL); +SET SESSION SQL_MODE= 'NO_UNSIGNED_SUBTRACTION'; +SELECT DISTINCT UUID_SHORT() - a FROM t1; +UUID_SHORT() - a +xxx +xxx +CREATE TABLE t2 AS SELECT DISTINCT UUID_SHORT() - a FROM t1; +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `UUID_SHORT() - a` bigint(22) NOT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +DROP TABLE t2, t1; +SET sql_mode=DEFAULT; +CREATE TABLE t1 (a TIMESTAMP); +INSERT INTO t1 VALUES (NULL),(NULL); +SET SESSION SQL_MODE= 'NO_UNSIGNED_SUBTRACTION'; +SELECT UUID_SHORT() - a FROM t1; +UUID_SHORT() - a +xxx +xxx +CREATE TABLE t2 AS SELECT UUID_SHORT() - a FROM t1; +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `UUID_SHORT() - a` bigint(22) NOT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +DROP TABLE t2, t1; +# +# End of 10.5 tests +# diff --git a/mysql-test/main/func_math.test b/mysql-test/main/func_math.test index 5f333c06b78..ad2929888fc 100644 --- a/mysql-test/main/func_math.test +++ b/mysql-test/main/func_math.test @@ -1736,3 +1736,36 @@ DROP TABLE t1,t2; --echo # --echo # End of 10.4 tests --echo # + + +--echo # +--echo # Start of 10.5 tests +--echo # + +--echo # +--echo # MDEV-21278 Assertion `is_unsigned() == attr.unsigned_flag' or Assertion `field.is_sane()' failed +--echo # + +CREATE TABLE t1 (a TIMESTAMP); +INSERT INTO t1 VALUES (NULL),(NULL); +SET SESSION SQL_MODE= 'NO_UNSIGNED_SUBTRACTION'; +--replace_column 1 xxx +SELECT DISTINCT UUID_SHORT() - a FROM t1; +CREATE TABLE t2 AS SELECT DISTINCT UUID_SHORT() - a FROM t1; +SHOW CREATE TABLE t2; +DROP TABLE t2, t1; +SET sql_mode=DEFAULT; + +CREATE TABLE t1 (a TIMESTAMP); +INSERT INTO t1 VALUES (NULL),(NULL); +SET SESSION SQL_MODE= 'NO_UNSIGNED_SUBTRACTION'; +--replace_column 1 xxx +SELECT UUID_SHORT() - a FROM t1; +CREATE TABLE t2 AS SELECT UUID_SHORT() - a FROM t1; +SHOW CREATE TABLE t2; +DROP TABLE t2, t1; + + +--echo # +--echo # End of 10.5 tests +--echo # diff --git a/sql/item_func.cc b/sql/item_func.cc index 573372c7c46..70fbb3f8bf6 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -1235,9 +1235,8 @@ bool Item_func_minus::fix_length_and_dec() if (Item_func_minus::type_handler()->Item_func_minus_fix_length_and_dec(this)) DBUG_RETURN(TRUE); DBUG_PRINT("info", ("Type: %s", type_handler()->name().ptr())); - if ((m_depends_on_sql_mode_no_unsigned_subtraction= unsigned_flag) && - (current_thd->variables.sql_mode & MODE_NO_UNSIGNED_SUBTRACTION)) - unsigned_flag= false; + m_depends_on_sql_mode_no_unsigned_subtraction= unsigned_flag; + fix_unsigned_flag(); DBUG_RETURN(FALSE); }