summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Shulga <dmitry.shulga@mariadb.com>2022-04-05 20:20:09 +0700
committerDmitry Shulga <dmitry.shulga@mariadb.com>2022-04-05 20:20:09 +0700
commitf6b09a7ce58f564d8e5c08c799d2fc45cfc10870 (patch)
treea0a505e469bdc8147d30dafdf0786c13a7314289
parentc4ebb2bd04974807b3b81001fd2d733e75dfc1fb (diff)
downloadmariadb-git-f6b09a7ce58f564d8e5c08c799d2fc45cfc10870.tar.gz
MDEV-21173: Assertion `m_thd == __null' failed in sp_head::~sp_head
Some SQL statements that involves subqueries or stored routines could fail since execution of subqueries or stored routines is not supported for theses statements. Unfortunately, parsing error could result in abnormal termination by firing the following assert DBUG_ASSERT(m_thd == NULL); in a destructor of the class sp_head. The reason of the assert firing is that the method sp_head::restore_thd_mem_root() is not called on semantic action code to clean up resources allocated during parsing. This happens since the macros YYABORT is called instead of MYSQL_YYABORT by semantic action code for some grammar rules. So, to fix the bug YYABORT was just replaced with MYSQL_YYABORT.
-rw-r--r--mysql-test/main/ps.result13
-rw-r--r--mysql-test/main/ps.test19
-rw-r--r--mysql-test/main/sp.result6
-rw-r--r--mysql-test/main/sp.test9
-rw-r--r--sql/sql_yacc.yy6
5 files changed, 49 insertions, 4 deletions
diff --git a/mysql-test/main/ps.result b/mysql-test/main/ps.result
index 6df83228875..5d72cde5dd2 100644
--- a/mysql-test/main/ps.result
+++ b/mysql-test/main/ps.result
@@ -5650,5 +5650,18 @@ connection default;
SET GLOBAL disconnect_on_expired_password=@disconnect_on_expired_password_save;
DROP USER user1@localhost;
#
+# MDEV-21173: Assertion `m_thd == __null' failed in sp_head::~sp_head
+#
+CREATE TABLE t1 (a INT);
+EXECUTE IMMEDIATE "CREATE PROCEDURE p1() SELECT 1 FROM t1 PROCEDURE ANALYSE( 10, (SELECT a FROM t1));";
+ERROR 42000: PROCEDURE does not support subqueries or stored functions
+DROP TABLE t1;
+BEGIN NOT ATOMIC
+PREPARE stmt FROM 'SELECT ?';
+EXECUTE stmt USING ((SELECT 1));
+END;
+$
+ERROR 42000: EXECUTE..USING does not support subqueries or stored functions
+#
# End of 10.4 tests
#
diff --git a/mysql-test/main/ps.test b/mysql-test/main/ps.test
index 9b781f32631..c99731e768d 100644
--- a/mysql-test/main/ps.test
+++ b/mysql-test/main/ps.test
@@ -5083,5 +5083,24 @@ SET GLOBAL disconnect_on_expired_password=@disconnect_on_expired_password_save;
DROP USER user1@localhost;
--echo #
+--echo # MDEV-21173: Assertion `m_thd == __null' failed in sp_head::~sp_head
+--echo #
+CREATE TABLE t1 (a INT);
+
+--error ER_SUBQUERIES_NOT_SUPPORTED
+EXECUTE IMMEDIATE "CREATE PROCEDURE p1() SELECT 1 FROM t1 PROCEDURE ANALYSE( 10, (SELECT a FROM t1));";
+DROP TABLE t1;
+
+delimiter $;
+--error ER_SUBQUERIES_NOT_SUPPORTED
+BEGIN NOT ATOMIC
+ PREPARE stmt FROM 'SELECT ?';
+ EXECUTE stmt USING ((SELECT 1));
+END;
+$
+
+delimiter ;$
+
+--echo #
--echo # End of 10.4 tests
--echo #
diff --git a/mysql-test/main/sp.result b/mysql-test/main/sp.result
index 7dfaa6176a3..3795e4db894 100644
--- a/mysql-test/main/sp.result
+++ b/mysql-test/main/sp.result
@@ -8916,5 +8916,11 @@ END;
$$
ERROR 42000: Incorrect usage/placement of 'HIGH_PRIORITY'
#
+# MDEV-21173: Assertion `m_thd == __null' failed in sp_head::~sp_head
+#
+CREATE TABLE t1 (a INT);
+CREATE PROCEDURE p1() SELECT 1 FROM t1 PROCEDURE ANALYSE( 10, (SELECT a FROM t1));
+ERROR 42000: PROCEDURE does not support subqueries or stored functions
+DROP TABLE t1;
# End of 10.4 tests
#
diff --git a/mysql-test/main/sp.test b/mysql-test/main/sp.test
index bd614072e1a..4fa5085128a 100644
--- a/mysql-test/main/sp.test
+++ b/mysql-test/main/sp.test
@@ -10481,7 +10481,14 @@ END;
$$
DELIMITER ;$$
-
--echo #
+--echo # MDEV-21173: Assertion `m_thd == __null' failed in sp_head::~sp_head
+--echo #
+CREATE TABLE t1 (a INT);
+--error ER_SUBQUERIES_NOT_SUPPORTED
+CREATE PROCEDURE p1() SELECT 1 FROM t1 PROCEDURE ANALYSE( 10, (SELECT a FROM t1));
+
+DROP TABLE t1;
+
--echo # End of 10.4 tests
--echo #
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
index 3bda2381230..7d8b02a0f12 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -9610,7 +9610,7 @@ subselect:
query_expression
{
if (!($$= Lex->parsed_subselect($1)))
- YYABORT;
+ MYSQL_YYABORT;
}
;
@@ -9655,14 +9655,14 @@ subquery:
else
$1->fake_select_lex->braces= false;
if (!($$= Lex->parsed_subselect($1)))
- YYABORT;
+ MYSQL_YYABORT;
}
| '(' with_clause query_expression_no_with_clause ')'
{
$3->set_with_clause($2);
$2->attach_to($3->first_select());
if (!($$= Lex->parsed_subselect($3)))
- YYABORT;
+ MYSQL_YYABORT;
}
;