From 996b9a9d0459e371d01c63584f95101f3703900b Mon Sep 17 00:00:00 2001 From: Alexander Barkov Date: Tue, 19 May 2020 13:30:42 +0400 Subject: MDEV-22591 Debug build crashes on EXECUTE IMMEDIATE '... WHERE ?' USING IGNORE Removing a wrong DBUG_ASSERT: When Item_param gets "unfixed" in cleanup(), its "fixed" gets assigned to false, while item_item keeps the value. So the assert was wrong. Perhaps, instead of removing the assert, it was possible to reset item_type to NO_VALUE in cleanup. But this is not very important: it's implemented in 10.4 in a better way: Item_param::is_fixed() always returns true and it does not need to be "unfixed". --- mysql-test/r/ps.result | 17 +++++++++++++++++ mysql-test/t/ps.test | 17 +++++++++++++++++ sql/item.h | 1 - 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/mysql-test/r/ps.result b/mysql-test/r/ps.result index c3e6e61ae9d..8d4b52e1b2e 100644 --- a/mysql-test/r/ps.result +++ b/mysql-test/r/ps.result @@ -5373,5 +5373,22 @@ drop procedure p; drop view v1; drop table t1; # +# MDEV-22591 Debug build crashes on EXECUTE IMMEDIATE '... WHERE ?' USING IGNORE +# +CREATE TABLE t1 (a INT); +EXECUTE IMMEDIATE 'SELECT * FROM t1 WHERE ?' USING IGNORE; +ERROR HY000: Default/ignore value is not supported for such parameter usage +EXECUTE IMMEDIATE 'SELECT * FROM t1 HAVING ?' USING IGNORE; +ERROR HY000: Default/ignore value is not supported for such parameter usage +EXECUTE IMMEDIATE 'SELECT * FROM t1 WHERE ?' USING 0; +a +EXECUTE IMMEDIATE 'SELECT * FROM t1 HAVING ?' USING 0; +a +DROP TABLE t1; +EXECUTE IMMEDIATE 'SHOW DATABASES WHERE ?' USING DEFAULT; +ERROR HY000: Default/ignore value is not supported for such parameter usage +EXECUTE IMMEDIATE 'SHOW DATABASES WHERE ?' USING 0; +Database +# # End of 10.2 tests # diff --git a/mysql-test/t/ps.test b/mysql-test/t/ps.test index b82394b56f6..90af3ff7ce1 100644 --- a/mysql-test/t/ps.test +++ b/mysql-test/t/ps.test @@ -4885,6 +4885,23 @@ drop procedure p; drop view v1; drop table t1; + +--echo # +--echo # MDEV-22591 Debug build crashes on EXECUTE IMMEDIATE '... WHERE ?' USING IGNORE +--echo # + +CREATE TABLE t1 (a INT); +--error ER_INVALID_DEFAULT_PARAM +EXECUTE IMMEDIATE 'SELECT * FROM t1 WHERE ?' USING IGNORE; +--error ER_INVALID_DEFAULT_PARAM +EXECUTE IMMEDIATE 'SELECT * FROM t1 HAVING ?' USING IGNORE; +EXECUTE IMMEDIATE 'SELECT * FROM t1 WHERE ?' USING 0; +EXECUTE IMMEDIATE 'SELECT * FROM t1 HAVING ?' USING 0; +DROP TABLE t1; +--error ER_INVALID_DEFAULT_PARAM +EXECUTE IMMEDIATE 'SHOW DATABASES WHERE ?' USING DEFAULT; +EXECUTE IMMEDIATE 'SHOW DATABASES WHERE ?' USING 0; + --echo # --echo # End of 10.2 tests --echo # diff --git a/sql/item.h b/sql/item.h index 4d861623836..6f009fe904b 100644 --- a/sql/item.h +++ b/sql/item.h @@ -3140,7 +3140,6 @@ public: enum Type type() const { - DBUG_ASSERT(fixed || state == NO_VALUE); return item_type; } -- cgit v1.2.1