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:
VilhoRaatikka
2014-03-26 19:10:35 +02:00
parent df02926321
commit f49df89a0c
5 changed files with 86 additions and 28 deletions

View File

@ -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;
}

View File

@ -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"

View File

@ -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

View File

@ -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;

View File

@ -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;