diff options
author | Alexander Barkov <bar@mariadb.com> | 2022-08-26 14:25:04 +0400 |
---|---|---|
committer | Alexander Barkov <bar@mariadb.com> | 2022-08-26 14:25:04 +0400 |
commit | b9c2ae505dc3f57358c1b0cca7feb79e768e84fc (patch) | |
tree | d98937a764ff02c92dd8c72ae1ff27e2cd3a1435 | |
parent | 590ce857fee8d5807319c5448f0849fa60dc3b4c (diff) | |
download | mariadb-git-b9c2ae505dc3f57358c1b0cca7feb79e768e84fc.tar.gz |
MDEV-29356 Assertion `0' failed in Type_handler_row::Item_save_in_field on INSERT
-rw-r--r-- | mysql-test/main/sp-vars.result | 6 | ||||
-rw-r--r-- | mysql-test/main/sp-vars.test | 6 | ||||
-rw-r--r-- | mysql-test/main/type_row.result | 23 | ||||
-rw-r--r-- | mysql-test/main/type_row.test | 28 | ||||
-rw-r--r-- | mysql-test/suite/compat/oracle/r/sp-row.result | 8 | ||||
-rw-r--r-- | mysql-test/suite/compat/oracle/t/sp-row.test | 8 | ||||
-rw-r--r-- | sql/field.cc | 12 |
7 files changed, 67 insertions, 24 deletions
diff --git a/mysql-test/main/sp-vars.result b/mysql-test/main/sp-vars.result index feef67ccb1d..b90542dfb49 100644 --- a/mysql-test/main/sp-vars.result +++ b/mysql-test/main/sp-vars.result @@ -1026,11 +1026,11 @@ BEGIN SELECT arg; END| CALL p1((1, 2)); -ERROR 21000: Operand should contain 1 column(s) +ERROR HY000: Cannot cast 'row' as 'tinyint' in assignment of `arg` CALL p1((SELECT * FROM t1 LIMIT 1)); -ERROR 21000: Operand should contain 1 column(s) +ERROR HY000: Cannot cast 'row' as 'tinyint' in assignment of `arg` CALL p1((SELECT col1, col2 FROM t1 LIMIT 1)); -ERROR 21000: Operand should contain 1 column(s) +ERROR HY000: Cannot cast 'row' as 'tinyint' in assignment of `arg` DROP PROCEDURE p1; DROP TABLE t1; diff --git a/mysql-test/main/sp-vars.test b/mysql-test/main/sp-vars.test index 9edf245acbe..5e1e07888ca 100644 --- a/mysql-test/main/sp-vars.test +++ b/mysql-test/main/sp-vars.test @@ -1221,13 +1221,13 @@ BEGIN END| delimiter ;| ---error ER_OPERAND_COLUMNS +--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION CALL p1((1, 2)); ---error ER_OPERAND_COLUMNS +--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION CALL p1((SELECT * FROM t1 LIMIT 1)); ---error ER_OPERAND_COLUMNS +--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION CALL p1((SELECT col1, col2 FROM t1 LIMIT 1)); # diff --git a/mysql-test/main/type_row.result b/mysql-test/main/type_row.result index dc74cfc88a4..45f4fd895bf 100644 --- a/mysql-test/main/type_row.result +++ b/mysql-test/main/type_row.result @@ -49,3 +49,26 @@ ERROR HY000: Illegal parameter data types row and int for operation 'MOD' # # End of 10.5 tests # +# +# Start of 10.7 tests +# +# +# MDEV-29356 Assertion `0' failed in Type_handler_row::Item_save_in_field on INSERT +# +SET sql_mode=''; +CREATE TABLE t1 (c1 INT,c2 INT); +CREATE TRIGGER t BEFORE INSERT ON t1 FOR EACH ROW SET NEW.c1=(SELECT * FROM t1); +INSERT INTO t1 VALUES (0,0); +ERROR HY000: Cannot cast 'row' as 'int' in assignment of `test`.`t1`.`c1` +DROP TABLE t1; +SET sql_mode=DEFAULT; +SET sql_mode=''; +CREATE TABLE t1 (c1 INT,c2 INT) ENGINE=MyISAM; +CREATE TRIGGER t BEFORE INSERT ON t1 FOR EACH ROW SET NEW.c1=ROW(1,1); +INSERT INTO t1 VALUES (0,0); +ERROR HY000: Cannot cast 'row' as 'int' in assignment of `test`.`t1`.`c1` +DROP TABLE t1; +SET sql_mode=DEFAULT; +# +# End of 10.7 tests +# diff --git a/mysql-test/main/type_row.test b/mysql-test/main/type_row.test index 2a5902351e2..6f8312d5f18 100644 --- a/mysql-test/main/type_row.test +++ b/mysql-test/main/type_row.test @@ -60,3 +60,31 @@ SELECT ROW(1,1) % 1; --echo # --echo # End of 10.5 tests --echo # + +--echo # +--echo # Start of 10.7 tests +--echo # + +--echo # +--echo # MDEV-29356 Assertion `0' failed in Type_handler_row::Item_save_in_field on INSERT +--echo # + +SET sql_mode=''; +CREATE TABLE t1 (c1 INT,c2 INT); +CREATE TRIGGER t BEFORE INSERT ON t1 FOR EACH ROW SET NEW.c1=(SELECT * FROM t1); +--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION +INSERT INTO t1 VALUES (0,0); +DROP TABLE t1; +SET sql_mode=DEFAULT; + +SET sql_mode=''; +CREATE TABLE t1 (c1 INT,c2 INT) ENGINE=MyISAM; +CREATE TRIGGER t BEFORE INSERT ON t1 FOR EACH ROW SET NEW.c1=ROW(1,1); +--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION +INSERT INTO t1 VALUES (0,0); +DROP TABLE t1; +SET sql_mode=DEFAULT; + +--echo # +--echo # End of 10.7 tests +--echo # diff --git a/mysql-test/suite/compat/oracle/r/sp-row.result b/mysql-test/suite/compat/oracle/r/sp-row.result index 7fd986a71c8..c978d4be983 100644 --- a/mysql-test/suite/compat/oracle/r/sp-row.result +++ b/mysql-test/suite/compat/oracle/r/sp-row.result @@ -24,7 +24,7 @@ RETURN a; END; $$ SELECT f1(ROW(10,20)); -ERROR 21000: Operand should contain 1 column(s) +ERROR HY000: Cannot cast 'row' as 'int' in assignment of `f1(ROW(10,20))` DROP FUNCTION f1; # # ROW as an SP parameter @@ -261,7 +261,7 @@ SELECT f1(a); END; $$ CALL p1(); -ERROR 21000: Operand should contain 1 column(s) +ERROR HY000: Cannot cast 'row' as 'int' in assignment of `a` DROP PROCEDURE p1; DROP FUNCTION f1; CREATE FUNCTION f1(a INT) RETURN INT @@ -278,7 +278,7 @@ SELECT f1(a); END; $$ CALL p1(); -ERROR 21000: Operand should contain 1 column(s) +ERROR HY000: Cannot cast 'row' as 'int' in assignment of `a` DROP PROCEDURE p1; DROP FUNCTION f1; # @@ -332,7 +332,7 @@ RETURN rec; END; $$ SELECT f1(10); -ERROR 21000: Operand should contain 1 column(s) +ERROR HY000: Cannot cast 'row' as 'int' in assignment of `f1(10)` DROP FUNCTION f1; # # Using the entire ROW in SELECT..CREATE diff --git a/mysql-test/suite/compat/oracle/t/sp-row.test b/mysql-test/suite/compat/oracle/t/sp-row.test index ebd0a2a2137..c7658c76838 100644 --- a/mysql-test/suite/compat/oracle/t/sp-row.test +++ b/mysql-test/suite/compat/oracle/t/sp-row.test @@ -35,7 +35,7 @@ BEGIN END; $$ DELIMITER ;$$ ---error ER_OPERAND_COLUMNS +--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION SELECT f1(ROW(10,20)); DROP FUNCTION f1; @@ -334,7 +334,7 @@ BEGIN END; $$ DELIMITER ;$$ ---error ER_OPERAND_COLUMNS +--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION CALL p1(); DROP PROCEDURE p1; DROP FUNCTION f1; @@ -355,7 +355,7 @@ BEGIN END; $$ DELIMITER ;$$ ---error ER_OPERAND_COLUMNS +--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION CALL p1(); DROP PROCEDURE p1; DROP FUNCTION f1; @@ -427,7 +427,7 @@ BEGIN END; $$ DELIMITER ;$$ ---error ER_OPERAND_COLUMNS +--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION SELECT f1(10); DROP FUNCTION f1; diff --git a/sql/field.cc b/sql/field.cc index c80a69f4a1e..9f5add3e75a 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -983,7 +983,8 @@ bool Field::check_assignability_from(const Type_handler *from, type_handler_for_item_field()); if (th.aggregate_for_result(from->type_handler_for_item_field())) { - bool error= !ignore && get_thd()->is_strict_mode(); + bool error= (!ignore && get_thd()->is_strict_mode()) || + (type_handler()->is_scalar_type() != from->is_scalar_type()); /* Display fully qualified column name for table columns. Display non-qualified names for other things, @@ -1474,15 +1475,6 @@ bool Field::sp_prepare_and_store_item(THD *thd, Item **value) if (!(expr_item= thd->sp_fix_func_item_for_assignment(this, value))) goto error; - /* - expr_item is now fixed, it's safe to call cmp_type() - */ - if (expr_item->cmp_type() == ROW_RESULT) - { - my_error(ER_OPERAND_COLUMNS, MYF(0), 1); - goto error; - } - /* Save the value in the field. Convert the value if needed. */ expr_item->save_in_field(this, 0); |