Commit f93b5a9c authored by gshchepa/uchum@gleb.loc's avatar gshchepa/uchum@gleb.loc
Browse files

Fixed bug #32335.

Comparison of a BIGINT NOT NULL column with a constant arithmetic
expression that evaluates to NULL caused error 1048: "Column '...'
cannot be null".

Made convert_constant_item() check if the constant expression is NULL
before attempting to store it in a field. Attempts to store NULL in a
NOT NULL field caused query errors.
parent 7b38492a
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -4322,4 +4322,10 @@ c3
DROP TABLE t1;
DROP TABLE t2;

CREATE TABLE t1 (c1 BIGINT NOT NULL);
INSERT INTO t1 (c1) VALUES (1);
SELECT * FROM t1 WHERE c1 > NULL + 1;
c1
DROP TABLE t1;

End of 5.0 tests
+11 −0
Original line number Diff line number Diff line
@@ -3661,4 +3661,15 @@ DROP TABLE t2;

###########################################################################

#
# Bug #32335: Error on BIGINT > NULL + 1 
#

CREATE TABLE t1 (c1 BIGINT NOT NULL);
INSERT INTO t1 (c1) VALUES (1);
SELECT * FROM t1 WHERE c1 > NULL + 1;
DROP TABLE t1;

--echo

--echo End of 5.0 tests
+2 −1
Original line number Diff line number Diff line
@@ -350,11 +350,12 @@ static bool convert_constant_item(THD *thd, Field *field, Item **item)
    thd->variables.sql_mode= (orig_sql_mode & ~MODE_NO_ZERO_DATE) | 
                             MODE_INVALID_DATES;
    thd->count_cuted_fields= CHECK_FIELD_IGNORE;
    if (!(*item)->save_in_field(field, 1) && !((*item)->null_value))
    if (!(*item)->is_null() && !(*item)->save_in_field(field, 1))
    {
      Item *tmp=new Item_int_with_ref(field->val_int(), *item,
                                      test(field->flags & UNSIGNED_FLAG));
      thd->variables.sql_mode= orig_sql_mode;
      thd->count_cuted_fields= orig_count_cuted_fields;
      if (tmp)
        thd->change_item_tree(item, tmp);
      return 1;					// Item was replaced