Changed how query classifier determines which statements trigger implicit commit.
Changed test makefile and rwsplit.sh script and added two example sql scripts.
This commit is contained in:
@ -73,6 +73,9 @@ static bool create_parse_tree(
|
|||||||
|
|
||||||
static skygw_query_type_t resolve_query_type(
|
static skygw_query_type_t resolve_query_type(
|
||||||
THD* thd);
|
THD* thd);
|
||||||
|
static bool skygw_stmt_causes_implicit_commit(
|
||||||
|
LEX* lex,
|
||||||
|
uint mask);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @node (write brief function description here)
|
* @node (write brief function description here)
|
||||||
@ -421,7 +424,8 @@ static skygw_query_type_t resolve_query_type(
|
|||||||
* PRELOAD_KEYS, FLUSH, RESET, CREATE|ALTER|DROP SERVER
|
* PRELOAD_KEYS, FLUSH, RESET, CREATE|ALTER|DROP SERVER
|
||||||
* SET autocommit, various other SET commands.
|
* SET autocommit, various other SET commands.
|
||||||
*/
|
*/
|
||||||
if (sql_command_flags[lex->sql_command] & CF_AUTO_COMMIT_TRANS) {
|
if (skygw_stmt_causes_implicit_commit(lex, CF_AUTO_COMMIT_TRANS))
|
||||||
|
{
|
||||||
if (LOG_IS_ENABLED(LOGFILE_TRACE))
|
if (LOG_IS_ENABLED(LOGFILE_TRACE))
|
||||||
{
|
{
|
||||||
if (sql_command_flags[lex->sql_command] &
|
if (sql_command_flags[lex->sql_command] &
|
||||||
@ -642,3 +646,33 @@ return_qtype:
|
|||||||
qtype = (skygw_query_type_t)type;
|
qtype = (skygw_query_type_t)type;
|
||||||
return qtype;
|
return qtype;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool skygw_stmt_causes_implicit_commit(LEX* lex, uint mask)
|
||||||
|
{
|
||||||
|
bool succp;
|
||||||
|
|
||||||
|
if (!(sql_command_flags[lex->sql_command] & mask))
|
||||||
|
{
|
||||||
|
succp = false;
|
||||||
|
goto return_succp;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (lex->sql_command) {
|
||||||
|
case SQLCOM_DROP_TABLE:
|
||||||
|
succp = !(lex->drop_temporary);
|
||||||
|
break;
|
||||||
|
case SQLCOM_ALTER_TABLE:
|
||||||
|
case SQLCOM_CREATE_TABLE:
|
||||||
|
/* If CREATE TABLE of non-temporary table, do implicit commit */
|
||||||
|
succp = !(lex->create_info.options & HA_LEX_CREATE_TMP_TABLE);
|
||||||
|
break;
|
||||||
|
case SQLCOM_SET_OPTION:
|
||||||
|
succp = lex->autocommit ? true : false;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return_succp:
|
||||||
|
return succp;
|
||||||
|
}
|
||||||
|
@ -14,12 +14,14 @@ cleantests:
|
|||||||
- $(DEL) *.o
|
- $(DEL) *.o
|
||||||
- $(DEL) *~
|
- $(DEL) *~
|
||||||
|
|
||||||
testall:
|
|
||||||
$(MAKE) cleantests
|
|
||||||
$(MAKE) DEBUG=Y buildtests
|
|
||||||
$(MAKE) runtests
|
|
||||||
|
|
||||||
buildtests :
|
testall:
|
||||||
|
-$(MAKE) cleantests
|
||||||
|
-$(MAKE) DEBUG=Y buildtests
|
||||||
|
-$(MAKE) runtests
|
||||||
|
|
||||||
|
buildtests:
|
||||||
|
|
||||||
|
|
||||||
runtests:
|
runtests:
|
||||||
@echo "" >> $(TESTLOG)
|
@echo "" >> $(TESTLOG)
|
||||||
@ -27,13 +29,14 @@ runtests:
|
|||||||
@echo $(shell date) >> $(TESTLOG)
|
@echo $(shell date) >> $(TESTLOG)
|
||||||
@echo "Test MaxScale R/W Split" >> $(TESTLOG)
|
@echo "Test MaxScale R/W Split" >> $(TESTLOG)
|
||||||
@echo "-------------------------------" >> $(TESTLOG)
|
@echo "-------------------------------" >> $(TESTLOG)
|
||||||
|
./rwsplit.sh $(TESTLOG) test_transaction_routing1.sql 127.0.0.1 4006 maxuser maxpwd
|
||||||
ifeq ($(shell ./rwsplit.sh $(TESTLOG) 127.0.0.1 4006 maxuser maxpwd ; echo $$?), 0)
|
./rwsplit.sh $(TESTLOG) test_transaction_routing2.sql 127.0.0.1 4006 maxuser maxpwd
|
||||||
@echo "MaxScale core PASSED" >> $(TESTLOG)
|
./rwsplit.sh $(TESTLOG) test_transaction_routing3.sql 127.0.0.1 4006 maxuser maxpwd
|
||||||
else
|
|
||||||
@echo "MaxScale core FAILED" >> $(TESTLOG) ; exit 1
|
|
||||||
endif
|
|
||||||
@echo "" >> $(TESTLOG)
|
@echo "" >> $(TESTLOG)
|
||||||
|
|
||||||
|
|
||||||
pesce:
|
pesce:
|
||||||
@echo "fine"
|
@echo "fine"
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,14 +1,30 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
NARGS=6
|
||||||
TLOG=$1
|
TLOG=$1
|
||||||
THOST=$2
|
TINPUT=$2
|
||||||
TPORT=$3
|
THOST=$3
|
||||||
TUSER=$4
|
TPORT=$4
|
||||||
TPWD=$5
|
TUSER=$5
|
||||||
|
TPWD=$6
|
||||||
|
|
||||||
|
if [ $# != $NARGS ] ;
|
||||||
|
then
|
||||||
|
echo""
|
||||||
|
echo "Wrong number of arguments, gave "$#" but "$NARGS" is required"
|
||||||
|
echo ""
|
||||||
|
echo "Usage :"
|
||||||
|
echo " rwsplit.sh <log filename> <test input> <host> <port> <user> <password>"
|
||||||
|
echo ""
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
RUNCMD=mysql\ --host=$THOST\ -P$TPORT\ -u$TUSER\ -p$TPWD\ --unbuffered=true\ --disable-reconnect\ --silent
|
RUNCMD=mysql\ --host=$THOST\ -P$TPORT\ -u$TUSER\ -p$TPWD\ --unbuffered=true\ --disable-reconnect\ --silent
|
||||||
|
|
||||||
INPUT=test_transaction_routing1.sql
|
a=`$RUNCMD < ./$TINPUT`
|
||||||
|
if [ "$a" != "2" ]; then
|
||||||
a=`$RUNCMD < ./$INPUT`
|
echo "$TINPUT FAILED">>$TLOG;
|
||||||
if [ "$a" != "2" ]; then echo "$INPUT FAILED">>$TLOG; exit 1 ;
|
else
|
||||||
else echo "$INPUT PASSED">>$TLOG ; fi
|
echo "$TINPUT PASSED">>$TLOG ;
|
||||||
|
fi
|
||||||
|
|
||||||
|
@ -6,16 +6,14 @@ START TRANSACTION;
|
|||||||
CREATE TABLE IF NOT EXISTS myCity (a int, b char(20));
|
CREATE TABLE IF NOT EXISTS myCity (a int, b char(20));
|
||||||
INSERT INTO myCity VALUES (1, 'Milan');
|
INSERT INTO myCity VALUES (1, 'Milan');
|
||||||
INSERT INTO myCity VALUES (2, 'London');
|
INSERT INTO myCity VALUES (2, 'London');
|
||||||
COMMIT;
|
COMMIT;
|
||||||
-- Now there are two values
|
|
||||||
START TRANSACTION;
|
START TRANSACTION;
|
||||||
DELETE FROM myCity;
|
DELETE FROM myCity;
|
||||||
-- Now there are zero values
|
SET @a = (SELECT COUNT(1) FROM myCity);
|
||||||
SET @a = (SELECT COUNT(1) FROM myCity); -- implicit COMMIT for DELETE operation
|
ROLLBACK;
|
||||||
ROLLBACK; -- nothing to roll back
|
|
||||||
START TRANSACTION;
|
START TRANSACTION;
|
||||||
SET @b = (SELECT COUNT(*) FROM myCity); -- implicit COMMIT for empty trx
|
SET @b = (SELECT COUNT(*) FROM myCity);
|
||||||
START TRANSACTION;
|
START TRANSACTION;
|
||||||
DROP TABLE myCity;
|
DROP TABLE myCity;
|
||||||
SELECT (@a+@b) AS res; -- counts 0+0 ans sets the result to 'res'
|
SELECT (@a+@b) AS res;
|
||||||
COMMIT;
|
COMMIT;
|
||||||
|
@ -0,0 +1,7 @@
|
|||||||
|
SET autocommit = 1;
|
||||||
|
SELECT @@server_id INTO @a;
|
||||||
|
START TRANSACTION;
|
||||||
|
SELECT @@server_id INTO @b;
|
||||||
|
COMMIT;
|
||||||
|
SELECT (@a-@b) INTO @c;
|
||||||
|
SELECT @a, @b, @c;
|
Reference in New Issue
Block a user