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:
@ -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;
|
||||
|
||||
|
@ -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 */
|
||||
|
@ -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 ////////////////////////////////////
|
||||
|
@ -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;
|
||||
|
||||
|
Reference in New Issue
Block a user