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