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:
|
case SQLCOM_BEGIN:
|
||||||
type |= QUERY_TYPE_BEGIN_TRX;
|
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;
|
goto return_qtype;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -968,7 +968,7 @@ void mxs_sqlite3BeginTransaction(Parse* pParse, int type)
|
|||||||
ss_dassert(info);
|
ss_dassert(info);
|
||||||
|
|
||||||
info->status = QC_QUERY_PARSED;
|
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 */
|
void mxs_sqlite3BeginTrigger(Parse *pParse, /* The parse context of the CREATE TRIGGER statement */
|
||||||
|
@ -59,6 +59,13 @@
|
|||||||
%include {
|
%include {
|
||||||
#include "sqliteInt.h"
|
#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:
|
// MaxScale naming convention:
|
||||||
//
|
//
|
||||||
// - A function that "overloads" a sqlite3 function has the same name
|
// - A function that "overloads" a sqlite3 function has the same name
|
||||||
@ -294,11 +301,13 @@ cmdx ::= cmd. { sqlite3FinishCoding(pParse); }
|
|||||||
//
|
//
|
||||||
|
|
||||||
%ifdef MAXSCALE
|
%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
|
%endif
|
||||||
%ifndef MAXSCALE
|
%ifndef MAXSCALE
|
||||||
cmd ::= BEGIN transtype(Y) trans_opt. {sqlite3BeginTransaction(pParse, Y);}
|
cmd ::= BEGIN transtype(Y) trans_opt. {sqlite3BeginTransaction(pParse, Y);}
|
||||||
%endif
|
|
||||||
trans_opt ::= .
|
trans_opt ::= .
|
||||||
trans_opt ::= TRANSACTION.
|
trans_opt ::= TRANSACTION.
|
||||||
trans_opt ::= TRANSACTION nm.
|
trans_opt ::= TRANSACTION nm.
|
||||||
@ -307,10 +316,11 @@ transtype(A) ::= . {A = TK_DEFERRED;}
|
|||||||
transtype(A) ::= DEFERRED(X). {A = @X;}
|
transtype(A) ::= DEFERRED(X). {A = @X;}
|
||||||
transtype(A) ::= IMMEDIATE(X). {A = @X;}
|
transtype(A) ::= IMMEDIATE(X). {A = @X;}
|
||||||
transtype(A) ::= EXCLUSIVE(X). {A = @X;}
|
transtype(A) ::= EXCLUSIVE(X). {A = @X;}
|
||||||
|
%endif
|
||||||
%ifdef MAXSCALE
|
%ifdef MAXSCALE
|
||||||
cmd ::= COMMIT trans_opt. {mxs_sqlite3CommitTransaction(pParse);}
|
cmd ::= COMMIT id_opt. {mxs_sqlite3CommitTransaction(pParse);}
|
||||||
cmd ::= END trans_opt. {mxs_sqlite3CommitTransaction(pParse);}
|
cmd ::= END id_opt. {mxs_sqlite3CommitTransaction(pParse);}
|
||||||
cmd ::= ROLLBACK trans_opt. {mxs_sqlite3RollbackTransaction(pParse);}
|
cmd ::= ROLLBACK id_opt. {mxs_sqlite3RollbackTransaction(pParse);}
|
||||||
%endif
|
%endif
|
||||||
%ifndef MAXSCALE
|
%ifndef MAXSCALE
|
||||||
cmd ::= COMMIT trans_opt. {sqlite3CommitTransaction(pParse);}
|
cmd ::= COMMIT trans_opt. {sqlite3CommitTransaction(pParse);}
|
||||||
@ -318,6 +328,7 @@ cmd ::= END trans_opt. {sqlite3CommitTransaction(pParse);}
|
|||||||
cmd ::= ROLLBACK trans_opt. {sqlite3RollbackTransaction(pParse);}
|
cmd ::= ROLLBACK trans_opt. {sqlite3RollbackTransaction(pParse);}
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
|
%ifndef MAXSCALE
|
||||||
savepoint_opt ::= SAVEPOINT.
|
savepoint_opt ::= SAVEPOINT.
|
||||||
savepoint_opt ::= .
|
savepoint_opt ::= .
|
||||||
cmd ::= SAVEPOINT nm(X). {
|
cmd ::= SAVEPOINT nm(X). {
|
||||||
@ -329,6 +340,7 @@ cmd ::= RELEASE savepoint_opt nm(X). {
|
|||||||
cmd ::= ROLLBACK trans_opt TO savepoint_opt nm(X). {
|
cmd ::= ROLLBACK trans_opt TO savepoint_opt nm(X). {
|
||||||
sqlite3Savepoint(pParse, SAVEPOINT_ROLLBACK, &X);
|
sqlite3Savepoint(pParse, SAVEPOINT_ROLLBACK, &X);
|
||||||
}
|
}
|
||||||
|
%endif
|
||||||
|
|
||||||
///////////////////// The CREATE TABLE statement ////////////////////////////
|
///////////////////// The CREATE TABLE statement ////////////////////////////
|
||||||
//
|
//
|
||||||
@ -3144,8 +3156,39 @@ show(A) ::= SHOW WARNINGS show_warnings_options. {
|
|||||||
//////////////////////// The START TRANSACTION statement ////////////////////////////////////
|
//////////////////////// The START TRANSACTION statement ////////////////////////////////////
|
||||||
//
|
//
|
||||||
|
|
||||||
cmd ::= START TRANSACTION. {
|
%type start_transaction_characteristic {int}
|
||||||
mxs_sqlite3BeginTransaction(pParse, 0);
|
|
||||||
|
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 ////////////////////////////////////
|
//////////////////////// The TRUNCATE statement ////////////////////////////////////
|
||||||
|
@ -54,4 +54,20 @@ SET autocommit=true;
|
|||||||
SET autocommit=FALSE;
|
SET autocommit=FALSE;
|
||||||
SET autocommit=Off;
|
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