diff options
author | Oleksandr Byelkin <sanja@mariadb.com> | 2020-07-09 15:37:55 +0200 |
---|---|---|
committer | Oleksandr Byelkin <sanja@mariadb.com> | 2020-07-09 15:37:55 +0200 |
commit | 4a499d8b2fca929db0f4f9080f360284f49c3e5a (patch) | |
tree | ba76b28e7c8206dd19bc8cc2a0ef702538ce0a1a | |
parent | 41221091f6541ea83eeec70732b92b94746a44e7 (diff) | |
download | mariadb-git-bb-10.4-MDEV-15703.tar.gz |
MDEV-15703 Crash in EXECUTE IMMEDIATE 'CREATE OR REPLACE TABLE t1 (a INT DEFAULT ?)' USING DEFAULTbb-10.4-MDEV-15703
10.4 version: check evaluablity on Field::make_empty_rec_store_default_value
10.2 version changed with ASSERTS.
-rw-r--r-- | mysql-test/main/ps.result | 8 | ||||
-rw-r--r-- | mysql-test/main/ps.test | 11 | ||||
-rw-r--r-- | sql/field.cc | 33 | ||||
-rw-r--r-- | sql/sql_lex.h | 4 |
4 files changed, 51 insertions, 5 deletions
diff --git a/mysql-test/main/ps.result b/mysql-test/main/ps.result index f1972b6b40e..2d94ea7fdea 100644 --- a/mysql-test/main/ps.result +++ b/mysql-test/main/ps.result @@ -5489,6 +5489,14 @@ ERROR HY000: Default/ignore value is not supported for such parameter usage EXECUTE IMMEDIATE 'SHOW DATABASES WHERE ?' USING 0; Database # +# MDEV-15703: Crash in EXECUTE IMMEDIATE +# 'CREATE OR REPLACE TABLE t1 (a INT DEFAULT ?)' USING DEFAULT +# +EXECUTE IMMEDIATE 'CREATE TABLE t1 (a INT DEFAULT ?)' USING IGNORE; +ERROR HY000: Default/ignore value is not supported for such parameter usage +EXECUTE IMMEDIATE 'CREATE TABLE t1 (a INT DEFAULT ?)' USING DEFAULT; +ERROR HY000: Default/ignore value is not supported for such parameter usage +# # End of 10.2 tests # # diff --git a/mysql-test/main/ps.test b/mysql-test/main/ps.test index e702cb76bbb..463e29bde1a 100644 --- a/mysql-test/main/ps.test +++ b/mysql-test/main/ps.test @@ -4931,6 +4931,17 @@ DROP TABLE t1; EXECUTE IMMEDIATE 'SHOW DATABASES WHERE ?' USING DEFAULT; EXECUTE IMMEDIATE 'SHOW DATABASES WHERE ?' USING 0; + +--echo # +--echo # MDEV-15703: Crash in EXECUTE IMMEDIATE +--echo # 'CREATE OR REPLACE TABLE t1 (a INT DEFAULT ?)' USING DEFAULT +--echo # + +--error ER_INVALID_DEFAULT_PARAM +EXECUTE IMMEDIATE 'CREATE TABLE t1 (a INT DEFAULT ?)' USING IGNORE; +--error ER_INVALID_DEFAULT_PARAM +EXECUTE IMMEDIATE 'CREATE TABLE t1 (a INT DEFAULT ?)' USING DEFAULT; + --echo # --echo # End of 10.2 tests --echo # diff --git a/sql/field.cc b/sql/field.cc index 15356274864..057f8315086 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -1427,6 +1427,8 @@ bool Field::check_vcol_sql_mode_dependency(THD *thd, vcol_init_mode mode) const bool Field::make_empty_rec_store_default_value(THD *thd, Item *item) { DBUG_ASSERT(!(flags & BLOB_FLAG)); + if (item->check_is_evaluable_expression_or_error()) + return 1; int res= item->save_in_field(this, true); return res != 0 && res != 3; } @@ -11284,6 +11286,14 @@ bool Field::save_in_field_default_value(bool view_error_processing) if (vers_sys_field()) return false; + if (table->pos_in_table_list == NULL) // table is not opened (CREATE TABLE) + { + DBUG_ASSERT(0); // shoud not be possible + my_message(ER_INVALID_DEFAULT_PARAM, + ER_THD(thd, ER_INVALID_DEFAULT_PARAM), MYF(0)); + return false; + } + if (unlikely(flags & NO_DEFAULT_VALUE_FLAG && real_type() != MYSQL_TYPE_ENUM)) { @@ -11323,12 +11333,25 @@ bool Field::save_in_field_default_value(bool view_error_processing) bool Field::save_in_field_ignore_value(bool view_error_processing) { enum_sql_command com= table->in_use->lex->sql_command; + bool top_level= table->pos_in_table_list && + table->pos_in_table_list->select_lex && + table->pos_in_table_list->select_lex->is_top_level_select(); + // All insert-like commands - if (com == SQLCOM_INSERT || com == SQLCOM_REPLACE || - com == SQLCOM_INSERT_SELECT || com == SQLCOM_REPLACE_SELECT || - com == SQLCOM_LOAD) - return save_in_field_default_value(view_error_processing); - return 0; // ignore + if (top_level) + { + if (com == SQLCOM_INSERT || com == SQLCOM_REPLACE || + com == SQLCOM_INSERT_SELECT || com == SQLCOM_REPLACE_SELECT || + com == SQLCOM_LOAD) + return save_in_field_default_value(view_error_processing); + if (com == SQLCOM_UPDATE || com == SQLCOM_UPDATE_MULTI) + return 0; // ignore + } + + DBUG_ASSERT(0); // shoud not be possible + my_message(ER_INVALID_DEFAULT_PARAM, + ER_THD(table->in_use, ER_INVALID_DEFAULT_PARAM), MYF(0)); + return false; } diff --git a/sql/sql_lex.h b/sql/sql_lex.h index 0983cea44d0..043070bd558 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -1432,6 +1432,10 @@ public: { return (select_number == 1) && !is_part_of_union(); } + bool is_top_level_select() + { + return master_unit()->get_master() == NULL; + } bool optimize_unflattened_subqueries(bool const_only); /* Set the EXPLAIN type for this subquery. */ void set_explain_type(bool on_the_fly); |