MXS-938: Recognize transaction start

Now more information about a transaction start is provided. When
a transaction start statement is parsed, the type of the statement
with be QUERY_TYPE_BEGIN_TRX anded with QUERY_TYPE_READ or
QUERY_TYPE_WRITE if the transaction was explicitly started as READ
ONLY or READ WRITE.

Now also BEGIN WORK and [COMMIT|ROLLBACK] WORK are recognized.
"AND CHAIN" will still need to be recognized.
This commit is contained in:
Johan Wikman
2016-10-19 22:49:03 +03:00
parent 6bcb3ce4dc
commit e1ccc8afe0
4 changed files with 76 additions and 9 deletions

View File

@ -630,6 +630,14 @@ static uint32_t resolve_query_type(THD* thd)
case SQLCOM_BEGIN:
type |= QUERY_TYPE_BEGIN_TRX;
if (lex->start_transaction_opt & MYSQL_START_TRANS_OPT_READ_WRITE)
{
type |= QUERY_TYPE_WRITE;
}
else if (lex->start_transaction_opt & MYSQL_START_TRANS_OPT_READ_ONLY)
{
type |= QUERY_TYPE_READ;
}
goto return_qtype;
break;

View File

@ -968,7 +968,7 @@ void mxs_sqlite3BeginTransaction(Parse* pParse, int type)
ss_dassert(info);
info->status = QC_QUERY_PARSED;
info->types = QUERY_TYPE_BEGIN_TRX;
info->types = QUERY_TYPE_BEGIN_TRX | type;
}
void mxs_sqlite3BeginTrigger(Parse *pParse, /* The parse context of the CREATE TRIGGER statement */

View File

@ -59,6 +59,13 @@
%include {
#include "sqliteInt.h"
// Copied from query_classifier.h
enum
{
QUERY_TYPE_READ = 0x000002, /*< Read database data:any */
QUERY_TYPE_WRITE = 0x000004, /*< Master data will be modified:master */
};
// MaxScale naming convention:
//
// - A function that "overloads" a sqlite3 function has the same name
@ -294,11 +301,13 @@ cmdx ::= cmd. { sqlite3FinishCoding(pParse); }
//
%ifdef MAXSCALE
cmd ::= BEGIN transtype(Y) trans_opt. {mxs_sqlite3BeginTransaction(pParse, Y);}
id_opt ::= .
id_opt ::= deferred_id.
cmd ::= BEGIN id_opt. {mxs_sqlite3BeginTransaction(pParse, 0);} // BEGIN [WORK]
%endif
%ifndef MAXSCALE
cmd ::= BEGIN transtype(Y) trans_opt. {sqlite3BeginTransaction(pParse, Y);}
%endif
trans_opt ::= .
trans_opt ::= TRANSACTION.
trans_opt ::= TRANSACTION nm.
@ -307,10 +316,11 @@ transtype(A) ::= . {A = TK_DEFERRED;}
transtype(A) ::= DEFERRED(X). {A = @X;}
transtype(A) ::= IMMEDIATE(X). {A = @X;}
transtype(A) ::= EXCLUSIVE(X). {A = @X;}
%endif
%ifdef MAXSCALE
cmd ::= COMMIT trans_opt. {mxs_sqlite3CommitTransaction(pParse);}
cmd ::= END trans_opt. {mxs_sqlite3CommitTransaction(pParse);}
cmd ::= ROLLBACK trans_opt. {mxs_sqlite3RollbackTransaction(pParse);}
cmd ::= COMMIT id_opt. {mxs_sqlite3CommitTransaction(pParse);}
cmd ::= END id_opt. {mxs_sqlite3CommitTransaction(pParse);}
cmd ::= ROLLBACK id_opt. {mxs_sqlite3RollbackTransaction(pParse);}
%endif
%ifndef MAXSCALE
cmd ::= COMMIT trans_opt. {sqlite3CommitTransaction(pParse);}
@ -318,6 +328,7 @@ cmd ::= END trans_opt. {sqlite3CommitTransaction(pParse);}
cmd ::= ROLLBACK trans_opt. {sqlite3RollbackTransaction(pParse);}
%endif
%ifndef MAXSCALE
savepoint_opt ::= SAVEPOINT.
savepoint_opt ::= .
cmd ::= SAVEPOINT nm(X). {
@ -329,6 +340,7 @@ cmd ::= RELEASE savepoint_opt nm(X). {
cmd ::= ROLLBACK trans_opt TO savepoint_opt nm(X). {
sqlite3Savepoint(pParse, SAVEPOINT_ROLLBACK, &X);
}
%endif
///////////////////// The CREATE TABLE statement ////////////////////////////
//
@ -3144,8 +3156,39 @@ show(A) ::= SHOW WARNINGS show_warnings_options. {
//////////////////////// The START TRANSACTION statement ////////////////////////////////////
//
cmd ::= START TRANSACTION. {
mxs_sqlite3BeginTransaction(pParse, 0);
%type start_transaction_characteristic {int}
start_transaction_characteristic(A) ::= READ WRITE. {
A = QUERY_TYPE_WRITE;
}
start_transaction_characteristic(A) ::= READ id. { // READ ONLY
A = QUERY_TYPE_READ;
}
start_transaction_characteristic(A) ::= WITH id id. { // WITH CONSISTENT SNAPSHOT
A = 0;
}
%type start_transaction_characteristics {int}
start_transaction_characteristics(A) ::= .
{
A = 0;
}
start_transaction_characteristics(A) ::= start_transaction_characteristic(X).
{
A = X;
}
start_transaction_characteristics(A) ::=
start_transaction_characteristics(X) COMMA start_transaction_characteristic(Y). {
A = X | Y;
}
cmd ::= START TRANSACTION start_transaction_characteristics(X). {
mxs_sqlite3BeginTransaction(pParse, X);
}
//////////////////////// The TRUNCATE statement ////////////////////////////////////

View File

@ -54,4 +54,20 @@ SET autocommit=true;
SET autocommit=FALSE;
SET autocommit=Off;
LOAD DATA LOCAL INFILE '/tmp/data.csv' INTO TABLE test.t1;
LOAD DATA LOCAL INFILE '/tmp/data.csv' INTO TABLE test.t1;
START TRANSACTION;
START TRANSACTION READ ONLY;
START TRANSACTION READ WRITE;
START TRANSACTION READ ONLY, WITH CONSISTENT SNAPSHOT;
START TRANSACTION READ WRITE, WITH CONSISTENT SNAPSHOT;
START TRANSACTION WITH CONSISTENT SNAPSHOT, READ ONLY;
START TRANSACTION WITH CONSISTENT SNAPSHOT, READ WRITE;
BEGIN;
BEGIN WORK;
COMMIT;
COMMIT WORK;
ROLLBACK;
ROLLBACK WORK;