diff --git a/include/mariadb_com.h b/include/mariadb_com.h index 7e722a0b..1caee6b2 100644 --- a/include/mariadb_com.h +++ b/include/mariadb_com.h @@ -310,12 +310,12 @@ enum enum_session_state_type /* currently not supported by MariaDB Server */ SESSION_TRACK_GTIDS, SESSION_TRACK_TRANSACTION_CHARACTERISTICS, - SESSION_TRACK_TRANSACTION_TYPE /* make sure that SESSION_TRACK_END always points + SESSION_TRACK_TRANSACTION_STATE /* make sure that SESSION_TRACK_END always points to last element of enum !! */ }; #define SESSION_TRACK_BEGIN 0 -#define SESSION_TRACK_END SESSION_TRACK_TRANSACTION_TYPE +#define SESSION_TRACK_END SESSION_TRACK_TRANSACTION_STATE #define SESSION_TRACK_TYPES (SESSION_TRACK_END + 1) enum enum_field_types { MYSQL_TYPE_DECIMAL, MYSQL_TYPE_TINY, diff --git a/libmariadb/mariadb_lib.c b/libmariadb/mariadb_lib.c index 99e17e0b..1bbf29ea 100644 --- a/libmariadb/mariadb_lib.c +++ b/libmariadb/mariadb_lib.c @@ -2192,11 +2192,13 @@ int ma_read_ok_packet(MYSQL *mysql, uchar *pos, ulong length) size_t plen; char *data; si_type= (enum enum_session_state_type)net_field_length(&pos); + switch(si_type) { case SESSION_TRACK_SCHEMA: case SESSION_TRACK_STATE_CHANGE: case SESSION_TRACK_TRANSACTION_CHARACTERISTICS: case SESSION_TRACK_SYSTEM_VARIABLES: + case SESSION_TRACK_TRANSACTION_STATE: if (si_type != SESSION_TRACK_STATE_CHANGE) net_field_length(&pos); /* ignore total length, item length will follow next */ plen= net_field_length(&pos); diff --git a/unittest/libmariadb/connection.c b/unittest/libmariadb/connection.c index 11632e69..c4fb1880 100644 --- a/unittest/libmariadb/connection.c +++ b/unittest/libmariadb/connection.c @@ -932,8 +932,6 @@ static int test_sess_track_db(MYSQL *mysql) const char *data; size_t len; - diag("session tracking not fully supported yet in 10.2"); - return SKIP; if (!(mysql->server_capabilities & CLIENT_SESSION_TRACKING)) { @@ -993,6 +991,38 @@ static int test_sess_track_db(MYSQL *mysql) return OK; } +static int test_conc496(MYSQL *mysql) +{ + int rc; + const char *data; + size_t len; + + rc= mysql_query(mysql, "set @@session.session_track_transaction_info=STATE"); + check_mysql_rc(rc, mysql); + + rc= mysql_query(mysql, "BEGIN"); + check_mysql_rc(rc, mysql); + if (!mysql_session_track_get_first(mysql, SESSION_TRACK_TRANSACTION_STATE, &data, &len)) + do { + FAIL_IF(len != 8, "expected 8 bytes"); + FAIL_IF(data[0] != 'T', "expected transaction"); + } while (!mysql_session_track_get_next(mysql, SESSION_TRACK_TRANSACTION_STATE, &data, &len)); + + rc= mysql_query(mysql, "CREATE TEMPORARY TABLE t1(a int) ENGINE=InnoDB"); + check_mysql_rc(rc, mysql); + rc= mysql_query(mysql, "COMMIT"); + + check_mysql_rc(rc, mysql); + + if (!mysql_session_track_get_first(mysql, SESSION_TRACK_TRANSACTION_STATE, &data, &len)) + do { + FAIL_IF(len != 8, "expected 8 bytes"); + FAIL_IF(data[0] != '_', "expected underscore"); + } while (!mysql_session_track_get_next(mysql, SESSION_TRACK_TRANSACTION_STATE, &data, &len)); + + return OK; +} + static int test_unix_socket_close(MYSQL *unused __attribute__((unused))) { @@ -1784,6 +1814,7 @@ static int test_default_auth(MYSQL *my __attribute__((unused))) } struct my_tests_st my_tests[] = { + {"test_conc496", test_conc496, TEST_CONNECTION_DEFAULT, 0, NULL, NULL}, {"test_default_auth", test_default_auth, TEST_CONNECTION_NONE, 0, NULL, NULL}, {"test_conc443", test_conc443, TEST_CONNECTION_NONE, 0, NULL, NULL}, {"test_conc366", test_conc366, TEST_CONNECTION_DEFAULT, 0, NULL, NULL},