diff options
author | Jacob Mathew <jacob.mathew@mariadb.com> | 2018-08-09 00:04:09 -0700 |
---|---|---|
committer | Jacob Mathew <jacob.mathew@mariadb.com> | 2018-08-09 00:04:09 -0700 |
commit | 4b6dccc84ab3205e02d667bad63a74f70de04c9f (patch) | |
tree | 012a0c66333ffd382e244f8040b4a927f907d2b3 | |
parent | 89b6ce026a2bbbbd118df19da9ae9a81aabe4f65 (diff) | |
download | mariadb-git-bb-10.3-MDEV-16398.tar.gz |
MDEV-16398: Spider Creates Query With Non-Existent Functionbb-10.3-MDEV-16398
The problem occurs because the statement generated by Spider used an
internal function name, ADD_TIME.
This problem has been corrected by the fix for bug MDEV-16878 within the
server, which enables Spider to generate the statement using the actual
SQL function name. I have made some additional changes within Spider to fix
related problems that I observed while testing.
Author:
Jacob Mathew.
First Reviewer:
Alexander Barkov.
Second Reviewer:
Kentoku Shiba.
-rw-r--r-- | storage/spider/mysql-test/spider/include/init_spider.inc | 12 | ||||
-rw-r--r-- | storage/spider/mysql-test/spider/r/auto_increment.result | 2 | ||||
-rw-r--r-- | storage/spider/mysql-test/spider/r/timestamp.result | 101 | ||||
-rw-r--r-- | storage/spider/mysql-test/spider/t/timestamp.test | 85 | ||||
-rw-r--r-- | storage/spider/mysql-test/spider/t/timestamp_init.inc | 29 | ||||
-rw-r--r-- | storage/spider/spd_db_mysql.cc | 18 | ||||
-rw-r--r-- | storage/spider/spd_table.cc | 23 |
7 files changed, 213 insertions, 57 deletions
diff --git a/storage/spider/mysql-test/spider/include/init_spider.inc b/storage/spider/mysql-test/spider/include/init_spider.inc index f94bd51edd7..c4d171d418e 100644 --- a/storage/spider/mysql-test/spider/include/init_spider.inc +++ b/storage/spider/mysql-test/spider/include/init_spider.inc @@ -250,7 +250,7 @@ if (`SELECT IF($PLUGIN_VERSION = 3, 1, 0)`) format_id int not null default 0, gtrid_length int not null default 0, bqual_length int not null default 0, - data char(128) charset binary not null default '', + data binary(128) not null default '', status char(8) not null default '', PRIMARY KEY (data, format_id, gtrid_length), KEY idx1 (status) @@ -260,7 +260,7 @@ if (`SELECT IF($PLUGIN_VERSION = 3, 1, 0)`) format_id int not null default 0, gtrid_length int not null default 0, bqual_length int not null default 0, - data char(128) charset binary not null default '', + data binary(128) not null default '', scheme char(64) not null default '', host char(64) not null default '', port char(5) not null default '', @@ -282,7 +282,7 @@ if (`SELECT IF($PLUGIN_VERSION = 3, 1, 0)`) format_id int not null default 0, gtrid_length int not null default 0, bqual_length int not null default 0, - data char(128) charset binary not null default '', + data binary(128) not null default '', scheme char(64) not null default '', host char(64) not null default '', port char(5) not null default '', @@ -337,8 +337,8 @@ if (`SELECT IF($PLUGIN_VERSION = 3, 1, 0)`) CREATE TABLE mysql.spider_link_mon_servers( db_name char(64) not null default '', table_name char(199) not null default '', - link_id char(5) not null default '', - sid int not null default 0, + link_id char(64) not null default '', + sid int unsigned not null default 0, server char(64) default null, scheme char(64) default null, host char(64) default null, @@ -360,7 +360,7 @@ if (`SELECT IF($PLUGIN_VERSION = 3, 1, 0)`) CREATE TABLE mysql.spider_link_failed_log( db_name char(64) not null default '', table_name char(199) not null default '', - link_id int not null default 0, + link_id char(64) not null default '', failed_time timestamp not null default current_timestamp ) ENGINE=MYISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin; DROP TABLE IF EXISTS mysql.spider_table_position_for_recovery; diff --git a/storage/spider/mysql-test/spider/r/auto_increment.result b/storage/spider/mysql-test/spider/r/auto_increment.result index cbc7fee0671..d968d58e657 100644 --- a/storage/spider/mysql-test/spider/r/auto_increment.result +++ b/storage/spider/mysql-test/spider/r/auto_increment.result @@ -154,7 +154,7 @@ col_a col_b col_c connection child2_1; SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'; argument -select `col_a`,`col_b`,`col_c` from `auto_test_remote`.`tbl_a` +select t0.`col_a` `col_a`,t0.`col_b` `col_b`,t0.`col_c` `col_c` from `auto_test_remote`.`tbl_a` t0 SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %' SELECT col_a, col_b, col_c FROM tbl_a ORDER BY col_a; col_a col_b col_c diff --git a/storage/spider/mysql-test/spider/r/timestamp.result b/storage/spider/mysql-test/spider/r/timestamp.result index df40549cab2..bd1f442d462 100644 --- a/storage/spider/mysql-test/spider/r/timestamp.result +++ b/storage/spider/mysql-test/spider/r/timestamp.result @@ -40,8 +40,10 @@ SELECT 1; create table connection child2_1; -CHILD2_1_DROP_TABLES -CHILD2_1_CREATE_TABLES +CHILD2_1_DROP_TABLE +CHILD2_1_DROP_TABLE_F +CHILD2_1_CREATE_TABLE +CHILD2_1_CREATE_TABLE_F TRUNCATE TABLE mysql.general_log; connection master_1; DROP TABLE IF EXISTS tbl_a; @@ -51,7 +53,12 @@ col_dt DATETIME, col_ts TIMESTAMP NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(), PRIMARY KEY(col_a), +UNIQUE INDEX i_ts (col_ts) ) MASTER_1_ENGINE MASTER_1_AUTO_INCREMENT_2_1 MASTER_1_COMMENT_2_1 +CREATE TABLE tbl_f ( +col_d DATE, +col_t TIME +) ENGINE=Spider COMMENT='database "ts_test_remote", table "tbl_f", srv "s_2_1"' SHOW CREATE TABLE tbl_a; Table Create Table tbl_a CREATE TABLE `tbl_a` ( @@ -61,6 +68,12 @@ tbl_a CREATE TABLE `tbl_a` ( PRIMARY KEY (`col_a`), UNIQUE KEY `i_ts` (`col_ts`) ) ENGINE=SPIDER AUTO_INCREMENT=17 DEFAULT CHARSET=utf8mb4 COMMENT='database "ts_test_remote", table "tbl_a", srv "s_2_1"' +SHOW CREATE TABLE tbl_f; +Table Create Table +tbl_f CREATE TABLE `tbl_f` ( + `col_d` date DEFAULT NULL, + `col_t` time DEFAULT NULL +) ENGINE=SPIDER DEFAULT CHARSET=latin1 COMMENT='database "ts_test_remote", table "tbl_f", srv "s_2_1"' Set a different time zone that has DST SET time_zone='+01:00'; @@ -101,7 +114,7 @@ col_a col_dt col_ts unix_timestamp(col_ts) connection child2_1; SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'; argument -select `col_a`,`col_dt`,`col_ts` from `ts_test_remote`.`tbl_a` +select t0.`col_a` `col_a`,t0.`col_dt` `col_dt`,t0.`col_ts` `col_ts`,(unix_timestamp(t0.`col_ts`)) `unix_timestamp(col_ts)` from `ts_test_remote`.`tbl_a` t0 SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %' SELECT col_a, col_dt, col_ts, unix_timestamp(col_ts) FROM tbl_a ORDER BY col_a; col_a col_dt col_ts unix_timestamp(col_ts) @@ -127,7 +140,7 @@ col_a col_dt col_ts unix_timestamp(col_ts) connection child2_1; SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'; argument -select `col_a`,`col_dt`,`col_ts` from `ts_test_remote`.`tbl_a` +select t0.`col_a` `col_a`,t0.`col_dt` `col_dt`,t0.`col_ts` `col_ts`,(unix_timestamp(t0.`col_ts`)) `unix_timestamp(col_ts)` from `ts_test_remote`.`tbl_a` t0 SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %' SELECT col_a, col_dt, col_ts, unix_timestamp(col_ts) FROM tbl_a ORDER BY col_a; col_a col_dt col_ts unix_timestamp(col_ts) @@ -153,7 +166,7 @@ col_a col_dt col_ts unix_timestamp(col_ts) connection child2_1; SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'; argument -select `col_a`,`col_dt`,`col_ts` from `ts_test_remote`.`tbl_a` +select t0.`col_a` `col_a`,t0.`col_dt` `col_dt`,t0.`col_ts` `col_ts`,(unix_timestamp(t0.`col_ts`)) `unix_timestamp(col_ts)` from `ts_test_remote`.`tbl_a` t0 SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %' SELECT col_a, col_dt, col_ts, unix_timestamp(col_ts) FROM tbl_a ORDER BY col_a; col_a col_dt col_ts unix_timestamp(col_ts) @@ -181,7 +194,7 @@ connection child2_1; SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'; argument select `col_a`,`col_dt`,`col_ts` from `ts_test_remote`.`tbl_a` for update -select `col_a`,`col_dt`,`col_ts` from `ts_test_remote`.`tbl_a` +select t0.`col_a` `col_a`,t0.`col_dt` `col_dt`,t0.`col_ts` `col_ts`,(unix_timestamp(t0.`col_ts`)) `unix_timestamp(col_ts)` from `ts_test_remote`.`tbl_a` t0 SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %' SELECT col_a, col_dt, col_ts, unix_timestamp(col_ts) FROM tbl_a ORDER BY col_a; col_a col_dt col_ts unix_timestamp(col_ts) @@ -239,13 +252,13 @@ col_a col_dt col_ts unix_timestamp(col_ts) connection child2_1; SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'; argument -select `col_a`,`col_dt`,`col_ts` from `ts_test_remote`.`tbl_a` where (`col_ts` > '2017-12-31 23:00:00') order by `col_ts` -select `col_a`,`col_dt`,`col_ts` from `ts_test_remote`.`tbl_a` where (`col_ts` < '2018-10-28 01:30:00') order by `col_ts` -select `col_a`,`col_dt`,`col_ts` from `ts_test_remote`.`tbl_a` where ('2018-10-28 01:30:00' > `col_ts`) order by `col_ts` -select `col_a`,`col_dt`,`col_ts` from `ts_test_remote`.`tbl_a` where `col_ts` >= '2018-10-28 00:30:00' and `col_ts` <= '2018-10-28 01:30:00' and (`col_ts` between '2018-10-28 00:30:00' and '2018-10-28 01:30:00') order by `col_ts` -select `col_a`,`col_dt`,`col_ts` from `ts_test_remote`.`tbl_a` where `col_ts` >= '2018-10-28 00:30:00' and `col_ts` <= '2018-10-28 01:30:00' and ((`col_ts` >= '2018-10-28 00:30:00') and (`col_ts` <= '2018-10-28 01:30:00')) order by `col_ts` -select `col_a`,`col_dt`,`col_ts` from `ts_test_remote`.`tbl_a` where (`col_ts` > '2018-03-25 01:00:00') order by `col_ts` -select `col_a`,`col_dt`,`col_ts` from `ts_test_remote`.`tbl_a` where (`col_ts` > '1970-01-01 00:00:01') order by `col_ts` +select t0.`col_a` `col_a`,t0.`col_dt` `col_dt`,t0.`col_ts` `col_ts`,(unix_timestamp(t0.`col_ts`)) `unix_timestamp(col_ts)` from `ts_test_remote`.`tbl_a` t0 where (t0.`col_ts` > '2017-12-31 23:00:00') +select t0.`col_a` `col_a`,t0.`col_dt` `col_dt`,t0.`col_ts` `col_ts`,(unix_timestamp(t0.`col_ts`)) `unix_timestamp(col_ts)` from `ts_test_remote`.`tbl_a` t0 where (t0.`col_ts` < '2018-10-28 01:30:00') +select t0.`col_a` `col_a`,t0.`col_dt` `col_dt`,t0.`col_ts` `col_ts`,(unix_timestamp(t0.`col_ts`)) `unix_timestamp(col_ts)` from `ts_test_remote`.`tbl_a` t0 where ('2018-10-28 01:30:00' > t0.`col_ts`) +select t0.`col_a` `col_a`,t0.`col_dt` `col_dt`,t0.`col_ts` `col_ts`,(unix_timestamp(t0.`col_ts`)) `unix_timestamp(col_ts)` from `ts_test_remote`.`tbl_a` t0 where (t0.`col_ts` between '2018-10-28 00:30:00' and '2018-10-28 01:30:00') +select t0.`col_a` `col_a`,t0.`col_dt` `col_dt`,t0.`col_ts` `col_ts`,(unix_timestamp(t0.`col_ts`)) `unix_timestamp(col_ts)` from `ts_test_remote`.`tbl_a` t0 where ((t0.`col_ts` >= '2018-10-28 00:30:00') and (t0.`col_ts` <= '2018-10-28 01:30:00')) +select t0.`col_a` `col_a`,t0.`col_dt` `col_dt`,t0.`col_ts` `col_ts`,(unix_timestamp(t0.`col_ts`)) `unix_timestamp(col_ts)` from `ts_test_remote`.`tbl_a` t0 where (t0.`col_ts` > '2018-03-25 01:00:00') +select t0.`col_a` `col_a`,t0.`col_dt` `col_dt`,t0.`col_ts` `col_ts`,(unix_timestamp(t0.`col_ts`)) `unix_timestamp(col_ts)` from `ts_test_remote`.`tbl_a` t0 where (t0.`col_ts` > '1970-01-01 00:00:01') SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %' SELECT col_a, col_dt, col_ts, unix_timestamp(col_ts) FROM tbl_a ORDER BY col_a; col_a col_dt col_ts unix_timestamp(col_ts) @@ -326,13 +339,13 @@ col_a col_dt col_ts unix_timestamp(col_ts) connection child2_1; SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'; argument -select `col_a`,`col_dt`,`col_ts` from `ts_test_remote`.`tbl_a` where (`col_ts` > '2017-12-31 23:00:00') -select `col_a`,`col_dt`,`col_ts` from `ts_test_remote`.`tbl_a` where (`col_ts` < '2018-10-28 01:30:00') -select `col_a`,`col_dt`,`col_ts` from `ts_test_remote`.`tbl_a` where ('2018-10-28 01:30:00' > `col_ts`) -select `col_a`,`col_dt`,`col_ts` from `ts_test_remote`.`tbl_a` where (`col_ts` between '2018-10-28 00:30:00' and '2018-10-28 01:30:00') -select `col_a`,`col_dt`,`col_ts` from `ts_test_remote`.`tbl_a` where ((`col_ts` >= '2018-10-28 00:30:00') and (`col_ts` <= '2018-10-28 01:30:00')) -select `col_a`,`col_dt`,`col_ts` from `ts_test_remote`.`tbl_a` where (`col_ts` > '2018-03-25 01:00:00') -select `col_a`,`col_dt`,`col_ts` from `ts_test_remote`.`tbl_a` where (`col_ts` > '1970-01-01 00:00:01') +select t0.`col_a` `col_a`,t0.`col_dt` `col_dt`,t0.`col_ts` `col_ts`,(unix_timestamp(t0.`col_ts`)) `unix_timestamp(col_ts)` from `ts_test_remote`.`tbl_a` t0 where (t0.`col_ts` > '2017-12-31 23:00:00') +select t0.`col_a` `col_a`,t0.`col_dt` `col_dt`,t0.`col_ts` `col_ts`,(unix_timestamp(t0.`col_ts`)) `unix_timestamp(col_ts)` from `ts_test_remote`.`tbl_a` t0 where (t0.`col_ts` < '2018-10-28 01:30:00') +select t0.`col_a` `col_a`,t0.`col_dt` `col_dt`,t0.`col_ts` `col_ts`,(unix_timestamp(t0.`col_ts`)) `unix_timestamp(col_ts)` from `ts_test_remote`.`tbl_a` t0 where ('2018-10-28 01:30:00' > t0.`col_ts`) +select t0.`col_a` `col_a`,t0.`col_dt` `col_dt`,t0.`col_ts` `col_ts`,(unix_timestamp(t0.`col_ts`)) `unix_timestamp(col_ts)` from `ts_test_remote`.`tbl_a` t0 where (t0.`col_ts` between '2018-10-28 00:30:00' and '2018-10-28 01:30:00') +select t0.`col_a` `col_a`,t0.`col_dt` `col_dt`,t0.`col_ts` `col_ts`,(unix_timestamp(t0.`col_ts`)) `unix_timestamp(col_ts)` from `ts_test_remote`.`tbl_a` t0 where ((t0.`col_ts` >= '2018-10-28 00:30:00') and (t0.`col_ts` <= '2018-10-28 01:30:00')) +select t0.`col_a` `col_a`,t0.`col_dt` `col_dt`,t0.`col_ts` `col_ts`,(unix_timestamp(t0.`col_ts`)) `unix_timestamp(col_ts)` from `ts_test_remote`.`tbl_a` t0 where (t0.`col_ts` > '2018-03-25 01:00:00') +select t0.`col_a` `col_a`,t0.`col_dt` `col_dt`,t0.`col_ts` `col_ts`,(unix_timestamp(t0.`col_ts`)) `unix_timestamp(col_ts)` from `ts_test_remote`.`tbl_a` t0 where (t0.`col_ts` > '1970-01-01 00:00:01') SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %' SELECT col_a, col_dt, col_ts, unix_timestamp(col_ts) FROM tbl_a ORDER BY col_a; col_a col_dt col_ts unix_timestamp(col_ts) @@ -343,6 +356,54 @@ col_a col_dt col_ts unix_timestamp(col_ts) 5 2018-10-28 02:30:00 2018-10-28 02:30:00 1540690200 6 2038-01-19 04:14:07 2038-01-19 04:14:07 2147483647 +Test the TIMESTAMP function +connection master_1; +INSERT INTO tbl_f VALUES ('2018-06-24', '01:23:45'), +('2018-06-24', '01:23:45'), +('2018-08-01', '12:34:56'); +connection child2_1; +TRUNCATE TABLE mysql.general_log; +connection master_1; +SELECT * FROM tbl_f; +col_d col_t +2018-06-24 01:23:45 +2018-06-24 01:23:45 +2018-08-01 12:34:56 +SELECT TIMESTAMP(col_d, col_t) FROM tbl_f; +TIMESTAMP(col_d, col_t) +2018-06-24 01:23:45 +2018-06-24 01:23:45 +2018-08-01 12:34:56 +SELECT TIMESTAMP('2018-06-25', col_t) FROM tbl_f; +TIMESTAMP('2018-06-25', col_t) +2018-06-25 01:23:45 +2018-06-25 01:23:45 +2018-06-25 12:34:56 +SELECT TIMESTAMP(col_d, '10:43:21') FROM tbl_f; +TIMESTAMP(col_d, '10:43:21') +2018-06-24 10:43:21 +2018-06-24 10:43:21 +2018-08-01 10:43:21 +SELECT TIMESTAMP('2018-06-25', '10:43:21') FROM tbl_f; +TIMESTAMP('2018-06-25', '10:43:21') +2018-06-25 10:43:21 +2018-06-25 10:43:21 +2018-06-25 10:43:21 +connection child2_1; +SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'; +argument +select t0.`col_d` `col_d`,t0.`col_t` `col_t` from `ts_test_remote`.`tbl_f` t0 +select (timestamp(t0.`col_d` , t0.`col_t`)) `TIMESTAMP(col_d, col_t)` from `ts_test_remote`.`tbl_f` t0 +select (timestamp('2018-06-25' , t0.`col_t`)) `TIMESTAMP('2018-06-25', col_t)` from `ts_test_remote`.`tbl_f` t0 +select (timestamp(t0.`col_d` , '10:43:21')) `TIMESTAMP(col_d, '10:43:21')` from `ts_test_remote`.`tbl_f` t0 +select (timestamp('2018-06-25' , '10:43:21')) `TIMESTAMP('2018-06-25', '10:43:21')` from `ts_test_remote`.`tbl_f` t0 +SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %' +SELECT col_d, col_t FROM tbl_f; +col_d col_t +2018-06-24 01:23:45 +2018-06-24 01:23:45 +2018-08-01 12:34:56 + Restore Time Zone settings connection master_1; SET GLOBAL time_zone=DEFAULT; diff --git a/storage/spider/mysql-test/spider/t/timestamp.test b/storage/spider/mysql-test/spider/t/timestamp.test index 7008638cc4a..225851a9d13 100644 --- a/storage/spider/mysql-test/spider/t/timestamp.test +++ b/storage/spider/mysql-test/spider/t/timestamp.test @@ -66,13 +66,17 @@ if ($USE_CHILD_GROUP2) if ($OUTPUT_CHILD_GROUP2) { --disable_query_log - echo CHILD2_1_DROP_TABLES; - echo CHILD2_1_CREATE_TABLES; + echo CHILD2_1_DROP_TABLE; + echo CHILD2_1_DROP_TABLE_F; + echo CHILD2_1_CREATE_TABLE; + echo CHILD2_1_CREATE_TABLE_F; } --disable_warnings - eval $CHILD2_1_DROP_TABLES; + eval $CHILD2_1_DROP_TABLE; + eval $CHILD2_1_DROP_TABLE_F; --enable_warnings - eval $CHILD2_1_CREATE_TABLES; + eval $CHILD2_1_CREATE_TABLE; + eval $CHILD2_1_CREATE_TABLE_F; if ($OUTPUT_CHILD_GROUP2) { --enable_query_log @@ -98,7 +102,7 @@ echo CREATE TABLE tbl_a ( col_ts TIMESTAMP NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(), PRIMARY KEY(col_a), - + UNIQUE INDEX i_ts (col_ts) ) MASTER_1_ENGINE MASTER_1_AUTO_INCREMENT_2_1 MASTER_1_COMMENT_2_1; eval CREATE TABLE tbl_a ( col_a INT UNSIGNED NOT NULL AUTO_INCREMENT, @@ -108,8 +112,17 @@ eval CREATE TABLE tbl_a ( PRIMARY KEY(col_a), UNIQUE INDEX i_ts (col_ts) ) $MASTER_1_ENGINE $MASTER_1_AUTO_INCREMENT_2_1 $MASTER_1_COMMENT_2_1; +echo CREATE TABLE tbl_f ( + col_d DATE, + col_t TIME +) $MASTER_1_ENGINE $MASTER_1_COMMENT_2_1_F; +eval CREATE TABLE tbl_f ( + col_d DATE, + col_t TIME +) $MASTER_1_ENGINE $MASTER_1_COMMENT_2_1_F; --enable_query_log SHOW CREATE TABLE tbl_a; +SHOW CREATE TABLE tbl_f; --echo --echo Set a different time zone that has DST @@ -171,7 +184,7 @@ if ($USE_CHILD_GROUP2) { eval $CHILD2_1_SELECT_ARGUMENT1; } - eval $CHILD2_1_SELECT_TABLES; + eval $CHILD2_1_SELECT_TABLE; if (!$OUTPUT_CHILD_GROUP2) { --enable_query_log @@ -214,7 +227,7 @@ if ($USE_CHILD_GROUP2) { eval $CHILD2_1_SELECT_ARGUMENT1; } - eval $CHILD2_1_SELECT_TABLES; + eval $CHILD2_1_SELECT_TABLE; if (!$OUTPUT_CHILD_GROUP2) { --enable_query_log @@ -256,7 +269,7 @@ if ($USE_CHILD_GROUP2) { eval $CHILD2_1_SELECT_ARGUMENT1; } - eval $CHILD2_1_SELECT_TABLES; + eval $CHILD2_1_SELECT_TABLE; if (!$OUTPUT_CHILD_GROUP2) { --enable_query_log @@ -299,7 +312,7 @@ if ($USE_CHILD_GROUP2) { eval $CHILD2_1_SELECT_ARGUMENT1; } - eval $CHILD2_1_SELECT_TABLES; + eval $CHILD2_1_SELECT_TABLE; if (!$OUTPUT_CHILD_GROUP2) { --enable_query_log @@ -347,7 +360,7 @@ if ($USE_CHILD_GROUP2) { eval $CHILD2_1_SELECT_ARGUMENT1; } - eval $CHILD2_1_SELECT_TABLES; + eval $CHILD2_1_SELECT_TABLE; if (!$OUTPUT_CHILD_GROUP2) { --enable_query_log @@ -425,7 +438,57 @@ if ($USE_CHILD_GROUP2) { eval $CHILD2_1_SELECT_ARGUMENT1; } - eval $CHILD2_1_SELECT_TABLES; + eval $CHILD2_1_SELECT_TABLE; + if (!$OUTPUT_CHILD_GROUP2) + { + --enable_query_log + --enable_result_log + } +} + +--echo +--echo Test the TIMESTAMP function +--connection master_1 +INSERT INTO tbl_f VALUES ('2018-06-24', '01:23:45'), + ('2018-06-24', '01:23:45'), + ('2018-08-01', '12:34:56'); +if ($USE_CHILD_GROUP2) +{ + if (!$OUTPUT_CHILD_GROUP2) + { + --disable_query_log + --disable_result_log + } + --connection child2_1 + if ($USE_GENERAL_LOG) + { + TRUNCATE TABLE mysql.general_log; + } + if (!$OUTPUT_CHILD_GROUP2) + { + --enable_query_log + --enable_result_log + } +} +--connection master_1 +SELECT * FROM tbl_f; +SELECT TIMESTAMP(col_d, col_t) FROM tbl_f; +SELECT TIMESTAMP('2018-06-25', col_t) FROM tbl_f; +SELECT TIMESTAMP(col_d, '10:43:21') FROM tbl_f; +SELECT TIMESTAMP('2018-06-25', '10:43:21') FROM tbl_f; +if ($USE_CHILD_GROUP2) +{ + if (!$OUTPUT_CHILD_GROUP2) + { + --disable_query_log + --disable_result_log + } + --connection child2_1 + if ($USE_GENERAL_LOG) + { + eval $CHILD2_1_SELECT_ARGUMENT1; + } + eval $CHILD2_1_SELECT_TABLE_F; if (!$OUTPUT_CHILD_GROUP2) { --enable_query_log diff --git a/storage/spider/mysql-test/spider/t/timestamp_init.inc b/storage/spider/mysql-test/spider/t/timestamp_init.inc index 12049ab34fa..811c34c9b9a 100644 --- a/storage/spider/mysql-test/spider/t/timestamp_init.inc +++ b/storage/spider/mysql-test/spider/t/timestamp_init.inc @@ -7,8 +7,11 @@ --enable_warnings --let $MASTER_1_COMMENT_2_1_BACKUP= $MASTER_1_COMMENT_2_1 +--let $MASTER_1_COMMENT_2_1_F_BACKUP= $MASTER_1_COMMENT_2_1_F let $MASTER_1_COMMENT_2_1= COMMENT='database "ts_test_remote", table "tbl_a", srv "s_2_1"'; +let $MASTER_1_COMMENT_2_1_F= + COMMENT='database "ts_test_remote", table "tbl_f", srv "s_2_1"'; let $MASTER_1_AUTO_INCREMENT_2_1= AUTO_INCREMENT=17 DEFAULT CHARSET=utf8mb4; let $MASTER_1_AUTO_INCREMENT1= @@ -17,11 +20,15 @@ let $MASTER_1_AUTO_INCREMENT2= AUTO_INCREMENT=17 DEFAULT CHARSET=utf8mb4; let $CHILD2_1_AUTO_INCREMENT= AUTO_INCREMENT=17 DEFAULT CHARSET=utf8mb4; ---let $CHILD2_1_DROP_TABLES_BACKUP= $CHILD2_1_DROP_TABLES -let $CHILD2_1_DROP_TABLES= +--let $CHILD2_1_DROP_TABLE_BACKUP= $CHILD2_1_DROP_TABLE +--let $CHILD2_1_DROP_TABLE_F_BACKUP= $CHILD2_1_DROP_TABLE_F +let $CHILD2_1_DROP_TABLE= DROP TABLE IF EXISTS tbl_a; ---let $CHILD2_1_CREATE_TABLES_BACKUP= $CHILD2_1_CREATE_TABLES -let $CHILD2_1_CREATE_TABLES= +let $CHILD2_1_DROP_TABLE_F= + DROP TABLE IF EXISTS tbl_f; +--let $CHILD2_1_CREATE_TABLE_BACKUP= $CHILD2_1_CREATE_TABLE +--let $CHILD2_1_CREATE_TABLE_F_BACKUP= $CHILD2_1_CREATE_TABLE_F +let $CHILD2_1_CREATE_TABLE= CREATE TABLE tbl_a ( col_a INT UNSIGNED NOT NULL AUTO_INCREMENT, col_dt DATETIME, @@ -30,15 +37,25 @@ let $CHILD2_1_CREATE_TABLES= PRIMARY KEY(col_a), UNIQUE INDEX i_ts (col_ts) ) $CHILD2_1_ENGINE $CHILD2_1_AUTO_INCREMENT; ---let $CHILD2_1_SELECT_TABLES_BACKUP= $CHILD2_1_SELECT_TABLES -let $CHILD2_1_SELECT_TABLES= +let $CHILD2_1_CREATE_TABLE_F= + CREATE TABLE tbl_f ( + col_d DATE, + col_t TIME + ) $CHILD2_1_ENGINE; +--let $CHILD2_1_SELECT_TABLE_BACKUP= $CHILD2_1_SELECT_TABLE +--let $CHILD2_1_SELECT_TABLE_F_BACKUP= $CHILD2_1_SELECT_TABLE_F +let $CHILD2_1_SELECT_TABLE= SELECT col_a, col_dt, col_ts, unix_timestamp(col_ts) FROM tbl_a ORDER BY col_a; +let $CHILD2_1_SELECT_TABLE_F= + SELECT col_d, col_t FROM tbl_f; let $CHILD2_1_SELECT_ARGUMENT1= SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'; let $CHILD2_1_DROP_INDEX= DROP INDEX i_ts ON tbl_a; let $CHILD2_1_SHOW_CREATE_TABLE= SHOW CREATE TABLE tbl_a; +let $CHILD2_1_SHOW_CREATE_TABLE_F= + SHOW CREATE TABLE tbl_f; --let $OUTPUT_CHILD_GROUP2_BACKUP= $OUTPUT_CHILD_GROUP2 --let $OUTPUT_CHILD_GROUP2= 1 --let $USE_GENERAL_LOG_BACKUP= $USE_GENERAL_LOG diff --git a/storage/spider/spd_db_mysql.cc b/storage/spider/spd_db_mysql.cc index db685c50b85..ada9aa20821 100644 --- a/storage/spider/spd_db_mysql.cc +++ b/storage/spider/spd_db_mysql.cc @@ -12877,7 +12877,8 @@ int spider_mysql_handler::append_list_item_select( uint dbton_id = spider_dbton_mysql.dbton_id, length; List_iterator_fast<Item> it(*select); Item *item; - Field **field_ptr; + Field *field; + const char *item_name; DBUG_ENTER("spider_mysql_handler::append_list_item_select"); DBUG_PRINT("info",("spider this=%p", this)); while ((item = it++)) @@ -12888,8 +12889,17 @@ int spider_mysql_handler::append_list_item_select( { DBUG_RETURN(error_num); } - field_ptr = fields->get_next_field_ptr(); - length = (*field_ptr)->field_name.length; + field = *(fields->get_next_field_ptr()); + if (field) + { + item_name = field->field_name.str; + length = field->field_name.length; + } + else + { + item_name = item->name.str; + length = item->name.length; + } if (str->reserve( SPIDER_SQL_COMMA_LEN + /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_SPACE_LEN + length @@ -12897,7 +12907,7 @@ int spider_mysql_handler::append_list_item_select( DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN); if ((error_num = spider_db_mysql_utility.append_name(str, - (*field_ptr)->field_name.str, length))) + item_name, length))) { DBUG_RETURN(error_num); } diff --git a/storage/spider/spd_table.cc b/storage/spider/spd_table.cc index 283c9e7881d..1940dd5aad9 100644 --- a/storage/spider/spd_table.cc +++ b/storage/spider/spd_table.cc @@ -4679,15 +4679,20 @@ SPIDER_SHARE *spider_get_share( } if (!share->link_status_init) { - if ( - ( - table_share->tmp_table == NO_TMP_TABLE && - sql_command != SQLCOM_DROP_TABLE && - sql_command != SQLCOM_SHOW_CREATE - ) || - /* for alter change link status */ - sql_command == SQLCOM_ALTER_TABLE - ) { + /* + The link statuses need to be refreshed from the spider_tables table + if the operation: + - Is not a DROP TABLE on a permanent table; or + - Is an ALTER TABLE. + + Note that SHOW CREATE TABLE is not excluded, because the commands + that follow it require up-to-date link statuses. + */ + if ((table_share->tmp_table == NO_TMP_TABLE && + sql_command != SQLCOM_DROP_TABLE) || + /* for alter change link status */ + sql_command == SQLCOM_ALTER_TABLE) + { SPD_INIT_ALLOC_ROOT(&mem_root, 4096, 0, MYF(MY_WME)); init_mem_root = TRUE; if ( |