diff options
author | Kentoku <kentokushiba@gmail.com> | 2019-02-22 13:11:08 +0900 |
---|---|---|
committer | Kentoku <kentokushiba@gmail.com> | 2019-02-26 07:03:25 +0900 |
commit | 4d37898f2d1d330e28756d5a9f4e75acbb0db508 (patch) | |
tree | 6c3b9925b218968ce3a6b9fef0de0d6e155c9ee4 | |
parent | c511453f2ff22addde52e4fda3795755f52a5a77 (diff) | |
download | mariadb-git-4d37898f2d1d330e28756d5a9f4e75acbb0db508.tar.gz |
MDEV-16967 Spider CREATE TABLE Pushdown
For preparing pushdown, please see mysql-test/spider/feature/include/rewrite_*_init.inc
84 files changed, 9943 insertions, 969 deletions
diff --git a/storage/spider/CMakeLists.txt b/storage/spider/CMakeLists.txt index 62dfc968579..7c0cbdd2b38 100644 --- a/storage/spider/CMakeLists.txt +++ b/storage/spider/CMakeLists.txt @@ -18,7 +18,7 @@ SET(SPIDER_SOURCES spd_table.cc spd_direct_sql.cc spd_udf.cc spd_ping_table.cc spd_copy_tables.cc spd_i_s.cc spd_malloc.cc ha_spider.cc spd_udf.def spd_db_mysql.cc spd_db_handlersocket.cc spd_db_oracle.cc - spd_group_by_handler.cc spd_db_include.cc + spd_group_by_handler.cc spd_db_include.cc spd_parse.cc spd_rewrite.cc hs_client/config.cpp hs_client/escape.cpp hs_client/fatal.cpp hs_client/hstcpcli.cpp hs_client/socket.cpp hs_client/string_util.cpp ) diff --git a/storage/spider/ha_spider.cc b/storage/spider/ha_spider.cc index a5fc3345ea3..d10dcd98660 100644 --- a/storage/spider/ha_spider.cc +++ b/storage/spider/ha_spider.cc @@ -9400,6 +9400,9 @@ ulonglong ha_spider::table_flags() const #ifdef HA_SLOW_CMP_REF HA_SLOW_CMP_REF | #endif +#ifdef HA_CMP_REF_IS_EXPENSIVE + HA_CMP_REF_IS_EXPENSIVE | +#endif #ifdef SPIDER_ENGINE_CONDITION_PUSHDOWN_IS_ALWAYS_ON HA_CAN_TABLE_CONDITION_PUSHDOWN | #endif diff --git a/storage/spider/mysql-test/spider/bugfix/include/quick_mode_0_deinit.inc b/storage/spider/mysql-test/spider/bugfix/include/quick_mode_0_deinit.inc index 42124a794ea..b3cab9f05c6 100644 --- a/storage/spider/mysql-test/spider/bugfix/include/quick_mode_0_deinit.inc +++ b/storage/spider/mysql-test/spider/bugfix/include/quick_mode_0_deinit.inc @@ -1,19 +1 @@ ---let $MASTER_1_COMMENT_2_1= $MASTER_1_COMMENT_2_1_BACKUP ---let $MASTER_1_COMMENT_2_2= $MASTER_1_COMMENT_2_2_BACKUP ---let $CHILD2_1_DROP_TABLES= $CHILD2_1_DROP_TABLES_BACKUP ---let $CHILD2_1_CREATE_TABLES= $CHILD2_1_CREATE_TABLES_BACKUP ---let $CHILD2_1_SELECT_TABLES= $CHILD2_1_SELECT_TABLES_BACKUP ---let $CHILD2_2_DROP_TABLES= $CHILD2_2_DROP_TABLES_BACKUP ---let $CHILD2_2_CREATE_TABLES= $CHILD2_2_CREATE_TABLES_BACKUP ---let $CHILD2_2_SELECT_TABLES= $CHILD2_2_SELECT_TABLES_BACKUP ---connection master_1 -set session spider_quick_mode= @old_spider_quick_mode; -set session spider_quick_page_size= @old_spider_quick_page_size; -set session spider_quick_page_byte= @old_spider_quick_page_byte; ---disable_warnings ---disable_query_log ---disable_result_log ---source ../t/test_deinit.inc ---enable_result_log ---enable_query_log ---enable_warnings +--source quick_mode_deinit.inc diff --git a/storage/spider/mysql-test/spider/bugfix/include/quick_mode_0_init.inc b/storage/spider/mysql-test/spider/bugfix/include/quick_mode_0_init.inc index 2656517216c..3395fa98152 100644 --- a/storage/spider/mysql-test/spider/bugfix/include/quick_mode_0_init.inc +++ b/storage/spider/mysql-test/spider/bugfix/include/quick_mode_0_init.inc @@ -1,51 +1,2 @@ ---disable_warnings ---disable_query_log ---disable_result_log ---source ../t/test_init.inc ---enable_result_log ---enable_query_log ---enable_warnings ---let $MASTER_1_COMMENT_2_1_BACKUP= $MASTER_1_COMMENT_2_1 -let $MASTER_1_COMMENT_2_1= - COMMENT='table "tbl_a", srv "s_2_1"'; ---let $MASTER_1_COMMENT_2_2_BACKUP= $MASTER_1_COMMENT_2_2 -let $MASTER_1_COMMENT_2_2= - COMMENT='table "tbl_b", srv "s_2_2"'; ---let $CHILD2_1_DROP_TABLES_BACKUP= $CHILD2_1_DROP_TABLES -let $CHILD2_1_DROP_TABLES= - DROP TABLE IF EXISTS tbl_a; ---let $CHILD2_1_CREATE_TABLES_BACKUP= $CHILD2_1_CREATE_TABLES -let $CHILD2_1_CREATE_TABLES= - CREATE TABLE tbl_a ( - pkey int NOT NULL, - PRIMARY KEY (pkey) - ) $CHILD2_1_ENGINE $CHILD2_1_CHARSET; ---let $CHILD2_1_SELECT_TABLES_BACKUP= $CHILD2_1_SELECT_TABLES -let $CHILD2_1_SELECT_TABLES= - SELECT pkey FROM tbl_a ORDER BY pkey; -let $CHILD2_1_SELECT_ARGUMENT1= - SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'; ---let $CHILD2_2_DROP_TABLES_BACKUP= $CHILD2_2_DROP_TABLES -let $CHILD2_2_DROP_TABLES= - DROP TABLE IF EXISTS tbl_b; ---let $CHILD2_2_CREATE_TABLES_BACKUP= $CHILD2_2_CREATE_TABLES -let $CHILD2_2_CREATE_TABLES= - CREATE TABLE tbl_b ( - pkey int NOT NULL, - PRIMARY KEY (pkey) - ) $CHILD2_2_ENGINE $CHILD2_2_CHARSET; ---let $CHILD2_2_SELECT_TABLES_BACKUP= $CHILD2_2_SELECT_TABLES -let $CHILD2_2_SELECT_TABLES= - SELECT pkey FROM tbl_b ORDER BY pkey; -let $CHILD2_2_SELECT_ARGUMENT1= - SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'; ---connection master_1 -set @old_spider_quick_mode= @@spider_quick_mode; +--source quick_mode_init.inc set session spider_quick_mode= 0; -set @old_spider_quick_page_size= @@spider_quick_page_size; -set session spider_quick_page_size= 3; -set @old_spider_quick_page_byte= @@spider_quick_page_byte; -let $MASTER_1_SET_QUICK_PAGE_BYTE_6= - set session spider_quick_page_byte= 6; -let $MASTER_1_SET_QUICK_PAGE_BYTE_0= - set session spider_quick_page_byte= 0; diff --git a/storage/spider/mysql-test/spider/bugfix/include/quick_mode_1_deinit.inc b/storage/spider/mysql-test/spider/bugfix/include/quick_mode_1_deinit.inc index 42124a794ea..b3cab9f05c6 100644 --- a/storage/spider/mysql-test/spider/bugfix/include/quick_mode_1_deinit.inc +++ b/storage/spider/mysql-test/spider/bugfix/include/quick_mode_1_deinit.inc @@ -1,19 +1 @@ ---let $MASTER_1_COMMENT_2_1= $MASTER_1_COMMENT_2_1_BACKUP ---let $MASTER_1_COMMENT_2_2= $MASTER_1_COMMENT_2_2_BACKUP ---let $CHILD2_1_DROP_TABLES= $CHILD2_1_DROP_TABLES_BACKUP ---let $CHILD2_1_CREATE_TABLES= $CHILD2_1_CREATE_TABLES_BACKUP ---let $CHILD2_1_SELECT_TABLES= $CHILD2_1_SELECT_TABLES_BACKUP ---let $CHILD2_2_DROP_TABLES= $CHILD2_2_DROP_TABLES_BACKUP ---let $CHILD2_2_CREATE_TABLES= $CHILD2_2_CREATE_TABLES_BACKUP ---let $CHILD2_2_SELECT_TABLES= $CHILD2_2_SELECT_TABLES_BACKUP ---connection master_1 -set session spider_quick_mode= @old_spider_quick_mode; -set session spider_quick_page_size= @old_spider_quick_page_size; -set session spider_quick_page_byte= @old_spider_quick_page_byte; ---disable_warnings ---disable_query_log ---disable_result_log ---source ../t/test_deinit.inc ---enable_result_log ---enable_query_log ---enable_warnings +--source quick_mode_deinit.inc diff --git a/storage/spider/mysql-test/spider/bugfix/include/quick_mode_1_init.inc b/storage/spider/mysql-test/spider/bugfix/include/quick_mode_1_init.inc index 9a8de407569..9fb44470c50 100644 --- a/storage/spider/mysql-test/spider/bugfix/include/quick_mode_1_init.inc +++ b/storage/spider/mysql-test/spider/bugfix/include/quick_mode_1_init.inc @@ -1,51 +1,2 @@ ---disable_warnings ---disable_query_log ---disable_result_log ---source ../t/test_init.inc ---enable_result_log ---enable_query_log ---enable_warnings ---let $MASTER_1_COMMENT_2_1_BACKUP= $MASTER_1_COMMENT_2_1 -let $MASTER_1_COMMENT_2_1= - COMMENT='table "tbl_a", srv "s_2_1"'; ---let $MASTER_1_COMMENT_2_2_BACKUP= $MASTER_1_COMMENT_2_2 -let $MASTER_1_COMMENT_2_2= - COMMENT='table "tbl_b", srv "s_2_2"'; ---let $CHILD2_1_DROP_TABLES_BACKUP= $CHILD2_1_DROP_TABLES -let $CHILD2_1_DROP_TABLES= - DROP TABLE IF EXISTS tbl_a; ---let $CHILD2_1_CREATE_TABLES_BACKUP= $CHILD2_1_CREATE_TABLES -let $CHILD2_1_CREATE_TABLES= - CREATE TABLE tbl_a ( - pkey int NOT NULL, - PRIMARY KEY (pkey) - ) $CHILD2_1_ENGINE $CHILD2_1_CHARSET; ---let $CHILD2_1_SELECT_TABLES_BACKUP= $CHILD2_1_SELECT_TABLES -let $CHILD2_1_SELECT_TABLES= - SELECT pkey FROM tbl_a ORDER BY pkey; -let $CHILD2_1_SELECT_ARGUMENT1= - SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'; ---let $CHILD2_2_DROP_TABLES_BACKUP= $CHILD2_2_DROP_TABLES -let $CHILD2_2_DROP_TABLES= - DROP TABLE IF EXISTS tbl_b; ---let $CHILD2_2_CREATE_TABLES_BACKUP= $CHILD2_2_CREATE_TABLES -let $CHILD2_2_CREATE_TABLES= - CREATE TABLE tbl_b ( - pkey int NOT NULL, - PRIMARY KEY (pkey) - ) $CHILD2_2_ENGINE $CHILD2_2_CHARSET; ---let $CHILD2_2_SELECT_TABLES_BACKUP= $CHILD2_2_SELECT_TABLES -let $CHILD2_2_SELECT_TABLES= - SELECT pkey FROM tbl_b ORDER BY pkey; -let $CHILD2_2_SELECT_ARGUMENT1= - SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'; ---connection master_1 -set @old_spider_quick_mode= @@spider_quick_mode; +--source quick_mode_init.inc set session spider_quick_mode= 1; -set @old_spider_quick_page_size= @@spider_quick_page_size; -set session spider_quick_page_size= 3; -set @old_spider_quick_page_byte= @@spider_quick_page_byte; -let $MASTER_1_SET_QUICK_PAGE_BYTE_6= - set session spider_quick_page_byte= 6; -let $MASTER_1_SET_QUICK_PAGE_BYTE_0= - set session spider_quick_page_byte= 0; diff --git a/storage/spider/mysql-test/spider/bugfix/include/quick_mode_2_deinit.inc b/storage/spider/mysql-test/spider/bugfix/include/quick_mode_2_deinit.inc index 42124a794ea..b3cab9f05c6 100644 --- a/storage/spider/mysql-test/spider/bugfix/include/quick_mode_2_deinit.inc +++ b/storage/spider/mysql-test/spider/bugfix/include/quick_mode_2_deinit.inc @@ -1,19 +1 @@ ---let $MASTER_1_COMMENT_2_1= $MASTER_1_COMMENT_2_1_BACKUP ---let $MASTER_1_COMMENT_2_2= $MASTER_1_COMMENT_2_2_BACKUP ---let $CHILD2_1_DROP_TABLES= $CHILD2_1_DROP_TABLES_BACKUP ---let $CHILD2_1_CREATE_TABLES= $CHILD2_1_CREATE_TABLES_BACKUP ---let $CHILD2_1_SELECT_TABLES= $CHILD2_1_SELECT_TABLES_BACKUP ---let $CHILD2_2_DROP_TABLES= $CHILD2_2_DROP_TABLES_BACKUP ---let $CHILD2_2_CREATE_TABLES= $CHILD2_2_CREATE_TABLES_BACKUP ---let $CHILD2_2_SELECT_TABLES= $CHILD2_2_SELECT_TABLES_BACKUP ---connection master_1 -set session spider_quick_mode= @old_spider_quick_mode; -set session spider_quick_page_size= @old_spider_quick_page_size; -set session spider_quick_page_byte= @old_spider_quick_page_byte; ---disable_warnings ---disable_query_log ---disable_result_log ---source ../t/test_deinit.inc ---enable_result_log ---enable_query_log ---enable_warnings +--source quick_mode_deinit.inc diff --git a/storage/spider/mysql-test/spider/bugfix/include/quick_mode_2_init.inc b/storage/spider/mysql-test/spider/bugfix/include/quick_mode_2_init.inc index dbe3f703a2f..78057b1dd28 100644 --- a/storage/spider/mysql-test/spider/bugfix/include/quick_mode_2_init.inc +++ b/storage/spider/mysql-test/spider/bugfix/include/quick_mode_2_init.inc @@ -1,51 +1,2 @@ ---disable_warnings ---disable_query_log ---disable_result_log ---source ../t/test_init.inc ---enable_result_log ---enable_query_log ---enable_warnings ---let $MASTER_1_COMMENT_2_1_BACKUP= $MASTER_1_COMMENT_2_1 -let $MASTER_1_COMMENT_2_1= - COMMENT='table "tbl_a", srv "s_2_1"'; ---let $MASTER_1_COMMENT_2_2_BACKUP= $MASTER_1_COMMENT_2_2 -let $MASTER_1_COMMENT_2_2= - COMMENT='table "tbl_b", srv "s_2_2"'; ---let $CHILD2_1_DROP_TABLES_BACKUP= $CHILD2_1_DROP_TABLES -let $CHILD2_1_DROP_TABLES= - DROP TABLE IF EXISTS tbl_a; ---let $CHILD2_1_CREATE_TABLES_BACKUP= $CHILD2_1_CREATE_TABLES -let $CHILD2_1_CREATE_TABLES= - CREATE TABLE tbl_a ( - pkey int NOT NULL, - PRIMARY KEY (pkey) - ) $CHILD2_1_ENGINE $CHILD2_1_CHARSET; ---let $CHILD2_1_SELECT_TABLES_BACKUP= $CHILD2_1_SELECT_TABLES -let $CHILD2_1_SELECT_TABLES= - SELECT pkey FROM tbl_a ORDER BY pkey; -let $CHILD2_1_SELECT_ARGUMENT1= - SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'; ---let $CHILD2_2_DROP_TABLES_BACKUP= $CHILD2_2_DROP_TABLES -let $CHILD2_2_DROP_TABLES= - DROP TABLE IF EXISTS tbl_b; ---let $CHILD2_2_CREATE_TABLES_BACKUP= $CHILD2_2_CREATE_TABLES -let $CHILD2_2_CREATE_TABLES= - CREATE TABLE tbl_b ( - pkey int NOT NULL, - PRIMARY KEY (pkey) - ) $CHILD2_2_ENGINE $CHILD2_2_CHARSET; ---let $CHILD2_2_SELECT_TABLES_BACKUP= $CHILD2_2_SELECT_TABLES -let $CHILD2_2_SELECT_TABLES= - SELECT pkey FROM tbl_b ORDER BY pkey; -let $CHILD2_2_SELECT_ARGUMENT1= - SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'; ---connection master_1 -set @old_spider_quick_mode= @@spider_quick_mode; +--source quick_mode_init.inc set session spider_quick_mode= 2; -set @old_spider_quick_page_size= @@spider_quick_page_size; -set session spider_quick_page_size= 3; -set @old_spider_quick_page_byte= @@spider_quick_page_byte; -let $MASTER_1_SET_QUICK_PAGE_BYTE_6= - set session spider_quick_page_byte= 6; -let $MASTER_1_SET_QUICK_PAGE_BYTE_0= - set session spider_quick_page_byte= 0; diff --git a/storage/spider/mysql-test/spider/bugfix/include/quick_mode_3_deinit.inc b/storage/spider/mysql-test/spider/bugfix/include/quick_mode_3_deinit.inc index 42124a794ea..b3cab9f05c6 100644 --- a/storage/spider/mysql-test/spider/bugfix/include/quick_mode_3_deinit.inc +++ b/storage/spider/mysql-test/spider/bugfix/include/quick_mode_3_deinit.inc @@ -1,19 +1 @@ ---let $MASTER_1_COMMENT_2_1= $MASTER_1_COMMENT_2_1_BACKUP ---let $MASTER_1_COMMENT_2_2= $MASTER_1_COMMENT_2_2_BACKUP ---let $CHILD2_1_DROP_TABLES= $CHILD2_1_DROP_TABLES_BACKUP ---let $CHILD2_1_CREATE_TABLES= $CHILD2_1_CREATE_TABLES_BACKUP ---let $CHILD2_1_SELECT_TABLES= $CHILD2_1_SELECT_TABLES_BACKUP ---let $CHILD2_2_DROP_TABLES= $CHILD2_2_DROP_TABLES_BACKUP ---let $CHILD2_2_CREATE_TABLES= $CHILD2_2_CREATE_TABLES_BACKUP ---let $CHILD2_2_SELECT_TABLES= $CHILD2_2_SELECT_TABLES_BACKUP ---connection master_1 -set session spider_quick_mode= @old_spider_quick_mode; -set session spider_quick_page_size= @old_spider_quick_page_size; -set session spider_quick_page_byte= @old_spider_quick_page_byte; ---disable_warnings ---disable_query_log ---disable_result_log ---source ../t/test_deinit.inc ---enable_result_log ---enable_query_log ---enable_warnings +--source quick_mode_deinit.inc diff --git a/storage/spider/mysql-test/spider/bugfix/include/quick_mode_3_init.inc b/storage/spider/mysql-test/spider/bugfix/include/quick_mode_3_init.inc index 81239206dfc..2ae2e95089d 100644 --- a/storage/spider/mysql-test/spider/bugfix/include/quick_mode_3_init.inc +++ b/storage/spider/mysql-test/spider/bugfix/include/quick_mode_3_init.inc @@ -1,51 +1,2 @@ ---disable_warnings ---disable_query_log ---disable_result_log ---source ../t/test_init.inc ---enable_result_log ---enable_query_log ---enable_warnings ---let $MASTER_1_COMMENT_2_1_BACKUP= $MASTER_1_COMMENT_2_1 -let $MASTER_1_COMMENT_2_1= - COMMENT='table "tbl_a", srv "s_2_1"'; ---let $MASTER_1_COMMENT_2_2_BACKUP= $MASTER_1_COMMENT_2_2 -let $MASTER_1_COMMENT_2_2= - COMMENT='table "tbl_b", srv "s_2_2"'; ---let $CHILD2_1_DROP_TABLES_BACKUP= $CHILD2_1_DROP_TABLES -let $CHILD2_1_DROP_TABLES= - DROP TABLE IF EXISTS tbl_a; ---let $CHILD2_1_CREATE_TABLES_BACKUP= $CHILD2_1_CREATE_TABLES -let $CHILD2_1_CREATE_TABLES= - CREATE TABLE tbl_a ( - pkey int NOT NULL, - PRIMARY KEY (pkey) - ) $CHILD2_1_ENGINE $CHILD2_1_CHARSET; ---let $CHILD2_1_SELECT_TABLES_BACKUP= $CHILD2_1_SELECT_TABLES -let $CHILD2_1_SELECT_TABLES= - SELECT pkey FROM tbl_a ORDER BY pkey; -let $CHILD2_1_SELECT_ARGUMENT1= - SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'; ---let $CHILD2_2_DROP_TABLES_BACKUP= $CHILD2_2_DROP_TABLES -let $CHILD2_2_DROP_TABLES= - DROP TABLE IF EXISTS tbl_b; ---let $CHILD2_2_CREATE_TABLES_BACKUP= $CHILD2_2_CREATE_TABLES -let $CHILD2_2_CREATE_TABLES= - CREATE TABLE tbl_b ( - pkey int NOT NULL, - PRIMARY KEY (pkey) - ) $CHILD2_2_ENGINE $CHILD2_2_CHARSET; ---let $CHILD2_2_SELECT_TABLES_BACKUP= $CHILD2_2_SELECT_TABLES -let $CHILD2_2_SELECT_TABLES= - SELECT pkey FROM tbl_b ORDER BY pkey; -let $CHILD2_2_SELECT_ARGUMENT1= - SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'; ---connection master_1 -set @old_spider_quick_mode= @@spider_quick_mode; +--source quick_mode_init.inc set session spider_quick_mode= 3; -set @old_spider_quick_page_size= @@spider_quick_page_size; -set session spider_quick_page_size= 3; -set @old_spider_quick_page_byte= @@spider_quick_page_byte; -let $MASTER_1_SET_QUICK_PAGE_BYTE_6= - set session spider_quick_page_byte= 6; -let $MASTER_1_SET_QUICK_PAGE_BYTE_0= - set session spider_quick_page_byte= 0; diff --git a/storage/spider/mysql-test/spider/bugfix/include/quick_mode_deinit.inc b/storage/spider/mysql-test/spider/bugfix/include/quick_mode_deinit.inc new file mode 100644 index 00000000000..42124a794ea --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/include/quick_mode_deinit.inc @@ -0,0 +1,19 @@ +--let $MASTER_1_COMMENT_2_1= $MASTER_1_COMMENT_2_1_BACKUP +--let $MASTER_1_COMMENT_2_2= $MASTER_1_COMMENT_2_2_BACKUP +--let $CHILD2_1_DROP_TABLES= $CHILD2_1_DROP_TABLES_BACKUP +--let $CHILD2_1_CREATE_TABLES= $CHILD2_1_CREATE_TABLES_BACKUP +--let $CHILD2_1_SELECT_TABLES= $CHILD2_1_SELECT_TABLES_BACKUP +--let $CHILD2_2_DROP_TABLES= $CHILD2_2_DROP_TABLES_BACKUP +--let $CHILD2_2_CREATE_TABLES= $CHILD2_2_CREATE_TABLES_BACKUP +--let $CHILD2_2_SELECT_TABLES= $CHILD2_2_SELECT_TABLES_BACKUP +--connection master_1 +set session spider_quick_mode= @old_spider_quick_mode; +set session spider_quick_page_size= @old_spider_quick_page_size; +set session spider_quick_page_byte= @old_spider_quick_page_byte; +--disable_warnings +--disable_query_log +--disable_result_log +--source ../t/test_deinit.inc +--enable_result_log +--enable_query_log +--enable_warnings diff --git a/storage/spider/mysql-test/spider/bugfix/include/quick_mode_init.inc b/storage/spider/mysql-test/spider/bugfix/include/quick_mode_init.inc new file mode 100644 index 00000000000..dfab595cd7c --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/include/quick_mode_init.inc @@ -0,0 +1,50 @@ +--disable_warnings +--disable_query_log +--disable_result_log +--source ../t/test_init.inc +--enable_result_log +--enable_query_log +--enable_warnings +--let $MASTER_1_COMMENT_2_1_BACKUP= $MASTER_1_COMMENT_2_1 +let $MASTER_1_COMMENT_2_1= + COMMENT='table "tbl_a", srv "s_2_1"'; +--let $MASTER_1_COMMENT_2_2_BACKUP= $MASTER_1_COMMENT_2_2 +let $MASTER_1_COMMENT_2_2= + COMMENT='table "tbl_b", srv "s_2_2"'; +--let $CHILD2_1_DROP_TABLES_BACKUP= $CHILD2_1_DROP_TABLES +let $CHILD2_1_DROP_TABLES= + DROP TABLE IF EXISTS tbl_a; +--let $CHILD2_1_CREATE_TABLES_BACKUP= $CHILD2_1_CREATE_TABLES +let $CHILD2_1_CREATE_TABLES= + CREATE TABLE tbl_a ( + pkey int NOT NULL, + PRIMARY KEY (pkey) + ) $CHILD2_1_ENGINE $CHILD2_1_CHARSET; +--let $CHILD2_1_SELECT_TABLES_BACKUP= $CHILD2_1_SELECT_TABLES +let $CHILD2_1_SELECT_TABLES= + SELECT pkey FROM tbl_a ORDER BY pkey; +let $CHILD2_1_SELECT_ARGUMENT1= + SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'; +--let $CHILD2_2_DROP_TABLES_BACKUP= $CHILD2_2_DROP_TABLES +let $CHILD2_2_DROP_TABLES= + DROP TABLE IF EXISTS tbl_b; +--let $CHILD2_2_CREATE_TABLES_BACKUP= $CHILD2_2_CREATE_TABLES +let $CHILD2_2_CREATE_TABLES= + CREATE TABLE tbl_b ( + pkey int NOT NULL, + PRIMARY KEY (pkey) + ) $CHILD2_2_ENGINE $CHILD2_2_CHARSET; +--let $CHILD2_2_SELECT_TABLES_BACKUP= $CHILD2_2_SELECT_TABLES +let $CHILD2_2_SELECT_TABLES= + SELECT pkey FROM tbl_b ORDER BY pkey; +let $CHILD2_2_SELECT_ARGUMENT1= + SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'; +--connection master_1 +set @old_spider_quick_mode= @@spider_quick_mode; +set @old_spider_quick_page_size= @@spider_quick_page_size; +set session spider_quick_page_size= 3; +set @old_spider_quick_page_byte= @@spider_quick_page_byte; +let $MASTER_1_SET_QUICK_PAGE_BYTE_6= + set session spider_quick_page_byte= 6; +let $MASTER_1_SET_QUICK_PAGE_BYTE_0= + set session spider_quick_page_byte= 0; diff --git a/storage/spider/mysql-test/spider/bugfix/r/quick_mode_0.result b/storage/spider/mysql-test/spider/bugfix/r/quick_mode_0.result index 6e5a0052370..52040a3120f 100644 --- a/storage/spider/mysql-test/spider/bugfix/r/quick_mode_0.result +++ b/storage/spider/mysql-test/spider/bugfix/r/quick_mode_0.result @@ -6,10 +6,10 @@ child2_3 for child3 connection master_1; set @old_spider_quick_mode= @@spider_quick_mode; -set session spider_quick_mode= 0; set @old_spider_quick_page_size= @@spider_quick_page_size; set session spider_quick_page_size= 3; set @old_spider_quick_page_byte= @@spider_quick_page_byte; +set session spider_quick_mode= 0; this test is for MDEV-16520 diff --git a/storage/spider/mysql-test/spider/bugfix/r/quick_mode_1.result b/storage/spider/mysql-test/spider/bugfix/r/quick_mode_1.result index bca6d172a49..96077cffc90 100644 --- a/storage/spider/mysql-test/spider/bugfix/r/quick_mode_1.result +++ b/storage/spider/mysql-test/spider/bugfix/r/quick_mode_1.result @@ -6,10 +6,10 @@ child2_3 for child3 connection master_1; set @old_spider_quick_mode= @@spider_quick_mode; -set session spider_quick_mode= 1; set @old_spider_quick_page_size= @@spider_quick_page_size; set session spider_quick_page_size= 3; set @old_spider_quick_page_byte= @@spider_quick_page_byte; +set session spider_quick_mode= 1; this test is for MDEV-16520 diff --git a/storage/spider/mysql-test/spider/bugfix/r/quick_mode_2.result b/storage/spider/mysql-test/spider/bugfix/r/quick_mode_2.result index 61a7764dddb..7a29c136f2a 100644 --- a/storage/spider/mysql-test/spider/bugfix/r/quick_mode_2.result +++ b/storage/spider/mysql-test/spider/bugfix/r/quick_mode_2.result @@ -6,10 +6,10 @@ child2_3 for child3 connection master_1; set @old_spider_quick_mode= @@spider_quick_mode; -set session spider_quick_mode= 2; set @old_spider_quick_page_size= @@spider_quick_page_size; set session spider_quick_page_size= 3; set @old_spider_quick_page_byte= @@spider_quick_page_byte; +set session spider_quick_mode= 2; this test is for MDEV-16520 diff --git a/storage/spider/mysql-test/spider/bugfix/r/quick_mode_3.result b/storage/spider/mysql-test/spider/bugfix/r/quick_mode_3.result index 38387a45509..e0c3ca1e07c 100644 --- a/storage/spider/mysql-test/spider/bugfix/r/quick_mode_3.result +++ b/storage/spider/mysql-test/spider/bugfix/r/quick_mode_3.result @@ -6,10 +6,10 @@ child2_3 for child3 connection master_1; set @old_spider_quick_mode= @@spider_quick_mode; -set session spider_quick_mode= 3; set @old_spider_quick_page_size= @@spider_quick_page_size; set session spider_quick_page_size= 3; set @old_spider_quick_page_byte= @@spider_quick_page_byte; +set session spider_quick_mode= 3; this test is for MDEV-16520 diff --git a/storage/spider/mysql-test/spider/bugfix/t/quick_mode.cnf b/storage/spider/mysql-test/spider/bugfix/t/quick_mode.cnf new file mode 100644 index 00000000000..e0ffb99c38e --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/t/quick_mode.cnf @@ -0,0 +1,4 @@ +!include include/default_mysqld.cnf +!include ../my_1_1.cnf +!include ../my_2_1.cnf +!include ../my_2_2.cnf diff --git a/storage/spider/mysql-test/spider/bugfix/t/quick_mode.inc b/storage/spider/mysql-test/spider/bugfix/t/quick_mode.inc new file mode 100644 index 00000000000..592fc444ee6 --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/t/quick_mode.inc @@ -0,0 +1,152 @@ +--echo +--echo this test is for MDEV-16520 +--echo +--echo drop and create databases +--connection master_1 +--disable_warnings +CREATE DATABASE auto_test_local; +USE auto_test_local; + +--connection child2_1 +SET @old_log_output = @@global.log_output; +SET GLOBAL log_output = 'TABLE,FILE'; +CREATE DATABASE auto_test_remote; +USE auto_test_remote; + +--connection child2_2 +SET @old_log_output = @@global.log_output; +SET GLOBAL log_output = 'TABLE,FILE'; +CREATE DATABASE auto_test_remote2; +USE auto_test_remote2; +--enable_warnings + +--echo +--echo create table and insert + +--connection child2_1 +--disable_query_log +echo CHILD2_1_CREATE_TABLES; +eval $CHILD2_1_CREATE_TABLES; +--enable_query_log +TRUNCATE TABLE mysql.general_log; + +--connection child2_2 +--disable_query_log +echo CHILD2_2_CREATE_TABLES; +eval $CHILD2_2_CREATE_TABLES; +--enable_query_log +TRUNCATE TABLE mysql.general_log; + +--connection master_1 +--disable_query_log +echo CREATE TABLE tbl_a ( + pkey int NOT NULL, + PRIMARY KEY (pkey) +) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_1; +echo CREATE TABLE tbl_b ( + pkey int NOT NULL, + PRIMARY KEY (pkey) +) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_2; +eval CREATE TABLE tbl_a ( + pkey int NOT NULL, + PRIMARY KEY (pkey) +) $MASTER_1_ENGINE $MASTER_1_CHARSET $MASTER_1_COMMENT_2_1; +eval CREATE TABLE tbl_b ( + pkey int NOT NULL, + PRIMARY KEY (pkey) +) $MASTER_1_ENGINE $MASTER_1_CHARSET $MASTER_1_COMMENT_2_2; +--enable_query_log +INSERT INTO tbl_a (pkey) VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); +INSERT INTO tbl_a (pkey) VALUES (10),(11),(12),(13),(14),(15),(16),(17),(18),(19); +INSERT INTO tbl_a (pkey) VALUES (20),(21),(22),(23),(24),(25),(26),(27),(28),(29); +INSERT INTO tbl_b (pkey) VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); +INSERT INTO tbl_b (pkey) VALUES (10),(11),(12),(13),(14),(15),(16),(17),(18),(19); +INSERT INTO tbl_b (pkey) VALUES (20),(21),(22),(23),(24),(25),(26),(27),(28),(29); + +--echo +--echo select test 1 + +--connection child2_1 +TRUNCATE TABLE mysql.general_log; + +--connection child2_2 +TRUNCATE TABLE mysql.general_log; + +--connection master_1 +SELECT a.pkey FROM tbl_a a, tbl_b b WHERE a.pkey = b.pkey; + +--connection child2_1 +--replace_regex /tmp_spider_bka_0x[0-9a-f]*/tmp_spider_bka_xxxx/ +eval $CHILD2_1_SELECT_ARGUMENT1; +eval $CHILD2_1_SELECT_TABLES; + +--connection child2_2 +--replace_regex /tmp_spider_bka_0x[0-9a-f]*/tmp_spider_bka_xxxx/ +eval $CHILD2_2_SELECT_ARGUMENT1; +eval $CHILD2_2_SELECT_TABLES; + +--connection master_1 +eval $MASTER_1_SET_QUICK_PAGE_BYTE_6; + +--echo +--echo select test 2 + +--connection child2_1 +TRUNCATE TABLE mysql.general_log; + +--connection child2_2 +TRUNCATE TABLE mysql.general_log; + +--connection master_1 +SELECT a.pkey FROM tbl_a a, tbl_b b WHERE a.pkey = b.pkey; + +--connection child2_1 +--replace_regex /tmp_spider_bka_0x[0-9a-f]*/tmp_spider_bka_xxxx/ +eval $CHILD2_1_SELECT_ARGUMENT1; +eval $CHILD2_1_SELECT_TABLES; + +--connection child2_2 +--replace_regex /tmp_spider_bka_0x[0-9a-f]*/tmp_spider_bka_xxxx/ +eval $CHILD2_2_SELECT_ARGUMENT1; +eval $CHILD2_2_SELECT_TABLES; + +--connection master_1 +eval $MASTER_1_SET_QUICK_PAGE_BYTE_0; + +--echo +--echo select test 3 + +--connection child2_1 +TRUNCATE TABLE mysql.general_log; + +--connection child2_2 +TRUNCATE TABLE mysql.general_log; + +--connection master_1 +SELECT a.pkey FROM tbl_a a, tbl_b b WHERE a.pkey = b.pkey; + +--connection child2_1 +--replace_regex /tmp_spider_bka_0x[0-9a-f]*/tmp_spider_bka_xxxx/ +eval $CHILD2_1_SELECT_ARGUMENT1; +eval $CHILD2_1_SELECT_TABLES; + +--connection child2_2 +--replace_regex /tmp_spider_bka_0x[0-9a-f]*/tmp_spider_bka_xxxx/ +eval $CHILD2_2_SELECT_ARGUMENT1; +eval $CHILD2_2_SELECT_TABLES; + +--echo +--echo deinit +--disable_warnings +--connection master_1 +DROP DATABASE IF EXISTS auto_test_local; + +--connection child2_1 +DROP DATABASE IF EXISTS auto_test_remote; +SET GLOBAL log_output = @old_log_output; + +--connection child2_2 +DROP DATABASE IF EXISTS auto_test_remote2; +SET GLOBAL log_output = @old_log_output; + +--enable_warnings diff --git a/storage/spider/mysql-test/spider/bugfix/t/quick_mode_0.cnf b/storage/spider/mysql-test/spider/bugfix/t/quick_mode_0.cnf index e0ffb99c38e..c4b40c33cdc 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/quick_mode_0.cnf +++ b/storage/spider/mysql-test/spider/bugfix/t/quick_mode_0.cnf @@ -1,4 +1 @@ -!include include/default_mysqld.cnf -!include ../my_1_1.cnf -!include ../my_2_1.cnf -!include ../my_2_2.cnf +!include quick_mode.cnf diff --git a/storage/spider/mysql-test/spider/bugfix/t/quick_mode_0.test b/storage/spider/mysql-test/spider/bugfix/t/quick_mode_0.test index 235edc10d12..5cc3fd591a2 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/quick_mode_0.test +++ b/storage/spider/mysql-test/spider/bugfix/t/quick_mode_0.test @@ -1,156 +1,5 @@ --source ../include/quick_mode_0_init.inc ---echo ---echo this test is for MDEV-16520 ---echo ---echo drop and create databases ---connection master_1 ---disable_warnings -CREATE DATABASE auto_test_local; -USE auto_test_local; - ---connection child2_1 -SET @old_log_output = @@global.log_output; -SET GLOBAL log_output = 'TABLE,FILE'; -CREATE DATABASE auto_test_remote; -USE auto_test_remote; - ---connection child2_2 -SET @old_log_output = @@global.log_output; -SET GLOBAL log_output = 'TABLE,FILE'; -CREATE DATABASE auto_test_remote2; -USE auto_test_remote2; ---enable_warnings - ---echo ---echo create table and insert - ---connection child2_1 ---disable_query_log -echo CHILD2_1_CREATE_TABLES; -eval $CHILD2_1_CREATE_TABLES; ---enable_query_log -TRUNCATE TABLE mysql.general_log; - ---connection child2_2 ---disable_query_log -echo CHILD2_2_CREATE_TABLES; -eval $CHILD2_2_CREATE_TABLES; ---enable_query_log -TRUNCATE TABLE mysql.general_log; - ---connection master_1 ---disable_query_log -echo CREATE TABLE tbl_a ( - pkey int NOT NULL, - PRIMARY KEY (pkey) -) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_1; -echo CREATE TABLE tbl_b ( - pkey int NOT NULL, - PRIMARY KEY (pkey) -) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_2; -eval CREATE TABLE tbl_a ( - pkey int NOT NULL, - PRIMARY KEY (pkey) -) $MASTER_1_ENGINE $MASTER_1_CHARSET $MASTER_1_COMMENT_2_1; -eval CREATE TABLE tbl_b ( - pkey int NOT NULL, - PRIMARY KEY (pkey) -) $MASTER_1_ENGINE $MASTER_1_CHARSET $MASTER_1_COMMENT_2_2; ---enable_query_log -INSERT INTO tbl_a (pkey) VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); -INSERT INTO tbl_a (pkey) VALUES (10),(11),(12),(13),(14),(15),(16),(17),(18),(19); -INSERT INTO tbl_a (pkey) VALUES (20),(21),(22),(23),(24),(25),(26),(27),(28),(29); -INSERT INTO tbl_b (pkey) VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); -INSERT INTO tbl_b (pkey) VALUES (10),(11),(12),(13),(14),(15),(16),(17),(18),(19); -INSERT INTO tbl_b (pkey) VALUES (20),(21),(22),(23),(24),(25),(26),(27),(28),(29); - ---echo ---echo select test 1 - ---connection child2_1 -TRUNCATE TABLE mysql.general_log; - ---connection child2_2 -TRUNCATE TABLE mysql.general_log; - ---connection master_1 -SELECT a.pkey FROM tbl_a a, tbl_b b WHERE a.pkey = b.pkey; - ---connection child2_1 ---replace_regex /tmp_spider_bka_0x[0-9a-f]*/tmp_spider_bka_xxxx/ -eval $CHILD2_1_SELECT_ARGUMENT1; -eval $CHILD2_1_SELECT_TABLES; - ---connection child2_2 ---replace_regex /tmp_spider_bka_0x[0-9a-f]*/tmp_spider_bka_xxxx/ -eval $CHILD2_2_SELECT_ARGUMENT1; -eval $CHILD2_2_SELECT_TABLES; - ---connection master_1 -eval $MASTER_1_SET_QUICK_PAGE_BYTE_6; - ---echo ---echo select test 2 - ---connection child2_1 -TRUNCATE TABLE mysql.general_log; - ---connection child2_2 -TRUNCATE TABLE mysql.general_log; - ---connection master_1 -SELECT a.pkey FROM tbl_a a, tbl_b b WHERE a.pkey = b.pkey; - ---connection child2_1 ---replace_regex /tmp_spider_bka_0x[0-9a-f]*/tmp_spider_bka_xxxx/ -eval $CHILD2_1_SELECT_ARGUMENT1; -eval $CHILD2_1_SELECT_TABLES; - ---connection child2_2 ---replace_regex /tmp_spider_bka_0x[0-9a-f]*/tmp_spider_bka_xxxx/ -eval $CHILD2_2_SELECT_ARGUMENT1; -eval $CHILD2_2_SELECT_TABLES; - ---connection master_1 -eval $MASTER_1_SET_QUICK_PAGE_BYTE_0; - ---echo ---echo select test 3 - ---connection child2_1 -TRUNCATE TABLE mysql.general_log; - ---connection child2_2 -TRUNCATE TABLE mysql.general_log; - ---connection master_1 -SELECT a.pkey FROM tbl_a a, tbl_b b WHERE a.pkey = b.pkey; - ---connection child2_1 ---replace_regex /tmp_spider_bka_0x[0-9a-f]*/tmp_spider_bka_xxxx/ -eval $CHILD2_1_SELECT_ARGUMENT1; -eval $CHILD2_1_SELECT_TABLES; - ---connection child2_2 ---replace_regex /tmp_spider_bka_0x[0-9a-f]*/tmp_spider_bka_xxxx/ -eval $CHILD2_2_SELECT_ARGUMENT1; -eval $CHILD2_2_SELECT_TABLES; - ---echo ---echo deinit ---disable_warnings ---connection master_1 -DROP DATABASE IF EXISTS auto_test_local; - ---connection child2_1 -DROP DATABASE IF EXISTS auto_test_remote; -SET GLOBAL log_output = @old_log_output; - ---connection child2_2 -DROP DATABASE IF EXISTS auto_test_remote2; -SET GLOBAL log_output = @old_log_output; - ---enable_warnings +--source quick_mode.inc --source ../include/quick_mode_0_deinit.inc --echo --echo end of test diff --git a/storage/spider/mysql-test/spider/bugfix/t/quick_mode_1.cnf b/storage/spider/mysql-test/spider/bugfix/t/quick_mode_1.cnf index e0ffb99c38e..c4b40c33cdc 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/quick_mode_1.cnf +++ b/storage/spider/mysql-test/spider/bugfix/t/quick_mode_1.cnf @@ -1,4 +1 @@ -!include include/default_mysqld.cnf -!include ../my_1_1.cnf -!include ../my_2_1.cnf -!include ../my_2_2.cnf +!include quick_mode.cnf diff --git a/storage/spider/mysql-test/spider/bugfix/t/quick_mode_1.test b/storage/spider/mysql-test/spider/bugfix/t/quick_mode_1.test index 01fa0cb5128..493fabfe950 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/quick_mode_1.test +++ b/storage/spider/mysql-test/spider/bugfix/t/quick_mode_1.test @@ -1,156 +1,5 @@ --source ../include/quick_mode_1_init.inc ---echo ---echo this test is for MDEV-16520 ---echo ---echo drop and create databases ---connection master_1 ---disable_warnings -CREATE DATABASE auto_test_local; -USE auto_test_local; - ---connection child2_1 -SET @old_log_output = @@global.log_output; -SET GLOBAL log_output = 'TABLE,FILE'; -CREATE DATABASE auto_test_remote; -USE auto_test_remote; - ---connection child2_2 -SET @old_log_output = @@global.log_output; -SET GLOBAL log_output = 'TABLE,FILE'; -CREATE DATABASE auto_test_remote2; -USE auto_test_remote2; ---enable_warnings - ---echo ---echo create table and insert - ---connection child2_1 ---disable_query_log -echo CHILD2_1_CREATE_TABLES; -eval $CHILD2_1_CREATE_TABLES; ---enable_query_log -TRUNCATE TABLE mysql.general_log; - ---connection child2_2 ---disable_query_log -echo CHILD2_2_CREATE_TABLES; -eval $CHILD2_2_CREATE_TABLES; ---enable_query_log -TRUNCATE TABLE mysql.general_log; - ---connection master_1 ---disable_query_log -echo CREATE TABLE tbl_a ( - pkey int NOT NULL, - PRIMARY KEY (pkey) -) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_1; -echo CREATE TABLE tbl_b ( - pkey int NOT NULL, - PRIMARY KEY (pkey) -) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_2; -eval CREATE TABLE tbl_a ( - pkey int NOT NULL, - PRIMARY KEY (pkey) -) $MASTER_1_ENGINE $MASTER_1_CHARSET $MASTER_1_COMMENT_2_1; -eval CREATE TABLE tbl_b ( - pkey int NOT NULL, - PRIMARY KEY (pkey) -) $MASTER_1_ENGINE $MASTER_1_CHARSET $MASTER_1_COMMENT_2_2; ---enable_query_log -INSERT INTO tbl_a (pkey) VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); -INSERT INTO tbl_a (pkey) VALUES (10),(11),(12),(13),(14),(15),(16),(17),(18),(19); -INSERT INTO tbl_a (pkey) VALUES (20),(21),(22),(23),(24),(25),(26),(27),(28),(29); -INSERT INTO tbl_b (pkey) VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); -INSERT INTO tbl_b (pkey) VALUES (10),(11),(12),(13),(14),(15),(16),(17),(18),(19); -INSERT INTO tbl_b (pkey) VALUES (20),(21),(22),(23),(24),(25),(26),(27),(28),(29); - ---echo ---echo select test 1 - ---connection child2_1 -TRUNCATE TABLE mysql.general_log; - ---connection child2_2 -TRUNCATE TABLE mysql.general_log; - ---connection master_1 -SELECT a.pkey FROM tbl_a a, tbl_b b WHERE a.pkey = b.pkey; - ---connection child2_1 ---replace_regex /tmp_spider_bka_0x[0-9a-f]*/tmp_spider_bka_xxxx/ -eval $CHILD2_1_SELECT_ARGUMENT1; -eval $CHILD2_1_SELECT_TABLES; - ---connection child2_2 ---replace_regex /tmp_spider_bka_0x[0-9a-f]*/tmp_spider_bka_xxxx/ -eval $CHILD2_2_SELECT_ARGUMENT1; -eval $CHILD2_2_SELECT_TABLES; - ---connection master_1 -eval $MASTER_1_SET_QUICK_PAGE_BYTE_6; - ---echo ---echo select test 2 - ---connection child2_1 -TRUNCATE TABLE mysql.general_log; - ---connection child2_2 -TRUNCATE TABLE mysql.general_log; - ---connection master_1 -SELECT a.pkey FROM tbl_a a, tbl_b b WHERE a.pkey = b.pkey; - ---connection child2_1 ---replace_regex /tmp_spider_bka_0x[0-9a-f]*/tmp_spider_bka_xxxx/ -eval $CHILD2_1_SELECT_ARGUMENT1; -eval $CHILD2_1_SELECT_TABLES; - ---connection child2_2 ---replace_regex /tmp_spider_bka_0x[0-9a-f]*/tmp_spider_bka_xxxx/ -eval $CHILD2_2_SELECT_ARGUMENT1; -eval $CHILD2_2_SELECT_TABLES; - ---connection master_1 -eval $MASTER_1_SET_QUICK_PAGE_BYTE_0; - ---echo ---echo select test 3 - ---connection child2_1 -TRUNCATE TABLE mysql.general_log; - ---connection child2_2 -TRUNCATE TABLE mysql.general_log; - ---connection master_1 -SELECT a.pkey FROM tbl_a a, tbl_b b WHERE a.pkey = b.pkey; - ---connection child2_1 ---replace_regex /tmp_spider_bka_0x[0-9a-f]*/tmp_spider_bka_xxxx/ -eval $CHILD2_1_SELECT_ARGUMENT1; -eval $CHILD2_1_SELECT_TABLES; - ---connection child2_2 ---replace_regex /tmp_spider_bka_0x[0-9a-f]*/tmp_spider_bka_xxxx/ -eval $CHILD2_2_SELECT_ARGUMENT1; -eval $CHILD2_2_SELECT_TABLES; - ---echo ---echo deinit ---disable_warnings ---connection master_1 -DROP DATABASE IF EXISTS auto_test_local; - ---connection child2_1 -DROP DATABASE IF EXISTS auto_test_remote; -SET GLOBAL log_output = @old_log_output; - ---connection child2_2 -DROP DATABASE IF EXISTS auto_test_remote2; -SET GLOBAL log_output = @old_log_output; - ---enable_warnings +--source quick_mode.inc --source ../include/quick_mode_1_deinit.inc --echo --echo end of test diff --git a/storage/spider/mysql-test/spider/bugfix/t/quick_mode_2.cnf b/storage/spider/mysql-test/spider/bugfix/t/quick_mode_2.cnf index e0ffb99c38e..c4b40c33cdc 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/quick_mode_2.cnf +++ b/storage/spider/mysql-test/spider/bugfix/t/quick_mode_2.cnf @@ -1,4 +1 @@ -!include include/default_mysqld.cnf -!include ../my_1_1.cnf -!include ../my_2_1.cnf -!include ../my_2_2.cnf +!include quick_mode.cnf diff --git a/storage/spider/mysql-test/spider/bugfix/t/quick_mode_2.test b/storage/spider/mysql-test/spider/bugfix/t/quick_mode_2.test index 3ea8138e755..ee46b878484 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/quick_mode_2.test +++ b/storage/spider/mysql-test/spider/bugfix/t/quick_mode_2.test @@ -1,156 +1,5 @@ --source ../include/quick_mode_2_init.inc ---echo ---echo this test is for MDEV-16520 ---echo ---echo drop and create databases ---connection master_1 ---disable_warnings -CREATE DATABASE auto_test_local; -USE auto_test_local; - ---connection child2_1 -SET @old_log_output = @@global.log_output; -SET GLOBAL log_output = 'TABLE,FILE'; -CREATE DATABASE auto_test_remote; -USE auto_test_remote; - ---connection child2_2 -SET @old_log_output = @@global.log_output; -SET GLOBAL log_output = 'TABLE,FILE'; -CREATE DATABASE auto_test_remote2; -USE auto_test_remote2; ---enable_warnings - ---echo ---echo create table and insert - ---connection child2_1 ---disable_query_log -echo CHILD2_1_CREATE_TABLES; -eval $CHILD2_1_CREATE_TABLES; ---enable_query_log -TRUNCATE TABLE mysql.general_log; - ---connection child2_2 ---disable_query_log -echo CHILD2_2_CREATE_TABLES; -eval $CHILD2_2_CREATE_TABLES; ---enable_query_log -TRUNCATE TABLE mysql.general_log; - ---connection master_1 ---disable_query_log -echo CREATE TABLE tbl_a ( - pkey int NOT NULL, - PRIMARY KEY (pkey) -) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_1; -echo CREATE TABLE tbl_b ( - pkey int NOT NULL, - PRIMARY KEY (pkey) -) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_2; -eval CREATE TABLE tbl_a ( - pkey int NOT NULL, - PRIMARY KEY (pkey) -) $MASTER_1_ENGINE $MASTER_1_CHARSET $MASTER_1_COMMENT_2_1; -eval CREATE TABLE tbl_b ( - pkey int NOT NULL, - PRIMARY KEY (pkey) -) $MASTER_1_ENGINE $MASTER_1_CHARSET $MASTER_1_COMMENT_2_2; ---enable_query_log -INSERT INTO tbl_a (pkey) VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); -INSERT INTO tbl_a (pkey) VALUES (10),(11),(12),(13),(14),(15),(16),(17),(18),(19); -INSERT INTO tbl_a (pkey) VALUES (20),(21),(22),(23),(24),(25),(26),(27),(28),(29); -INSERT INTO tbl_b (pkey) VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); -INSERT INTO tbl_b (pkey) VALUES (10),(11),(12),(13),(14),(15),(16),(17),(18),(19); -INSERT INTO tbl_b (pkey) VALUES (20),(21),(22),(23),(24),(25),(26),(27),(28),(29); - ---echo ---echo select test 1 - ---connection child2_1 -TRUNCATE TABLE mysql.general_log; - ---connection child2_2 -TRUNCATE TABLE mysql.general_log; - ---connection master_1 -SELECT a.pkey FROM tbl_a a, tbl_b b WHERE a.pkey = b.pkey; - ---connection child2_1 ---replace_regex /tmp_spider_bka_0x[0-9a-f]*/tmp_spider_bka_xxxx/ -eval $CHILD2_1_SELECT_ARGUMENT1; -eval $CHILD2_1_SELECT_TABLES; - ---connection child2_2 ---replace_regex /tmp_spider_bka_0x[0-9a-f]*/tmp_spider_bka_xxxx/ -eval $CHILD2_2_SELECT_ARGUMENT1; -eval $CHILD2_2_SELECT_TABLES; - ---connection master_1 -eval $MASTER_1_SET_QUICK_PAGE_BYTE_6; - ---echo ---echo select test 2 - ---connection child2_1 -TRUNCATE TABLE mysql.general_log; - ---connection child2_2 -TRUNCATE TABLE mysql.general_log; - ---connection master_1 -SELECT a.pkey FROM tbl_a a, tbl_b b WHERE a.pkey = b.pkey; - ---connection child2_1 ---replace_regex /tmp_spider_bka_0x[0-9a-f]*/tmp_spider_bka_xxxx/ -eval $CHILD2_1_SELECT_ARGUMENT1; -eval $CHILD2_1_SELECT_TABLES; - ---connection child2_2 ---replace_regex /tmp_spider_bka_0x[0-9a-f]*/tmp_spider_bka_xxxx/ -eval $CHILD2_2_SELECT_ARGUMENT1; -eval $CHILD2_2_SELECT_TABLES; - ---connection master_1 -eval $MASTER_1_SET_QUICK_PAGE_BYTE_0; - ---echo ---echo select test 3 - ---connection child2_1 -TRUNCATE TABLE mysql.general_log; - ---connection child2_2 -TRUNCATE TABLE mysql.general_log; - ---connection master_1 -SELECT a.pkey FROM tbl_a a, tbl_b b WHERE a.pkey = b.pkey; - ---connection child2_1 ---replace_regex /tmp_spider_bka_0x[0-9a-f]*/tmp_spider_bka_xxxx/ -eval $CHILD2_1_SELECT_ARGUMENT1; -eval $CHILD2_1_SELECT_TABLES; - ---connection child2_2 ---replace_regex /tmp_spider_bka_0x[0-9a-f]*/tmp_spider_bka_xxxx/ -eval $CHILD2_2_SELECT_ARGUMENT1; -eval $CHILD2_2_SELECT_TABLES; - ---echo ---echo deinit ---disable_warnings ---connection master_1 -DROP DATABASE IF EXISTS auto_test_local; - ---connection child2_1 -DROP DATABASE IF EXISTS auto_test_remote; -SET GLOBAL log_output = @old_log_output; - ---connection child2_2 -DROP DATABASE IF EXISTS auto_test_remote2; -SET GLOBAL log_output = @old_log_output; - ---enable_warnings +--source quick_mode.inc --source ../include/quick_mode_2_deinit.inc --echo --echo end of test diff --git a/storage/spider/mysql-test/spider/bugfix/t/quick_mode_3.cnf b/storage/spider/mysql-test/spider/bugfix/t/quick_mode_3.cnf index e0ffb99c38e..c4b40c33cdc 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/quick_mode_3.cnf +++ b/storage/spider/mysql-test/spider/bugfix/t/quick_mode_3.cnf @@ -1,4 +1 @@ -!include include/default_mysqld.cnf -!include ../my_1_1.cnf -!include ../my_2_1.cnf -!include ../my_2_2.cnf +!include quick_mode.cnf diff --git a/storage/spider/mysql-test/spider/bugfix/t/quick_mode_3.test b/storage/spider/mysql-test/spider/bugfix/t/quick_mode_3.test index bc926b0a296..1d1bf0e24da 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/quick_mode_3.test +++ b/storage/spider/mysql-test/spider/bugfix/t/quick_mode_3.test @@ -1,157 +1,5 @@ --source ../include/quick_mode_3_init.inc ---echo ---echo this test is for MDEV-16520 ---echo ---echo drop and create databases - ---connection master_1 ---disable_warnings -CREATE DATABASE auto_test_local; -USE auto_test_local; - ---connection child2_1 -SET @old_log_output = @@global.log_output; -SET GLOBAL log_output = 'TABLE,FILE'; -CREATE DATABASE auto_test_remote; -USE auto_test_remote; - ---connection child2_2 -SET @old_log_output = @@global.log_output; -SET GLOBAL log_output = 'TABLE,FILE'; -CREATE DATABASE auto_test_remote2; -USE auto_test_remote2; ---enable_warnings - ---echo ---echo create table and insert - ---connection child2_1 ---disable_query_log -echo CHILD2_1_CREATE_TABLES; -eval $CHILD2_1_CREATE_TABLES; ---enable_query_log -TRUNCATE TABLE mysql.general_log; - ---connection child2_2 ---disable_query_log -echo CHILD2_2_CREATE_TABLES; -eval $CHILD2_2_CREATE_TABLES; ---enable_query_log -TRUNCATE TABLE mysql.general_log; - ---connection master_1 ---disable_query_log -echo CREATE TABLE tbl_a ( - pkey int NOT NULL, - PRIMARY KEY (pkey) -) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_1; -echo CREATE TABLE tbl_b ( - pkey int NOT NULL, - PRIMARY KEY (pkey) -) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_2; -eval CREATE TABLE tbl_a ( - pkey int NOT NULL, - PRIMARY KEY (pkey) -) $MASTER_1_ENGINE $MASTER_1_CHARSET $MASTER_1_COMMENT_2_1; -eval CREATE TABLE tbl_b ( - pkey int NOT NULL, - PRIMARY KEY (pkey) -) $MASTER_1_ENGINE $MASTER_1_CHARSET $MASTER_1_COMMENT_2_2; ---enable_query_log -INSERT INTO tbl_a (pkey) VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); -INSERT INTO tbl_a (pkey) VALUES (10),(11),(12),(13),(14),(15),(16),(17),(18),(19); -INSERT INTO tbl_a (pkey) VALUES (20),(21),(22),(23),(24),(25),(26),(27),(28),(29); -INSERT INTO tbl_b (pkey) VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); -INSERT INTO tbl_b (pkey) VALUES (10),(11),(12),(13),(14),(15),(16),(17),(18),(19); -INSERT INTO tbl_b (pkey) VALUES (20),(21),(22),(23),(24),(25),(26),(27),(28),(29); - ---echo ---echo select test 1 - ---connection child2_1 -TRUNCATE TABLE mysql.general_log; - ---connection child2_2 -TRUNCATE TABLE mysql.general_log; - ---connection master_1 -SELECT a.pkey FROM tbl_a a, tbl_b b WHERE a.pkey = b.pkey; - ---connection child2_1 ---replace_regex /tmp_spider_bka_0x[0-9a-f]*/tmp_spider_bka_xxxx/ -eval $CHILD2_1_SELECT_ARGUMENT1; -eval $CHILD2_1_SELECT_TABLES; - ---connection child2_2 ---replace_regex /tmp_spider_bka_0x[0-9a-f]*/tmp_spider_bka_xxxx/ -eval $CHILD2_2_SELECT_ARGUMENT1; -eval $CHILD2_2_SELECT_TABLES; - ---connection master_1 -eval $MASTER_1_SET_QUICK_PAGE_BYTE_6; - ---echo ---echo select test 2 - ---connection child2_1 -TRUNCATE TABLE mysql.general_log; - ---connection child2_2 -TRUNCATE TABLE mysql.general_log; - ---connection master_1 -SELECT a.pkey FROM tbl_a a, tbl_b b WHERE a.pkey = b.pkey; - ---connection child2_1 ---replace_regex /tmp_spider_bka_0x[0-9a-f]*/tmp_spider_bka_xxxx/ -eval $CHILD2_1_SELECT_ARGUMENT1; -eval $CHILD2_1_SELECT_TABLES; - ---connection child2_2 ---replace_regex /tmp_spider_bka_0x[0-9a-f]*/tmp_spider_bka_xxxx/ -eval $CHILD2_2_SELECT_ARGUMENT1; -eval $CHILD2_2_SELECT_TABLES; - ---connection master_1 -eval $MASTER_1_SET_QUICK_PAGE_BYTE_0; - ---echo ---echo select test 3 - ---connection child2_1 -TRUNCATE TABLE mysql.general_log; - ---connection child2_2 -TRUNCATE TABLE mysql.general_log; - ---connection master_1 -SELECT a.pkey FROM tbl_a a, tbl_b b WHERE a.pkey = b.pkey; - ---connection child2_1 ---replace_regex /tmp_spider_bka_0x[0-9a-f]*/tmp_spider_bka_xxxx/ -eval $CHILD2_1_SELECT_ARGUMENT1; -eval $CHILD2_1_SELECT_TABLES; - ---connection child2_2 ---replace_regex /tmp_spider_bka_0x[0-9a-f]*/tmp_spider_bka_xxxx/ -eval $CHILD2_2_SELECT_ARGUMENT1; -eval $CHILD2_2_SELECT_TABLES; - ---echo ---echo deinit ---disable_warnings ---connection master_1 -DROP DATABASE IF EXISTS auto_test_local; - ---connection child2_1 -DROP DATABASE IF EXISTS auto_test_remote; -SET GLOBAL log_output = @old_log_output; - ---connection child2_2 -DROP DATABASE IF EXISTS auto_test_remote2; -SET GLOBAL log_output = @old_log_output; - ---enable_warnings +--source quick_mode.inc --source ../include/quick_mode_3_deinit.inc --echo --echo end of test diff --git a/storage/spider/mysql-test/spider/feature/include/rewrite_deinit.inc b/storage/spider/mysql-test/spider/feature/include/rewrite_deinit.inc new file mode 100644 index 00000000000..ecb5622af14 --- /dev/null +++ b/storage/spider/mysql-test/spider/feature/include/rewrite_deinit.inc @@ -0,0 +1,7 @@ +--disable_warnings +--disable_query_log +--disable_result_log +--source ../t/test_deinit.inc +--enable_result_log +--enable_query_log +--enable_warnings diff --git a/storage/spider/mysql-test/spider/feature/include/rewrite_init.inc b/storage/spider/mysql-test/spider/feature/include/rewrite_init.inc new file mode 100644 index 00000000000..cc6a0070da6 --- /dev/null +++ b/storage/spider/mysql-test/spider/feature/include/rewrite_init.inc @@ -0,0 +1,9 @@ +--disable_warnings +--disable_query_log +--disable_result_log +--source ../t/test_init.inc +--enable_result_log +--enable_query_log +--enable_warnings +let $CHILD2_1_SELECT_ARGUMENT1= + SELECT argument FROM mysql.general_log; diff --git a/storage/spider/mysql-test/spider/feature/include/rewrite_partition_deinit.inc b/storage/spider/mysql-test/spider/feature/include/rewrite_partition_deinit.inc new file mode 100644 index 00000000000..9b2dcf7354d --- /dev/null +++ b/storage/spider/mysql-test/spider/feature/include/rewrite_partition_deinit.inc @@ -0,0 +1 @@ +--source rewrite_deinit.inc diff --git a/storage/spider/mysql-test/spider/feature/include/rewrite_partition_init.inc b/storage/spider/mysql-test/spider/feature/include/rewrite_partition_init.inc new file mode 100644 index 00000000000..b6f49ef465c --- /dev/null +++ b/storage/spider/mysql-test/spider/feature/include/rewrite_partition_init.inc @@ -0,0 +1,16 @@ +--source rewrite_init.inc +if (!$HAS_REWRITE) +{ + --source rewrite_partition_deinit.inc + skip Test requires audit rewrite; +} +--connection master_1 +INSERT INTO mysql.spider_rewrite_tables VALUES (1, '%', '%'); +INSERT INTO mysql.spider_rewrite_table_tables VALUES (1, 1, 'LIST', 'MOD(pkey,4)', '', '', 'srv "s_2_1"', ''); +INSERT INTO mysql.spider_rewrite_table_partitions VALUES + (1, 1, 1, 'pt1', '0,1', 'database "auto_test_remote"', ''), + (1, 1, 2, 'pt2', '2,3', 'database "auto_test_remote2"', ''); +select spider_flush_rewrite_cache(); +let $CHILD2_1_SELECT_TABLES= + SELECT pkey FROM auto_test_remote.tbl_a ORDER BY pkey $STR_SEMICOLON + SELECT pkey FROM auto_test_remote2.tbl_a ORDER BY pkey; diff --git a/storage/spider/mysql-test/spider/feature/include/rewrite_simple_deinit.inc b/storage/spider/mysql-test/spider/feature/include/rewrite_simple_deinit.inc new file mode 100644 index 00000000000..9b2dcf7354d --- /dev/null +++ b/storage/spider/mysql-test/spider/feature/include/rewrite_simple_deinit.inc @@ -0,0 +1 @@ +--source rewrite_deinit.inc diff --git a/storage/spider/mysql-test/spider/feature/include/rewrite_simple_init.inc b/storage/spider/mysql-test/spider/feature/include/rewrite_simple_init.inc new file mode 100644 index 00000000000..51d908d7af4 --- /dev/null +++ b/storage/spider/mysql-test/spider/feature/include/rewrite_simple_init.inc @@ -0,0 +1,12 @@ +--source rewrite_init.inc +if (!$HAS_REWRITE) +{ + --source rewrite_simple_deinit.inc + skip Test requires audit rewrite; +} +--connection master_1 +INSERT INTO mysql.spider_rewrite_tables VALUES (1, '%', '%'); +INSERT INTO mysql.spider_rewrite_table_tables VALUES (1, 1, '', '', '', '', 'srv "s_2_1"', ''); +select spider_flush_rewrite_cache(); +let $CHILD2_1_SELECT_TABLES= + SELECT pkey FROM auto_test_remote.tbl_a ORDER BY pkey; diff --git a/storage/spider/mysql-test/spider/feature/include/rewrite_subpartition_deinit.inc b/storage/spider/mysql-test/spider/feature/include/rewrite_subpartition_deinit.inc new file mode 100644 index 00000000000..9b2dcf7354d --- /dev/null +++ b/storage/spider/mysql-test/spider/feature/include/rewrite_subpartition_deinit.inc @@ -0,0 +1 @@ +--source rewrite_deinit.inc diff --git a/storage/spider/mysql-test/spider/feature/include/rewrite_subpartition_init.inc b/storage/spider/mysql-test/spider/feature/include/rewrite_subpartition_init.inc new file mode 100644 index 00000000000..2a97c8bc1fd --- /dev/null +++ b/storage/spider/mysql-test/spider/feature/include/rewrite_subpartition_init.inc @@ -0,0 +1,23 @@ +--source rewrite_init.inc +if (!$HAS_REWRITE) +{ + --source rewrite_subpartition_deinit.inc + skip Test requires audit rewrite; +} +--connection master_1 +INSERT INTO mysql.spider_rewrite_tables VALUES (1, '%', '%'); +INSERT INTO mysql.spider_rewrite_table_tables VALUES (1, 1, 'RANGE', 'pkey', 'HASH', 'pkey', 'srv "s_2_1"', ''); +INSERT INTO mysql.spider_rewrite_table_partitions VALUES + (1, 1, 1, 'pt1', '5', '', ''), + (1, 1, 2, 'pt2', 'MAXVALUE', '', ''); +INSERT INTO mysql.spider_rewrite_table_subpartitions VALUES + (1, 1, 1, 1, 'spt1', '', 'database "auto_test_remote"', ''), + (1, 1, 1, 2, 'spt2', '', 'database "auto_test_remote2"', ''), + (1, 1, 2, 1, 'spt3', '', 'database "auto_test_remote3"', ''), + (1, 1, 2, 2, 'spt4', '', 'database "auto_test_remote4"', ''); +select spider_flush_rewrite_cache(); +let $CHILD2_1_SELECT_TABLES= + SELECT pkey FROM auto_test_remote.tbl_a ORDER BY pkey $STR_SEMICOLON + SELECT pkey FROM auto_test_remote2.tbl_a ORDER BY pkey $STR_SEMICOLON + SELECT pkey FROM auto_test_remote3.tbl_a ORDER BY pkey $STR_SEMICOLON + SELECT pkey FROM auto_test_remote4.tbl_a ORDER BY pkey; diff --git a/storage/spider/mysql-test/spider/feature/my.cnf b/storage/spider/mysql-test/spider/feature/my.cnf new file mode 100644 index 00000000000..b7f76a630cc --- /dev/null +++ b/storage/spider/mysql-test/spider/feature/my.cnf @@ -0,0 +1,2 @@ +!include include/default_mysqld.cnf +!include my_1_1.cnf diff --git a/storage/spider/mysql-test/spider/feature/my_1_1.cnf b/storage/spider/mysql-test/spider/feature/my_1_1.cnf new file mode 100644 index 00000000000..5f17295d895 --- /dev/null +++ b/storage/spider/mysql-test/spider/feature/my_1_1.cnf @@ -0,0 +1,44 @@ +[mysqld.1.1] +log-bin= master-bin +loose_handlersocket_port= 20000 +loose_handlersocket_port_wr= 20001 +loose_handlersocket_threads= 2 +loose_handlersocket_threads_wr= 1 +loose_handlersocket_support_merge_table= 0 +loose_handlersocket_direct_update_mode= 2 +loose_handlersocket_unlimited_boundary= 65536 +loose_handlersocket_bulk_insert= 0 +loose_handlersocket_bulk_insert_timeout= 0 +loose_handlersocket_general_log= 1 +loose_handlersocket_timeout= 30 +loose_handlersocket_close_table_interval=2 +open_files_limit= 4096 +loose_partition= 1 + +[ENV] +USE_GEOMETRY_TEST= 1 +USE_FULLTEXT_TEST= 1 +USE_HA_TEST= 1 +USE_GENERAL_LOG= 1 +USE_REPLICATION= 1 +MASTER_1_MYPORT= @mysqld.1.1.port +MASTER_1_HSRPORT= 20000 +MASTER_1_HSWPORT= 20001 +MASTER_1_MYSOCK= @mysqld.1.1.socket +MASTER_1_ENGINE_TYPE= Spider +#MASTER_1_ENGINE_TYPE= MyISAM +MASTER_1_ENGINE= ENGINE=Spider +MASTER_1_CHARSET= DEFAULT CHARSET=utf8 +MASTER_1_ENGINE2= ENGINE=MyISAM +MASTER_1_CHARSET2= DEFAULT CHARSET=utf8 +MASTER_1_CHARSET3= DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci + +STR_SEMICOLON= ; + +#The followings are set in include/init_xxx.inc files +# MASTER_1_COMMENT_2_1 +# MASTER_1_COMMENT2_2_1 +# MASTER_1_COMMENT3_2_1 +# MASTER_1_COMMENT4_2_1 +# MASTER_1_COMMENT5_2_1 +# MASTER_1_COMMENT_P_2_1 diff --git a/storage/spider/mysql-test/spider/feature/my_2_1.cnf b/storage/spider/mysql-test/spider/feature/my_2_1.cnf new file mode 100644 index 00000000000..24161645607 --- /dev/null +++ b/storage/spider/mysql-test/spider/feature/my_2_1.cnf @@ -0,0 +1,56 @@ +[mysqld.2.1] +loose_handlersocket_port= 20002 +loose_handlersocket_port_wr= 20003 +loose_handlersocket_threads= 2 +loose_handlersocket_threads_wr= 1 +loose_handlersocket_support_merge_table= 0 +loose_handlersocket_direct_update_mode= 2 +loose_handlersocket_unlimited_boundary= 65536 +loose_handlersocket_bulk_insert= 0 +loose_handlersocket_bulk_insert_timeout= 0 +loose_handlersocket_general_log= 1 +loose_handlersocket_timeout= 30 +loose_handlersocket_close_table_interval=2 +open_files_limit= 4096 + +[ENV] +USE_CHILD_GROUP2= 1 +OUTPUT_CHILD_GROUP2= 0 +CHILD2_1_MYPORT= @mysqld.2.1.port +CHILD2_1_HSRPORT= 20002 +CHILD2_1_HSWPORT= 20003 +CHILD2_1_MYSOCK= @mysqld.2.1.socket +CHILD2_1_ENGINE_TYPE= InnoDB +CHILD2_1_ENGINE= ENGINE=InnoDB +CHILD2_1_CHARSET= DEFAULT CHARSET=utf8 +CHILD2_1_CHARSET2= DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci +CHILD2_1_FT_MYPORT= @mysqld.2.1.port +CHILD2_1_FT_MYSOCK= @mysqld.2.1.socket +CHILD2_1_FT_ENGINE_TYPE= MyISAM +CHILD2_1_FT_ENGINE= ENGINE=MyISAM +CHILD2_1_FT_CHARSET= DEFAULT CHARSET=utf8 +CHILD2_1_GM_MYPORT= @mysqld.2.1.port +CHILD2_1_GM_MYSOCK= @mysqld.2.1.socket +CHILD2_1_GM_ENGINE_TYPE= MyISAM +CHILD2_1_GM_ENGINE= ENGINE=MyISAM +CHILD2_1_GM_CHARSET= DEFAULT CHARSET=utf8 + +#The followings are set in include/init_xxx.inc files +# CHILD2_1_DROP_TABLES +# CHILD2_1_CREATE_TABLES +# CHILD2_1_SELECT_TABLES +# CHILD2_1_DROP_TABLES2 +# CHILD2_1_CREATE_TABLES2 +# CHILD2_1_SELECT_TABLES2 +# CHILD2_1_DROP_TABLES3 +# CHILD2_1_CREATE_TABLES3 +# CHILD2_1_SELECT_TABLES3 +# CHILD2_1_DROP_TABLES4 +# CHILD2_1_CREATE_TABLES4 +# CHILD2_1_SELECT_TABLES4 +# CHILD2_1_DROP_TABLES5 +# CHILD2_1_CREATE_TABLES5 +# CHILD2_1_SELECT_TABLES5 +# CHILD2_1_DROP_TABLES6 +# CHILD2_1_CREATE_TABLES6 +# CHILD2_1_SELECT_TABLES6 diff --git a/storage/spider/mysql-test/spider/feature/my_2_2.cnf b/storage/spider/mysql-test/spider/feature/my_2_2.cnf new file mode 100644 index 00000000000..2d3c2a89a7d --- /dev/null +++ b/storage/spider/mysql-test/spider/feature/my_2_2.cnf @@ -0,0 +1,38 @@ +[mysqld.2.2] +loose_handlersocket_port= 20004 +loose_handlersocket_port_wr= 20005 +loose_handlersocket_threads= 2 +loose_handlersocket_threads_wr= 1 +loose_handlersocket_support_merge_table= 0 +loose_handlersocket_direct_update_mode= 2 +loose_handlersocket_unlimited_boundary= 65536 +loose_handlersocket_bulk_insert= 0 +loose_handlersocket_bulk_insert_timeout= 0 +loose_handlersocket_general_log= 1 +loose_handlersocket_timeout= 30 +loose_handlersocket_close_table_interval=2 +open_files_limit= 4096 + +[ENV] +CHILD2_2_MYPORT= @mysqld.2.2.port +CHILD2_2_HSRPORT= 20004 +CHILD2_2_HSWPORT= 20005 +CHILD2_2_MYSOCK= @mysqld.2.2.socket +CHILD2_2_ENGINE_TYPE= InnoDB +CHILD2_2_ENGINE= ENGINE=InnoDB +CHILD2_2_CHARSET= DEFAULT CHARSET=utf8 +CHILD2_2_FT_MYPORT= @mysqld.2.2.port +CHILD2_2_FT_MYSOCK= @mysqld.2.2.socket +CHILD2_2_FT_ENGINE_TYPE= MyISAM +CHILD2_2_FT_ENGINE= ENGINE=MyISAM +CHILD2_2_FT_CHARSET= DEFAULT CHARSET=utf8 +CHILD2_2_GM_MYPORT= @mysqld.2.2.port +CHILD2_2_GM_MYSOCK= @mysqld.2.2.socket +CHILD2_2_GM_ENGINE_TYPE= MyISAM +CHILD2_2_GM_ENGINE= ENGINE=MyISAM +CHILD2_2_GM_CHARSET= DEFAULT CHARSET=utf8 + +#The followings are set in include/init_xxx.inc files +# CHILD2_2_DROP_TABLES +# CHILD2_2_CREATE_TABLES +# CHILD2_2_SELECT_TABLES diff --git a/storage/spider/mysql-test/spider/feature/my_2_3.cnf b/storage/spider/mysql-test/spider/feature/my_2_3.cnf new file mode 100644 index 00000000000..024da651e0c --- /dev/null +++ b/storage/spider/mysql-test/spider/feature/my_2_3.cnf @@ -0,0 +1,8 @@ +[mysqld.2.3] + +[ENV] +CHILD2_3_MYPORT= @mysqld.2.3.port +CHILD2_3_MYSOCK= @mysqld.2.3.socket +CHILD2_3_ENGINE_TYPE= InnoDB +CHILD2_3_ENGINE= ENGINE=InnoDB +CHILD2_3_CHARSET= DEFAULT CHARSET=utf8 diff --git a/storage/spider/mysql-test/spider/feature/my_3_1.cnf b/storage/spider/mysql-test/spider/feature/my_3_1.cnf new file mode 100644 index 00000000000..fad21607789 --- /dev/null +++ b/storage/spider/mysql-test/spider/feature/my_3_1.cnf @@ -0,0 +1,11 @@ +[mysqld.3.1] +loose_partition= 1 + +[ENV] +USE_CHILD_GROUP3= 1 +OUTPUT_CHILD_GROUP3= 0 +CHILD3_1_MYPORT= @mysqld.3.1.port +CHILD3_1_MYSOCK= @mysqld.3.1.socket +CHILD3_1_ENGINE_TYPE= InnoDB +CHILD3_1_ENGINE= ENGINE=InnoDB +CHILD3_1_CHARSET= DEFAULT CHARSET=utf8 diff --git a/storage/spider/mysql-test/spider/feature/my_3_2.cnf b/storage/spider/mysql-test/spider/feature/my_3_2.cnf new file mode 100644 index 00000000000..6f027b6f525 --- /dev/null +++ b/storage/spider/mysql-test/spider/feature/my_3_2.cnf @@ -0,0 +1,9 @@ +[mysqld.3.2] +loose_partition= 1 + +[ENV] +CHILD3_2_MYPORT= @mysqld.3.2.port +CHILD3_2_MYSOCK= @mysqld.3.2.socket +CHILD3_2_ENGINE_TYPE= InnoDB +CHILD3_2_ENGINE= ENGINE=InnoDB +CHILD3_2_CHARSET= DEFAULT CHARSET=utf8 diff --git a/storage/spider/mysql-test/spider/feature/my_3_3.cnf b/storage/spider/mysql-test/spider/feature/my_3_3.cnf new file mode 100644 index 00000000000..fbb33694738 --- /dev/null +++ b/storage/spider/mysql-test/spider/feature/my_3_3.cnf @@ -0,0 +1,9 @@ +[mysqld.3.3] +loose_partition= 1 + +[ENV] +CHILD3_3_MYPORT= @mysqld.3.3.port +CHILD3_3_MYSOCK= @mysqld.3.3.socket +CHILD3_3_ENGINE_TYPE= InnoDB +CHILD3_3_ENGINE= ENGINE=InnoDB +CHILD3_3_CHARSET= DEFAULT CHARSET=utf8 diff --git a/storage/spider/mysql-test/spider/feature/my_4_1.cnf b/storage/spider/mysql-test/spider/feature/my_4_1.cnf new file mode 100644 index 00000000000..d1812a48b68 --- /dev/null +++ b/storage/spider/mysql-test/spider/feature/my_4_1.cnf @@ -0,0 +1,9 @@ +[mysqld.4.1] +loose_partition= 1 + +[ENV] +SLAVE1_1_MYPORT= @mysqld.4.1.port +SLAVE1_1_MYSOCK= @mysqld.4.1.socket +SLAVE1_1_ENGINE_TYPE= MyISAM +SLAVE1_1_ENGINE= ENGINE=MyISAM +SLAVE1_1_CHARSET= DEFAULT CHARSET=utf8 diff --git a/storage/spider/mysql-test/spider/feature/r/rewrite_partition.result b/storage/spider/mysql-test/spider/feature/r/rewrite_partition.result new file mode 100644 index 00000000000..4cfbcbe42a7 --- /dev/null +++ b/storage/spider/mysql-test/spider/feature/r/rewrite_partition.result @@ -0,0 +1,130 @@ +for master_1 +for child2 +child2_1 +child2_2 +child2_3 +for child3 +connection master_1; +INSERT INTO mysql.spider_rewrite_tables VALUES (1, '%', '%'); +INSERT INTO mysql.spider_rewrite_table_tables VALUES (1, 1, 'LIST', 'MOD(pkey,4)', '', '', 'srv "s_2_1"', ''); +INSERT INTO mysql.spider_rewrite_table_partitions VALUES +(1, 1, 1, 'pt1', '0,1', 'database "auto_test_remote"', ''), +(1, 1, 2, 'pt2', '2,3', 'database "auto_test_remote2"', ''); +select spider_flush_rewrite_cache(); +spider_flush_rewrite_cache() +1 + +this test is for MDEV-16967 + +drop and create databases +connection master_1; +CREATE DATABASE auto_test_local; +USE auto_test_local; +connection child2_1; +SET @old_log_output = @@global.log_output; +SET GLOBAL log_output = 'TABLE,FILE'; +CREATE DATABASE auto_test_remote; +CREATE DATABASE auto_test_remote2; +CREATE DATABASE auto_test_remote3; +CREATE DATABASE auto_test_remote4; + +create table and insert +connection child2_1; +TRUNCATE TABLE mysql.general_log; +connection master_1; +CREATE TABLE tbl_a ( +pkey int NOT NULL, +PRIMARY KEY (pkey) +) CHILD2_1_ENGINE CHILD2_1_CHARSET +SHOW CREATE TABLE tbl_a; +Table Create Table +tbl_a CREATE TABLE `tbl_a` ( + `pkey` int(11) NOT NULL, + PRIMARY KEY (`pkey`) +) ENGINE=SPIDER DEFAULT CHARSET=utf8 CONNECTION='srv "s_2_1"' + PARTITION BY LIST (`pkey` MOD 4) +(PARTITION `pt1` VALUES IN (0,1) CONNECTION = 'table"tbl_a",database "auto_test_remote"' ENGINE = SPIDER, + PARTITION `pt2` VALUES IN (2,3) CONNECTION = 'table"tbl_a",database "auto_test_remote2"' ENGINE = SPIDER) +INSERT INTO tbl_a (pkey) VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); + +select test +SELECT * FROM tbl_a ORDER BY pkey; +pkey +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +connection child2_1; +SELECT argument FROM mysql.general_log; +argument +root@localhost as anonymous on +set session time_zone = '+00:00' +SET NAMES utf8 +auto_test_remote +CREATE TABLE `auto_test_remote`.`tbl_a` (pkey INT NOT NULL ,PRIMARY KEY (pkey ))ENGINE InnoDB charset utf8 +auto_test_remote2 +CREATE TABLE `auto_test_remote2`.`tbl_a` (pkey INT NOT NULL ,PRIMARY KEY (pkey ))ENGINE InnoDB charset utf8 + +root@localhost as anonymous on +set session time_zone = '+00:00' +SET NAMES utf8 +auto_test_remote +show table status from `auto_test_remote` like 'tbl_a' +auto_test_remote2 +show table status from `auto_test_remote2` like 'tbl_a' +auto_test_remote +show index from `auto_test_remote`.`tbl_a` +set session transaction isolation level repeatable read;set session autocommit = 1;set session sql_log_off = 0;start transaction +insert into `auto_test_remote`.`tbl_a`(`pkey`)values(0),(1),(4),(5),(8),(9) +auto_test_remote2 +insert into `auto_test_remote2`.`tbl_a`(`pkey`)values(2),(3),(6),(7) +commit + +root@localhost as anonymous on +set session transaction isolation level repeatable read;set session autocommit = 1;set session sql_log_off = 0;set session time_zone = '+00:00';start transaction +SET NAMES utf8 +auto_test_remote +select `pkey` from `auto_test_remote`.`tbl_a` order by `pkey` +auto_test_remote2 +select `pkey` from `auto_test_remote2`.`tbl_a` order by `pkey` +commit + +SELECT argument FROM mysql.general_log +SELECT pkey FROM auto_test_remote.tbl_a ORDER BY pkey ; +SELECT pkey FROM auto_test_remote2.tbl_a ORDER BY pkey; +pkey +0 +1 +4 +5 +8 +9 +pkey +2 +3 +6 +7 + +deinit +connection master_1; +DROP DATABASE IF EXISTS auto_test_local; +connection child2_1; +DROP DATABASE IF EXISTS auto_test_remote; +DROP DATABASE IF EXISTS auto_test_remote2; +DROP DATABASE IF EXISTS auto_test_remote3; +DROP DATABASE IF EXISTS auto_test_remote4; +SET GLOBAL log_output = @old_log_output; +for master_1 +for child2 +child2_1 +child2_2 +child2_3 +for child3 + +end of test diff --git a/storage/spider/mysql-test/spider/feature/r/rewrite_simple.result b/storage/spider/mysql-test/spider/feature/r/rewrite_simple.result new file mode 100644 index 00000000000..6ebf38da163 --- /dev/null +++ b/storage/spider/mysql-test/spider/feature/r/rewrite_simple.result @@ -0,0 +1,112 @@ +for master_1 +for child2 +child2_1 +child2_2 +child2_3 +for child3 +connection master_1; +INSERT INTO mysql.spider_rewrite_tables VALUES (1, '%', '%'); +INSERT INTO mysql.spider_rewrite_table_tables VALUES (1, 1, '', '', '', '', 'srv "s_2_1"', ''); +select spider_flush_rewrite_cache(); +spider_flush_rewrite_cache() +1 + +this test is for MDEV-16967 + +drop and create databases +connection master_1; +CREATE DATABASE auto_test_local; +USE auto_test_local; +connection child2_1; +SET @old_log_output = @@global.log_output; +SET GLOBAL log_output = 'TABLE,FILE'; +CREATE DATABASE auto_test_remote; +CREATE DATABASE auto_test_remote2; +CREATE DATABASE auto_test_remote3; +CREATE DATABASE auto_test_remote4; + +create table and insert +connection child2_1; +TRUNCATE TABLE mysql.general_log; +connection master_1; +CREATE TABLE tbl_a ( +pkey int NOT NULL, +PRIMARY KEY (pkey) +) CHILD2_1_ENGINE CHILD2_1_CHARSET +SHOW CREATE TABLE tbl_a; +Table Create Table +tbl_a CREATE TABLE `tbl_a` ( + `pkey` int(11) NOT NULL, + PRIMARY KEY (`pkey`) +) ENGINE=SPIDER DEFAULT CHARSET=utf8 CONNECTION='table"tbl_a",srv "s_2_1"' +INSERT INTO tbl_a (pkey) VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); + +select test +SELECT * FROM tbl_a ORDER BY pkey; +pkey +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +connection child2_1; +SELECT argument FROM mysql.general_log; +argument +root@localhost as anonymous on +set session time_zone = '+00:00' +SET NAMES utf8 +auto_test_remote +CREATE TABLE `auto_test_remote`.`tbl_a` (pkey INT NOT NULL ,PRIMARY KEY (pkey ))ENGINE InnoDB charset utf8 + +root@localhost as anonymous on +set session time_zone = '+00:00' +SET NAMES utf8 +auto_test_remote +show table status from `auto_test_remote` like 'tbl_a' +set session transaction isolation level repeatable read;set session autocommit = 1;set session sql_log_off = 0;start transaction +insert into `auto_test_remote`.`tbl_a`(`pkey`)values(0),(1),(2),(3),(4),(5),(6),(7),(8),(9) +commit + +root@localhost as anonymous on +set session transaction isolation level repeatable read;set session autocommit = 1;set session sql_log_off = 0;set session time_zone = '+00:00';start transaction +SET NAMES utf8 +auto_test_remote +select t0.`pkey` `pkey` from `auto_test_remote`.`tbl_a` t0 order by `pkey` +commit + +SELECT argument FROM mysql.general_log +SELECT pkey FROM auto_test_remote.tbl_a ORDER BY pkey; +pkey +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 + +deinit +connection master_1; +DROP DATABASE IF EXISTS auto_test_local; +connection child2_1; +DROP DATABASE IF EXISTS auto_test_remote; +DROP DATABASE IF EXISTS auto_test_remote2; +DROP DATABASE IF EXISTS auto_test_remote3; +DROP DATABASE IF EXISTS auto_test_remote4; +SET GLOBAL log_output = @old_log_output; +for master_1 +for child2 +child2_1 +child2_2 +child2_3 +for child3 + +end of test diff --git a/storage/spider/mysql-test/spider/feature/r/rewrite_subpartition.result b/storage/spider/mysql-test/spider/feature/r/rewrite_subpartition.result new file mode 100644 index 00000000000..a30656c9ccc --- /dev/null +++ b/storage/spider/mysql-test/spider/feature/r/rewrite_subpartition.result @@ -0,0 +1,160 @@ +for master_1 +for child2 +child2_1 +child2_2 +child2_3 +for child3 +connection master_1; +INSERT INTO mysql.spider_rewrite_tables VALUES (1, '%', '%'); +INSERT INTO mysql.spider_rewrite_table_tables VALUES (1, 1, 'RANGE', 'pkey', 'HASH', 'pkey', 'srv "s_2_1"', ''); +INSERT INTO mysql.spider_rewrite_table_partitions VALUES +(1, 1, 1, 'pt1', '5', '', ''), +(1, 1, 2, 'pt2', 'MAXVALUE', '', ''); +INSERT INTO mysql.spider_rewrite_table_subpartitions VALUES +(1, 1, 1, 1, 'spt1', '', 'database "auto_test_remote"', ''), +(1, 1, 1, 2, 'spt2', '', 'database "auto_test_remote2"', ''), +(1, 1, 2, 1, 'spt3', '', 'database "auto_test_remote3"', ''), +(1, 1, 2, 2, 'spt4', '', 'database "auto_test_remote4"', ''); +select spider_flush_rewrite_cache(); +spider_flush_rewrite_cache() +1 + +this test is for MDEV-16967 + +drop and create databases +connection master_1; +CREATE DATABASE auto_test_local; +USE auto_test_local; +connection child2_1; +SET @old_log_output = @@global.log_output; +SET GLOBAL log_output = 'TABLE,FILE'; +CREATE DATABASE auto_test_remote; +CREATE DATABASE auto_test_remote2; +CREATE DATABASE auto_test_remote3; +CREATE DATABASE auto_test_remote4; + +create table and insert +connection child2_1; +TRUNCATE TABLE mysql.general_log; +connection master_1; +CREATE TABLE tbl_a ( +pkey int NOT NULL, +PRIMARY KEY (pkey) +) CHILD2_1_ENGINE CHILD2_1_CHARSET +SHOW CREATE TABLE tbl_a; +Table Create Table +tbl_a CREATE TABLE `tbl_a` ( + `pkey` int(11) NOT NULL, + PRIMARY KEY (`pkey`) +) ENGINE=SPIDER DEFAULT CHARSET=utf8 CONNECTION='srv "s_2_1"' + PARTITION BY RANGE (`pkey`) +SUBPARTITION BY HASH (`pkey`) +(PARTITION `pt1` VALUES LESS THAN (5) + (SUBPARTITION `spt1` CONNECTION = 'table"tbl_a",database "auto_test_remote"' ENGINE = SPIDER, + SUBPARTITION `spt2` CONNECTION = 'table"tbl_a",database "auto_test_remote2"' ENGINE = SPIDER), + PARTITION `pt2` VALUES LESS THAN MAXVALUE + (SUBPARTITION `spt3` CONNECTION = 'table"tbl_a",database "auto_test_remote3"' ENGINE = SPIDER, + SUBPARTITION `spt4` CONNECTION = 'table"tbl_a",database "auto_test_remote4"' ENGINE = SPIDER)) +INSERT INTO tbl_a (pkey) VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); + +select test +SELECT * FROM tbl_a ORDER BY pkey; +pkey +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +connection child2_1; +SELECT argument FROM mysql.general_log; +argument +root@localhost as anonymous on +set session time_zone = '+00:00' +SET NAMES utf8 +auto_test_remote +CREATE TABLE `auto_test_remote`.`tbl_a` (pkey INT NOT NULL ,PRIMARY KEY (pkey ))ENGINE InnoDB charset utf8 +auto_test_remote2 +CREATE TABLE `auto_test_remote2`.`tbl_a` (pkey INT NOT NULL ,PRIMARY KEY (pkey ))ENGINE InnoDB charset utf8 +auto_test_remote3 +CREATE TABLE `auto_test_remote3`.`tbl_a` (pkey INT NOT NULL ,PRIMARY KEY (pkey ))ENGINE InnoDB charset utf8 +auto_test_remote4 +CREATE TABLE `auto_test_remote4`.`tbl_a` (pkey INT NOT NULL ,PRIMARY KEY (pkey ))ENGINE InnoDB charset utf8 + +root@localhost as anonymous on +set session time_zone = '+00:00' +SET NAMES utf8 +auto_test_remote +show table status from `auto_test_remote` like 'tbl_a' +auto_test_remote2 +show table status from `auto_test_remote2` like 'tbl_a' +auto_test_remote3 +show table status from `auto_test_remote3` like 'tbl_a' +auto_test_remote4 +show table status from `auto_test_remote4` like 'tbl_a' +auto_test_remote +show index from `auto_test_remote`.`tbl_a` +set session transaction isolation level repeatable read;set session autocommit = 1;set session sql_log_off = 0;start transaction +insert into `auto_test_remote`.`tbl_a`(`pkey`)values(0),(2),(4) +auto_test_remote2 +insert into `auto_test_remote2`.`tbl_a`(`pkey`)values(1),(3) +auto_test_remote3 +insert into `auto_test_remote3`.`tbl_a`(`pkey`)values(6),(8) +auto_test_remote4 +insert into `auto_test_remote4`.`tbl_a`(`pkey`)values(5),(7),(9) +commit + +root@localhost as anonymous on +set session transaction isolation level repeatable read;set session autocommit = 1;set session sql_log_off = 0;set session time_zone = '+00:00';start transaction +SET NAMES utf8 +auto_test_remote +select `pkey` from `auto_test_remote`.`tbl_a` order by `pkey` +auto_test_remote2 +select `pkey` from `auto_test_remote2`.`tbl_a` order by `pkey` +auto_test_remote3 +select `pkey` from `auto_test_remote3`.`tbl_a` order by `pkey` +auto_test_remote4 +select `pkey` from `auto_test_remote4`.`tbl_a` order by `pkey` +commit + +SELECT argument FROM mysql.general_log +SELECT pkey FROM auto_test_remote.tbl_a ORDER BY pkey ; +SELECT pkey FROM auto_test_remote2.tbl_a ORDER BY pkey ; +SELECT pkey FROM auto_test_remote3.tbl_a ORDER BY pkey ; +SELECT pkey FROM auto_test_remote4.tbl_a ORDER BY pkey; +pkey +0 +2 +4 +pkey +1 +3 +pkey +6 +8 +pkey +5 +7 +9 + +deinit +connection master_1; +DROP DATABASE IF EXISTS auto_test_local; +connection child2_1; +DROP DATABASE IF EXISTS auto_test_remote; +DROP DATABASE IF EXISTS auto_test_remote2; +DROP DATABASE IF EXISTS auto_test_remote3; +DROP DATABASE IF EXISTS auto_test_remote4; +SET GLOBAL log_output = @old_log_output; +for master_1 +for child2 +child2_1 +child2_2 +child2_3 +for child3 + +end of test diff --git a/storage/spider/mysql-test/spider/feature/suite.opt b/storage/spider/mysql-test/spider/feature/suite.opt new file mode 100644 index 00000000000..672a3b37d4f --- /dev/null +++ b/storage/spider/mysql-test/spider/feature/suite.opt @@ -0,0 +1 @@ +--loose-innodb --loose-skip-performance-schema diff --git a/storage/spider/mysql-test/spider/feature/suite.pm b/storage/spider/mysql-test/spider/feature/suite.pm new file mode 100644 index 00000000000..f106147deb6 --- /dev/null +++ b/storage/spider/mysql-test/spider/feature/suite.pm @@ -0,0 +1,12 @@ +package My::Suite::Spider; + +@ISA = qw(My::Suite); + +return "No Spider engine" unless $ENV{HA_SPIDER_SO}; +return "Not run for embedded server" if $::opt_embedded_server; +return "Test needs --big-test" unless $::opt_big_test; + +sub is_default { 1 } + +bless { }; + diff --git a/storage/spider/mysql-test/spider/feature/t/rewrite.inc b/storage/spider/mysql-test/spider/feature/t/rewrite.inc new file mode 100644 index 00000000000..37b96ddc79a --- /dev/null +++ b/storage/spider/mysql-test/spider/feature/t/rewrite.inc @@ -0,0 +1,60 @@ +--echo +--echo drop and create databases + +--connection master_1 +--disable_warnings +CREATE DATABASE auto_test_local; +USE auto_test_local; + +--connection child2_1 +SET @old_log_output = @@global.log_output; +SET GLOBAL log_output = 'TABLE,FILE'; +CREATE DATABASE auto_test_remote; +CREATE DATABASE auto_test_remote2; +CREATE DATABASE auto_test_remote3; +CREATE DATABASE auto_test_remote4; +--enable_warnings + +--echo +--echo create table and insert + +--connection child2_1 +TRUNCATE TABLE mysql.general_log; + +--connection master_1 +--disable_query_log +echo CREATE TABLE tbl_a ( + pkey int NOT NULL, + PRIMARY KEY (pkey) +) CHILD2_1_ENGINE CHILD2_1_CHARSET; +eval CREATE TABLE tbl_a ( + pkey int NOT NULL, + PRIMARY KEY (pkey) +) $CHILD2_1_ENGINE $CHILD2_1_CHARSET; +--enable_query_log +SHOW CREATE TABLE tbl_a; +INSERT INTO tbl_a (pkey) VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); + +--echo +--echo select test +SELECT * FROM tbl_a ORDER BY pkey; + +--connection child2_1 +eval $CHILD2_1_SELECT_ARGUMENT1; +eval $CHILD2_1_SELECT_TABLES; + +--echo +--echo deinit +--disable_warnings + +--connection master_1 +DROP DATABASE IF EXISTS auto_test_local; + +--connection child2_1 +DROP DATABASE IF EXISTS auto_test_remote; +DROP DATABASE IF EXISTS auto_test_remote2; +DROP DATABASE IF EXISTS auto_test_remote3; +DROP DATABASE IF EXISTS auto_test_remote4; +SET GLOBAL log_output = @old_log_output; + +--enable_warnings diff --git a/storage/spider/mysql-test/spider/feature/t/rewrite_partition.cnf b/storage/spider/mysql-test/spider/feature/t/rewrite_partition.cnf new file mode 100644 index 00000000000..05dfd8a0bce --- /dev/null +++ b/storage/spider/mysql-test/spider/feature/t/rewrite_partition.cnf @@ -0,0 +1,3 @@ +!include include/default_mysqld.cnf +!include ../my_1_1.cnf +!include ../my_2_1.cnf diff --git a/storage/spider/mysql-test/spider/feature/t/rewrite_partition.test b/storage/spider/mysql-test/spider/feature/t/rewrite_partition.test new file mode 100644 index 00000000000..0e32bb7ae13 --- /dev/null +++ b/storage/spider/mysql-test/spider/feature/t/rewrite_partition.test @@ -0,0 +1,12 @@ +--source ../include/rewrite_partition_init.inc +--echo +--echo this test is for MDEV-16967 +if (!$HAVE_PARTITION) +{ + --source ../include/rewrite_partition_deinit.inc + skip Test requires partitioning; +} +--source rewrite.inc +--source ../include/rewrite_partition_deinit.inc +--echo +--echo end of test diff --git a/storage/spider/mysql-test/spider/feature/t/rewrite_simple.cnf b/storage/spider/mysql-test/spider/feature/t/rewrite_simple.cnf new file mode 100644 index 00000000000..05dfd8a0bce --- /dev/null +++ b/storage/spider/mysql-test/spider/feature/t/rewrite_simple.cnf @@ -0,0 +1,3 @@ +!include include/default_mysqld.cnf +!include ../my_1_1.cnf +!include ../my_2_1.cnf diff --git a/storage/spider/mysql-test/spider/feature/t/rewrite_simple.test b/storage/spider/mysql-test/spider/feature/t/rewrite_simple.test new file mode 100644 index 00000000000..a9e7307524f --- /dev/null +++ b/storage/spider/mysql-test/spider/feature/t/rewrite_simple.test @@ -0,0 +1,7 @@ +--source ../include/rewrite_simple_init.inc +--echo +--echo this test is for MDEV-16967 +--source rewrite.inc +--source ../include/rewrite_simple_deinit.inc +--echo +--echo end of test diff --git a/storage/spider/mysql-test/spider/feature/t/rewrite_subpartition.cnf b/storage/spider/mysql-test/spider/feature/t/rewrite_subpartition.cnf new file mode 100644 index 00000000000..05dfd8a0bce --- /dev/null +++ b/storage/spider/mysql-test/spider/feature/t/rewrite_subpartition.cnf @@ -0,0 +1,3 @@ +!include include/default_mysqld.cnf +!include ../my_1_1.cnf +!include ../my_2_1.cnf diff --git a/storage/spider/mysql-test/spider/feature/t/rewrite_subpartition.test b/storage/spider/mysql-test/spider/feature/t/rewrite_subpartition.test new file mode 100644 index 00000000000..c66de169512 --- /dev/null +++ b/storage/spider/mysql-test/spider/feature/t/rewrite_subpartition.test @@ -0,0 +1,12 @@ +--source ../include/rewrite_subpartition_init.inc +--echo +--echo this test is for MDEV-16967 +if (!$HAVE_PARTITION) +{ + --source ../include/rewrite_subpartition_deinit.inc + skip Test requires partitioning; +} +--source rewrite.inc +--source ../include/rewrite_subpartition_deinit.inc +--echo +--echo end of test diff --git a/storage/spider/mysql-test/spider/include/checksum_table_with_quick_mode_3_deinit.inc b/storage/spider/mysql-test/spider/include/checksum_table_with_quick_mode_3_deinit.inc index 7db871c700f..d551f5a4af3 100644 --- a/storage/spider/mysql-test/spider/include/checksum_table_with_quick_mode_3_deinit.inc +++ b/storage/spider/mysql-test/spider/include/checksum_table_with_quick_mode_3_deinit.inc @@ -1,3 +1,5 @@ +--let $MASTER_1_COMMENT_2_1= $MASTER_1_COMMENT_2_1_BACKUP +--let $CHILD2_1_DROP_TABLES= $CHILD2_1_DROP_TABLES_BACKUP --let $CHILD2_1_CREATE_TABLES= $CHILD2_1_CREATE_TABLES_BACKUP --let $CHILD2_1_SELECT_TABLES= $CHILD2_1_SELECT_TABLES_BACKUP --let $OUTPUT_CHILD_GROUP2= $OUTPUT_CHILD_GROUP2_BACKUP diff --git a/storage/spider/mysql-test/spider/include/deinit_spider.inc b/storage/spider/mysql-test/spider/include/deinit_spider.inc index 3609551e169..d915a998000 100644 --- a/storage/spider/mysql-test/spider/include/deinit_spider.inc +++ b/storage/spider/mysql-test/spider/include/deinit_spider.inc @@ -1,8 +1,38 @@ +let $SERVER_NAME= + `SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(version(), '-', 2), '-', -1)`; +let $SERVER_MAJOR_VERSION= + `SELECT SUBSTRING_INDEX(version(), '.', 1)`; +let $SERVER_MINOR_VERSION= + `SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(version(), '.', 2), '.', -1)`; +let $PLUGIN_VERSION= + `SELECT SUBSTRING_INDEX(plugin_version, '.', 1) + FROM information_schema.plugins + WHERE plugin_name = 'SPIDER'`; +if (`SELECT IF($PLUGIN_VERSION = 3, 1, 0)`) +{ + let $HAS_REWRITE= + `SELECT IF (STRCMP('$SERVER_NAME', 'MariaDB') = 0, + IF ($SERVER_MAJOR_VERSION = 10, + IF ($SERVER_MINOR_VERSION < 4, 0, 1), + IF ($SERVER_MAJOR_VERSION < 10, 0, 1)), + 0)`; + if ($HAS_REWRITE) + { + DROP FUNCTION spider_flush_rewrite_cache; + UNINSTALL PLUGIN spider_rewrite; + DROP TABLE IF EXISTS mysql.spider_rewrite_tables; + DROP TABLE IF EXISTS mysql.spider_rewrite_table_tables; + DROP TABLE IF EXISTS mysql.spider_rewrite_table_partitions; + DROP TABLE IF EXISTS mysql.spider_rewrite_table_subpartitions; + DROP TABLE IF EXISTS mysql.spider_rewritten_tables; + } +} DROP FUNCTION spider_direct_sql; DROP FUNCTION spider_bg_direct_sql; DROP FUNCTION spider_ping_table; DROP FUNCTION spider_copy_tables; DROP FUNCTION spider_flush_table_mon_cache; +UNINSTALL PLUGIN spider_alloc_mem; UNINSTALL PLUGIN spider; DROP TABLE IF EXISTS mysql.spider_xa; DROP TABLE IF EXISTS mysql.spider_xa_member; diff --git a/storage/spider/mysql-test/spider/include/init_spider.inc b/storage/spider/mysql-test/spider/include/init_spider.inc index 1da1ec970b5..67d94542baf 100644 --- a/storage/spider/mysql-test/spider/include/init_spider.inc +++ b/storage/spider/mysql-test/spider/include/init_spider.inc @@ -3,6 +3,7 @@ let $VERSION_COMPILE_OS_WIN= if ($VERSION_COMPILE_OS_WIN) { INSTALL PLUGIN spider SONAME 'ha_spider.dll'; + INSTALL PLUGIN spider_alloc_mem SONAME 'ha_spider.dll'; CREATE FUNCTION spider_direct_sql RETURNS INT SONAME 'ha_spider.dll'; CREATE AGGREGATE FUNCTION spider_bg_direct_sql RETURNS INT SONAME 'ha_spider.dll'; CREATE FUNCTION spider_ping_table RETURNS INT SONAME 'ha_spider.dll'; @@ -54,6 +55,7 @@ if ($VERSION_COMPILE_OS_WIN) if (!$VERSION_COMPILE_OS_WIN) { INSTALL PLUGIN spider SONAME 'ha_spider.so'; + INSTALL PLUGIN spider_alloc_mem SONAME 'ha_spider.so'; CREATE FUNCTION spider_direct_sql RETURNS INT SONAME 'ha_spider.so'; CREATE AGGREGATE FUNCTION spider_bg_direct_sql RETURNS INT SONAME 'ha_spider.so'; CREATE FUNCTION spider_ping_table RETURNS INT SONAME 'ha_spider.so'; @@ -420,6 +422,80 @@ if (`SELECT IF($PLUGIN_VERSION = 3, 1, 0)`) cardinality bigint not null default 0, primary key (db_name, table_name, key_seq) ) ENGINE=$ENGINE_NAME DEFAULT CHARSET=utf8 COLLATE=utf8_bin; + + let $HAS_REWRITE= + `SELECT IF (STRCMP('$SERVER_NAME', 'MariaDB') = 0, + IF ($SERVER_MAJOR_VERSION = 10, + IF ($SERVER_MINOR_VERSION < 4, 0, 1), + IF ($SERVER_MAJOR_VERSION < 10, 0, 1)), + 0)`; + if ($HAS_REWRITE) + { + DROP TABLE IF EXISTS mysql.spider_rewrite_tables; + CREATE TABLE mysql.spider_rewrite_tables( + table_id bigint unsigned not null auto_increment, + db_name char(64) not null default '', + table_name char(64) not null default '', + primary key (table_id), + unique uk1(db_name, table_name) + ) engine=Aria transactional=1 default charset=utf8 collate=utf8_bin; + DROP TABLE IF EXISTS mysql.spider_rewrite_table_partitions; + CREATE TABLE mysql.spider_rewrite_table_tables( + table_id bigint unsigned not null, + partition_id bigint unsigned not null auto_increment, + partition_method varchar(18) default '', + partition_expression varchar(64) default '', + subpartition_method varchar(12) default '', + subpartition_expression varchar(64) default '', + connection_str text not null default '', + comment_str text not null default '', + primary key (table_id, partition_id), + unique uk1(table_id, partition_method, partition_expression, subpartition_method, subpartition_expression) + ) engine=Aria transactional=1 default charset=utf8 collate=utf8_bin; + DROP TABLE IF EXISTS mysql.spider_rewrite_table_partition_partitions; + CREATE TABLE mysql.spider_rewrite_table_partitions( + table_id bigint unsigned not null, + partition_id bigint unsigned not null, + partition_ordinal_position bigint unsigned not null auto_increment, + partition_name varchar(64) not null default '', + partition_description varchar(64) not null default '', + connection_str text not null default '', + comment_str text not null default '', + primary key (table_id, partition_id, partition_ordinal_position), + unique key uk1 (table_id, partition_id, partition_name) + ) engine=Aria transactional=1 default charset=utf8 collate=utf8_bin; + DROP TABLE IF EXISTS mysql.spider_rewrite_table_partition_subpartitions; + CREATE TABLE mysql.spider_rewrite_table_subpartitions( + table_id bigint unsigned not null, + partition_id bigint unsigned not null, + partition_ordinal_position bigint unsigned not null, + subpartition_ordinal_position bigint unsigned not null auto_increment, + subpartition_name varchar(64) not null default '', + subpartition_description varchar(64) not null default '', + connection_str text not null default '', + comment_str text not null default '', + primary key (table_id, partition_id, partition_ordinal_position, subpartition_ordinal_position), + unique key uk1 (table_id, partition_id, partition_ordinal_position, subpartition_name) + ) engine=Aria transactional=1 default charset=utf8 collate=utf8_bin; + DROP TABLE IF EXISTS mysql.spider_rewritten_tables; + CREATE TABLE mysql.spider_rewritten_tables( + db_name char(64) not null, + table_name char(64) not null, + table_id bigint unsigned not null, + partition_id bigint unsigned not null, + primary key (db_name, table_name, table_id, partition_id) + ) engine=Aria transactional=1 default charset=utf8 collate=utf8_bin; + if ($VERSION_COMPILE_OS_WIN) + { + INSTALL PLUGIN spider_rewrite SONAME 'ha_spider.dll'; + CREATE FUNCTION spider_flush_rewrite_cache RETURNS INT SONAME 'ha_spider.dll'; + } + if (!$VERSION_COMPILE_OS_WIN) + { + INSTALL PLUGIN spider_rewrite SONAME 'ha_spider.so'; + CREATE FUNCTION spider_flush_rewrite_cache RETURNS INT SONAME 'ha_spider.so'; + } + } } SET spider_internal_sql_log_off= 0; diff --git a/storage/spider/mysql-test/spider/r/show_system_tables.result b/storage/spider/mysql-test/spider/r/show_system_tables.result index 67411862e00..85ceb24bf32 100644 --- a/storage/spider/mysql-test/spider/r/show_system_tables.result +++ b/storage/spider/mysql-test/spider/r/show_system_tables.result @@ -15,6 +15,11 @@ WHERE table_schema = 'mysql' AND table_name like '%spider_%'; table_name engine spider_link_failed_log Aria spider_link_mon_servers Aria +spider_rewrite_table_partitions Aria +spider_rewrite_table_subpartitions Aria +spider_rewrite_table_tables Aria +spider_rewrite_tables Aria +spider_rewritten_tables Aria spider_table_crd Aria spider_table_position_for_recovery Aria spider_table_sts Aria diff --git a/storage/spider/scripts/install_spider.sql b/storage/spider/scripts/install_spider.sql index 904288f4237..cdc944ed600 100644 --- a/storage/spider/scripts/install_spider.sql +++ b/storage/spider/scripts/install_spider.sql @@ -1,4 +1,4 @@ -# Copyright (C) 2010-2018 Kentoku Shiba +# Copyright (C) 2010-2019 Kentoku Shiba # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -481,6 +481,57 @@ begin alter table mysql.spider_xa_member engine=Aria transactional=1; end if; + + /* table for ddl pushdown */ + create table if not exists mysql.spider_rewrite_tables( + table_id bigint unsigned not null auto_increment, + db_name char(64) not null default '', + table_name char(64) not null default '', + primary key (table_id), + unique uk1(db_name, table_name) + ) engine=Aria transactional=1 default charset=utf8 collate=utf8_bin; + create table if not exists mysql.spider_rewrite_table_tables( + table_id bigint unsigned not null, + partition_id bigint unsigned not null auto_increment, + partition_method varchar(18) default '', + partition_expression varchar(64) default '', + subpartition_method varchar(12) default '', + subpartition_expression varchar(64) default '', + connection_str text not null default '', + comment_str text not null default '', + primary key (table_id, partition_id), + unique uk1(table_id, partition_method, partition_expression, subpartition_method, subpartition_expression) + ) engine=Aria transactional=1 default charset=utf8 collate=utf8_bin; + create table if not exists mysql.spider_rewrite_table_partitions( + table_id bigint unsigned not null, + partition_id bigint unsigned not null, + partition_ordinal_position bigint unsigned not null auto_increment, + partition_name varchar(64) not null default '', + partition_description varchar(64) not null default '', + connection_str text not null default '', + comment_str text not null default '', + primary key (table_id, partition_id, partition_ordinal_position), + unique key uk1 (table_id, partition_id, partition_name) + ) engine=Aria transactional=1 default charset=utf8 collate=utf8_bin; + create table if not exists mysql.spider_rewrite_table_subpartitions( + table_id bigint unsigned not null, + partition_id bigint unsigned not null, + partition_ordinal_position bigint unsigned not null, + subpartition_ordinal_position bigint unsigned not null auto_increment, + subpartition_name varchar(64) not null default '', + subpartition_description varchar(64) not null default '', + connection_str text not null default '', + comment_str text not null default '', + primary key (table_id, partition_id, partition_ordinal_position, subpartition_ordinal_position), + unique key uk1 (table_id, partition_id, partition_ordinal_position, subpartition_name) + ) engine=Aria transactional=1 default charset=utf8 collate=utf8_bin; + create table if not exists mysql.spider_rewritten_tables( + db_name char(64) not null, + table_name char(64) not null, + table_id bigint unsigned not null, + partition_id bigint unsigned not null, + primary key (db_name, table_name, table_id, partition_id) + ) engine=Aria transactional=1 default charset=utf8 collate=utf8_bin; end if; end;// delimiter ; @@ -566,7 +617,6 @@ begin create function spider_copy_tables returns int soname 'ha_spider.dll'; end if; end if; - set @have_spider_flush_table_mon_cache_udf := 0; select @have_spider_flush_table_mon_cache_udf := 1 from mysql.func where name = 'spider_flush_table_mon_cache'; if @have_spider_flush_table_mon_cache_udf = 0 then @@ -576,7 +626,43 @@ begin create function spider_flush_table_mon_cache returns int soname 'ha_spider.dll'; end if; end if; - + if @server_name = 'MariaDB' and + ( + @server_major_version > 10 or + ( + @server_major_version = 10 and + @server_minor_version >= 4 + ) + ) + then + set @have_spider_i_s_rewrite_plugin := 0; + select @have_spider_i_s_rewrite_plugin := 1 from INFORMATION_SCHEMA.plugins where PLUGIN_NAME = 'SPIDER_REWRITE'; + set @have_spider_rewrite_plugin := 0; + select @have_spider_rewrite_plugin := 1 from mysql.plugin where name = 'spider_rewrite'; + if @have_spider_i_s_rewrite_plugin = 0 then + if @have_spider_rewrite_plugin = 1 then + -- spider_rewrite plugin is present in mysql.plugin but not in + -- information_schema.plugins. Remove spider_rewrite plugin entry + -- in mysql.plugin first. + delete from mysql.plugin where name = 'spider_rewrite'; + end if; + -- Install spider_rewrite plugin + if @win_plugin = 0 then + install plugin spider_rewrite soname 'ha_spider.so'; + else + install plugin spider_rewrite soname 'ha_spider.dll'; + end if; + end if; + set @have_spider_flush_rewrite_cache_udf := 0; + select @have_spider_flush_rewrite_cache_udf := 1 from mysql.func where name = 'spider_flush_rewrite_cache'; + if @have_spider_flush_rewrite_cache_udf = 0 then + if @win_plugin = 0 then + create function spider_flush_rewrite_cache returns int soname 'ha_spider.so'; + else + create function spider_flush_rewrite_cache returns int soname 'ha_spider.dll'; + end if; + end if; + end if; end;// delimiter ; call mysql.spider_plugin_installer; diff --git a/storage/spider/spd_db_conn.cc b/storage/spider/spd_db_conn.cc index c2cd4beccdb..50e667c7009 100644 --- a/storage/spider/spd_db_conn.cc +++ b/storage/spider/spd_db_conn.cc @@ -948,23 +948,29 @@ int spider_db_query_with_set_names( int link_idx ) { int error_num; + bool mta_conn_mutex_lock_already = conn->mta_conn_mutex_lock_already; + bool mta_conn_mutex_unlock_later = conn->mta_conn_mutex_unlock_later; SPIDER_SHARE *share = spider->share; spider_db_handler *dbton_hdl = spider->dbton_handler[conn->dbton_id]; DBUG_ENTER("spider_db_query_with_set_names"); -/* - pthread_mutex_lock(&conn->mta_conn_mutex); - SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos); -*/ - conn->need_mon = &spider->need_mons[link_idx]; - conn->mta_conn_mutex_lock_already = TRUE; + if (!mta_conn_mutex_lock_already) + { + pthread_mutex_lock(&conn->mta_conn_mutex); + SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos); + conn->need_mon = &spider->need_mons[link_idx]; + conn->mta_conn_mutex_lock_already = TRUE; + } conn->mta_conn_mutex_unlock_later = TRUE; if ((error_num = spider_db_set_names(spider, conn, link_idx))) { - conn->mta_conn_mutex_lock_already = FALSE; - conn->mta_conn_mutex_unlock_later = FALSE; - SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos); - pthread_mutex_unlock(&conn->mta_conn_mutex); + conn->mta_conn_mutex_lock_already = mta_conn_mutex_lock_already; + if (!mta_conn_mutex_unlock_later) + { + conn->mta_conn_mutex_unlock_later = FALSE; + SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos); + pthread_mutex_unlock(&conn->mta_conn_mutex); + } if ( share->monitoring_kind[link_idx] && spider->need_mons[link_idx] @@ -996,8 +1002,8 @@ int spider_db_query_with_set_names( -1, &spider->need_mons[link_idx]) ) { - conn->mta_conn_mutex_lock_already = FALSE; - conn->mta_conn_mutex_unlock_later = FALSE; + conn->mta_conn_mutex_lock_already = mta_conn_mutex_lock_already; + conn->mta_conn_mutex_unlock_later = mta_conn_mutex_unlock_later; error_num = spider_db_errorno(conn); if ( share->monitoring_kind[link_idx] && @@ -1022,10 +1028,13 @@ int spider_db_query_with_set_names( } DBUG_RETURN(error_num); } - conn->mta_conn_mutex_lock_already = FALSE; - conn->mta_conn_mutex_unlock_later = FALSE; - SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos); - pthread_mutex_unlock(&conn->mta_conn_mutex); + conn->mta_conn_mutex_lock_already = mta_conn_mutex_lock_already; + if (!mta_conn_mutex_unlock_later) + { + conn->mta_conn_mutex_unlock_later = FALSE; + SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos); + pthread_mutex_unlock(&conn->mta_conn_mutex); + } DBUG_RETURN(0); } @@ -7509,9 +7518,15 @@ int spider_db_delete( pthread_mutex_lock(&conn->mta_conn_mutex); SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos); } + conn->mta_conn_mutex_lock_already = TRUE; + conn->need_mon = &spider->need_mons[roop_count]; if ((error_num = spider_db_query_with_set_names( SPIDER_SQL_TYPE_DELETE_SQL, spider, conn, roop_count))) + { + conn->mta_conn_mutex_lock_already = FALSE; DBUG_RETURN(error_num); + } + conn->mta_conn_mutex_lock_already = FALSE; result_list->update_sqls[roop_count].length(0); } if ((error_num = spider->reset_sql_sql(SPIDER_SQL_TYPE_DELETE_SQL))) diff --git a/storage/spider/spd_db_handlersocket.cc b/storage/spider/spd_db_handlersocket.cc index 37bbe530723..dff63186ced 100644 --- a/storage/spider/spd_db_handlersocket.cc +++ b/storage/spider/spd_db_handlersocket.cc @@ -1,4 +1,5 @@ -/* Copyright (C) 2012-2018 Kentoku Shiba +/* Copyright (C) 2012-2019 Kentoku Shiba + Copyright (C) 2019 MariaDB corp This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -126,6 +127,7 @@ SPIDER_DBTON spider_dbton_handlersocket = { spider_handlersocket_create_handler, NULL, spider_handlersocket_create_conn, + NULL, spider_handlersocket_support_direct_join, &spider_db_handlersocket_utility }; @@ -5738,6 +5740,16 @@ int spider_handlersocket_handler::set_sql_for_exec( DBUG_RETURN(0); } +int spider_handlersocket_handler::set_sql_for_exec( + spider_db_sql *db_sql, + int link_idx +) { + DBUG_ENTER("spider_handlersocket_handler::set_sql_for_exec"); + DBUG_PRINT("info",("spider this=%p", this)); + DBUG_ASSERT(0); + DBUG_RETURN(0); +} + int spider_handlersocket_handler::execute_sql( ulong sql_type, SPIDER_CONN *conn, diff --git a/storage/spider/spd_db_handlersocket.h b/storage/spider/spd_db_handlersocket.h index 075f8720abf..e86530eaea2 100644 --- a/storage/spider/spd_db_handlersocket.h +++ b/storage/spider/spd_db_handlersocket.h @@ -1,4 +1,5 @@ -/* Copyright (C) 2012-2018 Kentoku Shiba +/* Copyright (C) 2012-2019 Kentoku Shiba + Copyright (C) 2019 MariaDB corp This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -910,6 +911,10 @@ public: spider_db_copy_table *tgt_ct, ulong sql_type ); + int set_sql_for_exec( + spider_db_sql *db_sql, + int link_idx + ); int execute_sql( ulong sql_type, SPIDER_CONN *conn, diff --git a/storage/spider/spd_db_include.cc b/storage/spider/spd_db_include.cc index 2910aa97690..a2f062e225b 100644 --- a/storage/spider/spd_db_include.cc +++ b/storage/spider/spd_db_include.cc @@ -1,4 +1,5 @@ /* Copyright (C) 2018-2019 Kentoku Shiba + Copyright (C) 2018-2019 MariaDB corp This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -14,6 +15,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define MYSQL_SERVER 1 +#define MYSQL_LEX 1 #include <my_global.h> #include "mysql_version.h" #include "spd_environ.h" @@ -24,13 +26,3796 @@ #include "sql_priv.h" #include "probes_mysql.h" #include "sql_class.h" +#include "sql_lex.h" #endif -#include "sql_common.h" -#include <mysql.h> -#include <errmsg.h> #include "spd_err.h" #include "spd_db_include.h" #include "spd_include.h" +#include "spd_db_conn.h" +#include "spd_malloc.h" + +spider_db_sql::~spider_db_sql() +{ + DBUG_ENTER("spider_db_sql::~spider_db_sql"); + DBUG_PRINT("info",("spider this=%p", this)); + if (likely(sql_init)) + { + delete [] sql_str; + } + DBUG_VOID_RETURN; +} + +int spider_db_sql::init( + CHARSET_INFO *charset +) { + uint roop_count; + DBUG_ENTER("spider_db_sql::init"); + if (unlikely(!(sql_str = new spider_string[SPIDER_DB_SQL_STRINGS]))) + { + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + } + for (roop_count = 0; roop_count < SPIDER_DB_SQL_STRINGS; ++roop_count) + { + sql_str[roop_count].init_calc_mem(257); + sql_str[roop_count].set_charset(charset); + } + sql_init = TRUE; + DBUG_RETURN(0); +} + +void spider_db_sql::reset( + CHARSET_INFO *charset +) { + uint roop_count; + DBUG_ENTER("spider_db_sql::init"); + for (roop_count = 0; roop_count < SPIDER_DB_SQL_STRINGS; ++roop_count) + { + sql_str[roop_count].length(0); + sql_str[roop_count].set_charset(charset); + } + DBUG_VOID_RETURN; +} + +void spider_db_sql::set_quote_char_for_ident( + LEX_CSTRING quote_char +) { + DBUG_ENTER("spider_db_sql::set_quote_char_for_ident"); + quote_char_for_ident = quote_char; + DBUG_VOID_RETURN; +} + +int spider_db_sql::append_parsed_symbol( + int symbol_tok, + union YYSTYPE *yylval_tok +) { + DBUG_ENTER("spider_db_sql::append_parsed_symbol"); + DBUG_PRINT("info",("spider this=%p", this)); + DBUG_RETURN(append_parsed_symbol(symbol_tok, yylval_tok, &sql_str[0])); +} + +int spider_db_sql::append_parsed_symbol_ex( + int symbol_tok, + union YYSTYPE *yylval_tok +) { + DBUG_ENTER("spider_db_sql::append_parsed_symbol_ex"); + DBUG_PRINT("info",("spider this=%p", this)); + DBUG_RETURN(append_parsed_symbol(symbol_tok, yylval_tok, &sql_str[1])); +} + +int spider_db_sql::append_table_name_space( + uint str_id +) { + spider_string *str = &sql_str[str_id]; + DBUG_ENTER("spider_mysql_sql::append_table_name_space"); + DBUG_PRINT("info",("spider this=%p", this)); + DBUG_PRINT("info",("spider str_id=%u", str_id)); + DBUG_PRINT("info",("spider table_name_pos=%u", str->length())); + table_name_pos[str_id] = str->length(); + if (str->reserve(SPIDER_TABLE_NAME_SPACE)) + { + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + } + memset((char *) str->ptr() + str->length(), ' ', SPIDER_TABLE_NAME_SPACE); + str->length(str->length() + SPIDER_TABLE_NAME_SPACE); + DBUG_RETURN(0); +} + +int spider_db_sql::append_table_name_space() +{ + DBUG_ENTER("spider_mysql_sql::append_table_name_space"); + DBUG_PRINT("info",("spider this=%p", this)); + DBUG_RETURN(append_table_name_space(0)); +} + +void spider_db_sql::set_sql_end_pos() +{ + DBUG_ENTER("spider_mysql_sql::set_sql_end_pos"); + DBUG_PRINT("info",("spider this=%p", this)); + sql_end_pos[0] = sql_str[0].length(); + sql_end_pos[1] = sql_str[1].length(); + DBUG_VOID_RETURN; +} + +int spider_db_sql::append_parsed_symbol( + int symbol_tok, + union YYSTYPE *yylval_tok, + spider_string *str +) { + DBUG_ENTER("spider_db_sql::append_parsed_symbol"); + if (symbol_tok < 256) + { + uchar single_char = (uchar) symbol_tok; + if (str->append((char *) &single_char, 1)) + { + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + } + DBUG_RETURN(0); + } + switch (symbol_tok) + { + case AND_AND_SYM: + DBUG_PRINT("info",("spider AND_AND_SYM")); + if (str->append(STRING_WITH_LEN("&& "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case LE: + DBUG_PRINT("info",("spider LE")); + if (str->append(STRING_WITH_LEN("<= "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case NE: + DBUG_PRINT("info",("spider NE")); + if (str->append(STRING_WITH_LEN("!= "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#ifdef SPIDER_TOKEN_10_3 + case NEG: + DBUG_PRINT("info",("spider NEG")); + if (str->append(STRING_WITH_LEN("!"))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#endif + case GE: + DBUG_PRINT("info",("spider GE")); + if (str->append(STRING_WITH_LEN(">= "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case SHIFT_LEFT: + DBUG_PRINT("info",("spider SHIFT_LEFT")); + if (str->append(STRING_WITH_LEN("<< "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case SHIFT_RIGHT: + DBUG_PRINT("info",("spider SHIFT_RIGHT")); + if (str->append(STRING_WITH_LEN(">> "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case EQUAL_SYM: + DBUG_PRINT("info",("spider EQUAL_SYM")); + if (str->append(STRING_WITH_LEN("<=> "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case ACCESSIBLE_SYM: + DBUG_PRINT("info",("spider ACCESSIBLE_SYM")); + if (str->append(STRING_WITH_LEN("ACCESSIBLE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#ifdef SPIDER_TOKEN_10_4 + case ACCOUNT_SYM: + DBUG_PRINT("info",("spider ACCOUNT_SYM")); + if (str->append(STRING_WITH_LEN("ACCOUNT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#endif + case ACTION: + DBUG_PRINT("info",("spider ACTION")); + if (str->append(STRING_WITH_LEN("ACTION "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case ADD: + DBUG_PRINT("info",("spider ADD")); + if (str->append(STRING_WITH_LEN("ADD "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case ADMIN_SYM: + DBUG_PRINT("info",("spider ADMIN_SYM")); + if (str->append(STRING_WITH_LEN("ADMIN "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case AFTER_SYM: + DBUG_PRINT("info",("spider AFTER_SYM")); + if (str->append(STRING_WITH_LEN("AFTER "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case AGAINST: + DBUG_PRINT("info",("spider AGAINST")); + if (str->append(STRING_WITH_LEN("AGAINST "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case AGGREGATE_SYM: + DBUG_PRINT("info",("spider AGGREGATE_SYM")); + if (str->append(STRING_WITH_LEN("AGGREGATE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case ALL: /* ALL */ + DBUG_PRINT("info",("spider ALL")); + if (str->append(STRING_WITH_LEN("ALL "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case ALGORITHM_SYM: + DBUG_PRINT("info",("spider ALGORITHM_SYM")); + if (str->append(STRING_WITH_LEN("ALGORITHM "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case ALTER: + DBUG_PRINT("info",("spider ALTER")); + if (str->append(STRING_WITH_LEN("ALTER "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case ALWAYS_SYM: + DBUG_PRINT("info",("spider ALWAYS_SYM")); + if (str->append(STRING_WITH_LEN("ALWAYS "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case ANALYZE_SYM: + DBUG_PRINT("info",("spider ANALYZE_SYM")); + if (str->append(STRING_WITH_LEN("ANALYZE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case AND_SYM: + DBUG_PRINT("info",("spider AND_SYM")); + if (str->append(STRING_WITH_LEN("AND "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case ANY_SYM: + DBUG_PRINT("info",("spider ANY_SYM")); + if (str->append(STRING_WITH_LEN("ANY "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case AS: + DBUG_PRINT("info",("spider AS")); + if (str->append(STRING_WITH_LEN("AS "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case ASC: + DBUG_PRINT("info",("spider ASC")); + if (str->append(STRING_WITH_LEN("ASC "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case ASCII_SYM: + DBUG_PRINT("info",("spider ASCII_SYM")); + if (str->append(STRING_WITH_LEN("ASCII "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case ASENSITIVE_SYM: + DBUG_PRINT("info",("spider ASENSITIVE_SYM")); + if (str->append(STRING_WITH_LEN("ASENSITIVE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case AT_SYM: + DBUG_PRINT("info",("spider AT_SYM")); + if (str->append(STRING_WITH_LEN("AT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case ATOMIC_SYM: + DBUG_PRINT("info",("spider ATOMIC_SYM")); + if (str->append(STRING_WITH_LEN("ATOMIC "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case AUTHORS_SYM: + DBUG_PRINT("info",("spider AUTHORS_SYM")); + if (str->append(STRING_WITH_LEN("AUTHORS "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case AUTO_INC: + DBUG_PRINT("info",("spider AUTO_INC")); + if (str->append(STRING_WITH_LEN("AUTO_INCREMENT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case AUTOEXTEND_SIZE_SYM: + DBUG_PRINT("info",("spider AUTOEXTEND_SIZE_SYM")); + if (str->append(STRING_WITH_LEN("AUTOEXTEND_SIZE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case AUTO_SYM: + DBUG_PRINT("info",("spider AUTO_SYM")); + if (str->append(STRING_WITH_LEN("AUTO "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case AVG_SYM: + DBUG_PRINT("info",("spider AVG_SYM")); + if (str->append(STRING_WITH_LEN("AVG "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case AVG_ROW_LENGTH: + DBUG_PRINT("info",("spider AVG_ROW_LENGTH")); + if (str->append(STRING_WITH_LEN("AVG_ROW_LENGTH "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case BACKUP_SYM: + DBUG_PRINT("info",("spider BACKUP_SYM")); + if (str->append(STRING_WITH_LEN("BACKUP "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case BEFORE_SYM: + DBUG_PRINT("info",("spider BEFORE_SYM")); + if (str->append(STRING_WITH_LEN("BEFORE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#ifdef SPIDER_TOKEN_10_3 + case BEGIN_MARIADB_SYM: + DBUG_PRINT("info",("spider BEGIN_MARIADB_SYM")); + if (str->append(STRING_WITH_LEN("BEGIN "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case BEGIN_ORACLE_SYM: + DBUG_PRINT("info",("spider BEGIN_ORACLE_SYM")); + if (str->append(STRING_WITH_LEN("BEGIN "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#else + case BEGIN_SYM: + DBUG_PRINT("info",("spider BEGIN_SYM")); + if (str->append(STRING_WITH_LEN("BEGIN "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#endif + case BETWEEN_SYM: + DBUG_PRINT("info",("spider BETWEEN_SYM")); + if (str->append(STRING_WITH_LEN("BETWEEN "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case BIGINT: + DBUG_PRINT("info",("spider BIGINT")); + if (str->append(STRING_WITH_LEN("BIGINT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case BINARY: + DBUG_PRINT("info",("spider BINARY")); + if (str->append(STRING_WITH_LEN("BINARY "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case BINLOG_SYM: + DBUG_PRINT("info",("spider BINLOG_SYM")); + if (str->append(STRING_WITH_LEN("BINLOG "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case BIT_SYM: + DBUG_PRINT("info",("spider BIT_SYM")); + if (str->append(STRING_WITH_LEN("BIT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#ifdef SPIDER_TOKEN_10_3 + case BLOB_MARIADB_SYM: + DBUG_PRINT("info",("spider BLOB_MARIADB_SYM")); + if (str->append(STRING_WITH_LEN("BLOB "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case BLOB_ORACLE_SYM: + DBUG_PRINT("info",("spider BLOB_ORACLE_SYM")); + if (str->append(STRING_WITH_LEN("BLOB "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#else + case BLOB_SYM: + DBUG_PRINT("info",("spider BLOB_SYM")); + if (str->append(STRING_WITH_LEN("BLOB "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#endif + case BLOCK_SYM: + DBUG_PRINT("info",("spider BLOCK_SYM")); + if (str->append(STRING_WITH_LEN("BLOCK "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#ifdef SPIDER_TOKEN_10_3 + case BODY_MARIADB_SYM: + DBUG_PRINT("info",("spider BODY_MARIADB_SYM")); + if (str->append(STRING_WITH_LEN("BODY "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case BODY_ORACLE_SYM: + DBUG_PRINT("info",("spider BODY_ORACLE_SYM")); + if (str->append(STRING_WITH_LEN("BODY "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#else + case BODY_SYM: + DBUG_PRINT("info",("spider BODY_SYM")); + if (str->append(STRING_WITH_LEN("BODY "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#endif + case BOOL_SYM: + DBUG_PRINT("info",("spider BOOL_SYM")); + if (str->append(STRING_WITH_LEN("BOOL "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case BOOLEAN_SYM: + DBUG_PRINT("info",("spider BOOLEAN_SYM")); + if (str->append(STRING_WITH_LEN("BOOLEAN "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case BOTH: + DBUG_PRINT("info",("spider BOTH")); + if (str->append(STRING_WITH_LEN("BOTH "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case BTREE_SYM: + DBUG_PRINT("info",("spider BTREE_SYM")); + if (str->append(STRING_WITH_LEN("BTREE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case BY: + DBUG_PRINT("info",("spider BY")); + if (str->append(STRING_WITH_LEN("BY "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case BYTE_SYM: + DBUG_PRINT("info",("spider BYTE_SYM")); + if (str->append(STRING_WITH_LEN("BYTE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case CACHE_SYM: + DBUG_PRINT("info",("spider CACHE_SYM")); + if (str->append(STRING_WITH_LEN("CACHE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case CALL_SYM: + DBUG_PRINT("info",("spider CALL_SYM")); + if (str->append(STRING_WITH_LEN("CALL "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case CASCADE: + DBUG_PRINT("info",("spider CASCADE")); + if (str->append(STRING_WITH_LEN("CASCADE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case CASCADED: + DBUG_PRINT("info",("spider CASCADED")); + if (str->append(STRING_WITH_LEN("CASCADED "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case CASE_SYM: + DBUG_PRINT("info",("spider CASE_SYM")); + if (str->append(STRING_WITH_LEN("CASE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case CATALOG_NAME_SYM: + DBUG_PRINT("info",("spider CATALOG_NAME_SYM")); + if (str->append(STRING_WITH_LEN("CATALOG_NAME "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case CHAIN_SYM: + DBUG_PRINT("info",("spider CHAIN_SYM")); + if (str->append(STRING_WITH_LEN("CHAIN "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case CHANGE: + DBUG_PRINT("info",("spider CHANGE")); + if (str->append(STRING_WITH_LEN("CHANGE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case CHANGED: + DBUG_PRINT("info",("spider CHANGED")); + if (str->append(STRING_WITH_LEN("CHANGED "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case CHAR_SYM: + DBUG_PRINT("info",("spider CHAR_SYM")); + if (str->append(STRING_WITH_LEN("CHARACTER "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case CHARSET: + DBUG_PRINT("info",("spider CHARSET")); + if (str->append(STRING_WITH_LEN("CHARSET "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case CHECK_SYM: + DBUG_PRINT("info",("spider CHECK_SYM")); + if (str->append(STRING_WITH_LEN("CHECK "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case CHECKPOINT_SYM: + DBUG_PRINT("info",("spider CHECKPOINT_SYM")); + if (str->append(STRING_WITH_LEN("CHECKPOINT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case CHECKSUM_SYM: + DBUG_PRINT("info",("spider CHECKSUM_SYM")); + if (str->append(STRING_WITH_LEN("CHECKSUM "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case CIPHER_SYM: + DBUG_PRINT("info",("spider CIPHER_SYM")); + if (str->append(STRING_WITH_LEN("CIPHER "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case CLASS_ORIGIN_SYM: + DBUG_PRINT("info",("spider CLASS_ORIGIN_SYM")); + if (str->append(STRING_WITH_LEN("CLASS_ORIGIN "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case CLIENT_SYM: + DBUG_PRINT("info",("spider CLIENT_SYM")); + if (str->append(STRING_WITH_LEN("CLIENT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#ifdef SPIDER_TOKEN_10_3 + case CLOB_MARIADB_SYM: + DBUG_PRINT("info",("spider CLOB_MARIADB_SYM")); + if (str->append(STRING_WITH_LEN("CLOB "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case CLOB_ORACLE_SYM: + DBUG_PRINT("info",("spider CLOB_ORACLE_SYM")); + if (str->append(STRING_WITH_LEN("CLOB "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#else + case CLOB: + DBUG_PRINT("info",("spider CLOB")); + if (str->append(STRING_WITH_LEN("CLOB "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#endif + case CLOSE_SYM: + DBUG_PRINT("info",("spider CLOSE_SYM")); + if (str->append(STRING_WITH_LEN("CLOSE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case COALESCE: + DBUG_PRINT("info",("spider COALESCE")); + if (str->append(STRING_WITH_LEN("COALESCE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case CODE_SYM: + DBUG_PRINT("info",("spider CODE_SYM")); + if (str->append(STRING_WITH_LEN("CODE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case COLLATE_SYM: + DBUG_PRINT("info",("spider COLLATE_SYM")); + if (str->append(STRING_WITH_LEN("COLLATE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case COLLATION_SYM: + DBUG_PRINT("info",("spider COLLATION_SYM")); + if (str->append(STRING_WITH_LEN("COLLATION "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#ifdef SPIDER_TOKEN_10_3 + case COLON_ORACLE_SYM: + DBUG_PRINT("info",("spider COLON_ORACLE_SYM")); + if (str->append(STRING_WITH_LEN(":"))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#endif + case COLUMN_SYM: + DBUG_PRINT("info",("spider COLUMN_SYM")); + if (str->append(STRING_WITH_LEN("COLUMN "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case COLUMN_NAME_SYM: + DBUG_PRINT("info",("spider COLUMN_NAME_SYM")); + if (str->append(STRING_WITH_LEN("COLUMN_NAME "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case COLUMNS: + DBUG_PRINT("info",("spider COLUMNS")); + if (str->append(STRING_WITH_LEN("COLUMNS "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case COLUMN_ADD_SYM: + DBUG_PRINT("info",("spider COLUMN_ADD_SYM")); + if (str->append(STRING_WITH_LEN("COLUMN_ADD "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case COLUMN_CHECK_SYM: + DBUG_PRINT("info",("spider COLUMN_CHECK_SYM")); + if (str->append(STRING_WITH_LEN("COLUMN_CHECK "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case COLUMN_CREATE_SYM: + DBUG_PRINT("info",("spider COLUMN_CREATE_SYM")); + if (str->append(STRING_WITH_LEN("COLUMN_CREATE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case COLUMN_DELETE_SYM: + DBUG_PRINT("info",("spider COLUMN_DELETE_SYM")); + if (str->append(STRING_WITH_LEN("COLUMN_DELETE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case COLUMN_GET_SYM: + DBUG_PRINT("info",("spider COLUMN_GET_SYM")); + if (str->append(STRING_WITH_LEN("COLUMN_GET "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case COMMENT_SYM: + DBUG_PRINT("info",("spider COMMENT_SYM")); + if (str->append(STRING_WITH_LEN("COMMENT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case COMMIT_SYM: + DBUG_PRINT("info",("spider COMMIT_SYM")); + if (str->append(STRING_WITH_LEN("COMMIT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case COMMITTED_SYM: + DBUG_PRINT("info",("spider COMMITTED_SYM")); + if (str->append(STRING_WITH_LEN("COMMITTED "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case COMPACT_SYM: + DBUG_PRINT("info",("spider COMPACT_SYM")); + if (str->append(STRING_WITH_LEN("COMPACT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case COMPLETION_SYM: + DBUG_PRINT("info",("spider COMPLETION_SYM")); + if (str->append(STRING_WITH_LEN("COMPLETION "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case COMPRESSED_SYM: + DBUG_PRINT("info",("spider COMPRESSED_SYM")); + if (str->append(STRING_WITH_LEN("COMPRESSED "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case CONCURRENT: + DBUG_PRINT("info",("spider CONCURRENT")); + if (str->append(STRING_WITH_LEN("CONCURRENT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case CONDITION_SYM: + DBUG_PRINT("info",("spider CONDITION_SYM")); + if (str->append(STRING_WITH_LEN("CONDITION "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case CONNECTION_SYM: + DBUG_PRINT("info",("spider CONNECTION_SYM")); + if (str->append(STRING_WITH_LEN("CONNECTION "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case CONSISTENT_SYM: + DBUG_PRINT("info",("spider CONSISTENT_SYM")); + if (str->append(STRING_WITH_LEN("CONSISTENT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case CONSTRAINT: + DBUG_PRINT("info",("spider CONSTRAINT")); + if (str->append(STRING_WITH_LEN("CONSTRAINT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case CONSTRAINT_CATALOG_SYM: + DBUG_PRINT("info",("spider CONSTRAINT_CATALOG_SYM")); + if (str->append(STRING_WITH_LEN("CONSTRAINT_CATALOG "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case CONSTRAINT_NAME_SYM: + DBUG_PRINT("info",("spider CONSTRAINT_NAME_SYM")); + if (str->append(STRING_WITH_LEN("CONSTRAINT_NAME "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case CONSTRAINT_SCHEMA_SYM: + DBUG_PRINT("info",("spider CONSTRAINT_SCHEMA_SYM")); + if (str->append(STRING_WITH_LEN("CONSTRAINT_SCHEMA "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case CONTAINS_SYM: + DBUG_PRINT("info",("spider CONTAINS_SYM")); + if (str->append(STRING_WITH_LEN("CONTAINS "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case CONTEXT_SYM: + DBUG_PRINT("info",("spider CONTEXT_SYM")); + if (str->append(STRING_WITH_LEN("CONTEXT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#ifdef SPIDER_TOKEN_10_3 + case CONTINUE_MARIADB_SYM: + DBUG_PRINT("info",("spider CONTINUE_MARIADB_SYM")); + if (str->append(STRING_WITH_LEN("CONTINUE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case CONTINUE_ORACLE_SYM: + DBUG_PRINT("info",("spider CONTINUE_ORACLE_SYM")); + if (str->append(STRING_WITH_LEN("CONTINUE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#else + case CONTINUE_SYM: + DBUG_PRINT("info",("spider CONTINUE_SYM")); + if (str->append(STRING_WITH_LEN("CONTINUE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#endif + case CONTRIBUTORS_SYM: + DBUG_PRINT("info",("spider CONTRIBUTORS_SYM")); + if (str->append(STRING_WITH_LEN("CONTRIBUTORS "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case CONVERT_SYM: + DBUG_PRINT("info",("spider CONVERT_SYM")); + if (str->append(STRING_WITH_LEN("CONVERT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case CPU_SYM: + DBUG_PRINT("info",("spider CPU_SYM")); + if (str->append(STRING_WITH_LEN("CPU "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case CREATE: /* CREATE */ + DBUG_PRINT("info",("spider CREATE")); + if (str->append(STRING_WITH_LEN("CREATE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case CROSS: + DBUG_PRINT("info",("spider CROSS")); + if (str->append(STRING_WITH_LEN("CROSS "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case CUBE_SYM: + DBUG_PRINT("info",("spider CUBE_SYM")); + if (str->append(STRING_WITH_LEN("CUBE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case CURRENT_SYM: + DBUG_PRINT("info",("spider CURRENT_SYM")); + if (str->append(STRING_WITH_LEN("CURRENT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case CURDATE: + DBUG_PRINT("info",("spider CURDATE")); + if (str->append(STRING_WITH_LEN("CURRENT_DATE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case CURRENT_POS_SYM: + DBUG_PRINT("info",("spider CURRENT_POS_SYM")); + if (str->append(STRING_WITH_LEN("CURRENT_POS "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case CURRENT_ROLE: + DBUG_PRINT("info",("spider CURRENT_ROLE")); + if (str->append(STRING_WITH_LEN("CURRENT_ROLE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case CURTIME: + DBUG_PRINT("info",("spider CURTIME")); + if (str->append(STRING_WITH_LEN("CURRENT_TIME "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case NOW_SYM: + DBUG_PRINT("info",("spider NOW_SYM")); + if (str->append(STRING_WITH_LEN("CURRENT_TIMESTAMP "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case CURRENT_USER: + DBUG_PRINT("info",("spider CURRENT_USER")); + if (str->append(STRING_WITH_LEN("CURRENT_USER "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case CURSOR_SYM: + DBUG_PRINT("info",("spider CURSOR_SYM")); + if (str->append(STRING_WITH_LEN("CURSOR "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case CURSOR_NAME_SYM: + DBUG_PRINT("info",("spider CURSOR_NAME_SYM")); + if (str->append(STRING_WITH_LEN("CURSOR_NAME "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case CYCLE_SYM: + DBUG_PRINT("info",("spider CYCLE_SYM")); + if (str->append(STRING_WITH_LEN("CYCLE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case DATA_SYM: + DBUG_PRINT("info",("spider DATA_SYM")); + if (str->append(STRING_WITH_LEN("DATA "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case DATABASE: + DBUG_PRINT("info",("spider DATABASE")); + if (str->append(STRING_WITH_LEN("DATABASE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case DATABASES: + DBUG_PRINT("info",("spider DATABASES")); + if (str->append(STRING_WITH_LEN("DATABASES "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case DATAFILE_SYM: + DBUG_PRINT("info",("spider DATAFILE_SYM")); + if (str->append(STRING_WITH_LEN("DATAFILE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case DATE_SYM: + DBUG_PRINT("info",("spider DATE_SYM")); + if (str->append(STRING_WITH_LEN("DATE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case DATETIME: + DBUG_PRINT("info",("spider DATETIME")); + if (str->append(STRING_WITH_LEN("DATETIME "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case DAY_SYM: + DBUG_PRINT("info",("spider DAY_SYM")); + if (str->append(STRING_WITH_LEN("DAY "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case DAY_HOUR_SYM: + DBUG_PRINT("info",("spider DAY_HOUR_SYM")); + if (str->append(STRING_WITH_LEN("DAY_HOUR "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case DAY_MICROSECOND_SYM: + DBUG_PRINT("info",("spider DAY_MICROSECOND_SYM")); + if (str->append(STRING_WITH_LEN("DAY_MICROSECOND "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case DAY_MINUTE_SYM: + DBUG_PRINT("info",("spider DAY_MINUTE_SYM")); + if (str->append(STRING_WITH_LEN("DAY_MINUTE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case DAY_SECOND_SYM: + DBUG_PRINT("info",("spider DAY_SECOND_SYM")); + if (str->append(STRING_WITH_LEN("DAY_SECOND "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case DEALLOCATE_SYM : + DBUG_PRINT("info",("spider DEALLOCATE_SYM ")); + if (str->append(STRING_WITH_LEN("DEALLOCATE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case DECIMAL_SYM: + DBUG_PRINT("info",("spider DECIMAL_SYM")); + if (str->append(STRING_WITH_LEN("DECIMAL "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#ifdef SPIDER_TOKEN_10_3 + case DECLARE_MARIADB_SYM: + DBUG_PRINT("info",("spider DECLARE_MARIADB_SYM")); + if (str->append(STRING_WITH_LEN("DECLARE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case DECLARE_ORACLE_SYM: + DBUG_PRINT("info",("spider DECLARE_ORACLE_SYM")); + if (str->append(STRING_WITH_LEN("DECLARE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#else + case DECLARE_SYM: + DBUG_PRINT("info",("spider DECLARE_SYM")); + if (str->append(STRING_WITH_LEN("DECLARE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#endif + case DEFAULT: + DBUG_PRINT("info",("spider DEFAULT")); + if (str->append(STRING_WITH_LEN("DEFAULT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case DEFINER_SYM: + DBUG_PRINT("info",("spider DEFINER_SYM")); + if (str->append(STRING_WITH_LEN("DEFINER "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case DELAYED_SYM: + DBUG_PRINT("info",("spider DELAYED_SYM")); + if (str->append(STRING_WITH_LEN("DELAYED "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case DELAY_KEY_WRITE_SYM: + DBUG_PRINT("info",("spider DELAY_KEY_WRITE_SYM")); + if (str->append(STRING_WITH_LEN("DELAY_KEY_WRITE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case DELETE_SYM: + DBUG_PRINT("info",("spider DELETE_SYM")); + if (str->append(STRING_WITH_LEN("DELETE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case DELETE_DOMAIN_ID_SYM: + DBUG_PRINT("info",("spider DELETE_DOMAIN_ID_SYM")); + if (str->append(STRING_WITH_LEN("DELETE_DOMAIN_ID "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case DESC: + DBUG_PRINT("info",("spider DESC")); + if (str->append(STRING_WITH_LEN("DESC "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case DESCRIBE: + DBUG_PRINT("info",("spider DESCRIBE")); + if (str->append(STRING_WITH_LEN("DESCRIBE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case DES_KEY_FILE: + DBUG_PRINT("info",("spider DES_KEY_FILE")); + if (str->append(STRING_WITH_LEN("DES_KEY_FILE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case DETERMINISTIC_SYM: + DBUG_PRINT("info",("spider DETERMINISTIC_SYM")); + if (str->append(STRING_WITH_LEN("DETERMINISTIC "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case DIAGNOSTICS_SYM: + DBUG_PRINT("info",("spider DIAGNOSTICS_SYM")); + if (str->append(STRING_WITH_LEN("DIAGNOSTICS "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case DIRECTORY_SYM: + DBUG_PRINT("info",("spider DIRECTORY_SYM")); + if (str->append(STRING_WITH_LEN("DIRECTORY "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case DISABLE_SYM: + DBUG_PRINT("info",("spider DISABLE_SYM")); + if (str->append(STRING_WITH_LEN("DISABLE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case DISCARD: + DBUG_PRINT("info",("spider DISCARD")); + if (str->append(STRING_WITH_LEN("DISCARD "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case DISK_SYM: + DBUG_PRINT("info",("spider DISK_SYM")); + if (str->append(STRING_WITH_LEN("DISK "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case DISTINCT: + DBUG_PRINT("info",("spider DISTINCT")); + if (str->append(STRING_WITH_LEN("DISTINCT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case DIV_SYM: + DBUG_PRINT("info",("spider DIV_SYM")); + if (str->append(STRING_WITH_LEN("DIV "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case DO_SYM: + DBUG_PRINT("info",("spider DO_SYM")); + if (str->append(STRING_WITH_LEN("DO "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#ifdef SPIDER_TOKEN_10_3 + case DOT_DOT_SYM: + DBUG_PRINT("info",("spider DOT_DOT_SYM")); + if (str->append(STRING_WITH_LEN(".."))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#endif + case DOUBLE_SYM: + DBUG_PRINT("info",("spider DOUBLE_SYM")); + if (str->append(STRING_WITH_LEN("DOUBLE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case DO_DOMAIN_IDS_SYM: + DBUG_PRINT("info",("spider DO_DOMAIN_IDS_SYM")); + if (str->append(STRING_WITH_LEN("DO_DOMAIN_IDS "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case DROP: + DBUG_PRINT("info",("spider DROP")); + if (str->append(STRING_WITH_LEN("DROP "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case DUAL_SYM: + DBUG_PRINT("info",("spider DUAL_SYM")); + if (str->append(STRING_WITH_LEN("DUAL "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case DUMPFILE: + DBUG_PRINT("info",("spider DUMPFILE")); + if (str->append(STRING_WITH_LEN("DUMPFILE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case DUPLICATE_SYM: + DBUG_PRINT("info",("spider DUPLICATE_SYM")); + if (str->append(STRING_WITH_LEN("DUPLICATE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case DYNAMIC_SYM: + DBUG_PRINT("info",("spider DYNAMIC_SYM")); + if (str->append(STRING_WITH_LEN("DYNAMIC "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case EACH_SYM: + DBUG_PRINT("info",("spider EACH_SYM")); + if (str->append(STRING_WITH_LEN("EACH "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case ELSE: + DBUG_PRINT("info",("spider ELSE")); + if (str->append(STRING_WITH_LEN("ELSE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#ifdef SPIDER_TOKEN_10_3 + case ELSEIF_MARIADB_SYM: + DBUG_PRINT("info",("spider ELSEIF_MARIADB_SYM")); + if (str->append(STRING_WITH_LEN("ELSEIF "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case ELSEIF_ORACLE_SYM: + DBUG_PRINT("info",("spider ELSEIF_ORACLE_SYM")); + if (str->append(STRING_WITH_LEN("ELSEIF "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#else + case ELSEIF_SYM: + DBUG_PRINT("info",("spider ELSEIF_SYM")); + if (str->append(STRING_WITH_LEN("ELSEIF "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#endif +#ifdef SPIDER_TOKEN_10_3 + case ELSIF_MARIADB_SYM: + DBUG_PRINT("info",("spider ELSIF_MARIADB_SYM")); + if (str->append(STRING_WITH_LEN("ELSIF "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case ELSIF_ORACLE_SYM: + DBUG_PRINT("info",("spider ELSIF_ORACLE_SYM")); + if (str->append(STRING_WITH_LEN("ELSIF "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#else + case ELSIF_SYM: + DBUG_PRINT("info",("spider ELSIF_SYM")); + if (str->append(STRING_WITH_LEN("ELSIF "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#endif + case ENABLE_SYM: + DBUG_PRINT("info",("spider ENABLE_SYM")); + if (str->append(STRING_WITH_LEN("ENABLE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case ENCLOSED: + DBUG_PRINT("info",("spider ENCLOSED")); + if (str->append(STRING_WITH_LEN("ENCLOSED "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case END: + DBUG_PRINT("info",("spider END")); + if (str->append(STRING_WITH_LEN("END "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case ENDS_SYM: + DBUG_PRINT("info",("spider ENDS_SYM")); + if (str->append(STRING_WITH_LEN("ENDS "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case ENGINE_SYM: + DBUG_PRINT("info",("spider ENGINE_SYM")); + if (str->append(STRING_WITH_LEN("ENGINE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case ENGINES_SYM: + DBUG_PRINT("info",("spider ENGINES_SYM")); + if (str->append(STRING_WITH_LEN("ENGINES "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case ENUM: + DBUG_PRINT("info",("spider ENUM")); + if (str->append(STRING_WITH_LEN("ENUM "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case ERROR_SYM: + DBUG_PRINT("info",("spider ERROR_SYM")); + if (str->append(STRING_WITH_LEN("ERROR "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case ERRORS: + DBUG_PRINT("info",("spider ERRORS")); + if (str->append(STRING_WITH_LEN("ERRORS "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case ESCAPE_SYM: + DBUG_PRINT("info",("spider ESCAPE_SYM")); + if (str->append(STRING_WITH_LEN("ESCAPE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case ESCAPED: + DBUG_PRINT("info",("spider ESCAPED")); + if (str->append(STRING_WITH_LEN("ESCAPED "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case EVENT_SYM: + DBUG_PRINT("info",("spider EVENT_SYM")); + if (str->append(STRING_WITH_LEN("EVENT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case EVENTS_SYM: + DBUG_PRINT("info",("spider EVENTS_SYM")); + if (str->append(STRING_WITH_LEN("EVENTS "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case EVERY_SYM: + DBUG_PRINT("info",("spider EVERY_SYM")); + if (str->append(STRING_WITH_LEN("EVERY "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case EXAMINED_SYM: + DBUG_PRINT("info",("spider EXAMINED_SYM")); + if (str->append(STRING_WITH_LEN("EXAMINED "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case EXCEPT_SYM: + DBUG_PRINT("info",("spider EXCEPT_SYM")); + if (str->append(STRING_WITH_LEN("EXCEPT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case EXCHANGE_SYM: + DBUG_PRINT("info",("spider EXCHANGE_SYM")); + if (str->append(STRING_WITH_LEN("EXCHANGE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case EXCLUDE_SYM: + DBUG_PRINT("info",("spider EXCLUDE_SYM")); + if (str->append(STRING_WITH_LEN("EXCLUDE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case EXECUTE_SYM: /* EXECUTE */ + DBUG_PRINT("info",("spider EXECUTE_SYM")); + if (str->append(STRING_WITH_LEN("EXECUTE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#ifdef SPIDER_TOKEN_10_3 + case EXCEPTION_MARIADB_SYM: + DBUG_PRINT("info",("spider EXCEPTION_MARIADB_SYM")); + if (str->append(STRING_WITH_LEN("EXCEPTION "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case EXCEPTION_ORACLE_SYM: + DBUG_PRINT("info",("spider EXCEPTION_ORACLE_SYM")); + if (str->append(STRING_WITH_LEN("EXCEPTION "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#else + case EXCEPTION_SYM: + DBUG_PRINT("info",("spider EXCEPTION_SYM")); + if (str->append(STRING_WITH_LEN("EXCEPTION "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#endif + case EXISTS: + DBUG_PRINT("info",("spider EXISTS")); + if (str->append(STRING_WITH_LEN("EXISTS "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#ifdef SPIDER_TOKEN_10_3 + case EXIT_MARIADB_SYM: + DBUG_PRINT("info",("spider EXIT_MARIADB_SYM")); + if (str->append(STRING_WITH_LEN("EXIT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case EXIT_ORACLE_SYM: + DBUG_PRINT("info",("spider EXIT_ORACLE_SYM")); + if (str->append(STRING_WITH_LEN("EXIT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#else + case EXIT_SYM: + DBUG_PRINT("info",("spider EXIT_SYM")); + if (str->append(STRING_WITH_LEN("EXIT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#endif + case EXPANSION_SYM: + DBUG_PRINT("info",("spider EXPANSION_SYM")); + if (str->append(STRING_WITH_LEN("EXPANSION "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#ifdef SPIDER_TOKEN_10_4 + case EXPIRE_SYM: + DBUG_PRINT("info",("spider EXPIRE_SYM")); + if (str->append(STRING_WITH_LEN("EXPIRE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#endif + case EXPORT_SYM: + DBUG_PRINT("info",("spider EXPORT_SYM")); + if (str->append(STRING_WITH_LEN("EXPORT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case EXTENDED_SYM: + DBUG_PRINT("info",("spider EXTENDED_SYM")); + if (str->append(STRING_WITH_LEN("EXTENDED "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case EXTENT_SIZE_SYM: + DBUG_PRINT("info",("spider EXTENT_SIZE_SYM")); + if (str->append(STRING_WITH_LEN("EXTENT_SIZE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case FALSE_SYM: + DBUG_PRINT("info",("spider FALSE_SYM")); + if (str->append(STRING_WITH_LEN("FALSE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case FAST_SYM: + DBUG_PRINT("info",("spider FAST_SYM")); + if (str->append(STRING_WITH_LEN("FAST "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case FAULTS_SYM: + DBUG_PRINT("info",("spider FAULTS_SYM")); + if (str->append(STRING_WITH_LEN("FAULTS "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case FETCH_SYM: + DBUG_PRINT("info",("spider FETCH_SYM")); + if (str->append(STRING_WITH_LEN("FETCH "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case FILE_SYM: + DBUG_PRINT("info",("spider FILE_SYM")); + if (str->append(STRING_WITH_LEN("FILE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case FIRST_SYM: + DBUG_PRINT("info",("spider FIRST_SYM")); + if (str->append(STRING_WITH_LEN("FIRST "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case FIXED_SYM: + DBUG_PRINT("info",("spider FIXED_SYM")); + if (str->append(STRING_WITH_LEN("FIXED "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case FLOAT_SYM: + DBUG_PRINT("info",("spider FLOAT_SYM")); + if (str->append(STRING_WITH_LEN("FLOAT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case FLUSH_SYM: + DBUG_PRINT("info",("spider FLUSH_SYM")); + if (str->append(STRING_WITH_LEN("FLUSH "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case FOLLOWING_SYM: + DBUG_PRINT("info",("spider FOLLOWING_SYM")); + if (str->append(STRING_WITH_LEN("FOLLOWING "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case FOLLOWS_SYM: + DBUG_PRINT("info",("spider FOLLOWS_SYM")); + if (str->append(STRING_WITH_LEN("FOLLOWS "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case FOR_SYM: + DBUG_PRINT("info",("spider FOR_SYM")); + if (str->append(STRING_WITH_LEN("FOR "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#ifdef SPIDER_TOKEN_10_3 + case FOR_SYSTEM_TIME_SYM: + DBUG_PRINT("info",("spider FOR_SYSTEM_TIME_SYM")); + if (str->append(STRING_WITH_LEN("FOR SYSTEM TIME "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#endif + case FORCE_SYM: + DBUG_PRINT("info",("spider FORCE_SYM")); + if (str->append(STRING_WITH_LEN("FORCE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case FOREIGN: + DBUG_PRINT("info",("spider FOREIGN")); + if (str->append(STRING_WITH_LEN("FOREIGN "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case FORMAT_SYM: + DBUG_PRINT("info",("spider FORMAT_SYM")); + if (str->append(STRING_WITH_LEN("FORMAT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case FOUND_SYM: + DBUG_PRINT("info",("spider FOUND_SYM")); + if (str->append(STRING_WITH_LEN("FOUND "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case FROM: + DBUG_PRINT("info",("spider FROM")); + if (str->append(STRING_WITH_LEN("FROM "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case FULL: + DBUG_PRINT("info",("spider FULL")); + if (str->append(STRING_WITH_LEN("FULL "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case FULLTEXT_SYM: + DBUG_PRINT("info",("spider FULLTEXT_SYM")); + if (str->append(STRING_WITH_LEN("FULLTEXT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case FUNCTION_SYM: + DBUG_PRINT("info",("spider FUNCTION_SYM")); + if (str->append(STRING_WITH_LEN("FUNCTION "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case GENERAL: + DBUG_PRINT("info",("spider GENERAL")); + if (str->append(STRING_WITH_LEN("GENERAL "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case GENERATED_SYM: + DBUG_PRINT("info",("spider GENERATED_SYM")); + if (str->append(STRING_WITH_LEN("GENERATED "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case GEOMETRY_SYM: + DBUG_PRINT("info",("spider GEOMETRY_SYM")); + if (str->append(STRING_WITH_LEN("GEOMETRY "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case GEOMETRYCOLLECTION: + DBUG_PRINT("info",("spider GEOMETRYCOLLECTION")); + if (str->append(STRING_WITH_LEN("GEOMETRYCOLLECTION "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case GET_FORMAT: + DBUG_PRINT("info",("spider GET_FORMAT")); + if (str->append(STRING_WITH_LEN("GET_FORMAT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case GET_SYM: + DBUG_PRINT("info",("spider GET_SYM")); + if (str->append(STRING_WITH_LEN("GET "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case GLOBAL_SYM: + DBUG_PRINT("info",("spider GLOBAL_SYM")); + if (str->append(STRING_WITH_LEN("GLOBAL "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#ifdef SPIDER_TOKEN_10_3 + case GOTO_MARIADB_SYM: + DBUG_PRINT("info",("spider GOTO_MARIADB_SYM")); + if (str->append(STRING_WITH_LEN("GOTO "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case GOTO_ORACLE_SYM: + DBUG_PRINT("info",("spider GOTO_ORACLE_SYM")); + if (str->append(STRING_WITH_LEN("GOTO "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#else + case GOTO_SYM: + DBUG_PRINT("info",("spider GOTO_SYM")); + if (str->append(STRING_WITH_LEN("GOTO "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#endif + case GRANT: /* GRANT */ + DBUG_PRINT("info",("spider GRANT")); + if (str->append(STRING_WITH_LEN("GRANT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case GRANTS: + DBUG_PRINT("info",("spider GRANTS")); + if (str->append(STRING_WITH_LEN("GRANTS "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case GROUP_SYM: + DBUG_PRINT("info",("spider GROUP_SYM")); + if (str->append(STRING_WITH_LEN("GROUP "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case HANDLER_SYM: + DBUG_PRINT("info",("spider HANDLER_SYM")); + if (str->append(STRING_WITH_LEN("HANDLER "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case HARD_SYM: + DBUG_PRINT("info",("spider HARD_SYM")); + if (str->append(STRING_WITH_LEN("HARD "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case HASH_SYM: + DBUG_PRINT("info",("spider HASH_SYM")); + if (str->append(STRING_WITH_LEN("HASH "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case HAVING: + DBUG_PRINT("info",("spider HAVING")); + if (str->append(STRING_WITH_LEN("HAVING "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case HELP_SYM: + DBUG_PRINT("info",("spider HELP_SYM")); + if (str->append(STRING_WITH_LEN("HELP "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case HIGH_PRIORITY: + DBUG_PRINT("info",("spider HIGH_PRIORITY")); + if (str->append(STRING_WITH_LEN("HIGH_PRIORITY "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case HISTORY_SYM: + DBUG_PRINT("info",("spider HISTORY_SYM")); + if (str->append(STRING_WITH_LEN("HISTORY "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case HOST_SYM: + DBUG_PRINT("info",("spider HOST_SYM")); + if (str->append(STRING_WITH_LEN("HOST "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case HOSTS_SYM: + DBUG_PRINT("info",("spider HOSTS_SYM")); + if (str->append(STRING_WITH_LEN("HOSTS "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case HOUR_SYM: + DBUG_PRINT("info",("spider HOUR_SYM")); + if (str->append(STRING_WITH_LEN("HOUR "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case HOUR_MICROSECOND_SYM: + DBUG_PRINT("info",("spider HOUR_MICROSECOND_SYM")); + if (str->append(STRING_WITH_LEN("HOUR_MICROSECOND "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case HOUR_MINUTE_SYM: + DBUG_PRINT("info",("spider HOUR_MINUTE_SYM")); + if (str->append(STRING_WITH_LEN("HOUR_MINUTE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case HOUR_SECOND_SYM: + DBUG_PRINT("info",("spider HOUR_SECOND_SYM")); + if (str->append(STRING_WITH_LEN("HOUR_SECOND "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case ID_SYM: /* id */ + DBUG_PRINT("info",("spider ID_SYM")); + if (str->append(STRING_WITH_LEN("ID "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case IDENTIFIED_SYM: + DBUG_PRINT("info",("spider IDENTIFIED_SYM")); + if (str->append(STRING_WITH_LEN("IDENTIFIED "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case IF_SYM: + DBUG_PRINT("info",("spider IF_SYM")); + if (str->append(STRING_WITH_LEN("IF "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case IGNORE_SYM: + DBUG_PRINT("info",("spider IGNORE_SYM")); + if (str->append(STRING_WITH_LEN("IGNORE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case IGNORE_DOMAIN_IDS_SYM: + DBUG_PRINT("info",("spider IGNORE_DOMAIN_IDS_SYM")); + if (str->append(STRING_WITH_LEN("IGNORE_DOMAIN_IDS "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case IGNORE_SERVER_IDS_SYM: + DBUG_PRINT("info",("spider IGNORE_SERVER_IDS_SYM")); + if (str->append(STRING_WITH_LEN("IGNORE_SERVER_IDS "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case IMMEDIATE_SYM: + DBUG_PRINT("info",("spider IMMEDIATE_SYM")); + if (str->append(STRING_WITH_LEN("IMMEDIATE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case IMPORT: + DBUG_PRINT("info",("spider IMPORT")); + if (str->append(STRING_WITH_LEN("IMPORT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#ifdef SPIDER_TOKEN_10_3 + case IMPOSSIBLE_ACTION: + DBUG_PRINT("info",("spider IMPOSSIBLE_ACTION")); + if (str->append(STRING_WITH_LEN("IMPOSSIBLE ACTION "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#endif + case INTERSECT_SYM: + DBUG_PRINT("info",("spider INTERSECT_SYM")); + if (str->append(STRING_WITH_LEN("INTERSECT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case IN_SYM: + DBUG_PRINT("info",("spider IN_SYM")); + if (str->append(STRING_WITH_LEN("IN "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case INCREMENT_SYM: + DBUG_PRINT("info",("spider INCREMENT_SYM")); + if (str->append(STRING_WITH_LEN("INCREMENT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case INDEX_SYM: + DBUG_PRINT("info",("spider INDEX_SYM")); + if (str->append(STRING_WITH_LEN("INDEX "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case INDEXES: + DBUG_PRINT("info",("spider INDEXES")); + if (str->append(STRING_WITH_LEN("INDEXES "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case INFILE: + DBUG_PRINT("info",("spider INFILE")); + if (str->append(STRING_WITH_LEN("INFILE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case INITIAL_SIZE_SYM: + DBUG_PRINT("info",("spider INITIAL_SIZE_SYM")); + if (str->append(STRING_WITH_LEN("INITIAL_SIZE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case INNER_SYM: + DBUG_PRINT("info",("spider INNER_SYM")); + if (str->append(STRING_WITH_LEN("INNER "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case INOUT_SYM: + DBUG_PRINT("info",("spider INOUT_SYM")); + if (str->append(STRING_WITH_LEN("INOUT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case INSENSITIVE_SYM: + DBUG_PRINT("info",("spider INSENSITIVE_SYM")); + if (str->append(STRING_WITH_LEN("INSENSITIVE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case INSERT: + DBUG_PRINT("info",("spider INSERT")); + if (str->append(STRING_WITH_LEN("INSERT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case INSERT_METHOD: + DBUG_PRINT("info",("spider INSERT_METHOD")); + if (str->append(STRING_WITH_LEN("INSERT_METHOD "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case INSTALL_SYM: + DBUG_PRINT("info",("spider INSTALL_SYM")); + if (str->append(STRING_WITH_LEN("INSTALL "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case INT_SYM: + DBUG_PRINT("info",("spider INT_SYM")); + if (str->append(STRING_WITH_LEN("INT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case INTERVAL_SYM: + DBUG_PRINT("info",("spider INTERVAL_SYM")); + if (str->append(STRING_WITH_LEN("INTERVAL "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case INVISIBLE_SYM: + DBUG_PRINT("info",("spider INVISIBLE_SYM")); + if (str->append(STRING_WITH_LEN("INVISIBLE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case INTO: + DBUG_PRINT("info",("spider INTO")); + if (str->append(STRING_WITH_LEN("INTO "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case IO_SYM: + DBUG_PRINT("info",("spider IO_SYM")); + if (str->append(STRING_WITH_LEN("IO "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case RELAY_THREAD: + DBUG_PRINT("info",("spider RELAY_THREAD")); + if (str->append(STRING_WITH_LEN("IO_THREAD "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case IPC_SYM: + DBUG_PRINT("info",("spider IPC_SYM")); + if (str->append(STRING_WITH_LEN("IPC "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case IS: + DBUG_PRINT("info",("spider IS")); + if (str->append(STRING_WITH_LEN("IS "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case ISOLATION: + DBUG_PRINT("info",("spider ISOLATION")); + if (str->append(STRING_WITH_LEN("ISOLATION "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case ISOPEN_SYM: + DBUG_PRINT("info",("spider ISOPEN_SYM")); + if (str->append(STRING_WITH_LEN("ISOPEN "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case ISSUER_SYM: + DBUG_PRINT("info",("spider ISSUER_SYM")); + if (str->append(STRING_WITH_LEN("ISSUER "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case ITERATE_SYM: + DBUG_PRINT("info",("spider ITERATE_SYM")); + if (str->append(STRING_WITH_LEN("ITERATE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case INVOKER_SYM: + DBUG_PRINT("info",("spider INVOKER_SYM")); + if (str->append(STRING_WITH_LEN("INVOKER "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case JOIN_SYM: + DBUG_PRINT("info",("spider JOIN_SYM")); + if (str->append(STRING_WITH_LEN("JOIN "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case JSON_SYM: + DBUG_PRINT("info",("spider JSON_SYM")); + if (str->append(STRING_WITH_LEN("JSON "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case KEY_SYM: + DBUG_PRINT("info",("spider KEY_SYM")); + if (str->append(STRING_WITH_LEN("KEY "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case KEYS: + DBUG_PRINT("info",("spider KEYS")); + if (str->append(STRING_WITH_LEN("KEYS "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case KEY_BLOCK_SIZE: + DBUG_PRINT("info",("spider KEY_BLOCK_SIZE")); + if (str->append(STRING_WITH_LEN("KEY_BLOCK_SIZE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case KILL_SYM: + DBUG_PRINT("info",("spider KILL_SYM")); + if (str->append(STRING_WITH_LEN("KILL "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case LANGUAGE_SYM: + DBUG_PRINT("info",("spider LANGUAGE_SYM")); + if (str->append(STRING_WITH_LEN("LANGUAGE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case LAST_SYM: + DBUG_PRINT("info",("spider LAST_SYM")); + if (str->append(STRING_WITH_LEN("LAST "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case LAST_VALUE: + DBUG_PRINT("info",("spider LAST_VALUE")); + if (str->append(STRING_WITH_LEN("LAST_VALUE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case LASTVAL_SYM: + DBUG_PRINT("info",("spider LASTVAL_SYM")); + if (str->append(STRING_WITH_LEN("LASTVAL "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case LEADING: + DBUG_PRINT("info",("spider LEADING")); + if (str->append(STRING_WITH_LEN("LEADING "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case LEAVE_SYM: + DBUG_PRINT("info",("spider LEAVE_SYM")); + if (str->append(STRING_WITH_LEN("LEAVE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case LEAVES: + DBUG_PRINT("info",("spider LEAVES")); + if (str->append(STRING_WITH_LEN("LEAVES "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case LEFT: + DBUG_PRINT("info",("spider LEFT")); + if (str->append(STRING_WITH_LEN("LEFT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#ifdef SPIDER_TOKEN_10_4 + case LEFT_PAREN_ALT: + DBUG_PRINT("info",("spider LEFT_PAREN_ALT")); + if (str->append(STRING_WITH_LEN(") ALT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case LEFT_PAREN_LIKE: + DBUG_PRINT("info",("spider LEFT_PAREN_LIKE")); + if (str->append(STRING_WITH_LEN(") LIKE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case LEFT_PAREN_WITH: + DBUG_PRINT("info",("spider LEFT_PAREN_WITH")); + if (str->append(STRING_WITH_LEN(") WITH "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#endif + case LESS_SYM: + DBUG_PRINT("info",("spider LESS_SYM")); + if (str->append(STRING_WITH_LEN("LESS "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case LEVEL_SYM: + DBUG_PRINT("info",("spider LEVEL_SYM")); + if (str->append(STRING_WITH_LEN("LEVEL "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case LIKE: + DBUG_PRINT("info",("spider LIKE")); + if (str->append(STRING_WITH_LEN("LIKE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case LIMIT: + DBUG_PRINT("info",("spider LIMIT")); + if (str->append(STRING_WITH_LEN("LIMIT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case LINEAR_SYM: + DBUG_PRINT("info",("spider LINEAR_SYM")); + if (str->append(STRING_WITH_LEN("LINEAR "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case LINES: + DBUG_PRINT("info",("spider LINES")); + if (str->append(STRING_WITH_LEN("LINES "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case LINESTRING: + DBUG_PRINT("info",("spider LINESTRING")); + if (str->append(STRING_WITH_LEN("LINESTRING "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case LIST_SYM: + DBUG_PRINT("info",("spider LIST_SYM")); + if (str->append(STRING_WITH_LEN("LIST "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case LOAD: + DBUG_PRINT("info",("spider LOAD")); + if (str->append(STRING_WITH_LEN("LOAD "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case LOCAL_SYM: + DBUG_PRINT("info",("spider LOCAL_SYM")); + if (str->append(STRING_WITH_LEN("LOCAL "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#ifdef SPIDER_TOKEN_10_3 + case LOCATOR_SYM: + DBUG_PRINT("info",("spider LOCATOR_SYM")); + if (str->append(STRING_WITH_LEN("LOCATOR "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#endif + case LOCK_SYM: + DBUG_PRINT("info",("spider LOCK_SYM")); + if (str->append(STRING_WITH_LEN("LOCK "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case LOCKS_SYM: + DBUG_PRINT("info",("spider LOCKS_SYM")); + if (str->append(STRING_WITH_LEN("LOCKS "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case LOGFILE_SYM: + DBUG_PRINT("info",("spider LOGFILE_SYM")); + if (str->append(STRING_WITH_LEN("LOGFILE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case LOGS_SYM: + DBUG_PRINT("info",("spider LOGS_SYM")); + if (str->append(STRING_WITH_LEN("LOGS "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case LONG_SYM: + DBUG_PRINT("info",("spider LONG_SYM")); + if (str->append(STRING_WITH_LEN("LONG "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case LONGBLOB: + DBUG_PRINT("info",("spider LONGBLOB")); + if (str->append(STRING_WITH_LEN("LONGBLOB "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case LONGTEXT: + DBUG_PRINT("info",("spider LONGTEXT")); + if (str->append(STRING_WITH_LEN("LONGTEXT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case LOOP_SYM: + DBUG_PRINT("info",("spider LOOP_SYM")); + if (str->append(STRING_WITH_LEN("LOOP "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case LOW_PRIORITY: + DBUG_PRINT("info",("spider LOW_PRIORITY")); + if (str->append(STRING_WITH_LEN("LOW_PRIORITY "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case MASTER_SYM: + DBUG_PRINT("info",("spider MASTER_SYM")); + if (str->append(STRING_WITH_LEN("MASTER "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case MASTER_CONNECT_RETRY_SYM: + DBUG_PRINT("info",("spider MASTER_CONNECT_RETRY_SYM")); + if (str->append(STRING_WITH_LEN("MASTER_CONNECT_RETRY "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case MASTER_DELAY_SYM: + DBUG_PRINT("info",("spider MASTER_DELAY_SYM")); + if (str->append(STRING_WITH_LEN("MASTER_DELAY "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case MASTER_GTID_POS_SYM: + DBUG_PRINT("info",("spider MASTER_GTID_POS_SYM")); + if (str->append(STRING_WITH_LEN("MASTER_GTID_POS "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case MASTER_HOST_SYM: + DBUG_PRINT("info",("spider MASTER_HOST_SYM")); + if (str->append(STRING_WITH_LEN("MASTER_HOST "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case MASTER_LOG_FILE_SYM: + DBUG_PRINT("info",("spider MASTER_LOG_FILE_SYM")); + if (str->append(STRING_WITH_LEN("MASTER_LOG_FILE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case MASTER_LOG_POS_SYM: + DBUG_PRINT("info",("spider MASTER_LOG_POS_SYM")); + if (str->append(STRING_WITH_LEN("MASTER_LOG_POS "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case MASTER_PASSWORD_SYM: + DBUG_PRINT("info",("spider MASTER_PASSWORD_SYM")); + if (str->append(STRING_WITH_LEN("MASTER_PASSWORD "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case MASTER_PORT_SYM: + DBUG_PRINT("info",("spider MASTER_PORT_SYM")); + if (str->append(STRING_WITH_LEN("MASTER_PORT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case MASTER_SERVER_ID_SYM: + DBUG_PRINT("info",("spider MASTER_SERVER_ID_SYM")); + if (str->append(STRING_WITH_LEN("MASTER_SERVER_ID "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case MASTER_SSL_SYM: + DBUG_PRINT("info",("spider MASTER_SSL_SYM")); + if (str->append(STRING_WITH_LEN("MASTER_SSL "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case MASTER_SSL_CA_SYM: + DBUG_PRINT("info",("spider MASTER_SSL_CA_SYM")); + if (str->append(STRING_WITH_LEN("MASTER_SSL_CA "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case MASTER_SSL_CAPATH_SYM: + DBUG_PRINT("info",("spider MASTER_SSL_CAPATH_SYM")); + if (str->append(STRING_WITH_LEN("MASTER_SSL_CAPATH "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case MASTER_SSL_CERT_SYM: + DBUG_PRINT("info",("spider MASTER_SSL_CERT_SYM")); + if (str->append(STRING_WITH_LEN("MASTER_SSL_CERT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case MASTER_SSL_CIPHER_SYM: + DBUG_PRINT("info",("spider MASTER_SSL_CIPHER_SYM")); + if (str->append(STRING_WITH_LEN("MASTER_SSL_CIPHER "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case MASTER_SSL_CRL_SYM: + DBUG_PRINT("info",("spider MASTER_SSL_CRL_SYM")); + if (str->append(STRING_WITH_LEN("MASTER_SSL_CRL "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case MASTER_SSL_CRLPATH_SYM: + DBUG_PRINT("info",("spider MASTER_SSL_CRLPATH_SYM")); + if (str->append(STRING_WITH_LEN("MASTER_SSL_CRLPATH "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case MASTER_SSL_KEY_SYM: + DBUG_PRINT("info",("spider MASTER_SSL_KEY_SYM")); + if (str->append(STRING_WITH_LEN("MASTER_SSL_KEY "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case MASTER_SSL_VERIFY_SERVER_CERT_SYM: + DBUG_PRINT("info",("spider MASTER_SSL_VERIFY_SERVER_CERT_SYM")); + if (str->append(STRING_WITH_LEN("MASTER_SSL_VERIFY_SERVER_CERT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case MASTER_USER_SYM: + DBUG_PRINT("info",("spider MASTER_USER_SYM")); + if (str->append(STRING_WITH_LEN("MASTER_USER "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case MASTER_USE_GTID_SYM: + DBUG_PRINT("info",("spider MASTER_USE_GTID_SYM")); + if (str->append(STRING_WITH_LEN("MASTER_USE_GTID "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case MASTER_HEARTBEAT_PERIOD_SYM: + DBUG_PRINT("info",("spider MASTER_HEARTBEAT_PERIOD_SYM")); + if (str->append(STRING_WITH_LEN("MASTER_HEARTBEAT_PERIOD "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case MATCH: + DBUG_PRINT("info",("spider MATCH")); + if (str->append(STRING_WITH_LEN("MATCH "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case MAX_CONNECTIONS_PER_HOUR: + DBUG_PRINT("info",("spider MAX_CONNECTIONS_PER_HOUR")); + if (str->append(STRING_WITH_LEN("MAX_CONNECTIONS_PER_HOUR "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case MAX_QUERIES_PER_HOUR: + DBUG_PRINT("info",("spider MAX_QUERIES_PER_HOUR")); + if (str->append(STRING_WITH_LEN("MAX_QUERIES_PER_HOUR "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case MAX_ROWS: + DBUG_PRINT("info",("spider MAX_ROWS")); + if (str->append(STRING_WITH_LEN("MAX_ROWS "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case MAX_SIZE_SYM: + DBUG_PRINT("info",("spider MAX_SIZE_SYM")); + if (str->append(STRING_WITH_LEN("MAX_SIZE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case MAX_STATEMENT_TIME_SYM: + DBUG_PRINT("info",("spider MAX_STATEMENT_TIME_SYM")); + if (str->append(STRING_WITH_LEN("MAX_STATEMENT_TIME "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case MAX_UPDATES_PER_HOUR: + DBUG_PRINT("info",("spider MAX_UPDATES_PER_HOUR")); + if (str->append(STRING_WITH_LEN("MAX_UPDATES_PER_HOUR "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case MAX_USER_CONNECTIONS_SYM: + DBUG_PRINT("info",("spider MAX_USER_CONNECTIONS_SYM")); + if (str->append(STRING_WITH_LEN("MAX_USER_CONNECTIONS "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case MAXVALUE_SYM: + DBUG_PRINT("info",("spider MAXVALUE_SYM")); + if (str->append(STRING_WITH_LEN("MAXVALUE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case MEDIUM_SYM: + DBUG_PRINT("info",("spider MEDIUM_SYM")); + if (str->append(STRING_WITH_LEN("MEDIUM "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case MEDIUMBLOB: + DBUG_PRINT("info",("spider MEDIUMBLOB")); + if (str->append(STRING_WITH_LEN("MEDIUMBLOB "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case MEDIUMINT: + DBUG_PRINT("info",("spider MEDIUMINT")); + if (str->append(STRING_WITH_LEN("MEDIUMINT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case MEDIUMTEXT: + DBUG_PRINT("info",("spider MEDIUMTEXT")); + if (str->append(STRING_WITH_LEN("MEDIUMTEXT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case MEMORY_SYM: + DBUG_PRINT("info",("spider MEMORY_SYM")); + if (str->append(STRING_WITH_LEN("MEMORY "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case MERGE_SYM: + DBUG_PRINT("info",("spider MERGE_SYM")); + if (str->append(STRING_WITH_LEN("MERGE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case MESSAGE_TEXT_SYM: + DBUG_PRINT("info",("spider MESSAGE_TEXT_SYM")); + if (str->append(STRING_WITH_LEN("MESSAGE_TEXT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case MICROSECOND_SYM: + DBUG_PRINT("info",("spider MICROSECOND_SYM")); + if (str->append(STRING_WITH_LEN("MICROSECOND "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case MIGRATE_SYM: + DBUG_PRINT("info",("spider MIGRATE_SYM")); + if (str->append(STRING_WITH_LEN("MIGRATE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case MINUTE_SYM: + DBUG_PRINT("info",("spider MINUTE_SYM")); + if (str->append(STRING_WITH_LEN("MINUTE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case MINUTE_MICROSECOND_SYM: + DBUG_PRINT("info",("spider MINUTE_MICROSECOND_SYM")); + if (str->append(STRING_WITH_LEN("MINUTE_MICROSECOND "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case MINUTE_SECOND_SYM: + DBUG_PRINT("info",("spider MINUTE_SECOND_SYM")); + if (str->append(STRING_WITH_LEN("MINUTE_SECOND "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case MINVALUE_SYM: + DBUG_PRINT("info",("spider MINVALUE_SYM")); + if (str->append(STRING_WITH_LEN("MINVALUE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case MIN_ROWS: + DBUG_PRINT("info",("spider MIN_ROWS")); + if (str->append(STRING_WITH_LEN("MIN_ROWS "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case MOD_SYM: + DBUG_PRINT("info",("spider MOD_SYM")); + if (str->append(STRING_WITH_LEN("MOD "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case MODE_SYM: + DBUG_PRINT("info",("spider MODE_SYM")); + if (str->append(STRING_WITH_LEN("MODE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case MODIFIES_SYM: + DBUG_PRINT("info",("spider MODIFIES_SYM")); + if (str->append(STRING_WITH_LEN("MODIFIES "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case MODIFY_SYM: + DBUG_PRINT("info",("spider MODIFY_SYM")); + if (str->append(STRING_WITH_LEN("MODIFY "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case MONTH_SYM: + DBUG_PRINT("info",("spider MONTH_SYM")); + if (str->append(STRING_WITH_LEN("MONTH "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case MULTILINESTRING: + DBUG_PRINT("info",("spider MULTILINESTRING")); + if (str->append(STRING_WITH_LEN("MULTILINESTRING "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case MULTIPOINT: + DBUG_PRINT("info",("spider MULTIPOINT")); + if (str->append(STRING_WITH_LEN("MULTIPOINT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case MULTIPOLYGON: + DBUG_PRINT("info",("spider MULTIPOLYGON")); + if (str->append(STRING_WITH_LEN("MULTIPOLYGON "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case MUTEX_SYM: + DBUG_PRINT("info",("spider MUTEX_SYM")); + if (str->append(STRING_WITH_LEN("MUTEX "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#ifdef SPIDER_TOKEN_10_3 + case MYSQL_CONCAT_SYM: + DBUG_PRINT("info",("spider MYSQL_CONCAT_SYM")); + if (str->append(STRING_WITH_LEN("CONCAT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#endif + case MYSQL_SYM: + DBUG_PRINT("info",("spider MYSQL_SYM")); + if (str->append(STRING_WITH_LEN("MYSQL "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case MYSQL_ERRNO_SYM: + DBUG_PRINT("info",("spider MYSQL_ERRNO_SYM")); + if (str->append(STRING_WITH_LEN("MYSQL_ERRNO "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case NAME_SYM: + DBUG_PRINT("info",("spider NAME_SYM")); + if (str->append(STRING_WITH_LEN("NAME "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case NAMES_SYM: + DBUG_PRINT("info",("spider NAMES_SYM")); + if (str->append(STRING_WITH_LEN("NAMES "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case NATIONAL_SYM: + DBUG_PRINT("info",("spider NATIONAL_SYM")); + if (str->append(STRING_WITH_LEN("NATIONAL "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case NATURAL: + DBUG_PRINT("info",("spider NATURAL")); + if (str->append(STRING_WITH_LEN("NATURAL "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case NCHAR_SYM: + DBUG_PRINT("info",("spider NCHAR_SYM")); + if (str->append(STRING_WITH_LEN("NCHAR "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#ifdef SPIDER_TOKEN_10_4 + case NEVER_SYM: + DBUG_PRINT("info",("spider NEVER_SYM")); + if (str->append(STRING_WITH_LEN("NEVER "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#endif + case NEW_SYM: + DBUG_PRINT("info",("spider NEW_SYM")); + if (str->append(STRING_WITH_LEN("NEW "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case NEXT_SYM: + DBUG_PRINT("info",("spider NEXT_SYM")); + if (str->append(STRING_WITH_LEN("NEXT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case NEXTVAL_SYM: + DBUG_PRINT("info",("spider NEXTVAL_SYM")); + if (str->append(STRING_WITH_LEN("NEXTVAL "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case NO_SYM: + DBUG_PRINT("info",("spider NO_SYM")); + if (str->append(STRING_WITH_LEN("NO "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case NOMAXVALUE_SYM: + DBUG_PRINT("info",("spider NOMAXVALUE_SYM")); + if (str->append(STRING_WITH_LEN("NOMAXVALUE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case NOMINVALUE_SYM: + DBUG_PRINT("info",("spider NOMINVALUE_SYM")); + if (str->append(STRING_WITH_LEN("NOMINVALUE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case NOCACHE_SYM: + DBUG_PRINT("info",("spider NOCACHE_SYM")); + if (str->append(STRING_WITH_LEN("NOCACHE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case NOCYCLE_SYM: + DBUG_PRINT("info",("spider NOCYCLE_SYM")); + if (str->append(STRING_WITH_LEN("NOCYCLE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case NO_WAIT_SYM: + DBUG_PRINT("info",("spider NO_WAIT_SYM")); + if (str->append(STRING_WITH_LEN("NO_WAIT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case NOWAIT_SYM: + DBUG_PRINT("info",("spider NOWAIT_SYM")); + if (str->append(STRING_WITH_LEN("NOWAIT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case NODEGROUP_SYM: + DBUG_PRINT("info",("spider NODEGROUP_SYM")); + if (str->append(STRING_WITH_LEN("NODEGROUP "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case NONE_SYM: + DBUG_PRINT("info",("spider NONE_SYM")); + if (str->append(STRING_WITH_LEN("NONE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case NOT_SYM: + DBUG_PRINT("info",("spider NOT_SYM")); + if (str->append(STRING_WITH_LEN("NOT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case NOTFOUND_SYM: + DBUG_PRINT("info",("spider NOTFOUND_SYM")); + if (str->append(STRING_WITH_LEN("NOTFOUND "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case NO_WRITE_TO_BINLOG: + DBUG_PRINT("info",("spider NO_WRITE_TO_BINLOG")); + if (str->append(STRING_WITH_LEN("NO_WRITE_TO_BINLOG "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case NULL_SYM: + DBUG_PRINT("info",("spider NULL_SYM")); + if (str->append(STRING_WITH_LEN("NULL "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#ifdef SPIDER_TOKEN_10_3 + case NUMBER_MARIADB_SYM: + DBUG_PRINT("info",("spider NUMBER_MARIADB_SYM")); + if (str->append(STRING_WITH_LEN("NUMBER "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case NUMBER_ORACLE_SYM: + DBUG_PRINT("info",("spider NUMBER_ORACLE_SYM")); + if (str->append(STRING_WITH_LEN("NUMBER "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#else + case NUMBER_SYM: + DBUG_PRINT("info",("spider NUMBER_SYM")); + if (str->append(STRING_WITH_LEN("NUMBER "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#endif + case NUMERIC_SYM: + DBUG_PRINT("info",("spider NUMERIC_SYM")); + if (str->append(STRING_WITH_LEN("NUMERIC "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case NVARCHAR_SYM: + DBUG_PRINT("info",("spider NVARCHAR_SYM")); + if (str->append(STRING_WITH_LEN("NVARCHAR "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case OF_SYM: + DBUG_PRINT("info",("spider OF_SYM")); + if (str->append(STRING_WITH_LEN("OF "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case OFFSET_SYM: + DBUG_PRINT("info",("spider OFFSET_SYM")); + if (str->append(STRING_WITH_LEN("OFFSET "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case OLD_PASSWORD_SYM: + DBUG_PRINT("info",("spider OLD_PASSWORD_SYM")); + if (str->append(STRING_WITH_LEN("OLD_PASSWORD "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case ON: /* ON */ + DBUG_PRINT("info",("spider ON")); + if (str->append(STRING_WITH_LEN("ON "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case ONE_SYM: + DBUG_PRINT("info",("spider ONE_SYM")); + if (str->append(STRING_WITH_LEN("ONE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case ONLINE_SYM: + DBUG_PRINT("info",("spider ONLINE_SYM")); + if (str->append(STRING_WITH_LEN("ONLINE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case ONLY_SYM: + DBUG_PRINT("info",("spider ONLY_SYM")); + if (str->append(STRING_WITH_LEN("ONLY "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case OPEN_SYM: + DBUG_PRINT("info",("spider OPEN_SYM")); + if (str->append(STRING_WITH_LEN("OPEN "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case OPTIMIZE: + DBUG_PRINT("info",("spider OPTIMIZE")); + if (str->append(STRING_WITH_LEN("OPTIMIZE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case OPTIONS_SYM: + DBUG_PRINT("info",("spider OPTIONS_SYM")); + if (str->append(STRING_WITH_LEN("OPTIONS "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case OPTION: + DBUG_PRINT("info",("spider OPTION")); + if (str->append(STRING_WITH_LEN("OPTION "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case OPTIONALLY: + DBUG_PRINT("info",("spider OPTIONALLY")); + if (str->append(STRING_WITH_LEN("OPTIONALLY "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case OR_SYM: + DBUG_PRINT("info",("spider OR_SYM")); + if (str->append(STRING_WITH_LEN("OR "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#ifdef SPIDER_TOKEN_10_3 + case ORACLE_CONCAT_SYM: + DBUG_PRINT("info",("spider ORACLE_CONCAT_SYM")); + if (str->append(STRING_WITH_LEN("|| "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#endif + case ORDER_SYM: + DBUG_PRINT("info",("spider ORDER_SYM")); + if (str->append(STRING_WITH_LEN("ORDER "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#ifdef SPIDER_TOKEN_10_3 + case OTHERS_MARIADB_SYM: + DBUG_PRINT("info",("spider OTHERS_MARIADB_SYM")); + if (str->append(STRING_WITH_LEN("OTHERS "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case OTHERS_ORACLE_SYM: + DBUG_PRINT("info",("spider OTHERS_ORACLE_SYM")); + if (str->append(STRING_WITH_LEN("OTHERS "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#else + case OTHERS_SYM: + DBUG_PRINT("info",("spider OTHERS_SYM")); + if (str->append(STRING_WITH_LEN("OTHERS "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#endif + case OUT_SYM: + DBUG_PRINT("info",("spider OUT_SYM")); + if (str->append(STRING_WITH_LEN("OUT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case OUTER: + DBUG_PRINT("info",("spider OUTER")); + if (str->append(STRING_WITH_LEN("OUTER "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case OUTFILE: + DBUG_PRINT("info",("spider OUTFILE")); + if (str->append(STRING_WITH_LEN("OUTFILE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case OVER_SYM: + DBUG_PRINT("info",("spider OVER_SYM")); + if (str->append(STRING_WITH_LEN("OVER "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case OWNER_SYM: + DBUG_PRINT("info",("spider OWNER_SYM")); + if (str->append(STRING_WITH_LEN("OWNER "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#ifdef SPIDER_TOKEN_10_3 + case PACKAGE_MARIADB_SYM: + DBUG_PRINT("info",("spider PACKAGE_MARIADB_SYM")); + if (str->append(STRING_WITH_LEN("PACKAGE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case PACKAGE_ORACLE_SYM: + DBUG_PRINT("info",("spider PACKAGE_ORACLE_SYM")); + if (str->append(STRING_WITH_LEN("PACKAGE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#else + case PACKAGE_SYM: + DBUG_PRINT("info",("spider PACKAGE_SYM")); + if (str->append(STRING_WITH_LEN("PACKAGE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#endif + case PACK_KEYS_SYM: + DBUG_PRINT("info",("spider PACK_KEYS_SYM")); + if (str->append(STRING_WITH_LEN("PACK_KEYS "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case PAGE_SYM: + DBUG_PRINT("info",("spider PAGE_SYM")); + if (str->append(STRING_WITH_LEN("PAGE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case PAGE_CHECKSUM_SYM: + DBUG_PRINT("info",("spider PAGE_CHECKSUM_SYM")); + if (str->append(STRING_WITH_LEN("PAGE_CHECKSUM "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case PARSER_SYM: + DBUG_PRINT("info",("spider PARSER_SYM")); + if (str->append(STRING_WITH_LEN("PARSER "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case PARSE_VCOL_EXPR_SYM: + DBUG_PRINT("info",("spider PARSE_VCOL_EXPR_SYM")); + if (str->append(STRING_WITH_LEN("PARSE_VCOL_EXPR "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case PERIOD_SYM: + DBUG_PRINT("info",("spider PERIOD_SYM")); + if (str->append(STRING_WITH_LEN("PERIOD "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case PARTIAL: + DBUG_PRINT("info",("spider PARTIAL")); + if (str->append(STRING_WITH_LEN("PARTIAL "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case PARTITION_SYM: + DBUG_PRINT("info",("spider PARTITION_SYM")); + if (str->append(STRING_WITH_LEN("PARTITION "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case PARTITIONING_SYM: + DBUG_PRINT("info",("spider PARTITIONING_SYM")); + if (str->append(STRING_WITH_LEN("PARTITIONING "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case PARTITIONS_SYM: + DBUG_PRINT("info",("spider PARTITIONS_SYM")); + if (str->append(STRING_WITH_LEN("PARTITIONS "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case PASSWORD_SYM: + DBUG_PRINT("info",("spider PASSWORD_SYM")); + if (str->append(STRING_WITH_LEN("PASSWORD "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case PERSISTENT_SYM: + DBUG_PRINT("info",("spider PERSISTENT_SYM")); + if (str->append(STRING_WITH_LEN("PERSISTENT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case PHASE_SYM: + DBUG_PRINT("info",("spider PHASE_SYM")); + if (str->append(STRING_WITH_LEN("PHASE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case PLUGIN_SYM: + DBUG_PRINT("info",("spider PLUGIN_SYM")); + if (str->append(STRING_WITH_LEN("PLUGIN "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case PLUGINS_SYM: + DBUG_PRINT("info",("spider PLUGINS_SYM")); + if (str->append(STRING_WITH_LEN("PLUGINS "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case POINT_SYM: + DBUG_PRINT("info",("spider POINT_SYM")); + if (str->append(STRING_WITH_LEN("POINT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case POLYGON: + DBUG_PRINT("info",("spider POLYGON")); + if (str->append(STRING_WITH_LEN("POLYGON "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case PORT_SYM: + DBUG_PRINT("info",("spider PORT_SYM")); + if (str->append(STRING_WITH_LEN("PORT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#ifdef SPIDER_TOKEN_10_3 + case PREC_BELOW_CONTRACTION_TOKEN2: + DBUG_PRINT("info",("spider PREC_BELOW_CONTRACTION_TOKEN2")); + if (str->append(STRING_WITH_LEN("PREC_BELOW_CONTRACTION_TOKEN2 "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case PREC_BELOW_ESCAPE: + DBUG_PRINT("info",("spider PREC_BELOW_ESCAPE")); + if (str->append(STRING_WITH_LEN("PREC_BELOW_ESCAPE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case PREC_BELOW_IDENTIFIER_OPT_SPECIAL_CASE: + DBUG_PRINT("info",("spider PREC_BELOW_IDENTIFIER_OPT_SPECIAL_CASE")); + if (str->append(STRING_WITH_LEN("PREC_BELOW_IDENTIFIER_OPT_SPECIAL_CASE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case PREC_BELOW_NOT: + DBUG_PRINT("info",("spider PREC_BELOW_NOT")); + if (str->append(STRING_WITH_LEN("PREC_BELOW_NOT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#endif + case PRECEDES_SYM: + DBUG_PRINT("info",("spider PRECEDES_SYM")); + if (str->append(STRING_WITH_LEN("PRECEDES "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case PRECEDING_SYM: + DBUG_PRINT("info",("spider PRECEDING_SYM")); + if (str->append(STRING_WITH_LEN("PRECEDING "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case PRECISION: + DBUG_PRINT("info",("spider PRECISION")); + if (str->append(STRING_WITH_LEN("PRECISION "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case PREPARE_SYM: /* PREPARE */ + DBUG_PRINT("info",("spider PREPARE_SYM")); + if (str->append(STRING_WITH_LEN("PREPARE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case PRESERVE_SYM: + DBUG_PRINT("info",("spider PRESERVE_SYM")); + if (str->append(STRING_WITH_LEN("PRESERVE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case PREV_SYM: + DBUG_PRINT("info",("spider PREV_SYM")); + if (str->append(STRING_WITH_LEN("PREV "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case PREVIOUS_SYM: + DBUG_PRINT("info",("spider PREVIOUS_SYM")); + if (str->append(STRING_WITH_LEN("PREVIOUS "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case PRIMARY_SYM: + DBUG_PRINT("info",("spider PRIMARY_SYM")); + if (str->append(STRING_WITH_LEN("PRIMARY "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case PRIVILEGES: + DBUG_PRINT("info",("spider PRIVILEGES")); + if (str->append(STRING_WITH_LEN("PRIVILEGES "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case PROCEDURE_SYM: + DBUG_PRINT("info",("spider PROCEDURE_SYM")); + if (str->append(STRING_WITH_LEN("PROCEDURE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case PROCESS: + DBUG_PRINT("info",("spider PROCESS")); + if (str->append(STRING_WITH_LEN("PROCESS "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case PROCESSLIST_SYM: + DBUG_PRINT("info",("spider PROCESSLIST_SYM")); + if (str->append(STRING_WITH_LEN("PROCESSLIST "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case PROFILE_SYM: + DBUG_PRINT("info",("spider PROFILE_SYM")); + if (str->append(STRING_WITH_LEN("PROFILE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case PROFILES_SYM: + DBUG_PRINT("info",("spider PROFILES_SYM")); + if (str->append(STRING_WITH_LEN("PROFILES "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case PROXY_SYM: + DBUG_PRINT("info",("spider PROXY_SYM")); + if (str->append(STRING_WITH_LEN("PROXY "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case PURGE: + DBUG_PRINT("info",("spider PURGE")); + if (str->append(STRING_WITH_LEN("PURGE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case QUARTER_SYM: + DBUG_PRINT("info",("spider QUARTER_SYM")); + if (str->append(STRING_WITH_LEN("QUARTER "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case QUERY_SYM: + DBUG_PRINT("info",("spider QUERY_SYM")); + if (str->append(STRING_WITH_LEN("QUERY "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case QUICK: + DBUG_PRINT("info",("spider QUICK")); + if (str->append(STRING_WITH_LEN("QUICK "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#ifdef SPIDER_TOKEN_10_3 + case RAISE_MARIADB_SYM: + DBUG_PRINT("info",("spider RAISE_MARIADB_SYM")); + if (str->append(STRING_WITH_LEN("RAISE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case RAISE_ORACLE_SYM: + DBUG_PRINT("info",("spider RAISE_ORACLE_SYM")); + if (str->append(STRING_WITH_LEN("RAISE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#else + case RAISE_SYM: + DBUG_PRINT("info",("spider RAISE_SYM")); + if (str->append(STRING_WITH_LEN("RAISE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#endif + case RANGE_SYM: + DBUG_PRINT("info",("spider RANGE_SYM")); + if (str->append(STRING_WITH_LEN("RANGE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#ifdef SPIDER_TOKEN_10_3 + case RAW_MARIADB_SYM: + DBUG_PRINT("info",("spider RAW_MARIADB_SYM")); + if (str->append(STRING_WITH_LEN("RAW "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case RAW_ORACLE_SYM: + DBUG_PRINT("info",("spider RAW_ORACLE_SYM")); + if (str->append(STRING_WITH_LEN("RAW "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#else + case RAW: + DBUG_PRINT("info",("spider RAW")); + if (str->append(STRING_WITH_LEN("RAW "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#endif + case READ_SYM: + DBUG_PRINT("info",("spider READ_SYM")); + if (str->append(STRING_WITH_LEN("READ "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case READ_ONLY_SYM: + DBUG_PRINT("info",("spider READ_ONLY_SYM")); + if (str->append(STRING_WITH_LEN("READ_ONLY "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case READ_WRITE_SYM: + DBUG_PRINT("info",("spider READ_WRITE_SYM")); + if (str->append(STRING_WITH_LEN("READ_WRITE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case READS_SYM: + DBUG_PRINT("info",("spider READS_SYM")); + if (str->append(STRING_WITH_LEN("READS "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case REAL: + DBUG_PRINT("info",("spider REAL")); + if (str->append(STRING_WITH_LEN("REAL "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case REBUILD_SYM: + DBUG_PRINT("info",("spider REBUILD_SYM")); + if (str->append(STRING_WITH_LEN("REBUILD "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case RECOVER_SYM: + DBUG_PRINT("info",("spider RECOVER_SYM")); + if (str->append(STRING_WITH_LEN("RECOVER "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case RECURSIVE_SYM: + DBUG_PRINT("info",("spider RECURSIVE_SYM")); + if (str->append(STRING_WITH_LEN("RECURSIVE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case REDO_BUFFER_SIZE_SYM: + DBUG_PRINT("info",("spider REDO_BUFFER_SIZE_SYM")); + if (str->append(STRING_WITH_LEN("REDO_BUFFER_SIZE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case REDOFILE_SYM: + DBUG_PRINT("info",("spider REDOFILE_SYM")); + if (str->append(STRING_WITH_LEN("REDOFILE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case REDUNDANT_SYM: + DBUG_PRINT("info",("spider REDUNDANT_SYM")); + if (str->append(STRING_WITH_LEN("REDUNDANT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case REFERENCES: + DBUG_PRINT("info",("spider REFERENCES")); + if (str->append(STRING_WITH_LEN("REFERENCES "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case REGEXP: + DBUG_PRINT("info",("spider REGEXP")); + if (str->append(STRING_WITH_LEN("REGEXP "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case RELAY: + DBUG_PRINT("info",("spider RELAY")); + if (str->append(STRING_WITH_LEN("RELAY "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case RELAYLOG_SYM: + DBUG_PRINT("info",("spider RELAYLOG_SYM")); + if (str->append(STRING_WITH_LEN("RELAYLOG "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case RELAY_LOG_FILE_SYM: + DBUG_PRINT("info",("spider RELAY_LOG_FILE_SYM")); + if (str->append(STRING_WITH_LEN("RELAY_LOG_FILE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case RELAY_LOG_POS_SYM: + DBUG_PRINT("info",("spider RELAY_LOG_POS_SYM")); + if (str->append(STRING_WITH_LEN("RELAY_LOG_POS "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case RELEASE_SYM: + DBUG_PRINT("info",("spider RELEASE_SYM")); + if (str->append(STRING_WITH_LEN("RELEASE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case RELOAD: + DBUG_PRINT("info",("spider RELOAD")); + if (str->append(STRING_WITH_LEN("RELOAD "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case REMOVE_SYM: + DBUG_PRINT("info",("spider REMOVE_SYM")); + if (str->append(STRING_WITH_LEN("REMOVE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case RENAME: + DBUG_PRINT("info",("spider RENAME")); + if (str->append(STRING_WITH_LEN("RENAME "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case REORGANIZE_SYM: + DBUG_PRINT("info",("spider REORGANIZE_SYM")); + if (str->append(STRING_WITH_LEN("REORGANIZE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case REPAIR: + DBUG_PRINT("info",("spider REPAIR")); + if (str->append(STRING_WITH_LEN("REPAIR "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case REPEATABLE_SYM: + DBUG_PRINT("info",("spider REPEATABLE_SYM")); + if (str->append(STRING_WITH_LEN("REPEATABLE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case REPLACE: + DBUG_PRINT("info",("spider REPLACE")); + if (str->append(STRING_WITH_LEN("REPLACE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case REPLICATION: + DBUG_PRINT("info",("spider REPLICATION")); + if (str->append(STRING_WITH_LEN("REPLICATION "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case REPEAT_SYM: + DBUG_PRINT("info",("spider REPEAT_SYM")); + if (str->append(STRING_WITH_LEN("REPEAT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case REQUIRE_SYM: + DBUG_PRINT("info",("spider REQUIRE_SYM")); + if (str->append(STRING_WITH_LEN("REQUIRE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case RESET_SYM: + DBUG_PRINT("info",("spider RESET_SYM")); + if (str->append(STRING_WITH_LEN("RESET "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case RESIGNAL_SYM: + DBUG_PRINT("info",("spider RESIGNAL_SYM")); + if (str->append(STRING_WITH_LEN("RESIGNAL "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case RESTART_SYM: + DBUG_PRINT("info",("spider RESTART_SYM")); + if (str->append(STRING_WITH_LEN("RESTART "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case RESTORE_SYM: + DBUG_PRINT("info",("spider RESTORE_SYM")); + if (str->append(STRING_WITH_LEN("RESTORE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case RESTRICT: + DBUG_PRINT("info",("spider RESTRICT")); + if (str->append(STRING_WITH_LEN("RESTRICT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case RESUME_SYM: + DBUG_PRINT("info",("spider RESUME_SYM")); + if (str->append(STRING_WITH_LEN("RESUME "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case RETURNED_SQLSTATE_SYM: + DBUG_PRINT("info",("spider RETURNED_SQLSTATE_SYM")); + if (str->append(STRING_WITH_LEN("RETURNED_SQLSTATE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#ifdef SPIDER_TOKEN_10_3 + case RETURN_MARIADB_SYM: + DBUG_PRINT("info",("spider RETURN_MARIADB_SYM")); + if (str->append(STRING_WITH_LEN("RETURN "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case RETURN_ORACLE_SYM: + DBUG_PRINT("info",("spider RETURN_ORACLE_SYM")); + if (str->append(STRING_WITH_LEN("RETURN "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#else + case RETURN_SYM: + DBUG_PRINT("info",("spider RETURN_SYM")); + if (str->append(STRING_WITH_LEN("RETURN "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#endif + case RETURNING_SYM: + DBUG_PRINT("info",("spider RETURNING_SYM")); + if (str->append(STRING_WITH_LEN("RETURNING "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case RETURNS_SYM: + DBUG_PRINT("info",("spider RETURNS_SYM")); + if (str->append(STRING_WITH_LEN("RETURNS "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case REUSE_SYM: + DBUG_PRINT("info",("spider REUSE_SYM")); + if (str->append(STRING_WITH_LEN("REUSE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case REVERSE_SYM: + DBUG_PRINT("info",("spider REVERSE_SYM")); + if (str->append(STRING_WITH_LEN("REVERSE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case REVOKE: + DBUG_PRINT("info",("spider REVOKE")); + if (str->append(STRING_WITH_LEN("REVOKE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case RIGHT: + DBUG_PRINT("info",("spider RIGHT")); + if (str->append(STRING_WITH_LEN("RIGHT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case ROLE_SYM: + DBUG_PRINT("info",("spider ROLE_SYM")); + if (str->append(STRING_WITH_LEN("ROLE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case ROLLBACK_SYM: + DBUG_PRINT("info",("spider ROLLBACK_SYM")); + if (str->append(STRING_WITH_LEN("ROLLBACK "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case ROLLUP_SYM: + DBUG_PRINT("info",("spider ROLLUP_SYM")); + if (str->append(STRING_WITH_LEN("ROLLUP "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case ROUTINE_SYM: + DBUG_PRINT("info",("spider ROUTINE_SYM")); + if (str->append(STRING_WITH_LEN("ROUTINE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case ROW_SYM: + DBUG_PRINT("info",("spider ROW_SYM")); + if (str->append(STRING_WITH_LEN("ROW "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case ROWCOUNT_SYM: + DBUG_PRINT("info",("spider ROWCOUNT_SYM")); + if (str->append(STRING_WITH_LEN("ROWCOUNT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case ROWS_SYM: + DBUG_PRINT("info",("spider ROWS_SYM")); + if (str->append(STRING_WITH_LEN("ROWS "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#ifdef SPIDER_TOKEN_10_3 + case ROWTYPE_MARIADB_SYM: + DBUG_PRINT("info",("spider ROWTYPE_MARIADB_SYM")); + if (str->append(STRING_WITH_LEN("ROWTYPE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case ROWTYPE_ORACLE_SYM: + DBUG_PRINT("info",("spider ROWTYPE_ORACLE_SYM")); + if (str->append(STRING_WITH_LEN("ROWTYPE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#else + case ROWTYPE_SYM: + DBUG_PRINT("info",("spider ROWTYPE_SYM")); + if (str->append(STRING_WITH_LEN("ROWTYPE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#endif + case ROW_COUNT_SYM: + DBUG_PRINT("info",("spider ROW_COUNT_SYM")); + if (str->append(STRING_WITH_LEN("ROW_COUNT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case ROW_FORMAT_SYM: + DBUG_PRINT("info",("spider ROW_FORMAT_SYM")); + if (str->append(STRING_WITH_LEN("ROW_FORMAT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case RTREE_SYM: + DBUG_PRINT("info",("spider RTREE_SYM")); + if (str->append(STRING_WITH_LEN("RTREE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case SAVEPOINT_SYM: + DBUG_PRINT("info",("spider SAVEPOINT_SYM")); + if (str->append(STRING_WITH_LEN("SAVEPOINT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case SCHEDULE_SYM: + DBUG_PRINT("info",("spider SCHEDULE_SYM")); + if (str->append(STRING_WITH_LEN("SCHEDULE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case SCHEMA_NAME_SYM: + DBUG_PRINT("info",("spider SCHEMA_NAME_SYM")); + if (str->append(STRING_WITH_LEN("SCHEMA_NAME "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case SECOND_SYM: + DBUG_PRINT("info",("spider SECOND_SYM")); + if (str->append(STRING_WITH_LEN("SECOND "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case SECOND_MICROSECOND_SYM: + DBUG_PRINT("info",("spider SECOND_MICROSECOND_SYM")); + if (str->append(STRING_WITH_LEN("SECOND_MICROSECOND "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case SECURITY_SYM: + DBUG_PRINT("info",("spider SECURITY_SYM")); + if (str->append(STRING_WITH_LEN("SECURITY "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case SELECT_SYM: /* SELECT */ + DBUG_PRINT("info",("spider SELECT_SYM")); + if (str->append(STRING_WITH_LEN("SELECT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case SENSITIVE_SYM: + DBUG_PRINT("info",("spider SENSITIVE_SYM")); + if (str->append(STRING_WITH_LEN("SENSITIVE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case SEPARATOR_SYM: + DBUG_PRINT("info",("spider SEPARATOR_SYM")); + if (str->append(STRING_WITH_LEN("SEPARATOR "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case SEQUENCE_SYM: + DBUG_PRINT("info",("spider SEQUENCE_SYM")); + if (str->append(STRING_WITH_LEN("SEQUENCE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case SERIAL_SYM: + DBUG_PRINT("info",("spider SERIAL_SYM")); + if (str->append(STRING_WITH_LEN("SERIAL "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case SERIALIZABLE_SYM: + DBUG_PRINT("info",("spider SERIALIZABLE_SYM")); + if (str->append(STRING_WITH_LEN("SERIALIZABLE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case SESSION_SYM: + DBUG_PRINT("info",("spider SESSION_SYM")); + if (str->append(STRING_WITH_LEN("SESSION "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#ifdef SPIDER_TOKEN_10_3 + case SERVER_OPTIONS: + DBUG_PRINT("info",("spider SERVER_OPTIONS")); + if (str->append(STRING_WITH_LEN("SERVER_OPTIONS "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#endif + case SERVER_SYM: + DBUG_PRINT("info",("spider SERVER_SYM")); + if (str->append(STRING_WITH_LEN("SERVER "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case SET: + DBUG_PRINT("info",("spider SET")); + if (str->append(STRING_WITH_LEN("SET "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case SETVAL_SYM: + DBUG_PRINT("info",("spider SETVAL_SYM")); + if (str->append(STRING_WITH_LEN("SETVAL "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case SHARE_SYM: + DBUG_PRINT("info",("spider SHARE_SYM")); + if (str->append(STRING_WITH_LEN("SHARE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case SHOW: + DBUG_PRINT("info",("spider SHOW")); + if (str->append(STRING_WITH_LEN("SHOW "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case SHUTDOWN: + DBUG_PRINT("info",("spider SHUTDOWN")); + if (str->append(STRING_WITH_LEN("SHUTDOWN "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case SIGNAL_SYM: + DBUG_PRINT("info",("spider SIGNAL_SYM")); + if (str->append(STRING_WITH_LEN("SIGNAL "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case SIGNED_SYM: + DBUG_PRINT("info",("spider SIGNED_SYM")); + if (str->append(STRING_WITH_LEN("SIGNED "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case SIMPLE_SYM: + DBUG_PRINT("info",("spider SIMPLE_SYM")); + if (str->append(STRING_WITH_LEN("SIMPLE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case SLAVE: + DBUG_PRINT("info",("spider SLAVE")); + if (str->append(STRING_WITH_LEN("SLAVE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case SLAVES: + DBUG_PRINT("info",("spider SLAVES")); + if (str->append(STRING_WITH_LEN("SLAVES "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case SLAVE_POS_SYM: + DBUG_PRINT("info",("spider SLAVE_POS_SYM")); + if (str->append(STRING_WITH_LEN("SLAVE_POS "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case SLOW: + DBUG_PRINT("info",("spider SLOW")); + if (str->append(STRING_WITH_LEN("SLOW "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case SNAPSHOT_SYM: + DBUG_PRINT("info",("spider SNAPSHOT_SYM")); + if (str->append(STRING_WITH_LEN("SNAPSHOT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case SMALLINT: + DBUG_PRINT("info",("spider SMALLINT")); + if (str->append(STRING_WITH_LEN("SMALLINT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case SOCKET_SYM: + DBUG_PRINT("info",("spider SOCKET_SYM")); + if (str->append(STRING_WITH_LEN("SOCKET "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case SOFT_SYM: + DBUG_PRINT("info",("spider SOFT_SYM")); + if (str->append(STRING_WITH_LEN("SOFT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case SONAME_SYM: + DBUG_PRINT("info",("spider SONAME_SYM")); + if (str->append(STRING_WITH_LEN("SONAME "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case SOUNDS_SYM: + DBUG_PRINT("info",("spider SOUNDS_SYM")); + if (str->append(STRING_WITH_LEN("SOUNDS "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case SOURCE_SYM: + DBUG_PRINT("info",("spider SOURCE_SYM")); + if (str->append(STRING_WITH_LEN("SOURCE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case STORED_SYM: + DBUG_PRINT("info",("spider STORED_SYM")); + if (str->append(STRING_WITH_LEN("STORED "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case SPATIAL_SYM: + DBUG_PRINT("info",("spider SPATIAL_SYM")); + if (str->append(STRING_WITH_LEN("SPATIAL "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case SPECIFIC_SYM: + DBUG_PRINT("info",("spider SPECIFIC_SYM")); + if (str->append(STRING_WITH_LEN("SPECIFIC "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case REF_SYSTEM_ID_SYM: + DBUG_PRINT("info",("spider REF_SYSTEM_ID_SYM")); + if (str->append(STRING_WITH_LEN("REF_SYSTEM_ID "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case SQL_SYM: + DBUG_PRINT("info",("spider SQL_SYM")); + if (str->append(STRING_WITH_LEN("SQL "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case SQLEXCEPTION_SYM: + DBUG_PRINT("info",("spider SQLEXCEPTION_SYM")); + if (str->append(STRING_WITH_LEN("SQLEXCEPTION "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case SQLSTATE_SYM: + DBUG_PRINT("info",("spider SQLSTATE_SYM")); + if (str->append(STRING_WITH_LEN("SQLSTATE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case SQLWARNING_SYM: + DBUG_PRINT("info",("spider SQLWARNING_SYM")); + if (str->append(STRING_WITH_LEN("SQLWARNING "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case SQL_BIG_RESULT: + DBUG_PRINT("info",("spider SQL_BIG_RESULT")); + if (str->append(STRING_WITH_LEN("SQL_BIG_RESULT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case SQL_BUFFER_RESULT: + DBUG_PRINT("info",("spider SQL_BUFFER_RESULT")); + if (str->append(STRING_WITH_LEN("SQL_BUFFER_RESULT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case SQL_CACHE_SYM: + DBUG_PRINT("info",("spider SQL_CACHE_SYM")); + if (str->append(STRING_WITH_LEN("SQL_CACHE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case SQL_CALC_FOUND_ROWS: + DBUG_PRINT("info",("spider SQL_CALC_FOUND_ROWS")); + if (str->append(STRING_WITH_LEN("SQL_CALC_FOUND_ROWS "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case SQL_NO_CACHE_SYM: + DBUG_PRINT("info",("spider SQL_NO_CACHE_SYM")); + if (str->append(STRING_WITH_LEN("SQL_NO_CACHE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case SQL_SMALL_RESULT: + DBUG_PRINT("info",("spider SQL_SMALL_RESULT")); + if (str->append(STRING_WITH_LEN("SQL_SMALL_RESULT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case SQL_THREAD: + DBUG_PRINT("info",("spider SQL_THREAD")); + if (str->append(STRING_WITH_LEN("SQL_THREAD "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case SSL_SYM: + DBUG_PRINT("info",("spider SSL_SYM")); + if (str->append(STRING_WITH_LEN("SSL "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#ifdef SPIDER_TOKEN_10_4 + case STAGE_SYM: + DBUG_PRINT("info",("spider STAGE_SYM")); + if (str->append(STRING_WITH_LEN("STAGE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#endif + case START_SYM: + DBUG_PRINT("info",("spider START_SYM")); + if (str->append(STRING_WITH_LEN("START "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case STARTING: + DBUG_PRINT("info",("spider STARTING")); + if (str->append(STRING_WITH_LEN("STARTING "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case STARTS_SYM: + DBUG_PRINT("info",("spider STARTS_SYM")); + if (str->append(STRING_WITH_LEN("STARTS "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case STATEMENT_SYM: + DBUG_PRINT("info",("spider STATEMENT_SYM")); + if (str->append(STRING_WITH_LEN("STATEMENT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case STATS_AUTO_RECALC_SYM: + DBUG_PRINT("info",("spider STATS_AUTO_RECALC_SYM")); + if (str->append(STRING_WITH_LEN("STATS_AUTO_RECALC "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case STATS_PERSISTENT_SYM: + DBUG_PRINT("info",("spider STATS_PERSISTENT_SYM")); + if (str->append(STRING_WITH_LEN("STATS_PERSISTENT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case STATS_SAMPLE_PAGES_SYM: + DBUG_PRINT("info",("spider STATS_SAMPLE_PAGES_SYM")); + if (str->append(STRING_WITH_LEN("STATS_SAMPLE_PAGES "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case STATUS_SYM: + DBUG_PRINT("info",("spider STATUS_SYM")); + if (str->append(STRING_WITH_LEN("STATUS "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case STOP_SYM: + DBUG_PRINT("info",("spider STOP_SYM")); + if (str->append(STRING_WITH_LEN("STOP "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case STORAGE_SYM: + DBUG_PRINT("info",("spider STORAGE_SYM")); + if (str->append(STRING_WITH_LEN("STORAGE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case STRAIGHT_JOIN: + DBUG_PRINT("info",("spider STRAIGHT_JOIN")); + if (str->append(STRING_WITH_LEN("STRAIGHT_JOIN "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case STRING_SYM: + DBUG_PRINT("info",("spider STRING_SYM")); + if (str->append(STRING_WITH_LEN("STRING "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case SUBCLASS_ORIGIN_SYM: + DBUG_PRINT("info",("spider SUBCLASS_ORIGIN_SYM")); + if (str->append(STRING_WITH_LEN("SUBCLASS_ORIGIN "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case SUBJECT_SYM: + DBUG_PRINT("info",("spider SUBJECT_SYM")); + if (str->append(STRING_WITH_LEN("SUBJECT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case SUBPARTITION_SYM: + DBUG_PRINT("info",("spider SUBPARTITION_SYM")); + if (str->append(STRING_WITH_LEN("SUBPARTITION "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case SUBPARTITIONS_SYM: + DBUG_PRINT("info",("spider SUBPARTITIONS_SYM")); + if (str->append(STRING_WITH_LEN("SUBPARTITIONS "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case SUPER_SYM: + DBUG_PRINT("info",("spider SUPER_SYM")); + if (str->append(STRING_WITH_LEN("SUPER "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case SUSPEND_SYM: + DBUG_PRINT("info",("spider SUSPEND_SYM")); + if (str->append(STRING_WITH_LEN("SUSPEND "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case SWAPS_SYM: + DBUG_PRINT("info",("spider SWAPS_SYM")); + if (str->append(STRING_WITH_LEN("SWAPS "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case SWITCHES_SYM: + DBUG_PRINT("info",("spider SWITCHES_SYM")); + if (str->append(STRING_WITH_LEN("SWITCHES "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case SYSTEM: + DBUG_PRINT("info",("spider SYSTEM")); + if (str->append(STRING_WITH_LEN("SYSTEM "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case SYSTEM_TIME_SYM: + DBUG_PRINT("info",("spider SYSTEM_TIME_SYM")); + if (str->append(STRING_WITH_LEN("SYSTEM_TIME "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case TABLE_SYM: + DBUG_PRINT("info",("spider TABLE_SYM")); + if (str->append(STRING_WITH_LEN("TABLE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case TABLE_NAME_SYM: + DBUG_PRINT("info",("spider TABLE_NAME_SYM")); + if (str->append(STRING_WITH_LEN("TABLE_NAME "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#ifdef SPIDER_TOKEN_10_3 + case TABLE_REF_PRIORITY: + DBUG_PRINT("info",("spider TABLE_REF_PRIORITY")); + if (str->append(STRING_WITH_LEN("TABLE_REF_PRIORITY "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#endif + case TABLES: + DBUG_PRINT("info",("spider TABLES")); + if (str->append(STRING_WITH_LEN("TABLES "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case TABLESPACE: + DBUG_PRINT("info",("spider TABLESPACE")); + if (str->append(STRING_WITH_LEN("TABLESPACE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case TABLE_CHECKSUM_SYM: + DBUG_PRINT("info",("spider TABLE_CHECKSUM_SYM")); + if (str->append(STRING_WITH_LEN("TABLE_CHECKSUM "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case TEMPORARY: + DBUG_PRINT("info",("spider TEMPORARY")); + if (str->append(STRING_WITH_LEN("TEMPORARY "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case TEMPTABLE_SYM: + DBUG_PRINT("info",("spider TEMPTABLE_SYM")); + if (str->append(STRING_WITH_LEN("TEMPTABLE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case TERMINATED: + DBUG_PRINT("info",("spider TERMINATED")); + if (str->append(STRING_WITH_LEN("TERMINATED "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case TEXT_SYM: + DBUG_PRINT("info",("spider TEXT_SYM")); + if (str->append(STRING_WITH_LEN("TEXT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case THAN_SYM: + DBUG_PRINT("info",("spider THAN_SYM")); + if (str->append(STRING_WITH_LEN("THAN "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case THEN_SYM: + DBUG_PRINT("info",("spider THEN_SYM")); + if (str->append(STRING_WITH_LEN("THEN "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case TIES_SYM: + DBUG_PRINT("info",("spider TIES_SYM")); + if (str->append(STRING_WITH_LEN("TIES "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case TIME_SYM: + DBUG_PRINT("info",("spider TIME_SYM")); + if (str->append(STRING_WITH_LEN("TIME "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case TIMESTAMP: + DBUG_PRINT("info",("spider TIMESTAMP")); + if (str->append(STRING_WITH_LEN("TIMESTAMP "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case TIMESTAMP_ADD: + DBUG_PRINT("info",("spider TIMESTAMP_ADD")); + if (str->append(STRING_WITH_LEN("TIMESTAMPADD "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case TIMESTAMP_DIFF: + DBUG_PRINT("info",("spider TIMESTAMP_DIFF")); + if (str->append(STRING_WITH_LEN("TIMESTAMPDIFF "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case TINYBLOB: + DBUG_PRINT("info",("spider TINYBLOB")); + if (str->append(STRING_WITH_LEN("TINYBLOB "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case TINYINT: + DBUG_PRINT("info",("spider TINYINT")); + if (str->append(STRING_WITH_LEN("TINYINT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case TINYTEXT: + DBUG_PRINT("info",("spider TINYTEXT")); + if (str->append(STRING_WITH_LEN("TINYTEXT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case TO_SYM: /* TO */ + DBUG_PRINT("info",("spider TO_SYM")); + if (str->append(STRING_WITH_LEN("TO "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case TRAILING: + DBUG_PRINT("info",("spider TRAILING")); + if (str->append(STRING_WITH_LEN("TRAILING "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case TRANSACTION_SYM: + DBUG_PRINT("info",("spider TRANSACTION_SYM")); + if (str->append(STRING_WITH_LEN("TRANSACTION "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case TRANSACTIONAL_SYM: + DBUG_PRINT("info",("spider TRANSACTIONAL_SYM")); + if (str->append(STRING_WITH_LEN("TRANSACTIONAL "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case TRIGGER_SYM: + DBUG_PRINT("info",("spider TRIGGER_SYM")); + if (str->append(STRING_WITH_LEN("TRIGGER "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case TRIGGERS_SYM: + DBUG_PRINT("info",("spider TRIGGERS_SYM")); + if (str->append(STRING_WITH_LEN("TRIGGERS "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case TRUE_SYM: + DBUG_PRINT("info",("spider TRUE_SYM")); + if (str->append(STRING_WITH_LEN("TRUE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case TRUNCATE_SYM: + DBUG_PRINT("info",("spider TRUNCATE_SYM")); + if (str->append(STRING_WITH_LEN("TRUNCATE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case TYPE_SYM: + DBUG_PRINT("info",("spider TYPE_SYM")); + if (str->append(STRING_WITH_LEN("TYPE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case TYPES_SYM: + DBUG_PRINT("info",("spider TYPES_SYM")); + if (str->append(STRING_WITH_LEN("TYPES "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#ifdef SPIDER_TOKEN_10_3 + case UDF_RETURNS_SYM: + DBUG_PRINT("info",("spider UDF_RETURNS_SYM")); + if (str->append(STRING_WITH_LEN("UDF_RETURNS "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#endif + case UNBOUNDED_SYM: + DBUG_PRINT("info",("spider UNBOUNDED_SYM")); + if (str->append(STRING_WITH_LEN("UNBOUNDED "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case UNCOMMITTED_SYM: + DBUG_PRINT("info",("spider UNCOMMITTED_SYM")); + if (str->append(STRING_WITH_LEN("UNCOMMITTED "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case UNDEFINED_SYM: + DBUG_PRINT("info",("spider UNDEFINED_SYM")); + if (str->append(STRING_WITH_LEN("UNDEFINED "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case UNDO_BUFFER_SIZE_SYM: + DBUG_PRINT("info",("spider UNDO_BUFFER_SIZE_SYM")); + if (str->append(STRING_WITH_LEN("UNDO_BUFFER_SIZE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case UNDOFILE_SYM: + DBUG_PRINT("info",("spider UNDOFILE_SYM")); + if (str->append(STRING_WITH_LEN("UNDOFILE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case UNDO_SYM: + DBUG_PRINT("info",("spider UNDO_SYM")); + if (str->append(STRING_WITH_LEN("UNDO "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case UNICODE_SYM: + DBUG_PRINT("info",("spider UNICODE_SYM")); + if (str->append(STRING_WITH_LEN("UNICODE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case UNION_SYM: + DBUG_PRINT("info",("spider UNION_SYM")); + if (str->append(STRING_WITH_LEN("UNION "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case UNIQUE_SYM: + DBUG_PRINT("info",("spider UNIQUE_SYM")); + if (str->append(STRING_WITH_LEN("UNIQUE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case UNKNOWN_SYM: + DBUG_PRINT("info",("spider UNKNOWN_SYM")); + if (str->append(STRING_WITH_LEN("UNKNOWN "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case UNLOCK_SYM: + DBUG_PRINT("info",("spider UNLOCK_SYM")); + if (str->append(STRING_WITH_LEN("UNLOCK "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case UNINSTALL_SYM: + DBUG_PRINT("info",("spider UNINSTALL_SYM")); + if (str->append(STRING_WITH_LEN("UNINSTALL "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case UNSIGNED: + DBUG_PRINT("info",("spider UNSIGNED")); + if (str->append(STRING_WITH_LEN("UNSIGNED "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case UNTIL_SYM: + DBUG_PRINT("info",("spider UNTIL_SYM")); + if (str->append(STRING_WITH_LEN("UNTIL "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case UPDATE_SYM: + DBUG_PRINT("info",("spider UPDATE_SYM")); + if (str->append(STRING_WITH_LEN("UPDATE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case UPGRADE_SYM: + DBUG_PRINT("info",("spider UPGRADE_SYM")); + if (str->append(STRING_WITH_LEN("UPGRADE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case USAGE: + DBUG_PRINT("info",("spider USAGE")); + if (str->append(STRING_WITH_LEN("USAGE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case USE_SYM: + DBUG_PRINT("info",("spider USE_SYM")); + if (str->append(STRING_WITH_LEN("USE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#ifdef SPIDER_TOKEN_10_3 + case USER: + DBUG_PRINT("info",("spider USER")); + if (str->append(STRING_WITH_LEN("USER "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#endif + case USER_SYM: /* USER */ + DBUG_PRINT("info",("spider USER_SYM")); + if (str->append(STRING_WITH_LEN("USER "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case RESOURCES: + DBUG_PRINT("info",("spider RESOURCES")); + if (str->append(STRING_WITH_LEN("USER_RESOURCES "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case USE_FRM: + DBUG_PRINT("info",("spider USE_FRM")); + if (str->append(STRING_WITH_LEN("USE_FRM "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case USING: /* USING */ + DBUG_PRINT("info",("spider USING")); + if (str->append(STRING_WITH_LEN("USING "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case UTC_DATE_SYM: + DBUG_PRINT("info",("spider UTC_DATE_SYM")); + if (str->append(STRING_WITH_LEN("UTC_DATE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case UTC_TIME_SYM: + DBUG_PRINT("info",("spider UTC_TIME_SYM")); + if (str->append(STRING_WITH_LEN("UTC_TIME "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case UTC_TIMESTAMP_SYM: + DBUG_PRINT("info",("spider UTC_TIMESTAMP_SYM")); + if (str->append(STRING_WITH_LEN("UTC_TIMESTAMP "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case VALUE_SYM: + DBUG_PRINT("info",("spider VALUE_SYM")); + if (str->append(STRING_WITH_LEN("VALUE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case VALUES: + DBUG_PRINT("info",("spider VALUES")); + if (str->append(STRING_WITH_LEN("VALUES "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#ifdef SPIDER_TOKEN_10_3 + case VALUES_IN_SYM: + DBUG_PRINT("info",("spider VALUES_IN_SYM")); + if (str->append(STRING_WITH_LEN("VALUES IN "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case VALUES_LESS_SYM: + DBUG_PRINT("info",("spider VALUES_LESS_SYM")); + if (str->append(STRING_WITH_LEN("VALUES LESS "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#endif + case VARBINARY: + DBUG_PRINT("info",("spider VARBINARY")); + if (str->append(STRING_WITH_LEN("VARBINARY "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case VARCHAR: + DBUG_PRINT("info",("spider VARCHAR")); + if (str->append(STRING_WITH_LEN("VARCHAR "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#ifdef SPIDER_TOKEN_10_3 + case VARCHAR2_MARIADB_SYM: + DBUG_PRINT("info",("spider VARCHAR2_MARIADB_SYM")); + if (str->append(STRING_WITH_LEN("VARCHAR2 "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case VARCHAR2_ORACLE_SYM: + DBUG_PRINT("info",("spider VARCHAR2_ORACLE_SYM")); + if (str->append(STRING_WITH_LEN("VARCHAR2 "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#else + case VARCHAR2: + DBUG_PRINT("info",("spider VARCHAR2")); + if (str->append(STRING_WITH_LEN("VARCHAR2 "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#endif + case VARIABLES: + DBUG_PRINT("info",("spider VARIABLES")); + if (str->append(STRING_WITH_LEN("VARIABLES "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case VARYING: + DBUG_PRINT("info",("spider VARYING")); + if (str->append(STRING_WITH_LEN("VARYING "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case VIA_SYM: + DBUG_PRINT("info",("spider VIA_SYM")); + if (str->append(STRING_WITH_LEN("VIA "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case VIEW_SYM: + DBUG_PRINT("info",("spider VIEW_SYM")); + if (str->append(STRING_WITH_LEN("VIEW "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case VIRTUAL_SYM: + DBUG_PRINT("info",("spider VIRTUAL_SYM")); + if (str->append(STRING_WITH_LEN("VIRTUAL "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case VERSIONING_SYM: + DBUG_PRINT("info",("spider VERSIONING_SYM")); + if (str->append(STRING_WITH_LEN("VERSIONING "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case WAIT_SYM: + DBUG_PRINT("info",("spider WAIT_SYM")); + if (str->append(STRING_WITH_LEN("WAIT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case WARNINGS: + DBUG_PRINT("info",("spider WARNINGS")); + if (str->append(STRING_WITH_LEN("WARNINGS "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case WEEK_SYM: + DBUG_PRINT("info",("spider WEEK_SYM")); + if (str->append(STRING_WITH_LEN("WEEK "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case WEIGHT_STRING_SYM: + DBUG_PRINT("info",("spider WEIGHT_STRING_SYM")); + if (str->append(STRING_WITH_LEN("WEIGHT_STRING "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case WHEN_SYM: + DBUG_PRINT("info",("spider WHEN_SYM")); + if (str->append(STRING_WITH_LEN("WHEN "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case WHERE: + DBUG_PRINT("info",("spider WHERE")); + if (str->append(STRING_WITH_LEN("WHERE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case WHILE_SYM: + DBUG_PRINT("info",("spider WHILE_SYM")); + if (str->append(STRING_WITH_LEN("WHILE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case WINDOW_SYM : + DBUG_PRINT("info",("spider WINDOW_SYM ")); + if (str->append(STRING_WITH_LEN("WINDOW "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case WITH: + DBUG_PRINT("info",("spider WITH")); + if (str->append(STRING_WITH_LEN("WITH "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#ifdef SPIDER_TOKEN_10_3 + case WITH_CUBE_SYM: + DBUG_PRINT("info",("spider WITH_CUBE_SYM")); + if (str->append(STRING_WITH_LEN("WITH_CUBE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case WITH_ROLLUP_SYM: + DBUG_PRINT("info",("spider WITH_ROLLUP_SYM")); + if (str->append(STRING_WITH_LEN("WITH_ROLLUP "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case WITH_SYSTEM_SYM: + DBUG_PRINT("info",("spider WITH_SYSTEM_SYM")); + if (str->append(STRING_WITH_LEN("WITH_SYSTEM "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#endif + case WITHIN: + DBUG_PRINT("info",("spider WITHIN")); + if (str->append(STRING_WITH_LEN("WITHIN "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case WITHOUT: + DBUG_PRINT("info",("spider WITHOUT")); + if (str->append(STRING_WITH_LEN("WITHOUT "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case WORK_SYM: + DBUG_PRINT("info",("spider WORK_SYM")); + if (str->append(STRING_WITH_LEN("WORK "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case WRAPPER_SYM: + DBUG_PRINT("info",("spider WRAPPER_SYM")); + if (str->append(STRING_WITH_LEN("WRAPPER "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case WRITE_SYM: + DBUG_PRINT("info",("spider WRITE_SYM")); + if (str->append(STRING_WITH_LEN("WRITE "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case X509_SYM: + DBUG_PRINT("info",("spider X509_SYM")); + if (str->append(STRING_WITH_LEN("X509 "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case XOR: + DBUG_PRINT("info",("spider XOR")); + if (str->append(STRING_WITH_LEN("XOR "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case XA_SYM: + DBUG_PRINT("info",("spider XA_SYM")); + if (str->append(STRING_WITH_LEN("XA "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case XML_SYM: + DBUG_PRINT("info",("spider XML_SYM")); + if (str->append(STRING_WITH_LEN("XML "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case YEAR_SYM: + DBUG_PRINT("info",("spider YEAR_SYM")); + if (str->append(STRING_WITH_LEN("YEAR "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case YEAR_MONTH_SYM: + DBUG_PRINT("info",("spider YEAR_MONTH_SYM")); + if (str->append(STRING_WITH_LEN("YEAR_MONTH "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case ZEROFILL: + DBUG_PRINT("info",("spider ZEROFILL")); + if (str->append(STRING_WITH_LEN("ZEROFILL "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case OR2_SYM: + DBUG_PRINT("info",("spider OR2_SYM")); + if (str->append(STRING_WITH_LEN("|| "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + + /* functions */ + case ADDDATE_SYM: + DBUG_PRINT("info",("spider ADDDATE_SYM")); + if (str->append(STRING_WITH_LEN("ADDDATE"))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case BIT_AND: + DBUG_PRINT("info",("spider BIT_AND")); + if (str->append(STRING_WITH_LEN("BIT_AND"))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case BIT_OR: + DBUG_PRINT("info",("spider BIT_OR")); + if (str->append(STRING_WITH_LEN("BIT_OR"))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case BIT_XOR: + DBUG_PRINT("info",("spider BIT_XOR")); + if (str->append(STRING_WITH_LEN("BIT_XOR"))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case CAST_SYM: + DBUG_PRINT("info",("spider CAST_SYM")); + if (str->append(STRING_WITH_LEN("CAST"))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case COUNT_SYM: + DBUG_PRINT("info",("spider COUNT_SYM")); + if (str->append(STRING_WITH_LEN("COUNT"))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case CUME_DIST_SYM: + DBUG_PRINT("info",("spider CUME_DIST_SYM")); + if (str->append(STRING_WITH_LEN("CUME_DIST"))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case DATE_ADD_INTERVAL: + DBUG_PRINT("info",("spider DATE_ADD_INTERVAL")); + if (str->append(STRING_WITH_LEN("DATE_ADD"))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case DATE_SUB_INTERVAL: + DBUG_PRINT("info",("spider DATE_SUB_INTERVAL")); + if (str->append(STRING_WITH_LEN("DATE_SUB"))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case DATE_FORMAT_SYM: + DBUG_PRINT("info",("spider DATE_FORMAT_SYM")); + if (str->append(STRING_WITH_LEN("DATE_FORMAT"))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#ifdef SPIDER_TOKEN_10_3 + case DECODE_MARIADB_SYM: + DBUG_PRINT("info",("spider DECODE_MARIADB_SYM")); + if (str->append(STRING_WITH_LEN("DECODE"))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case DECODE_ORACLE_SYM: + DBUG_PRINT("info",("spider DECODE_ORACLE_SYM")); + if (str->append(STRING_WITH_LEN("DECODE"))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#else + case DECODE_SYM: + DBUG_PRINT("info",("spider DECODE_SYM")); + if (str->append(STRING_WITH_LEN("DECODE"))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#endif + case DENSE_RANK_SYM: + DBUG_PRINT("info",("spider DENSE_RANK_SYM")); + if (str->append(STRING_WITH_LEN("DENSE_RANK"))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case EXTRACT_SYM: + DBUG_PRINT("info",("spider EXTRACT_SYM")); + if (str->append(STRING_WITH_LEN("EXTRACT"))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case FIRST_VALUE_SYM: + DBUG_PRINT("info",("spider FIRST_VALUE_SYM")); + if (str->append(STRING_WITH_LEN("FIRST_VALUE"))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case GROUP_CONCAT_SYM: + DBUG_PRINT("info",("spider GROUP_CONCAT_SYM")); + if (str->append(STRING_WITH_LEN("GROUP_CONCAT"))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case LAG_SYM: + DBUG_PRINT("info",("spider LAG_SYM")); + if (str->append(STRING_WITH_LEN("LAG"))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case LEAD_SYM: + DBUG_PRINT("info",("spider LEAD_SYM")); + if (str->append(STRING_WITH_LEN("LEAD"))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case MAX_SYM: + DBUG_PRINT("info",("spider MAX_SYM")); + if (str->append(STRING_WITH_LEN("MAX"))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case MEDIAN_SYM: + DBUG_PRINT("info",("spider MEDIAN_SYM")); + if (str->append(STRING_WITH_LEN("MEDIAN"))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case MIN_SYM: + DBUG_PRINT("info",("spider MIN_SYM")); + if (str->append(STRING_WITH_LEN("MIN"))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case NTH_VALUE_SYM: + DBUG_PRINT("info",("spider NTH_VALUE_SYM")); + if (str->append(STRING_WITH_LEN("NTH_VALUE"))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case NTILE_SYM: + DBUG_PRINT("info",("spider NTILE_SYM")); + if (str->append(STRING_WITH_LEN("NTILE"))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#ifdef SPIDER_TOKEN_10_4 + case PORTION_SYM: + DBUG_PRINT("info",("spider PORTION_SYM")); + if (str->append(STRING_WITH_LEN("PORTION "))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#endif + case POSITION_SYM: + DBUG_PRINT("info",("spider POSITION_SYM")); + if (str->append(STRING_WITH_LEN("POSITION"))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#ifdef SPIDER_TOKEN_10_3 + case PERCENT_ORACLE_SYM: + DBUG_PRINT("info",("spider PERCENT_ORACLE_SYM")); + if (str->append(STRING_WITH_LEN("%"))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; +#endif + case PERCENT_RANK_SYM: + DBUG_PRINT("info",("spider PERCENT_RANK_SYM")); + if (str->append(STRING_WITH_LEN("PERCENT_RANK"))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case PERCENTILE_CONT_SYM: + DBUG_PRINT("info",("spider PERCENTILE_CONT_SYM")); + if (str->append(STRING_WITH_LEN("PERCENTILE_CONT"))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case PERCENTILE_DISC_SYM: + DBUG_PRINT("info",("spider PERCENTILE_DISC_SYM")); + if (str->append(STRING_WITH_LEN("PERCENTILE_DISC"))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case RANK_SYM: + DBUG_PRINT("info",("spider RANK_SYM")); + if (str->append(STRING_WITH_LEN("RANK"))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case ROW_NUMBER_SYM: + DBUG_PRINT("info",("spider ROW_NUMBER_SYM")); + if (str->append(STRING_WITH_LEN("ROW_NUMBER"))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case STD_SYM: + DBUG_PRINT("info",("spider STD_SYM")); + if (str->append(STRING_WITH_LEN("STD"))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case STDDEV_SAMP_SYM: + DBUG_PRINT("info",("spider STDDEV_SAMP_SYM")); + if (str->append(STRING_WITH_LEN("STDDEV_SAMP"))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case SUBDATE_SYM: + DBUG_PRINT("info",("spider SUBDATE_SYM")); + if (str->append(STRING_WITH_LEN("SUBDATE"))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case SUBSTRING: + DBUG_PRINT("info",("spider SUBSTRING")); + if (str->append(STRING_WITH_LEN("SUBSTRING"))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case SUM_SYM: + DBUG_PRINT("info",("spider SUM_SYM")); + if (str->append(STRING_WITH_LEN("SUM"))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case SYSDATE: + DBUG_PRINT("info",("spider SYSDATE")); + if (str->append(STRING_WITH_LEN("SYSDATE"))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case TRIM: + DBUG_PRINT("info",("spider TRIM")); + if (str->append(STRING_WITH_LEN("TRIM"))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case TRIM_ORACLE: + DBUG_PRINT("info",("spider TRIM_ORACLE")); + if (str->append(STRING_WITH_LEN("TRIM_ORACLE"))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case VARIANCE_SYM: + DBUG_PRINT("info",("spider VARIANCE_SYM")); + if (str->append(STRING_WITH_LEN("VARIANCE"))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + case VAR_SAMP_SYM: + DBUG_PRINT("info",("spider VAR_SAMP_SYM")); + if (str->append(STRING_WITH_LEN("VAR_SAMP"))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + break; + + case UNDERSCORE_CHARSET: /* like _utf8 */ + DBUG_PRINT("info",("spider UNDERSCORE_CHARSET")); + { + const char *name = yylval_tok->charset->name; + uint len = strlen(name); + if (str->reserve(len + 2)) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + str->q_append(SPIDER_SQL_UNDERSCORE_STR, SPIDER_SQL_UNDERSCORE_LEN); + str->q_append(name, len); + str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN); + } + break; + case NCHAR_STRING: /* like n'string' */ + DBUG_PRINT("info",("spider NCHAR_STRING")); + if (str->reserve(yylval_tok->lex_str.length * 2 + 3)) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + str->q_append(STRING_WITH_LEN("n")); + str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN); + str->append_for_single_quote(yylval_tok->lex_str.str, yylval_tok->lex_str.length); + str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN); + break; + case IDENT_QUOTED: /* like `string` */ + DBUG_PRINT("info",("spider IDENT_QUOTED")); + if (str->reserve(yylval_tok->lex_str.length + 2)) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + str->q_append(quote_char_for_ident.str, quote_char_for_ident.length); + str->q_append(yylval_tok->lex_str.str, yylval_tok->lex_str.length); + str->q_append(quote_char_for_ident.str, quote_char_for_ident.length); + break; + case IDENT: /* like _aaa */ + DBUG_PRINT("info",("spider IDENT")); + if (str->reserve(yylval_tok->lex_str.length + 1)) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + str->q_append(yylval_tok->lex_str.str, yylval_tok->lex_str.length); + str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN); + break; + case HEX_NUM: /* like x'hex number' */ + DBUG_PRINT("info",("spider HEX_NUM")); + if (str->reserve(yylval_tok->lex_str.length + 3)) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + str->q_append(STRING_WITH_LEN("0x")); + str->q_append(yylval_tok->lex_str.str, yylval_tok->lex_str.length); + str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN); + break; + case BIN_NUM: /* like b'bin number' */ + DBUG_PRINT("info",("spider BIN_NUM")); + if (str->reserve(yylval_tok->lex_str.length + 3)) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + str->q_append(STRING_WITH_LEN("0b")); + str->q_append(yylval_tok->lex_str.str, yylval_tok->lex_str.length); + str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN); + break; + case FLOAT_NUM: /* like 1e+10 */ + DBUG_PRINT("info",("spider FLOAT_NUM")); + if (str->reserve(yylval_tok->lex_str.length + 1)) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + str->q_append(yylval_tok->lex_str.str, yylval_tok->lex_str.length); + str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN); + break; + case NUM: /* like 10 */ + DBUG_PRINT("info",("spider NUM")); + if (str->reserve(yylval_tok->lex_str.length + 1)) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + str->q_append(yylval_tok->lex_str.str, yylval_tok->lex_str.length); + str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN); + break; + case LONG_NUM: /* like 100000000000 */ + DBUG_PRINT("info",("spider LONG_NUM")); + if (str->reserve(yylval_tok->lex_str.length + 1)) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + str->q_append(yylval_tok->lex_str.str, yylval_tok->lex_str.length); + str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN); + break; + case DECIMAL_NUM: /* like 1000000000000000000000 */ + DBUG_PRINT("info",("spider DECIMAL_NUM")); + if (str->reserve(yylval_tok->lex_str.length + 1)) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + str->q_append(yylval_tok->lex_str.str, yylval_tok->lex_str.length); + str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN); + break; + case ULONGLONG_NUM: /* like 18446744073709551615 */ + DBUG_PRINT("info",("spider ULONGLONG_NUM")); + if (str->reserve(yylval_tok->lex_str.length + 1)) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + str->q_append(yylval_tok->lex_str.str, yylval_tok->lex_str.length); + str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN); + break; + case HEX_STRING: /* like x'ab' */ + DBUG_PRINT("info",("spider HEX_STRING")); + if (str->reserve(yylval_tok->lex_str.length + 3)) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + str->q_append(STRING_WITH_LEN("x")); + str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN); + str->q_append(yylval_tok->lex_str.str, yylval_tok->lex_str.length); + str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN); + break; + case TEXT_STRING: /* like 'ab' */ + DBUG_PRINT("info",("spider TEXT_STRING")); + if (str->reserve(yylval_tok->lex_str.length * 2 + 2)) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN); + str->append_for_single_quote(yylval_tok->lex_str.str, yylval_tok->lex_str.length); + str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN); + break; + case LEX_HOSTNAME: /* like @example.com */ + DBUG_PRINT("info",("spider LEX_HOSTNAME")); + if (str->reserve(yylval_tok->lex_str.length + 1)) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} + str->q_append(yylval_tok->lex_str.str, yylval_tok->lex_str.length); + str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN); + break; + case PARAM_MARKER: + DBUG_PRINT("info",("spider PARAM_MARKER")); + if (str->append(STRING_WITH_LEN("?"))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} break; + case NOT2_SYM: + DBUG_PRINT("info",("spider NOT2_SYM")); + if (str->append(STRING_WITH_LEN("!"))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} break; + case SET_VAR: + DBUG_PRINT("info",("spider SET_VAR")); + if (str->append(STRING_WITH_LEN(":="))) {DBUG_RETURN(HA_ERR_OUT_OF_MEM);} break; + case ABORT_SYM: + /* syntax error */ + DBUG_PRINT("info",("spider ABORT_SYM")); + /* just skip */ + DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); + case END_OF_INPUT: + DBUG_PRINT("info",("spider END_OF_INPUT")); + /* nothing to do */ + break; + default: + DBUG_RETURN(ER_SPIDER_NOT_SUPPORTED_NUM); + } + DBUG_RETURN(0); +} + +int spider_db_sql::append_table_option_name( + int symbol_tok, + union YYSTYPE *yylval_tok +) { + DBUG_ENTER("spider_db_sql::append_table_option_name"); + DBUG_PRINT("info",("spider this=%p", this)); + DBUG_RETURN(0); +} + +int spider_db_sql::append_table_option_value( + int symbol_tok, + union YYSTYPE *yylval_tok +) { + DBUG_ENTER("spider_db_sql::append_table_option_value"); + DBUG_PRINT("info",("spider this=%p", this)); + DBUG_RETURN(0); +} + +int spider_db_sql::append_table_option_character_set() +{ + DBUG_ENTER("spider_db_sql::append_table_option_character_set"); + DBUG_PRINT("info",("spider this=%p", this)); + DBUG_RETURN(0); +} + +int spider_db_sql::append_table_option_data_directory() +{ + DBUG_ENTER("spider_db_sql::append_table_option_data_directory"); + DBUG_PRINT("info",("spider this=%p", this)); + DBUG_RETURN(0); +} + +int spider_db_sql::append_table_option_index_directory() +{ + DBUG_ENTER("spider_db_sql::append_table_option_index_directory"); + DBUG_PRINT("info",("spider this=%p", this)); + DBUG_RETURN(0); +} + +int spider_db_sql::append_table_option_with_system_versioning() +{ + DBUG_ENTER("spider_db_sql::append_table_option_with_system_versioning"); + DBUG_PRINT("info",("spider this=%p", this)); + DBUG_RETURN(0); +} + +int spider_db_sql::append_ident( + uint str_id, + LEX_CSTRING *name +) { + spider_string *str = &sql_str[str_id]; + DBUG_ENTER("spider_db_sql::append_ident"); + DBUG_PRINT("info",("spider this=%p", this)); + str->q_append(quote_char_for_ident.str, quote_char_for_ident.length); + str->q_append(name->str, name->length); + str->q_append(quote_char_for_ident.str, quote_char_for_ident.length); + DBUG_RETURN(0); +} + +int spider_db_sql::append_table_name( + uint str_id, + LEX_CSTRING *schema_name, + LEX_CSTRING *table_name +) { + int error_num; + spider_string *str = &sql_str[str_id]; + DBUG_ENTER("spider_db_sql::append_table_name"); + DBUG_PRINT("info",("spider this=%p", this)); + if ((error_num = append_ident(str_id, schema_name))) + { + DBUG_RETURN(error_num); + } + str->q_append(SPIDER_SQL_DOT_STR, SPIDER_SQL_DOT_LEN); + error_num = append_ident(str_id, table_name); + DBUG_RETURN(error_num); +} + +int spider_db_sql::append_table_name( + LEX_CSTRING *schema_name, + LEX_CSTRING *table_name +) { + int error_num; + spider_string *str = &sql_str[0]; + uint length = str->length(); + DBUG_ENTER("spider_db_sql::append_table_name"); + DBUG_PRINT("info",("spider this=%p", this)); + str->length(table_name_pos[0]); + error_num = append_table_name(0, schema_name, table_name); + str->length(length); + DBUG_RETURN(error_num); +} + +int spider_db_sql::append_spider_table( + LEX_CSTRING *table_name, + SPIDER_RWTBLTBL *rwtbltbl +) { + int error_num; + spider_string *str = &sql_str[0]; + SPIDER_RWTBLPTT *tp; + DBUG_ENTER("spider_db_sql::append_spider_table"); + DBUG_PRINT("info",("spider this=%p", this)); + str->length(sql_end_pos[0]); + if (!rwtbltbl->partition_method.length) + { + /* no partition definition */ + if (str->reserve( + SPIDER_SQL_ENGINE_SPIDER_LEN + + (table_name->length + rwtbltbl->connection_str.length + + rwtbltbl->comment_str.length) * 2 + SPIDER_SQL_TABLE_LEN + + SPIDER_SQL_COMMENT_LEN + SPIDER_SQL_CONNECTION_LEN + 7 + )) { + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + } + str->q_append(SPIDER_SQL_ENGINE_SPIDER_STR, SPIDER_SQL_ENGINE_SPIDER_LEN); + str->q_append(SPIDER_SQL_CONNECTION_STR, SPIDER_SQL_CONNECTION_LEN); + str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN); + str->q_append(SPIDER_SQL_TABLE_STR, SPIDER_SQL_TABLE_LEN); + str->q_append(SPIDER_SQL_DOUBLE_QUOTE_STR, SPIDER_SQL_DOUBLE_QUOTE_LEN); + str->append_for_single_quote(table_name->str, table_name->length); + str->q_append(SPIDER_SQL_DOUBLE_QUOTE_STR, SPIDER_SQL_DOUBLE_QUOTE_LEN); + if (rwtbltbl->connection_str.length) + { + str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); + str->append_for_single_quote(rwtbltbl->connection_str.str, + rwtbltbl->connection_str.length); + } + str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN); + if (rwtbltbl->comment_str.length) + { + str->q_append(SPIDER_SQL_COMMENT_STR, SPIDER_SQL_COMMENT_LEN); + str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN); + str->append_for_single_quote(rwtbltbl->comment_str.str, + rwtbltbl->comment_str.length); + str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN); + } + DBUG_RETURN(0); + } + if (str->reserve( + SPIDER_SQL_ENGINE_SPIDER_LEN + + (rwtbltbl->connection_str.length + rwtbltbl->comment_str.length) * 2 + + SPIDER_SQL_COMMENT_LEN + SPIDER_SQL_CONNECTION_LEN + 4 + + SPIDER_SQL_PARTITION_BY_LEN + + (rwtbltbl->subpartition_method.length ? SPIDER_SQL_SUBPARTITION_BY_LEN : 0) + + ( + rwtbltbl->partition_method.length + rwtbltbl->partition_expression.length + + rwtbltbl->subpartition_method.length + rwtbltbl->subpartition_expression.length + ) * 2 + 5 + )) { + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + } + str->q_append(SPIDER_SQL_ENGINE_SPIDER_STR, SPIDER_SQL_ENGINE_SPIDER_LEN); + if (rwtbltbl->connection_str.length) + { + str->q_append(SPIDER_SQL_CONNECTION_STR, SPIDER_SQL_CONNECTION_LEN); + str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN); + str->append_for_single_quote(rwtbltbl->connection_str.str, + rwtbltbl->connection_str.length); + str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN); + } + if (rwtbltbl->comment_str.length) + { + str->q_append(SPIDER_SQL_COMMENT_STR, SPIDER_SQL_COMMENT_LEN); + str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN); + str->append_for_single_quote(rwtbltbl->comment_str.str, + rwtbltbl->comment_str.length); + str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN); + } + str->q_append(SPIDER_SQL_PARTITION_BY_STR, SPIDER_SQL_PARTITION_BY_LEN); + str->append_escape_string(rwtbltbl->partition_method.str, + rwtbltbl->partition_method.length); + str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN); + str->append_escape_string(rwtbltbl->partition_expression.str, + rwtbltbl->partition_expression.length); + str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN); + + if (rwtbltbl->subpartition_method.length) + { + str->q_append(SPIDER_SQL_SUBPARTITION_BY_STR, SPIDER_SQL_SUBPARTITION_BY_LEN); + str->append_escape_string(rwtbltbl->subpartition_method.str, + rwtbltbl->subpartition_method.length); + str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN); + str->append_escape_string(rwtbltbl->subpartition_expression.str, + rwtbltbl->subpartition_expression.length); + str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN); + } + + str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN); + tp = rwtbltbl->tp; + while (tp) + { + if ((error_num = append_spider_partition(table_name, rwtbltbl, tp))) + { + DBUG_RETURN(error_num); + } + tp = tp->next; + if (tp) + { + str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); + } + } + if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN)) + { + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + } + str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN); + DBUG_RETURN(0); +} + +int spider_db_sql::append_spider_partition( + LEX_CSTRING *table_name, + SPIDER_RWTBLTBL *rwtbltbl, + SPIDER_RWTBLPTT *rwtblptt +) { + int error_num; + spider_string *str = &sql_str[0]; + SPIDER_RWTBLSPTT *ts; + DBUG_ENTER("spider_db_sql::append_spider_partition"); + DBUG_PRINT("info",("spider this=%p", this)); + if (!rwtblptt->ts) + { + /* no subpartition definition */ + if (str->reserve( + SPIDER_SQL_PARTITION_LEN + SPIDER_SQL_VALUES_LESS_THAN_LEN + 2 + + ( + table_name->length + + rwtblptt->partition_name.length + + rwtblptt->partition_description.length + + rwtblptt->connection_str.length + rwtblptt->comment_str.length + ) * 2 + SPIDER_SQL_TABLE_LEN + 3 + + SPIDER_SQL_COMMENT_LEN + SPIDER_SQL_CONNECTION_LEN + 5 + + SPIDER_SQL_COMMA_LEN + )) { + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + } + str->q_append(SPIDER_SQL_PARTITION_STR, SPIDER_SQL_PARTITION_LEN); + str->append_escape_string(rwtblptt->partition_name.str, + rwtblptt->partition_name.length); + + if ( + rwtbltbl->partition_method.length >= 5 && + !strncasecmp("range", rwtbltbl->partition_method.str, 5) + ) { + str->q_append(SPIDER_SQL_VALUES_LESS_THAN_STR, + SPIDER_SQL_VALUES_LESS_THAN_LEN); + if ( + rwtblptt->partition_description.length == 8 && + !strncasecmp("maxvalue", rwtblptt->partition_description.str, 8) + ) { + str->q_append(rwtblptt->partition_description.str, + rwtblptt->partition_description.length); + } else { + str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN); + str->append_escape_string(rwtblptt->partition_description.str, + rwtblptt->partition_description.length); + str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN); + } + } else if ( + rwtbltbl->partition_method.length >= 4 && + !strncasecmp("list", rwtbltbl->partition_method.str, 5) + ) { + str->q_append(SPIDER_SQL_VALUES_IN_STR, SPIDER_SQL_VALUES_IN_LEN); + str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN); + str->append_escape_string(rwtblptt->partition_description.str, + rwtblptt->partition_description.length); + str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN); + } + + str->q_append(SPIDER_SQL_CONNECTION_STR, SPIDER_SQL_CONNECTION_LEN); + str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN); + str->q_append(SPIDER_SQL_TABLE_STR, SPIDER_SQL_TABLE_LEN); + str->q_append(SPIDER_SQL_DOUBLE_QUOTE_STR, SPIDER_SQL_DOUBLE_QUOTE_LEN); + str->append_for_single_quote(table_name->str, table_name->length); + str->q_append(SPIDER_SQL_DOUBLE_QUOTE_STR, SPIDER_SQL_DOUBLE_QUOTE_LEN); + if (rwtblptt->connection_str.length) + { + str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); + str->append_for_single_quote(rwtblptt->connection_str.str, + rwtblptt->connection_str.length); + } + str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN); + if (rwtblptt->comment_str.length) + { + str->q_append(SPIDER_SQL_COMMENT_STR, SPIDER_SQL_COMMENT_LEN); + str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN); + str->append_for_single_quote(rwtblptt->comment_str.str, + rwtblptt->comment_str.length); + str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN); + } + DBUG_RETURN(0); + } + if (str->reserve( + SPIDER_SQL_PARTITION_LEN + SPIDER_SQL_VALUES_LESS_THAN_LEN + 2 + + ( + rwtblptt->partition_name.length + + rwtblptt->partition_description.length + + rwtblptt->connection_str.length + rwtblptt->comment_str.length + ) * 2 + + SPIDER_SQL_COMMENT_LEN + SPIDER_SQL_CONNECTION_LEN + 5 + )) { + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + } + str->q_append(SPIDER_SQL_PARTITION_STR, SPIDER_SQL_PARTITION_LEN); + str->append_escape_string(rwtblptt->partition_name.str, + rwtblptt->partition_name.length); + + if ( + rwtbltbl->partition_method.length >= 5 && + !strncasecmp("range", rwtbltbl->partition_method.str, 5) + ) { + str->q_append(SPIDER_SQL_VALUES_LESS_THAN_STR, + SPIDER_SQL_VALUES_LESS_THAN_LEN); + if ( + rwtblptt->partition_description.length == 8 && + !strncasecmp("maxvalue", rwtblptt->partition_description.str, 8) + ) { + str->q_append(rwtblptt->partition_description.str, + rwtblptt->partition_description.length); + } else { + str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN); + str->append_escape_string(rwtblptt->partition_description.str, + rwtblptt->partition_description.length); + str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN); + } + } else if ( + rwtbltbl->partition_method.length >= 4 && + !strncasecmp("list", rwtbltbl->partition_method.str, 5) + ) { + str->q_append(SPIDER_SQL_VALUES_IN_STR, SPIDER_SQL_VALUES_IN_LEN); + str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN); + str->append_escape_string(rwtblptt->partition_description.str, + rwtblptt->partition_description.length); + str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN); + } + if (rwtblptt->connection_str.length) + { + str->q_append(SPIDER_SQL_CONNECTION_STR, SPIDER_SQL_CONNECTION_LEN); + str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN); + str->append_for_single_quote(rwtblptt->connection_str.str, + rwtblptt->connection_str.length); + str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN); + } + if (rwtblptt->comment_str.length) + { + str->q_append(SPIDER_SQL_COMMENT_STR, SPIDER_SQL_COMMENT_LEN); + str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN); + str->append_for_single_quote(rwtblptt->comment_str.str, + rwtblptt->comment_str.length); + str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN); + } + str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN); + ts = rwtblptt->ts; + while (ts) + { + if ((error_num = append_spider_subpartition(table_name, rwtbltbl, ts))) + { + DBUG_RETURN(error_num); + } + ts = ts->next; + if (ts) + { + str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); + } + } + if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN + SPIDER_SQL_COMMA_LEN)) + { + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + } + str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN); + DBUG_RETURN(0); +} + +int spider_db_sql::append_spider_subpartition( + LEX_CSTRING *table_name, + SPIDER_RWTBLTBL *rwtbltbl, + SPIDER_RWTBLSPTT *rwtblsptt +) { + spider_string *str = &sql_str[0]; + DBUG_ENTER("spider_db_sql::append_spider_subpartition"); + DBUG_PRINT("info",("spider this=%p", this)); + if (str->reserve( + SPIDER_SQL_SUBPARTITION_LEN + + ( + table_name->length + + rwtblsptt->subpartition_name.length + + rwtblsptt->subpartition_description.length + + rwtblsptt->connection_str.length + rwtblsptt->comment_str.length + ) * 2 + SPIDER_SQL_TABLE_LEN + 3 + + SPIDER_SQL_COMMENT_LEN + SPIDER_SQL_CONNECTION_LEN + 5 + + SPIDER_SQL_COMMA_LEN + )) { + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + } + str->q_append(SPIDER_SQL_SUBPARTITION_STR, SPIDER_SQL_SUBPARTITION_LEN); + str->append_escape_string(rwtblsptt->subpartition_name.str, + rwtblsptt->subpartition_name.length); + + str->q_append(SPIDER_SQL_CONNECTION_STR, SPIDER_SQL_CONNECTION_LEN); + str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN); + str->q_append(SPIDER_SQL_TABLE_STR, SPIDER_SQL_TABLE_LEN); + str->q_append(SPIDER_SQL_DOUBLE_QUOTE_STR, SPIDER_SQL_DOUBLE_QUOTE_LEN); + str->append_for_single_quote(table_name->str, table_name->length); + str->q_append(SPIDER_SQL_DOUBLE_QUOTE_STR, SPIDER_SQL_DOUBLE_QUOTE_LEN); + if (rwtblsptt->connection_str.length) + { + str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); + str->append_for_single_quote(rwtblsptt->connection_str.str, + rwtblsptt->connection_str.length); + } + str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN); + if (rwtblsptt->comment_str.length) + { + str->q_append(SPIDER_SQL_COMMENT_STR, SPIDER_SQL_COMMENT_LEN); + str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN); + str->append_for_single_quote(rwtblsptt->comment_str.str, + rwtblsptt->comment_str.length); + str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN); + } + DBUG_RETURN(0); +} spider_db_result::spider_db_result( SPIDER_DB_CONN *in_db_conn diff --git a/storage/spider/spd_db_include.h b/storage/spider/spd_db_include.h index 64cee006c65..abff3f3a6e6 100644 --- a/storage/spider/spd_db_include.h +++ b/storage/spider/spd_db_include.h @@ -1,4 +1,5 @@ -/* Copyright (C) 2008-2018 Kentoku Shiba +/* Copyright (C) 2008-2019 Kentoku Shiba + Copyright (C) 2019 MariaDB corp This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -91,6 +92,8 @@ typedef st_spider_result SPIDER_RESULT; #define SPIDER_SQL_SEMICOLON_LEN sizeof(SPIDER_SQL_SEMICOLON_STR) - 1 #define SPIDER_SQL_VALUE_QUOTE_STR "'" #define SPIDER_SQL_VALUE_QUOTE_LEN (sizeof(SPIDER_SQL_VALUE_QUOTE_STR) - 1) +#define SPIDER_SQL_DOUBLE_QUOTE_STR "\"" +#define SPIDER_SQL_DOUBLE_QUOTE_LEN (sizeof(SPIDER_SQL_DOUBLE_QUOTE_STR) - 1) #define SPIDER_SQL_DOT_STR "." #define SPIDER_SQL_DOT_LEN (sizeof(SPIDER_SQL_DOT_STR) - 1) @@ -203,6 +206,24 @@ typedef st_spider_result SPIDER_RESULT; #define SPIDER_SQL_CONNECTION_LEN (sizeof(SPIDER_SQL_CONNECTION_STR) - 1) #define SPIDER_SQL_LCL_NAME_QUOTE_STR "`" #define SPIDER_SQL_LCL_NAME_QUOTE_LEN (sizeof(SPIDER_SQL_LCL_NAME_QUOTE_STR) - 1) +#define SPIDER_SQL_ENGINE_SPIDER_STR " engine spider " +#define SPIDER_SQL_ENGINE_SPIDER_LEN (sizeof(SPIDER_SQL_ENGINE_SPIDER_STR) - 1) +#define SPIDER_SQL_PARTITION_BY_STR " partition by " +#define SPIDER_SQL_PARTITION_BY_LEN (sizeof(SPIDER_SQL_PARTITION_BY_STR) - 1) +#define SPIDER_SQL_SUBPARTITION_BY_STR " subpartition by " +#define SPIDER_SQL_SUBPARTITION_BY_LEN (sizeof(SPIDER_SQL_SUBPARTITION_BY_STR) - 1) +#define SPIDER_SQL_VALUES_LESS_THAN_STR " values less than " +#define SPIDER_SQL_VALUES_LESS_THAN_LEN (sizeof(SPIDER_SQL_VALUES_LESS_THAN_STR) - 1) +#define SPIDER_SQL_VALUES_IN_STR " values in " +#define SPIDER_SQL_VALUES_IN_LEN (sizeof(SPIDER_SQL_VALUES_IN_STR) - 1) +#define SPIDER_SQL_DATABASE_STR "database" +#define SPIDER_SQL_DATABASE_LEN (sizeof(SPIDER_SQL_DATABASE_STR) - 1) +#define SPIDER_SQL_TABLE_STR "table" +#define SPIDER_SQL_TABLE_LEN (sizeof(SPIDER_SQL_TABLE_STR) - 1) +#define SPIDER_SQL_PARTITION_STR " partition " +#define SPIDER_SQL_PARTITION_LEN (sizeof(SPIDER_SQL_PARTITION_STR) - 1) +#define SPIDER_SQL_SUBPARTITION_STR " subpartition " +#define SPIDER_SQL_SUBPARTITION_LEN (sizeof(SPIDER_SQL_SUBPARTITION_STR) - 1) #define SPIDER_CONN_KIND_MYSQL (1 << 0) #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET) @@ -223,13 +244,14 @@ typedef st_spider_result SPIDER_RESULT; #define SPIDER_SQL_TYPE_BULK_UPDATE_SQL (1 << 4) #define SPIDER_SQL_TYPE_TMP_SQL (1 << 5) #define SPIDER_SQL_TYPE_DROP_TMP_TABLE_SQL (1 << 6) -#define SPIDER_SQL_TYPE_OTHER_SQL (1 << 7) -#define SPIDER_SQL_TYPE_HANDLER (1 << 8) -#define SPIDER_SQL_TYPE_SELECT_HS (1 << 9) -#define SPIDER_SQL_TYPE_INSERT_HS (1 << 10) -#define SPIDER_SQL_TYPE_UPDATE_HS (1 << 11) -#define SPIDER_SQL_TYPE_DELETE_HS (1 << 12) -#define SPIDER_SQL_TYPE_OTHER_HS (1 << 13) +#define SPIDER_SQL_TYPE_DDL_SQL (1 << 7) +#define SPIDER_SQL_TYPE_OTHER_SQL (1 << 8) +#define SPIDER_SQL_TYPE_HANDLER (1 << 9) +#define SPIDER_SQL_TYPE_SELECT_HS (1 << 10) +#define SPIDER_SQL_TYPE_INSERT_HS (1 << 11) +#define SPIDER_SQL_TYPE_UPDATE_HS (1 << 12) +#define SPIDER_SQL_TYPE_DELETE_HS (1 << 13) +#define SPIDER_SQL_TYPE_OTHER_HS (1 << 14) enum spider_bulk_upd_start { SPD_BU_NOT_START, @@ -911,6 +933,105 @@ public: #endif }; +#define SPIDER_DB_SQL_STRINGS 2 +#define SPIDER_IDENT_SPACE 64 * 4 + 2 +#define SPIDER_TABLE_NAME_SPACE SPIDER_IDENT_SPACE * 2 + 1 + +class SPIDER_RWTBLSPTT; +class SPIDER_RWTBLPTT; +class SPIDER_RWTBLTBL; +class SPIDER_RWTBL; + +class spider_db_sql +{ +protected: + bool sql_init; + LEX_CSTRING quote_char_for_ident; +public: + uint dbton_id; + uint table_name_pos[SPIDER_DB_SQL_STRINGS]; + uint sql_end_pos[SPIDER_DB_SQL_STRINGS]; + spider_string *sql_str; + spider_db_sql *next; + spider_db_sql( + uint dbton_id_arg + ): sql_init(FALSE), dbton_id(dbton_id_arg), + sql_str(NULL), next(NULL) {} + spider_db_sql( + uint dbton_id_arg, + LEX_CSTRING quote_char + ): sql_init(FALSE), quote_char_for_ident(quote_char), + dbton_id(dbton_id_arg), sql_str(NULL), next(NULL) {} + virtual ~spider_db_sql(); + virtual int init( + CHARSET_INFO *charset + ); + virtual void reset( + CHARSET_INFO *charset + ); + virtual void set_quote_char_for_ident( + LEX_CSTRING quote_char + ); + virtual int append_parsed_symbol( + int symbol_tok, + union YYSTYPE *yylval_tok + ); + virtual int append_parsed_symbol_ex( + int symbol_tok, + union YYSTYPE *yylval_tok + ); + virtual int append_parsed_symbol( + int symbol_tok, + union YYSTYPE *yylval_tok, + spider_string *str + ); + virtual int append_table_name_space(); + virtual int append_table_name_space(uint str_id); + virtual void set_sql_end_pos(); + virtual int append_create_or_replace() = 0; + virtual int append_create_or_replace_table() = 0; + virtual int append_if_not_exists() = 0; + virtual int append_table_option_name( + int symbol_tok, + union YYSTYPE *yylval_tok + ); + virtual int append_table_option_value( + int symbol_tok, + union YYSTYPE *yylval_tok + ); + virtual int append_table_option_character_set(); + virtual int append_table_option_data_directory(); + virtual int append_table_option_index_directory(); + virtual int append_table_option_with_system_versioning(); + virtual int append_ident( + uint str_id, + LEX_CSTRING *name + ); + virtual int append_table_name( + uint str_id, + LEX_CSTRING *schema_name, + LEX_CSTRING *table_name + ); + virtual int append_table_name( + LEX_CSTRING *schema_name, + LEX_CSTRING *table_name + ); + virtual int append_spider_table( + LEX_CSTRING *table_name, + SPIDER_RWTBLTBL *rwtbltbl + ); + virtual int append_spider_partition( + LEX_CSTRING *table_name, + SPIDER_RWTBLTBL *rwtbltbl, + SPIDER_RWTBLPTT *rwtblptt + ); + virtual int append_spider_subpartition( + LEX_CSTRING *table_name, + SPIDER_RWTBLTBL *rwtbltbl, + SPIDER_RWTBLSPTT *rwtblsptt + ); +}; + class spider_db_row { public: @@ -1603,6 +1724,10 @@ public: spider_db_copy_table *tgt_ct, ulong sql_type ) = 0; + virtual int set_sql_for_exec( + spider_db_sql *db_sql, + int link_idx + ) = 0; virtual int execute_sql( ulong sql_type, SPIDER_CONN *conn, @@ -1841,10 +1966,14 @@ typedef struct st_spider_dbton spider_db_copy_table *(*create_db_copy_table)( spider_db_share *db_share); SPIDER_DB_CONN *(*create_db_conn)(SPIDER_CONN *conn); + spider_db_sql *(*create_db_sql)(); bool (*support_direct_join)(); spider_db_util *db_util; } SPIDER_DBTON; +spider_db_sql *spider_mariadb_create_sql(); +spider_db_sql *spider_oracle_create_sql(); + typedef struct st_spider_position { SPIDER_DB_ROW *row; diff --git a/storage/spider/spd_db_mysql.cc b/storage/spider/spd_db_mysql.cc index 262e47120ce..fe8793a2ec0 100644 --- a/storage/spider/spd_db_mysql.cc +++ b/storage/spider/spd_db_mysql.cc @@ -1,4 +1,5 @@ -/* Copyright (C) 2012-2018 Kentoku Shiba +/* Copyright (C) 2012-2019 Kentoku Shiba + Copyright (C) 2019 MariaDB corp This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -60,6 +61,7 @@ extern const char spider_dig_upper[]; spider_db_mysql_util spider_db_mysql_utility; spider_db_mariadb_util spider_db_mariadb_utility; +extern LEX_CSTRING spider_ident_back_quote; #define SPIDER_SQL_NAME_QUOTE_STR "`" #define SPIDER_SQL_NAME_QUOTE_LEN (sizeof(SPIDER_SQL_NAME_QUOTE_STR) - 1) static const char *name_quote_str = SPIDER_SQL_NAME_QUOTE_STR; @@ -218,6 +220,18 @@ int spider_mariadb_deinit() DBUG_RETURN(0); } +spider_db_sql *spider_mysql_create_sql() +{ + DBUG_ENTER("spider_mysql_create_sql"); + DBUG_RETURN(new spider_mysql_sql()); +} + +spider_db_sql *spider_mariadb_create_sql() +{ + DBUG_ENTER("spider_mariadb_create_sql"); + DBUG_RETURN(new spider_mariadb_sql()); +} + spider_db_share *spider_mysql_create_share( SPIDER_SHARE *share ) { @@ -302,6 +316,7 @@ SPIDER_DBTON spider_dbton_mysql = { spider_mysql_create_handler, spider_mysql_create_copy_table, spider_mysql_create_conn, + spider_mysql_create_sql, spider_mysql_support_direct_join, &spider_db_mysql_utility }; @@ -316,10 +331,168 @@ SPIDER_DBTON spider_dbton_mariadb = { spider_mariadb_create_handler, spider_mariadb_create_copy_table, spider_mariadb_create_conn, + spider_mariadb_create_sql, spider_mariadb_support_direct_join, &spider_db_mariadb_utility }; +spider_mbase_sql::spider_mbase_sql( + uint dbton_id_arg +): spider_db_sql(dbton_id_arg, spider_ident_back_quote) +{ + DBUG_ENTER("spider_mbase_sql::spider_mbase_sql"); + DBUG_PRINT("info",("spider this=%p", this)); + DBUG_VOID_RETURN; +} + +spider_mbase_sql::~spider_mbase_sql() +{ + DBUG_ENTER("spider_mbase_sql::~spider_mbase_sql"); + DBUG_PRINT("info",("spider this=%p", this)); + DBUG_VOID_RETURN; +} + +spider_mysql_sql::spider_mysql_sql(): + spider_mbase_sql(spider_db_mysql_utility.dbton_id) +{ + DBUG_ENTER("spider_mysql_sql::spider_mysql_sql"); + DBUG_PRINT("info",("spider this=%p", this)); + DBUG_VOID_RETURN; +} + +spider_mariadb_sql::spider_mariadb_sql(): + spider_mbase_sql(spider_db_mariadb_utility.dbton_id) +{ + DBUG_ENTER("spider_mariadb_sql::spider_mariadb_sql"); + DBUG_PRINT("info",("spider this=%p", this)); + DBUG_VOID_RETURN; +} + +spider_mysql_sql::~spider_mysql_sql() +{ + DBUG_ENTER("spider_mysql_sql::~spider_mysql_sql"); + DBUG_PRINT("info",("spider this=%p", this)); + DBUG_VOID_RETURN; +} + +spider_mariadb_sql::~spider_mariadb_sql() +{ + DBUG_ENTER("spider_mariadb_sql::~spider_mariadb_sql"); + DBUG_PRINT("info",("spider this=%p", this)); + DBUG_VOID_RETURN; +} + +int spider_mysql_sql::append_create_or_replace() +{ + DBUG_ENTER("spider_mysql_sql::append_create_or_replace"); + DBUG_PRINT("info",("spider this=%p", this)); + /* nothing to do */ + DBUG_RETURN(0); +} + +int spider_mariadb_sql::append_create_or_replace() +{ + DBUG_ENTER("spider_mariadb_sql::append_create_or_replace"); + DBUG_PRINT("info",("spider this=%p", this)); + if (unlikely(sql_str[0].append(STRING_WITH_LEN("or replace ")))) + { + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + } + DBUG_RETURN(0); +} + +int spider_mysql_sql::append_create_or_replace_table() +{ + DBUG_ENTER("spider_mysql_sql::append_create_or_replace_table"); + DBUG_PRINT("info",("spider this=%p", this)); + if (unlikely(sql_str[1].append(STRING_WITH_LEN("drop table if exists ")))) + { + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + } + DBUG_RETURN(append_table_name_space(1)); +} + +int spider_mariadb_sql::append_create_or_replace_table() +{ + DBUG_ENTER("spider_mariadb_sql::append_create_or_replace_table"); + DBUG_PRINT("info",("spider this=%p", this)); + /* nothing to do */ + DBUG_RETURN(0); +} + +int spider_mbase_sql::append_if_not_exists() +{ + DBUG_ENTER("spider_mbase_sql::append_if_not_exists"); + DBUG_PRINT("info",("spider this=%p", this)); + if (unlikely(sql_str[0].append(STRING_WITH_LEN("if not exists ")))) + { + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + } + DBUG_RETURN(0); +} + +int spider_mbase_sql::append_table_option_name( + int symbol_tok, + union YYSTYPE *yylval_tok +) { + DBUG_ENTER("spider_mbase_sql::append_table_option_name"); + DBUG_PRINT("info",("spider this=%p", this)); + DBUG_RETURN(append_parsed_symbol(symbol_tok, yylval_tok, &sql_str[0])); +} + +int spider_mbase_sql::append_table_option_value( + int symbol_tok, + union YYSTYPE *yylval_tok +) { + DBUG_ENTER("spider_mbase_sql::append_table_option_value"); + DBUG_PRINT("info",("spider this=%p", this)); + DBUG_RETURN(append_parsed_symbol(symbol_tok, yylval_tok, &sql_str[0])); +} + +int spider_mbase_sql::append_table_option_character_set() +{ + DBUG_ENTER("spider_mbase_sql::append_table_option_character_set"); + DBUG_PRINT("info",("spider this=%p", this)); + if (unlikely(sql_str[0].append(STRING_WITH_LEN("charset ")))) + { + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + } + DBUG_RETURN(0); +} + +int spider_mbase_sql::append_table_option_data_directory() +{ + DBUG_ENTER("spider_mbase_sql::append_table_option_data_directory"); + DBUG_PRINT("info",("spider this=%p", this)); + if (unlikely(sql_str[0].append(STRING_WITH_LEN("data directory ")))) + { + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + } + DBUG_RETURN(0); +} + +int spider_mbase_sql::append_table_option_index_directory() +{ + DBUG_ENTER("spider_mbase_sql::append_table_option_index_directory"); + DBUG_PRINT("info",("spider this=%p", this)); + if (unlikely(sql_str[0].append(STRING_WITH_LEN("index directory ")))) + { + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + } + DBUG_RETURN(0); +} + +int spider_mariadb_sql::append_table_option_with_system_versioning() +{ + DBUG_ENTER("spider_db_sql::append_table_option_with_system_versioning"); + DBUG_PRINT("info",("spider this=%p", this)); + if (unlikely(sql_str[0].append(STRING_WITH_LEN("with system versioning ")))) + { + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + } + DBUG_RETURN(0); +} + spider_db_mbase_row::spider_db_mbase_row( uint dbton_id ) : spider_db_row(dbton_id), @@ -6811,6 +6984,8 @@ int spider_mbase_handler::init() __func__, __FILE__, __LINE__, MYF(MY_WME | MY_ZEROFILL), &link_for_hash, sizeof(SPIDER_LINK_FOR_HASH) * share->link_count, + &query, + sizeof(spider_string *) * share->link_count, &minimum_select_bitmap, table ? sizeof(uchar) * no_bytes_in_map(table->read_set) : 0, NullS)) @@ -11965,6 +12140,45 @@ int spider_mbase_handler::set_sql_for_exec( DBUG_RETURN(0); } +int spider_mbase_handler::set_sql_for_exec( + spider_db_sql *db_sql, + int link_idx +) { + uint tmp_pos; + SPIDER_RESULT_LIST *result_list = &spider->result_list; + spider_string *str; + DBUG_ENTER("spider_mbase_handler::set_sql_for_exec"); + DBUG_PRINT("info",("spider this=%p", this)); + query[link_idx] = &result_list->sqls[link_idx]; + str = query[link_idx]; + if (str->reserve(db_sql->sql_end_pos[0] + db_sql->sql_end_pos[1] + + SPIDER_SQL_SEMICOLON_LEN)) + { + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + } + if (db_sql->sql_end_pos[1]) + { + str->copy(db_sql->sql_str[1]); + str->length(db_sql->table_name_pos[1]); + append_table_name_with_adjusting(str, link_idx, SPIDER_SQL_TYPE_DDL_SQL); + str->length(db_sql->sql_end_pos[1]); + str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN); + str->q_append(db_sql->sql_str[0].ptr(), db_sql->sql_end_pos[0]); + tmp_pos = str->length(); + str->length(str->length() - db_sql->sql_end_pos[0] + + db_sql->table_name_pos[0]); + append_table_name_with_adjusting(str, link_idx, SPIDER_SQL_TYPE_DDL_SQL); + str->length(tmp_pos); + } else { + str->copy(db_sql->sql_str[0]); + str->length(db_sql->table_name_pos[0]); + append_table_name_with_adjusting(str, link_idx, SPIDER_SQL_TYPE_DDL_SQL); + str->length(db_sql->sql_end_pos[0]); + } + DBUG_PRINT("info",("spider str=%s", str->c_ptr_safe())); + DBUG_RETURN(0); +} + int spider_mbase_handler::execute_sql( ulong sql_type, SPIDER_CONN *conn, @@ -12013,6 +12227,11 @@ int spider_mbase_handler::execute_sql( tgt_sql = exec_ha_sql; tgt_length = tgt_sql->length(); break; + case SPIDER_SQL_TYPE_DDL_SQL: + DBUG_PRINT("info",("spider SPIDER_SQL_TYPE_DDL_SQL")); + tgt_sql = query[conn->link_idx]; + tgt_length = tgt_sql->length(); + break; default: /* nothing to do */ DBUG_PRINT("info",("spider default")); diff --git a/storage/spider/spd_db_mysql.h b/storage/spider/spd_db_mysql.h index 3448cea06cc..968e2f37848 100644 --- a/storage/spider/spd_db_mysql.h +++ b/storage/spider/spd_db_mysql.h @@ -1,4 +1,5 @@ -/* Copyright (C) 2012-2018 Kentoku Shiba +/* Copyright (C) 2012-2019 Kentoku Shiba + Copyright (C) 2019 MariaDB corp This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -188,6 +189,48 @@ public: ~spider_db_mariadb_util(); }; +class spider_mbase_sql: public spider_db_sql +{ +public: + spider_mbase_sql( + uint dbton_id_arg + ); + virtual ~spider_mbase_sql(); + virtual int append_create_or_replace() = 0; + virtual int append_create_or_replace_table() = 0; + int append_if_not_exists(); + int append_table_option_name( + int symbol_tok, + union YYSTYPE *yylval_tok + ); + int append_table_option_value( + int symbol_tok, + union YYSTYPE *yylval_tok + ); + int append_table_option_character_set(); + int append_table_option_data_directory(); + int append_table_option_index_directory(); +}; + +class spider_mysql_sql: public spider_mbase_sql +{ +public: + spider_mysql_sql(); + ~spider_mysql_sql(); + int append_create_or_replace(); + int append_create_or_replace_table(); +}; + +class spider_mariadb_sql: public spider_mbase_sql +{ +public: + spider_mariadb_sql(); + ~spider_mariadb_sql(); + int append_create_or_replace(); + int append_create_or_replace_table(); + int append_table_option_with_system_versioning(); +}; + class spider_db_mbase_row: public spider_db_row { public: @@ -729,6 +772,7 @@ protected: int tmp_sql_pos4; /* insert val pos at tmp_table_join */ int tmp_sql_pos5; /* end of drop tbl at tmp_table_join */ spider_string dup_update_sql; + spider_string **query; spider_string *exec_sql; spider_string *exec_insert_sql; spider_string *exec_update_sql; @@ -1417,6 +1461,10 @@ public: spider_db_copy_table *tgt_ct, ulong sql_type ); + int set_sql_for_exec( + spider_db_sql *db_sql, + int link_idx + ); int execute_sql( ulong sql_type, SPIDER_CONN *conn, diff --git a/storage/spider/spd_db_oracle.cc b/storage/spider/spd_db_oracle.cc index eae749f6867..63e8a10634e 100644 --- a/storage/spider/spd_db_oracle.cc +++ b/storage/spider/spd_db_oracle.cc @@ -1,4 +1,5 @@ -/* Copyright (C) 2012-2018 Kentoku Shiba +/* Copyright (C) 2012-2019 Kentoku Shiba + Copyright (C) 2019 MariaDB corp This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -30,6 +31,12 @@ #endif #endif +#include "spd_db_include.h" +#include "spd_db_oracle.h" + +#define SPIDER_DB_WRAPPER_ORACLE "oracle" +extern LEX_CSTRING spider_ident_double_quote; + #ifdef HAVE_ORACLE_OCI #if (defined(WIN32) || defined(_WIN32) || defined(WINDOWS) || defined(_WINDOWS)) #include <Shlwapi.h> @@ -38,9 +45,7 @@ #include <oci.h> #include "spd_err.h" #include "spd_param.h" -#include "spd_db_include.h" #include "spd_include.h" -#include "spd_db_oracle.h" #include "ha_spider.h" #include "spd_conn.h" #include "spd_db_conn.h" @@ -57,8 +62,6 @@ extern HASH spider_ipport_conns; extern SPIDER_DBTON spider_dbton[SPIDER_DBTON_SIZE]; extern const char spider_dig_upper[]; -#define SPIDER_DB_WRAPPER_ORACLE "oracle" - #define SPIDER_SQL_NAME_QUOTE_STR "\"" #define SPIDER_SQL_NAME_QUOTE_LEN (sizeof(SPIDER_SQL_NAME_QUOTE_STR) - 1) static const char *name_quote_str = SPIDER_SQL_NAME_QUOTE_STR; @@ -334,10 +337,76 @@ SPIDER_DBTON spider_dbton_oracle = { spider_oracle_create_handler, spider_oracle_create_copy_table, spider_oracle_create_conn, + spider_oracle_create_sql, spider_oracle_support_direct_join, &spider_db_oracle_utility }; +#else +SPIDER_DBTON spider_dbton_oracle = { + 0, + SPIDER_DB_WRAPPER_ORACLE, + SPIDER_DB_ACCESS_TYPE_SQL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + spider_oracle_create_sql, + NULL, + NULL +}; +#endif + +spider_db_sql *spider_oracle_create_sql() +{ + DBUG_ENTER("spider_oracle_create_sql"); + DBUG_RETURN(new spider_oracle_sql()); +} + +spider_oracle_sql::spider_oracle_sql(): + spider_db_sql(spider_dbton_oracle.dbton_id, spider_ident_double_quote) +{ + DBUG_ENTER("spider_oracle_sql::spider_oracle_sql"); + DBUG_PRINT("info",("spider this=%p", this)); + DBUG_VOID_RETURN; +} + +spider_oracle_sql::~spider_oracle_sql() +{ + DBUG_ENTER("spider_oracle_sql::~spider_oracle_sql"); + DBUG_PRINT("info",("spider this=%p", this)); + DBUG_VOID_RETURN; +} + +int spider_oracle_sql::append_create_or_replace() +{ + DBUG_ENTER("spider_oracle_sql::append_create_or_replace"); + DBUG_PRINT("info",("spider this=%p", this)); + /* nothing to do */ + DBUG_RETURN(0); +} +int spider_oracle_sql::append_create_or_replace_table() +{ + DBUG_ENTER("spider_oracle_sql::append_create_or_replace_table"); + DBUG_PRINT("info",("spider this=%p", this)); + if (unlikely(sql_str[1].append(STRING_WITH_LEN("drop table ")))) + { + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + } + DBUG_RETURN(append_table_name_space(1)); +} + +int spider_oracle_sql::append_if_not_exists() +{ + DBUG_ENTER("spider_oracle_sql::append_if_not_exists"); + DBUG_PRINT("info",("spider this=%p", this)); + /* nothing to do */ + DBUG_RETURN(0); +} + +#ifdef HAVE_ORACLE_OCI spider_db_oracle_row::spider_db_oracle_row() : spider_db_row(spider_dbton_oracle.dbton_id), db_conn(NULL), result(NULL), @@ -5391,6 +5460,8 @@ int spider_oracle_handler::init() __func__, __FILE__, __LINE__, MYF(MY_WME | MY_ZEROFILL), &link_for_hash, sizeof(SPIDER_LINK_FOR_HASH) * share->link_count, + &query, + sizeof(spider_string *) * share->link_count, &minimum_select_bitmap, table ? sizeof(uchar) * no_bytes_in_map(table->read_set) : 0, NullS)) @@ -10882,6 +10953,45 @@ int spider_oracle_handler::set_sql_for_exec( DBUG_RETURN(0); } +int spider_oracle_handler::set_sql_for_exec( + spider_db_sql *db_sql, + int link_idx +) { + uint tmp_pos; + SPIDER_RESULT_LIST *result_list = &spider->result_list; + spider_string *str; + DBUG_ENTER("spider_oracle_handler::set_sql_for_exec"); + DBUG_PRINT("info",("spider this=%p", this)); + query[link_idx] = &result_list->sqls[link_idx]; + str = query[link_idx]; + if (str->reserve(db_sql->sql_end_pos[0] + db_sql->sql_end_pos[1] + + SPIDER_SQL_SEMICOLON_LEN)) + { + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + } + if (db_sql->sql_end_pos[1]) + { + str->copy(db_sql->sql_str[1]); + str->length(db_sql->table_name_pos[1]); + append_table_name_with_adjusting(str, link_idx, SPIDER_SQL_TYPE_DDL_SQL); + str->length(db_sql->sql_end_pos[1]); + str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN); + str->q_append(db_sql->sql_str[0].ptr(), db_sql->sql_end_pos[0]); + tmp_pos = str->length(); + str->length(str->length() - db_sql->sql_end_pos[0] + + db_sql->table_name_pos[0]); + append_table_name_with_adjusting(str, link_idx, SPIDER_SQL_TYPE_DDL_SQL); + str->length(tmp_pos); + } else { + str->copy(db_sql->sql_str[0]); + str->length(db_sql->table_name_pos[0]); + append_table_name_with_adjusting(str, link_idx, SPIDER_SQL_TYPE_DDL_SQL); + str->length(db_sql->sql_end_pos[0]); + } + DBUG_PRINT("info",("spider query=%s", str->c_ptr_safe())); + DBUG_RETURN(0); +} + int spider_oracle_handler::execute_sql( ulong sql_type, SPIDER_CONN *conn, @@ -10938,6 +11048,11 @@ int spider_oracle_handler::execute_sql( tgt_sql = exec_ha_sql; tgt_length = tgt_sql->length(); break; + case SPIDER_SQL_TYPE_DDL_SQL: + DBUG_PRINT("info",("spider SPIDER_SQL_TYPE_DDL_SQL")); + tgt_sql = query[conn->link_idx]; + tgt_length = tgt_sql->length(); + break; default: /* nothing to do */ DBUG_PRINT("info",("spider default")); diff --git a/storage/spider/spd_db_oracle.h b/storage/spider/spd_db_oracle.h index d0bd1757418..7f8c17b1325 100644 --- a/storage/spider/spd_db_oracle.h +++ b/storage/spider/spd_db_oracle.h @@ -1,4 +1,5 @@ -/* Copyright (C) 2012-2018 Kentoku Shiba +/* Copyright (C) 2012-2019 Kentoku Shiba + Copyright (C) 2019 MariaDB corp This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -13,6 +14,17 @@ along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +class spider_oracle_sql: public spider_db_sql +{ +public: + spider_oracle_sql(); + ~spider_oracle_sql(); + int append_create_or_replace(); + int append_create_or_replace_table(); + int append_if_not_exists(); +}; + +#ifdef HAVE_ORACLE_OCI class spider_db_oracle; class spider_db_oracle_result; @@ -647,6 +659,7 @@ private: int tmp_sql_pos4; /* insert val pos at tmp_table_join */ int tmp_sql_pos5; /* end of drop tbl at tmp_table_join */ spider_string dup_update_sql; + spider_string **query; spider_string *exec_sql; spider_string *exec_insert_sql; spider_string *exec_update_sql; @@ -1338,6 +1351,10 @@ public: spider_db_copy_table *tgt_ct, ulong sql_type ); + int set_sql_for_exec( + spider_db_sql *db_sql, + int link_idx + ); int execute_sql( ulong sql_type, SPIDER_CONN *conn, @@ -1606,3 +1623,4 @@ public: spider_db_copy_table *source_ct ); }; +#endif diff --git a/storage/spider/spd_environ.h b/storage/spider/spd_environ.h index 5e66a912582..1f4cf4ceae3 100644 --- a/storage/spider/spd_environ.h +++ b/storage/spider/spd_environ.h @@ -1,4 +1,5 @@ -/* Copyright (C) 2008-2018 Kentoku Shiba & 2017 MariaDB corp +/* Copyright (C) 2008-2018 Kentoku Shiba + Copyright (C) 2017-2019 MariaDB corp This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -18,6 +19,7 @@ */ #ifndef SPD_ENVIRON_INCLUDED +#define SPD_ENVIRON_INCLUDED #if (defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100000) #define SPIDER_HANDLER_START_BULK_INSERT_HAS_FLAGS @@ -40,6 +42,8 @@ #if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100300 #define SPIDER_UPDATE_ROW_HAS_CONST_NEW_DATA +#define SPIDER_PARTITION_HAS_CONNECTION_STRING +#define SPIDER_TOKEN_10_3 #endif #if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100309 @@ -49,5 +53,7 @@ #if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100400 #define SPIDER_USE_CONST_ITEM_FOR_STRING_INT_REAL_DECIMAL_DATE_ITEM #define SPIDER_SQL_CACHE_IS_IN_LEX +#define SPIDER_REWRITE_AVAILABLE +#define SPIDER_TOKEN_10_4 #endif #endif /* SPD_ENVIRON_INCLUDED */ diff --git a/storage/spider/spd_err.h b/storage/spider/spd_err.h index 1523df21cf1..591fd301365 100644 --- a/storage/spider/spd_err.h +++ b/storage/spider/spd_err.h @@ -1,4 +1,5 @@ -/* Copyright (C) 2008-2017 Kentoku Shiba +/* Copyright (C) 2008-2019 Kentoku Shiba + Copyright (C) 2019 MariaDB corp This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -124,8 +125,17 @@ #define ER_SPIDER_CON_COUNT_ERROR_STR "Too many connections between spider and remote" #define ER_SPIDER_TABLE_OPEN_TIMEOUT_NUM 12714 #define ER_SPIDER_TABLE_OPEN_TIMEOUT_STR "Table %s.%s open timeout" +#define ER_SPIDER_NOT_SUPPORTED_NUM 12715 +#define ER_SPIDER_NOT_SUPPORTED_STR "%s is not supported by %s" +#define ER_SPIDER_INVALID_VALUE_NUM 12716 +#define ER_SPIDER_INVALID_VALUE_STR "Invalid value %s in %s.%s" +#define ER_SPIDER_SYNTAX_NUM 12717 +#define ER_SPIDER_SYNTAX_STR "%s detected a syntax error near '%-.80s' at line %d" +#define ER_SPIDER_TOO_LONG_NUM 12718 +#define ER_SPIDER_TOO_LONG_STR "%s is too long" #define ER_SPIDER_COND_SKIP_NUM 12801 #define ER_SPIDER_UNKNOWN_NUM 12500 #define ER_SPIDER_UNKNOWN_STR "unknown" #define ER_SPIDER_UNKNOWN_LEN (sizeof(ER_SPIDER_UNKNOWN_STR) - 1) +#define ER_SPIDER_UNKNOWN_STR2 "unknown error %d is occured by %s" diff --git a/storage/spider/spd_include.h b/storage/spider/spd_include.h index 37ec2d8c608..c4fdffe28ac 100644 --- a/storage/spider/spd_include.h +++ b/storage/spider/spd_include.h @@ -1,4 +1,5 @@ -/* Copyright (C) 2008-2018 Kentoku Shiba +/* Copyright (C) 2008-2019 Kentoku Shiba + Copyright (C) 2019 MariaDB corp This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -13,8 +14,13 @@ along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#ifdef SPIDER_REWRITE_AVAILABLE +#define SPIDER_DETAIL_VERSION "3.4.1" +#define SPIDER_HEX_VERSION 0x0304 +#else #define SPIDER_DETAIL_VERSION "3.3.14" #define SPIDER_HEX_VERSION 0x0303 +#endif #if MYSQL_VERSION_ID < 50500 #define spider_my_free(A,B) my_free(A,B) @@ -260,7 +266,7 @@ const char SPIDER_empty_string = ""; #define SPIDER_TMP_SHARE_LONG_COUNT 19 #define SPIDER_TMP_SHARE_LONGLONG_COUNT 3 -#define SPIDER_MEM_CALC_LIST_NUM 257 +#define SPIDER_MEM_CALC_LIST_NUM 264 #define SPIDER_CONN_META_BUF_LEN 64 #define SPIDER_BACKUP_DASTATUS \ @@ -1405,6 +1411,52 @@ public: ulong sort; }; +class SPIDER_RWTBLSPTT +{ +public: + ulonglong subpartition_ordinal_position; + LEX_CSTRING subpartition_name; + LEX_CSTRING subpartition_description; + LEX_CSTRING connection_str; + LEX_CSTRING comment_str; + SPIDER_RWTBLSPTT *next; +}; + +class SPIDER_RWTBLPTT +{ +public: + ulonglong partition_ordinal_position; + LEX_CSTRING partition_name; + LEX_CSTRING partition_description; + LEX_CSTRING connection_str; + LEX_CSTRING comment_str; + SPIDER_RWTBLSPTT *ts; + SPIDER_RWTBLPTT *next; +}; + +class SPIDER_RWTBLTBL +{ +public: + ulonglong partition_id; + LEX_CSTRING partition_method; + LEX_CSTRING partition_expression; + LEX_CSTRING subpartition_method; + LEX_CSTRING subpartition_expression; + LEX_CSTRING connection_str; + LEX_CSTRING comment_str; + SPIDER_RWTBLPTT *tp; + SPIDER_RWTBLTBL *next; +}; + +class SPIDER_RWTBL: public SPIDER_SORT +{ +public: + ulonglong table_id; + LEX_CSTRING db_name; + LEX_CSTRING table_name; + SPIDER_RWTBLTBL *tt; +}; + typedef struct st_spider_trx_ha { char *table_name; diff --git a/storage/spider/spd_param.cc b/storage/spider/spd_param.cc index 6b237bbfff8..fd88a2c2348 100644 --- a/storage/spider/spd_param.cc +++ b/storage/spider/spd_param.cc @@ -1,4 +1,5 @@ -/* Copyright (C) 2008-2018 Kentoku Shiba +/* Copyright (C) 2008-2019 Kentoku Shiba + Copyright (C) 2019 MariaDB corp This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -38,6 +39,12 @@ extern struct st_mysql_plugin spider_i_s_alloc_mem; #ifdef MARIADB_BASE_VERSION extern struct st_maria_plugin spider_i_s_alloc_mem_maria; #endif +#ifdef SPIDER_REWRITE_AVAILABLE +extern struct st_mysql_plugin spider_audit_rewrite; +#ifdef MARIADB_BASE_VERSION +extern struct st_maria_plugin spider_audit_rewrite_maria; +#endif +#endif extern volatile ulonglong spider_mon_table_cache_version; extern volatile ulonglong spider_mon_table_cache_version_req; @@ -3526,6 +3533,9 @@ mysql_declare_plugin(spider) 0, #endif }, +#ifdef SPIDER_REWRITE_AVAILABLE +spider_audit_rewrite, +#endif spider_i_s_alloc_mem mysql_declare_plugin_end; @@ -3546,6 +3556,9 @@ maria_declare_plugin(spider) SPIDER_DETAIL_VERSION, MariaDB_PLUGIN_MATURITY_STABLE }, +#ifdef SPIDER_REWRITE_AVAILABLE +spider_audit_rewrite_maria, +#endif spider_i_s_alloc_mem_maria maria_declare_plugin_end; #endif diff --git a/storage/spider/spd_parse.cc b/storage/spider/spd_parse.cc new file mode 100644 index 00000000000..500a8507e7f --- /dev/null +++ b/storage/spider/spd_parse.cc @@ -0,0 +1,1058 @@ +/* Copyright (C) 2018-2019 Kentoku Shiba + Copyright (C) 2018-2019 MariaDB corp + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#define MYSQL_SERVER 1 +#define MYSQL_LEX 1 +#include <my_global.h> +#include "mysql_version.h" +#include "spd_environ.h" +#if MYSQL_VERSION_ID >= 50500 +#include "sql_priv.h" +#include "probes_mysql.h" +#include "sql_class.h" +#include "sql_partition.h" +#include "spd_err.h" +#include "spd_db_include.h" +#include "spd_include.h" +#include "ha_spider.h" +#include "spd_trx.h" +#include "spd_db_conn.h" +#include "spd_table.h" +#include "spd_conn.h" +#include "spd_malloc.h" +#include "spd_parse.h" + +extern SPIDER_DBTON spider_dbton[SPIDER_DBTON_SIZE]; +#ifdef SPIDER_HAS_HASH_VALUE_TYPE +extern HASH spider_open_tables; +#endif + +LEX_CSTRING spider_ident_back_quote = {STRING_WITH_LEN("`")}; +LEX_CSTRING spider_ident_double_quote = {STRING_WITH_LEN("\"")}; + +spider_parse_sql::spider_parse_sql() : + flags(0), found_semicolon(NULL), parser_state_backup(NULL), work_str(NULL), + spider(NULL), spider_last(NULL), trx(NULL), field(NULL), zero_bitmap(NULL) +{ + DBUG_ENTER("spider_parse_sql::spider_parse_sql"); + DBUG_PRINT("info",("spider this=%p", this)); + DBUG_VOID_RETURN; +} + +spider_parse_sql::~spider_parse_sql() +{ + spider_db_sql *db_sql_tmp; + DBUG_ENTER("spider_parse_sql::~spider_parse_sql"); + DBUG_PRINT("info",("spider this=%p", this)); + if (flags & SPIDER_PARSE_PARSER_STATE_BACKUPED) + { + thd->m_parser_state = parser_state_backup; + } + if (spider) + { + ha_spider *tmp = spider; + do { + ha_spider *next = tmp->next; + SPIDER_SHARE *share = tmp->share; + spider_free_spider_object_for_share_with_sql_string(&tmp); + spider_free_share_resource_only(share); + tmp = next; + } while (tmp); + } + if (trx) + { + trx->thd = NULL; + spider_free_trx(trx, TRUE); + } + if (work_str) + { + delete [] work_str; + } + while ((db_sql_tmp = db_sql)) + { + db_sql = db_sql->next; + delete db_sql_tmp; + } + if (zero_bitmap) + { + my_bitmap_free(zero_bitmap); + } + DBUG_VOID_RETURN; +} + +int spider_parse_sql::init( + THD *thd_arg, + char *query_arg, + uint query_length, + const struct charset_info_st *query_charset, + ulonglong query_id +) { + int error_num, roop_count; + cs = query_charset; + spider_db_sql *tmp; + DBUG_ENTER("spider_parse_sql::init"); + DBUG_PRINT("info",("spider this=%p", this)); + thd = thd_arg; + query = query_arg; + query_len = query_length; + parser_state_backup = thd->m_parser_state; + flags = SPIDER_PARSE_PARSER_STATE_BACKUPED; + thd->m_parser_state = &parser_state; + if (parser_state.init(thd, query, query_length)) + { + error_num = HA_ERR_OUT_OF_MEM; + goto error; + } + parser_state.m_digest_psi = NULL; + parser_state.m_lip.m_digest = NULL; + if (thd->variables.sql_mode & MODE_ORACLE) + { + DBlex = ORAlex; + if (unlikely(!(db_sql = spider_oracle_create_sql()))) + { + error_num = HA_ERR_OUT_OF_MEM; + goto error; + } + } else { + DBlex = MYSQLlex; + if (unlikely(!(db_sql = spider_mariadb_create_sql()))) + { + error_num = HA_ERR_OUT_OF_MEM; + goto error; + } + } + if (unlikely((error_num = db_sql->init(cs)))) + { + goto error; + } + if (thd->variables.sql_mode & MODE_ANSI_QUOTES) + { + db_sql->set_quote_char_for_ident(spider_ident_double_quote); + } else { + db_sql->set_quote_char_for_ident(spider_ident_back_quote); + } + tmp = db_sql; + for (roop_count = 0; roop_count < (int) SPIDER_DBTON_SIZE; ++roop_count) + { + if (!spider_dbton[roop_count].db_util) + { + break; + } + if (spider_dbton[roop_count].db_access_type == + SPIDER_DB_ACCESS_TYPE_NOSQL) + { + continue; + } + if (unlikely(!(tmp->next = (spider_db_sql *) spider_dbton[roop_count]. + create_db_sql()))) + { + error_num = HA_ERR_OUT_OF_MEM; + goto error; + } + tmp = tmp->next; + if (unlikely((error_num = tmp->init(cs)))) + { + goto error; + } + db_sql_by_id[roop_count] = tmp; + } + table_share.path.str = ""; + table_share.path.length = 0; + table_share.normalized_path.str = ""; + table_share.normalized_path.length = 0; + table_share.partition_info_str = (char *) ""; + table_share.table_charset = NULL; + table_share.fields = 0; + table_share.keys = 0; + table_share.field = &field; + table_share.key_info = NULL; + table_share.tmp_table = INTERNAL_TMP_TABLE; +#ifdef SPIDER_HAS_HASH_VALUE_TYPE + hash_value = my_calc_hash(&spider_open_tables, (uchar*) "", 0); +#endif + if ( + part_info.partitions.push_back(&part_p_elem) || + sub_part_info.partitions.push_back(&sub_part_p_elem) || + sub_part_p_elem.subpartitions.push_back(&sub_part_sub_p_elem) + ) { + error_num = HA_ERR_OUT_OF_MEM; + goto error; + } + if (unlikely(!(work_str = new spider_string[2]))) + { + error_num = HA_ERR_OUT_OF_MEM; + goto error; + } + for (roop_count = 0; roop_count < 2; ++roop_count) + { + work_str[roop_count].init_calc_mem(263); + work_str[roop_count].set_charset(cs); + } + zero_bitmap = &table_share.all_set; + if (my_bitmap_init(zero_bitmap, NULL, 0, FALSE)) + { + zero_bitmap = NULL; + error_num = HA_ERR_OUT_OF_MEM; + goto error; + } + bitmap_set_all(zero_bitmap); + DBUG_RETURN(0); + +error: + if (work_str) + { + delete [] work_str; + work_str = NULL; + } + while ((tmp = db_sql)) + { + db_sql = db_sql->next; + delete tmp; + } + thd->m_parser_state = parser_state_backup; + flags &= ~SPIDER_PARSE_PARSER_STATE_BACKUPED; + DBUG_RETURN(error_num); +} + +void spider_parse_sql::reset( + char *query_arg, + uint query_length, + const struct charset_info_st *query_charset, + ulonglong query_id +) { + cs = query_charset; + spider_db_sql *tmp; + DBUG_ENTER("spider_parse_sql::reset"); + DBUG_PRINT("info",("spider this=%p", this)); + query = query_arg; + query_len = query_length; + parser_state_backup = thd->m_parser_state; + flags = SPIDER_PARSE_PARSER_STATE_BACKUPED; + thd->m_parser_state = &parser_state; + parser_state.reset(query, query_len); + parser_state.m_digest_psi = NULL; + parser_state.m_lip.m_digest = NULL; + table_share.table_charset = NULL; + if (thd->variables.sql_mode & MODE_ORACLE) + { + DBlex = ORAlex; + } else { + DBlex = MYSQLlex; + } + db_sql->reset(cs); + if (thd->variables.sql_mode & MODE_ANSI_QUOTES) + { + db_sql->set_quote_char_for_ident(spider_ident_double_quote); + } else { + db_sql->set_quote_char_for_ident(spider_ident_back_quote); + } + tmp = db_sql->next; + while (tmp) + { + tmp->reset(cs); + tmp = tmp->next; + } + if (spider) + { + ha_spider *tmp_spider = spider; + do { + ha_spider *next = tmp_spider->next; + SPIDER_SHARE *share = tmp_spider->share; + spider_free_spider_object_for_share_with_sql_string(&tmp_spider); + spider_free_share_resource_only(share); + tmp_spider = next; + } while (tmp_spider); + spider = NULL; + spider_last = NULL; + } + DBUG_VOID_RETURN; +} + +void spider_parse_sql::end_parse() +{ + DBUG_ENTER("spider_parse_sql::end_parse"); + DBUG_PRINT("info",("spider this=%p", this)); + if (flags & SPIDER_PARSE_PARSER_STATE_BACKUPED) + { + spider_db_sql *tmp = db_sql; + do { + tmp->set_sql_end_pos(); + } while ((tmp = tmp->next)); + found_semicolon = parser_state.m_lip.found_semicolon; + thd->m_parser_state = parser_state_backup; + flags &= ~SPIDER_PARSE_PARSER_STATE_BACKUPED; + } + DBUG_VOID_RETURN; +} + +const char *spider_parse_sql::get_found_semicolon() +{ + DBUG_ENTER("spider_parse_sql::get_found_semicolon"); + DBUG_PRINT("info",("spider this=%p", this)); + DBUG_RETURN(found_semicolon); +} + +int spider_parse_sql::get_next( + union YYSTYPE *yylval +) { + DBUG_ENTER("spider_parse_sql::get_next"); + DBUG_PRINT("info",("spider this=%p", this)); + get_next_val = DBlex(yylval, thd); + DBUG_PRINT("info",("spider get_next_val=%d", get_next_val)); + if (unlikely(get_next_val <= 0)) + { + get_next_val = END_OF_INPUT; + } + DBUG_RETURN(get_next_val); +} + +void spider_parse_sql::push_syntax_error( + const char *near_by +) { + DBUG_ENTER("spider_parse_sql::push_syntax_error"); + DBUG_PRINT("info",("spider this=%p", this)); + DBUG_PRINT("info",("spider get_next_val=%d", get_next_val)); + Lex_input_stream *lip= &parser_state.m_lip; + if (!near_by && !(near_by = lip->get_tok_start())) + { + near_by = ""; + } + ErrConvString ecs(near_by, strlen(near_by), + thd->variables.character_set_client); + my_printf_error(ER_SPIDER_SYNTAX_NUM, ER_SPIDER_SYNTAX_STR, MYF(0), + "Spider Rewrite Plugin", ecs.ptr(), lip->yylineno); +#ifndef DBUG_OFF + union YYSTYPE yylval; + get_next(&yylval); +#endif + DBUG_VOID_RETURN; +} + +void spider_parse_sql::push_error( + int error_num +) { + DBUG_ENTER("spider_parse_sql::push_error"); + DBUG_PRINT("info",("spider this=%p", this)); + if (thd->is_error()) + { + /* nothing to do */ + DBUG_VOID_RETURN; + } + switch (error_num) + { + case HA_ERR_OUT_OF_MEM: + my_error(HA_ERR_OUT_OF_MEM, MYF(0)); + break; + case ER_SPIDER_TOO_LONG_NUM: + my_printf_error(ER_SPIDER_TOO_LONG_NUM, ER_SPIDER_TOO_LONG_STR, MYF(0), + error_str_piece); + break; + default: + my_printf_error(ER_SPIDER_UNKNOWN_NUM, ER_SPIDER_UNKNOWN_STR2, MYF(0), + error_num, "Spider Rewrite Plugin"); + break; + } + DBUG_VOID_RETURN; +} + +int spider_parse_sql::append_parsed_symbol( + int symbol_tok, + union YYSTYPE *yylval_tok +) { + int error_num; + spider_db_sql *tmp; + DBUG_ENTER("spider_parse_sql::append_parsed_symbol"); + DBUG_PRINT("info",("spider this=%p", this)); + tmp = db_sql; + do { + if ((error_num = tmp->append_parsed_symbol(symbol_tok, yylval_tok))) + { + DBUG_RETURN(error_num); + } + } while ((tmp = tmp->next)); + DBUG_RETURN(0); +} + +int spider_parse_sql::append_parsed_symbol_for_data_nodes( + int symbol_tok, + union YYSTYPE *yylval_tok +) { + int error_num; + spider_db_sql *tmp; + DBUG_ENTER("spider_parse_sql::append_parsed_symbol_for_data_nodes"); + DBUG_PRINT("info",("spider this=%p", this)); + tmp = db_sql; + while ((tmp = tmp->next)) + { + if ((error_num = tmp->append_parsed_symbol(symbol_tok, yylval_tok))) + { + DBUG_RETURN(error_num); + } + } + DBUG_RETURN(0); +} + +int spider_parse_sql::append_parsed_symbol_for_spider_nodes( + int symbol_tok, + union YYSTYPE *yylval_tok +) { + DBUG_ENTER("spider_parse_sql::append_parsed_symbol_for_spider_nodes"); + DBUG_PRINT("info",("spider this=%p", this)); + DBUG_RETURN(db_sql->append_parsed_symbol(symbol_tok, yylval_tok)); +} + +int spider_parse_sql::append_parsed_symbol_for_spider_nodes_ex( + int symbol_tok, + union YYSTYPE *yylval_tok +) { + DBUG_ENTER("spider_parse_sql::append_parsed_symbol_for_spider_nodes_ex"); + DBUG_PRINT("info",("spider this=%p", this)); + DBUG_RETURN(db_sql->append_parsed_symbol_ex(symbol_tok, yylval_tok)); +} + +char *spider_parse_sql::get_query_for_spider_node( + uint *query_length +) { + DBUG_ENTER("spider_parse_sql::get_query_for_spider_node"); + DBUG_PRINT("info",("spider this=%p", this)); + *query_length = db_sql->sql_str[0].length(); + DBUG_RETURN((char *) db_sql->sql_str[0].c_ptr_safe()); +} + +void spider_parse_sql::set_query_id( + ulonglong query_id_arg +) { + DBUG_ENTER("spider_parse_sql::set_query_id"); + DBUG_PRINT("info",("spider this=%p", this)); + query_id = query_id_arg; + DBUG_VOID_RETURN; +} + +ulonglong spider_parse_sql::get_query_id() +{ + DBUG_ENTER("spider_parse_sql::get_query_id"); + DBUG_PRINT("info",("spider this=%p", this)); + DBUG_RETURN(query_id); +} + +void spider_parse_sql::set_schema_name( + LEX_CSTRING &name +) { + DBUG_ENTER("spider_parse_sql::set_schema_name"); + DBUG_PRINT("info",("spider this=%p", this)); + schema_name = name; + table_share.db = name; + DBUG_VOID_RETURN; +} + +void spider_parse_sql::set_table_name( + LEX_CSTRING &name +) { + spider_db_sql *tmp; + DBUG_ENTER("spider_parse_sql::set_table_name"); + DBUG_PRINT("info",("spider this=%p", this)); + table_name = name; + table_share.table_name = name; + tmp = db_sql; + do { + tmp->append_table_name_space(); + } while ((tmp = tmp->next)); + DBUG_VOID_RETURN; +} + +int spider_parse_sql::set_create_or_replace() +{ + int error_num; + spider_db_sql *tmp; + DBUG_ENTER("spider_parse_sql::set_create_or_replace"); + DBUG_PRINT("info",("spider this=%p", this)); + tmp = db_sql; + do { + if ((error_num = tmp->append_create_or_replace())) + { + DBUG_RETURN(error_num); + } + } while ((tmp = tmp->next)); + flags |= SPIDER_PARSE_CREATE_OR_REPLACE; + DBUG_RETURN(0); +} + +int spider_parse_sql::append_create_or_replace_table() +{ + int error_num; + spider_db_sql *tmp; + DBUG_ENTER("spider_parse_sql::append_create_or_replace_table"); + DBUG_PRINT("info",("spider this=%p", this)); + if (flags & SPIDER_PARSE_CREATE_OR_REPLACE) + { + tmp = db_sql; + while ((tmp = tmp->next)) + { + if ((error_num = tmp->append_create_or_replace_table())) + { + DBUG_RETURN(error_num); + } + } + } + DBUG_RETURN(0); +} + +int spider_parse_sql::append_if_not_exists() +{ + int error_num; + spider_db_sql *tmp; + DBUG_ENTER("spider_parse_sql::append_if_not_exists"); + DBUG_PRINT("info",("spider this=%p", this)); + tmp = db_sql; + do { + if ((error_num = tmp->append_if_not_exists())) + { + DBUG_RETURN(error_num); + } + } while ((tmp = tmp->next)); + DBUG_RETURN(0); +} + +int spider_parse_sql::append_table_option_name_for_data_nodes( + int symbol_tok, + union YYSTYPE *yylval_tok +) { + int error_num; + spider_db_sql *tmp; + DBUG_ENTER("spider_parse_sql::append_table_option_name_for_data_nodes"); + DBUG_PRINT("info",("spider this=%p", this)); + tmp = db_sql; + while ((tmp = tmp->next)) + { + if ((error_num = tmp->append_table_option_name(symbol_tok, yylval_tok))) + { + DBUG_RETURN(error_num); + } + } + DBUG_RETURN(0); +} + +int spider_parse_sql::append_table_option_name( + int symbol_tok, + union YYSTYPE *yylval_tok +) { + int error_num; + spider_db_sql *tmp; + DBUG_ENTER("spider_parse_sql::append_table_option_name"); + DBUG_PRINT("info",("spider this=%p", this)); + tmp = db_sql; + do { + if ((error_num = tmp->append_table_option_name(symbol_tok, yylval_tok))) + { + DBUG_RETURN(error_num); + } + } while ((tmp = tmp->next)); + DBUG_RETURN(0); +} + +int spider_parse_sql::append_table_option_value_for_data_nodes( + int symbol_tok, + union YYSTYPE *yylval_tok +) { + int error_num; + spider_db_sql *tmp; + DBUG_ENTER("spider_parse_sql::append_table_option_value_for_data_nodes"); + DBUG_PRINT("info",("spider this=%p", this)); + tmp = db_sql; + while ((tmp = tmp->next)) + { + if ((error_num = tmp->append_table_option_value(symbol_tok, yylval_tok))) + { + DBUG_RETURN(error_num); + } + } + DBUG_RETURN(0); +} + +int spider_parse_sql::append_table_option_value( + int symbol_tok, + union YYSTYPE *yylval_tok +) { + int error_num; + spider_db_sql *tmp; + DBUG_ENTER("spider_parse_sql::append_table_option_value"); + DBUG_PRINT("info",("spider this=%p", this)); + tmp = db_sql; + do { + if ((error_num = tmp->append_table_option_value(symbol_tok, yylval_tok))) + { + DBUG_RETURN(error_num); + } + } while ((tmp = tmp->next)); + if (flags & SPIDER_PARSE_CHARSET_NOTICE) + { + char csname[MY_CS_NAME_SIZE + 1]; + DBUG_ASSERT(MY_CS_NAME_SIZE >= yylval_tok->lex_str.length); + memcpy(csname, yylval_tok->lex_str.str, yylval_tok->lex_str.length); + csname[yylval_tok->lex_str.length] = '\0'; + table_share.table_charset = get_charset_by_csname( + csname, MY_CS_PRIMARY, MYF(MY_WME)); + flags &= ~SPIDER_PARSE_CHARSET_NOTICE; + } + DBUG_RETURN(0); +} + +int spider_parse_sql::append_table_option_character_set() +{ + int error_num; + spider_db_sql *tmp; + DBUG_ENTER("spider_parse_sql::append_table_option_character_set"); + DBUG_PRINT("info",("spider this=%p", this)); + tmp = db_sql; + do { + if ((error_num = tmp->append_table_option_character_set())) + { + DBUG_RETURN(error_num); + } + } while ((tmp = tmp->next)); + flags |= SPIDER_PARSE_CHARSET_NOTICE; + DBUG_RETURN(0); +} + +int spider_parse_sql::append_table_option_data_directory_for_data_nodes() +{ + int error_num; + spider_db_sql *tmp; + DBUG_ENTER("spider_parse_sql::append_table_option_data_directory_for_data_nodes"); + DBUG_PRINT("info",("spider this=%p", this)); + tmp = db_sql; + while ((tmp = tmp->next)) + { + if ((error_num = tmp->append_table_option_data_directory())) + { + DBUG_RETURN(error_num); + } + } + DBUG_RETURN(0); +} + +int spider_parse_sql::append_table_option_index_directory_for_data_nodes() +{ + int error_num; + spider_db_sql *tmp; + DBUG_ENTER("spider_parse_sql::append_table_option_index_directory_for_data_nodes"); + DBUG_PRINT("info",("spider this=%p", this)); + tmp = db_sql; + while ((tmp = tmp->next)) + { + if ((error_num = tmp->append_table_option_index_directory())) + { + DBUG_RETURN(error_num); + } + } + DBUG_RETURN(0); +} + +int spider_parse_sql::append_table_option_with_system_versioning_for_data_nodes() +{ + int error_num; + spider_db_sql *tmp; + DBUG_ENTER("spider_parse_sql::append_table_option_with_system_versioning_for_data_nodes"); + DBUG_PRINT("info",("spider this=%p", this)); + tmp = db_sql; + while ((tmp = tmp->next)) + { + if ((error_num = tmp->append_table_option_with_system_versioning())) + { + DBUG_RETURN(error_num); + } + } + DBUG_RETURN(0); +} + +int spider_parse_sql::append_spider_table_for_spider_nodes( + SPIDER_RWTBLTBL *rwtbltbl +) { + int error_num; + DBUG_ENTER("spider_parse_sql::append_spider_table_for_spider_nodes"); + DBUG_PRINT("info",("spider this=%p", this)); + if ((error_num = db_sql->append_table_name(&schema_name, &table_name))) + { + DBUG_RETURN(error_num); + } + DBUG_RETURN(db_sql->append_spider_table(&table_name, rwtbltbl)); +} + +int spider_parse_sql::create_share_from_table( + SPIDER_RWTBLTBL *rwtbltbl +) { + int error_num; + SPIDER_RWTBLPTT *tp; + SPIDER_SHARE *share; + DBUG_ENTER("spider_parse_sql::create_share_from_table"); + DBUG_PRINT("info",("spider this=%p", this)); + if (!trx && !(trx = spider_get_trx(NULL, FALSE, &error_num))) + { + DBUG_RETURN(error_num); + } + trx->thd = thd; + table_share.comment = rwtbltbl->comment_str; + if (!rwtbltbl->partition_method.length) + { + /* no partition definition */ + spider_string *str = &work_str[1]; + str->length(0); + if (str->reserve(rwtbltbl->connection_str.length + table_name.length * 2 + + SPIDER_SQL_TABLE_LEN + 4)) + { + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + } + str->q_append(SPIDER_SQL_TABLE_STR, SPIDER_SQL_TABLE_LEN); + str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN); + str->append_for_single_quote(table_name.str, table_name.length); + str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN); + if (rwtbltbl->connection_str.length) + { + str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); + str->q_append(rwtbltbl->connection_str.str, + rwtbltbl->connection_str.length); + } + table_share.connect_string.str = str->c_ptr_safe(); + table_share.connect_string.length = str->length(); + if (!(share = spider_create_share("", &table_share, +#ifdef WITH_PARTITION_STORAGE_ENGINE + NULL, +#endif +#ifdef SPIDER_HAS_HASH_VALUE_TYPE + hash_value, +#endif + &error_num))) + { + DBUG_RETURN(error_num); + } + ha_spider *tmp_spider = NULL; + if ((error_num = spider_create_spider_object_for_share_with_sql_string( + trx, share, &tmp_spider))) + { + spider_free_share_resource_only(share); + DBUG_RETURN(error_num); + } + if (spider_last) + { + spider_last->next = tmp_spider; + } else { + spider = tmp_spider; + } + spider_last = tmp_spider; + spider_last->next = NULL; + DBUG_PRINT("info",("spider tmp_spider->share=%p", tmp_spider->share)); + DBUG_RETURN(0); + } + table_share.connect_string = rwtbltbl->connection_str; + tp = rwtbltbl->tp; + while (tp) + { + if ((error_num = create_share_from_partition(rwtbltbl, tp))) + { + DBUG_RETURN(error_num); + } + tp = tp->next; + } + DBUG_RETURN(0); +} + +int spider_parse_sql::create_share_from_partition( + SPIDER_RWTBLTBL *rwtbltbl, + SPIDER_RWTBLPTT *rwtblptt +) { + int error_num; + SPIDER_SHARE *share; + SPIDER_RWTBLSPTT *ts; + DBUG_ENTER("spider_parse_sql::create_share_from_partition"); + DBUG_PRINT("info",("spider this=%p", this)); + if (!rwtblptt->ts) + { + /* no subpartition definition */ + char tmp_name[FN_REFLEN + 1]; + part_p_elem.part_comment = rwtblptt->comment_str.str; +#ifdef SPIDER_PARTITION_HAS_CONNECTION_STRING + spider_string *str = &work_str[1]; + str->length(0); + if (str->reserve(rwtblptt->connection_str.length + table_name.length * 2 + + SPIDER_SQL_TABLE_LEN + 4)) + { + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + } + str->q_append(SPIDER_SQL_TABLE_STR, SPIDER_SQL_TABLE_LEN); + str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN); + str->append_for_single_quote(table_name.str, table_name.length); + str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN); + if (rwtblptt->connection_str.length) + { + str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); + str->q_append(rwtblptt->connection_str.str, + rwtblptt->connection_str.length); + } + part_p_elem.connect_string.str = str->c_ptr_safe(); + part_p_elem.connect_string.length = str->length(); +#endif + part_p_elem.partition_name = rwtblptt->partition_name.str; + if ((error_num = SPIDER_create_partition_name( + tmp_name, FN_REFLEN + 1, table_share.path.str, + part_p_elem.partition_name, NORMAL_PART_NAME, TRUE))) + { + if (error_num == HA_WRONG_CREATE_OPTION) + { + error_num = ER_SPIDER_TOO_LONG_NUM; + error_str_piece = "Table name + partition name"; + } + DBUG_RETURN(error_num); + } + if (!(share = spider_create_share(tmp_name, &table_share, +#ifdef WITH_PARTITION_STORAGE_ENGINE + &part_info, +#endif +#ifdef SPIDER_HAS_HASH_VALUE_TYPE + hash_value, +#endif + &error_num))) + { + DBUG_RETURN(error_num); + } + ha_spider *tmp_spider = NULL; + if ((error_num = spider_create_spider_object_for_share_with_sql_string( + trx, share, &tmp_spider))) + { + spider_free_share_resource_only(share); + DBUG_RETURN(error_num); + } + if (spider_last) + { + spider_last->next = tmp_spider; + } else { + spider = tmp_spider; + } + spider_last = tmp_spider; + spider_last->next = NULL; + DBUG_PRINT("info",("spider tmp_spider->share=%p", tmp_spider->share)); + DBUG_RETURN(0); + } + sub_part_p_elem.part_comment = rwtblptt->comment_str.str; +#ifdef SPIDER_PARTITION_HAS_CONNECTION_STRING + sub_part_p_elem.connect_string = rwtblptt->connection_str; +#endif + sub_part_p_elem.partition_name = rwtblptt->partition_name.str; + ts = rwtblptt->ts; + while (ts) + { + if ((error_num = create_share_from_subpartition(rwtbltbl, ts))) + { + DBUG_RETURN(error_num); + } + ts = ts->next; + } + DBUG_RETURN(0); +} + +int spider_parse_sql::create_share_from_subpartition( + SPIDER_RWTBLTBL *rwtbltbl, + SPIDER_RWTBLSPTT *rwtblsptt +) { + int error_num; + char tmp_name[FN_REFLEN + 1]; + SPIDER_SHARE *share; + DBUG_ENTER("spider_parse_sql::create_share_from_subpartition"); + DBUG_PRINT("info",("spider this=%p", this)); + sub_part_sub_p_elem.part_comment = rwtblsptt->comment_str.str; +#ifdef SPIDER_PARTITION_HAS_CONNECTION_STRING + spider_string *str = &work_str[1]; + str->length(0); + if (str->reserve(rwtblsptt->connection_str.length + table_name.length * 2 + + SPIDER_SQL_TABLE_LEN + 4)) + { + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + } + str->q_append(SPIDER_SQL_TABLE_STR, SPIDER_SQL_TABLE_LEN); + str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN); + str->append_for_single_quote(table_name.str, table_name.length); + str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN); + if (rwtblsptt->connection_str.length) + { + str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); + str->q_append(rwtblsptt->connection_str.str, + rwtblsptt->connection_str.length); + } + sub_part_sub_p_elem.connect_string.str = str->c_ptr_safe(); + sub_part_sub_p_elem.connect_string.length = str->length(); +#endif + sub_part_sub_p_elem.partition_name = rwtblsptt->subpartition_name.str; + if ((error_num = SPIDER_create_subpartition_name( + tmp_name, FN_REFLEN + 1, table_share.path.str, + sub_part_p_elem.partition_name, sub_part_sub_p_elem.partition_name, + NORMAL_PART_NAME))) + { + if (error_num == HA_WRONG_CREATE_OPTION) + { + error_num = ER_SPIDER_TOO_LONG_NUM; + error_str_piece = "Table name + partition name + subpartition name"; + } + DBUG_RETURN(error_num); + } + if (!(share = spider_create_share(tmp_name, &table_share, +#ifdef WITH_PARTITION_STORAGE_ENGINE + &sub_part_info, +#endif +#ifdef SPIDER_HAS_HASH_VALUE_TYPE + hash_value, +#endif + &error_num))) + { + DBUG_RETURN(error_num); + } + ha_spider *tmp_spider = NULL; + if ((error_num = spider_create_spider_object_for_share_with_sql_string( + trx, share, &tmp_spider))) + { + spider_free_share_resource_only(share); + DBUG_RETURN(error_num); + } + if (spider_last) + { + spider_last->next = tmp_spider; + } else { + spider = tmp_spider; + } + spider_last = tmp_spider; + spider_last->next = NULL; + DBUG_PRINT("info",("spider tmp_spider->share=%p", tmp_spider->share)); + DBUG_RETURN(0); +} + +int spider_parse_sql::get_conn() +{ + int error_num; + ha_spider *tmp; + DBUG_ENTER("spider_parse_sql::get_conn"); + DBUG_PRINT("info",("spider this=%p", this)); + tmp = spider; + do { + uint roop_count; + SPIDER_SHARE *share = tmp->share; + for (roop_count = 0; roop_count < share->all_link_count; ++roop_count) + { + if (!spider_get_conn(share, roop_count, share->conn_keys[roop_count], + trx, tmp, FALSE, FALSE, SPIDER_CONN_KIND_MYSQL, &error_num)) + { + DBUG_RETURN(error_num); + } + } + } while ((tmp = tmp->next)); + DBUG_RETURN(0); +} + +int spider_parse_sql::send_sql_to_data_nodes() +{ + int error_num; + ha_spider *tmp; + DBUG_ENTER("spider_parse_sql::send_sql_to_data_nodes"); + DBUG_PRINT("info",("spider this=%p", this)); + tmp = spider; + do { + uint roop_count; + SPIDER_SHARE *share = tmp->share; +#ifndef WITHOUT_SPIDER_BG_SEARCH + if ((error_num = spider_set_conn_bg_param(tmp))) + goto end; +#endif + for (roop_count = 0; roop_count < share->all_link_count; ++roop_count) + { + SPIDER_CONN *conn = tmp->conns[roop_count]; + spider_db_handler *dbton_hdl = tmp->dbton_handler[conn->dbton_id]; + if ((error_num = + dbton_hdl->set_sql_for_exec(db_sql_by_id[conn->dbton_id], roop_count))) + { + goto end; + } +#ifndef WITHOUT_SPIDER_BG_SEARCH + if (tmp->result_list.bgs_phase > 0) + { + if ((error_num = spider_check_and_init_casual_read(thd, tmp, + roop_count))) + { + goto end; + } + conn = tmp->conns[roop_count]; + pthread_mutex_lock(&conn->bg_conn_mutex); + conn->bg_target = tmp; + conn->bg_error_num = &tmp->need_mons[roop_count]; + conn->bg_sql_type = SPIDER_SQL_TYPE_DDL_SQL; + conn->link_idx = roop_count; + conn->bg_exec_sql = TRUE; + conn->bg_caller_sync_wait = TRUE; + pthread_mutex_lock(&conn->bg_conn_sync_mutex); + pthread_cond_signal(&conn->bg_conn_cond); + pthread_mutex_unlock(&conn->bg_conn_mutex); + pthread_cond_wait(&conn->bg_conn_sync_cond, &conn->bg_conn_sync_mutex); + pthread_mutex_unlock(&conn->bg_conn_sync_mutex); + conn->bg_caller_sync_wait = FALSE; + } else { +#endif + pthread_mutex_lock(&conn->mta_conn_mutex); + SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos); + conn->need_mon = &tmp->need_mons[roop_count]; + conn->mta_conn_mutex_lock_already = TRUE; + conn->mta_conn_mutex_unlock_later = TRUE; + conn->link_idx = roop_count; + error_num = spider_db_query_with_set_names( + SPIDER_SQL_TYPE_DDL_SQL, tmp, conn, roop_count); + conn->mta_conn_mutex_lock_already = FALSE; + conn->mta_conn_mutex_unlock_later = FALSE; + SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos); + pthread_mutex_unlock(&conn->mta_conn_mutex); + if (error_num) + { + goto end; + } +#ifndef WITHOUT_SPIDER_BG_SEARCH + } +#endif + } + } while ((tmp = tmp->next)); + +end: +#ifndef WITHOUT_SPIDER_BG_SEARCH + tmp = spider; + do { + if (tmp->result_list.bgs_phase > 0) + { + uint roop_count; + SPIDER_SHARE *share = tmp->share; + for (roop_count = 0; roop_count < share->all_link_count; ++roop_count) + { + SPIDER_CONN *conn = tmp->conns[roop_count]; + if (conn->bg_exec_sql) + { + /* wait */ + pthread_mutex_lock(&conn->bg_conn_mutex); + pthread_mutex_unlock(&conn->bg_conn_mutex); + } + if (tmp->need_mons[roop_count]) + { + error_num = tmp->need_mons[roop_count]; + } + } + tmp->result_list.bgs_phase = 0; + } + } while ((tmp = tmp->next)); +#endif + DBUG_RETURN(error_num); +} +#endif diff --git a/storage/spider/spd_parse.h b/storage/spider/spd_parse.h new file mode 100644 index 00000000000..ff57dc5d24f --- /dev/null +++ b/storage/spider/spd_parse.h @@ -0,0 +1,145 @@ +/* Copyright (C) 2018-2019 Kentoku Shiba + Copyright (C) 2018-2019 MariaDB corp + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#define SPIDER_PARSE_PARSER_STATE_BACKUPED (1 << 0) +#define SPIDER_PARSE_CREATE_OR_REPLACE (1 << 1) +#define SPIDER_PARSE_CHARSET_NOTICE (1 << 2) + +class spider_parse_sql +{ +public: + uint flags, query_len; + int get_next_val; + char *query; + const char *found_semicolon; + const char *error_str_piece; + Parser_state parser_state; + Parser_state *parser_state_backup; + THD *thd; + spider_db_sql *db_sql; + spider_db_sql *db_sql_by_id[SPIDER_DBTON_SIZE]; + ulonglong query_id; + LEX_CSTRING schema_name; + LEX_CSTRING table_name; + const struct charset_info_st *cs; + spider_string *work_str; + int (*DBlex)(union YYSTYPE *yylval, THD *thd); + + ha_spider *spider, *spider_last; + SPIDER_TRX *trx; + TABLE_SHARE table_share; + Field *field; + partition_info part_info, sub_part_info; + partition_element part_p_elem, sub_part_p_elem, sub_part_sub_p_elem; + MY_BITMAP *zero_bitmap; +#ifdef SPIDER_HAS_HASH_VALUE_TYPE + my_hash_value_type hash_value; +#endif + spider_parse_sql(); + ~spider_parse_sql(); + int init( + THD *thd_arg, + char *query_arg, + uint query_length, + const struct charset_info_st *query_charset, + ulonglong query_id + ); + void reset( + char *query_arg, + uint query_length, + const struct charset_info_st *query_charset, + ulonglong query_id + ); + void end_parse(); + const char *get_found_semicolon(); + int get_next( + union YYSTYPE *yylval + ); + void push_syntax_error( + const char *near_by + ); + void push_error( + int error_num + ); + int append_parsed_symbol( + int symbol_tok, + union YYSTYPE *yylval_tok + ); + int append_parsed_symbol_for_data_nodes( + int symbol_tok, + union YYSTYPE *yylval_tok + ); + int append_parsed_symbol_for_spider_nodes( + int symbol_tok, + union YYSTYPE *yylval_tok + ); + int append_parsed_symbol_for_spider_nodes_ex( + int symbol_tok, + union YYSTYPE *yylval_tok + ); + char *get_query_for_spider_node( + uint *query_length + ); + void set_query_id( + ulonglong query_id_arg + ); + ulonglong get_query_id(); + void set_schema_name( + LEX_CSTRING &name + ); + void set_table_name( + LEX_CSTRING &name + ); + int set_create_or_replace(); + int append_create_or_replace_table(); + int append_if_not_exists(); + int append_table_option_name_for_data_nodes( + int symbol_tok, + union YYSTYPE *yylval_tok + ); + int append_table_option_name( + int symbol_tok, + union YYSTYPE *yylval_tok + ); + int append_table_option_value_for_data_nodes( + int symbol_tok, + union YYSTYPE *yylval_tok + ); + int append_table_option_value( + int symbol_tok, + union YYSTYPE *yylval_tok + ); + int append_table_option_character_set(); + int append_table_option_data_directory_for_data_nodes(); + int append_table_option_index_directory_for_data_nodes(); + int append_table_option_with_system_versioning_for_data_nodes(); + int append_spider_table_for_spider_nodes( + SPIDER_RWTBLTBL *rwtbltbl + ); + int create_share_from_table( + SPIDER_RWTBLTBL *rwtbltbl + ); + int create_share_from_partition( + SPIDER_RWTBLTBL *rwtbltbl, + SPIDER_RWTBLPTT *rwtblptt + ); + int create_share_from_subpartition( + SPIDER_RWTBLTBL *rwtbltbl, + SPIDER_RWTBLSPTT *rwtblsptt + ); + int get_conn(); + int send_sql_to_data_nodes(); +}; diff --git a/storage/spider/spd_rewrite.cc b/storage/spider/spd_rewrite.cc new file mode 100644 index 00000000000..8d175d9d6f6 --- /dev/null +++ b/storage/spider/spd_rewrite.cc @@ -0,0 +1,2074 @@ +/* Copyright (C) 2018-2019 Kentoku Shiba + Copyright (C) 2018-2019 MariaDB corp + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#define MYSQL_SERVER 1 +#define MYSQL_LEX 1 +#include <my_global.h> +#include "mysql_version.h" +#include "spd_environ.h" +#include "sql_priv.h" +#include "probes_mysql.h" +#include "sql_class.h" +#include "sql_partition.h" +#include "sql_acl.h" +#include "spd_err.h" +#ifdef SPIDER_REWRITE_AVAILABLE +#include "spd_db_include.h" +#include "spd_include.h" +#include "spd_sys_table.h" +#include "spd_table.h" +#include "spd_malloc.h" +#include "spd_parse.h" +#include "spd_rewrite.h" + +extern handlerton *spider_hton_ptr; + +static pthread_key(spider_parse_sql *, SPIDER_PARSE_SQL); +static bool audit_rewrite_initialized = FALSE, rw_table_mem_root = TRUE, + rewrite_cache_initialized = FALSE; +static MEM_ROOT rw_table_mem_root1, rw_table_mem_root2; + +static DYNAMIC_ARRAY spider_rw_table_cache1; +static uint spider_rw_table_cache1_id; +static const char *spider_rw_table_cache1_func_name; +static const char *spider_rw_table_cache1_file_name; +static ulong spider_rw_table_cache1_line_no; +static DYNAMIC_ARRAY spider_rw_table_cache2; +static uint spider_rw_table_cache2_id; +static const char *spider_rw_table_cache2_func_name; +static const char *spider_rw_table_cache2_file_name; +static ulong spider_rw_table_cache2_line_no; +static DYNAMIC_ARRAY *spider_rw_table_cache; +static DYNAMIC_ARRAY *spider_rw_table_cache_tmp; + +void spider_free_rewrite_table_subpartitions( + SPIDER_RWTBLSPTT *info +) { + DBUG_ENTER("spider_free_rewrite_table_subpartitions"); + while (info) + { + if (info->subpartition_name.str != NullS) + { + spider_free(spider_current_trx, + (void *) info->subpartition_name.str, MYF(0)); + } + if (info->subpartition_description.str != NullS) + { + spider_free(spider_current_trx, + (void *) info->subpartition_description.str, MYF(0)); + } + if (info->connection_str.str != NullS) + { + spider_free(spider_current_trx, + (void *) info->connection_str.str, MYF(0)); + } + if (info->comment_str.str != NullS) + { + spider_free(spider_current_trx, + (void *) info->comment_str.str, MYF(0)); + } + info = info->next; + } + DBUG_VOID_RETURN; +} + +void spider_free_rewrite_table_partitions( + SPIDER_RWTBLPTT *info +) { + DBUG_ENTER("spider_free_rewrite_table_partitions"); + while (info) + { + if (info->partition_name.str != NullS) + { + spider_free(spider_current_trx, + (void *) info->partition_name.str, MYF(0)); + } + if (info->partition_description.str != NullS) + { + spider_free(spider_current_trx, + (void *) info->partition_description.str, MYF(0)); + } + if (info->connection_str.str != NullS) + { + spider_free(spider_current_trx, + (void *) info->connection_str.str, MYF(0)); + } + if (info->comment_str.str != NullS) + { + spider_free(spider_current_trx, + (void *) info->comment_str.str, MYF(0)); + } + spider_free_rewrite_table_subpartitions(info->ts); + info = info->next; + } + DBUG_VOID_RETURN; +} + +void spider_free_rewrite_table_tables( + SPIDER_RWTBLTBL *info +) { + DBUG_ENTER("spider_free_rewrite_table_tables"); + while (info) + { + if (info->partition_method.str != NullS) + { + spider_free(spider_current_trx, + (void *) info->partition_method.str, MYF(0)); + } + if (info->partition_expression.str != NullS) + { + spider_free(spider_current_trx, + (void *) info->partition_expression.str, MYF(0)); + } + if (info->subpartition_method.str != NullS) + { + spider_free(spider_current_trx, + (void *) info->subpartition_method.str, MYF(0)); + } + if (info->subpartition_expression.str != NullS) + { + spider_free(spider_current_trx, + (void *) info->subpartition_expression.str, MYF(0)); + } + if (info->connection_str.str != NullS) + { + spider_free(spider_current_trx, + (void *) info->connection_str.str, MYF(0)); + } + if (info->comment_str.str != NullS) + { + spider_free(spider_current_trx, + (void *) info->comment_str.str, MYF(0)); + } + spider_free_rewrite_table_partitions(info->tp); + info = info->next; + } + DBUG_VOID_RETURN; +} + +void spider_free_rewrite_tables( + SPIDER_RWTBL *info +) { + DBUG_ENTER("spider_free_rewrite_tables"); + if (!info) + { + DBUG_VOID_RETURN; + } + if (info->db_name.str != NullS) + { + spider_free(spider_current_trx, + (void *) info->db_name.str, MYF(0)); + } + if (info->table_name.str != NullS) + { + spider_free(spider_current_trx, + (void *) info->table_name.str, MYF(0)); + } + spider_free_rewrite_table_tables(info->tt); + DBUG_VOID_RETURN; +} + +void spider_free_rewrite_cache( + DYNAMIC_ARRAY *rw_table_cache +) { + uint roop_count; + SPIDER_RWTBL *info; + DBUG_ENTER("spider_free_rewrite_cache"); + for (roop_count = 0; roop_count < rw_table_cache->elements; + ++roop_count) + { + info = dynamic_element(rw_table_cache, roop_count, + SPIDER_RWTBL *); + spider_free_rewrite_tables(info); + } + rw_table_cache->elements = 0; + DBUG_VOID_RETURN; +} + +bool spider_load_rewrite_table_subpartitions( + THD *thd, + MEM_ROOT *mem_root, + TABLE_LIST *tables, + SPIDER_RWTBLPTT *rwtblptt +) { + int error_num; + TABLE *table; + char table_key[MAX_KEY_LENGTH]; + SPIDER_RWTBLSPTT *current = NULL; + DBUG_ENTER("spider_load_rewrite_table_subpartitions"); + DBUG_PRINT("info",("spider table_name=%s", + SPIDER_TABLE_LIST_table_name_str(tables))); + table = tables->table; + if ((error_num = spider_get_sys_table_by_idx(table, table_key, + table->s->primary_key, 3))) + { + if (error_num != HA_ERR_KEY_NOT_FOUND && error_num != HA_ERR_END_OF_FILE) + { + table->file->print_error(error_num, MYF(0)); + goto error_get_sys_table_by_idx; + } + rwtblptt->ts = NULL; + DBUG_RETURN(FALSE); + } + while (!error_num) + { + SPIDER_RWTBLSPTT *info; + if (!(info = (SPIDER_RWTBLSPTT *) alloc_root(mem_root, sizeof(SPIDER_RWTBLSPTT)))) + { + my_error(HA_ERR_OUT_OF_MEM, MYF(0)); + goto error_alloc_info; + } + if (!current) + { + rwtblptt->ts = info; + } else { + current->next = info; + } + current = info; + if (spider_get_sys_rewrite_table_subpartitions(table, info, mem_root)) + { + goto error_get_sys_rewrite_table_subpartitions; + } + + if ((error_num = spider_sys_index_next_same(table, table_key))) + { + if ( + error_num != HA_ERR_KEY_NOT_FOUND && + error_num != HA_ERR_END_OF_FILE + ) { + table->file->print_error(error_num, MYF(0)); + goto error_sys_index_next_same; + } + } + } + spider_sys_index_end(table); + if (current) + { + current->next = NULL; + } + DBUG_RETURN(FALSE); + +error_sys_index_next_same: +error_get_sys_rewrite_table_subpartitions: +error_alloc_info: + spider_sys_index_end(table); +error_get_sys_table_by_idx: + DBUG_RETURN(TRUE); +} + +bool spider_load_rewrite_table_partitions( + THD *thd, + MEM_ROOT *mem_root, + TABLE_LIST *tables, + SPIDER_RWTBLTBL *rwtbltbl +) { + int error_num; + TABLE *table; + TABLE_LIST *tables_next = tables->next_global; + char table_key[MAX_KEY_LENGTH]; + SPIDER_RWTBLPTT *current = NULL; + DBUG_ENTER("spider_load_rewrite_table_partitions"); + DBUG_PRINT("info",("spider table_name=%s", + SPIDER_TABLE_LIST_table_name_str(tables))); + table = tables->table; + if ((error_num = spider_get_sys_table_by_idx(table, table_key, + table->s->primary_key, 2))) + { + if (error_num != HA_ERR_KEY_NOT_FOUND && error_num != HA_ERR_END_OF_FILE) + { + table->file->print_error(error_num, MYF(0)); + goto error_get_sys_table_by_idx; + } + rwtbltbl->tp = NULL; + DBUG_RETURN(FALSE); + } + while (!error_num) + { + SPIDER_RWTBLPTT *info; + if (!(info = (SPIDER_RWTBLPTT *) alloc_root(mem_root, sizeof(SPIDER_RWTBLPTT)))) + { + my_error(HA_ERR_OUT_OF_MEM, MYF(0)); + goto error_alloc_info; + } + if (!current) + { + rwtbltbl->tp = info; + } else { + current->next = info; + } + current = info; + if (spider_get_sys_rewrite_table_partitions(table, info, mem_root)) + { + goto error_get_sys_rewrite_table_partitions; + } + if ( + spider_copy_sys_rewrite_columns(table, tables_next->table, 3) || + spider_load_rewrite_table_subpartitions(thd, mem_root, tables_next, info) + ) { + goto error_load_rewrite_table_subpartitions; + } + + if ((error_num = spider_sys_index_next_same(table, table_key))) + { + if ( + error_num != HA_ERR_KEY_NOT_FOUND && + error_num != HA_ERR_END_OF_FILE + ) { + table->file->print_error(error_num, MYF(0)); + goto error_sys_index_next_same; + } + } + } + spider_sys_index_end(table); + if (current) + { + current->next = NULL; + } + DBUG_RETURN(FALSE); + +error_sys_index_next_same: +error_load_rewrite_table_subpartitions: +error_get_sys_rewrite_table_partitions: +error_alloc_info: + spider_sys_index_end(table); +error_get_sys_table_by_idx: + DBUG_RETURN(TRUE); +} + +bool spider_load_rewrite_table_tables( + THD *thd, + MEM_ROOT *mem_root, + TABLE_LIST *tables, + SPIDER_RWTBL *rwtbl +) { + int error_num; + TABLE *table; + TABLE_LIST *tables_next = tables->next_global; + char table_key[MAX_KEY_LENGTH]; + SPIDER_RWTBLTBL *current = NULL; + DBUG_ENTER("spider_load_rewrite_table_tables"); + DBUG_PRINT("info",("spider table_name=%s", + SPIDER_TABLE_LIST_table_name_str(tables))); + table = tables->table; + if ((error_num = spider_get_sys_table_by_idx(table, table_key, + table->s->primary_key, 1))) + { + if (error_num != HA_ERR_KEY_NOT_FOUND && error_num != HA_ERR_END_OF_FILE) + { + table->file->print_error(error_num, MYF(0)); + goto error_get_sys_table_by_idx; + } + rwtbl->tt = NULL; + DBUG_RETURN(FALSE); + } + while (!error_num) + { + SPIDER_RWTBLTBL *info; + if (!(info = (SPIDER_RWTBLTBL *) alloc_root(mem_root, sizeof(SPIDER_RWTBLTBL)))) + { + my_error(HA_ERR_OUT_OF_MEM, MYF(0)); + goto error_alloc_info; + } + if (!current) + { + rwtbl->tt = info; + } else { + current->next = info; + } + current = info; + if (spider_get_sys_rewrite_table_tables(table, info, mem_root)) + { + goto error_get_sys_rewrite_table_tables; + } + if ( + spider_copy_sys_rewrite_columns(table, tables_next->table, 2) || + spider_load_rewrite_table_partitions(thd, mem_root, tables_next, info) + ) { + goto error_load_rewrite_table_partitions; + } + + if ((error_num = spider_sys_index_next_same(table, table_key))) + { + if ( + error_num != HA_ERR_KEY_NOT_FOUND && + error_num != HA_ERR_END_OF_FILE + ) { + table->file->print_error(error_num, MYF(0)); + goto error_sys_index_next_same; + } + } + } + spider_sys_index_end(table); + if (current) + { + current->next = NULL; + } + DBUG_RETURN(FALSE); + +error_sys_index_next_same: +error_load_rewrite_table_partitions: +error_get_sys_rewrite_table_tables: +error_alloc_info: + spider_sys_index_end(table); +error_get_sys_table_by_idx: + DBUG_RETURN(TRUE); +} + +bool spider_init_rewrite_cache( + THD *thd +) { + int error_num; + TABLE_LIST rw_tbls, rw_tbl_tbls, rw_tbl_ptts, rw_tbl_sptts, *tables; + TABLE *table; + MEM_ROOT *mem_root; + MDL_request mdl_request, mdl_request_cache; + uint counter, roop_count; + MYSQL_LOCK *lock; + TABLE *tbl[4]; + Open_tables_backup open_tables_backup; + bool no_record = FALSE; + DBUG_ENTER("spider_init_rewrite_cache"); + mdl_request.init(MDL_key::USER_LOCK, "spider", "rw_table_mem_root", + MDL_EXCLUSIVE, MDL_EXPLICIT); + while (TRUE) + { + if (thd->mdl_context.acquire_lock(&mdl_request, 10)) + { + if (spider_stmt_da_sql_errno(thd) == ER_LOCK_WAIT_TIMEOUT) + { + thd->clear_error(); + continue; + } else { + DBUG_RETURN(TRUE); + } + } + break; + } + if (rw_table_mem_root) + { + mem_root = &rw_table_mem_root1; + spider_rw_table_cache_tmp = &spider_rw_table_cache1; + } else { + mem_root = &rw_table_mem_root2; + spider_rw_table_cache_tmp = &spider_rw_table_cache2; + } + /* reset */ + spider_free_rewrite_cache(spider_rw_table_cache_tmp); + free_root(mem_root, MYF(MY_MARK_BLOCKS_FREE)); + tables = &rw_tbls; + spider_sys_init_one_table( + &rw_tbls, + SPIDER_SYS_DB_NAME_STR, SPIDER_SYS_DB_NAME_LEN, + SPIDER_SYS_RW_TBLS_TABLE_NAME_STR, + SPIDER_SYS_RW_TBLS_TABLE_NAME_LEN, + TL_READ + ); + rw_tbls.next_global = &rw_tbl_tbls; + spider_sys_init_one_table( + &rw_tbl_tbls, + SPIDER_SYS_DB_NAME_STR, SPIDER_SYS_DB_NAME_LEN, + SPIDER_SYS_RW_TBL_TBLS_TABLE_NAME_STR, + SPIDER_SYS_RW_TBL_TBLS_TABLE_NAME_LEN, + TL_READ + ); + rw_tbl_tbls.next_global = &rw_tbl_ptts; + spider_sys_init_one_table( + &rw_tbl_ptts, + SPIDER_SYS_DB_NAME_STR, SPIDER_SYS_DB_NAME_LEN, + SPIDER_SYS_RW_TBL_PTTS_TABLE_NAME_STR, + SPIDER_SYS_RW_TBL_PTTS_TABLE_NAME_LEN, + TL_READ + ); + rw_tbl_ptts.next_global = &rw_tbl_sptts; + spider_sys_init_one_table( + &rw_tbl_sptts, + SPIDER_SYS_DB_NAME_STR, SPIDER_SYS_DB_NAME_LEN, + SPIDER_SYS_RW_TBL_SPTTS_TABLE_NAME_STR, + SPIDER_SYS_RW_TBL_SPTTS_TABLE_NAME_LEN, + TL_READ + ); + if (spider_sys_open_tables(thd, &tables, &counter, &open_tables_backup)) + { + goto error_open_tables; + } + DBUG_PRINT("info",("spider table_name_list_start")); + roop_count = 0; + while (tables) + { + DBUG_PRINT("info",("spider table_name=%s", + SPIDER_TABLE_LIST_table_name_str(tables))); + tbl[roop_count] = tables->table; + DBUG_ASSERT(tables->table->reginfo.lock_type == TL_READ); + tables = tables->next_global; + ++roop_count; + } + DBUG_PRINT("info",("spider table_name_list_end")); + DBUG_ASSERT(counter == roop_count); + if (!(lock = spider_sys_lock_tables(thd, tbl, counter))) + { + goto error_lock_tables; + } + rw_tbls.table->use_all_columns(); + rw_tbl_tbls.table->use_all_columns(); + rw_tbl_ptts.table->use_all_columns(); + rw_tbl_sptts.table->use_all_columns(); + DBUG_PRINT("info",("spider table_name=%s", + SPIDER_TABLE_LIST_table_name_str(&rw_tbls))); + table = rw_tbls.table; + if ((error_num = spider_sys_index_first(table, table->s->primary_key))) + { + if (error_num != HA_ERR_KEY_NOT_FOUND && error_num != HA_ERR_END_OF_FILE) + { + table->file->print_error(error_num, MYF(0)); + goto error_sys_index_first; + } + no_record = TRUE; + } + while (!error_num) + { + SPIDER_RWTBL *info; + if (!(info = (SPIDER_RWTBL *) alloc_root(mem_root, sizeof(SPIDER_RWTBL)))) + { + my_error(HA_ERR_OUT_OF_MEM, MYF(0)); + goto error_alloc_info; + } + if (spider_get_sys_rewrite_tables(table, info, mem_root)) + { + goto error_get_sys_rewrite_tables; + } + if ( + spider_copy_sys_rewrite_columns(table, rw_tbl_tbls.table, 1) || + spider_load_rewrite_table_tables(thd, mem_root, &rw_tbl_tbls, info) + ) { + goto error_load_rewrite_table_tables; + } + info->sort = spider_calc_for_sort(2, info->db_name.str, + info->table_name.str); + if (push_dynamic(spider_rw_table_cache_tmp, (uchar *) info)) + { + my_error(HA_ERR_OUT_OF_MEM, MYF(0)); + goto error_push_dynamic; + } + + if ((error_num = spider_sys_index_next(table))) + { + if ( + error_num != HA_ERR_KEY_NOT_FOUND && + error_num != HA_ERR_END_OF_FILE + ) { + table->file->print_error(error_num, MYF(0)); + goto error_sys_index_next; + } + } + } + if (!no_record) + { + spider_sys_index_end(table); + my_qsort( + (uchar *) dynamic_element(spider_rw_table_cache_tmp, 0, SPIDER_RWTBL *), + spider_rw_table_cache_tmp->elements, sizeof(SPIDER_RWTBL), + (qsort_cmp) spider_compare_for_sort); + { + uint old_elements = spider_rw_table_cache_tmp->max_element; + freeze_size(spider_rw_table_cache_tmp); + if (spider_rw_table_cache_tmp->max_element != old_elements) + { + if (rw_table_mem_root) + { + spider_free_mem_calc(spider_current_trx, + spider_rw_table_cache1_id, + old_elements * + spider_rw_table_cache_tmp->size_of_element); + spider_alloc_calc_mem(spider_current_trx, + spider_rw_table_cache1, + spider_rw_table_cache_tmp->max_element * + spider_rw_table_cache_tmp->size_of_element); + } else { + spider_free_mem_calc(spider_current_trx, + spider_rw_table_cache2_id, + old_elements * + spider_rw_table_cache_tmp->size_of_element); + spider_alloc_calc_mem(spider_current_trx, + spider_rw_table_cache2, + spider_rw_table_cache_tmp->max_element * + spider_rw_table_cache_tmp->size_of_element); + } + } + } + } + + spider_sys_unlock_tables(thd, lock); + if ((error_num = ha_commit_trans(thd, FALSE))) + { + my_error(error_num, MYF(0)); + goto error_commit; + } + spider_sys_close_table(thd, &open_tables_backup); + mdl_request_cache.init(MDL_key::USER_LOCK, "spider", "rw_table_cache", + MDL_EXCLUSIVE, MDL_EXPLICIT); + while (TRUE) + { + if (thd->mdl_context.acquire_lock(&mdl_request_cache, 10)) + { + if (spider_stmt_da_sql_errno(thd) == ER_LOCK_WAIT_TIMEOUT) + { + thd->clear_error(); + continue; + } else { + thd->mdl_context.release_lock(mdl_request.ticket); + DBUG_RETURN(TRUE); + } + } + break; + } + spider_rw_table_cache = spider_rw_table_cache_tmp; + thd->mdl_context.release_lock(mdl_request_cache.ticket); + if (rw_table_mem_root) + { + rw_table_mem_root = FALSE; + } else { + rw_table_mem_root = TRUE; + } + rewrite_cache_initialized = TRUE; + thd->mdl_context.release_lock(mdl_request.ticket); + DBUG_RETURN(FALSE); + +error_push_dynamic: +error_load_rewrite_table_tables: +error_get_sys_rewrite_tables: +error_sys_index_next: +error_alloc_info: + spider_sys_index_end(table); +error_sys_index_first: + spider_sys_unlock_tables(thd, lock); +error_commit: +error_lock_tables: + (void) ha_rollback_trans(thd, FALSE); + spider_sys_close_table(thd, &open_tables_backup); +error_open_tables: + thd->mdl_context.release_lock(mdl_request.ticket); + DBUG_RETURN(TRUE); +} + +long long spider_flush_rewrite_cache_body( + char *error +) { + DBUG_ENTER("spider_flush_rewrite_cache_body"); + if (!audit_rewrite_initialized) + { + /* nothing to do */ + DBUG_RETURN(0); + } + if (spider_init_rewrite_cache(current_thd)) + { + *error = 1; + DBUG_RETURN(0); + } + DBUG_RETURN(1); +} + +SPIDER_RWTBL *spider_rewrite_table_cache_compare( + const LEX_CSTRING *db_name, + const LEX_CSTRING *table_name, + const struct charset_info_st *cs +) { + uint32 roop_count; + SPIDER_RWTBL *info; + char db_buf[MAX_FIELD_WIDTH]; + char table_buf[MAX_FIELD_WIDTH]; + const char *db, *table; + DBUG_ENTER("spider_rewrite_table_cache_compare"); + spider_string db_str(db_buf, MAX_FIELD_WIDTH, system_charset_info); + spider_string table_str(table_buf, MAX_FIELD_WIDTH, system_charset_info); + db_str.init_calc_mem(260); + table_str.init_calc_mem(261); + db_str.length(0); + table_str.length(0); + if ( + db_str.append(db_name->str, db_name->length, cs) || + table_str.append(table_name->str, table_name->length, cs) + ) { + my_error(HA_ERR_OUT_OF_MEM, MYF(0)); + DBUG_RETURN(NULL); + } + + db = db_str.c_ptr_safe(); + table = table_str.c_ptr_safe(); + DBUG_PRINT("info", ("spider db_name=%s", db)); + DBUG_PRINT("info", ("spider table_name=%s", table)); + + for (roop_count = 0; roop_count < spider_rw_table_cache->elements; + ++roop_count) + { + info = dynamic_element(spider_rw_table_cache, roop_count, + SPIDER_RWTBL *); + DBUG_PRINT("info", ("spider roop_count=%d", roop_count)); + DBUG_PRINT("info", ("spider info.db_name=%s", info->db_name.str)); + DBUG_PRINT("info", ("spider info.table_name=%s", info->table_name.str)); + if ( + !wild_case_compare(system_charset_info, db, info->db_name.str) && + !wild_case_compare(system_charset_info, table, info->table_name.str) + ) { + DBUG_PRINT("info", ("spider found")); + DBUG_RETURN(info); + } + } + DBUG_PRINT("info", ("spider not found")); + DBUG_RETURN(NULL); +} + +int spider_rewrite_insert_rewritten_tables( + THD *thd, + LEX_CSTRING *schema_name, + LEX_CSTRING *table_name, + const struct charset_info_st *cs, + SPIDER_RWTBL *rwtbl +) { + int error_num; + Open_tables_backup open_tables_backup; + TABLE *table; + SPIDER_RWTBLTBL *info = rwtbl->tt; + DBUG_ENTER("spider_rewrite_insert_rewritten_tables"); + if ( + !(table = spider_open_sys_table( + thd, SPIDER_SYS_RWN_TBLS_TABLE_NAME_STR, SPIDER_SYS_RWN_TBLS_TABLE_NAME_LEN, + TRUE, &open_tables_backup, TRUE, &error_num)) + ) { + DBUG_RETURN(error_num); + } + table->use_all_columns(); + empty_record(table); + spider_store_rewritten_table_name(table, schema_name, table_name, cs); + spider_store_rewritten_table_id(table, rwtbl); + do { + if ((error_num = spider_insert_rewritten_table(table, info))) + { + break; + } + } while ((info = info->next)); + spider_close_sys_table(thd, table, &open_tables_backup, TRUE); + DBUG_RETURN(error_num); +} + +int spider_rewrite_parse( + THD *thd, + mysql_event_query_rewrite *ev, + spider_parse_sql **parse_sql_p +) { + int error_num; + spider_parse_sql *parse_sql; + DBUG_ENTER("spider_rewrite_parse"); + if (ev->query_length > 0) + { + switch (ev->query[0]) + { + case 'c': + case 'C': + if (spider_rw_table_cache->elements) + { + break; + } + default: + *parse_sql_p = NULL; + DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); + } + parse_sql = *parse_sql_p; + if (!parse_sql) + { + if (!(parse_sql = new spider_parse_sql())) + { + my_error(HA_ERR_OUT_OF_MEM, MYF(0)); + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + } + if ((error_num = parse_sql->init( + thd, ev->query, ev->query_length, ev->query_charset, ev->query_id))) + { + parse_sql->push_error(error_num); + delete parse_sql; + DBUG_RETURN(error_num); + } + my_pthread_setspecific_ptr(SPIDER_PARSE_SQL, parse_sql); + *parse_sql_p = parse_sql; + } else { + parse_sql->reset( + ev->query, ev->query_length, ev->query_charset, ev->query_id); + } + int retval; + union YYSTYPE yylval; + retval = parse_sql->get_next(&yylval); + switch (retval) + { + case CREATE: + if ( + (error_num = parse_sql->append_parsed_symbol(retval, &yylval)) + ) { + parse_sql->push_error(error_num); + DBUG_RETURN(error_num); + } + if ( + (error_num = spider_rewrite_parse_create(parse_sql)) + ) { + DBUG_RETURN(error_num); + } + break; + default: + DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); + } + DBUG_RETURN(0); + } + DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); +} + +int spider_rewrite_parse_create( + spider_parse_sql *parse_sql +) { + int retval, error_num; + YYSTYPE yylval; + DBUG_ENTER("spider_rewrite_parse_create"); + retval = parse_sql->get_next(&yylval); + /* checking "or replace" */ + switch (retval) + { + case OR_SYM: + retval = parse_sql->get_next(&yylval); + if (retval != REPLACE) + { + parse_sql->push_syntax_error(yylval.simple_string); + DBUG_RETURN(ER_SPIDER_SYNTAX_NUM); + } + if (unlikely((error_num = parse_sql->set_create_or_replace()))) + { + parse_sql->push_error(error_num); + DBUG_RETURN(error_num); + } + retval = parse_sql->get_next(&yylval); + break; + default: + break; + } + /* checking "temporary" */ + switch (retval) + { + case TEMPORARY: + if ((error_num = parse_sql->append_parsed_symbol(retval, &yylval))) + { + parse_sql->push_error(error_num); + DBUG_RETURN(error_num); + } + retval = parse_sql->get_next(&yylval); + break; + default: + break; + } + switch (retval) + { + case TABLE_SYM: + if ( + (error_num = parse_sql->append_create_or_replace_table()) || + (error_num = parse_sql->append_parsed_symbol(retval, &yylval)) + ) { + parse_sql->push_error(error_num); + DBUG_RETURN(error_num); + } + if ( + (error_num = spider_rewrite_parse_create_table(parse_sql)) + ) { + DBUG_RETURN(error_num); + } + break; + default: + DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); + } + DBUG_RETURN(0); +} + +int spider_rewrite_parse_create_table( + spider_parse_sql *parse_sql +) { + int retval, retval2, error_num; + YYSTYPE yylval, yylval2; + DBUG_ENTER("spider_rewrite_parse_create_table"); + retval = parse_sql->get_next(&yylval); + /* checking "if not exists" */ + switch (retval) + { + case IF_SYM: + retval = parse_sql->get_next(&yylval); + if (retval != NOT_SYM) + { + parse_sql->push_syntax_error(yylval.simple_string); + DBUG_RETURN(ER_SPIDER_SYNTAX_NUM); + } + retval = parse_sql->get_next(&yylval); + if (retval != EXISTS) + { + parse_sql->push_syntax_error(yylval.simple_string); + DBUG_RETURN(ER_SPIDER_SYNTAX_NUM); + } + if ((error_num = parse_sql->append_if_not_exists())) + { + parse_sql->push_error(error_num); + DBUG_RETURN(error_num); + } + retval = parse_sql->get_next(&yylval); + break; + default: + break; + } + if (retval != IDENT_QUOTED && retval != IDENT && retval != ID_SYM) + { + parse_sql->push_syntax_error(yylval.simple_string); + DBUG_RETURN(ER_SPIDER_SYNTAX_NUM); + } + retval2 = parse_sql->get_next(&yylval2); + if (retval2 == (int) '.') + { + /* yylval is a database name */ + retval2 = parse_sql->get_next(&yylval2); + if (retval2 != IDENT_QUOTED && retval2 != IDENT && retval2 != ID_SYM) + { + parse_sql->push_syntax_error(yylval.simple_string); + DBUG_RETURN(ER_SPIDER_SYNTAX_NUM); + } + parse_sql->set_schema_name(yylval.lex_str); + parse_sql->set_table_name(yylval2.lex_str); + retval2 = parse_sql->get_next(&yylval2); + } else { + /* yylval is a table name */ + parse_sql->set_schema_name(parse_sql->thd->db); + parse_sql->set_table_name(yylval.lex_str); + } + switch (retval2) + { + case '(': + if ((error_num = parse_sql->append_parsed_symbol(retval2, &yylval2))) + { + parse_sql->push_error(error_num); + DBUG_RETURN(error_num); + } + break; + case IGNORE_SYM: + case REPLACE: + case AS: + case SELECT_SYM: + case LIKE: + default: + my_printf_error(ER_SPIDER_NOT_SUPPORTED_NUM, + ER_SPIDER_NOT_SUPPORTED_STR, MYF(0), + "This SQL", "Spider Rewrite Plugin"); + DBUG_RETURN(ER_SPIDER_NOT_SUPPORTED_NUM); + } + retval = parse_sql->get_next(&yylval); + switch (retval) + { + case IDENT: + case IDENT_QUOTED: + case ID_SYM: + case PERIOD_SYM: + case CHECK_SYM: + case INDEX_SYM: + case KEY_SYM: + case FULLTEXT_SYM: + case SPATIAL_SYM: + case CONSTRAINT: + case PRIMARY_SYM: + case UNIQUE_SYM: + break; + case FOREIGN: + case LIKE: + case ')': + my_printf_error(ER_SPIDER_NOT_SUPPORTED_NUM, + ER_SPIDER_NOT_SUPPORTED_STR, MYF(0), + "This SQL", "Spider Rewrite Plugin"); + DBUG_RETURN(ER_SPIDER_NOT_SUPPORTED_NUM); + default: + parse_sql->push_syntax_error(yylval.simple_string); + DBUG_RETURN(ER_SPIDER_SYNTAX_NUM); + } + /* column definition */ + do { + switch (retval) + { + case IDENT: + case IDENT_QUOTED: + case ID_SYM: + if ((error_num = spider_rewrite_parse_column_definition(parse_sql, retval, yylval))) + { + DBUG_RETURN(error_num); + } + break; + case PERIOD_SYM: + if ((error_num = spider_rewrite_parse_period_definition(parse_sql, retval, yylval))) + { + DBUG_RETURN(error_num); + } + break; + case CHECK_SYM: + if ((error_num = spider_rewrite_parse_check_definition(parse_sql, retval, yylval))) + { + DBUG_RETURN(error_num); + } + break; + case INDEX_SYM: + case KEY_SYM: + case FULLTEXT_SYM: + case SPATIAL_SYM: + case CONSTRAINT: + case PRIMARY_SYM: + case UNIQUE_SYM: + if ((error_num = spider_rewrite_parse_index_definition(parse_sql, retval, yylval))) + { + DBUG_RETURN(error_num); + } + break; + case FOREIGN: + my_printf_error(ER_SPIDER_NOT_SUPPORTED_NUM, + ER_SPIDER_NOT_SUPPORTED_STR, MYF(0), + "This SQL", "Spider Rewrite Plugin"); + DBUG_RETURN(ER_SPIDER_NOT_SUPPORTED_NUM); + default: + parse_sql->push_syntax_error(yylval.simple_string); + DBUG_RETURN(ER_SPIDER_SYNTAX_NUM); + } + if (retval == ')') + { + break; + } + if (retval != ',') + { + parse_sql->push_syntax_error(yylval.simple_string); + DBUG_RETURN(ER_SPIDER_SYNTAX_NUM); + } + retval = parse_sql->get_next(&yylval); + } while (TRUE); + retval = parse_sql->get_next(&yylval); + do { + switch (retval) + { + case IGNORE_SYM: + case REPLACE: + case AS: + case SELECT_SYM: + /* select statement */ + DBUG_RETURN(spider_rewrite_parse_create_table_select_statement( + parse_sql, retval, yylval)); + case ';': + case END_OF_INPUT: + /* end of ddl */ + DBUG_RETURN(0); + case PARTITION_SYM: + if ((error_num = spider_rewrite_parse_create_table_partition( + parse_sql, retval, yylval))) + { + DBUG_RETURN(error_num); + } + /* this function returns after get_next */ + break; + default: + if ((error_num = spider_rewrite_parse_create_table_table_option( + parse_sql, retval, yylval))) + { + DBUG_RETURN(error_num); + } + retval = parse_sql->get_next(&yylval); + break; + } + } while (TRUE); +} + +int spider_rewrite_parse_nest_of_paren( + spider_parse_sql *parse_sql, + int &retval, + union YYSTYPE &yylval +) { + int error_num; + DBUG_ENTER("spider_rewrite_parse_nest_of_paren"); + do { + if ((error_num = parse_sql->append_parsed_symbol(retval, &yylval))) + { + DBUG_RETURN(error_num); + } + retval = parse_sql->get_next(&yylval); + if (retval == '(') + { + if ((error_num = spider_rewrite_parse_nest_of_paren(parse_sql, retval, yylval))) + { + DBUG_RETURN(error_num); + } + } + } while (retval != ')'); + if ((error_num = parse_sql->append_parsed_symbol(retval, &yylval))) + { + parse_sql->push_error(error_num); + DBUG_RETURN(error_num); + } + retval = parse_sql->get_next(&yylval); + DBUG_RETURN(0); +} + +int spider_rewrite_parse_nest_of_paren_for_data_nodes( + spider_parse_sql *parse_sql, + int &retval, + union YYSTYPE &yylval +) { + int error_num; + DBUG_ENTER("spider_rewrite_parse_nest_of_paren_for_data_nodes"); + do { + if ((error_num = parse_sql->append_parsed_symbol_for_data_nodes(retval, &yylval))) + { + parse_sql->push_error(error_num); + DBUG_RETURN(error_num); + } + retval = parse_sql->get_next(&yylval); + if (retval == '(') + { + if ((error_num = spider_rewrite_parse_nest_of_paren_for_data_nodes(parse_sql, retval, yylval))) + { + DBUG_RETURN(error_num); + } + } + } while (retval != ')'); + if ((error_num = parse_sql->append_parsed_symbol_for_data_nodes(retval, &yylval))) + { + parse_sql->push_error(error_num); + DBUG_RETURN(error_num); + } + retval = parse_sql->get_next(&yylval); + DBUG_RETURN(0); +} + +int spider_rewrite_parse_column_definition( + spider_parse_sql *parse_sql, + int &retval, + union YYSTYPE &yylval +) { + int error_num; + DBUG_ENTER("spider_rewrite_parse_column_definition"); + do { + if ((error_num = parse_sql->append_parsed_symbol(retval, &yylval))) + { + parse_sql->push_error(error_num); + DBUG_RETURN(error_num); + } + retval = parse_sql->get_next(&yylval); + if (retval == '(') + { + if ((error_num = spider_rewrite_parse_nest_of_paren(parse_sql, retval, yylval))) + { + DBUG_RETURN(error_num); + } + } + } while (retval != ',' && retval != ')'); + if ((error_num = parse_sql->append_parsed_symbol(retval, &yylval))) + { + parse_sql->push_error(error_num); + DBUG_RETURN(error_num); + } + DBUG_RETURN(0); +} + +int spider_rewrite_parse_index_definition( + spider_parse_sql *parse_sql, + int &retval, + union YYSTYPE &yylval +) { + int error_num; + DBUG_ENTER("spider_rewrite_parse_index_definition"); + do { + if ((error_num = parse_sql->append_parsed_symbol(retval, &yylval))) + { + parse_sql->push_error(error_num); + DBUG_RETURN(error_num); + } + retval = parse_sql->get_next(&yylval); + if (retval == FOREIGN) + { + my_printf_error(ER_SPIDER_NOT_SUPPORTED_NUM, + ER_SPIDER_NOT_SUPPORTED_STR, MYF(0), + "This SQL", "Spider Rewrite Plugin"); + DBUG_RETURN(ER_SPIDER_NOT_SUPPORTED_NUM); + } + if (retval == '(') + { + if ((error_num = spider_rewrite_parse_nest_of_paren(parse_sql, retval, yylval))) + { + DBUG_RETURN(error_num); + } + } + } while (retval != ',' && retval != ')'); + if ((error_num = parse_sql->append_parsed_symbol(retval, &yylval))) + { + parse_sql->push_error(error_num); + DBUG_RETURN(error_num); + } + DBUG_RETURN(0); +} + +int spider_rewrite_parse_period_definition( + spider_parse_sql *parse_sql, + int &retval, + union YYSTYPE &yylval +) { + int error_num; + DBUG_ENTER("spider_rewrite_parse_period_definition"); + do { + if ((error_num = parse_sql->append_parsed_symbol(retval, &yylval))) + { + parse_sql->push_error(error_num); + DBUG_RETURN(error_num); + } + retval = parse_sql->get_next(&yylval); + if (retval == '(') + { + if ((error_num = spider_rewrite_parse_nest_of_paren(parse_sql, retval, yylval))) + { + DBUG_RETURN(error_num); + } + } + } while (retval != ',' && retval != ')'); + if ((error_num = parse_sql->append_parsed_symbol(retval, &yylval))) + { + parse_sql->push_error(error_num); + DBUG_RETURN(error_num); + } + DBUG_RETURN(0); +} + +int spider_rewrite_parse_check_definition( + spider_parse_sql *parse_sql, + int &retval, + union YYSTYPE &yylval +) { + int error_num; + DBUG_ENTER("spider_rewrite_parse_check_definition"); + do { + if ((error_num = parse_sql->append_parsed_symbol(retval, &yylval))) + { + parse_sql->push_error(error_num); + DBUG_RETURN(error_num); + } + retval = parse_sql->get_next(&yylval); + if (retval == '(') + { + if ((error_num = spider_rewrite_parse_nest_of_paren(parse_sql, retval, yylval))) + { + DBUG_RETURN(error_num); + } + } + } while (retval != ',' && retval != ')'); + if ((error_num = parse_sql->append_parsed_symbol(retval, &yylval))) + { + parse_sql->push_error(error_num); + DBUG_RETURN(error_num); + } + DBUG_RETURN(0); +} + +int spider_rewrite_parse_create_table_select_statement( + spider_parse_sql *parse_sql, + int &retval, + union YYSTYPE &yylval +) { + int error_num; + DBUG_ENTER("spider_rewrite_parse_create_table_select_statement"); + do { + if ((error_num = + parse_sql->append_parsed_symbol_for_spider_nodes_ex(retval, &yylval))) + { + parse_sql->push_error(error_num); + DBUG_RETURN(error_num); + } + retval = parse_sql->get_next(&yylval); + } while (retval != ';' && retval != END_OF_INPUT); + DBUG_RETURN(0); +} + +int spider_rewrite_parse_interval( + spider_parse_sql *parse_sql, + int &retval, + union YYSTYPE &yylval +) { + int error_num; + DBUG_ENTER("spider_rewrite_parse_interval"); + if ((error_num = + parse_sql->append_parsed_symbol_for_data_nodes(retval, &yylval))) + { + parse_sql->push_error(error_num); + DBUG_RETURN(error_num); + } + retval = parse_sql->get_next(&yylval); + switch (retval) + { + case '+': + case '-': + if ((error_num = + parse_sql->append_parsed_symbol_for_data_nodes(retval, &yylval))) + { + parse_sql->push_error(error_num); + DBUG_RETURN(error_num); + } + retval = parse_sql->get_next(&yylval); + break; + default: + break; + } + switch (retval) + { + case NUM: + case TEXT_STRING: + if ((error_num = + parse_sql->append_parsed_symbol_for_data_nodes(retval, &yylval))) + { + parse_sql->push_error(error_num); + DBUG_RETURN(error_num); + } + break; + default: + parse_sql->push_syntax_error(yylval.simple_string); + DBUG_RETURN(ER_SPIDER_SYNTAX_NUM); + } + retval = parse_sql->get_next(&yylval); + switch (retval) + { + case MICROSECOND_SYM: + case SECOND_SYM: + case MINUTE_SYM: + case HOUR_SYM: + case DAY_SYM: + case WEEK_SYM: + case MONTH_SYM: + case QUARTER_SYM: + case YEAR_SYM: + case SECOND_MICROSECOND_SYM: + case MINUTE_MICROSECOND_SYM: + case MINUTE_SECOND_SYM: + case HOUR_MICROSECOND_SYM: + case HOUR_SECOND_SYM: + case HOUR_MINUTE_SYM: + case DAY_MICROSECOND_SYM: + case DAY_SECOND_SYM: + case DAY_MINUTE_SYM: + case DAY_HOUR_SYM: + case YEAR_MONTH_SYM: + if ((error_num = + parse_sql->append_parsed_symbol_for_data_nodes(retval, &yylval))) + { + parse_sql->push_error(error_num); + DBUG_RETURN(error_num); + } + break; + default: + parse_sql->push_syntax_error(yylval.simple_string); + DBUG_RETURN(ER_SPIDER_SYNTAX_NUM); + } + DBUG_RETURN(0); +} + +int spider_rewrite_parse_create_table_table_option( + spider_parse_sql *parse_sql, + int &retval, + union YYSTYPE &yylval +) { + int error_num; + bool all_nodes = FALSE; + DBUG_ENTER("spider_rewrite_parse_create_table_table_option"); + switch (retval) + { + case STORAGE_SYM: + retval = parse_sql->get_next(&yylval); + if (retval != ENGINE_SYM) + { + parse_sql->push_syntax_error(yylval.simple_string); + DBUG_RETURN(ER_SPIDER_SYNTAX_NUM); + } + if ((error_num = + parse_sql->append_table_option_name_for_data_nodes(retval, &yylval))) + { + parse_sql->push_error(error_num); + DBUG_RETURN(error_num); + } + break; + case DEFAULT: + retval = parse_sql->get_next(&yylval); + if (retval == CHAR_SYM) + { + retval = parse_sql->get_next(&yylval); + if (retval != SET) + { + parse_sql->push_syntax_error(yylval.simple_string); + DBUG_RETURN(ER_SPIDER_SYNTAX_NUM); + } + if ((error_num = + parse_sql->append_table_option_character_set())) + { + parse_sql->push_error(error_num); + DBUG_RETURN(error_num); + } + all_nodes = TRUE; + break; + } + if (retval == CHARSET) + { + if ((error_num = + parse_sql->append_table_option_character_set())) + { + parse_sql->push_error(error_num); + DBUG_RETURN(error_num); + } + all_nodes = TRUE; + break; + } + if (retval != COLLATE_SYM) + { + parse_sql->push_syntax_error(yylval.simple_string); + DBUG_RETURN(ER_SPIDER_SYNTAX_NUM); + } + if ((error_num = + parse_sql->append_table_option_name(retval, &yylval))) + { + parse_sql->push_error(error_num); + DBUG_RETURN(error_num); + } + all_nodes = TRUE; + break; + case CHAR_SYM: + retval = parse_sql->get_next(&yylval); + if (retval != SET) + { + parse_sql->push_syntax_error(yylval.simple_string); + DBUG_RETURN(ER_SPIDER_SYNTAX_NUM); + } + if ((error_num = + parse_sql->append_table_option_character_set())) + { + parse_sql->push_error(error_num); + DBUG_RETURN(error_num); + } + all_nodes = TRUE; + break; + case CHARSET: + retval = parse_sql->get_next(&yylval); + if ((error_num = + parse_sql->append_table_option_character_set())) + { + parse_sql->push_error(error_num); + DBUG_RETURN(error_num); + } + all_nodes = TRUE; + break; + case DATA_SYM: + retval = parse_sql->get_next(&yylval); + if (retval != DIRECTORY_SYM) + { + parse_sql->push_syntax_error(yylval.simple_string); + DBUG_RETURN(ER_SPIDER_SYNTAX_NUM); + } + if ((error_num = + parse_sql->append_table_option_data_directory_for_data_nodes())) + { + parse_sql->push_error(error_num); + DBUG_RETURN(error_num); + } + break; + case INDEX_SYM: + retval = parse_sql->get_next(&yylval); + if (retval != DIRECTORY_SYM) + { + parse_sql->push_syntax_error(yylval.simple_string); + DBUG_RETURN(ER_SPIDER_SYNTAX_NUM); + } + if ((error_num = + parse_sql->append_table_option_index_directory_for_data_nodes())) + { + parse_sql->push_error(error_num); + DBUG_RETURN(error_num); + } + break; + case WITH: + retval = parse_sql->get_next(&yylval); + if (retval != SYSTEM) + { + parse_sql->push_syntax_error(yylval.simple_string); + DBUG_RETURN(ER_SPIDER_SYNTAX_NUM); + } + retval = parse_sql->get_next(&yylval); + if (retval != VERSIONING_SYM) + { + parse_sql->push_syntax_error(yylval.simple_string); + DBUG_RETURN(ER_SPIDER_SYNTAX_NUM); + } + if ((error_num = + parse_sql->append_table_option_with_system_versioning_for_data_nodes()) + ) { + parse_sql->push_error(error_num); + } + DBUG_RETURN(error_num); + default: + if ((error_num = + parse_sql->append_table_option_name_for_data_nodes(retval, &yylval))) + { + parse_sql->push_error(error_num); + DBUG_RETURN(error_num); + } + break; + } + retval = parse_sql->get_next(&yylval); + if (retval == '=') + { + /* skip */ + retval = parse_sql->get_next(&yylval); + } + if (all_nodes) + { + if ((error_num = parse_sql->append_table_option_value( + retval, &yylval)) + ) { + parse_sql->push_error(error_num); + } + } else { + if ((error_num = parse_sql->append_table_option_value_for_data_nodes( + retval, &yylval)) + ) { + parse_sql->push_error(error_num); + } + } + DBUG_RETURN(error_num); +} + +int spider_rewrite_parse_create_table_partition( + spider_parse_sql *parse_sql, + int &retval, + union YYSTYPE &yylval +) { + int error_num; + DBUG_ENTER("spider_rewrite_parse_create_table_partition"); + if ((error_num = + parse_sql->append_parsed_symbol_for_data_nodes(retval, &yylval))) + { + parse_sql->push_error(error_num); + DBUG_RETURN(error_num); + } + retval = parse_sql->get_next(&yylval); + if (retval != BY) + { + parse_sql->push_syntax_error(yylval.simple_string); + DBUG_RETURN(ER_SPIDER_SYNTAX_NUM); + } + if ((error_num = + parse_sql->append_parsed_symbol_for_data_nodes(retval, &yylval))) + { + parse_sql->push_error(error_num); + DBUG_RETURN(error_num); + } + retval = parse_sql->get_next(&yylval); + switch (retval) + { + case LINEAR_SYM: + if ((error_num = + parse_sql->append_parsed_symbol_for_data_nodes(retval, &yylval))) + { + parse_sql->push_error(error_num); + DBUG_RETURN(error_num); + } + retval = parse_sql->get_next(&yylval); + if (retval != HASH_SYM && retval != KEY_SYM) + { + parse_sql->push_syntax_error(yylval.simple_string); + DBUG_RETURN(ER_SPIDER_SYNTAX_NUM); + } + /* fall through */ + case HASH_SYM: + case KEY_SYM: + case RANGE_SYM: + case LIST_SYM: + if ((error_num = + parse_sql->append_parsed_symbol_for_data_nodes(retval, &yylval))) + { + parse_sql->push_error(error_num); + DBUG_RETURN(error_num); + } + retval = parse_sql->get_next(&yylval); + if (retval != '(') + { + parse_sql->push_syntax_error(yylval.simple_string); + DBUG_RETURN(ER_SPIDER_SYNTAX_NUM); + } + if ((error_num = spider_rewrite_parse_nest_of_paren_for_data_nodes(parse_sql, retval, yylval))) + { + DBUG_RETURN(error_num); + } + break; + case SYSTEM_TIME_SYM: + if ((error_num = + parse_sql->append_parsed_symbol_for_data_nodes(retval, &yylval))) + { + parse_sql->push_error(error_num); + DBUG_RETURN(error_num); + } + retval = parse_sql->get_next(&yylval); + if (retval == INTERVAL_SYM) + { + if ((error_num = + spider_rewrite_parse_interval(parse_sql, retval, yylval))) + { + DBUG_RETURN(error_num); + } + retval = parse_sql->get_next(&yylval); + } + break; + default: + parse_sql->push_syntax_error(yylval.simple_string); + DBUG_RETURN(ER_SPIDER_SYNTAX_NUM); + } + switch (retval) + { + case LIMIT: + if ((error_num = + parse_sql->append_parsed_symbol_for_data_nodes(retval, &yylval))) + { + parse_sql->push_error(error_num); + DBUG_RETURN(error_num); + } + retval = parse_sql->get_next(&yylval); + if (retval != NUM) + { + parse_sql->push_syntax_error(yylval.simple_string); + DBUG_RETURN(ER_SPIDER_SYNTAX_NUM); + } + if ((error_num = + parse_sql->append_parsed_symbol_for_data_nodes(retval, &yylval))) + { + parse_sql->push_error(error_num); + DBUG_RETURN(error_num); + } + retval = parse_sql->get_next(&yylval); + break; + default: + break; + } + switch (retval) + { + case PARTITIONS_SYM: + if ((error_num = + parse_sql->append_parsed_symbol_for_data_nodes(retval, &yylval))) + { + parse_sql->push_error(error_num); + DBUG_RETURN(error_num); + } + retval = parse_sql->get_next(&yylval); + if (retval != NUM) + { + parse_sql->push_syntax_error(yylval.simple_string); + DBUG_RETURN(ER_SPIDER_SYNTAX_NUM); + } + if ((error_num = + parse_sql->append_parsed_symbol_for_data_nodes(retval, &yylval))) + { + parse_sql->push_error(error_num); + DBUG_RETURN(error_num); + } + retval = parse_sql->get_next(&yylval); + break; + default: + break; + } + switch (retval) + { + case SUBPARTITION_SYM: + if ((error_num = + parse_sql->append_parsed_symbol_for_data_nodes(retval, &yylval))) + { + parse_sql->push_error(error_num); + DBUG_RETURN(error_num); + } + retval = parse_sql->get_next(&yylval); + if (retval != BY) + { + parse_sql->push_syntax_error(yylval.simple_string); + DBUG_RETURN(ER_SPIDER_SYNTAX_NUM); + } + if ((error_num = + parse_sql->append_parsed_symbol_for_data_nodes(retval, &yylval))) + { + parse_sql->push_error(error_num); + DBUG_RETURN(error_num); + } + retval = parse_sql->get_next(&yylval); + switch (retval) + { + case LINEAR_SYM: + if ((error_num = + parse_sql->append_parsed_symbol_for_data_nodes(retval, &yylval))) + { + parse_sql->push_error(error_num); + DBUG_RETURN(error_num); + } + retval = parse_sql->get_next(&yylval); + if (retval != HASH_SYM && retval != KEY_SYM) + { + parse_sql->push_syntax_error(yylval.simple_string); + DBUG_RETURN(ER_SPIDER_SYNTAX_NUM); + } + /* fall through */ + case HASH_SYM: + case KEY_SYM: + if ((error_num = + parse_sql->append_parsed_symbol_for_data_nodes(retval, &yylval))) + { + parse_sql->push_error(error_num); + DBUG_RETURN(error_num); + } + retval = parse_sql->get_next(&yylval); + if (retval != '(') + { + parse_sql->push_syntax_error(yylval.simple_string); + DBUG_RETURN(ER_SPIDER_SYNTAX_NUM); + } + if ((error_num = spider_rewrite_parse_nest_of_paren_for_data_nodes( + parse_sql, retval, yylval))) + { + DBUG_RETURN(error_num); + } + retval = parse_sql->get_next(&yylval); + break; + default: + parse_sql->push_syntax_error(yylval.simple_string); + DBUG_RETURN(ER_SPIDER_SYNTAX_NUM); + } + switch (retval) + { + case SUBPARTITIONS_SYM: + if ((error_num = + parse_sql->append_parsed_symbol_for_data_nodes(retval, &yylval))) + { + parse_sql->push_error(error_num); + DBUG_RETURN(error_num); + } + retval = parse_sql->get_next(&yylval); + if (retval != NUM) + { + parse_sql->push_syntax_error(yylval.simple_string); + DBUG_RETURN(ER_SPIDER_SYNTAX_NUM); + } + if ((error_num = + parse_sql->append_parsed_symbol_for_data_nodes(retval, &yylval))) + { + parse_sql->push_error(error_num); + DBUG_RETURN(error_num); + } + retval = parse_sql->get_next(&yylval); + break; + default: + break; + } + break; + default: + break; + } + if (retval == '(') + { + if ((error_num = spider_rewrite_parse_nest_of_paren_for_data_nodes( + parse_sql, retval, yylval))) + { + DBUG_RETURN(error_num); + } + retval = parse_sql->get_next(&yylval); + } + /* remains the last parsed part */ + DBUG_RETURN(0); +} + +static int spider_audit_rewrite_init( + void *p +) { + int error_num; + THD *thd = current_thd; + DBUG_ENTER("spider_audit_rewrite_init"); + if (pthread_key_create(&SPIDER_PARSE_SQL, NULL)) + { + error_num = HA_ERR_OUT_OF_MEM; + my_error(HA_ERR_OUT_OF_MEM, MYF(0)); + goto error_pthread_key_create; + } + if( + SPD_INIT_DYNAMIC_ARRAY2(&spider_rw_table_cache1, sizeof(SPIDER_RWTBL), + NULL, 64, 64, MYF(MY_WME)) + ) { + error_num = HA_ERR_OUT_OF_MEM; + my_error(HA_ERR_OUT_OF_MEM, MYF(0)); + goto error_rw_table_cache1_array_init; + } + spider_alloc_calc_mem_init(spider_rw_table_cache1, 258); + spider_alloc_calc_mem(NULL, + spider_rw_table_cache1, + spider_rw_table_cache1.max_element * + spider_rw_table_cache1.size_of_element); + if( + SPD_INIT_DYNAMIC_ARRAY2(&spider_rw_table_cache2, sizeof(SPIDER_RWTBL), + NULL, 64, 64, MYF(MY_WME)) + ) { + error_num = HA_ERR_OUT_OF_MEM; + my_error(HA_ERR_OUT_OF_MEM, MYF(0)); + goto error_rw_table_cache2_array_init; + } + spider_alloc_calc_mem_init(spider_rw_table_cache2, 259); + spider_alloc_calc_mem(NULL, + spider_rw_table_cache2, + spider_rw_table_cache2.max_element * + spider_rw_table_cache2.size_of_element); + SPD_INIT_ALLOC_ROOT(&rw_table_mem_root1, 1024, 0, MYF(MY_WME)); + SPD_INIT_ALLOC_ROOT(&rw_table_mem_root2, 1024, 0, MYF(MY_WME)); + if (thd) + { + if (spider_init_rewrite_cache(thd)) + { + error_num = spider_stmt_da_sql_errno(thd); + goto error_init_rewrite_cache; + } + } + audit_rewrite_initialized = TRUE; + DBUG_RETURN(0); + +error_init_rewrite_cache: + free_root(&rw_table_mem_root2, MYF(0)); + free_root(&rw_table_mem_root1, MYF(0)); + spider_free_rewrite_cache(&spider_rw_table_cache2); + spider_free_mem_calc(NULL, + spider_rw_table_cache2_id, + spider_rw_table_cache2.max_element * + spider_rw_table_cache2.size_of_element); + delete_dynamic(&spider_rw_table_cache2); +error_rw_table_cache2_array_init: + spider_free_rewrite_cache(&spider_rw_table_cache1); + spider_free_mem_calc(NULL, + spider_rw_table_cache1_id, + spider_rw_table_cache1.max_element * + spider_rw_table_cache1.size_of_element); + delete_dynamic(&spider_rw_table_cache1); +error_rw_table_cache1_array_init: + pthread_key_delete(SPIDER_PARSE_SQL); +error_pthread_key_create: + DBUG_RETURN(error_num); +} + +static int spider_audit_rewrite_deinit( + void *p +) { + DBUG_ENTER("spider_audit_rewrite_deinit"); + if (audit_rewrite_initialized) + { + spider_free_rewrite_cache(&spider_rw_table_cache2); + spider_free_mem_calc(NULL, + spider_rw_table_cache2_id, + spider_rw_table_cache2.max_element * + spider_rw_table_cache2.size_of_element); + delete_dynamic(&spider_rw_table_cache2); + spider_free_rewrite_cache(&spider_rw_table_cache1); + spider_free_mem_calc(NULL, + spider_rw_table_cache1_id, + spider_rw_table_cache1.max_element * + spider_rw_table_cache1.size_of_element); + delete_dynamic(&spider_rw_table_cache1); + pthread_key_delete(SPIDER_PARSE_SQL); + free_root(&rw_table_mem_root1, MYF(0)); + free_root(&rw_table_mem_root2, MYF(0)); + audit_rewrite_initialized = FALSE; + } + DBUG_RETURN(0); +} + +static void spider_audit_rewrite_release_thd( + MYSQL_THD thd +) { + spider_parse_sql *parse_sql = my_pthread_getspecific_ptr( + spider_parse_sql *, SPIDER_PARSE_SQL); + DBUG_ENTER("spider_audit_rewrite_release_thd"); + if (parse_sql) + { + delete parse_sql; + my_pthread_setspecific_ptr(SPIDER_PARSE_SQL, NULL); + } + DBUG_VOID_RETURN; +} + +static void spider_audit_rewrite_event_notify( + MYSQL_THD thd, + unsigned int event_class, + const void *event +) { + int error_num; + mysql_event_query_rewrite *ev = (mysql_event_query_rewrite *) event; + spider_parse_sql *parse_sql = my_pthread_getspecific_ptr( + spider_parse_sql *, SPIDER_PARSE_SQL); + MDL_request mdl_request_cache; + SPIDER_RWTBL *rwtbl; + DBUG_ENTER("spider_audit_rewrite_event_notify"); + switch (ev->event_subclass) + { + case MYSQL_AUDIT_QUERY_REWRITE_QUERY: + error_num = spider_rewrite_parse(thd, ev, &parse_sql); + if (likely(!parse_sql)) + { + DBUG_VOID_RETURN; + } + parse_sql->end_parse(); + if (error_num) + { + DBUG_VOID_RETURN; + } + if (!rewrite_cache_initialized) + { + if (spider_init_rewrite_cache(thd)) + { + DBUG_VOID_RETURN; + } + } + /* get lock */ + mdl_request_cache.init(MDL_key::USER_LOCK, "spider", "rw_table_cache", + MDL_SHARED, MDL_EXPLICIT); + while (TRUE) + { + if (thd->mdl_context.acquire_lock(&mdl_request_cache, 10)) + { + if (spider_stmt_da_sql_errno(thd) == ER_LOCK_WAIT_TIMEOUT) + { + thd->clear_error(); + continue; + } else { + DBUG_VOID_RETURN; + } + } + break; + } + if (!(rwtbl = spider_rewrite_table_cache_compare( + &parse_sql->schema_name, &parse_sql->table_name, parse_sql->cs))) + { + thd->mdl_context.release_lock(mdl_request_cache.ticket); + DBUG_VOID_RETURN; + } + if ((error_num = parse_sql->append_spider_table_for_spider_nodes( + rwtbl->tt))) + { + parse_sql->push_error(error_num); + thd->mdl_context.release_lock(mdl_request_cache.ticket); + DBUG_VOID_RETURN; + } + if ((error_num = parse_sql->create_share_from_table( + rwtbl->tt))) + { + parse_sql->push_error(error_num); + thd->mdl_context.release_lock(mdl_request_cache.ticket); + DBUG_VOID_RETURN; + } + if ((error_num = parse_sql->get_conn())) + { + parse_sql->push_error(error_num); + thd->mdl_context.release_lock(mdl_request_cache.ticket); + DBUG_VOID_RETURN; + } + if ((error_num = parse_sql->send_sql_to_data_nodes())) + { + parse_sql->push_error(error_num); + thd->mdl_context.release_lock(mdl_request_cache.ticket); + DBUG_VOID_RETURN; + } + if (spider_rewrite_insert_rewritten_tables( + thd, &parse_sql->schema_name, &parse_sql->table_name, parse_sql->cs, + rwtbl)) + { + thd->mdl_context.release_lock(mdl_request_cache.ticket); + DBUG_VOID_RETURN; + } + thd->mdl_context.release_lock(mdl_request_cache.ticket); + ev->flags = MYSQL_AUDIT_QUERY_REWRITE_FOR_EXECUTE | MYSQL_AUDIT_QUERY_REWRITE_FOR_GENERAL_LOG; + ev->rewritten_query = parse_sql->get_query_for_spider_node( + &ev->rewritten_query_length); + ev->found_semicolon = parse_sql->get_found_semicolon(); + break; + case MYSQL_AUDIT_QUERY_REWRITE_SLOW: + if (unlikely(parse_sql && parse_sql->get_query_id() == ev->query_id)) + { + ev->flags = MYSQL_AUDIT_QUERY_REWRITE_FOR_SLOW_LOG; + ev->rewritten_query = parse_sql->get_query_for_spider_node( + &ev->rewritten_query_length); + } + break; + case MYSQL_AUDIT_QUERY_REWRITE_BINLOG: + /* nothing to do */ + break; + default: + /* unknown event class */ + DBUG_ASSERT(FALSE); + break; + } + DBUG_VOID_RETURN; +} + +static struct st_mysql_audit spider_audit_rewrite_descriptor = +{ + MYSQL_AUDIT_INTERFACE_VERSION, + spider_audit_rewrite_release_thd, + spider_audit_rewrite_event_notify, + { MYSQL_AUDIT_QUERY_REWRITE_CLASSMASK } +}; + +struct st_mysql_plugin spider_audit_rewrite = +{ + MYSQL_AUDIT_PLUGIN, + &spider_audit_rewrite_descriptor, + "SPIDER_REWRITE", + "Kentoku Shiba & MariaDB corp", + "Spider query rewrite", + PLUGIN_LICENSE_GPL, + spider_audit_rewrite_init, + spider_audit_rewrite_deinit, + 0x0001, + NULL, + NULL, + NULL, + 0, +}; + +#ifdef MARIADB_BASE_VERSION +struct st_maria_plugin spider_audit_rewrite_maria = +{ + MYSQL_AUDIT_PLUGIN, + &spider_audit_rewrite_descriptor, + "SPIDER_REWRITE", + "Kentoku Shiba & MariaDB corp", + "Spider query rewrite", + PLUGIN_LICENSE_GPL, + spider_audit_rewrite_init, + spider_audit_rewrite_deinit, + 0x0001, + NULL, + NULL, + "0.1.1", + MariaDB_PLUGIN_MATURITY_BETA, +}; +#endif +#else +long long spider_flush_rewrite_cache_body( + char *error +) { + DBUG_ENTER("spider_flush_rewrite_cache_body"); + my_printf_error(ER_SPIDER_NOT_SUPPORTED_NUM, + ER_SPIDER_NOT_SUPPORTED_STR, MYF(0), + "This function", "this version"); + *error = 1; + DBUG_RETURN(0); +} +#endif diff --git a/storage/spider/spd_rewrite.h b/storage/spider/spd_rewrite.h new file mode 100644 index 00000000000..048607ed5af --- /dev/null +++ b/storage/spider/spd_rewrite.h @@ -0,0 +1,148 @@ +/* Copyright (C) 2018-2019 Kentoku Shiba + Copyright (C) 2018-2019 MariaDB corp + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +void spider_free_rewrite_table_subpartitions( + SPIDER_RWTBLSPTT *info +); + +void spider_free_rewrite_table_partitions( + SPIDER_RWTBLPTT *info +); + +void spider_free_rewrite_table_tables( + SPIDER_RWTBLTBL *info +); + +void spider_free_rewrite_tables( + SPIDER_RWTBL *info +); + +void spider_free_rewrite_cache( + DYNAMIC_ARRAY *rw_table_cache +); + +bool spider_load_rewrite_table_subpartitions( + THD *thd, + MEM_ROOT *mem_root, + TABLE_LIST *tables, + SPIDER_RWTBLPTT *rwtblptt +); + +bool spider_load_rewrite_table_partitions( + THD *thd, + MEM_ROOT *mem_root, + TABLE_LIST *tables, + SPIDER_RWTBLTBL *rwtbltbl +); + +bool spider_load_rewrite_table_tables( + THD *thd, + MEM_ROOT *mem_root, + TABLE_LIST *tables, + SPIDER_RWTBL *rwtbl +); + +bool spider_init_rewrite_cache( + THD *thd +); + +SPIDER_RWTBL *spider_rewrite_table_cache_compare( + const LEX_CSTRING *db_name, + const LEX_CSTRING *table_name, + const struct charset_info_st *cs +); + +int spider_rewrite_insert_rewritten_tables( + THD *thd, + LEX_CSTRING *schema_name, + LEX_CSTRING *table_name, + const struct charset_info_st *cs, + SPIDER_RWTBL *rwtbl +); + +int spider_rewrite_parse( + THD *thd, + mysql_event_query_rewrite *ev, + spider_parse_sql **parse_sql_p +); + +int spider_rewrite_parse_create( + spider_parse_sql *parse_sql +); + +int spider_rewrite_parse_create_table( + spider_parse_sql *parse_sql +); + +int spider_rewrite_parse_nest_of_paren( + spider_parse_sql *parse_sql, + int &retval, + union YYSTYPE &yylval +); + +int spider_rewrite_parse_nest_of_paren_for_data_nodes( + spider_parse_sql *parse_sql, + int &retval, + union YYSTYPE &yylval +); + +int spider_rewrite_parse_column_definition( + spider_parse_sql *parse_sql, + int &retval, + union YYSTYPE &yylval +); + +int spider_rewrite_parse_index_definition( + spider_parse_sql *parse_sql, + int &retval, + union YYSTYPE &yylval +); + +int spider_rewrite_parse_period_definition( + spider_parse_sql *parse_sql, + int &retval, + union YYSTYPE &yylval +); + +int spider_rewrite_parse_check_definition( + spider_parse_sql *parse_sql, + int &retval, + union YYSTYPE &yylval +); + +int spider_rewrite_parse_create_table_select_statement( + spider_parse_sql *parse_sql, + int &retval, + union YYSTYPE &yylval +); + +int spider_rewrite_parse_interval( + spider_parse_sql *parse_sql, + int &retval, + union YYSTYPE &yylval +); + +int spider_rewrite_parse_create_table_table_option( + spider_parse_sql *parse_sql, + int &retval, + union YYSTYPE &yylval +); + +int spider_rewrite_parse_create_table_partition( + spider_parse_sql *parse_sql, + int &retval, + union YYSTYPE &yylval +); diff --git a/storage/spider/spd_sys_table.cc b/storage/spider/spd_sys_table.cc index 8f8605b85bd..fc1a01de5b3 100644 --- a/storage/spider/spd_sys_table.cc +++ b/storage/spider/spd_sys_table.cc @@ -1,4 +1,5 @@ -/* Copyright (C) 2008-2018 Kentoku Shiba +/* Copyright (C) 2008-2019 Kentoku Shiba + Copyright (C) 2019 MariaDB corp This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -27,6 +28,7 @@ #include "key.h" #include "sql_base.h" #include "tztime.h" +#include "lock.h" #endif #include "sql_select.h" #include "spd_err.h" @@ -39,6 +41,34 @@ extern handlerton *spider_hton_ptr; extern Time_zone *spd_tz_system; +void spider_sys_init_one_table( + TABLE_LIST *table_list, + const char *db_nm, + uint db_nm_len, + const char *table_nm, + uint table_nm_len, + enum thr_lock_type lock_type +) { + DBUG_ENTER("spider_sys_init_one_table"); +#ifdef SPIDER_use_LEX_CSTRING_for_database_tablename_alias + LEX_CSTRING db_name = + { + db_nm, + db_nm_len + }; + LEX_CSTRING tbl_name = + { + table_nm, + table_nm_len + }; + table_list->init_one_table(&db_name, &tbl_name, NULL, lock_type); +#else + table_list->init_one_table(db_nm, db_nm_len, + table_nm, table_nm_len, table_nm, lock_type); +#endif + DBUG_VOID_RETURN; +} + /** Insert a Spider system table row. @@ -204,6 +234,7 @@ TABLE *spider_open_sys_table( if (!(table = (TABLE*) spider_malloc(spider_current_trx, 12, sizeof(*table), MYF(MY_WME)))) { + my_error(HA_ERR_OUT_OF_MEM, MYF(0)); *error_num = HA_ERR_OUT_OF_MEM; goto error_malloc; } @@ -359,13 +390,13 @@ void spider_close_sys_table( bool spider_sys_open_tables( THD *thd, TABLE_LIST **tables, + uint *counter, Open_tables_backup *open_tables_backup ) { - uint counter; ulonglong utime_after_lock_backup = thd->utime_after_lock; DBUG_ENTER("spider_sys_open_tables"); thd->reset_n_backup_open_tables_state(open_tables_backup); - if (open_tables(thd, tables, &counter, + if (open_tables(thd, tables, counter, MYSQL_OPEN_IGNORE_GLOBAL_READ_LOCK | MYSQL_LOCK_IGNORE_GLOBAL_READ_ONLY | MYSQL_OPEN_IGNORE_FLUSH | MYSQL_LOCK_IGNORE_TIMEOUT | MYSQL_LOCK_LOG_TABLE )) { @@ -377,6 +408,17 @@ bool spider_sys_open_tables( DBUG_RETURN(FALSE); } +bool spider_sys_open_tables( + THD *thd, + TABLE_LIST **tables, + Open_tables_backup *open_tables_backup +) { + uint counter; + DBUG_ENTER("spider_sys_open_tables"); + DBUG_RETURN(spider_sys_open_tables(thd, tables, &counter, + open_tables_backup)); +} + TABLE *spider_sys_open_table( THD *thd, TABLE_LIST *tables, @@ -408,6 +450,24 @@ void spider_sys_close_table( thd->restore_backup_open_tables_state(open_tables_backup); DBUG_VOID_RETURN; } + +MYSQL_LOCK *spider_sys_lock_tables( + THD *thd, + TABLE **table, + uint counter +) { + DBUG_ENTER("spider_sys_lock_tables"); + DBUG_RETURN(mysql_lock_tables(thd, table, counter, 0)); +} + +void spider_sys_unlock_tables( + THD *thd, + MYSQL_LOCK *lock +) { + DBUG_ENTER("spider_sys_unlock_tables"); + mysql_unlock_tables(thd, lock); + DBUG_VOID_RETURN; +} #endif int spider_sys_index_init( @@ -3284,6 +3344,546 @@ error: DBUG_RETURN(error_num); } +#ifdef SPIDER_REWRITE_AVAILABLE +bool spider_copy_sys_rewrite_columns( + TABLE *table_from, + TABLE *table_to, + uint columns +) { + DBUG_ENTER("spider_copy_sys_rewrite_columns"); + do { + --columns; + if (table_to->field[columns]->store_field(table_from->field[columns])) + { + DBUG_RETURN(TRUE); + } + } while (columns); + DBUG_RETURN(FALSE); +} + +int spider_get_sys_rewrite_tables( + TABLE *table, + SPIDER_RWTBL *info, + MEM_ROOT *mem_root +) { + char *ptr; + int error_num = 0; + DBUG_ENTER("spider_get_sys_rewrite_tables"); + if ((ptr = get_field(mem_root, table->field[0]))) + { + info->table_id = + (ulonglong) my_strtoll10(ptr, (char**) NULL, &error_num); + if (error_num) + { + error_num = ER_SPIDER_INVALID_VALUE_NUM; + my_printf_error(ER_SPIDER_INVALID_VALUE_NUM, + ER_SPIDER_NOT_SUPPORTED_STR, MYF(0), + ptr, SPIDER_SYS_RW_TBLS_TABLE_NAME_STR, + "table_id"); + goto error; + } + } else { + error_num = ER_SPIDER_NOT_SUPPORTED_NUM; + my_printf_error(ER_SPIDER_NOT_SUPPORTED_NUM, + ER_SPIDER_NOT_SUPPORTED_STR, MYF(0), + "table_id=null", + SPIDER_SYS_RW_TBLS_TABLE_NAME_STR); + goto error; + } + DBUG_PRINT("info", ("spider db_name is %s", + table->field[1]->is_null() ? "null" : "not null")); + if (!table->field[1]->is_null()) + { + if ((ptr = get_field(mem_root, table->field[1]))) + { + info->db_name.length = strlen(ptr); + info->db_name.str = + spider_create_string(ptr, info->db_name.length); + } else { + info->db_name.length = 0; + info->db_name.str = NullS; + } + } else { + error_num = ER_SPIDER_NOT_SUPPORTED_NUM; + my_printf_error(ER_SPIDER_NOT_SUPPORTED_NUM, + ER_SPIDER_NOT_SUPPORTED_STR, MYF(0), + "db_name=null", + SPIDER_SYS_RW_TBLS_TABLE_NAME_STR); + goto error; + } + DBUG_PRINT("info", ("spider table_name is %s", + table->field[2]->is_null() ? "null" : "not null")); + if (!table->field[2]->is_null()) + { + if ((ptr = get_field(mem_root, table->field[2]))) + { + info->table_name.length = strlen(ptr); + info->table_name.str = + spider_create_string(ptr, info->table_name.length); + } else { + info->table_name.length = 0; + info->table_name.str = NullS; + } + } else { + error_num = ER_SPIDER_NOT_SUPPORTED_NUM; + my_printf_error(ER_SPIDER_NOT_SUPPORTED_NUM, + ER_SPIDER_NOT_SUPPORTED_STR, MYF(0), + "table_name=null", + SPIDER_SYS_RW_TBLS_TABLE_NAME_STR); + goto error; + } +error: + DBUG_RETURN(error_num); +} + +int spider_get_sys_rewrite_table_tables( + TABLE *table, + SPIDER_RWTBLTBL *info, + MEM_ROOT *mem_root +) { + char *ptr; + int error_num = 0; + DBUG_ENTER("spider_get_sys_rewrite_table_tables"); + if ((ptr = get_field(mem_root, table->field[1]))) + { + info->partition_id = + (ulonglong) my_strtoll10(ptr, (char**) NULL, &error_num); + if (error_num) + { + error_num = ER_SPIDER_INVALID_VALUE_NUM; + my_printf_error(ER_SPIDER_INVALID_VALUE_NUM, + ER_SPIDER_NOT_SUPPORTED_STR, MYF(0), + ptr, SPIDER_SYS_RW_TBL_TBLS_TABLE_NAME_STR, + "partition_id"); + goto error; + } + } else { + error_num = ER_SPIDER_NOT_SUPPORTED_NUM; + my_printf_error(ER_SPIDER_NOT_SUPPORTED_NUM, + ER_SPIDER_NOT_SUPPORTED_STR, MYF(0), + "partition_id=null", + SPIDER_SYS_RW_TBL_TBLS_TABLE_NAME_STR); + goto error; + } + DBUG_PRINT("info", ("spider partition_method is %s", + table->field[2]->is_null() ? "null" : "not null")); + if (!table->field[2]->is_null()) + { + if ((ptr = get_field(mem_root, table->field[2]))) + { + info->partition_method.length = strlen(ptr); + info->partition_method.str = + spider_create_string(ptr, info->partition_method.length); + } else { + info->partition_method.length = 0; + info->partition_method.str = NullS; + } + } else { + error_num = ER_SPIDER_NOT_SUPPORTED_NUM; + my_printf_error(ER_SPIDER_NOT_SUPPORTED_NUM, + ER_SPIDER_NOT_SUPPORTED_STR, MYF(0), + "partition_method=null", + SPIDER_SYS_RW_TBL_TBLS_TABLE_NAME_STR); + goto error; + } + DBUG_PRINT("info", ("spider partition_expression is %s", + table->field[3]->is_null() ? "null" : "not null")); + if (!table->field[3]->is_null()) + { + if ((ptr = get_field(mem_root, table->field[3]))) + { + info->partition_expression.length = strlen(ptr); + info->partition_expression.str = + spider_create_string(ptr, info->partition_expression.length); + } else { + info->partition_expression.length = 0; + info->partition_expression.str = NullS; + } + } else { + error_num = ER_SPIDER_NOT_SUPPORTED_NUM; + my_printf_error(ER_SPIDER_NOT_SUPPORTED_NUM, + ER_SPIDER_NOT_SUPPORTED_STR, MYF(0), + "partition_expression=null", + SPIDER_SYS_RW_TBL_TBLS_TABLE_NAME_STR); + goto error; + } + DBUG_PRINT("info", ("spider subpartition_method is %s", + table->field[4]->is_null() ? "null" : "not null")); + if (!table->field[4]->is_null()) + { + if ((ptr = get_field(mem_root, table->field[4]))) + { + info->subpartition_method.length = strlen(ptr); + info->subpartition_method.str = + spider_create_string(ptr, info->subpartition_method.length); + } else { + info->subpartition_method.length = 0; + info->subpartition_method.str = NullS; + } + } else { + error_num = ER_SPIDER_NOT_SUPPORTED_NUM; + my_printf_error(ER_SPIDER_NOT_SUPPORTED_NUM, + ER_SPIDER_NOT_SUPPORTED_STR, MYF(0), + "subpartition_method=null", + SPIDER_SYS_RW_TBL_TBLS_TABLE_NAME_STR); + goto error; + } + DBUG_PRINT("info", ("spider subpartition_expression is %s", + table->field[5]->is_null() ? "null" : "not null")); + if (!table->field[5]->is_null()) + { + if ((ptr = get_field(mem_root, table->field[5]))) + { + info->subpartition_expression.length = strlen(ptr); + info->subpartition_expression.str = + spider_create_string(ptr, info->subpartition_expression.length); + } else { + info->subpartition_expression.length = 0; + info->subpartition_expression.str = NullS; + } + } else { + error_num = ER_SPIDER_NOT_SUPPORTED_NUM; + my_printf_error(ER_SPIDER_NOT_SUPPORTED_NUM, + ER_SPIDER_NOT_SUPPORTED_STR, MYF(0), + "subpartition_expression=null", + SPIDER_SYS_RW_TBL_TBLS_TABLE_NAME_STR); + goto error; + } + DBUG_PRINT("info", ("spider connection_str is %s", + table->field[6]->is_null() ? "null" : "not null")); + if (!table->field[6]->is_null()) + { + if ((ptr = get_field(mem_root, table->field[6]))) + { + info->connection_str.length = strlen(ptr); + info->connection_str.str = + spider_create_string(ptr, info->connection_str.length); + } else { + info->connection_str.length = 0; + info->connection_str.str = NullS; + } + } else { + error_num = ER_SPIDER_NOT_SUPPORTED_NUM; + my_printf_error(ER_SPIDER_NOT_SUPPORTED_NUM, + ER_SPIDER_NOT_SUPPORTED_STR, MYF(0), + "connection_str=null", + SPIDER_SYS_RW_TBLS_TABLE_NAME_STR); + goto error; + } + DBUG_PRINT("info", ("spider comment_str is %s", + table->field[7]->is_null() ? "null" : "not null")); + if (!table->field[7]->is_null()) + { + if ((ptr = get_field(mem_root, table->field[7]))) + { + info->comment_str.length = strlen(ptr); + info->comment_str.str = + spider_create_string(ptr, info->comment_str.length); + } else { + info->comment_str.length = 0; + info->comment_str.str = NullS; + } + } else { + error_num = ER_SPIDER_NOT_SUPPORTED_NUM; + my_printf_error(ER_SPIDER_NOT_SUPPORTED_NUM, + ER_SPIDER_NOT_SUPPORTED_STR, MYF(0), + "comment_str=null", + SPIDER_SYS_RW_TBLS_TABLE_NAME_STR); + goto error; + } +error: + DBUG_RETURN(error_num); +} + +int spider_get_sys_rewrite_table_partitions( + TABLE *table, + SPIDER_RWTBLPTT *info, + MEM_ROOT *mem_root +) { + char *ptr; + int error_num = 0; + DBUG_ENTER("spider_get_sys_rewrite_table_partitions"); + if ((ptr = get_field(mem_root, table->field[2]))) + { + info->partition_ordinal_position = + (ulonglong) my_strtoll10(ptr, (char**) NULL, &error_num); + if (error_num) + { + error_num = ER_SPIDER_INVALID_VALUE_NUM; + my_printf_error(ER_SPIDER_INVALID_VALUE_NUM, + ER_SPIDER_NOT_SUPPORTED_STR, MYF(0), + ptr, SPIDER_SYS_RW_TBL_PTTS_TABLE_NAME_STR, + "partition_ordinal_position"); + goto error; + } + } else { + error_num = ER_SPIDER_NOT_SUPPORTED_NUM; + my_printf_error(ER_SPIDER_NOT_SUPPORTED_NUM, + ER_SPIDER_NOT_SUPPORTED_STR, MYF(0), + "partition_ordinal_position=null", + SPIDER_SYS_RW_TBL_PTTS_TABLE_NAME_STR); + goto error; + } + DBUG_PRINT("info", ("spider partition_name is %s", + table->field[3]->is_null() ? "null" : "not null")); + if (!table->field[3]->is_null()) + { + if ((ptr = get_field(mem_root, table->field[3]))) + { + info->partition_name.length = strlen(ptr); + info->partition_name.str = + spider_create_string(ptr, info->partition_name.length); + } else { + info->partition_name.length = 0; + info->partition_name.str = NullS; + } + } else { + error_num = ER_SPIDER_NOT_SUPPORTED_NUM; + my_printf_error(ER_SPIDER_NOT_SUPPORTED_NUM, + ER_SPIDER_NOT_SUPPORTED_STR, MYF(0), + "partition_name=null", + SPIDER_SYS_RW_TBL_PTTS_TABLE_NAME_STR); + goto error; + } + DBUG_PRINT("info", ("spider partition_description is %s", + table->field[4]->is_null() ? "null" : "not null")); + if (!table->field[4]->is_null()) + { + if ((ptr = get_field(mem_root, table->field[4]))) + { + info->partition_description.length = strlen(ptr); + info->partition_description.str = + spider_create_string(ptr, info->partition_description.length); + } else { + info->partition_description.length = 0; + info->partition_description.str = NullS; + } + } else { + error_num = ER_SPIDER_NOT_SUPPORTED_NUM; + my_printf_error(ER_SPIDER_NOT_SUPPORTED_NUM, + ER_SPIDER_NOT_SUPPORTED_STR, MYF(0), + "partition_description=null", + SPIDER_SYS_RW_TBL_PTTS_TABLE_NAME_STR); + goto error; + } + DBUG_PRINT("info", ("spider connection_str is %s", + table->field[5]->is_null() ? "null" : "not null")); + if (!table->field[5]->is_null()) + { + if ((ptr = get_field(mem_root, table->field[5]))) + { + info->connection_str.length = strlen(ptr); + info->connection_str.str = + spider_create_string(ptr, info->connection_str.length); + } else { + info->connection_str.length = 0; + info->connection_str.str = NullS; + } + } else { + error_num = ER_SPIDER_NOT_SUPPORTED_NUM; + my_printf_error(ER_SPIDER_NOT_SUPPORTED_NUM, + ER_SPIDER_NOT_SUPPORTED_STR, MYF(0), + "connection_str=null", + SPIDER_SYS_RW_TBL_PTTS_TABLE_NAME_STR); + goto error; + } + DBUG_PRINT("info", ("spider comment_str is %s", + table->field[6]->is_null() ? "null" : "not null")); + if (!table->field[6]->is_null()) + { + if ((ptr = get_field(mem_root, table->field[6]))) + { + info->comment_str.length = strlen(ptr); + info->comment_str.str = + spider_create_string(ptr, info->comment_str.length); + } else { + info->comment_str.length = 0; + info->comment_str.str = NullS; + } + } else { + error_num = ER_SPIDER_NOT_SUPPORTED_NUM; + my_printf_error(ER_SPIDER_NOT_SUPPORTED_NUM, + ER_SPIDER_NOT_SUPPORTED_STR, MYF(0), + "comment_str=null", + SPIDER_SYS_RW_TBL_PTTS_TABLE_NAME_STR); + goto error; + } +error: + DBUG_RETURN(error_num); +} + +int spider_get_sys_rewrite_table_subpartitions( + TABLE *table, + SPIDER_RWTBLSPTT *info, + MEM_ROOT *mem_root +) { + char *ptr; + int error_num = 0; + DBUG_ENTER("spider_get_sys_rewrite_table_subpartitions"); + if ((ptr = get_field(mem_root, table->field[3]))) + { + info->subpartition_ordinal_position = + (ulonglong) my_strtoll10(ptr, (char**) NULL, &error_num); + if (error_num) + { + error_num = ER_SPIDER_INVALID_VALUE_NUM; + my_printf_error(ER_SPIDER_INVALID_VALUE_NUM, + ER_SPIDER_NOT_SUPPORTED_STR, MYF(0), + ptr, SPIDER_SYS_RW_TBL_SPTTS_TABLE_NAME_STR, + "subpartition_ordinal_position"); + goto error; + } + } else { + error_num = ER_SPIDER_NOT_SUPPORTED_NUM; + my_printf_error(ER_SPIDER_NOT_SUPPORTED_NUM, + ER_SPIDER_NOT_SUPPORTED_STR, MYF(0), + "subpartition_ordinal_position=null", + SPIDER_SYS_RW_TBL_SPTTS_TABLE_NAME_STR); + goto error; + } + DBUG_PRINT("info", ("spider subpartition_name is %s", + table->field[4]->is_null() ? "null" : "not null")); + if (!table->field[4]->is_null()) + { + if ((ptr = get_field(mem_root, table->field[4]))) + { + info->subpartition_name.length = strlen(ptr); + info->subpartition_name.str = + spider_create_string(ptr, info->subpartition_name.length); + } else { + info->subpartition_name.length = 0; + info->subpartition_name.str = NullS; + } + } else { + error_num = ER_SPIDER_NOT_SUPPORTED_NUM; + my_printf_error(ER_SPIDER_NOT_SUPPORTED_NUM, + ER_SPIDER_NOT_SUPPORTED_STR, MYF(0), + "subpartition_name=null", + SPIDER_SYS_RW_TBL_SPTTS_TABLE_NAME_STR); + goto error; + } + DBUG_PRINT("info", ("spider subpartition_description is %s", + table->field[5]->is_null() ? "null" : "not null")); + if (!table->field[5]->is_null()) + { + if ((ptr = get_field(mem_root, table->field[5]))) + { + info->subpartition_description.length = strlen(ptr); + info->subpartition_description.str = + spider_create_string(ptr, info->subpartition_description.length); + } else { + info->subpartition_description.length = 0; + info->subpartition_description.str = NullS; + } + } else { + error_num = ER_SPIDER_NOT_SUPPORTED_NUM; + my_printf_error(ER_SPIDER_NOT_SUPPORTED_NUM, + ER_SPIDER_NOT_SUPPORTED_STR, MYF(0), + "subpartition_description=null", + SPIDER_SYS_RW_TBL_SPTTS_TABLE_NAME_STR); + goto error; + } + DBUG_PRINT("info", ("spider connection_str is %s", + table->field[6]->is_null() ? "null" : "not null")); + if (!table->field[6]->is_null()) + { + if ((ptr = get_field(mem_root, table->field[6]))) + { + info->connection_str.length = strlen(ptr); + info->connection_str.str = + spider_create_string(ptr, info->connection_str.length); + } else { + info->connection_str.length = 0; + info->connection_str.str = NullS; + } + } else { + error_num = ER_SPIDER_NOT_SUPPORTED_NUM; + my_printf_error(ER_SPIDER_NOT_SUPPORTED_NUM, + ER_SPIDER_NOT_SUPPORTED_STR, MYF(0), + "connection_str=null", + SPIDER_SYS_RW_TBL_SPTTS_TABLE_NAME_STR); + goto error; + } + DBUG_PRINT("info", ("spider comment_str is %s", + table->field[7]->is_null() ? "null" : "not null")); + if (!table->field[7]->is_null()) + { + if ((ptr = get_field(mem_root, table->field[7]))) + { + info->comment_str.length = strlen(ptr); + info->comment_str.str = + spider_create_string(ptr, info->comment_str.length); + } else { + info->comment_str.length = 0; + info->comment_str.str = NullS; + } + } else { + error_num = ER_SPIDER_NOT_SUPPORTED_NUM; + my_printf_error(ER_SPIDER_NOT_SUPPORTED_NUM, + ER_SPIDER_NOT_SUPPORTED_STR, MYF(0), + "comment_str=null", + SPIDER_SYS_RW_TBL_SPTTS_TABLE_NAME_STR); + goto error; + } +error: + DBUG_RETURN(error_num); +} + +void spider_store_rewritten_table_name( + TABLE *table, + LEX_CSTRING *schema_name, + LEX_CSTRING *table_name, + const struct charset_info_st *cs +) { + DBUG_ENTER("spider_store_rewritten_table_name"); + table->field[0]->store(schema_name->str, schema_name->length, cs); + table->field[1]->store(table_name->str, table_name->length, cs); + DBUG_VOID_RETURN; +} + +void spider_store_rewritten_table_id( + TABLE *table, + SPIDER_RWTBL *info +) { + DBUG_ENTER("spider_store_rewritten_table_id"); + table->field[2]->store(info->table_id); + DBUG_VOID_RETURN; +} + +void spider_store_rewritten_partition_id( + TABLE *table, + SPIDER_RWTBLTBL *info +) { + DBUG_ENTER("spider_store_rewritten_partition_id"); + table->field[3]->store(info->partition_id); + DBUG_VOID_RETURN; +} + +int spider_insert_rewritten_table( + TABLE *table, + SPIDER_RWTBLTBL *info +) { + int error_num; + char table_key[MAX_KEY_LENGTH]; + DBUG_ENTER("spider_insert_rewritten_table"); + spider_store_rewritten_partition_id(table, info); + + if ((error_num = spider_check_sys_table(table, table_key))) + { + if (error_num != HA_ERR_KEY_NOT_FOUND && error_num != HA_ERR_END_OF_FILE) + { + table->file->print_error(error_num, MYF(0)); + DBUG_RETURN(error_num); + } + if ((error_num = spider_write_sys_table_row(table))) + { + DBUG_RETURN(error_num); + } + } + DBUG_RETURN(0); +} +#endif + #ifdef SPIDER_use_LEX_CSTRING_for_Field_blob_constructor TABLE *spider_mk_sys_tmp_table( THD *thd, diff --git a/storage/spider/spd_sys_table.h b/storage/spider/spd_sys_table.h index 0fdb8cde6a2..b48f785a703 100644 --- a/storage/spider/spd_sys_table.h +++ b/storage/spider/spd_sys_table.h @@ -1,4 +1,5 @@ -/* Copyright (C) 2008-2018 Kentoku Shiba +/* Copyright (C) 2008-2019 Kentoku Shiba + Copyright (C) 2019 MariaDB corp This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -13,6 +14,8 @@ along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#define SPIDER_SYS_DB_NAME_STR "mysql" +#define SPIDER_SYS_DB_NAME_LEN (sizeof(SPIDER_SYS_DB_NAME_STR) - 1) #define SPIDER_SYS_XA_TABLE_NAME_STR "spider_xa" #define SPIDER_SYS_XA_TABLE_NAME_LEN (sizeof(SPIDER_SYS_XA_TABLE_NAME_STR) - 1) #define SPIDER_SYS_XA_MEMBER_TABLE_NAME_STR "spider_xa_member" @@ -31,6 +34,16 @@ #define SPIDER_SYS_TABLE_STS_TABLE_NAME_LEN (sizeof(SPIDER_SYS_TABLE_STS_TABLE_NAME_STR) - 1) #define SPIDER_SYS_TABLE_CRD_TABLE_NAME_STR "spider_table_crd" #define SPIDER_SYS_TABLE_CRD_TABLE_NAME_LEN (sizeof(SPIDER_SYS_TABLE_CRD_TABLE_NAME_STR) - 1) +#define SPIDER_SYS_RW_TBLS_TABLE_NAME_STR "spider_rewrite_tables" +#define SPIDER_SYS_RW_TBLS_TABLE_NAME_LEN (sizeof(SPIDER_SYS_RW_TBLS_TABLE_NAME_STR) - 1) +#define SPIDER_SYS_RW_TBL_TBLS_TABLE_NAME_STR "spider_rewrite_table_tables" +#define SPIDER_SYS_RW_TBL_TBLS_TABLE_NAME_LEN (sizeof(SPIDER_SYS_RW_TBL_TBLS_TABLE_NAME_STR) - 1) +#define SPIDER_SYS_RW_TBL_PTTS_TABLE_NAME_STR "spider_rewrite_table_partitions" +#define SPIDER_SYS_RW_TBL_PTTS_TABLE_NAME_LEN (sizeof(SPIDER_SYS_RW_TBL_PTTS_TABLE_NAME_STR) - 1) +#define SPIDER_SYS_RW_TBL_SPTTS_TABLE_NAME_STR "spider_rewrite_table_subpartitions" +#define SPIDER_SYS_RW_TBL_SPTTS_TABLE_NAME_LEN (sizeof(SPIDER_SYS_RW_TBL_SPTTS_TABLE_NAME_STR) - 1) +#define SPIDER_SYS_RWN_TBLS_TABLE_NAME_STR "spider_rewritten_tables" +#define SPIDER_SYS_RWN_TBLS_TABLE_NAME_LEN (sizeof(SPIDER_SYS_RWN_TBLS_TABLE_NAME_STR) - 1) #define SPIDER_SYS_XA_PREPARED_STR "PREPARED" #define SPIDER_SYS_XA_NOT_YET_STR "NOT YET" @@ -68,6 +81,15 @@ public: uint link_id_length; }; +void spider_sys_init_one_table( + TABLE_LIST *table_list, + const char *db_nm, + uint db_nm_len, + const char *table_nm, + uint table_nm_len, + enum thr_lock_type lock_type +); + #if MYSQL_VERSION_ID < 50500 TABLE *spider_open_sys_table( THD *thd, @@ -106,6 +128,13 @@ void spider_close_sys_table( bool spider_sys_open_tables( THD *thd, TABLE_LIST **tables, + uint *counter, + Open_tables_backup *open_tables_backup +); + +bool spider_sys_open_tables( + THD *thd, + TABLE_LIST **tables, Open_tables_backup *open_tables_backup ); @@ -119,6 +148,17 @@ void spider_sys_close_table( THD *thd, Open_tables_backup *open_tables_backup ); + +MYSQL_LOCK *spider_sys_lock_tables( + THD *thd, + TABLE **table, + uint counter +); + +void spider_sys_unlock_tables( + THD *thd, + MYSQL_LOCK *lock +); #endif int spider_sys_index_init( @@ -627,6 +667,60 @@ int spider_sys_replace( bool *modified_non_trans_table ); +#ifdef SPIDER_REWRITE_AVAILABLE +bool spider_copy_sys_rewrite_columns( + TABLE *table_from, + TABLE *table_to, + uint columns +); + +int spider_get_sys_rewrite_tables( + TABLE *table, + SPIDER_RWTBL *info, + MEM_ROOT *mem_root +); + +int spider_get_sys_rewrite_table_tables( + TABLE *table, + SPIDER_RWTBLTBL *info, + MEM_ROOT *mem_root +); + +int spider_get_sys_rewrite_table_partitions( + TABLE *table, + SPIDER_RWTBLPTT *info, + MEM_ROOT *mem_root +); + +int spider_get_sys_rewrite_table_subpartitions( + TABLE *table, + SPIDER_RWTBLSPTT *info, + MEM_ROOT *mem_root +); + +void spider_store_rewritten_table_name( + TABLE *table, + LEX_CSTRING *schema_name, + LEX_CSTRING *table_name, + const struct charset_info_st *cs +); + +void spider_store_rewritten_table_id( + TABLE *table, + SPIDER_RWTBL *info +); + +void spider_store_rewritten_partition_id( + TABLE *table, + SPIDER_RWTBLTBL *info +); + +int spider_insert_rewritten_table( + TABLE *table, + SPIDER_RWTBLTBL *info +); +#endif + #ifdef SPIDER_use_LEX_CSTRING_for_Field_blob_constructor TABLE *spider_mk_sys_tmp_table( THD *thd, diff --git a/storage/spider/spd_table.cc b/storage/spider/spd_table.cc index 0e706219432..f48db0f03c1 100644 --- a/storage/spider/spd_table.cc +++ b/storage/spider/spd_table.cc @@ -1,4 +1,5 @@ -/* Copyright (C) 2008-2018 Kentoku Shiba +/* Copyright (C) 2008-2019 Kentoku Shiba + Copyright (C) 2019 MariaDB corp This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -2091,7 +2092,11 @@ int spider_parse_connect_info( } #ifdef WITH_PARTITION_STORAGE_ENGINE +#ifdef SPIDER_PARTITION_HAS_CONNECTION_STRING + for (roop_count = 6; roop_count > 0; roop_count--) +#else for (roop_count = 4; roop_count > 0; roop_count--) +#endif #else for (roop_count = 2; roop_count > 0; roop_count--) #endif @@ -2104,7 +2109,25 @@ int spider_parse_connect_info( switch (roop_count) { #ifdef WITH_PARTITION_STORAGE_ENGINE +#ifdef SPIDER_PARTITION_HAS_CONNECTION_STRING + case 6: + if (!sub_elem || sub_elem->connect_string.length == 0) + continue; + DBUG_PRINT("info",("spider create sub connect string")); + if ( + !(connect_string = spider_create_string( + sub_elem->connect_string.str, + sub_elem->connect_string.length)) + ) { + error_num = HA_ERR_OUT_OF_MEM; + goto error_alloc_conn_string; + } + DBUG_PRINT("info",("spider connect_string=%s", connect_string)); + break; + case 5: +#else case 4: +#endif if (!sub_elem || !sub_elem->part_comment) continue; DBUG_PRINT("info",("spider create sub comment string")); @@ -2118,6 +2141,22 @@ int spider_parse_connect_info( } DBUG_PRINT("info",("spider sub comment string=%s", connect_string)); break; +#ifdef SPIDER_PARTITION_HAS_CONNECTION_STRING + case 4: + if (!part_elem || part_elem->connect_string.length == 0) + continue; + DBUG_PRINT("info",("spider create part connect string")); + if ( + !(connect_string = spider_create_string( + part_elem->connect_string.str, + part_elem->connect_string.length)) + ) { + error_num = HA_ERR_OUT_OF_MEM; + goto error_alloc_conn_string; + } + DBUG_PRINT("info",("spider connect_string=%s", connect_string)); + break; +#endif case 3: if (!part_elem || !part_elem->part_comment) continue; @@ -2134,32 +2173,32 @@ int spider_parse_connect_info( break; #endif case 2: - if (table_share->comment.length == 0) + if (table_share->connect_string.length == 0) continue; - DBUG_PRINT("info",("spider create comment string")); + DBUG_PRINT("info",("spider create connect_string string")); if ( !(connect_string = spider_create_string( - table_share->comment.str, - table_share->comment.length)) + table_share->connect_string.str, + table_share->connect_string.length)) ) { error_num = HA_ERR_OUT_OF_MEM; goto error_alloc_conn_string; } - DBUG_PRINT("info",("spider comment string=%s", connect_string)); + DBUG_PRINT("info",("spider connect_string=%s", connect_string)); break; default: - if (table_share->connect_string.length == 0) + if (table_share->comment.length == 0) continue; - DBUG_PRINT("info",("spider create connect_string string")); + DBUG_PRINT("info",("spider create comment string")); if ( !(connect_string = spider_create_string( - table_share->connect_string.str, - table_share->connect_string.length)) + table_share->comment.str, + table_share->comment.length)) ) { error_num = HA_ERR_OUT_OF_MEM; goto error_alloc_conn_string; } - DBUG_PRINT("info",("spider connect_string=%s", connect_string)); + DBUG_PRINT("info",("spider comment string=%s", connect_string)); break; } @@ -5736,6 +5775,7 @@ void spider_free_share_resource_only( pthread_mutex_destroy(&share->crd_mutex); pthread_mutex_destroy(&share->sts_mutex); pthread_mutex_destroy(&share->mutex); + free_root(&share->mem_root, MYF(0)); spider_free(spider_current_trx, share, MYF(0)); DBUG_VOID_RETURN; } @@ -6848,7 +6888,7 @@ int spider_db_done( spider_destroy_thd(thd); /* -DBUG_ASSERT(0); +assert(0); */ DBUG_RETURN(0); } @@ -9734,6 +9774,40 @@ void spider_free_spider_object_for_share( DBUG_VOID_RETURN; } +int spider_create_spider_object_for_share_with_sql_string( + SPIDER_TRX *trx, + SPIDER_SHARE *share, + ha_spider **spider +) { + int error_num; + uint roop_count; + DBUG_ENTER("spider_create_spider_object_for_share_with_sql_string"); + if ((error_num = spider_create_spider_object_for_share(trx, share, spider))) + { + DBUG_RETURN(error_num); + } + if (!((*spider)->result_list.sqls = new spider_string[share->all_link_count])) + { + spider_free_spider_object_for_share(spider); + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + } + for (roop_count = 0; roop_count < share->all_link_count; ++roop_count) + { + (*spider)->result_list.sqls[roop_count].init_calc_mem(262); + (*spider)->result_list.sqls[roop_count].set_charset(share->access_charset); + } + DBUG_RETURN(0); +} + +void spider_free_spider_object_for_share_with_sql_string( + ha_spider **spider +) { + DBUG_ENTER("spider_free_spider_object_for_share_with_sql_string"); + delete [] (*spider)->result_list.sqls; + spider_free_spider_object_for_share(spider); + DBUG_VOID_RETURN; +} + int spider_create_sts_threads( SPIDER_THREAD *spider_thread ) { diff --git a/storage/spider/spd_table.h b/storage/spider/spd_table.h index 43958ca6e78..925a6f2671a 100644 --- a/storage/spider/spd_table.h +++ b/storage/spider/spd_table.h @@ -687,6 +687,16 @@ void spider_free_spider_object_for_share( ha_spider **spider ); +int spider_create_spider_object_for_share_with_sql_string( + SPIDER_TRX *trx, + SPIDER_SHARE *share, + ha_spider **spider +); + +void spider_free_spider_object_for_share_with_sql_string( + ha_spider **spider +); + int spider_create_sts_threads( SPIDER_THREAD *spider_thread ); diff --git a/storage/spider/spd_udf.cc b/storage/spider/spd_udf.cc index 17498fbd8de..908d88cc798 100644 --- a/storage/spider/spd_udf.cc +++ b/storage/spider/spd_udf.cc @@ -1,4 +1,5 @@ -/* Copyright (C) 2009-2014 Kentoku Shiba +/* Copyright (C) 2009-2019 Kentoku Shiba + Copyright (C) 2019 MariaDB corp This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -152,4 +153,26 @@ void spider_copy_tables_deinit( ) { spider_copy_tables_deinit_body(initid); } + +long long spider_flush_rewrite_cache( + UDF_INIT *initid, + UDF_ARGS *args, + char *is_null, + char *error +) { + return spider_flush_rewrite_cache_body(error); +} + +my_bool spider_flush_rewrite_cache_init( + UDF_INIT *initid, + UDF_ARGS *args, + char *message +) { + return FALSE; +} + +void spider_flush_rewrite_cache_deinit( + UDF_INIT *initid +) { +} } diff --git a/storage/spider/spd_udf.def b/storage/spider/spd_udf.def index d0d7d53e3fe..b4469f7a940 100644 --- a/storage/spider/spd_udf.def +++ b/storage/spider/spd_udf.def @@ -18,3 +18,6 @@ EXPORTS spider_copy_tables spider_copy_tables_init spider_copy_tables_deinit + spider_flush_rewrite_cache + spider_flush_rewrite_cache_init + spider_flush_rewrite_cache_deinit diff --git a/storage/spider/spd_udf.h b/storage/spider/spd_udf.h index 0b20a10393e..84afed35fdf 100644 --- a/storage/spider/spd_udf.h +++ b/storage/spider/spd_udf.h @@ -1,4 +1,5 @@ -/* Copyright (C) 2009-2014 Kentoku Shiba +/* Copyright (C) 2009-2019 Kentoku Shiba + Copyright (C) 2019 MariaDB corp This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -77,3 +78,7 @@ my_bool spider_copy_tables_init_body( void spider_copy_tables_deinit_body( UDF_INIT *initid ); + +long long spider_flush_rewrite_cache_body( + char *error +); |