From: Kirill Shcherbatov <kshcherbatov@tarantool.org> To: tarantool-patches@freelists.org Cc: "v.shpilevoy@tarantool.org" <v.shpilevoy@tarantool.org> Subject: [tarantool-patches] Re: [PATCH v3 09/10] sql: move Triggers to server Date: Fri, 15 Jun 2018 19:21:35 +0300 [thread overview] Message-ID: <eec464e1-0f11-1db8-f47f-7d0b3b330768@tarantool.org> (raw) In-Reply-To: <45ff716a-8295-50d8-f317-cc28f9d0dba4@tarantool.org> > 1. When you rollback insertion, that means you have no old_trigger. > So sql_trigger_name(old_trigger) crashes. Please, add a test > and fix the problem. No, there is no problem. Maybe "old_trigger" is a little confusing name, but on_rollback->data = new_trigger; for insert and it is not NULL. New ErrInjection test validates this case. --- a/test/sql/errinj.test.lua +++ b/test/sql/errinj.test.lua @@ -44,3 +44,18 @@ errinj.set("ERRINJ_IPROTO_TX_DELAY", false) box.sql.execute('DROP TABLE test') box.schema.user.revoke('guest', 'read,write,execute', 'universe') + + +-- test crash on error.injection +box.sql.execute("CREATE TABLE t1(id INTEGER PRIMARY KEY, a INTEGER);"); +box.sql.execute("CREATE TABLE t2(id INTEGER PRIMARY KEY, a INTEGER);"); +box.error.injection.set("ERRINJ_WAL_IO", true) +box.sql.execute("CREATE TRIGGER t1t INSERT ON t1 BEGIN INSERT INTO t2 VALUES (1, 1); END;") +box.sql.execute("CREATE INDEX t1a ON t1(a);") +box.error.injection.set("ERRINJ_WAL_IO", false) +box.sql.execute("CREATE TRIGGER t1t INSERT ON t1 BEGIN INSERT INTO t2 VALUES (1, 1); END;") +box.sql.execute("INSERT INTO t1 VALUES (3, 3);") +box.sql.execute("SELECT * from t1"); +box.sql.execute("SELECT * from t2"); +box.sql.execute("DROP TABLE t1;") +box.sql.execute("DROP TABLE t2;") > >> + (void)rc; >> + assert(rc == 0); >> + assert(new_trigger == old_trigger); >> + sql_trigger_delete(sql_get(), new_trigger); >> + } else { >> + /* REPLACE trigger. */ >> + if (sql_trigger_replace(sql_get(), >> + sql_trigger_name(old_trigger), >> + old_trigger, &new_trigger) != 0) >> + panic("Out of memory on insertion into trigger hash"); >> + assert(old_trigger != new_trigger); >> + >> + sql_trigger_delete(sql_get(), new_trigger); >> + } >> +} >> + >> +static void >> +on_replace_trigger_commit(struct trigger *trigger, void * /* event */) >> +{ >> + struct Trigger *old_trigger = (struct Trigger *)trigger->data; >> + /* DELETE, REPLACE trigger. */ > > 2. Doesn't commit of insertion call this function? Yes, it is. But old_trigger is NULL in this case and this comment is a legacy, there was a if-clause. - /* DELETE, REPLACE trigger. */ > >> + sql_trigger_delete(sql_get(), old_trigger); >> +} > > 3. Please, add comments to both on_replace_trigger functions. Similar to on_rollback_dd_sequence comments: +/** + * Trigger invoked on rollback in the _trigger space. + */ static void on_replace_trigger_rollback(struct trigger *trigger, void *event) +/** + * Trigger invoked on commit in the _trigger space. + */ static void on_replace_trigger_commit(struct trigger *trigger, void * /* event */) > 4. If this function raises, new_trigger will leak. Ok, I believe that now it is a time to use guard that was rejected earlier. It is common for alter.cc. @@ -3197,11 +3202,14 @@ on_replace_dd_trigger(struct trigger * /* trigger */, void *event) if (new_trigger == NULL) diag_raise(); + auto new_trigger_guard = make_scoped_guard([=] { + sql_trigger_delete(sql_get(), new_trigger); + }); + const char *trigger_name = sql_trigger_name(new_trigger); if (strlen(trigger_name) != trigger_name_len || memcmp(trigger_name_src, trigger_name, trigger_name_len) != 0) { - sql_trigger_delete(sql_get(), new_trigger); tnt_raise(ClientError, ER_SQL, "tuple trigger name does not match extracted " "from SQL"); @@ -3210,7 +3218,6 @@ on_replace_dd_trigger(struct trigger * /* trigger */, void *event) tuple_field_u32_xc(new_tuple, BOX_TRIGGER_FIELD_SPACE_ID); if (space_id != sql_trigger_space_id(new_trigger)) { - sql_trigger_delete(sql_get(), new_trigger); tnt_raise(ClientError, ER_SQL, "tuple space_id does not match the value " "resolved on AST building from SQL"); @@ -3219,12 +3226,12 @@ on_replace_dd_trigger(struct trigger * /* trigger */, void *event) struct Trigger *old_trigger; if (sql_trigger_replace(sql_get(), trigger_name, new_trigger, &old_trigger) != 0) { - sql_trigger_delete(sql_get(), new_trigger); diag_raise(); } on_commit->data = old_trigger; on_rollback->data = new_trigger; + new_trigger_guard.is_active = false; } txn_on_rollback(txn, on_rollback); > Good. Lets use the same way for parsed_expr as I mentioned in one of > the previous letters. Done in previous commit. > 5. Same as in expr_compile. When rc == SQL_TARANTOOL_ERROR, you > ignore it and takes pNewTrigger. You should not. - if (sqlite3RunParser(&parser, sql, &sql_error) != SQLITE_OK && - parser.rc != SQL_TARANTOOL_ERROR) { + if (sqlite3RunParser(&parser, sql, &sql_error) != SQLITE_OK) { + if (parser.rc != SQL_TARANTOOL_ERROR) diag_set(ClientError, ER_SQL, sql_error); > 6. You said that space * becomes invalid, but anyway its triggers are > transferred with no changes, so you can save them into a local > variable before space rename, and remove this space_by_id(). @@ -4713,6 +4713,8 @@ case OP_RenameTable: { space_id = SQLITE_PAGENO_TO_SPACEID(pOp->p1); space = space_by_id(space_id); assert(space); + /* Rename space op doesn't change triggers. */ + struct Trigger *triggers = space->sql_triggers; zOldTableName = space_name(space); assert(zOldTableName); pTab = sqlite3HashFind(&db->pSchema->tblHash, zOldTableName); @@ -4757,16 +4759,13 @@ case OP_RenameTable: { goto abort_due_to_error; } - space = space_by_id(space_id); - assert(space != NULL); - for (struct Trigger *trigger = space->sql_triggers; trigger != NULL; ) { + for (struct Trigger *trigger = triggers; trigger != NULL; ) { /* Store pointer as trigger will be destructed. */ struct Trigger *next_trigger = trigger->pNext; rc = tarantoolSqlite3RenameTrigger(trigger->zName, > 7. Why do you need this filter, if no one of errors > emerged from a lua file? Just copied from template. > 8. Same as point 19 on the previous review. Ok, let drop it. It is not really important test. > 9. Please, replace 'tuple trigger' with just 'trigger' in all new > error messages. Ok. > 10. Instead of 'immutabling' result of insert you can just do > > _ = box.space._trigger:insert(tuple) > > Anyway you are going to print that tuple from the next select(). Please > do it in other places of insertions and deletions too. Ok. > 11. Error injections are disabled in Release build. Please, move this test > case into a separate file. We have test/sql/errinj.test.lua. Moved to test/sql/errinj.test.lua
next prev parent reply other threads:[~2018-06-15 16:21 UTC|newest] Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top 2018-06-14 17:32 [tarantool-patches] [PATCH v3 00/10] sql: remove " Kirill Shcherbatov 2018-06-14 17:32 ` [tarantool-patches] [PATCH v3 01/10] box: move db->pShchema init to sql_init Kirill Shcherbatov 2018-06-14 17:32 ` [tarantool-patches] [PATCH v3 10/10] sql: VDBE tests for trigger existence Kirill Shcherbatov 2018-06-14 19:27 ` [tarantool-patches] " Vladislav Shpilevoy 2018-06-15 16:21 ` Kirill Shcherbatov 2018-06-18 15:42 ` Vladislav Shpilevoy 2018-06-18 19:22 ` Kirill Shcherbatov 2018-06-19 10:24 ` Vladislav Shpilevoy 2018-06-19 15:12 ` Kirill Shcherbatov 2018-06-19 15:23 ` Vladislav Shpilevoy 2018-06-20 6:38 ` Kirill Shcherbatov 2018-06-20 8:10 ` Vladislav Shpilevoy 2018-06-20 8:24 ` Kirill Shcherbatov 2018-06-14 17:32 ` [tarantool-patches] [PATCH v3 02/10] sql: fix leak on CREATE TABLE and resolve self ref Kirill Shcherbatov 2018-06-14 22:46 ` [tarantool-patches] " n.pettik 2018-06-15 9:25 ` Vladislav Shpilevoy 2018-06-14 17:32 ` [tarantool-patches] [PATCH v3 03/10] sql: fix sql len in tarantoolSqlite3RenameTrigger Kirill Shcherbatov 2018-06-14 17:32 ` [tarantool-patches] [PATCH v3 04/10] box: port schema_find_id to C Kirill Shcherbatov 2018-06-14 19:27 ` [tarantool-patches] " Vladislav Shpilevoy 2018-06-14 22:46 ` n.pettik 2018-06-15 9:25 ` Vladislav Shpilevoy 2018-06-14 17:32 ` [tarantool-patches] [PATCH v3 05/10] sql: refactor sql_expr_compile to return AST Kirill Shcherbatov 2018-06-14 19:27 ` [tarantool-patches] " Vladislav Shpilevoy 2018-06-15 16:21 ` Kirill Shcherbatov 2018-06-14 17:32 ` [tarantool-patches] [PATCH v3 06/10] sql: move sqlite3DeleteTrigger to sql.h Kirill Shcherbatov 2018-06-14 19:27 ` [tarantool-patches] " Vladislav Shpilevoy 2018-06-14 17:32 ` [tarantool-patches] [PATCH v3 07/10] box: sort error codes in misc.test Kirill Shcherbatov 2018-06-14 17:32 ` [tarantool-patches] [PATCH v3 08/10] sql: new _trigger space format with space_id Kirill Shcherbatov 2018-06-14 19:27 ` [tarantool-patches] " Vladislav Shpilevoy 2018-06-15 16:21 ` Kirill Shcherbatov 2018-06-14 17:32 ` [tarantool-patches] [PATCH v3 09/10] sql: move Triggers to server Kirill Shcherbatov 2018-06-14 19:27 ` [tarantool-patches] " Vladislav Shpilevoy 2018-06-15 16:21 ` Kirill Shcherbatov [this message] 2018-06-18 15:42 ` Vladislav Shpilevoy 2018-06-18 19:22 ` Kirill Shcherbatov 2018-06-14 17:34 ` [tarantool-patches] Re: [PATCH v3 00/10] sql: remove " Kirill Shcherbatov 2018-06-20 8:35 ` Vladislav Shpilevoy 2018-06-28 15:47 ` n.pettik
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=eec464e1-0f11-1db8-f47f-7d0b3b330768@tarantool.org \ --to=kshcherbatov@tarantool.org \ --cc=tarantool-patches@freelists.org \ --cc=v.shpilevoy@tarantool.org \ --subject='[tarantool-patches] Re: [PATCH v3 09/10] sql: move Triggers to server' \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox