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:
parent
df02926321
commit
f49df89a0c
@ -73,6 +73,9 @@ static bool create_parse_tree(
|
||||
|
||||
static skygw_query_type_t resolve_query_type(
|
||||
THD* thd);
|
||||
static bool skygw_stmt_causes_implicit_commit(
|
||||
LEX* lex,
|
||||
uint mask);
|
||||
|
||||
/**
|
||||
* @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
|
||||
* 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 (sql_command_flags[lex->sql_command] &
|
||||
@ -642,3 +646,33 @@ return_qtype:
|
||||
qtype = (skygw_query_type_t)type;
|
||||
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) *~
|
||||
|
||||
testall:
|
||||
$(MAKE) cleantests
|
||||
$(MAKE) DEBUG=Y buildtests
|
||||
$(MAKE) runtests
|
||||
|
||||
buildtests :
|
||||
testall:
|
||||
-$(MAKE) cleantests
|
||||
-$(MAKE) DEBUG=Y buildtests
|
||||
-$(MAKE) runtests
|
||||
|
||||
buildtests:
|
||||
|
||||
|
||||
runtests:
|
||||
@echo "" >> $(TESTLOG)
|
||||
@ -27,13 +29,14 @@ runtests:
|
||||
@echo $(shell date) >> $(TESTLOG)
|
||||
@echo "Test MaxScale R/W Split" >> $(TESTLOG)
|
||||
@echo "-------------------------------" >> $(TESTLOG)
|
||||
|
||||
ifeq ($(shell ./rwsplit.sh $(TESTLOG) 127.0.0.1 4006 maxuser maxpwd ; echo $$?), 0)
|
||||
@echo "MaxScale core PASSED" >> $(TESTLOG)
|
||||
else
|
||||
@echo "MaxScale core FAILED" >> $(TESTLOG) ; exit 1
|
||||
endif
|
||||
./rwsplit.sh $(TESTLOG) test_transaction_routing1.sql 127.0.0.1 4006 maxuser maxpwd
|
||||
./rwsplit.sh $(TESTLOG) test_transaction_routing2.sql 127.0.0.1 4006 maxuser maxpwd
|
||||
./rwsplit.sh $(TESTLOG) test_transaction_routing3.sql 127.0.0.1 4006 maxuser maxpwd
|
||||
@echo "" >> $(TESTLOG)
|
||||
|
||||
|
||||
pesce:
|
||||
@echo "fine"
|
||||
|
||||
|
||||
|
@ -1,14 +1,30 @@
|
||||
#!/bin/sh
|
||||
NARGS=6
|
||||
TLOG=$1
|
||||
THOST=$2
|
||||
TPORT=$3
|
||||
TUSER=$4
|
||||
TPWD=$5
|
||||
TINPUT=$2
|
||||
THOST=$3
|
||||
TPORT=$4
|
||||
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
|
||||
|
||||
INPUT=test_transaction_routing1.sql
|
||||
|
||||
a=`$RUNCMD < ./$INPUT`
|
||||
if [ "$a" != "2" ]; then echo "$INPUT FAILED">>$TLOG; exit 1 ;
|
||||
else echo "$INPUT PASSED">>$TLOG ; fi
|
||||
a=`$RUNCMD < ./$TINPUT`
|
||||
if [ "$a" != "2" ]; then
|
||||
echo "$TINPUT FAILED">>$TLOG;
|
||||
else
|
||||
echo "$TINPUT PASSED">>$TLOG ;
|
||||
fi
|
||||
|
||||
|
@ -6,16 +6,14 @@ START TRANSACTION;
|
||||
CREATE TABLE IF NOT EXISTS myCity (a int, b char(20));
|
||||
INSERT INTO myCity VALUES (1, 'Milan');
|
||||
INSERT INTO myCity VALUES (2, 'London');
|
||||
COMMIT;
|
||||
-- Now there are two values
|
||||
COMMIT;
|
||||
START TRANSACTION;
|
||||
DELETE FROM myCity;
|
||||
-- Now there are zero values
|
||||
SET @a = (SELECT COUNT(1) FROM myCity); -- implicit COMMIT for DELETE operation
|
||||
ROLLBACK; -- nothing to roll back
|
||||
SET @a = (SELECT COUNT(1) FROM myCity);
|
||||
ROLLBACK;
|
||||
START TRANSACTION;
|
||||
SET @b = (SELECT COUNT(*) FROM myCity); -- implicit COMMIT for empty trx
|
||||
SET @b = (SELECT COUNT(*) FROM myCity);
|
||||
START TRANSACTION;
|
||||
DROP TABLE myCity;
|
||||
SELECT (@a+@b) AS res; -- counts 0+0 ans sets the result to 'res'
|
||||
SELECT (@a+@b) AS res;
|
||||
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;
|
Loading…
x
Reference in New Issue
Block a user