From: "n.pettik" <korablev@tarantool.org> To: tarantool-patches@freelists.org Cc: Vladislav Shpilevoy <v.shpilevoy@tarantool.org> Subject: [tarantool-patches] Re: [PATCH 1/4] sql: remove OP_AutoCommit opcode Date: Sat, 5 May 2018 22:14:23 +0300 [thread overview] Message-ID: <85A40D5A-FE65-4E42-A62D-AD81EB2C9B86@tarantool.org> (raw) In-Reply-To: <5f3205b3-cd3b-e50a-e185-f7ea91067f99@tarantool.org> > 1. OP_AutoCommit still exists in mkopcodeh.sh. Ok, removed: --- a/extra/mkopcodeh.sh +++ b/extra/mkopcodeh.sh @@ -146,7 +146,6 @@ while [ "$i" -lt "$nOp" ]; do eval "name=\$ARRAY_order_$i" case "$name" in # The following are the opcodes that are processed by resolveP2Values() - OP_AutoCommit | \ >> + assert(psql_txn->pSavepoint == 0 || box_txn()); > 2. Please, use explicit ==/!= NULL (pSavepoint is pointer). --- a/src/box/sql/vdbe.c +++ b/src/box/sql/vdbe.c @@ -2875,7 +2875,7 @@ case OP_Savepoint: { /* Assert that the p1 parameter is valid. Also that if there is no open * transaction, then there cannot be any savepoints. */ - assert(psql_txn->pSavepoint == 0 || box_txn()); + assert(psql_txn->pSavepoint == NULL || box_txn()); >> +/* Opcode: TransactionBegin * * * * * >> + * >> + * Start Tarantool's transaction. >> + * Only do that if there is no other active transactions. >> + * Otherwise, raise an error with appropriate error message. >> + */ >> +case OP_TransactionBegin: { >> + if (!box_txn()) { > > 3. sql_txn_begin() does this check for you. Here you can always call sql_txn_begin() and > check result code. After this you can remove manual error message creating, and just goto > abort_due_to_error. Error code is always SQL_TARANTOOL_ERROR. In fifth comment you wrote that you would better return 0/-1 from sql_txn_begin() So anyway I have to manually set return code: @@ -2997,17 +2997,9 @@ case OP_FkCheckCommit: { * Otherwise, raise an error with appropriate error message. */ case OP_TransactionBegin: { - if (!box_txn()) { - p->auto_commit = false; - rc = sql_txn_begin(p); - if (rc != SQLITE_OK) - goto abort_due_to_error; - } else { - sqlite3VdbeError(p, "cannot start a transaction within " - "a transaction"); - rc = SQLITE_ERROR; + if (sql_txn_begin(p) != 0) { + rc = SQL_TARANTOOL_ERROR; goto abort_due_to_error; } + p->auto_commit = false; break; >> + >> +/* Opcode: TransactionCommit * * * * * >> + * >> + * Commit Tarantool's transaction. >> + * If there is no active transaction, raise an error. >> + */ >> +case OP_TransactionCommit: { >> + if (box_txn()) { >> + if (box_txn_commit() != 0) { >> + rc = SQL_TARANTOOL_ERROR; >> + goto abort_due_to_error; >> } >> - rc = SQLITE_DONE; >> - goto vdbe_return; >> } else { >> - sqlite3VdbeError(p, >> - (!desiredAutoCommit)?"cannot start a transaction within a transaction":( >> - (iRollback)?"cannot rollback - no transaction is active": >> - "cannot commit - no transaction is active")); >> + sqlite3VdbeError(p, "cannot commit - no transaction is active"); >> + rc = SQLITE_ERROR; >> + goto abort_due_to_error; > > 4. I am not sure, that we must throw on commit/rollback with no > transaction. In Lua it is ok. Possibly you should ask in the server team chat. Well, I was sentenced to investigate SQL ANSI, so I found this: (2006 standard, Part 2: Foundation) 17.7 <commit statement> • If an atomic execution context is active, then an exception condition is raised: invalid transaction termination. *Atomic execution context, as I understand is sort of auto-commit mode:* • 4.33.5 SQL-statement atomicity and statement execution contexts The following are non-atomic SQL-statements: • — <call statement> • — <execute statement> • — <execute immediate statement> • — <commit statement> • — <return statement> • — <rollback statement> • — <savepoint statement> All other SQL-statements are atomic SQL-statements. The statement execution context brought into existence by the execution of a non-atomic SQL-statement is a non-atomic execution context. >> @@ -3052,18 +3052,26 @@ case OP_AutoCommit: { >> /* Opcode: TTransaction * * * * * >> * >> - * Start Tarantool's transaction. >> - * Only do that if auto commit mode is on. This should be no-op >> - * if this opcode was emitted inside a transaction. >> + * Start Tarantool's transaction, if there is no active >> + * transactions. Otherwise, create anonymous savepoint, >> + * which is used to correctly process ABORT statement inside >> + * outer transaction. >> + * >> + * In contrast to OP_TransactionBegin, this is service opcode, >> + * generated automatically alongside with DML routine. >> */ >> case OP_TTransaction: { >> - if (p->autoCommit) { >> - rc = box_txn_begin() == 0 ? SQLITE_OK : SQL_TARANTOOL_ERROR; >> - } >> - if (box_txn() >> - && p->autoCommit == 0){ >> + if (!box_txn()) { >> + if (box_txn_begin() != 0) { > > 5. Same as 3. If you need error code, then use box_error_code() when begin() fails. To be honest, I didn’t get this idea. VDBE now supports only SQL_TARANTOOL_ERROR, which in turn results in box_error_message() displaying. Do you mean to expose VDBE error codes with enum box_error_code ? > >> diff --git a/src/box/sql/vdbeaux.c b/src/box/sql/vdbeaux.c >> index b3998ea27..0bd0d455b 100644 >> --- a/src/box/sql/vdbeaux.c >> +++ b/src/box/sql/vdbeaux.c >> @@ -2477,31 +2477,27 @@ sqlite3VdbeCheckFk(Vdbe * p, int deferred) >> int >> sql_txn_begin(Vdbe *p) >> { >> - struct txn *ptxn; >> - >> if (in_txn()) { >> diag_set(ClientError, ER_ACTIVE_TRANSACTION); >> - return -1; >> + return SQL_TARANTOOL_ERROR; > > 6. It is step backwards to sqlite result codes style. Lets return 0/-1, > and set errors via diag_set. If sql_txn_begin() returns -1, it is always > SQL_TARANTOOL_ERROR. Ok: +++ b/src/box/sql/vdbeaux.c @@ -2479,19 +2479,21 @@ sql_txn_begin(Vdbe *p) { if (in_txn()) { diag_set(ClientError, ER_ACTIVE_TRANSACTION); - return SQL_TARANTOOL_ERROR; + return -1; } struct txn *ptxn = txn_begin(false); if (ptxn == NULL) - return SQLITE_NOMEM; + return -1; ptxn->psql_txn = region_alloc_object(&fiber()->gc, struct sql_txn); if (ptxn->psql_txn == NULL) { box_txn_rollback(); - return SQLITE_NOMEM; + diag_set(OutOfMemory, sizeof(struct sql_txn), "region", + "struct sql_txn"); + return -1; } memset(ptxn->psql_txn, 0, sizeof(struct sql_txn)); p->psql_txn = ptxn->psql_txn; - return SQLITE_OK; + return 0; }
next prev parent reply other threads:[~2018-05-05 19:14 UTC|newest] Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top 2018-05-03 18:49 [tarantool-patches] [PATCH 0/4] Rework SQL transaction processing Nikita Pettik 2018-05-03 18:49 ` [tarantool-patches] [PATCH 1/4] sql: remove OP_AutoCommit opcode Nikita Pettik 2018-05-04 14:12 ` [tarantool-patches] " Vladislav Shpilevoy 2018-05-05 19:14 ` n.pettik [this message] 2018-05-03 18:49 ` [tarantool-patches] [PATCH 2/4] sql: allow transitive Lua <-> SQL transactions Nikita Pettik 2018-05-04 14:12 ` [tarantool-patches] " Vladislav Shpilevoy 2018-05-05 19:14 ` n.pettik 2018-05-03 18:49 ` [tarantool-patches] [PATCH 3/4] sql: allow SAVEPOINT statement outside transaction Nikita Pettik 2018-05-04 14:12 ` [tarantool-patches] " Vladislav Shpilevoy 2018-05-05 19:15 ` n.pettik 2018-05-03 18:49 ` [tarantool-patches] [PATCH 4/4] sql: fix SAVEPOINT RELEASE statement Nikita Pettik 2018-05-04 14:12 ` [tarantool-patches] " Vladislav Shpilevoy 2018-05-05 19:16 ` n.pettik 2018-05-07 13:31 ` [tarantool-patches] Re: [PATCH 0/4] Rework SQL transaction processing Vladislav Shpilevoy 2018-05-11 7:17 ` Kirill Yukhin 2018-05-11 10:08 ` Kirill Yukhin
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=85A40D5A-FE65-4E42-A62D-AD81EB2C9B86@tarantool.org \ --to=korablev@tarantool.org \ --cc=tarantool-patches@freelists.org \ --cc=v.shpilevoy@tarantool.org \ --subject='[tarantool-patches] Re: [PATCH 1/4] sql: remove OP_AutoCommit opcode' \ /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