From ac73e34594d71947a2097f806b8e924af50af8a3 Mon Sep 17 00:00:00 2001
From: Kirill Shcherbatov <kshcherbatov@tarantool.org>
Date: Thu, 29 Nov 2018 18:54:53 +0300
Subject: [PATCH] sql: fix parser.parse_only mode for triggers

As the parse_only flag had not worked correctly for sql triggers
sql_trigger_compile have had a Vdbe memory leak.

Closes #3838
---
 src/box/sql/prepare.c |  1 +
 src/box/sql/trigger.c | 14 +++-----------
 src/box/sql/vdbeaux.c |  1 +
 3 files changed, 5 insertions(+), 11 deletions(-)

diff --git a/src/box/sql/prepare.c b/src/box/sql/prepare.c
index a4b65ebe7c..824578e45d 100644
--- a/src/box/sql/prepare.c
+++ b/src/box/sql/prepare.c
@@ -282,6 +282,7 @@ void
 sql_parser_destroy(Parse *parser)
 {
 	assert(parser != NULL);
+	assert(!parser->parse_only || parser->pVdbe == NULL);
 	sqlite3 *db = parser->db;
 	sqlite3DbFree(db, parser->aLabel);
 	sql_expr_list_delete(db, parser->pConstExpr);
diff --git a/src/box/sql/trigger.c b/src/box/sql/trigger.c
index c38f9cd9da..482f40926d 100644
--- a/src/box/sql/trigger.c
+++ b/src/box/sql/trigger.c
@@ -73,10 +73,6 @@ sql_trigger_begin(struct Parse *parse, struct Token *name, int tr_tm,
 	/* The name of the Trigger. */
 	char *trigger_name = NULL;
 
-	struct Vdbe *v = sqlite3GetVdbe(parse);
-	if (v != NULL)
-		sqlite3VdbeCountChanges(v);
-
 	/* pName->z might be NULL, but not pName itself. */
 	assert(name != NULL);
 	assert(op == TK_INSERT || op == TK_UPDATE || op == TK_DELETE);
@@ -84,13 +80,6 @@ sql_trigger_begin(struct Parse *parse, struct Token *name, int tr_tm,
 
 	if (table == NULL || db->mallocFailed)
 		goto trigger_cleanup;
-
-	/*
-	 * Ensure the table name matches database name and that
-	 * the table exists.
-	 */
-	if (db->mallocFailed)
-		goto trigger_cleanup;
 	assert(table->nSrc == 1);
 
 	trigger_name = sqlite3NameFromToken(db, name);
@@ -111,6 +100,9 @@ sql_trigger_begin(struct Parse *parse, struct Token *name, int tr_tm,
 	}
 
 	if (!parse->parse_only) {
+		struct Vdbe *v = sqlite3GetVdbe(parse);
+		if (v != NULL)
+			sqlite3VdbeCountChanges(v);
 		const char *error_msg =
 			tt_sprintf(tnt_errcode_desc(ER_TRIGGER_EXISTS),
 				   trigger_name);
diff --git a/src/box/sql/vdbeaux.c b/src/box/sql/vdbeaux.c
index f2faad8620..fc805e3aa3 100644
--- a/src/box/sql/vdbeaux.c
+++ b/src/box/sql/vdbeaux.c
@@ -50,6 +50,7 @@
 Vdbe *
 sqlite3VdbeCreate(Parse * pParse)
 {
+	assert(!pParse->parse_only);
 	sqlite3 *db = pParse->db;
 	Vdbe *p;
 	p = sqlite3DbMallocRawNN(db, sizeof(Vdbe));
-- 
GitLab