summaryrefslogtreecommitdiff
path: root/storage/spider
diff options
context:
space:
mode:
Diffstat (limited to 'storage/spider')
-rw-r--r--storage/spider/CMakeLists.txt31
-rw-r--r--storage/spider/ha_spider.cc982
-rw-r--r--storage/spider/ha_spider.h165
-rw-r--r--storage/spider/hs_client/allocator.hpp6
-rw-r--r--storage/spider/hs_client/config.cpp4
-rw-r--r--storage/spider/hs_client/escape.cpp1
-rw-r--r--storage/spider/hs_client/fatal.cpp2
-rw-r--r--storage/spider/hs_client/fatal.hpp2
-rw-r--r--storage/spider/hs_client/hs_compat.h9
-rw-r--r--storage/spider/hs_client/hstcpcli.cpp27
-rw-r--r--storage/spider/hs_client/hstcpcli.hpp3
-rw-r--r--storage/spider/hs_client/socket.cpp11
-rw-r--r--storage/spider/hs_client/string_util.cpp2
-rw-r--r--storage/spider/mysql-test/spider/bg/r/direct_aggregate.result8
-rw-r--r--storage/spider/mysql-test/spider/bg/r/direct_aggregate_part.result10
-rw-r--r--storage/spider/mysql-test/spider/bg/r/direct_update.result8
-rw-r--r--storage/spider/mysql-test/spider/bg/r/direct_update_part.result8
-rw-r--r--storage/spider/mysql-test/spider/bg/r/spider_fixes.result1
-rw-r--r--storage/spider/mysql-test/spider/bugfix/include/checksum_table_with_quick_mode_3_deinit.inc14
-rw-r--r--storage/spider/mysql-test/spider/bugfix/include/checksum_table_with_quick_mode_3_init.inc29
-rw-r--r--storage/spider/mysql-test/spider/bugfix/include/direct_sql_with_tmp_table_deinit.inc7
-rw-r--r--storage/spider/mysql-test/spider/bugfix/include/direct_sql_with_tmp_table_init.inc9
-rw-r--r--storage/spider/mysql-test/spider/bugfix/include/mdev_20100_deinit.inc11
-rw-r--r--storage/spider/mysql-test/spider/bugfix/include/mdev_20100_init.inc46
-rw-r--r--storage/spider/mysql-test/spider/bugfix/include/mdev_20502_deinit.inc11
-rw-r--r--storage/spider/mysql-test/spider/bugfix/include/mdev_20502_init.inc25
-rw-r--r--storage/spider/mysql-test/spider/bugfix/include/mdev_21884_deinit.inc14
-rw-r--r--storage/spider/mysql-test/spider/bugfix/include/mdev_21884_init.inc57
-rw-r--r--storage/spider/mysql-test/spider/bugfix/include/quick_mode_0_deinit.inc19
-rw-r--r--storage/spider/mysql-test/spider/bugfix/include/quick_mode_0_init.inc51
-rw-r--r--storage/spider/mysql-test/spider/bugfix/include/quick_mode_1_deinit.inc19
-rw-r--r--storage/spider/mysql-test/spider/bugfix/include/quick_mode_1_init.inc51
-rw-r--r--storage/spider/mysql-test/spider/bugfix/include/quick_mode_2_deinit.inc19
-rw-r--r--storage/spider/mysql-test/spider/bugfix/include/quick_mode_2_init.inc51
-rw-r--r--storage/spider/mysql-test/spider/bugfix/include/quick_mode_3_deinit.inc19
-rw-r--r--storage/spider/mysql-test/spider/bugfix/include/quick_mode_3_init.inc51
-rw-r--r--storage/spider/mysql-test/spider/bugfix/include/select_by_null_deinit.inc11
-rw-r--r--storage/spider/mysql-test/spider/bugfix/include/select_by_null_init.inc24
-rw-r--r--storage/spider/mysql-test/spider/bugfix/include/slave_trx_isolation_deinit.inc15
-rw-r--r--storage/spider/mysql-test/spider/bugfix/include/slave_trx_isolation_init.inc35
-rw-r--r--storage/spider/mysql-test/spider/bugfix/include/wrapper_mariadb_deinit.inc11
-rw-r--r--storage/spider/mysql-test/spider/bugfix/include/wrapper_mariadb_init.inc24
-rw-r--r--storage/spider/mysql-test/spider/bugfix/my.cnf2
-rw-r--r--storage/spider/mysql-test/spider/bugfix/my_1_1.cnf44
-rw-r--r--storage/spider/mysql-test/spider/bugfix/my_2_1.cnf56
-rw-r--r--storage/spider/mysql-test/spider/bugfix/my_2_2.cnf38
-rw-r--r--storage/spider/mysql-test/spider/bugfix/my_2_3.cnf8
-rw-r--r--storage/spider/mysql-test/spider/bugfix/my_3_1.cnf11
-rw-r--r--storage/spider/mysql-test/spider/bugfix/my_3_2.cnf9
-rw-r--r--storage/spider/mysql-test/spider/bugfix/my_3_3.cnf9
-rw-r--r--storage/spider/mysql-test/spider/bugfix/my_4_1.cnf9
-rw-r--r--storage/spider/mysql-test/spider/bugfix/r/checksum_table_with_quick_mode_3.result100
-rw-r--r--storage/spider/mysql-test/spider/bugfix/r/direct_sql_with_tmp_table.result33
-rw-r--r--storage/spider/mysql-test/spider/bugfix/r/mdev_20100.result119
-rw-r--r--storage/spider/mysql-test/spider/bugfix/r/mdev_20502.result85
-rw-r--r--storage/spider/mysql-test/spider/bugfix/r/mdev_21884.result107
-rw-r--r--storage/spider/mysql-test/spider/bugfix/r/quick_mode_0.result504
-rw-r--r--storage/spider/mysql-test/spider/bugfix/r/quick_mode_1.result504
-rw-r--r--storage/spider/mysql-test/spider/bugfix/r/quick_mode_2.result504
-rw-r--r--storage/spider/mysql-test/spider/bugfix/r/quick_mode_3.result504
-rw-r--r--storage/spider/mysql-test/spider/bugfix/r/select_by_null.result90
-rw-r--r--storage/spider/mysql-test/spider/bugfix/r/slave_trx_isolation.result99
-rw-r--r--storage/spider/mysql-test/spider/bugfix/r/wrapper_mariadb.result78
-rw-r--r--storage/spider/mysql-test/spider/bugfix/suite.opt1
-rw-r--r--storage/spider/mysql-test/spider/bugfix/suite.pm12
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/checksum_table_with_quick_mode_3.cnf3
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/checksum_table_with_quick_mode_3.test72
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/direct_sql_with_tmp_table.cnf3
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/direct_sql_with_tmp_table.test35
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/mdev_20100.cnf3
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/mdev_20100.test85
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/mdev_20502.cnf3
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/mdev_20502.test78
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/mdev_21884.cnf3
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/mdev_21884.test97
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/quick_mode_0.cnf4
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/quick_mode_0.test156
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/quick_mode_1.cnf4
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/quick_mode_1.test156
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/quick_mode_2.cnf4
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/quick_mode_2.test156
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/quick_mode_3.cnf4
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/quick_mode_3.test157
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/select_by_null.cnf3
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/select_by_null.test72
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/slave_trx_isolation.cnf4
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/slave_trx_isolation.test95
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/wrapper_mariadb.cnf3
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/wrapper_mariadb.test69
-rw-r--r--storage/spider/mysql-test/spider/handler/r/direct_update.result8
-rw-r--r--storage/spider/mysql-test/spider/handler/r/direct_update_part.result8
-rw-r--r--storage/spider/mysql-test/spider/handler/r/spider_fixes.result1
-rw-r--r--storage/spider/mysql-test/spider/handler/suite.pm1
-rw-r--r--storage/spider/mysql-test/spider/include/checksum_table_with_quick_mode_3_deinit.inc16
-rw-r--r--storage/spider/mysql-test/spider/include/checksum_table_with_quick_mode_3_init.inc33
-rw-r--r--storage/spider/mysql-test/spider/include/deinit_spider.inc4
-rw-r--r--storage/spider/mysql-test/spider/include/direct_join_deinit.inc9
-rw-r--r--storage/spider/mysql-test/spider/include/direct_join_init.inc53
-rw-r--r--storage/spider/mysql-test/spider/include/direct_join_using_deinit.inc9
-rw-r--r--storage/spider/mysql-test/spider/include/direct_join_using_init.inc13
-rw-r--r--storage/spider/mysql-test/spider/include/direct_left_join_deinit.inc9
-rw-r--r--storage/spider/mysql-test/spider/include/direct_left_join_init.inc13
-rw-r--r--storage/spider/mysql-test/spider/include/direct_left_join_nullable_deinit.inc9
-rw-r--r--storage/spider/mysql-test/spider/include/direct_left_join_nullable_init.inc13
-rw-r--r--storage/spider/mysql-test/spider/include/direct_left_right_join_nullable_deinit.inc9
-rw-r--r--storage/spider/mysql-test/spider/include/direct_left_right_join_nullable_init.inc13
-rw-r--r--storage/spider/mysql-test/spider/include/direct_left_right_left_join_nullable_deinit.inc9
-rw-r--r--storage/spider/mysql-test/spider/include/direct_left_right_left_join_nullable_init.inc13
-rw-r--r--storage/spider/mysql-test/spider/include/direct_right_join_deinit.inc9
-rw-r--r--storage/spider/mysql-test/spider/include/direct_right_join_init.inc13
-rw-r--r--storage/spider/mysql-test/spider/include/direct_right_join_nullable_deinit.inc9
-rw-r--r--storage/spider/mysql-test/spider/include/direct_right_join_nullable_init.inc13
-rw-r--r--storage/spider/mysql-test/spider/include/direct_right_left_join_nullable_deinit.inc9
-rw-r--r--storage/spider/mysql-test/spider/include/direct_right_left_join_nullable_init.inc13
-rw-r--r--storage/spider/mysql-test/spider/include/direct_right_left_right_join_nullable_deinit.inc9
-rw-r--r--storage/spider/mysql-test/spider/include/direct_right_left_right_join_nullable_init.inc13
-rw-r--r--storage/spider/mysql-test/spider/include/init_spider.inc114
-rw-r--r--storage/spider/mysql-test/spider/include/partition_cond_push_deinit.inc20
-rw-r--r--storage/spider/mysql-test/spider/include/partition_cond_push_init.inc58
-rw-r--r--storage/spider/mysql-test/spider/include/partition_fulltext_deinit.inc23
-rw-r--r--storage/spider/mysql-test/spider/include/partition_fulltext_init.inc72
-rw-r--r--storage/spider/mysql-test/spider/include/partition_join_pushdown_for_single_partition_deinit.inc30
-rw-r--r--storage/spider/mysql-test/spider/include/partition_join_pushdown_for_single_partition_init.inc105
-rw-r--r--storage/spider/mysql-test/spider/include/partition_mrr_deinit.inc23
-rw-r--r--storage/spider/mysql-test/spider/include/partition_mrr_init.inc92
-rw-r--r--storage/spider/mysql-test/spider/include/quick_mode_0_deinit.inc21
-rw-r--r--storage/spider/mysql-test/spider/include/quick_mode_0_init.inc55
-rw-r--r--storage/spider/mysql-test/spider/include/quick_mode_1_deinit.inc21
-rw-r--r--storage/spider/mysql-test/spider/include/quick_mode_1_init.inc55
-rw-r--r--storage/spider/mysql-test/spider/include/quick_mode_2_deinit.inc21
-rw-r--r--storage/spider/mysql-test/spider/include/quick_mode_2_init.inc55
-rw-r--r--storage/spider/mysql-test/spider/include/quick_mode_3_deinit.inc21
-rw-r--r--storage/spider/mysql-test/spider/include/quick_mode_3_init.inc55
-rw-r--r--storage/spider/mysql-test/spider/include/slave_trx_isolation_deinit.inc17
-rw-r--r--storage/spider/mysql-test/spider/include/slave_trx_isolation_init.inc39
-rw-r--r--storage/spider/mysql-test/spider/r/auto_increment.result186
-rw-r--r--storage/spider/mysql-test/spider/r/checksum_table_with_quick_mode_3.result104
-rw-r--r--storage/spider/mysql-test/spider/r/direct_aggregate.result8
-rw-r--r--storage/spider/mysql-test/spider/r/direct_aggregate_part.result10
-rw-r--r--storage/spider/mysql-test/spider/r/direct_join.result197
-rw-r--r--storage/spider/mysql-test/spider/r/direct_join_using.result108
-rw-r--r--storage/spider/mysql-test/spider/r/direct_left_join.result108
-rw-r--r--storage/spider/mysql-test/spider/r/direct_left_join_nullable.result113
-rw-r--r--storage/spider/mysql-test/spider/r/direct_left_right_join_nullable.result113
-rw-r--r--storage/spider/mysql-test/spider/r/direct_left_right_left_join_nullable.result112
-rw-r--r--storage/spider/mysql-test/spider/r/direct_right_join.result108
-rw-r--r--storage/spider/mysql-test/spider/r/direct_right_join_nullable.result113
-rw-r--r--storage/spider/mysql-test/spider/r/direct_right_left_join_nullable.result112
-rw-r--r--storage/spider/mysql-test/spider/r/direct_right_left_right_join_nullable.result113
-rw-r--r--storage/spider/mysql-test/spider/r/direct_update.result8
-rw-r--r--storage/spider/mysql-test/spider/r/direct_update_part.result8
-rw-r--r--storage/spider/mysql-test/spider/r/partition_cond_push.result168
-rw-r--r--storage/spider/mysql-test/spider/r/partition_fulltext.result126
-rw-r--r--storage/spider/mysql-test/spider/r/partition_join_pushdown_for_single_partition.result130
-rw-r--r--storage/spider/mysql-test/spider/r/partition_mrr.result223
-rw-r--r--storage/spider/mysql-test/spider/r/pushdown_not_like.result2
-rw-r--r--storage/spider/mysql-test/spider/r/quick_mode_0.result508
-rw-r--r--storage/spider/mysql-test/spider/r/quick_mode_1.result508
-rw-r--r--storage/spider/mysql-test/spider/r/quick_mode_2.result508
-rw-r--r--storage/spider/mysql-test/spider/r/quick_mode_3.result508
-rw-r--r--storage/spider/mysql-test/spider/r/show_system_tables.result37
-rw-r--r--storage/spider/mysql-test/spider/r/slave_trx_isolation.result105
-rw-r--r--storage/spider/mysql-test/spider/r/spider3_fixes_part.result18
-rw-r--r--storage/spider/mysql-test/spider/r/spider_fixes.result1
-rw-r--r--storage/spider/mysql-test/spider/r/spider_fixes_part.result31
-rw-r--r--storage/spider/mysql-test/spider/r/timestamp.result431
-rw-r--r--storage/spider/mysql-test/spider/t/auto_increment.test185
-rw-r--r--storage/spider/mysql-test/spider/t/auto_increment_deinit.inc13
-rw-r--r--storage/spider/mysql-test/spider/t/auto_increment_init.inc38
-rw-r--r--storage/spider/mysql-test/spider/t/checksum_table_with_quick_mode_3.test126
-rw-r--r--storage/spider/mysql-test/spider/t/direct_join.test343
-rw-r--r--storage/spider/mysql-test/spider/t/direct_join_using.test197
-rw-r--r--storage/spider/mysql-test/spider/t/direct_left_join.test197
-rw-r--r--storage/spider/mysql-test/spider/t/direct_left_join_nullable.test212
-rw-r--r--storage/spider/mysql-test/spider/t/direct_left_right_join_nullable.test212
-rw-r--r--storage/spider/mysql-test/spider/t/direct_left_right_left_join_nullable.test212
-rw-r--r--storage/spider/mysql-test/spider/t/direct_right_join.test197
-rw-r--r--storage/spider/mysql-test/spider/t/direct_right_join_nullable.test212
-rw-r--r--storage/spider/mysql-test/spider/t/direct_right_left_join_nullable.test212
-rw-r--r--storage/spider/mysql-test/spider/t/direct_right_left_right_join_nullable.test212
-rw-r--r--storage/spider/mysql-test/spider/t/partition_cond_push.test219
-rw-r--r--storage/spider/mysql-test/spider/t/partition_fulltext.test223
-rw-r--r--storage/spider/mysql-test/spider/t/partition_join_pushdown_for_single_partition.test222
-rw-r--r--storage/spider/mysql-test/spider/t/partition_mrr.test235
-rw-r--r--storage/spider/mysql-test/spider/t/quick_mode_0.test294
-rw-r--r--storage/spider/mysql-test/spider/t/quick_mode_1.test294
-rw-r--r--storage/spider/mysql-test/spider/t/quick_mode_2.test294
-rw-r--r--storage/spider/mysql-test/spider/t/quick_mode_3.test294
-rw-r--r--storage/spider/mysql-test/spider/t/show_system_tables.test26
-rw-r--r--storage/spider/mysql-test/spider/t/slave_trx_isolation.test148
-rw-r--r--storage/spider/mysql-test/spider/t/spider_fixes_part.test110
-rw-r--r--storage/spider/mysql-test/spider/t/timestamp.test528
-rw-r--r--storage/spider/mysql-test/spider/t/timestamp_deinit.inc13
-rw-r--r--storage/spider/mysql-test/spider/t/timestamp_init.inc62
-rw-r--r--storage/spider/scripts/install_spider.sql231
-rw-r--r--storage/spider/spd_conn.cc777
-rw-r--r--storage/spider/spd_conn.h31
-rw-r--r--storage/spider/spd_copy_tables.cc52
-rw-r--r--storage/spider/spd_db_conn.cc1869
-rw-r--r--storage/spider/spd_db_conn.h135
-rw-r--r--storage/spider/spd_db_handlersocket.cc664
-rw-r--r--storage/spider/spd_db_handlersocket.h109
-rw-r--r--storage/spider/spd_db_include.cc51
-rw-r--r--storage/spider/spd_db_include.h369
-rw-r--r--storage/spider/spd_db_mysql.cc4052
-rw-r--r--storage/spider/spd_db_mysql.h390
-rw-r--r--storage/spider/spd_db_oracle.cc1226
-rw-r--r--storage/spider/spd_db_oracle.h133
-rw-r--r--storage/spider/spd_direct_sql.cc172
-rw-r--r--storage/spider/spd_environ.h54
-rw-r--r--storage/spider/spd_err.h18
-rw-r--r--storage/spider/spd_group_by_handler.cc2129
-rw-r--r--storage/spider/spd_group_by_handler.h44
-rw-r--r--storage/spider/spd_i_s.cc6
-rw-r--r--storage/spider/spd_include.h228
-rw-r--r--storage/spider/spd_malloc.cc6
-rw-r--r--storage/spider/spd_param.cc411
-rw-r--r--storage/spider/spd_param.h41
-rw-r--r--storage/spider/spd_ping_table.cc393
-rw-r--r--storage/spider/spd_ping_table.h20
-rw-r--r--storage/spider/spd_sys_table.cc1041
-rw-r--r--storage/spider/spd_sys_table.h248
-rw-r--r--storage/spider/spd_table.cc2276
-rw-r--r--storage/spider/spd_table.h67
-rw-r--r--storage/spider/spd_trx.cc573
-rw-r--r--storage/spider/spd_udf.cc1
226 files changed, 32682 insertions, 2816 deletions
diff --git a/storage/spider/CMakeLists.txt b/storage/spider/CMakeLists.txt
index dec1cb4c6ba..706b11ac141 100644
--- a/storage/spider/CMakeLists.txt
+++ b/storage/spider/CMakeLists.txt
@@ -1,13 +1,24 @@
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DHAVE_HANDLERSOCKET")
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DHAVE_HANDLERSOCKET")
-MY_CHECK_AND_SET_COMPILER_FLAG("-Wno-vla" DEBUG)
+IF(HAVE_WVLA)
+ SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wno-vla")
+ SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wno-vla")
+ENDIF()
+
+IF(MSVC)
+ # Temporarily disable "conversion from size_t .."
+ IF(CMAKE_SIZEOF_VOID_P EQUAL 8)
+ SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4267")
+ ENDIF()
+ENDIF()
SET(SPIDER_SOURCES
spd_param.cc spd_sys_table.cc spd_trx.cc spd_db_conn.cc spd_conn.cc
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
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
)
@@ -21,11 +32,11 @@ IF(DEFINED ENV{ORACLE_HOME})
ENDIF()
IF(EXISTS ${PROJECT_SOURCE_DIR}/storage/mysql_storage_engine.cmake)
- SET(CMAKE_CXX_FLAGS_DEBUG
+ SET(CMAKE_CXX_FLAGS_DEBUG
"${CMAKE_CXX_FLAGS_DEBUG} -DSAFEMALLOC -DSAFE_MUTEX -DUSE_SYMDIR /Zi")
- SET(CMAKE_C_FLAGS_DEBUG
+ SET(CMAKE_C_FLAGS_DEBUG
"${CMAKE_C_FLAGS_DEBUG} -DSAFEMALLOC -DSAFE_MUTEX -DUSE_SYMDIR /Zi")
- SET(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} /MAP /MAPINFO:EXPORTS")
+ SET(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} /MAP /MAPINFO:EXPORTS")
INCLUDE("${PROJECT_SOURCE_DIR}/storage/mysql_storage_engine.cmake")
INCLUDE_DIRECTORIES(
@@ -44,6 +55,9 @@ ELSE()
DESTINATION ${INSTALL_MYSQLSHAREDIR} COMPONENT Server
)
MYSQL_ADD_PLUGIN(spider ${SPIDER_SOURCES} STORAGE_ENGINE MODULE_ONLY MODULE_OUTPUT_NAME "ha_spider")
+ IF(NOT TARGET spider)
+ RETURN()
+ ENDIF()
ENDIF()
IF(ORACLE_INCLUDE_DIR AND ORACLE_OCI_LIBRARY)
@@ -55,3 +69,12 @@ IF(ORACLE_INCLUDE_DIR AND ORACLE_OCI_LIBRARY)
TARGET_LINK_LIBRARIES (spider ${ORACLE_OCI_LIBRARY})
ENDIF()
ENDIF()
+
+IF(MSVC)
+ IF (CMAKE_BUILD_TYPE STREQUAL "Debug")
+ ADD_CUSTOM_COMMAND(TARGET spider
+ POST_BUILD
+ COMMAND if not exist ..\\..\\sql\\lib mkdir ..\\..\\sql\\lib\\plugin
+ COMMAND copy Debug\\ha_spider.dll ..\\..\\sql\\lib\\plugin\\ha_spider.dll)
+ ENDIF()
+ENDIF()
diff --git a/storage/spider/ha_spider.cc b/storage/spider/ha_spider.cc
index 6dbc34706da..0f222577515 100644
--- a/storage/spider/ha_spider.cc
+++ b/storage/spider/ha_spider.cc
@@ -1,4 +1,4 @@
-/* Copyright (C) 2008-2015 Kentoku Shiba
+/* Copyright (C) 2008-2018 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
@@ -18,7 +18,9 @@
#endif
#define MYSQL_SERVER 1
+#include <my_global.h>
#include "mysql_version.h"
+#include "spd_environ.h"
#if MYSQL_VERSION_ID < 50500
#include "mysql_priv.h"
#include <mysql/plugin.h>
@@ -62,6 +64,9 @@ extern HASH spider_open_tables;
#endif
extern pthread_mutex_t spider_lgtm_tblhnd_share_mutex;
+/* UTC time zone for timestamp columns */
+extern Time_zone *UTC;
+
ha_spider::ha_spider(
) : handler(spider_hton_ptr, NULL)
{
@@ -107,6 +112,9 @@ ha_spider::ha_spider(
sql_kinds = 0;
error_mode = 0;
use_spatial_index = FALSE;
+#ifdef SPIDER_HAS_GROUP_BY_HANDLER
+ use_fields = FALSE;
+#endif
use_pre_call = FALSE;
use_pre_records = FALSE;
#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
@@ -151,6 +159,7 @@ ha_spider::ha_spider(
result_list.tmp_tables_created = FALSE;
result_list.bgs_working = FALSE;
result_list.direct_order_limit = FALSE;
+ result_list.direct_limit_offset = FALSE;
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
result_list.hs_has_result = FALSE;
#endif
@@ -215,6 +224,9 @@ ha_spider::ha_spider(
sql_kinds = 0;
error_mode = 0;
use_spatial_index = FALSE;
+#ifdef SPIDER_HAS_GROUP_BY_HANDLER
+ use_fields = FALSE;
+#endif
use_pre_call = FALSE;
use_pre_records = FALSE;
#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
@@ -259,6 +271,7 @@ ha_spider::ha_spider(
result_list.tmp_tables_created = FALSE;
result_list.bgs_working = FALSE;
result_list.direct_order_limit = FALSE;
+ result_list.direct_limit_offset = FALSE;
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
result_list.hs_has_result = FALSE;
#endif
@@ -414,6 +427,7 @@ int ha_spider::open(
partition_handler_share->rnd_bitmap_is_set = FALSE;
partition_handler_share->table_hash_value = hash_value;
partition_handler_share->creator = this;
+ partition_handler_share->parallel_search_query_id = 0;
pt_handler_share_creator = this;
if (part_num)
{
@@ -481,6 +495,8 @@ int ha_spider::open(
}
}
#endif
+ memset(ft_discard_bitmap, 0xFF, no_bytes_in_map(table->read_set));
+ memset(searched_bitmap, 0, no_bytes_in_map(table->read_set));
init_sql_alloc_size =
spider_param_init_sql_alloc_size(thd, share->init_sql_alloc_size);
@@ -1307,6 +1323,7 @@ int ha_spider::external_lock(
trx,
trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -1360,6 +1377,7 @@ int ha_spider::external_lock(
trx,
trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -1392,6 +1410,7 @@ int ha_spider::external_lock(
trx,
trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -1427,6 +1446,7 @@ int ha_spider::external_lock(
trx,
trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -1452,6 +1472,7 @@ int ha_spider::external_lock(
if (thd_test_options(trx->thd, OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN))
trans_register_ha(trx->thd, TRUE, spider_hton_ptr);
}
+
if ((conn_kinds & SPIDER_CONN_KIND_HS_READ))
{
SPIDER_CONN *hs_conn;
@@ -1533,6 +1554,43 @@ int ha_spider::external_lock(
}
}
#endif
+
+ DBUG_PRINT("info",("spider trx_start=%s", trx->trx_start ? "TRUE" : "FALSE"));
+ /* need to check after spider_internal_start_trx() */
+ if (trx->trx_start)
+ {
+ switch (sql_command)
+ {
+ case SQLCOM_SELECT:
+ case SQLCOM_HA_READ:
+#ifdef HS_HAS_SQLCOM
+ case SQLCOM_HS_READ:
+#endif
+ /* nothing to do */
+ break;
+ case SQLCOM_UPDATE:
+ case SQLCOM_UPDATE_MULTI:
+#ifdef HS_HAS_SQLCOM
+ case SQLCOM_HS_UPDATE:
+#endif
+ case SQLCOM_CREATE_TABLE:
+ case SQLCOM_INSERT:
+ case SQLCOM_INSERT_SELECT:
+ case SQLCOM_DELETE:
+ case SQLCOM_LOAD:
+ case SQLCOM_REPLACE:
+ case SQLCOM_REPLACE_SELECT:
+ case SQLCOM_DELETE_MULTI:
+#ifdef HS_HAS_SQLCOM
+ case SQLCOM_HS_INSERT:
+ case SQLCOM_HS_DELETE:
+#endif
+ default:
+ trx->updated_in_this_trx = TRUE;
+ DBUG_PRINT("info",("spider trx->updated_in_this_trx=TRUE"));
+ break;
+ }
+ }
DBUG_RETURN(0);
}
@@ -1620,7 +1678,11 @@ int ha_spider::reset()
partition_handler_share->rnd_bitmap_is_set = FALSE;
}
#endif
- memset(ft_discard_bitmap, 0xFF, no_bytes_in_map(table->read_set));
+ if (!is_clone)
+ {
+ memset(ft_discard_bitmap, 0xFF, no_bytes_in_map(table->read_set));
+ memset(searched_bitmap, 0, no_bytes_in_map(table->read_set));
+ }
if (!(tmp_trx = spider_get_trx(thd, TRUE, &error_num2)))
{
DBUG_PRINT("info",("spider get trx error"));
@@ -1684,6 +1746,7 @@ int ha_spider::reset()
trx,
trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -1790,6 +1853,7 @@ int ha_spider::reset()
prev_index_rnd_init = SPD_NONE;
result_list.have_sql_kind_backup = FALSE;
result_list.direct_order_limit = FALSE;
+ result_list.direct_limit_offset = FALSE;
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
if ((error_num2 = reset_hs_strs(SPIDER_SQL_TYPE_UPDATE_HS)))
error_num = error_num2;
@@ -1797,6 +1861,9 @@ int ha_spider::reset()
result_list.set_split_read = FALSE;
result_list.insert_dup_update_pushdown = FALSE;
use_spatial_index = FALSE;
+#ifdef SPIDER_HAS_GROUP_BY_HANDLER
+ use_fields = FALSE;
+#endif
error_mode = 0;
#ifdef HA_CAN_BULK_ACCESS
#ifndef DBUG_OFF
@@ -1871,9 +1938,14 @@ int ha_spider::extra(
DBUG_RETURN(error_num);
break;
#endif
+#if defined(HA_EXTRA_HAS_STARTING_ORDERED_INDEX_SCAN) || defined(HA_EXTRA_HAS_HA_EXTRA_USE_CMP_REF)
+#ifdef HA_EXTRA_HAS_STARTING_ORDERED_INDEX_SCAN
+ case HA_EXTRA_STARTING_ORDERED_INDEX_SCAN:
+#endif
#ifdef HA_EXTRA_HAS_HA_EXTRA_USE_CMP_REF
case HA_EXTRA_USE_CMP_REF:
- DBUG_PRINT("info",("spider HA_EXTRA_USE_CMP_REF"));
+#endif
+ DBUG_PRINT("info",("spider HA_EXTRA_STARTING_ORDERED_INDEX_SCAN"));
if (table_share->primary_key != MAX_KEY)
{
DBUG_PRINT("info",("spider need primary key columns"));
@@ -2220,6 +2292,7 @@ int ha_spider::index_read_map_internal(
trx,
trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -2313,6 +2386,7 @@ int ha_spider::index_read_map_internal(
trx,
trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -2348,6 +2422,7 @@ int ha_spider::index_read_map_internal(
trx,
trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -2380,6 +2455,7 @@ int ha_spider::index_read_map_internal(
trx,
trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -2726,6 +2802,7 @@ int ha_spider::index_read_last_map_internal(
trx,
trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -2816,6 +2893,7 @@ int ha_spider::index_read_last_map_internal(
trx,
trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -2851,6 +2929,7 @@ int ha_spider::index_read_last_map_internal(
trx,
trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -2883,6 +2962,7 @@ int ha_spider::index_read_last_map_internal(
trx,
trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -3206,6 +3286,7 @@ int ha_spider::index_first_internal(
trx,
trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -3297,6 +3378,7 @@ int ha_spider::index_first_internal(
trx,
trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -3332,6 +3414,7 @@ int ha_spider::index_first_internal(
trx,
trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -3364,6 +3447,7 @@ int ha_spider::index_first_internal(
trx,
trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -3604,6 +3688,7 @@ int ha_spider::index_last_internal(
trx,
trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -3695,6 +3780,7 @@ int ha_spider::index_last_internal(
trx,
trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -3730,6 +3816,7 @@ int ha_spider::index_last_internal(
trx,
trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -3762,6 +3849,7 @@ int ha_spider::index_last_internal(
trx,
trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -4062,6 +4150,7 @@ int ha_spider::read_range_first_internal(
trx,
trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -4152,6 +4241,7 @@ int ha_spider::read_range_first_internal(
trx,
trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -4187,6 +4277,7 @@ int ha_spider::read_range_first_internal(
trx,
trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -4219,6 +4310,7 @@ int ha_spider::read_range_first_internal(
trx,
trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -4704,6 +4796,7 @@ int ha_spider::read_multi_range_first_internal(
trx,
trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -4799,6 +4892,7 @@ int ha_spider::read_multi_range_first_internal(
trx,
trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -4835,6 +4929,7 @@ int ha_spider::read_multi_range_first_internal(
trx,
trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -4869,6 +4964,7 @@ int ha_spider::read_multi_range_first_internal(
trx,
trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -5509,6 +5605,7 @@ int ha_spider::read_multi_range_first_internal(
trx,
trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -5607,6 +5704,7 @@ int ha_spider::read_multi_range_first_internal(
trx,
trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -5649,6 +5747,7 @@ int ha_spider::read_multi_range_first_internal(
trx,
trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -5686,6 +5785,7 @@ int ha_spider::read_multi_range_first_internal(
trx,
trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -5718,6 +5818,7 @@ int ha_spider::read_multi_range_first_internal(
trx,
trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -6174,6 +6275,7 @@ int ha_spider::read_multi_range_next(
trx,
trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -6269,6 +6371,7 @@ int ha_spider::read_multi_range_next(
trx,
trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -6305,6 +6408,7 @@ int ha_spider::read_multi_range_next(
trx,
trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -6339,6 +6443,7 @@ int ha_spider::read_multi_range_next(
trx,
trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -6983,6 +7088,7 @@ int ha_spider::read_multi_range_next(
trx,
trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -7081,6 +7187,7 @@ int ha_spider::read_multi_range_next(
trx,
trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -7123,6 +7230,7 @@ int ha_spider::read_multi_range_next(
trx,
trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -7160,6 +7268,7 @@ int ha_spider::read_multi_range_next(
trx,
trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -7192,6 +7301,7 @@ int ha_spider::read_multi_range_next(
trx,
trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -7398,6 +7508,8 @@ int ha_spider::rnd_init(
#endif
if (quick_targets[roop_count])
{
+ spider_db_free_one_quick_result(
+ (SPIDER_RESULT *) result_list.current);
DBUG_ASSERT(quick_targets[roop_count] ==
conns[roop_count]->quick_target);
DBUG_PRINT("info", ("spider conn[%p]->quick_target=NULL",
@@ -7495,6 +7607,8 @@ int ha_spider::rnd_next_internal(
uchar *buf
) {
int error_num;
+ ha_spider *direct_limit_offset_spider =
+ (ha_spider *) partition_handler_share->creator;
backup_error_status();
DBUG_ENTER("ha_spider::rnd_next_internal");
DBUG_PRINT("info",("spider this=%p", this));
@@ -7526,6 +7640,42 @@ int ha_spider::rnd_next_internal(
#ifdef WITH_PARTITION_STORAGE_ENGINE
check_select_column(TRUE);
#endif
+
+ if (this->result_list.direct_limit_offset)
+ {
+ if (direct_limit_offset_spider->direct_select_limit == 0)
+ { // mean has got all result
+ DBUG_RETURN(check_error_mode_eof(HA_ERR_END_OF_FILE));
+ }
+ if (
+ partition_handler_share->handlers &&
+ direct_limit_offset_spider->direct_current_offset > 0
+ ) {
+ longlong table_count = this->records();
+ DBUG_PRINT("info",("spider table_count=%lld", table_count));
+ if (table_count <= direct_limit_offset_spider->direct_current_offset)
+ {
+ // skip this spider(partition)
+ direct_limit_offset_spider->direct_current_offset -= table_count;
+ DBUG_PRINT("info",("spider direct_current_offset=%lld",
+ direct_limit_offset_spider->direct_current_offset));
+ DBUG_RETURN(check_error_mode_eof(HA_ERR_END_OF_FILE));
+ }
+ }
+
+ // make the offset/limit statement
+ DBUG_PRINT("info",("spider direct_current_offset=%lld",
+ direct_limit_offset_spider->direct_current_offset));
+ result_list.internal_offset = direct_limit_offset_spider->direct_current_offset;
+ DBUG_PRINT("info",("spider direct_select_limit=%lld",
+ direct_limit_offset_spider->direct_select_limit));
+ result_list.internal_limit = direct_limit_offset_spider->direct_select_limit;
+ result_list.split_read = direct_limit_offset_spider->direct_select_limit;
+
+ // start with this spider(partition)
+ direct_limit_offset_spider->direct_current_offset = 0;
+ }
+
DBUG_PRINT("info",("spider result_list.finish_flg = FALSE"));
result_list.finish_flg = FALSE;
result_list.record_num = 0;
@@ -7629,6 +7779,7 @@ int ha_spider::rnd_next_internal(
trx,
trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -7698,6 +7849,7 @@ int ha_spider::rnd_next_internal(
trx,
trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -7733,6 +7885,7 @@ int ha_spider::rnd_next_internal(
trx,
trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -7765,6 +7918,7 @@ int ha_spider::rnd_next_internal(
trx,
trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -7790,7 +7944,25 @@ int ha_spider::rnd_next_internal(
#endif
}
rnd_scan_and_first = FALSE;
+
+ if (this->result_list.direct_limit_offset)
+ {
+ if (buf && (error_num = spider_db_seek_next(buf, this, search_link_idx,
+ table)))
+ DBUG_RETURN(check_error_mode_eof(error_num));
+ DBUG_RETURN(0);
+ }
}
+
+ if (
+ result_list.direct_limit_offset &&
+ direct_limit_offset_spider->direct_select_offset > 0
+ ) {
+ // limit-- for each got row
+ direct_limit_offset_spider->direct_select_offset--;
+ DBUG_RETURN(0);
+ }
+
if (buf && (error_num = spider_db_seek_next(buf, this, search_link_idx,
table)))
DBUG_RETURN(check_error_mode_eof(error_num));
@@ -7937,9 +8109,10 @@ int ha_spider::cmp_ref(
*field;
field++
) {
- if ((ret = (*field)->cmp_binary_offset((uint)ptr_diff)))
+ if ((ret = (*field)->cmp_binary_offset((uint) ptr_diff)))
{
- DBUG_PRINT("info",("spider different at %s", (*field)->field_name));
+ DBUG_PRINT("info",("spider different at %s",
+ SPIDER_field_name_str(*field)));
break;
}
}
@@ -8042,6 +8215,7 @@ void ha_spider::ft_end()
store_error_num = index_end();
}
ft_init_without_index_init = FALSE;
+ handler::ft_end();
DBUG_VOID_RETURN;
}
@@ -8241,6 +8415,7 @@ int ha_spider::ft_read_internal(
trx,
trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -8305,6 +8480,7 @@ int ha_spider::ft_read_internal(
trx,
trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -8339,6 +8515,7 @@ int ha_spider::ft_read_internal(
trx,
trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -8371,6 +8548,7 @@ int ha_spider::ft_read_internal(
trx,
trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -8631,6 +8809,7 @@ int ha_spider::info(
trx,
trx->thd,
share,
+ search_link_idx,
(uint32) share->monitoring_sid[search_link_idx],
share->table_name,
share->table_name_length,
@@ -8678,7 +8857,7 @@ int ha_spider::info(
}
}
#ifndef WITHOUT_SPIDER_BG_SEARCH
- } else {
+ } else if (sts_bg_mode == 1) {
/* background */
if (!share->bg_sts_init || share->bg_sts_thd_wait)
{
@@ -8708,6 +8887,14 @@ int ha_spider::info(
} else
pthread_cond_signal(&share->bg_sts_cond);
}
+ } else {
+ share->bg_sts_try_time = tmp_time;
+ share->bg_sts_interval = sts_interval;
+ share->bg_sts_mode = sts_mode;
+#ifdef WITH_PARTITION_STORAGE_ENGINE
+ share->bg_sts_sync = sts_sync;
+#endif
+ spider_table_add_share_to_sts_thread(share);
}
#endif
pthread_mutex_unlock(&share->sts_mutex);
@@ -8901,6 +9088,7 @@ ha_rows ha_spider::records_in_range(
trx,
trx->thd,
share,
+ search_link_idx,
(uint32) share->monitoring_sid[search_link_idx],
share->table_name,
share->table_name_length,
@@ -8941,7 +9129,7 @@ ha_rows ha_spider::records_in_range(
}
}
#ifndef WITHOUT_SPIDER_BG_SEARCH
- } else {
+ } else if (crd_bg_mode == 1) {
/* background */
if (!share->bg_crd_init || share->bg_crd_thd_wait)
{
@@ -8963,6 +9151,14 @@ ha_rows ha_spider::records_in_range(
} else
pthread_cond_signal(&share->bg_crd_cond);
}
+ } else {
+ share->bg_crd_try_time = tmp_time;
+ share->bg_crd_interval = crd_interval;
+ share->bg_crd_mode = crd_mode;
+#ifdef WITH_PARTITION_STORAGE_ENGINE
+ share->bg_crd_sync = crd_sync;
+#endif
+ spider_table_add_share_to_crd_thread(share);
}
#endif
pthread_mutex_unlock(&share->crd_mutex);
@@ -9192,6 +9388,7 @@ int ha_spider::check_crd()
trx,
trx->thd,
share,
+ search_link_idx,
(uint32) share->monitoring_sid[search_link_idx],
share->table_name,
share->table_name_length,
@@ -9226,7 +9423,7 @@ int ha_spider::check_crd()
}
}
#ifndef WITHOUT_SPIDER_BG_SEARCH
- } else {
+ } else if (crd_bg_mode == 1) {
/* background */
if (!share->bg_crd_init || share->bg_crd_thd_wait)
{
@@ -9247,6 +9444,14 @@ int ha_spider::check_crd()
} else
pthread_cond_signal(&share->bg_crd_cond);
}
+ } else {
+ share->bg_crd_try_time = tmp_time;
+ share->bg_crd_interval = crd_interval;
+ share->bg_crd_mode = crd_mode;
+#ifdef WITH_PARTITION_STORAGE_ENGINE
+ share->bg_crd_sync = crd_sync;
+#endif
+ spider_table_add_share_to_crd_thread(share);
}
#endif
pthread_mutex_unlock(&share->crd_mutex);
@@ -9296,11 +9501,11 @@ ha_rows ha_spider::records()
use_pre_records = FALSE;
DBUG_RETURN(0);
}
- if (!(share->additional_table_flags & HA_HAS_RECORDS))
+ if (!(share->additional_table_flags & HA_HAS_RECORDS) && !this->result_list.direct_limit_offset)
{
DBUG_RETURN(handler::records());
}
- if (!use_pre_records)
+ if (!use_pre_records && !this->result_list.direct_limit_offset)
{
THD *thd = trx->thd;
if (
@@ -9351,6 +9556,9 @@ ulonglong ha_spider::table_flags() const
HA_BINLOG_ROW_CAPABLE |
HA_BINLOG_STMT_CAPABLE |
HA_PARTIAL_COLUMN_READ |
+#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
@@ -9362,6 +9570,9 @@ ulonglong ha_spider::table_flags() const
SPIDER_CAN_BG_SEARCH |
SPIDER_CAN_BG_INSERT |
SPIDER_CAN_BG_UPDATE |
+#ifdef HA_CAN_DIRECT_UPDATE_AND_DELETE
+ HA_CAN_DIRECT_UPDATE_AND_DELETE |
+#endif
#ifdef HA_CAN_FORCE_BULK_UPDATE
(share && share->force_bulk_update ? HA_CAN_FORCE_BULK_UPDATE : 0) |
#endif
@@ -9723,6 +9934,9 @@ int ha_spider::write_row(
DBUG_RETURN(error_num);
}
#endif
+#ifndef SPIDER_WITHOUT_HA_STATISTIC_INCREMENT
+ ha_statistic_increment(&SSV::ha_write_count);
+#endif
#if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100000
#else
if (table->timestamp_field_type & TIMESTAMP_AUTO_SET_ON_INSERT)
@@ -9883,7 +10097,7 @@ bool ha_spider::start_bulk_update(
}
int ha_spider::exec_bulk_update(
- uint *dup_key_found
+ ha_rows *dup_key_found
) {
int error_num;
backup_error_status();
@@ -9895,7 +10109,7 @@ int ha_spider::exec_bulk_update(
DBUG_RETURN(0);
}
-void ha_spider::end_bulk_update(
+int ha_spider::end_bulk_update(
) {
int error_num;
backup_error_status();
@@ -9904,26 +10118,43 @@ void ha_spider::end_bulk_update(
if ((error_num = check_and_end_bulk_update(SPD_BU_START_BY_BULK_INIT)))
{
if (check_error_mode(error_num))
- my_errno = error_num;
+ DBUG_RETURN(error_num);
}
- DBUG_VOID_RETURN;
+ DBUG_RETURN(0);
}
+#ifdef SPIDER_UPDATE_ROW_HAS_CONST_NEW_DATA
+int ha_spider::bulk_update_row(
+ const uchar *old_data,
+ const uchar *new_data,
+ ha_rows *dup_key_found
+)
+#else
int ha_spider::bulk_update_row(
const uchar *old_data,
uchar *new_data,
- uint *dup_key_found
-) {
+ ha_rows *dup_key_found
+)
+#endif
+{
DBUG_ENTER("ha_spider::bulk_update_row");
DBUG_PRINT("info",("spider this=%p", this));
*dup_key_found = 0;
DBUG_RETURN(update_row(old_data, new_data));
}
+#ifdef SPIDER_UPDATE_ROW_HAS_CONST_NEW_DATA
+int ha_spider::update_row(
+ const uchar *old_data,
+ const uchar *new_data
+)
+#else
int ha_spider::update_row(
const uchar *old_data,
uchar *new_data
-) {
+)
+#endif
+{
int error_num;
THD *thd = ha_thd();
backup_error_status();
@@ -9958,6 +10189,9 @@ int ha_spider::update_row(
DBUG_RETURN(error_num);
}
#endif
+#ifndef SPIDER_WITHOUT_HA_STATISTIC_INCREMENT
+ ha_statistic_increment(&SSV::ha_update_count);
+#endif
#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
do_direct_update = FALSE;
#endif
@@ -10010,13 +10244,26 @@ int ha_spider::update_row(
}
#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
+#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS_WITH_HS
+#ifdef SPIDER_MDEV_16246
int ha_spider::direct_update_rows_init(
+ List<Item> *update_fields,
uint mode,
KEY_MULTI_RANGE *ranges,
uint range_count,
bool sorted,
uchar *new_data
-) {
+)
+#else
+int ha_spider::direct_update_rows_init(
+ uint mode,
+ KEY_MULTI_RANGE *ranges,
+ uint range_count,
+ bool sorted,
+ uchar *new_data
+)
+#endif
+{
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
int error_num;
#endif
@@ -10043,8 +10290,13 @@ int ha_spider::direct_update_rows_init(
pre_direct_init_result));
DBUG_RETURN(pre_direct_init_result);
}
+#ifdef SPIDER_MDEV_16246
+ DBUG_RETURN(bulk_access_link_exec_tgt->spider->direct_update_rows_init(
+ update_fields, mode, ranges, range_count, sorted, new_data));
+#else
DBUG_RETURN(bulk_access_link_exec_tgt->spider->direct_update_rows_init(
mode, ranges, range_count, sorted, new_data));
+#endif
}
#endif
direct_update_init(
@@ -10147,39 +10399,245 @@ int ha_spider::direct_update_rows_init(
do_direct_update = FALSE;
DBUG_RETURN(HA_ERR_WRONG_COMMAND);
}
+#else
+#ifdef SPIDER_MDEV_16246
+/**
+ Perform initialization for a direct update request.
+
+ @param update fields Pointer to the list of fields to update.
+
+ @return >0 Error.
+ 0 Success.
+*/
+
+int ha_spider::direct_update_rows_init(
+ List<Item> *update_fields
+)
+#else
+int ha_spider::direct_update_rows_init()
+#endif
+{
+ st_select_lex *select_lex;
+ longlong select_limit;
+ longlong offset_limit;
+ List_iterator<Item> it(*direct_update_fields);
+ Item *item;
+ Field *field;
+ THD *thd = trx->thd;
+ DBUG_ENTER("ha_spider::direct_update_rows_init");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (thd->variables.time_zone != UTC)
+ {
+ while ((item = it++))
+ {
+ if (item->type() == Item::FIELD_ITEM)
+ {
+ field = ((Item_field *)item)->field;
+
+ if (field->type() == FIELD_TYPE_TIMESTAMP &&
+ field->flags & UNIQUE_KEY_FLAG)
+ {
+ /*
+ Spider cannot perform direct update on unique timestamp fields.
+ To avoid false duplicate key errors, the table needs to be
+ updated one row at a time.
+ */
+ DBUG_RETURN(HA_ERR_WRONG_COMMAND);
+ }
+ }
+ }
+ }
+#ifdef HA_CAN_BULK_ACCESS
+ if (
+ bulk_access_executing &&
+ (
+ (
+ !is_bulk_access_clone &&
+ bulk_access_link_exec_tgt->called
+ ) ||
+ bulk_access_pre_called
+ )
+ ) {
+ if (is_bulk_access_clone)
+ {
+ DBUG_PRINT("info",("spider return pre_direct_init_result %d",
+ pre_direct_init_result));
+ DBUG_RETURN(pre_direct_init_result);
+ }
+#ifdef SPIDER_MDEV_16246
+ DBUG_RETURN(bulk_access_link_exec_tgt->spider->
+ direct_update_rows_init(update_fields));
+#else
+ DBUG_RETURN(bulk_access_link_exec_tgt->spider->direct_update_rows_init());
+#endif
+ }
+#endif
+ direct_update_init(
+ thd,
+ FALSE
+ );
+ if (!condition)
+ cond_check = FALSE;
+ spider_get_select_limit(this, &select_lex, &select_limit, &offset_limit);
+ if (direct_update_fields)
+ {
+ if (
+#if MYSQL_VERSION_ID < 50500
+ !thd->variables.engine_condition_pushdown ||
+#else
+#ifdef SPIDER_ENGINE_CONDITION_PUSHDOWN_IS_ALWAYS_ON
+#else
+ !(thd->variables.optimizer_switch &
+ OPTIMIZER_SWITCH_ENGINE_CONDITION_PUSHDOWN) ||
+#endif
+#endif
+ !select_lex ||
+ select_lex->table_list.elements != 1 ||
+ check_update_columns_sql_part() ||
+ spider_db_append_condition(this, NULL, 0, TRUE)
+ ) {
+ DBUG_PRINT("info",("spider FALSE by condition"));
+ do_direct_update = FALSE;
+ DBUG_RETURN(HA_ERR_WRONG_COMMAND);
+ }
+ if (select_lex->order_list.elements)
+ {
+ ORDER *order;
+ for (order = (ORDER *) select_lex->order_list.first; order;
+ order = order->next)
+ {
+ if (check_item_type_sql((*order->item)))
+ {
+ DBUG_PRINT("info",("spider FALSE by order"));
+ do_direct_update = FALSE;
+ DBUG_RETURN(HA_ERR_WRONG_COMMAND);
+ }
+ }
+ result_list.direct_order_limit = TRUE;
+ }
+ trx->direct_update_count++;
+ DBUG_PRINT("info",("spider OK"));
+ DBUG_RETURN(0);
+ }
+
+ DBUG_PRINT("info",("spider offset_limit=%lld", offset_limit));
+ DBUG_PRINT("info",("spider sql_command=%u", sql_command));
+ DBUG_PRINT("info",("spider do_direct_update=%s",
+ do_direct_update ? "TRUE" : "FALSE"));
+ if (
+ !offset_limit &&
+ do_direct_update
+ ) {
+ trx->direct_update_count++;
+ DBUG_PRINT("info",("spider OK"));
+ DBUG_RETURN(0);
+ }
+ DBUG_PRINT("info",("spider FALSE by default"));
+ do_direct_update = FALSE;
+ DBUG_RETURN(HA_ERR_WRONG_COMMAND);
+}
+#endif
#ifdef HA_CAN_BULK_ACCESS
+#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS_WITH_HS
+#ifdef SPIDER_MDEV_16246
int ha_spider::pre_direct_update_rows_init(
+ List<Item> *update_fields,
uint mode,
KEY_MULTI_RANGE *ranges,
uint range_count,
bool sorted,
uchar *new_data
-) {
+)
+#else
+int ha_spider::pre_direct_update_rows_init(
+ uint mode,
+ KEY_MULTI_RANGE *ranges,
+ uint range_count,
+ bool sorted,
+ uchar *new_data
+)
+#endif
+{
int error_num;
DBUG_ENTER("ha_spider::pre_direct_update_rows_init");
DBUG_PRINT("info",("spider this=%p", this));
if (bulk_access_started)
{
+#ifdef SPIDER_MDEV_16246
+ error_num = bulk_access_link_current->spider->
+ pre_direct_update_rows_init(
+ update_fields, mode, ranges, range_count, sorted, new_data);
+#else
error_num = bulk_access_link_current->spider->
- ha_pre_direct_update_rows_init(
+ pre_direct_update_rows_init(
mode, ranges, range_count, sorted, new_data);
+#endif
bulk_access_link_current->spider->bulk_access_pre_called = TRUE;
bulk_access_link_current->called = TRUE;
DBUG_RETURN(error_num);
}
+#ifdef SPIDER_MDEV_16246
+ pre_direct_init_result = direct_update_rows_init(
+ update_fields, mode, ranges, range_count, sorted, new_data);
+#else
pre_direct_init_result = direct_update_rows_init(
mode, ranges, range_count, sorted, new_data);
+#endif
+ DBUG_RETURN(pre_direct_init_result);
+}
+#else
+#ifdef SPIDER_MDEV_16246
+/**
+ Do initialization for performing parallel direct update
+ for a handlersocket update request.
+
+ @param update fields Pointer to the list of fields to update.
+
+ @return >0 Error.
+ 0 Success.
+*/
+
+int ha_spider::pre_direct_update_rows_init(
+ List<Item> *update_fields
+)
+#else
+int ha_spider::pre_direct_update_rows_init()
+#endif
+{
+ int error_num;
+ DBUG_ENTER("ha_spider::pre_direct_update_rows_init");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (bulk_access_started)
+ {
+#ifdef SPIDER_MDEV_16246
+ error_num = bulk_access_link_current->spider->
+ pre_direct_update_rows_init(update_fields);
+#else
+ error_num = bulk_access_link_current->spider->
+ pre_direct_update_rows_init();
+#endif
+ bulk_access_link_current->spider->bulk_access_pre_called = TRUE;
+ bulk_access_link_current->called = TRUE;
+ DBUG_RETURN(error_num);
+ }
+#ifdef SPIDER_MDEV_16246
+ pre_direct_init_result = direct_update_rows_init(update_fields);
+#else
+ pre_direct_init_result = direct_update_rows_init();
+#endif
DBUG_RETURN(pre_direct_init_result);
}
#endif
+#endif
+#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS_WITH_HS
int ha_spider::direct_update_rows(
KEY_MULTI_RANGE *ranges,
uint range_count,
bool sorted,
uchar *new_data,
- uint *update_rows
+ ha_rows *update_rows
) {
int error_num;
THD *thd = ha_thd();
@@ -10229,20 +10687,83 @@ int ha_spider::direct_update_rows(
#endif
DBUG_RETURN(0);
}
+#else
+int ha_spider::direct_update_rows(
+ ha_rows *update_rows
+) {
+ int error_num;
+ THD *thd = ha_thd();
+ backup_error_status();
+ DBUG_ENTER("ha_spider::direct_update_rows");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (spider_param_read_only_mode(thd, share->read_only_mode))
+ {
+ my_printf_error(ER_SPIDER_READ_ONLY_NUM, ER_SPIDER_READ_ONLY_STR, MYF(0),
+ table_share->db.str, table_share->table_name.str);
+ DBUG_RETURN(ER_SPIDER_READ_ONLY_NUM);
+ }
+#ifdef HA_CAN_BULK_ACCESS
+ if (
+ bulk_access_executing &&
+ (
+ (
+ !is_bulk_access_clone &&
+ bulk_access_link_exec_tgt->called
+ ) ||
+ bulk_access_pre_called
+ )
+ ) {
+ if (is_bulk_access_clone)
+ {
+ bulk_access_pre_called = FALSE;
+ DBUG_RETURN(spider_db_bulk_direct_update(this, update_rows));
+ }
+ DBUG_RETURN(bulk_access_link_exec_tgt->spider->ha_direct_update_rows(
+ update_rows));
+ }
+#endif
+ if (
+ (active_index != MAX_KEY && (error_num = index_handler_init())) ||
+ (active_index == MAX_KEY && (error_num = rnd_handler_init())) ||
+ (error_num = spider_db_direct_update(this, table, update_rows))
+ )
+ DBUG_RETURN(check_error_mode(error_num));
#ifdef HA_CAN_BULK_ACCESS
+ if (bulk_access_executing && is_bulk_access_clone)
+ {
+ bulk_req_exec();
+ DBUG_RETURN(spider_db_bulk_direct_update(this, update_rows));
+ }
+#endif
+ DBUG_RETURN(0);
+}
+#endif
+
+#ifdef HA_CAN_BULK_ACCESS
+#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS_WITH_HS
int ha_spider::pre_direct_update_rows(
KEY_MULTI_RANGE *ranges,
uint range_count,
bool sorted,
uchar *new_data,
- uint *update_rows
+ ha_rows *update_rows
) {
DBUG_ENTER("ha_spider::pre_direct_update_rows");
DBUG_PRINT("info",("spider this=%p", this));
DBUG_RETURN(bulk_access_link_current->spider->ha_direct_update_rows(ranges,
range_count, sorted, new_data, update_rows));
}
+#else
+int ha_spider::pre_direct_update_rows()
+{
+ uint update_rows;
+ DBUG_ENTER("ha_spider::pre_direct_update_rows");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(bulk_access_link_current->spider->ha_direct_update_rows(
+ &update_rows));
+}
+#endif
#endif
#endif
@@ -10300,6 +10821,9 @@ int ha_spider::delete_row(
DBUG_RETURN(error_num);
}
#endif
+#ifndef SPIDER_WITHOUT_HA_STATISTIC_INCREMENT
+ ha_statistic_increment(&SSV::ha_delete_count);
+#endif
#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
do_direct_update = FALSE;
#endif
@@ -10309,6 +10833,7 @@ int ha_spider::delete_row(
}
#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
+#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS_WITH_HS
int ha_spider::direct_delete_rows_init(
uint mode,
KEY_MULTI_RANGE *ranges,
@@ -10420,8 +10945,81 @@ int ha_spider::direct_delete_rows_init(
do_direct_update = FALSE;
DBUG_RETURN(HA_ERR_WRONG_COMMAND);
}
+#else
+int ha_spider::direct_delete_rows_init()
+{
+ st_select_lex *select_lex;
+ longlong select_limit;
+ longlong offset_limit;
+ THD *thd = trx->thd;
+ DBUG_ENTER("ha_spider::direct_delete_rows_init");
+ DBUG_PRINT("info",("spider this=%p", this));
+#ifdef HA_CAN_BULK_ACCESS
+ if (
+ bulk_access_executing &&
+ (
+ (
+ !is_bulk_access_clone &&
+ bulk_access_link_exec_tgt->called
+ ) ||
+ bulk_access_pre_called
+ )
+ ) {
+ if (is_bulk_access_clone)
+ {
+ DBUG_RETURN(pre_direct_init_result);
+ }
+ DBUG_RETURN(bulk_access_link_exec_tgt->spider->direct_delete_rows_init());
+ }
+#endif
+ direct_update_init(
+ thd,
+ FALSE
+ );
+ if (!condition)
+ cond_check = FALSE;
+ spider_get_select_limit(this, &select_lex, &select_limit, &offset_limit);
+ if (
+#if MYSQL_VERSION_ID < 50500
+ !thd->variables.engine_condition_pushdown ||
+#else
+#ifdef SPIDER_ENGINE_CONDITION_PUSHDOWN_IS_ALWAYS_ON
+#else
+ !(thd->variables.optimizer_switch &
+ OPTIMIZER_SWITCH_ENGINE_CONDITION_PUSHDOWN) ||
+#endif
+#endif
+ !select_lex ||
+ select_lex->table_list.elements != 1 ||
+ spider_db_append_condition(this, NULL, 0, TRUE)
+ ) {
+ DBUG_PRINT("info",("spider FALSE by condition"));
+ do_direct_update = FALSE;
+ DBUG_RETURN(HA_ERR_WRONG_COMMAND);
+ }
+ if (select_lex->order_list.elements)
+ {
+ ORDER *order;
+ for (order = (ORDER *) select_lex->order_list.first; order;
+ order = order->next)
+ {
+ if (check_item_type_sql((*order->item)))
+ {
+ DBUG_PRINT("info",("spider FALSE by order"));
+ do_direct_update = FALSE;
+ DBUG_RETURN(HA_ERR_WRONG_COMMAND);
+ }
+ }
+ result_list.direct_order_limit = TRUE;
+ }
+ trx->direct_delete_count++;
+ DBUG_PRINT("info",("spider OK"));
+ DBUG_RETURN(0);
+}
+#endif
#ifdef HA_CAN_BULK_ACCESS
+#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS_WITH_HS
int ha_spider::pre_direct_delete_rows_init(
uint mode,
KEY_MULTI_RANGE *ranges,
@@ -10434,7 +11032,7 @@ int ha_spider::pre_direct_delete_rows_init(
if (bulk_access_started)
{
error_num = bulk_access_link_current->spider->
- ha_pre_direct_delete_rows_init(
+ pre_direct_delete_rows_init(
mode, ranges, range_count, sorted);
bulk_access_link_current->spider->bulk_access_pre_called = TRUE;
bulk_access_link_current->called = TRUE;
@@ -10444,13 +11042,32 @@ int ha_spider::pre_direct_delete_rows_init(
mode, ranges, range_count, sorted);
DBUG_RETURN(pre_direct_init_result);
}
+#else
+int ha_spider::pre_direct_delete_rows_init()
+{
+ int error_num;
+ DBUG_ENTER("ha_spider::pre_direct_delete_rows_init");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (bulk_access_started)
+ {
+ error_num = bulk_access_link_current->spider->
+ pre_direct_delete_rows_init();
+ bulk_access_link_current->spider->bulk_access_pre_called = TRUE;
+ bulk_access_link_current->called = TRUE;
+ DBUG_RETURN(error_num);
+ }
+ pre_direct_init_result = direct_delete_rows_init();
+ DBUG_RETURN(pre_direct_init_result);
+}
+#endif
#endif
+#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS_WITH_HS
int ha_spider::direct_delete_rows(
KEY_MULTI_RANGE *ranges,
uint range_count,
bool sorted,
- uint *delete_rows
+ ha_rows *delete_rows
) {
int error_num;
THD *thd = ha_thd();
@@ -10500,19 +11117,82 @@ int ha_spider::direct_delete_rows(
#endif
DBUG_RETURN(0);
}
+#else
+int ha_spider::direct_delete_rows(
+ ha_rows *delete_rows
+) {
+ int error_num;
+ THD *thd = ha_thd();
+ backup_error_status();
+ DBUG_ENTER("ha_spider::direct_delete_rows");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (spider_param_read_only_mode(thd, share->read_only_mode))
+ {
+ my_printf_error(ER_SPIDER_READ_ONLY_NUM, ER_SPIDER_READ_ONLY_STR, MYF(0),
+ table_share->db.str, table_share->table_name.str);
+ DBUG_RETURN(ER_SPIDER_READ_ONLY_NUM);
+ }
+#ifdef HA_CAN_BULK_ACCESS
+ if (
+ bulk_access_executing &&
+ (
+ (
+ !is_bulk_access_clone &&
+ bulk_access_link_exec_tgt->called
+ ) ||
+ bulk_access_pre_called
+ )
+ ) {
+ if (is_bulk_access_clone)
+ {
+ bulk_access_pre_called = FALSE;
+ DBUG_RETURN(spider_db_bulk_direct_update(this, delete_rows));
+ }
+ DBUG_RETURN(bulk_access_link_exec_tgt->spider->ha_direct_delete_rows(
+ delete_rows));
+ }
+#endif
+ if (
+ (active_index != MAX_KEY && (error_num = index_handler_init())) ||
+ (active_index == MAX_KEY && (error_num = rnd_handler_init())) ||
+ (error_num = spider_db_direct_delete(this, table, delete_rows))
+ )
+ DBUG_RETURN(check_error_mode(error_num));
+
+#ifdef HA_CAN_BULK_ACCESS
+ if (bulk_access_executing && is_bulk_access_clone)
+ {
+ bulk_req_exec();
+ DBUG_RETURN(spider_db_bulk_direct_update(this, delete_rows));
+ }
+#endif
+ DBUG_RETURN(0);
+}
+#endif
#ifdef HA_CAN_BULK_ACCESS
+#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS_WITH_HS
int ha_spider::pre_direct_delete_rows(
KEY_MULTI_RANGE *ranges,
uint range_count,
bool sorted,
- uint *delete_rows
+ ha_rows *delete_rows
) {
DBUG_ENTER("ha_spider::pre_direct_delete_rows");
DBUG_PRINT("info",("spider this=%p", this));
DBUG_RETURN(bulk_access_link_current->spider->ha_direct_delete_rows(
ranges, range_count, sorted, delete_rows));
}
+#else
+int ha_spider::pre_direct_delete_rows()
+{
+ uint delete_rows;
+ DBUG_ENTER("ha_spider::pre_direct_delete_rows");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(bulk_access_link_current->spider->ha_direct_delete_rows(
+ &delete_rows));
+}
+#endif
#endif
#endif
@@ -10702,7 +11382,17 @@ void ha_spider::print_error(
DBUG_ENTER("ha_spider::print_error");
DBUG_PRINT("info",("spider this=%p", this));
if (!current_thd->is_error())
- handler::print_error(error, errflag);
+ {
+ switch (error)
+ {
+ case ER_SPIDER_CON_COUNT_ERROR:
+ my_message(error, ER_SPIDER_CON_COUNT_ERROR_STR, MYF(0));
+ break;
+ default:
+ handler::print_error(error, errflag);
+ break;
+ }
+ }
DBUG_VOID_RETURN;
}
@@ -10734,7 +11424,7 @@ int ha_spider::create(
TABLE *form,
HA_CREATE_INFO *info
) {
- int error_num;
+ int error_num, dummy;
SPIDER_SHARE tmp_share;
THD *thd = ha_thd();
uint sql_command = thd_sql_command(thd), roop_count;
@@ -10769,7 +11459,7 @@ int ha_spider::create(
error_num = ER_SPIDER_ALTER_BEFORE_UNLOCK_NUM;
goto error_alter_before_unlock;
}
- memset(&tmp_share, 0, sizeof(SPIDER_SHARE));
+ memset((void*)&tmp_share, 0, sizeof(SPIDER_SHARE));
tmp_share.table_name = (char*) name;
tmp_share.table_name_length = strlen(name);
#ifdef SPIDER_HAS_HASH_VALUE_TYPE
@@ -10825,6 +11515,15 @@ int ha_spider::create(
) {
goto error;
}
+#ifdef SPIDER_SUPPORT_CREATE_OR_REPLACE_TABLE
+ if (
+ thd->lex->create_info.or_replace() &&
+ (error_num = spider_delete_tables(
+ table_tables, tmp_share.table_name, &dummy))
+ ) {
+ goto error;
+ }
+#endif
if (
(error_num = spider_insert_tables(table_tables, &tmp_share))
) {
@@ -10859,13 +11558,13 @@ int ha_spider::create(
trx->tmp_flg = TRUE;
DBUG_PRINT("info",
- ("spider alter_info.flags=%u", thd->lex->alter_info.flags));
- if (
- (thd->lex->alter_info.flags &
+ ("spider alter_info.flags: %llu alter_info.partition_flags: %lu",
+ thd->lex->alter_info.flags, thd->lex->alter_info.partition_flags));
+ if ((thd->lex->alter_info.partition_flags &
(
- SPIDER_ALTER_ADD_PARTITION | SPIDER_ALTER_DROP_PARTITION |
- SPIDER_ALTER_COALESCE_PARTITION | SPIDER_ALTER_REORGANIZE_PARTITION |
- SPIDER_ALTER_TABLE_REORG | SPIDER_ALTER_REBUILD_PARTITION
+ SPIDER_ALTER_PARTITION_ADD | SPIDER_ALTER_PARTITION_DROP |
+ SPIDER_ALTER_PARTITION_COALESCE | SPIDER_ALTER_PARTITION_REORGANIZE |
+ SPIDER_ALTER_PARTITION_TABLE_REORG | SPIDER_ALTER_PARTITION_REBUILD
)
) &&
memcmp(name + strlen(name) - 5, "#TMP#", 5)
@@ -11020,7 +11719,13 @@ int ha_spider::rename_table(
/* release table mon list */
for (roop_count = 0; roop_count < old_link_count; roop_count++)
- spider_release_ping_table_mon_list(from, from_len, roop_count);
+ {
+ if ((error_num =
+ spider_release_ping_table_mon_list(from, from_len, roop_count)))
+ {
+ goto error;
+ }
+ }
} else if (sql_command == SQLCOM_ALTER_TABLE)
{
DBUG_PRINT("info",("spider alter_table_from=%p", alter_table_from));
@@ -11049,13 +11754,14 @@ int ha_spider::rename_table(
}
DBUG_PRINT("info",
- ("spider alter_info.flags=%u", thd->lex->alter_info.flags));
+ ("spider alter_info.flags: %llu alter_info.partition_flags: %lu",
+ thd->lex->alter_info.flags, thd->lex->alter_info.partition_flags));
if (
- (thd->lex->alter_info.flags &
+ (thd->lex->alter_info.partition_flags &
(
- SPIDER_ALTER_ADD_PARTITION | SPIDER_ALTER_DROP_PARTITION |
- SPIDER_ALTER_COALESCE_PARTITION | SPIDER_ALTER_REORGANIZE_PARTITION |
- SPIDER_ALTER_TABLE_REORG | SPIDER_ALTER_REBUILD_PARTITION
+ SPIDER_ALTER_PARTITION_ADD | SPIDER_ALTER_PARTITION_DROP |
+ SPIDER_ALTER_PARTITION_COALESCE | SPIDER_ALTER_PARTITION_REORGANIZE |
+ SPIDER_ALTER_PARTITION_TABLE_REORG | SPIDER_ALTER_PARTITION_REBUILD
)
)
)
@@ -11102,9 +11808,21 @@ int ha_spider::rename_table(
/* release table mon list */
for (roop_count = 0; roop_count < (int) alter_table_from->all_link_count;
roop_count++)
- spider_release_ping_table_mon_list(from, from_len, roop_count);
+ {
+ if ((error_num =
+ spider_release_ping_table_mon_list(from, from_len, roop_count)))
+ {
+ goto error;
+ }
+ }
for (roop_count = 0; roop_count < old_link_count; roop_count++)
- spider_release_ping_table_mon_list(to, to_len, roop_count);
+ {
+ if ((error_num =
+ spider_release_ping_table_mon_list(to, to_len, roop_count)))
+ {
+ goto error;
+ }
+ }
}
/*
spider_free_trx_alter_table_alloc(trx, alter_table_from);
@@ -11232,19 +11950,26 @@ int ha_spider::delete_table(
DBUG_RETURN(0);
DBUG_PRINT("info",
- ("spider alter_info.flags=%u", thd->lex->alter_info.flags));
+ ("spider alter_info.flags: %llu alter_info.partition_flags: %lu",
+ thd->lex->alter_info.flags, thd->lex->alter_info.partition_flags));
if (
sql_command == SQLCOM_ALTER_TABLE &&
- (thd->lex->alter_info.flags &
+ (thd->lex->alter_info.partition_flags &
(
- SPIDER_ALTER_ADD_PARTITION | SPIDER_ALTER_DROP_PARTITION |
- SPIDER_ALTER_COALESCE_PARTITION | SPIDER_ALTER_REORGANIZE_PARTITION |
- SPIDER_ALTER_TABLE_REORG | SPIDER_ALTER_REBUILD_PARTITION
+ SPIDER_ALTER_PARTITION_ADD | SPIDER_ALTER_PARTITION_DROP |
+ SPIDER_ALTER_PARTITION_COALESCE | SPIDER_ALTER_PARTITION_REORGANIZE |
+ SPIDER_ALTER_PARTITION_TABLE_REORG | SPIDER_ALTER_PARTITION_REBUILD
)
)
)
need_lock = TRUE;
+ if ((error_num = spider_sys_delete_table_sts(
+ current_thd, name, name_len, need_lock)))
+ goto error;
+ if ((error_num = spider_sys_delete_table_crd(
+ current_thd, name, name_len, need_lock)))
+ goto error;
if (
!(table_tables = spider_open_sys_table(
current_thd, SPIDER_SYS_TABLES_TABLE_NAME_STR,
@@ -11265,7 +11990,11 @@ int ha_spider::delete_table(
/* release table mon list */
for (roop_count = 0; roop_count < old_link_count; roop_count++)
- spider_release_ping_table_mon_list(name, name_len, roop_count);
+ {
+ if ((error_num =
+ spider_release_ping_table_mon_list(name, name_len, roop_count)))
+ goto error;
+ }
pthread_mutex_lock(&spider_lgtm_tblhnd_share_mutex);
#ifdef SPIDER_HAS_HASH_VALUE_TYPE
@@ -11456,15 +12185,18 @@ Field *ha_spider::field_exchange(
}
#endif
DBUG_PRINT("info",("spider in field=%p", field));
+ DBUG_PRINT("info",("spider in field->table=%p", field->table));
#ifdef HANDLER_HAS_TOP_TABLE_FIELDS
if (set_top_table_fields)
{
+ DBUG_PRINT("info",("spider top_table=%p", top_table));
if (field->table != top_table)
DBUG_RETURN(NULL);
if (!(field = top_table_field[field->field_index]))
DBUG_RETURN(NULL);
} else {
#endif
+ DBUG_PRINT("info",("spider table=%p", table));
if (field->table != table)
DBUG_RETURN(NULL);
#ifdef HANDLER_HAS_TOP_TABLE_FIELDS
@@ -11644,6 +12376,7 @@ int ha_spider::info_push(
hs_decrement = FALSE;
break;
#endif
+#ifdef INFO_KIND_UPDATE_FIELDS
case INFO_KIND_UPDATE_FIELDS:
DBUG_PRINT("info",("spider INFO_KIND_UPDATE_FIELDS"));
direct_update_fields = (List<Item> *) info;
@@ -11653,10 +12386,13 @@ int ha_spider::info_push(
keyread = FALSE;
#endif
break;
+#endif
+#ifdef INFO_KIND_UPDATE_VALUES
case INFO_KIND_UPDATE_VALUES:
DBUG_PRINT("info",("spider INFO_KIND_UPDATE_VALUES"));
direct_update_values = (List<Item> *) info;
break;
+#endif
#ifdef INFO_KIND_FORCE_LIMIT_BEGIN
case INFO_KIND_FORCE_LIMIT_BEGIN:
DBUG_PRINT("info",("spider INFO_KIND_FORCE_LIMIT_BEGIN"));
@@ -11935,8 +12671,22 @@ void ha_spider::set_searched_bitmap()
void ha_spider::set_clone_searched_bitmap()
{
DBUG_ENTER("ha_spider::set_clone_searched_bitmap");
+ DBUG_PRINT("info",("spider searched_bitmap=%p", searched_bitmap));
+#ifndef DBUG_OFF
+ int roop_count;
+ for (roop_count = 0; roop_count < (int) ((table_share->fields + 7) / 8);
+ roop_count++)
+ DBUG_PRINT("info", ("spider before searched_bitmap is %x",
+ ((uchar *) searched_bitmap)[roop_count]));
+#endif
memcpy(searched_bitmap, pt_clone_source_handler->searched_bitmap,
(table_share->fields + 7) / 8);
+#ifndef DBUG_OFF
+ for (roop_count = 0; roop_count < (int) ((table_share->fields + 7) / 8);
+ roop_count++)
+ DBUG_PRINT("info", ("spider after searched_bitmap is %x",
+ ((uchar *) searched_bitmap)[roop_count]));
+#endif
memcpy(ft_discard_bitmap, pt_clone_source_handler->ft_discard_bitmap,
(table_share->fields + 7) / 8);
DBUG_VOID_RETURN;
@@ -12189,7 +12939,7 @@ int ha_spider::check_and_end_bulk_update(
spider_bulk_upd_start bulk_upd_start
) {
int error_num = 0;
- uint dup_key_found = 0;
+ ha_rows dup_key_found = 0;
DBUG_ENTER("ha_spider::check_and_end_bulk_update");
DBUG_PRINT("info",("spider this=%p", this));
DBUG_PRINT("info",("spider bulk_update_start=%d",
@@ -12241,6 +12991,8 @@ void ha_spider::check_direct_order_limit()
sql_kind[roop_count] = SPIDER_SQL_KIND_SQL;
} else
result_list.direct_order_limit = FALSE;
+
+ spider_set_direct_limit_offset(this);
result_list.check_direct_order_limit = TRUE;
}
DBUG_VOID_RETURN;
@@ -12259,27 +13011,27 @@ void ha_spider::check_direct_order_limit()
********************************************************************/
void ha_spider::check_distinct_key_query()
{
- DBUG_ENTER( "ha_spider::check_distinct_key_query" );
+ DBUG_ENTER( "ha_spider::check_distinct_key_query" );
- if ( result_list.direct_distinct && !partition_handler_share->handlers &&
- result_list.keyread && result_list.check_direct_order_limit )
- {
- // SELECT DISTINCT query using an index in a non-partitioned configuration
- KEY_PART_INFO* key_part = result_list.key_info->key_part;
- Field* key_field = key_part->field;
+ if ( result_list.direct_distinct && !partition_handler_share->handlers &&
+ result_list.keyread && result_list.check_direct_order_limit )
+ {
+ // SELECT DISTINCT query using an index in a non-partitioned configuration
+ KEY_PART_INFO* key_part = result_list.key_info->key_part;
+ Field* key_field = key_part->field;
- if ( is_sole_projection_field( key_field->field_index ) )
- {
- // Projection list consists solely of the first key prefix column
+ if ( is_sole_projection_field( key_field->field_index ) )
+ {
+ // Projection list consists solely of the first key prefix column
- // Set the internal row retrieval limit to avoid visiting each row
- // multiple times. This fixes a Spider performance bug that
- // caused each row to be visited multiple times.
- result_list.internal_limit = 1;
- }
+ // Set the internal row retrieval limit to avoid visiting each row
+ // multiple times. This fixes a Spider performance bug that
+ // caused each row to be visited multiple times.
+ result_list.internal_limit = 1;
}
+ }
- DBUG_VOID_RETURN;
+ DBUG_VOID_RETURN;
}
/********************************************************************
@@ -12294,31 +13046,32 @@ void ha_spider::check_distinct_key_query()
* solely of the specified column.
* FALSE - otherwise.
********************************************************************/
-bool ha_spider::is_sole_projection_field( uint16 field_index )
-{
- // NOTE: It is assumed that spider_db_append_select_columns() has already been called
- // to build the bitmap of projection fields
- bool is_ha_sole_projection_field;
- uint loop_index, dbton_id;
- spider_db_handler* dbton_hdl;
- DBUG_ENTER( "ha_spider::is_sole_projection_field" );
+bool ha_spider::is_sole_projection_field(
+ uint16 field_index
+) {
+ // NOTE: It is assumed that spider_db_append_select_columns() has already been called
+ // to build the bitmap of projection fields
+ bool is_ha_sole_projection_field;
+ uint loop_index, dbton_id;
+ spider_db_handler* dbton_hdl;
+ DBUG_ENTER( "ha_spider::is_sole_projection_field" );
- for ( loop_index = 0; loop_index < share->use_sql_dbton_count; loop_index++ )
- {
- dbton_id = share->use_sql_dbton_ids[ loop_index ];
- dbton_hdl = dbton_handler[ dbton_id ];
+ for ( loop_index = 0; loop_index < share->use_sql_dbton_count; loop_index++ )
+ {
+ dbton_id = share->use_sql_dbton_ids[ loop_index ];
+ dbton_hdl = dbton_handler[ dbton_id ];
- if ( dbton_hdl->first_link_idx >= 0 )
- {
- is_ha_sole_projection_field = dbton_hdl->is_sole_projection_field( field_index );
- if ( !is_ha_sole_projection_field )
- {
- DBUG_RETURN( FALSE );
- }
- }
+ if ( dbton_hdl->first_link_idx >= 0 )
+ {
+ is_ha_sole_projection_field = dbton_hdl->is_sole_projection_field( field_index );
+ if ( !is_ha_sole_projection_field )
+ {
+ DBUG_RETURN( FALSE );
+ }
}
+ }
- DBUG_RETURN( TRUE );
+ DBUG_RETURN( TRUE );
}
int ha_spider::check_ha_range_eof()
@@ -12426,6 +13179,7 @@ int ha_spider::drop_tmp_tables()
trx,
trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -12463,6 +13217,7 @@ int ha_spider::drop_tmp_tables()
trx,
trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -12584,6 +13339,7 @@ int ha_spider::close_opened_handler(
trx,
trx->thd,
share,
+ link_idx,
(uint32) share->monitoring_sid[link_idx],
share->table_name,
share->table_name_length,
@@ -12619,6 +13375,7 @@ int ha_spider::close_opened_handler(
trx,
trx->thd,
share,
+ link_idx,
(uint32) share->monitoring_sid[link_idx],
share->table_name,
share->table_name_length,
@@ -12660,6 +13417,7 @@ int ha_spider::close_opened_handler(
trx,
trx->thd,
share,
+ link_idx,
(uint32) share->monitoring_sid[link_idx],
share->table_name,
share->table_name_length,
@@ -12761,6 +13519,7 @@ int ha_spider::index_handler_init()
trx,
trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -12867,6 +13626,7 @@ int ha_spider::rnd_handler_init()
trx,
trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -13022,15 +13782,44 @@ int ha_spider::check_error_mode_eof(
void ha_spider::check_pre_call(
bool use_parallel
) {
+ THD* thd = ha_thd();
+ LEX *lex = thd->lex;
+ st_select_lex *select_lex = spider_get_select_lex(this);
+ int skip_parallel_search =
+ spider_param_skip_parallel_search(thd, share->skip_parallel_search);
DBUG_ENTER("ha_spider::check_pre_call");
DBUG_PRINT("info",("spider this=%p", this));
+ if (
+ (
+ (skip_parallel_search & 1) &&
+ lex->sql_command != SQLCOM_SELECT // such like insert .. select ..
+ ) ||
+ (
+ (skip_parallel_search & 2) &&
+#ifdef SPIDER_SQL_CACHE_IS_IN_LEX
+ lex->sql_cache == LEX::SQL_NO_CACHE // for mysqldump
+#else
+ select_lex && select_lex->sql_cache == SELECT_LEX::SQL_NO_CACHE // for mysqldump
+#endif
+ )
+ ) {
+ use_pre_call = FALSE;
+ DBUG_VOID_RETURN;
+ }
+ if (
+ use_parallel &&
+ thd->query_id != partition_handler_share->parallel_search_query_id
+ ) {
+ partition_handler_share->parallel_search_query_id = thd->query_id;
+ ++trx->parallel_search_count;
+ }
use_pre_call = use_parallel;
if (!use_pre_call)
{
- st_select_lex *select_lex;
longlong select_limit;
longlong offset_limit;
- spider_get_select_limit(this, &select_lex, &select_limit, &offset_limit);
+ spider_get_select_limit_from_select_lex(
+ select_lex, &select_limit, &offset_limit);
if (
select_lex &&
(!select_lex->explicit_limit || !select_limit)
@@ -15157,12 +15946,23 @@ int ha_spider::mk_bulk_tmp_table_and_bulk_start()
dbton_hdl->first_link_idx >= 0 &&
dbton_hdl->need_copy_for_update(roop_count)
) {
+#ifdef SPIDER_use_LEX_CSTRING_for_Field_blob_constructor
+ LEX_CSTRING field_name = {STRING_WITH_LEN("a")};
+ if (
+ !tmp_table[roop_count] &&
+ !(tmp_table[roop_count] = spider_mk_sys_tmp_table(
+ trx->thd, table, &result_list.upd_tmp_tbl_prms[roop_count],
+ &field_name, result_list.update_sqls[roop_count].charset()))
+ )
+#else
if (
!tmp_table[roop_count] &&
!(tmp_table[roop_count] = spider_mk_sys_tmp_table(
trx->thd, table, &result_list.upd_tmp_tbl_prms[roop_count], "a",
result_list.update_sqls[roop_count].charset()))
- ) {
+ )
+#endif
+ {
error_num = HA_ERR_OUT_OF_MEM;
goto error_2;
}
@@ -15259,8 +16059,8 @@ int ha_spider::print_item_type(
dbton_hdl = dbton_handler[dbton_id];
if (
dbton_hdl->first_link_idx >= 0 &&
- (error_num = spider_db_print_item_type(item, this, str,
- alias, alias_length, dbton_id))
+ (error_num = spider_db_print_item_type(item, NULL, this, str,
+ alias, alias_length, dbton_id, FALSE, NULL))
) {
DBUG_RETURN(error_num);
}
diff --git a/storage/spider/ha_spider.h b/storage/spider/ha_spider.h
index 3b16be09d38..9ffe49754e8 100644
--- a/storage/spider/ha_spider.h
+++ b/storage/spider/ha_spider.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2008-2015 Kentoku Shiba
+/* Copyright (C) 2008-2018 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
@@ -17,10 +17,6 @@
#pragma interface
#endif
-#if (defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100000)
-#define SPIDER_HANDLER_START_BULK_INSERT_HAS_FLAGS
-#endif
-
#define SPIDER_CONNECT_INFO_MAX_LEN 64
#define SPIDER_CONNECT_INFO_PATH_MAX_LEN FN_REFLEN
#define SPIDER_LONGLONG_LEN 20
@@ -133,6 +129,14 @@ public:
bool da_status;
bool use_spatial_index;
+#ifdef SPIDER_HAS_GROUP_BY_HANDLER
+ uint idx_for_direct_join;
+ bool use_fields;
+ spider_fields *fields;
+ SPIDER_LINK_IDX_CHAIN *link_idx_chain;
+ SPIDER_LINK_IDX_CHAIN *result_link_idx_chain;
+#endif
+
/* for mrr */
bool mrr_with_cnt;
uint multi_range_cnt;
@@ -251,6 +255,11 @@ public:
/* for dbton */
spider_db_handler **dbton_handler;
+ /* for direct limit offset */
+ longlong direct_select_offset;
+ longlong direct_current_offset;
+ longlong direct_select_limit;
+
ha_spider();
ha_spider(
handlerton *hton,
@@ -564,50 +573,142 @@ public:
#endif
bool start_bulk_update();
int exec_bulk_update(
- uint *dup_key_found
+ ha_rows *dup_key_found
);
- void end_bulk_update();
+ int end_bulk_update();
+#ifdef SPIDER_UPDATE_ROW_HAS_CONST_NEW_DATA
+ int bulk_update_row(
+ const uchar *old_data,
+ const uchar *new_data,
+ ha_rows *dup_key_found
+ );
+ int update_row(
+ const uchar *old_data,
+ const uchar *new_data
+ );
+#else
int bulk_update_row(
const uchar *old_data,
uchar *new_data,
- uint *dup_key_found
+ ha_rows *dup_key_found
);
int update_row(
const uchar *old_data,
uchar *new_data
);
+#endif
#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
+#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS_WITH_HS
+#ifdef SPIDER_MDEV_16246
+ inline int direct_update_rows_init(
+ List<Item> *update_fields
+ ) {
+ return direct_update_rows_init(update_fields, 2, NULL, 0, FALSE, NULL);
+ }
int direct_update_rows_init(
+ List<Item> *update_fields,
uint mode,
KEY_MULTI_RANGE *ranges,
uint range_count,
bool sorted,
uchar *new_data
);
+#else
+ inline int direct_update_rows_init()
+ {
+ return direct_update_rows_init(2, NULL, 0, FALSE, NULL);
+ }
+ int direct_update_rows_init(
+ uint mode,
+ KEY_MULTI_RANGE *ranges,
+ uint range_count,
+ bool sorted,
+ uchar *new_data
+ );
+#endif
+#else
+#ifdef SPIDER_MDEV_16246
+ int direct_update_rows_init(
+ List<Item> *update_fields
+ );
+#else
+ int direct_update_rows_init();
+#endif
+#endif
#ifdef HA_CAN_BULK_ACCESS
+#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS_WITH_HS
+#ifdef SPIDER_MDEV_16246
+ inline int pre_direct_update_rows_init(
+ List<Item> *update_fields
+ ) {
+ return pre_direct_update_rows_init(update_fields, 2, NULL, 0, FALSE, NULL);
+ }
int pre_direct_update_rows_init(
+ List<Item> *update_fields,
uint mode,
KEY_MULTI_RANGE *ranges,
uint range_count,
bool sorted,
uchar *new_data
);
+#else
+ inline int pre_direct_update_rows_init()
+ {
+ return pre_direct_update_rows_init(2, NULL, 0, FALSE, NULL);
+ }
+ int pre_direct_update_rows_init(
+ uint mode,
+ KEY_MULTI_RANGE *ranges,
+ uint range_count,
+ bool sorted,
+ uchar *new_data
+ );
+#endif
+#else
+#ifdef SPIDER_MDEV_16246
+ int pre_direct_update_rows_init(
+ List<Item> *update_fields
+ );
+#else
+ int pre_direct_update_rows_init();
+#endif
#endif
+#endif
+#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS_WITH_HS
+ inline int direct_update_rows(ha_rows *update_rows)
+ {
+ return direct_update_rows(NULL, 0, FALSE, NULL, update_rows);
+ }
int direct_update_rows(
KEY_MULTI_RANGE *ranges,
uint range_count,
bool sorted,
uchar *new_data,
- uint *update_rows
+ ha_rows *update_rows
+ );
+#else
+ int direct_update_rows(
+ ha_rows *update_rows
);
+#endif
#ifdef HA_CAN_BULK_ACCESS
+#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS_WITH_HS
+ inline int pre_direct_update_rows()
+ {
+ ha_rows update_rows;
+
+ return pre_direct_update_rows(NULL, 0, FALSE, NULL, &update_rows);
+ }
int pre_direct_update_rows(
KEY_MULTI_RANGE *ranges,
uint range_count,
bool sorted,
uchar *new_data,
- uint *update_rows
+ ha_rows *update_rows
);
+#else
+ int pre_direct_update_rows();
+#endif
#endif
#endif
bool start_bulk_delete();
@@ -616,33 +717,69 @@ public:
const uchar *buf
);
#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
+#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS_WITH_HS
+ inline int direct_delete_rows_init()
+ {
+ return direct_delete_rows_init(2, NULL, 0, FALSE);
+ }
int direct_delete_rows_init(
uint mode,
KEY_MULTI_RANGE *ranges,
uint range_count,
bool sorted
);
+#else
+ int direct_delete_rows_init();
+#endif
#ifdef HA_CAN_BULK_ACCESS
+#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS_WITH_HS
+ inline int pre_direct_delete_rows_init()
+ {
+ return pre_direct_delete_rows_init(2, NULL, 0, FALSE);
+ }
int pre_direct_delete_rows_init(
uint mode,
KEY_MULTI_RANGE *ranges,
uint range_count,
bool sorted
);
+#else
+ int pre_direct_delete_rows_init();
+#endif
#endif
+#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS_WITH_HS
+ inline int direct_delete_rows(ha_rows *delete_rows)
+ {
+ return direct_delete_rows(NULL, 0, FALSE, delete_rows);
+ }
int direct_delete_rows(
KEY_MULTI_RANGE *ranges,
uint range_count,
bool sorted,
- uint *delete_rows
+ ha_rows *delete_rows
+ );
+#else
+ int direct_delete_rows(
+ ha_rows *delete_rows
);
+#endif
#ifdef HA_CAN_BULK_ACCESS
+#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS_WITH_HS
+ inline int pre_direct_delete_rows()
+ {
+ ha_rows delete_rows;
+
+ return pre_direct_delete_rows(NULL, 0, FALSE, &delete_rows);
+ }
int pre_direct_delete_rows(
KEY_MULTI_RANGE *ranges,
uint range_count,
bool sorted,
- uint *delete_rows
+ ha_rows *delete_rows
);
+#else
+ int pre_direct_delete_rows();
+#endif
#endif
#endif
int delete_all_rows();
@@ -752,7 +889,9 @@ public:
uint check_partitioned();
void check_direct_order_limit();
void check_distinct_key_query();
- bool is_sole_projection_field( uint16 field_index );
+ bool is_sole_projection_field(
+ uint16 field_index
+ );
int check_ha_range_eof();
int drop_tmp_tables();
bool handler_opened(
diff --git a/storage/spider/hs_client/allocator.hpp b/storage/spider/hs_client/allocator.hpp
index a29015e6886..c302e07804e 100644
--- a/storage/spider/hs_client/allocator.hpp
+++ b/storage/spider/hs_client/allocator.hpp
@@ -3,7 +3,7 @@
/*
* Copyright (C) 2010-2011 DeNA Co.,Ltd.. All rights reserved.
- * Copyright (C) 2011 Kentoku SHIBA
+ * Copyright (C) 2011-2017 Kentoku SHIBA
* See COPYRIGHT.txt for details.
*/
@@ -31,11 +31,11 @@ extern "C" {
#if 1
#define DENA_ALLOCA_ALLOCATE(typ, len) \
- (typ *) alloca((len) * sizeof(typ))
+ (typ *) (alloca((len) * sizeof(typ)))
#define DENA_ALLOCA_FREE(x)
#else
#define DENA_ALLOCA_ALLOCATE(typ, len) \
- static_cast<typ *>(malloc((len) * sizeof(typ)))
+ (typ *) (malloc((len) * sizeof(typ)))
#define DENA_ALLOCA_FREE(x) free(x)
#endif
diff --git a/storage/spider/hs_client/config.cpp b/storage/spider/hs_client/config.cpp
index 3bf0f3e5bdf..97d479220e0 100644
--- a/storage/spider/hs_client/config.cpp
+++ b/storage/spider/hs_client/config.cpp
@@ -3,7 +3,7 @@
/*
* Copyright (C) 2010-2011 DeNA Co.,Ltd.. All rights reserved.
- * Copyright (C) 2011 Kentoku SHIBA
+ * Copyright (C) 2011-2017 Kentoku SHIBA
* See COPYRIGHT.txt for details.
*/
@@ -264,7 +264,7 @@ parse_args(int argc, char **argv, config& conf)
if (!(param = new conf_param()))
continue;
uint32 key_len = (uint32)(eq - arg);
- uint32 val_len = (uint32)(strlen(eq + 1));
+ uint32 val_len = strlen(eq + 1);
if (
param->key.reserve(key_len + 1) ||
param->val.reserve(val_len + 1)
diff --git a/storage/spider/hs_client/escape.cpp b/storage/spider/hs_client/escape.cpp
index c3194e1d111..f3e60afc387 100644
--- a/storage/spider/hs_client/escape.cpp
+++ b/storage/spider/hs_client/escape.cpp
@@ -3,6 +3,7 @@
/*
* Copyright (C) 2010 DeNA Co.,Ltd.. All rights reserved.
+ * Copyright (C) 2011-2017 Kentoku SHIBA
* See COPYRIGHT.txt for details.
*/
diff --git a/storage/spider/hs_client/fatal.cpp b/storage/spider/hs_client/fatal.cpp
index 260a2e75372..cfbc14df64a 100644
--- a/storage/spider/hs_client/fatal.cpp
+++ b/storage/spider/hs_client/fatal.cpp
@@ -3,7 +3,7 @@
/*
* Copyright (C) 2010-2011 DeNA Co.,Ltd.. All rights reserved.
- * Copyright (C) 2011 Kentoku SHIBA
+ * Copyright (C) 2011-2017 Kentoku SHIBA
* See COPYRIGHT.txt for details.
*/
diff --git a/storage/spider/hs_client/fatal.hpp b/storage/spider/hs_client/fatal.hpp
index e1190ae49c1..38fc149e98e 100644
--- a/storage/spider/hs_client/fatal.hpp
+++ b/storage/spider/hs_client/fatal.hpp
@@ -3,7 +3,7 @@
/*
* Copyright (C) 2010-2011 DeNA Co.,Ltd.. All rights reserved.
- * Copyright (C) 2011 Kentoku SHIBA
+ * Copyright (C) 2011-2017 Kentoku SHIBA
* See COPYRIGHT.txt for details.
*/
diff --git a/storage/spider/hs_client/hs_compat.h b/storage/spider/hs_client/hs_compat.h
index c947637a7f1..8505d7978b7 100644
--- a/storage/spider/hs_client/hs_compat.h
+++ b/storage/spider/hs_client/hs_compat.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2013 Kentoku Shiba
+/* Copyright (C) 2013-2018 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
@@ -16,7 +16,12 @@
#ifndef HS_COMPAT_H
#define HS_COMPAT_H
-#if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100000
+#if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100213
+#define SPD_INIT_DYNAMIC_ARRAY2(A, B, C, D, E, F) \
+ my_init_dynamic_array2(A, B, C, D, E, F)
+#define SPD_INIT_ALLOC_ROOT(A, B, C, D) \
+ init_alloc_root(A, "spider", B, C, D)
+#elif defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100000
#define SPD_INIT_DYNAMIC_ARRAY2(A, B, C, D, E, F) \
my_init_dynamic_array2(A, B, C, D, E, F)
#define SPD_INIT_ALLOC_ROOT(A, B, C, D) \
diff --git a/storage/spider/hs_client/hstcpcli.cpp b/storage/spider/hs_client/hstcpcli.cpp
index 60da87b9f20..4c93b5a3a49 100644
--- a/storage/spider/hs_client/hstcpcli.cpp
+++ b/storage/spider/hs_client/hstcpcli.cpp
@@ -3,7 +3,7 @@
/*
* Copyright (C) 2010-2011 DeNA Co.,Ltd.. All rights reserved.
- * Copyright (C) 2011 Kentoku SHIBA
+ * Copyright (C) 2011-2017 Kentoku SHIBA
* See COPYRIGHT.txt for details.
*/
@@ -67,6 +67,8 @@ struct hstcpcli : public hstcpcli_i, private noncopyable {
virtual int get_result(hstresult& result);
virtual const string_ref *get_next_row();
virtual const string_ref *get_next_row_from_result(hstresult& result);
+ virtual size_t get_row_size();
+ virtual size_t get_row_size_from_result(hstresult& result);
virtual void response_buf_remove();
virtual int get_error_code();
virtual String& get_error();
@@ -93,6 +95,7 @@ struct hstcpcli : public hstcpcli_i, private noncopyable {
string_buffer writebuf;
size_t response_end_offset; /* incl newline */
size_t cur_row_offset;
+ size_t cur_row_size;
size_t num_flds;
size_t num_req_bufd; /* buffered but not yet sent */
size_t num_req_sent; /* sent but not yet received */
@@ -104,8 +107,9 @@ struct hstcpcli : public hstcpcli_i, private noncopyable {
};
hstcpcli::hstcpcli(const socket_args& args)
- : sargs(args), response_end_offset(0), cur_row_offset(0), num_flds(0),
- num_req_bufd(0), num_req_sent(0), num_req_rcvd(0), error_code(0), errno_buf(0)
+ : sargs(args), response_end_offset(0), cur_row_offset(0), cur_row_size(0),
+ num_flds(0), num_req_bufd(0), num_req_sent(0), num_req_rcvd(0),
+ error_code(0), errno_buf(0)
{
String err;
SPD_INIT_DYNAMIC_ARRAY2(&flds, sizeof(string_ref), NULL, 16, 16, MYF(MY_WME));
@@ -503,6 +507,7 @@ hstcpcli::response_recv(size_t& num_flds_r)
}
return set_error(resp_code, e);
}
+ cur_row_size = 0;
cur_row_offset = start - readbuf.begin();
DBG(fprintf(stderr, "[%s] ro=%zu eol=%zu\n",
String(readbuf.begin(), readbuf.begin() + response_end_offset)
@@ -529,6 +534,7 @@ hstcpcli::get_result(hstresult& result)
result.readbuf.space_wrote(response_end_offset);
result.response_end_offset = response_end_offset;
result.num_flds = num_flds;
+ result.cur_row_size = cur_row_size;
result.cur_row_offset = cur_row_offset;
if (result.flds.max_element < num_flds)
{
@@ -566,6 +572,7 @@ hstcpcli::get_next_row()
((string_ref *) flds.buffer)[i] = string_ref(fld_begin, wp);
}
}
+ cur_row_size = start - (readbuf.begin() + cur_row_offset);
cur_row_offset = start - readbuf.begin();
return (string_ref *) flds.buffer;
}
@@ -597,10 +604,24 @@ hstcpcli::get_next_row_from_result(hstresult& result)
((string_ref *) result.flds.buffer)[i] = string_ref(fld_begin, wp);
}
}
+ result.cur_row_size =
+ start - (result.readbuf.begin() + result.cur_row_offset);
result.cur_row_offset = start - result.readbuf.begin();
return (string_ref *) result.flds.buffer;
}
+size_t
+hstcpcli::get_row_size()
+{
+ return cur_row_size;
+}
+
+size_t
+hstcpcli::get_row_size_from_result(hstresult& result)
+{
+ return result.cur_row_size;
+}
+
void
hstcpcli::response_buf_remove()
{
diff --git a/storage/spider/hs_client/hstcpcli.hpp b/storage/spider/hs_client/hstcpcli.hpp
index d153b19cf9b..6894716e469 100644
--- a/storage/spider/hs_client/hstcpcli.hpp
+++ b/storage/spider/hs_client/hstcpcli.hpp
@@ -46,6 +46,7 @@ struct hstresult {
size_t response_end_offset;
size_t num_flds;
size_t cur_row_offset;
+ size_t cur_row_size;
DYNAMIC_ARRAY flds;
};
@@ -71,6 +72,8 @@ struct hstcpcli_i {
virtual int get_result(hstresult& result) = 0;
virtual const string_ref *get_next_row() = 0;
virtual const string_ref *get_next_row_from_result(hstresult& result) = 0;
+ virtual size_t get_row_size() = 0;
+ virtual size_t get_row_size_from_result(hstresult& result) = 0;
virtual void response_buf_remove() = 0;
virtual int get_error_code() = 0;
virtual String& get_error() = 0;
diff --git a/storage/spider/hs_client/socket.cpp b/storage/spider/hs_client/socket.cpp
index 0717acf0da1..45b8100e64c 100644
--- a/storage/spider/hs_client/socket.cpp
+++ b/storage/spider/hs_client/socket.cpp
@@ -3,11 +3,12 @@
/*
* Copyright (C) 2010-2011 DeNA Co.,Ltd.. All rights reserved.
- * Copyright (C) 2011 Kentoku SHIBA
+ * Copyright (C) 2011-2017 Kentoku SHIBA
* See COPYRIGHT.txt for details.
*/
#include <my_global.h>
+#include <my_config.h>
#ifndef __WIN__
#include <sys/types.h>
#include <sys/un.h>
@@ -223,7 +224,7 @@ socket_set_options(auto_file& fd, const socket_args& args, String& err_r)
int
socket_open(auto_file& fd, const socket_args& args, String& err_r)
{
- fd.reset((int)socket(args.family, args.socktype, args.protocol));
+ fd.reset((int) socket(args.family, args.socktype, args.protocol));
if (fd.get() < 0) {
return errno_string("socket", errno, err_r);
}
@@ -253,7 +254,7 @@ socket_connect(auto_file& fd, const socket_args& args, String& err_r)
int
socket_bind(auto_file& fd, const socket_args& args, String& err_r)
{
- fd.reset((int)socket(args.family, args.socktype, args.protocol));
+ fd.reset((int) socket(args.family, args.socktype, args.protocol));
if (fd.get() < 0) {
return errno_string("socket", errno, err_r);
}
@@ -300,8 +301,8 @@ int
socket_accept(int listen_fd, auto_file& fd, const socket_args& args,
sockaddr_storage& addr_r, socklen_t& addrlen_r, String& err_r)
{
- fd.reset((int)accept(listen_fd, reinterpret_cast<sockaddr *>(&addr_r),
- &addrlen_r));
+ fd.reset((int) accept(listen_fd, reinterpret_cast<sockaddr *>(&addr_r),
+ &addrlen_r));
if (fd.get() < 0) {
return errno_string("accept", errno, err_r);
}
diff --git a/storage/spider/hs_client/string_util.cpp b/storage/spider/hs_client/string_util.cpp
index 9cf2f04d5b6..39934148cb8 100644
--- a/storage/spider/hs_client/string_util.cpp
+++ b/storage/spider/hs_client/string_util.cpp
@@ -3,7 +3,7 @@
/*
* Copyright (C) 2010-2011 DeNA Co.,Ltd.. All rights reserved.
- * Copyright (C) 2011 Kentoku SHIBA
+ * Copyright (C) 2011-2017 Kentoku SHIBA
* See COPYRIGHT.txt for details.
*/
diff --git a/storage/spider/mysql-test/spider/bg/r/direct_aggregate.result b/storage/spider/mysql-test/spider/bg/r/direct_aggregate.result
index 9a8660ba79e..ede48906a84 100644
--- a/storage/spider/mysql-test/spider/bg/r/direct_aggregate.result
+++ b/storage/spider/mysql-test/spider/bg/r/direct_aggregate.result
@@ -60,25 +60,25 @@ MAX(a)
5
SHOW STATUS LIKE 'Spider_direct_aggregate';
Variable_name Value
-Spider_direct_aggregate 0
+Spider_direct_aggregate 1
SELECT MIN(a) FROM ta_l;
MIN(a)
1
SHOW STATUS LIKE 'Spider_direct_aggregate';
Variable_name Value
-Spider_direct_aggregate 0
+Spider_direct_aggregate 2
SELECT MAX(a) FROM ta_l WHERE a < 5;
MAX(a)
4
SHOW STATUS LIKE 'Spider_direct_aggregate';
Variable_name Value
-Spider_direct_aggregate 0
+Spider_direct_aggregate 3
SELECT MIN(a) FROM ta_l WHERE a > 1;
MIN(a)
2
SHOW STATUS LIKE 'Spider_direct_aggregate';
Variable_name Value
-Spider_direct_aggregate 0
+Spider_direct_aggregate 4
deinit
connection master_1;
diff --git a/storage/spider/mysql-test/spider/bg/r/direct_aggregate_part.result b/storage/spider/mysql-test/spider/bg/r/direct_aggregate_part.result
index 760b39e16d5..02cdc033a88 100644
--- a/storage/spider/mysql-test/spider/bg/r/direct_aggregate_part.result
+++ b/storage/spider/mysql-test/spider/bg/r/direct_aggregate_part.result
@@ -44,31 +44,31 @@ COUNT(*)
5
SHOW STATUS LIKE 'Spider_direct_aggregate';
Variable_name Value
-Spider_direct_aggregate 0
+Spider_direct_aggregate 2
SELECT MAX(a) FROM ta_l2;
MAX(a)
5
SHOW STATUS LIKE 'Spider_direct_aggregate';
Variable_name Value
-Spider_direct_aggregate 0
+Spider_direct_aggregate 4
SELECT MIN(a) FROM ta_l2;
MIN(a)
1
SHOW STATUS LIKE 'Spider_direct_aggregate';
Variable_name Value
-Spider_direct_aggregate 0
+Spider_direct_aggregate 6
SELECT MAX(a) FROM ta_l2 WHERE a < 5;
MAX(a)
4
SHOW STATUS LIKE 'Spider_direct_aggregate';
Variable_name Value
-Spider_direct_aggregate 0
+Spider_direct_aggregate 8
SELECT MIN(a) FROM ta_l2 WHERE a > 1;
MIN(a)
2
SHOW STATUS LIKE 'Spider_direct_aggregate';
Variable_name Value
-Spider_direct_aggregate 0
+Spider_direct_aggregate 10
deinit
connection master_1;
diff --git a/storage/spider/mysql-test/spider/bg/r/direct_update.result b/storage/spider/mysql-test/spider/bg/r/direct_update.result
index 74dae7aec2e..0e536d48617 100644
--- a/storage/spider/mysql-test/spider/bg/r/direct_update.result
+++ b/storage/spider/mysql-test/spider/bg/r/direct_update.result
@@ -48,6 +48,7 @@ direct_updating test
connection master_1;
SHOW STATUS LIKE 'Spider_direct_update';
Variable_name Value
+Spider_direct_update 0
SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a;
a b date_format(c, '%Y-%m-%d %H:%i:%s')
1 a 2008-08-01 10:21:39
@@ -59,6 +60,7 @@ update all rows with function
UPDATE ta_l SET c = ADDDATE(c, 1);
SHOW STATUS LIKE 'Spider_direct_update';
Variable_name Value
+Spider_direct_update 1
SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a;
a b date_format(c, '%Y-%m-%d %H:%i:%s')
1 a 2008-08-02 10:21:39
@@ -70,6 +72,7 @@ update by primary key
UPDATE ta_l SET b = 'x' WHERE a = 3;
SHOW STATUS LIKE 'Spider_direct_update';
Variable_name Value
+Spider_direct_update 2
SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a;
a b date_format(c, '%Y-%m-%d %H:%i:%s')
1 a 2008-08-02 10:21:39
@@ -81,6 +84,7 @@ update by a column without index
UPDATE ta_l SET c = '2011-10-17' WHERE b = 'x';
SHOW STATUS LIKE 'Spider_direct_update';
Variable_name Value
+Spider_direct_update 3
SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a;
a b date_format(c, '%Y-%m-%d %H:%i:%s')
1 a 2008-08-02 10:21:39
@@ -92,6 +96,7 @@ update by primary key with order and limit
UPDATE ta_l SET c = ADDDATE(c, 1) WHERE a < 4 ORDER BY b DESC LIMIT 1;
SHOW STATUS LIKE 'Spider_direct_update';
Variable_name Value
+Spider_direct_update 4
SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a;
a b date_format(c, '%Y-%m-%d %H:%i:%s')
1 a 2008-08-02 10:21:39
@@ -103,6 +108,7 @@ delete by primary key with order and limit
DELETE FROM ta_l WHERE a < 4 ORDER BY c LIMIT 1;
SHOW STATUS LIKE 'Spider_direct_delete';
Variable_name Value
+Spider_direct_delete 1
SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a;
a b date_format(c, '%Y-%m-%d %H:%i:%s')
1 a 2008-08-02 10:21:39
@@ -113,6 +119,7 @@ delete by a column without index
DELETE FROM ta_l WHERE b = 'c';
SHOW STATUS LIKE 'Spider_direct_delete';
Variable_name Value
+Spider_direct_delete 2
SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a;
a b date_format(c, '%Y-%m-%d %H:%i:%s')
1 a 2008-08-02 10:21:39
@@ -122,6 +129,7 @@ delete by primary key
DELETE FROM ta_l WHERE a = 3;
SHOW STATUS LIKE 'Spider_direct_delete';
Variable_name Value
+Spider_direct_delete 3
SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a;
a b date_format(c, '%Y-%m-%d %H:%i:%s')
1 a 2008-08-02 10:21:39
diff --git a/storage/spider/mysql-test/spider/bg/r/direct_update_part.result b/storage/spider/mysql-test/spider/bg/r/direct_update_part.result
index 6db7c01f563..7069cd72fda 100644
--- a/storage/spider/mysql-test/spider/bg/r/direct_update_part.result
+++ b/storage/spider/mysql-test/spider/bg/r/direct_update_part.result
@@ -38,6 +38,7 @@ PRIMARY KEY(a)
) MASTER_1_ENGINE MASTER_1_COMMENT2_P_2_1
SHOW STATUS LIKE 'Spider_direct_update';
Variable_name Value
+Spider_direct_update 0
SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 ORDER BY a;
a b date_format(c, '%Y-%m-%d %H:%i:%s')
1 a 2008-08-01 10:21:39
@@ -49,6 +50,7 @@ update all rows with function
UPDATE ta_l2 SET c = ADDDATE(c, 1);
SHOW STATUS LIKE 'Spider_direct_update';
Variable_name Value
+Spider_direct_update 2
SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 ORDER BY a;
a b date_format(c, '%Y-%m-%d %H:%i:%s')
1 a 2008-08-02 10:21:39
@@ -60,6 +62,7 @@ update by primary key
UPDATE ta_l2 SET b = 'x' WHERE a = 3;
SHOW STATUS LIKE 'Spider_direct_update';
Variable_name Value
+Spider_direct_update 3
SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 ORDER BY a;
a b date_format(c, '%Y-%m-%d %H:%i:%s')
1 a 2008-08-02 10:21:39
@@ -71,6 +74,7 @@ update by a column without index
UPDATE ta_l2 SET c = '2011-10-17' WHERE b = 'x';
SHOW STATUS LIKE 'Spider_direct_update';
Variable_name Value
+Spider_direct_update 5
SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 ORDER BY a;
a b date_format(c, '%Y-%m-%d %H:%i:%s')
1 a 2008-08-02 10:21:39
@@ -82,6 +86,7 @@ update by primary key with order and limit
UPDATE ta_l2 SET c = ADDDATE(c, 1) WHERE a < 4 ORDER BY b DESC LIMIT 1;
SHOW STATUS LIKE 'Spider_direct_update';
Variable_name Value
+Spider_direct_update 6
SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 ORDER BY a;
a b date_format(c, '%Y-%m-%d %H:%i:%s')
1 a 2008-08-02 10:21:39
@@ -93,6 +98,7 @@ delete by primary key with order and limit
DELETE FROM ta_l2 WHERE a < 4 ORDER BY c LIMIT 1;
SHOW STATUS LIKE 'Spider_direct_delete';
Variable_name Value
+Spider_direct_delete 1
SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 ORDER BY a;
a b date_format(c, '%Y-%m-%d %H:%i:%s')
1 a 2008-08-02 10:21:39
@@ -103,6 +109,7 @@ delete by a column without index
DELETE FROM ta_l2 WHERE b = 'c';
SHOW STATUS LIKE 'Spider_direct_delete';
Variable_name Value
+Spider_direct_delete 3
SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 ORDER BY a;
a b date_format(c, '%Y-%m-%d %H:%i:%s')
1 a 2008-08-02 10:21:39
@@ -112,6 +119,7 @@ delete by primary key
DELETE FROM ta_l2 WHERE a = 3;
SHOW STATUS LIKE 'Spider_direct_delete';
Variable_name Value
+Spider_direct_delete 4
SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 ORDER BY a;
a b date_format(c, '%Y-%m-%d %H:%i:%s')
1 a 2008-08-02 10:21:39
diff --git a/storage/spider/mysql-test/spider/bg/r/spider_fixes.result b/storage/spider/mysql-test/spider/bg/r/spider_fixes.result
index f50c9822534..1db31ca9f95 100644
--- a/storage/spider/mysql-test/spider/bg/r/spider_fixes.result
+++ b/storage/spider/mysql-test/spider/bg/r/spider_fixes.result
@@ -461,6 +461,7 @@ Error 1146 Table 'auto_test_remote.ter1_1' doesn't exist
DELETE FROM t1;
Warnings:
Error 12702 Remote table 'auto_test_remote.ter1_1' is not found
+Error 12702 Remote table 'auto_test_remote.ter1_1' is not found
Error 1146 Table 'auto_test_remote.ter1_1' doesn't exist
TRUNCATE t1;
Warnings:
diff --git a/storage/spider/mysql-test/spider/bugfix/include/checksum_table_with_quick_mode_3_deinit.inc b/storage/spider/mysql-test/spider/bugfix/include/checksum_table_with_quick_mode_3_deinit.inc
new file mode 100644
index 00000000000..47f6df9437e
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/include/checksum_table_with_quick_mode_3_deinit.inc
@@ -0,0 +1,14 @@
+--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
+--connection master_1
+set session spider_quick_mode= @old_spider_quick_mode;
+set session spider_quick_page_size= @old_spider_quick_page_size;
+--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/checksum_table_with_quick_mode_3_init.inc b/storage/spider/mysql-test/spider/bugfix/include/checksum_table_with_quick_mode_3_init.inc
new file mode 100644
index 00000000000..bf2d9163b9a
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/include/checksum_table_with_quick_mode_3_init.inc
@@ -0,0 +1,29 @@
+--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 $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 %';
+--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;
diff --git a/storage/spider/mysql-test/spider/bugfix/include/direct_sql_with_tmp_table_deinit.inc b/storage/spider/mysql-test/spider/bugfix/include/direct_sql_with_tmp_table_deinit.inc
new file mode 100644
index 00000000000..ecb5622af14
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/include/direct_sql_with_tmp_table_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/bugfix/include/direct_sql_with_tmp_table_init.inc b/storage/spider/mysql-test/spider/bugfix/include/direct_sql_with_tmp_table_init.inc
new file mode 100644
index 00000000000..7b58bd3e726
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/include/direct_sql_with_tmp_table_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 $DIRECT_SQL_COMMAND=
+ SELECT spider_direct_sql('SELECT 22', 'tmp_a', 'srv "s_2_1", database "test"');
diff --git a/storage/spider/mysql-test/spider/bugfix/include/mdev_20100_deinit.inc b/storage/spider/mysql-test/spider/bugfix/include/mdev_20100_deinit.inc
new file mode 100644
index 00000000000..1880a1c7bba
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/include/mdev_20100_deinit.inc
@@ -0,0 +1,11 @@
+--let $MASTER_1_COMMENT_P_2_1= $MASTER_1_COMMENT_P_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
+--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/mdev_20100_init.inc b/storage/spider/mysql-test/spider/bugfix/include/mdev_20100_init.inc
new file mode 100644
index 00000000000..ed6e27962d2
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/include/mdev_20100_init.inc
@@ -0,0 +1,46 @@
+--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_P_2_1_BACKUP= $MASTER_1_COMMENT_P_2_1
+let $MASTER_1_COMMENT_P_2_1=
+ PARTITION BY RANGE(a) (
+ PARTITION pt1 VALUES LESS THAN (5) COMMENT='srv "s_2_1", table "ta_r2"',
+ PARTITION pt2 VALUES LESS THAN (10) COMMENT='srv "s_2_1", table "ta_r3"',
+ PARTITION pt3 VALUES LESS THAN MAXVALUE COMMENT='srv "s_2_1", table "ta_r4"'
+ );
+--let $CHILD2_1_DROP_TABLES_BACKUP= $CHILD2_1_DROP_TABLES
+let $CHILD2_1_DROP_TABLES=
+ DROP TABLE IF EXISTS ta_r2 $STR_SEMICOLON
+ DROP TABLE IF EXISTS ta_r3 $STR_SEMICOLON
+ DROP TABLE IF EXISTS ta_r4;
+--let $CHILD2_1_CREATE_TABLES_BACKUP= $CHILD2_1_CREATE_TABLES
+let $CHILD2_1_CREATE_TABLES=
+ CREATE TABLE ta_r2 (
+ a INT,
+ b CHAR(1),
+ c DATETIME,
+ PRIMARY KEY(a)
+ ) $CHILD2_1_ENGINE $CHILD2_1_CHARSET $STR_SEMICOLON
+ CREATE TABLE ta_r3 (
+ a INT,
+ b CHAR(1),
+ c DATETIME,
+ PRIMARY KEY(a)
+ ) $CHILD2_1_ENGINE $CHILD2_1_CHARSET $STR_SEMICOLON
+ CREATE TABLE ta_r4 (
+ a INT,
+ b CHAR(1),
+ c DATETIME,
+ PRIMARY KEY(a)
+ ) $CHILD2_1_ENGINE $CHILD2_1_CHARSET;
+--let $CHILD2_1_SELECT_TABLES_BACKUP= $CHILD2_1_SELECT_TABLES
+let $CHILD2_1_SELECT_TABLES=
+ SELECT a, b, c FROM ta_r2 ORDER BY a $STR_SEMICOLON
+ SELECT a, b, c FROM ta_r3 ORDER BY a $STR_SEMICOLON
+ SELECT a, b, c FROM ta_r4 ORDER BY a;
+let $CHILD2_1_SELECT_ARGUMENT1=
+ SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
diff --git a/storage/spider/mysql-test/spider/bugfix/include/mdev_20502_deinit.inc b/storage/spider/mysql-test/spider/bugfix/include/mdev_20502_deinit.inc
new file mode 100644
index 00000000000..76b7582abfe
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/include/mdev_20502_deinit.inc
@@ -0,0 +1,11 @@
+--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
+--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/mdev_20502_init.inc b/storage/spider/mysql-test/spider/bugfix/include/mdev_20502_init.inc
new file mode 100644
index 00000000000..fd8cc0d8170
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/include/mdev_20502_init.inc
@@ -0,0 +1,25 @@
+--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 $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 (
+ id int(10) unsigned NOT NULL AUTO_INCREMENT,
+ val int(10) unsigned DEFAULT NULL,
+ PRIMARY KEY (id)
+ ) $CHILD2_1_ENGINE $CHILD2_1_CHARSET;
+--let $CHILD2_1_SELECT_TABLES_BACKUP= $CHILD2_1_SELECT_TABLES
+let $CHILD2_1_SELECT_TABLES=
+ SELECT id, val FROM tbl_a ORDER BY id;
+let $CHILD2_1_SELECT_ARGUMENT1=
+ SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
diff --git a/storage/spider/mysql-test/spider/bugfix/include/mdev_21884_deinit.inc b/storage/spider/mysql-test/spider/bugfix/include/mdev_21884_deinit.inc
new file mode 100644
index 00000000000..74efe3a274c
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/include/mdev_21884_deinit.inc
@@ -0,0 +1,14 @@
+--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
+--connection master_1
+set session spider_bgs_mode= @old_spider_bgs_mode;
+set session spider_quick_mode= @old_spider_quick_mode;
+--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/mdev_21884_init.inc b/storage/spider/mysql-test/spider/bugfix/include/mdev_21884_init.inc
new file mode 100644
index 00000000000..25455ffcdf1
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/include/mdev_21884_init.inc
@@ -0,0 +1,57 @@
+--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_P_2_1_BACKUP= $MASTER_1_COMMENT_P_2_1
+let $MASTER_1_COMMENT_P_2_1=
+ COMMENT='table "ta_r3"'
+ PARTITION BY RANGE(a) (
+ PARTITION pt1 VALUES LESS THAN (10) COMMENT='srv "s_2_1", table "ta_r2",
+ priority "1000"',
+ PARTITION pt2 VALUES LESS THAN MAXVALUE COMMENT='srv "s_2_1", priority "1000001"'
+ );
+--let $CHILD2_1_DROP_TABLES_BACKUP= $CHILD2_1_DROP_TABLES
+let $CHILD2_1_DROP_TABLES=
+ DROP TABLE IF EXISTS tbl_a;
+let $CHILD2_1_DROP_TABLES=
+ DROP TABLE IF EXISTS ta_r2 $STR_SEMICOLON
+ DROP TABLE IF EXISTS ta_r3;
+--let $CHILD2_1_CREATE_TABLES_BACKUP= $CHILD2_1_CREATE_TABLES
+let $CHILD2_1_CREATE_TABLES=
+ CREATE TABLE tbl_a (
+ pkey int NOT NULL,
+ txt char(8) NOT NULL,
+ PRIMARY KEY (pkey, txt)
+ ) $CHILD2_1_ENGINE DEFAULT CHARACTER SET utf8;
+let $CHILD2_1_CREATE_TABLES=
+ CREATE TABLE ta_r2 (
+ a INT,
+ b CHAR(1),
+ c DATETIME,
+ PRIMARY KEY(a,b)
+ ) $CHILD2_1_ENGINE $CHILD2_1_CHARSET $STR_SEMICOLON
+ CREATE TABLE ta_r3 (
+ a INT,
+ b CHAR(1),
+ c DATETIME,
+ PRIMARY KEY(a,b)
+ ) $CHILD2_1_ENGINE $CHILD2_1_CHARSET;
+--let $CHILD2_1_SELECT_TABLES_BACKUP= $CHILD2_1_SELECT_TABLES
+let $CHILD2_1_SELECT_TABLES=
+ SELECT pkey, txt FROM tbl_a ORDER BY pkey;
+let $CHILD2_1_SELECT_TABLES=
+ SELECT a, b, c FROM ta_r2 ORDER BY a $STR_SEMICOLON
+ SELECT a, b, c FROM ta_r3 ORDER BY a;
+let $CHILD2_1_SELECT_ARGUMENT1=
+ SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+--connection master_1
+set @old_spider_bgs_mode= @@spider_bgs_mode;
+set session spider_bgs_mode= 2;
+set @old_spider_quick_mode= @@spider_quick_mode;
+set session spider_quick_mode= 3;
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
new file mode 100644
index 00000000000..42124a794ea
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/include/quick_mode_0_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_0_init.inc b/storage/spider/mysql-test/spider/bugfix/include/quick_mode_0_init.inc
new file mode 100644
index 00000000000..2656517216c
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/include/quick_mode_0_init.inc
@@ -0,0 +1,51 @@
+--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 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
new file mode 100644
index 00000000000..42124a794ea
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/include/quick_mode_1_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_1_init.inc b/storage/spider/mysql-test/spider/bugfix/include/quick_mode_1_init.inc
new file mode 100644
index 00000000000..9a8de407569
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/include/quick_mode_1_init.inc
@@ -0,0 +1,51 @@
+--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 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
new file mode 100644
index 00000000000..42124a794ea
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/include/quick_mode_2_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_2_init.inc b/storage/spider/mysql-test/spider/bugfix/include/quick_mode_2_init.inc
new file mode 100644
index 00000000000..dbe3f703a2f
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/include/quick_mode_2_init.inc
@@ -0,0 +1,51 @@
+--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 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
new file mode 100644
index 00000000000..42124a794ea
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/include/quick_mode_3_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_3_init.inc b/storage/spider/mysql-test/spider/bugfix/include/quick_mode_3_init.inc
new file mode 100644
index 00000000000..81239206dfc
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/include/quick_mode_3_init.inc
@@ -0,0 +1,51 @@
+--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 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/select_by_null_deinit.inc b/storage/spider/mysql-test/spider/bugfix/include/select_by_null_deinit.inc
new file mode 100644
index 00000000000..76b7582abfe
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/include/select_by_null_deinit.inc
@@ -0,0 +1,11 @@
+--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
+--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/select_by_null_init.inc b/storage/spider/mysql-test/spider/bugfix/include/select_by_null_init.inc
new file mode 100644
index 00000000000..d07ba2a9fee
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/include/select_by_null_init.inc
@@ -0,0 +1,24 @@
+--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 $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 %';
diff --git a/storage/spider/mysql-test/spider/bugfix/include/slave_trx_isolation_deinit.inc b/storage/spider/mysql-test/spider/bugfix/include/slave_trx_isolation_deinit.inc
new file mode 100644
index 00000000000..7c20b2bc99e
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/include/slave_trx_isolation_deinit.inc
@@ -0,0 +1,15 @@
+--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
+--connection slave1_1
+set global spider_slave_trx_isolation= @old_spider_slave_trx_isolation;
+--disable_warnings
+--disable_query_log
+--disable_result_log
+--source ../include/deinit_spider.inc
+--source ../t/slave_test_deinit.inc
+--source ../t/test_deinit.inc
+--enable_result_log
+--enable_query_log
+--enable_warnings
diff --git a/storage/spider/mysql-test/spider/bugfix/include/slave_trx_isolation_init.inc b/storage/spider/mysql-test/spider/bugfix/include/slave_trx_isolation_init.inc
new file mode 100644
index 00000000000..3a058a55303
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/include/slave_trx_isolation_init.inc
@@ -0,0 +1,35 @@
+--disable_warnings
+--disable_query_log
+--disable_result_log
+--source ../t/test_init.inc
+--source ../t/slave_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 $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 '%set %';
+--connection slave1_1
+--disable_warnings
+--disable_query_log
+--disable_result_log
+--source ../include/init_spider.inc
+--enable_result_log
+--enable_query_log
+--enable_warnings
+set @old_spider_slave_trx_isolation= @@spider_slave_trx_isolation;
+set global spider_slave_trx_isolation= 1;
diff --git a/storage/spider/mysql-test/spider/bugfix/include/wrapper_mariadb_deinit.inc b/storage/spider/mysql-test/spider/bugfix/include/wrapper_mariadb_deinit.inc
new file mode 100644
index 00000000000..76b7582abfe
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/include/wrapper_mariadb_deinit.inc
@@ -0,0 +1,11 @@
+--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
+--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/wrapper_mariadb_init.inc b/storage/spider/mysql-test/spider/bugfix/include/wrapper_mariadb_init.inc
new file mode 100644
index 00000000000..df3d44c39bc
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/include/wrapper_mariadb_init.inc
@@ -0,0 +1,24 @@
+--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", wrapper "mariadb"';
+--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 %';
diff --git a/storage/spider/mysql-test/spider/bugfix/my.cnf b/storage/spider/mysql-test/spider/bugfix/my.cnf
new file mode 100644
index 00000000000..b7f76a630cc
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/my.cnf
@@ -0,0 +1,2 @@
+!include include/default_mysqld.cnf
+!include my_1_1.cnf
diff --git a/storage/spider/mysql-test/spider/bugfix/my_1_1.cnf b/storage/spider/mysql-test/spider/bugfix/my_1_1.cnf
new file mode 100644
index 00000000000..5f17295d895
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/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/bugfix/my_2_1.cnf b/storage/spider/mysql-test/spider/bugfix/my_2_1.cnf
new file mode 100644
index 00000000000..24161645607
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/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/bugfix/my_2_2.cnf b/storage/spider/mysql-test/spider/bugfix/my_2_2.cnf
new file mode 100644
index 00000000000..2d3c2a89a7d
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/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/bugfix/my_2_3.cnf b/storage/spider/mysql-test/spider/bugfix/my_2_3.cnf
new file mode 100644
index 00000000000..024da651e0c
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/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/bugfix/my_3_1.cnf b/storage/spider/mysql-test/spider/bugfix/my_3_1.cnf
new file mode 100644
index 00000000000..fad21607789
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/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/bugfix/my_3_2.cnf b/storage/spider/mysql-test/spider/bugfix/my_3_2.cnf
new file mode 100644
index 00000000000..6f027b6f525
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/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/bugfix/my_3_3.cnf b/storage/spider/mysql-test/spider/bugfix/my_3_3.cnf
new file mode 100644
index 00000000000..fbb33694738
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/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/bugfix/my_4_1.cnf b/storage/spider/mysql-test/spider/bugfix/my_4_1.cnf
new file mode 100644
index 00000000000..d1812a48b68
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/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/bugfix/r/checksum_table_with_quick_mode_3.result b/storage/spider/mysql-test/spider/bugfix/r/checksum_table_with_quick_mode_3.result
new file mode 100644
index 00000000000..eae4895411e
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/r/checksum_table_with_quick_mode_3.result
@@ -0,0 +1,100 @@
+for master_1
+for child2
+child2_1
+child2_2
+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;
+
+this test is for MDEV-16279
+
+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;
+USE auto_test_remote;
+
+create table and insert
+connection child2_1;
+CHILD2_1_CREATE_TABLES
+TRUNCATE TABLE mysql.general_log;
+connection master_1;
+CREATE TABLE tbl_a (
+pkey int NOT NULL,
+PRIMARY KEY (pkey)
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_1
+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);
+FLUSH TABLES;
+
+select test 1
+connection child2_1;
+TRUNCATE TABLE mysql.general_log;
+connection master_1;
+CHECKSUM TABLE tbl_a EXTENDED;
+Table Checksum
+auto_test_local.tbl_a 1061386331
+connection child2_1;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select `pkey` from `auto_test_remote`.`tbl_a`
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT pkey FROM tbl_a ORDER BY pkey;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+
+deinit
+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 master_1;
+set session spider_quick_mode= @old_spider_quick_mode;
+set session spider_quick_page_size= @old_spider_quick_page_size;
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+
+end of test
diff --git a/storage/spider/mysql-test/spider/bugfix/r/direct_sql_with_tmp_table.result b/storage/spider/mysql-test/spider/bugfix/r/direct_sql_with_tmp_table.result
new file mode 100644
index 00000000000..65beb8a43dd
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/r/direct_sql_with_tmp_table.result
@@ -0,0 +1,33 @@
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+
+drop and create databases
+connection master_1;
+CREATE DATABASE auto_test_local;
+USE auto_test_local;
+CREATE TEMPORARY TABLE tmp_a (
+pkey int NOT NULL,
+PRIMARY KEY (pkey)
+) MASTER_1_ENGINE2
+SELECT spider_direct_sql('SELECT 22', 'tmp_a', 'srv "s_2_1", database "test"');
+spider_direct_sql('SELECT 22', 'tmp_a', 'srv "s_2_1", database "test"')
+1
+SELECT pkey FROM tmp_a;
+pkey
+22
+
+deinit
+connection master_1;
+DROP DATABASE IF EXISTS auto_test_local;
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+
+end of test
diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_20100.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_20100.result
new file mode 100644
index 00000000000..fc4fb02d72f
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_20100.result
@@ -0,0 +1,119 @@
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+
+this test is for MDEV-20100
+
+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;
+USE auto_test_remote;
+
+create table and insert
+connection child2_1;
+CHILD2_1_CREATE_TABLES
+TRUNCATE TABLE mysql.general_log;
+connection master_1;
+CREATE TABLE tbl_a (
+a INT,
+b CHAR(1),
+c DATETIME,
+PRIMARY KEY(a)
+) ENGINE=Spider PARTITION BY RANGE(a) (
+PARTITION pt1 VALUES LESS THAN (5) COMMENT='srv "s_2_1", table "ta_r2"',
+PARTITION pt2 VALUES LESS THAN (10) COMMENT='srv "s_2_1", table "ta_r3"',
+PARTITION pt3 VALUES LESS THAN MAXVALUE COMMENT='srv "s_2_1", table "ta_r4"'
+ )
+INSERT INTO tbl_a (a, b, c) VALUES
+(1, 'a', '2008-08-01 10:21:39'),
+(2, 'b', '2000-01-01 00:00:00'),
+(3, 'e', '2007-06-04 20:03:11'),
+(4, 'd', '2003-11-30 05:01:03'),
+(5, 'c', '2001-12-31 23:59:59');
+
+test 1
+connection child2_1;
+TRUNCATE TABLE mysql.general_log;
+connection master_1;
+SELECT a, b, c FROM tbl_a PARTITION (pt2) WHERE b = 'c';
+a b c
+5 c 2001-12-31 23:59:59
+SELECT a, b, c FROM tbl_a PARTITION (pt1,pt2);
+a b c
+1 a 2008-08-01 10:21:39
+2 b 2000-01-01 00:00:00
+3 e 2007-06-04 20:03:11
+4 d 2003-11-30 05:01:03
+5 c 2001-12-31 23:59:59
+SELECT a, b, c FROM tbl_a PARTITION (pt3) WHERE b = 'c';
+a b c
+SELECT a, b, c FROM tbl_a PARTITION (pt1,pt2);
+a b c
+1 a 2008-08-01 10:21:39
+2 b 2000-01-01 00:00:00
+3 e 2007-06-04 20:03:11
+4 d 2003-11-30 05:01:03
+5 c 2001-12-31 23:59:59
+SELECT a, b, c FROM tbl_a PARTITION (pt1) WHERE b = 'c';
+a b c
+SELECT a, b, c FROM tbl_a PARTITION (pt1,pt3);
+a b c
+1 a 2008-08-01 10:21:39
+2 b 2000-01-01 00:00:00
+3 e 2007-06-04 20:03:11
+4 d 2003-11-30 05:01:03
+SELECT a, b, c FROM tbl_a PARTITION (pt1) WHERE b = 'c';
+a b c
+SELECT a, b, c FROM tbl_a PARTITION (pt2,pt3);
+a b c
+5 c 2001-12-31 23:59:59
+connection child2_1;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select `a`,`b`,`c` from `auto_test_remote`.`ta_r3` where (`b` = 'c')
+select `a`,`b`,`c` from `auto_test_remote`.`ta_r2`
+select `a`,`b`,`c` from `auto_test_remote`.`ta_r3`
+select `a`,`b`,`c` from `auto_test_remote`.`ta_r4` where (`b` = 'c')
+select `a`,`b`,`c` from `auto_test_remote`.`ta_r2`
+select `a`,`b`,`c` from `auto_test_remote`.`ta_r3`
+select `a`,`b`,`c` from `auto_test_remote`.`ta_r2` where (`b` = 'c')
+select `a`,`b`,`c` from `auto_test_remote`.`ta_r2`
+select `a`,`b`,`c` from `auto_test_remote`.`ta_r4`
+select `a`,`b`,`c` from `auto_test_remote`.`ta_r2` where (`b` = 'c')
+select `a`,`b`,`c` from `auto_test_remote`.`ta_r3`
+select `a`,`b`,`c` from `auto_test_remote`.`ta_r4`
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT a, b, c FROM ta_r2 ORDER BY a ;
+SELECT a, b, c FROM ta_r3 ORDER BY a ;
+SELECT a, b, c FROM ta_r4 ORDER BY a;
+a b c
+1 a 2008-08-01 10:21:39
+2 b 2000-01-01 00:00:00
+3 e 2007-06-04 20:03:11
+4 d 2003-11-30 05:01:03
+a b c
+5 c 2001-12-31 23:59:59
+a b c
+
+deinit
+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;
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+
+end of test
diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_20502.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_20502.result
new file mode 100644
index 00000000000..e5f16b81329
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_20502.result
@@ -0,0 +1,85 @@
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+
+this test is for MDEV-20502
+
+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;
+USE auto_test_remote;
+
+create table and insert
+connection child2_1;
+CHILD2_1_CREATE_TABLES
+TRUNCATE TABLE mysql.general_log;
+connection master_1;
+CREATE TABLE tbl_a (
+id int(10) unsigned NOT NULL AUTO_INCREMENT,
+val int(10) unsigned DEFAULT NULL,
+PRIMARY KEY(id)
+) ENGINE=Spider COMMENT='table "tbl_a", srv "s_2_1"'
+INSERT INTO tbl_a (val) VALUES (1);
+
+test 1
+connection child2_1;
+TRUNCATE TABLE mysql.general_log;
+connection master_1;
+SELECT id, 0 AS const, val FROM tbl_a;
+id const val
+1 0 1
+SELECT 1+2, id, 0 AS const, val, val+10, (SELECT tbl_a.val+1 FROM tbl_a) AS sq
+FROM tbl_a;
+1+2 id const val val+10 sq
+3 1 0 1 11 2
+INSERT INTO tbl_a (val) VALUES (2), (1);
+SELECT val+10, 0 AS const, val, (SELECT tbl_a.val+1 FROM tbl_a LIMIT 1) AS sq
+FROM tbl_a GROUP BY val;
+val+10 const val sq
+11 0 1 2
+12 0 2 2
+SELECT MAX(id) AS m, 0 AS const, val, (SELECT tbl_a.val+1 FROM tbl_a LIMIT 1) AS sq
+FROM tbl_a GROUP BY val;
+m const val sq
+3 0 1 2
+2 0 2 2
+connection child2_1;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select t0.`id` `id`,t0.`val` `val` from `auto_test_remote`.`tbl_a` t0
+select t0.`id` `id`,t0.`val` `val`,(t0.`val` + 10) `val+10` from `auto_test_remote`.`tbl_a` t0
+select (t0.`val` + 1) `tbl_a.val+1` from `auto_test_remote`.`tbl_a` t0
+select `id`,`val` from `auto_test_remote`.`tbl_a` order by `id` desc limit 1 for update
+select (t0.`val` + 10) `val+10`,t0.`val` `val` from `auto_test_remote`.`tbl_a` t0 group by t0.`val` order by t0.`val`
+select (t0.`val` + 1) `tbl_a.val+1` from `auto_test_remote`.`tbl_a` t0 limit 1
+select max(t0.`id`) `m`,t0.`val` `val` from `auto_test_remote`.`tbl_a` t0 group by t0.`val` order by t0.`val`
+select (t0.`val` + 1) `tbl_a.val+1` from `auto_test_remote`.`tbl_a` t0 limit 1
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT id, val FROM tbl_a ORDER BY id;
+id val
+1 1
+2 2
+3 1
+
+deinit
+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;
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+
+end of test
diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_21884.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_21884.result
new file mode 100644
index 00000000000..921744f7f76
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_21884.result
@@ -0,0 +1,107 @@
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+connection master_1;
+set @old_spider_bgs_mode= @@spider_bgs_mode;
+set session spider_bgs_mode= 2;
+set @old_spider_quick_mode= @@spider_quick_mode;
+set session spider_quick_mode= 3;
+
+this test is for MDEV-21884
+
+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;
+USE auto_test_remote;
+
+create table and insert
+connection child2_1;
+CHILD2_1_CREATE_TABLES
+TRUNCATE TABLE mysql.general_log;
+connection master_1;
+CREATE TABLE tbl_a (
+a INT,
+b CHAR(1),
+c DATETIME,
+PRIMARY KEY(a,b)
+) ENGINE=Spider COMMENT='table "ta_r3"'
+ PARTITION BY RANGE(a) (
+PARTITION pt1 VALUES LESS THAN (10) COMMENT='srv "s_2_1", table "ta_r2",
+ priority "1000"',
+PARTITION pt2 VALUES LESS THAN MAXVALUE COMMENT='srv "s_2_1", priority "1000001"'
+ )
+CREATE TABLE tb_l (
+a INT,
+b CHAR(1),
+c DATETIME,
+PRIMARY KEY(a)
+) MASTER_1_ENGINE2 MASTER_1_CHARSET2
+INSERT INTO tbl_a (a, b, c) VALUES
+(11, 'a', '2008-08-01 10:21:39'),
+(11, 'b', '2000-01-01 00:00:00'),
+(12, 'e', '2007-06-04 20:03:11'),
+(12, 'd', '2003-11-30 05:01:03'),
+(13, 'c', '2001-12-31 23:59:59');
+INSERT INTO tb_l (a, b, c) VALUES
+(11, 'a', '2008-08-01 10:21:39'),
+(12, 'b', '2000-01-01 00:00:00'),
+(13, 'e', '2007-06-04 20:03:11'),
+(14, 'd', '2003-11-30 05:01:03'),
+(15, 'c', '2001-12-31 23:59:59');
+
+test 1
+connection child2_1;
+TRUNCATE TABLE mysql.general_log;
+connection master_1;
+SELECT STRAIGHT_JOIN b.a, b.b FROM tb_l a, tbl_a b WHERE a.a = b.a;
+a b
+11 a
+11 b
+12 d
+12 e
+13 c
+connection child2_1;
+SET NAMES utf8;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select `a`,`b` from `auto_test_remote`.`ta_r3` where `a` = 11 order by `b`
+select `a`,`b` from `auto_test_remote`.`ta_r3` where `a` = 12 order by `b`
+select `a`,`b` from `auto_test_remote`.`ta_r3` where `a` = 13 order by `b`
+select `a`,`b` from `auto_test_remote`.`ta_r3` where `a` = 14 order by `b`
+select `a`,`b` from `auto_test_remote`.`ta_r3` where `a` = 15 order by `b`
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT a, b, c FROM ta_r2 ORDER BY a ;
+SELECT a, b, c FROM ta_r3 ORDER BY a;
+a b c
+a b c
+11 a 2008-08-01 10:21:39
+11 b 2000-01-01 00:00:00
+12 d 2003-11-30 05:01:03
+12 e 2007-06-04 20:03:11
+13 c 2001-12-31 23:59:59
+
+deinit
+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 master_1;
+set session spider_bgs_mode= @old_spider_bgs_mode;
+set session spider_quick_mode= @old_spider_quick_mode;
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+
+end of test
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
new file mode 100644
index 00000000000..6e5a0052370
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/r/quick_mode_0.result
@@ -0,0 +1,504 @@
+for master_1
+for child2
+child2_1
+child2_2
+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;
+
+this test is for MDEV-16520
+
+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;
+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;
+
+create table and insert
+connection child2_1;
+CHILD2_1_CREATE_TABLES
+TRUNCATE TABLE mysql.general_log;
+connection child2_2;
+CHILD2_2_CREATE_TABLES
+TRUNCATE TABLE mysql.general_log;
+connection master_1;
+CREATE TABLE tbl_a (
+pkey int NOT NULL,
+PRIMARY KEY (pkey)
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_1
+CREATE TABLE tbl_b (
+pkey int NOT NULL,
+PRIMARY KEY (pkey)
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_2
+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);
+
+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;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+connection child2_1;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select `pkey` from `auto_test_remote`.`tbl_a` order by `pkey`
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT pkey FROM tbl_a ORDER BY pkey;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+connection child2_2;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 0
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 1
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 2
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 3
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 4
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 5
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 6
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 7
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 8
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 9
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 10
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 11
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 12
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 13
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 14
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 15
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 16
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 17
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 18
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 19
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 20
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 21
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 22
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 23
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 24
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 25
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 26
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 27
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 28
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 29
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT pkey FROM tbl_b ORDER BY pkey;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+connection master_1;
+set session spider_quick_page_byte= 6;
+
+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;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+connection child2_1;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select `pkey` from `auto_test_remote`.`tbl_a` order by `pkey`
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT pkey FROM tbl_a ORDER BY pkey;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+connection child2_2;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 0
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 1
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 2
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 3
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 4
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 5
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 6
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 7
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 8
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 9
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 10
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 11
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 12
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 13
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 14
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 15
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 16
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 17
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 18
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 19
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 20
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 21
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 22
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 23
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 24
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 25
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 26
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 27
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 28
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 29
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT pkey FROM tbl_b ORDER BY pkey;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+connection master_1;
+set session spider_quick_page_byte= 0;
+
+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;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+connection child2_1;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select `pkey` from `auto_test_remote`.`tbl_a` order by `pkey`
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT pkey FROM tbl_a ORDER BY pkey;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+connection child2_2;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 0
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 1
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 2
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 3
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 4
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 5
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 6
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 7
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 8
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 9
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 10
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 11
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 12
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 13
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 14
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 15
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 16
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 17
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 18
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 19
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 20
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 21
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 22
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 23
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 24
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 25
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 26
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 27
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 28
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 29
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT pkey FROM tbl_b ORDER BY pkey;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+
+deinit
+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;
+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;
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+
+end of test
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
new file mode 100644
index 00000000000..bca6d172a49
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/r/quick_mode_1.result
@@ -0,0 +1,504 @@
+for master_1
+for child2
+child2_1
+child2_2
+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;
+
+this test is for MDEV-16520
+
+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;
+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;
+
+create table and insert
+connection child2_1;
+CHILD2_1_CREATE_TABLES
+TRUNCATE TABLE mysql.general_log;
+connection child2_2;
+CHILD2_2_CREATE_TABLES
+TRUNCATE TABLE mysql.general_log;
+connection master_1;
+CREATE TABLE tbl_a (
+pkey int NOT NULL,
+PRIMARY KEY (pkey)
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_1
+CREATE TABLE tbl_b (
+pkey int NOT NULL,
+PRIMARY KEY (pkey)
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_2
+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);
+
+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;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+connection child2_1;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select `pkey` from `auto_test_remote`.`tbl_a` order by `pkey`
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT pkey FROM tbl_a ORDER BY pkey;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+connection child2_2;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 0
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 1
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 2
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 3
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 4
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 5
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 6
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 7
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 8
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 9
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 10
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 11
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 12
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 13
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 14
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 15
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 16
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 17
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 18
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 19
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 20
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 21
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 22
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 23
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 24
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 25
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 26
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 27
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 28
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 29
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT pkey FROM tbl_b ORDER BY pkey;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+connection master_1;
+set session spider_quick_page_byte= 6;
+
+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;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+connection child2_1;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select `pkey` from `auto_test_remote`.`tbl_a` order by `pkey`
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT pkey FROM tbl_a ORDER BY pkey;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+connection child2_2;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 0
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 1
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 2
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 3
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 4
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 5
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 6
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 7
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 8
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 9
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 10
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 11
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 12
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 13
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 14
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 15
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 16
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 17
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 18
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 19
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 20
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 21
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 22
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 23
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 24
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 25
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 26
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 27
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 28
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 29
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT pkey FROM tbl_b ORDER BY pkey;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+connection master_1;
+set session spider_quick_page_byte= 0;
+
+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;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+connection child2_1;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select `pkey` from `auto_test_remote`.`tbl_a` order by `pkey`
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT pkey FROM tbl_a ORDER BY pkey;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+connection child2_2;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 0
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 1
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 2
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 3
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 4
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 5
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 6
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 7
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 8
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 9
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 10
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 11
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 12
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 13
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 14
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 15
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 16
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 17
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 18
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 19
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 20
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 21
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 22
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 23
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 24
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 25
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 26
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 27
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 28
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 29
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT pkey FROM tbl_b ORDER BY pkey;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+
+deinit
+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;
+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;
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+
+end of test
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
new file mode 100644
index 00000000000..61a7764dddb
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/r/quick_mode_2.result
@@ -0,0 +1,504 @@
+for master_1
+for child2
+child2_1
+child2_2
+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;
+
+this test is for MDEV-16520
+
+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;
+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;
+
+create table and insert
+connection child2_1;
+CHILD2_1_CREATE_TABLES
+TRUNCATE TABLE mysql.general_log;
+connection child2_2;
+CHILD2_2_CREATE_TABLES
+TRUNCATE TABLE mysql.general_log;
+connection master_1;
+CREATE TABLE tbl_a (
+pkey int NOT NULL,
+PRIMARY KEY (pkey)
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_1
+CREATE TABLE tbl_b (
+pkey int NOT NULL,
+PRIMARY KEY (pkey)
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_2
+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);
+
+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;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+connection child2_1;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select `pkey` from `auto_test_remote`.`tbl_a` order by `pkey`
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT pkey FROM tbl_a ORDER BY pkey;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+connection child2_2;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 0
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 1
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 2
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 3
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 4
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 5
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 6
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 7
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 8
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 9
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 10
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 11
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 12
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 13
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 14
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 15
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 16
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 17
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 18
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 19
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 20
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 21
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 22
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 23
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 24
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 25
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 26
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 27
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 28
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 29
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT pkey FROM tbl_b ORDER BY pkey;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+connection master_1;
+set session spider_quick_page_byte= 6;
+
+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;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+connection child2_1;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select `pkey` from `auto_test_remote`.`tbl_a` order by `pkey`
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT pkey FROM tbl_a ORDER BY pkey;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+connection child2_2;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 0
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 1
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 2
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 3
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 4
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 5
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 6
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 7
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 8
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 9
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 10
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 11
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 12
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 13
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 14
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 15
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 16
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 17
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 18
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 19
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 20
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 21
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 22
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 23
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 24
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 25
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 26
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 27
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 28
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 29
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT pkey FROM tbl_b ORDER BY pkey;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+connection master_1;
+set session spider_quick_page_byte= 0;
+
+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;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+connection child2_1;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select `pkey` from `auto_test_remote`.`tbl_a` order by `pkey`
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT pkey FROM tbl_a ORDER BY pkey;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+connection child2_2;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 0
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 1
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 2
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 3
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 4
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 5
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 6
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 7
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 8
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 9
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 10
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 11
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 12
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 13
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 14
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 15
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 16
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 17
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 18
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 19
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 20
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 21
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 22
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 23
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 24
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 25
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 26
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 27
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 28
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 29
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT pkey FROM tbl_b ORDER BY pkey;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+
+deinit
+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;
+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;
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+
+end of test
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
new file mode 100644
index 00000000000..38387a45509
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/r/quick_mode_3.result
@@ -0,0 +1,504 @@
+for master_1
+for child2
+child2_1
+child2_2
+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;
+
+this test is for MDEV-16520
+
+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;
+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;
+
+create table and insert
+connection child2_1;
+CHILD2_1_CREATE_TABLES
+TRUNCATE TABLE mysql.general_log;
+connection child2_2;
+CHILD2_2_CREATE_TABLES
+TRUNCATE TABLE mysql.general_log;
+connection master_1;
+CREATE TABLE tbl_a (
+pkey int NOT NULL,
+PRIMARY KEY (pkey)
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_1
+CREATE TABLE tbl_b (
+pkey int NOT NULL,
+PRIMARY KEY (pkey)
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_2
+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);
+
+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;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+connection child2_1;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select `pkey` from `auto_test_remote`.`tbl_a` order by `pkey`
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT pkey FROM tbl_a ORDER BY pkey;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+connection child2_2;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 0
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 1
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 2
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 3
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 4
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 5
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 6
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 7
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 8
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 9
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 10
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 11
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 12
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 13
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 14
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 15
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 16
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 17
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 18
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 19
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 20
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 21
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 22
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 23
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 24
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 25
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 26
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 27
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 28
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 29
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT pkey FROM tbl_b ORDER BY pkey;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+connection master_1;
+set session spider_quick_page_byte= 6;
+
+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;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+connection child2_1;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select `pkey` from `auto_test_remote`.`tbl_a` order by `pkey`
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT pkey FROM tbl_a ORDER BY pkey;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+connection child2_2;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 0
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 1
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 2
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 3
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 4
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 5
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 6
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 7
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 8
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 9
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 10
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 11
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 12
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 13
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 14
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 15
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 16
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 17
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 18
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 19
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 20
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 21
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 22
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 23
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 24
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 25
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 26
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 27
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 28
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 29
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT pkey FROM tbl_b ORDER BY pkey;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+connection master_1;
+set session spider_quick_page_byte= 0;
+
+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;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+connection child2_1;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select `pkey` from `auto_test_remote`.`tbl_a` order by `pkey`
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT pkey FROM tbl_a ORDER BY pkey;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+connection child2_2;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 0
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 1
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 2
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 3
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 4
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 5
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 6
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 7
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 8
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 9
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 10
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 11
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 12
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 13
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 14
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 15
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 16
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 17
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 18
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 19
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 20
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 21
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 22
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 23
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 24
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 25
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 26
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 27
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 28
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 29
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT pkey FROM tbl_b ORDER BY pkey;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+
+deinit
+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;
+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;
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+
+end of test
diff --git a/storage/spider/mysql-test/spider/bugfix/r/select_by_null.result b/storage/spider/mysql-test/spider/bugfix/r/select_by_null.result
new file mode 100644
index 00000000000..a7fa1b3b91f
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/r/select_by_null.result
@@ -0,0 +1,90 @@
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+
+this test is for MDEV-16279
+
+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;
+USE auto_test_remote;
+
+create table and insert
+connection child2_1;
+CHILD2_1_CREATE_TABLES
+TRUNCATE TABLE mysql.general_log;
+connection master_1;
+CREATE TABLE tbl_a (
+pkey int NOT NULL,
+PRIMARY KEY (pkey)
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_1
+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);
+FLUSH TABLES;
+
+select test 1
+connection child2_1;
+TRUNCATE TABLE mysql.general_log;
+connection master_1;
+SELECT pkey FROM tbl_a WHERE NULL;
+pkey
+connection child2_1;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT pkey FROM tbl_a ORDER BY pkey;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+
+deinit
+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;
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+
+end of test
diff --git a/storage/spider/mysql-test/spider/bugfix/r/slave_trx_isolation.result b/storage/spider/mysql-test/spider/bugfix/r/slave_trx_isolation.result
new file mode 100644
index 00000000000..06581a604a2
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/r/slave_trx_isolation.result
@@ -0,0 +1,99 @@
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+for slave1_1
+connection slave1_1;
+set @old_spider_slave_trx_isolation= @@spider_slave_trx_isolation;
+set global spider_slave_trx_isolation= 1;
+
+drop and create databases
+connection master_1;
+CREATE DATABASE auto_test_local;
+USE auto_test_local;
+connection slave1_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;
+USE auto_test_remote;
+
+create table and insert
+connection child2_1;
+CHILD2_1_CREATE_TABLES
+TRUNCATE TABLE mysql.general_log;
+connection master_1;
+connection slave1_1;
+connection master_1;
+SET SESSION sql_log_bin= 0;
+CREATE TABLE tbl_a (
+pkey int NOT NULL,
+PRIMARY KEY (pkey)
+) MASTER_1_ENGINE2 MASTER_1_CHARSET MASTER_1_COMMENT_2_1
+SET SESSION sql_log_bin= 1;
+connection slave1_1;
+CREATE TABLE tbl_a (
+pkey int NOT NULL,
+PRIMARY KEY (pkey)
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_1
+connection master_1;
+INSERT INTO tbl_a (pkey) VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
+connection slave1_1;
+connection master_1;
+SET SESSION sql_log_bin= 0;
+connection child2_1;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%set %';
+argument
+set session time_zone = '+00:00'
+SET NAMES utf8
+set session transaction isolation level read committed;set session autocommit = 1;start transaction
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%set %'
+SELECT pkey FROM tbl_a ORDER BY pkey;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+connection slave1_1;
+SELECT pkey FROM 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 slave1_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 slave1_1;
+set global spider_slave_trx_isolation= @old_spider_slave_trx_isolation;
+for slave1_1
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+
+end of test
diff --git a/storage/spider/mysql-test/spider/bugfix/r/wrapper_mariadb.result b/storage/spider/mysql-test/spider/bugfix/r/wrapper_mariadb.result
new file mode 100644
index 00000000000..7c01421fa13
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/r/wrapper_mariadb.result
@@ -0,0 +1,78 @@
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+
+this test is for MDEV-18313
+
+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;
+USE auto_test_remote;
+
+create table and insert
+connection child2_1;
+CHILD2_1_CREATE_TABLES
+TRUNCATE TABLE mysql.general_log;
+connection master_1;
+CREATE TABLE tbl_a (
+pkey int NOT NULL,
+PRIMARY KEY (pkey)
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_1
+INSERT INTO tbl_a (pkey) VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
+
+select test
+connection child2_1;
+TRUNCATE TABLE mysql.general_log;
+connection master_1;
+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 WHERE argument LIKE '%select %';
+argument
+select t0.`pkey` `pkey` from `auto_test_remote`.`tbl_a` t0 order by `pkey`
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT pkey FROM 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;
+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/bugfix/suite.opt b/storage/spider/mysql-test/spider/bugfix/suite.opt
new file mode 100644
index 00000000000..672a3b37d4f
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/suite.opt
@@ -0,0 +1 @@
+--loose-innodb --loose-skip-performance-schema
diff --git a/storage/spider/mysql-test/spider/bugfix/suite.pm b/storage/spider/mysql-test/spider/bugfix/suite.pm
new file mode 100644
index 00000000000..f106147deb6
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/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/bugfix/t/checksum_table_with_quick_mode_3.cnf b/storage/spider/mysql-test/spider/bugfix/t/checksum_table_with_quick_mode_3.cnf
new file mode 100644
index 00000000000..05dfd8a0bce
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/t/checksum_table_with_quick_mode_3.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/bugfix/t/checksum_table_with_quick_mode_3.test b/storage/spider/mysql-test/spider/bugfix/t/checksum_table_with_quick_mode_3.test
new file mode 100644
index 00000000000..5dc4a88c842
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/t/checksum_table_with_quick_mode_3.test
@@ -0,0 +1,72 @@
+--source ../include/checksum_table_with_quick_mode_3_init.inc
+--echo
+--echo this test is for MDEV-16279
+--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;
+--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 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;
+eval CREATE TABLE tbl_a (
+ pkey int NOT NULL,
+ PRIMARY KEY (pkey)
+) $MASTER_1_ENGINE $MASTER_1_CHARSET $MASTER_1_COMMENT_2_1;
+--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);
+FLUSH TABLES;
+
+--echo
+--echo select test 1
+
+--connection child2_1
+TRUNCATE TABLE mysql.general_log;
+
+--connection master_1
+CHECKSUM TABLE tbl_a EXTENDED;
+
+--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;
+SET GLOBAL log_output = @old_log_output;
+
+--enable_warnings
+--source ../include/checksum_table_with_quick_mode_3_deinit.inc
+--echo
+--echo end of test
diff --git a/storage/spider/mysql-test/spider/bugfix/t/direct_sql_with_tmp_table.cnf b/storage/spider/mysql-test/spider/bugfix/t/direct_sql_with_tmp_table.cnf
new file mode 100644
index 00000000000..05dfd8a0bce
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/t/direct_sql_with_tmp_table.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/bugfix/t/direct_sql_with_tmp_table.test b/storage/spider/mysql-test/spider/bugfix/t/direct_sql_with_tmp_table.test
new file mode 100644
index 00000000000..139af5c83c9
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/t/direct_sql_with_tmp_table.test
@@ -0,0 +1,35 @@
+--source ../include/direct_sql_with_tmp_table_init.inc
+--echo
+--echo drop and create databases
+
+--connection master_1
+--disable_warnings
+CREATE DATABASE auto_test_local;
+USE auto_test_local;
+--enable_warnings
+
+--disable_query_log
+echo CREATE TEMPORARY TABLE tmp_a (
+ pkey int NOT NULL,
+ PRIMARY KEY (pkey)
+) MASTER_1_ENGINE2;
+eval CREATE TEMPORARY TABLE tmp_a (
+ pkey int NOT NULL,
+ PRIMARY KEY (pkey)
+) $MASTER_1_ENGINE2;
+--enable_query_log
+
+eval $DIRECT_SQL_COMMAND;
+SELECT pkey FROM tmp_a;
+
+--echo
+--echo deinit
+--disable_warnings
+
+--connection master_1
+DROP DATABASE IF EXISTS auto_test_local;
+
+--enable_warnings
+--source ../include/direct_sql_with_tmp_table_deinit.inc
+--echo
+--echo end of test
diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_20100.cnf b/storage/spider/mysql-test/spider/bugfix/t/mdev_20100.cnf
new file mode 100644
index 00000000000..05dfd8a0bce
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_20100.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/bugfix/t/mdev_20100.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_20100.test
new file mode 100644
index 00000000000..b72facd11a6
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_20100.test
@@ -0,0 +1,85 @@
+--source ../include/mdev_20100_init.inc
+--echo
+--echo this test is for MDEV-20100
+--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;
+--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 master_1
+--disable_query_log
+echo CREATE TABLE tbl_a (
+ a INT,
+ b CHAR(1),
+ c DATETIME,
+ PRIMARY KEY(a)
+) $MASTER_1_ENGINE $MASTER_1_COMMENT_P_2_1;
+eval CREATE TABLE tbl_a (
+ a INT,
+ b CHAR(1),
+ c DATETIME,
+ PRIMARY KEY(a)
+) $MASTER_1_ENGINE $MASTER_1_COMMENT_P_2_1;
+--enable_query_log
+INSERT INTO tbl_a (a, b, c) VALUES
+ (1, 'a', '2008-08-01 10:21:39'),
+ (2, 'b', '2000-01-01 00:00:00'),
+ (3, 'e', '2007-06-04 20:03:11'),
+ (4, 'd', '2003-11-30 05:01:03'),
+ (5, 'c', '2001-12-31 23:59:59');
+
+--echo
+--echo test 1
+
+--connection child2_1
+TRUNCATE TABLE mysql.general_log;
+
+--connection master_1
+SELECT a, b, c FROM tbl_a PARTITION (pt2) WHERE b = 'c';
+SELECT a, b, c FROM tbl_a PARTITION (pt1,pt2);
+SELECT a, b, c FROM tbl_a PARTITION (pt3) WHERE b = 'c';
+SELECT a, b, c FROM tbl_a PARTITION (pt1,pt2);
+SELECT a, b, c FROM tbl_a PARTITION (pt1) WHERE b = 'c';
+SELECT a, b, c FROM tbl_a PARTITION (pt1,pt3);
+SELECT a, b, c FROM tbl_a PARTITION (pt1) WHERE b = 'c';
+SELECT a, b, c FROM tbl_a PARTITION (pt2,pt3);
+
+--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;
+SET GLOBAL log_output = @old_log_output;
+
+--enable_warnings
+--source ../include/mdev_20100_deinit.inc
+--echo
+--echo end of test
diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_20502.cnf b/storage/spider/mysql-test/spider/bugfix/t/mdev_20502.cnf
new file mode 100644
index 00000000000..05dfd8a0bce
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_20502.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/bugfix/t/mdev_20502.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_20502.test
new file mode 100644
index 00000000000..2d6ff5b4663
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_20502.test
@@ -0,0 +1,78 @@
+--source ../include/mdev_20502_init.inc
+--echo
+--echo this test is for MDEV-20502
+--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;
+--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 master_1
+--disable_query_log
+echo CREATE TABLE tbl_a (
+ id int(10) unsigned NOT NULL AUTO_INCREMENT,
+ val int(10) unsigned DEFAULT NULL,
+ PRIMARY KEY(id)
+) $MASTER_1_ENGINE $MASTER_1_COMMENT_2_1;
+eval CREATE TABLE tbl_a (
+ id int(10) unsigned NOT NULL AUTO_INCREMENT,
+ val int(10) unsigned DEFAULT NULL,
+ PRIMARY KEY(id)
+) $MASTER_1_ENGINE $MASTER_1_COMMENT_2_1;
+--enable_query_log
+INSERT INTO tbl_a (val) VALUES (1);
+
+--echo
+--echo test 1
+
+--connection child2_1
+TRUNCATE TABLE mysql.general_log;
+
+--connection master_1
+SELECT id, 0 AS const, val FROM tbl_a;
+SELECT 1+2, id, 0 AS const, val, val+10, (SELECT tbl_a.val+1 FROM tbl_a) AS sq
+FROM tbl_a;
+INSERT INTO tbl_a (val) VALUES (2), (1);
+SELECT val+10, 0 AS const, val, (SELECT tbl_a.val+1 FROM tbl_a LIMIT 1) AS sq
+FROM tbl_a GROUP BY val;
+SELECT MAX(id) AS m, 0 AS const, val, (SELECT tbl_a.val+1 FROM tbl_a LIMIT 1) AS sq
+FROM tbl_a GROUP BY val;
+
+--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;
+SET GLOBAL log_output = @old_log_output;
+
+--enable_warnings
+--source ../include/mdev_20502_deinit.inc
+--echo
+--echo end of test
diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_21884.cnf b/storage/spider/mysql-test/spider/bugfix/t/mdev_21884.cnf
new file mode 100644
index 00000000000..05dfd8a0bce
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_21884.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/bugfix/t/mdev_21884.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_21884.test
new file mode 100644
index 00000000000..be4aa6a6330
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_21884.test
@@ -0,0 +1,97 @@
+--source ../include/mdev_21884_init.inc
+--echo
+--echo this test is for MDEV-21884
+--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;
+--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 master_1
+--disable_query_log
+echo CREATE TABLE tbl_a (
+ a INT,
+ b CHAR(1),
+ c DATETIME,
+ PRIMARY KEY(a,b)
+) $MASTER_1_ENGINE $MASTER_1_COMMENT_P_2_1;
+eval CREATE TABLE tbl_a (
+ a INT,
+ b CHAR(1),
+ c DATETIME,
+ PRIMARY KEY(a,b)
+) $MASTER_1_ENGINE $MASTER_1_COMMENT_P_2_1;
+echo CREATE TABLE tb_l (
+ a INT,
+ b CHAR(1),
+ c DATETIME,
+ PRIMARY KEY(a)
+) MASTER_1_ENGINE2 MASTER_1_CHARSET2;
+eval CREATE TABLE tb_l (
+ a INT,
+ b CHAR(1),
+ c DATETIME,
+ PRIMARY KEY(a)
+) $MASTER_1_ENGINE2 $MASTER_1_CHARSET2;
+--enable_query_log
+INSERT INTO tbl_a (a, b, c) VALUES
+ (11, 'a', '2008-08-01 10:21:39'),
+ (11, 'b', '2000-01-01 00:00:00'),
+ (12, 'e', '2007-06-04 20:03:11'),
+ (12, 'd', '2003-11-30 05:01:03'),
+ (13, 'c', '2001-12-31 23:59:59');
+INSERT INTO tb_l (a, b, c) VALUES
+ (11, 'a', '2008-08-01 10:21:39'),
+ (12, 'b', '2000-01-01 00:00:00'),
+ (13, 'e', '2007-06-04 20:03:11'),
+ (14, 'd', '2003-11-30 05:01:03'),
+ (15, 'c', '2001-12-31 23:59:59');
+
+--echo
+--echo test 1
+
+--connection child2_1
+TRUNCATE TABLE mysql.general_log;
+
+--connection master_1
+SELECT STRAIGHT_JOIN b.a, b.b FROM tb_l a, tbl_a b WHERE a.a = b.a;
+
+--connection child2_1
+SET NAMES utf8;
+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;
+SET GLOBAL log_output = @old_log_output;
+
+--enable_warnings
+--source ../include/mdev_21884_deinit.inc
+--echo
+--echo end of test
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
new file mode 100644
index 00000000000..e0ffb99c38e
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/t/quick_mode_0.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_0.test b/storage/spider/mysql-test/spider/bugfix/t/quick_mode_0.test
new file mode 100644
index 00000000000..235edc10d12
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/t/quick_mode_0.test
@@ -0,0 +1,156 @@
+--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 ../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
new file mode 100644
index 00000000000..e0ffb99c38e
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/t/quick_mode_1.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_1.test b/storage/spider/mysql-test/spider/bugfix/t/quick_mode_1.test
new file mode 100644
index 00000000000..01fa0cb5128
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/t/quick_mode_1.test
@@ -0,0 +1,156 @@
+--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 ../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
new file mode 100644
index 00000000000..e0ffb99c38e
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/t/quick_mode_2.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_2.test b/storage/spider/mysql-test/spider/bugfix/t/quick_mode_2.test
new file mode 100644
index 00000000000..3ea8138e755
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/t/quick_mode_2.test
@@ -0,0 +1,156 @@
+--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 ../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
new file mode 100644
index 00000000000..e0ffb99c38e
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/t/quick_mode_3.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_3.test b/storage/spider/mysql-test/spider/bugfix/t/quick_mode_3.test
new file mode 100644
index 00000000000..bc926b0a296
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/t/quick_mode_3.test
@@ -0,0 +1,157 @@
+--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 ../include/quick_mode_3_deinit.inc
+--echo
+--echo end of test
diff --git a/storage/spider/mysql-test/spider/bugfix/t/select_by_null.cnf b/storage/spider/mysql-test/spider/bugfix/t/select_by_null.cnf
new file mode 100644
index 00000000000..05dfd8a0bce
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/t/select_by_null.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/bugfix/t/select_by_null.test b/storage/spider/mysql-test/spider/bugfix/t/select_by_null.test
new file mode 100644
index 00000000000..1f540b2a15f
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/t/select_by_null.test
@@ -0,0 +1,72 @@
+--source ../include/select_by_null_init.inc
+--echo
+--echo this test is for MDEV-16279
+--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;
+--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 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;
+eval CREATE TABLE tbl_a (
+ pkey int NOT NULL,
+ PRIMARY KEY (pkey)
+) $MASTER_1_ENGINE $MASTER_1_CHARSET $MASTER_1_COMMENT_2_1;
+--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);
+FLUSH TABLES;
+
+--echo
+--echo select test 1
+
+--connection child2_1
+TRUNCATE TABLE mysql.general_log;
+
+--connection master_1
+SELECT pkey FROM tbl_a WHERE NULL;
+
+--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;
+SET GLOBAL log_output = @old_log_output;
+
+--enable_warnings
+--source ../include/select_by_null_deinit.inc
+--echo
+--echo end of test
diff --git a/storage/spider/mysql-test/spider/bugfix/t/slave_trx_isolation.cnf b/storage/spider/mysql-test/spider/bugfix/t/slave_trx_isolation.cnf
new file mode 100644
index 00000000000..45019d6c537
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/t/slave_trx_isolation.cnf
@@ -0,0 +1,4 @@
+!include include/default_mysqld.cnf
+!include ../my_1_1.cnf
+!include ../my_2_1.cnf
+!include ../my_4_1.cnf
diff --git a/storage/spider/mysql-test/spider/bugfix/t/slave_trx_isolation.test b/storage/spider/mysql-test/spider/bugfix/t/slave_trx_isolation.test
new file mode 100644
index 00000000000..652fbb1c11c
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/t/slave_trx_isolation.test
@@ -0,0 +1,95 @@
+--source ../include/slave_trx_isolation_init.inc
+--echo
+--echo drop and create databases
+--connection master_1
+--disable_warnings
+CREATE DATABASE auto_test_local;
+USE auto_test_local;
+
+--connection slave1_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;
+USE auto_test_remote;
+--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 master_1
+save_master_pos;
+
+--connection slave1_1
+sync_with_master;
+
+--connection master_1
+SET SESSION sql_log_bin= 0;
+--disable_query_log
+echo CREATE TABLE tbl_a (
+ pkey int NOT NULL,
+ PRIMARY KEY (pkey)
+) MASTER_1_ENGINE2 MASTER_1_CHARSET MASTER_1_COMMENT_2_1;
+eval CREATE TABLE tbl_a (
+ pkey int NOT NULL,
+ PRIMARY KEY (pkey)
+) $MASTER_1_ENGINE2 $MASTER_1_CHARSET $MASTER_1_COMMENT_2_1;
+--enable_query_log
+SET SESSION sql_log_bin= 1;
+
+--connection slave1_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;
+eval CREATE TABLE tbl_a (
+ pkey int NOT NULL,
+ PRIMARY KEY (pkey)
+) $MASTER_1_ENGINE $MASTER_1_CHARSET $MASTER_1_COMMENT_2_1;
+--enable_query_log
+
+--connection master_1
+INSERT INTO tbl_a (pkey) VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
+save_master_pos;
+
+--connection slave1_1
+sync_with_master;
+
+--connection master_1
+SET SESSION sql_log_bin= 0;
+
+--connection child2_1
+eval $CHILD2_1_SELECT_ARGUMENT1;
+eval $CHILD2_1_SELECT_TABLES;
+
+--connection slave1_1
+SELECT pkey FROM tbl_a ORDER BY pkey;
+
+--echo
+--echo deinit
+--disable_warnings
+--connection master_1
+DROP DATABASE IF EXISTS auto_test_local;
+
+--connection slave1_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;
+
+--enable_warnings
+--source ../include/slave_trx_isolation_deinit.inc
+--echo
+--echo end of test
diff --git a/storage/spider/mysql-test/spider/bugfix/t/wrapper_mariadb.cnf b/storage/spider/mysql-test/spider/bugfix/t/wrapper_mariadb.cnf
new file mode 100644
index 00000000000..05dfd8a0bce
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/t/wrapper_mariadb.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/bugfix/t/wrapper_mariadb.test b/storage/spider/mysql-test/spider/bugfix/t/wrapper_mariadb.test
new file mode 100644
index 00000000000..0102155b5ab
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/t/wrapper_mariadb.test
@@ -0,0 +1,69 @@
+--source ../include/wrapper_mariadb_init.inc
+--echo
+--echo this test is for MDEV-18313
+--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;
+--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 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;
+eval CREATE TABLE tbl_a (
+ pkey int NOT NULL,
+ PRIMARY KEY (pkey)
+) $MASTER_1_ENGINE $MASTER_1_CHARSET $MASTER_1_COMMENT_2_1;
+--enable_query_log
+INSERT INTO tbl_a (pkey) VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
+
+--echo
+--echo select test
+
+--connection child2_1
+TRUNCATE TABLE mysql.general_log;
+
+--connection master_1
+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;
+SET GLOBAL log_output = @old_log_output;
+
+--enable_warnings
+--source ../include/wrapper_mariadb_deinit.inc
+--echo
+--echo end of test
diff --git a/storage/spider/mysql-test/spider/handler/r/direct_update.result b/storage/spider/mysql-test/spider/handler/r/direct_update.result
index 74dae7aec2e..0e536d48617 100644
--- a/storage/spider/mysql-test/spider/handler/r/direct_update.result
+++ b/storage/spider/mysql-test/spider/handler/r/direct_update.result
@@ -48,6 +48,7 @@ direct_updating test
connection master_1;
SHOW STATUS LIKE 'Spider_direct_update';
Variable_name Value
+Spider_direct_update 0
SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a;
a b date_format(c, '%Y-%m-%d %H:%i:%s')
1 a 2008-08-01 10:21:39
@@ -59,6 +60,7 @@ update all rows with function
UPDATE ta_l SET c = ADDDATE(c, 1);
SHOW STATUS LIKE 'Spider_direct_update';
Variable_name Value
+Spider_direct_update 1
SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a;
a b date_format(c, '%Y-%m-%d %H:%i:%s')
1 a 2008-08-02 10:21:39
@@ -70,6 +72,7 @@ update by primary key
UPDATE ta_l SET b = 'x' WHERE a = 3;
SHOW STATUS LIKE 'Spider_direct_update';
Variable_name Value
+Spider_direct_update 2
SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a;
a b date_format(c, '%Y-%m-%d %H:%i:%s')
1 a 2008-08-02 10:21:39
@@ -81,6 +84,7 @@ update by a column without index
UPDATE ta_l SET c = '2011-10-17' WHERE b = 'x';
SHOW STATUS LIKE 'Spider_direct_update';
Variable_name Value
+Spider_direct_update 3
SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a;
a b date_format(c, '%Y-%m-%d %H:%i:%s')
1 a 2008-08-02 10:21:39
@@ -92,6 +96,7 @@ update by primary key with order and limit
UPDATE ta_l SET c = ADDDATE(c, 1) WHERE a < 4 ORDER BY b DESC LIMIT 1;
SHOW STATUS LIKE 'Spider_direct_update';
Variable_name Value
+Spider_direct_update 4
SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a;
a b date_format(c, '%Y-%m-%d %H:%i:%s')
1 a 2008-08-02 10:21:39
@@ -103,6 +108,7 @@ delete by primary key with order and limit
DELETE FROM ta_l WHERE a < 4 ORDER BY c LIMIT 1;
SHOW STATUS LIKE 'Spider_direct_delete';
Variable_name Value
+Spider_direct_delete 1
SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a;
a b date_format(c, '%Y-%m-%d %H:%i:%s')
1 a 2008-08-02 10:21:39
@@ -113,6 +119,7 @@ delete by a column without index
DELETE FROM ta_l WHERE b = 'c';
SHOW STATUS LIKE 'Spider_direct_delete';
Variable_name Value
+Spider_direct_delete 2
SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a;
a b date_format(c, '%Y-%m-%d %H:%i:%s')
1 a 2008-08-02 10:21:39
@@ -122,6 +129,7 @@ delete by primary key
DELETE FROM ta_l WHERE a = 3;
SHOW STATUS LIKE 'Spider_direct_delete';
Variable_name Value
+Spider_direct_delete 3
SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a;
a b date_format(c, '%Y-%m-%d %H:%i:%s')
1 a 2008-08-02 10:21:39
diff --git a/storage/spider/mysql-test/spider/handler/r/direct_update_part.result b/storage/spider/mysql-test/spider/handler/r/direct_update_part.result
index 6db7c01f563..7069cd72fda 100644
--- a/storage/spider/mysql-test/spider/handler/r/direct_update_part.result
+++ b/storage/spider/mysql-test/spider/handler/r/direct_update_part.result
@@ -38,6 +38,7 @@ PRIMARY KEY(a)
) MASTER_1_ENGINE MASTER_1_COMMENT2_P_2_1
SHOW STATUS LIKE 'Spider_direct_update';
Variable_name Value
+Spider_direct_update 0
SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 ORDER BY a;
a b date_format(c, '%Y-%m-%d %H:%i:%s')
1 a 2008-08-01 10:21:39
@@ -49,6 +50,7 @@ update all rows with function
UPDATE ta_l2 SET c = ADDDATE(c, 1);
SHOW STATUS LIKE 'Spider_direct_update';
Variable_name Value
+Spider_direct_update 2
SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 ORDER BY a;
a b date_format(c, '%Y-%m-%d %H:%i:%s')
1 a 2008-08-02 10:21:39
@@ -60,6 +62,7 @@ update by primary key
UPDATE ta_l2 SET b = 'x' WHERE a = 3;
SHOW STATUS LIKE 'Spider_direct_update';
Variable_name Value
+Spider_direct_update 3
SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 ORDER BY a;
a b date_format(c, '%Y-%m-%d %H:%i:%s')
1 a 2008-08-02 10:21:39
@@ -71,6 +74,7 @@ update by a column without index
UPDATE ta_l2 SET c = '2011-10-17' WHERE b = 'x';
SHOW STATUS LIKE 'Spider_direct_update';
Variable_name Value
+Spider_direct_update 5
SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 ORDER BY a;
a b date_format(c, '%Y-%m-%d %H:%i:%s')
1 a 2008-08-02 10:21:39
@@ -82,6 +86,7 @@ update by primary key with order and limit
UPDATE ta_l2 SET c = ADDDATE(c, 1) WHERE a < 4 ORDER BY b DESC LIMIT 1;
SHOW STATUS LIKE 'Spider_direct_update';
Variable_name Value
+Spider_direct_update 6
SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 ORDER BY a;
a b date_format(c, '%Y-%m-%d %H:%i:%s')
1 a 2008-08-02 10:21:39
@@ -93,6 +98,7 @@ delete by primary key with order and limit
DELETE FROM ta_l2 WHERE a < 4 ORDER BY c LIMIT 1;
SHOW STATUS LIKE 'Spider_direct_delete';
Variable_name Value
+Spider_direct_delete 1
SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 ORDER BY a;
a b date_format(c, '%Y-%m-%d %H:%i:%s')
1 a 2008-08-02 10:21:39
@@ -103,6 +109,7 @@ delete by a column without index
DELETE FROM ta_l2 WHERE b = 'c';
SHOW STATUS LIKE 'Spider_direct_delete';
Variable_name Value
+Spider_direct_delete 3
SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 ORDER BY a;
a b date_format(c, '%Y-%m-%d %H:%i:%s')
1 a 2008-08-02 10:21:39
@@ -112,6 +119,7 @@ delete by primary key
DELETE FROM ta_l2 WHERE a = 3;
SHOW STATUS LIKE 'Spider_direct_delete';
Variable_name Value
+Spider_direct_delete 4
SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 ORDER BY a;
a b date_format(c, '%Y-%m-%d %H:%i:%s')
1 a 2008-08-02 10:21:39
diff --git a/storage/spider/mysql-test/spider/handler/r/spider_fixes.result b/storage/spider/mysql-test/spider/handler/r/spider_fixes.result
index 9b14817eee4..c171167a1b7 100644
--- a/storage/spider/mysql-test/spider/handler/r/spider_fixes.result
+++ b/storage/spider/mysql-test/spider/handler/r/spider_fixes.result
@@ -465,6 +465,7 @@ Error 1146 Table 'auto_test_remote.ter1_1' doesn't exist
DELETE FROM t1;
Warnings:
Error 12702 Remote table 'auto_test_remote.ter1_1' is not found
+Error 12702 Remote table 'auto_test_remote.ter1_1' is not found
Error 1146 Table 'auto_test_remote.ter1_1' doesn't exist
TRUNCATE t1;
Warnings:
diff --git a/storage/spider/mysql-test/spider/handler/suite.pm b/storage/spider/mysql-test/spider/handler/suite.pm
index f106147deb6..b023e5206ef 100644
--- a/storage/spider/mysql-test/spider/handler/suite.pm
+++ b/storage/spider/mysql-test/spider/handler/suite.pm
@@ -9,4 +9,3 @@ return "Test needs --big-test" unless $::opt_big_test;
sub is_default { 1 }
bless { };
-
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
new file mode 100644
index 00000000000..d551f5a4af3
--- /dev/null
+++ b/storage/spider/mysql-test/spider/include/checksum_table_with_quick_mode_3_deinit.inc
@@ -0,0 +1,16 @@
+--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
+--let $USE_GENERAL_LOG= $USE_GENERAL_LOG_BACKUP
+--connection master_1
+set session spider_quick_mode= @old_spider_quick_mode;
+set session spider_quick_page_size= @old_spider_quick_page_size;
+--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/include/checksum_table_with_quick_mode_3_init.inc b/storage/spider/mysql-test/spider/include/checksum_table_with_quick_mode_3_init.inc
new file mode 100644
index 00000000000..9ec61a1cb77
--- /dev/null
+++ b/storage/spider/mysql-test/spider/include/checksum_table_with_quick_mode_3_init.inc
@@ -0,0 +1,33 @@
+--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 $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 $OUTPUT_CHILD_GROUP2_BACKUP= $OUTPUT_CHILD_GROUP2
+--let $OUTPUT_CHILD_GROUP2= 1
+--let $USE_GENERAL_LOG_BACKUP= $USE_GENERAL_LOG
+--let $USE_GENERAL_LOG= 1
+--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;
diff --git a/storage/spider/mysql-test/spider/include/deinit_spider.inc b/storage/spider/mysql-test/spider/include/deinit_spider.inc
index c9c414eb56e..3609551e169 100644
--- a/storage/spider/mysql-test/spider/include/deinit_spider.inc
+++ b/storage/spider/mysql-test/spider/include/deinit_spider.inc
@@ -6,9 +6,13 @@ DROP FUNCTION spider_flush_table_mon_cache;
UNINSTALL PLUGIN spider;
DROP TABLE IF EXISTS mysql.spider_xa;
DROP TABLE IF EXISTS mysql.spider_xa_member;
+DROP TABLE IF EXISTS mysql.spider_xa_failed_log;
DROP TABLE IF EXISTS mysql.spider_tables;
DROP TABLE IF EXISTS mysql.spider_link_mon_servers;
DROP TABLE IF EXISTS mysql.spider_link_failed_log;
+DROP TABLE IF EXISTS mysql.spider_table_position_for_recovery;
+DROP TABLE IF EXISTS mysql.spider_table_sts;
+DROP TABLE IF EXISTS mysql.spider_table_crd;
DROP SERVER s_2_1;
DROP SERVER s_2_2;
DROP SERVER s_2_3;
diff --git a/storage/spider/mysql-test/spider/include/direct_join_deinit.inc b/storage/spider/mysql-test/spider/include/direct_join_deinit.inc
new file mode 100644
index 00000000000..53bc29a0016
--- /dev/null
+++ b/storage/spider/mysql-test/spider/include/direct_join_deinit.inc
@@ -0,0 +1,9 @@
+--let $OUTPUT_CHILD_GROUP2= $OUTPUT_CHILD_GROUP2_BACKUP
+--let $USE_GENERAL_LOG= $USE_GENERAL_LOG_BACKUP
+--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/include/direct_join_init.inc b/storage/spider/mysql-test/spider/include/direct_join_init.inc
new file mode 100644
index 00000000000..25c5e7ca39b
--- /dev/null
+++ b/storage/spider/mysql-test/spider/include/direct_join_init.inc
@@ -0,0 +1,53 @@
+--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_CONST_TABLE_JOIN=
+ COMMENT 'table "tbl_person"';
+let $MASTER_1_COMMENT_CONST_TABLE_JOIN=
+ COMMENT 'table "tbl_ncd_cm_person"';
+let $MASTER_1_ROW_FORMAT_CONST_TABLE_JOIN=
+ ROW_FORMAT = Dynamic;
+let $MASTER_1_PART_CONST_TABLE_JOIN=
+ PARTITION BY LIST COLUMNS (region) PARTITIONS 1
+ (PARTITION pt1 values in (510411)
+ COMMENT = 'tbl "tbl_person", srv "s_2_1"' MAX_ROWS = 0 MIN_ROWS = 0);
+let $MASTER_1_PART_CONST_TABLE2_JOIN=
+ PARTITION BY LIST COLUMNS (region) PARTITIONS 1
+ (PARTITION pt1 values in (510411)
+ COMMENT = 'tbl "tbl_ncd_cm_person", srv "s_2_1"' MAX_ROWS = 0 MIN_ROWS = 0);
+let $CHILD2_1_ROW_FORMAT_CONST_TABLE_JOIN=
+ ROW_FORMAT = Dynamic;
+let $CHILD2_1_DROP_CONST_TABLE_JOIN=
+ DROP TABLE IF EXISTS tbl_person;
+let $CHILD2_1_CREATE_CONST_TABLE_JOIN=
+ CREATE TABLE tbl_person (
+ id VARCHAR(50) NOT NULL,
+ hr_status VARCHAR(50) NULL DEFAULT NULL,
+ region_code VARCHAR(50) NULL DEFAULT NULL,
+ region INT(11) NOT NULL,
+ PRIMARY KEY (id, region) USING BTREE
+ ) $CHILD2_1_ENGINE $CHILD2_1_CHARSET $CHILD2_1_ROW_FORMAT_CONST_TABLE_JOIN;
+let $CHILD2_1_DROP_CONST_TABLE2_JOIN=
+ DROP TABLE IF EXISTS tbl_ncd_cm_person;
+let $CHILD2_1_CREATE_CONST_TABLE2_JOIN=
+ CREATE TABLE tbl_ncd_cm_person (
+ id VARCHAR(50) NOT NULL,
+ person_id VARCHAR(50) NULL DEFAULT '',
+ diseaseKind_id VARCHAR(50) NULL DEFAULT NULL,
+ region INT(11) NOT NULL,
+ PRIMARY KEY (id, region) USING BTREE
+ ) $CHILD2_1_ENGINE $CHILD2_1_CHARSET $CHILD2_1_ROW_FORMAT_CONST_TABLE_JOIN;
+let $CHILD2_1_SELECT_CONST_TABLE_JOIN=
+ SELECT * FROM tbl_person;
+let $CHILD2_1_SELECT_CONST_TABLE2_JOIN=
+ SELECT * FROM tbl_ncd_cm_person;
+let $CHILD2_1_SELECT_ARGUMENT1=
+ SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+--let $OUTPUT_CHILD_GROUP2_BACKUP= $OUTPUT_CHILD_GROUP2
+--let $OUTPUT_CHILD_GROUP2= 1
+--let $USE_GENERAL_LOG_BACKUP= $USE_GENERAL_LOG
+--let $USE_GENERAL_LOG= 1
diff --git a/storage/spider/mysql-test/spider/include/direct_join_using_deinit.inc b/storage/spider/mysql-test/spider/include/direct_join_using_deinit.inc
new file mode 100644
index 00000000000..53bc29a0016
--- /dev/null
+++ b/storage/spider/mysql-test/spider/include/direct_join_using_deinit.inc
@@ -0,0 +1,9 @@
+--let $OUTPUT_CHILD_GROUP2= $OUTPUT_CHILD_GROUP2_BACKUP
+--let $USE_GENERAL_LOG= $USE_GENERAL_LOG_BACKUP
+--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/include/direct_join_using_init.inc b/storage/spider/mysql-test/spider/include/direct_join_using_init.inc
new file mode 100644
index 00000000000..7e4947bf078
--- /dev/null
+++ b/storage/spider/mysql-test/spider/include/direct_join_using_init.inc
@@ -0,0 +1,13 @@
+--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 WHERE argument LIKE '%select %';
+--let $OUTPUT_CHILD_GROUP2_BACKUP= $OUTPUT_CHILD_GROUP2
+--let $OUTPUT_CHILD_GROUP2= 1
+--let $USE_GENERAL_LOG_BACKUP= $USE_GENERAL_LOG
+--let $USE_GENERAL_LOG= 1
diff --git a/storage/spider/mysql-test/spider/include/direct_left_join_deinit.inc b/storage/spider/mysql-test/spider/include/direct_left_join_deinit.inc
new file mode 100644
index 00000000000..53bc29a0016
--- /dev/null
+++ b/storage/spider/mysql-test/spider/include/direct_left_join_deinit.inc
@@ -0,0 +1,9 @@
+--let $OUTPUT_CHILD_GROUP2= $OUTPUT_CHILD_GROUP2_BACKUP
+--let $USE_GENERAL_LOG= $USE_GENERAL_LOG_BACKUP
+--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/include/direct_left_join_init.inc b/storage/spider/mysql-test/spider/include/direct_left_join_init.inc
new file mode 100644
index 00000000000..7e4947bf078
--- /dev/null
+++ b/storage/spider/mysql-test/spider/include/direct_left_join_init.inc
@@ -0,0 +1,13 @@
+--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 WHERE argument LIKE '%select %';
+--let $OUTPUT_CHILD_GROUP2_BACKUP= $OUTPUT_CHILD_GROUP2
+--let $OUTPUT_CHILD_GROUP2= 1
+--let $USE_GENERAL_LOG_BACKUP= $USE_GENERAL_LOG
+--let $USE_GENERAL_LOG= 1
diff --git a/storage/spider/mysql-test/spider/include/direct_left_join_nullable_deinit.inc b/storage/spider/mysql-test/spider/include/direct_left_join_nullable_deinit.inc
new file mode 100644
index 00000000000..53bc29a0016
--- /dev/null
+++ b/storage/spider/mysql-test/spider/include/direct_left_join_nullable_deinit.inc
@@ -0,0 +1,9 @@
+--let $OUTPUT_CHILD_GROUP2= $OUTPUT_CHILD_GROUP2_BACKUP
+--let $USE_GENERAL_LOG= $USE_GENERAL_LOG_BACKUP
+--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/include/direct_left_join_nullable_init.inc b/storage/spider/mysql-test/spider/include/direct_left_join_nullable_init.inc
new file mode 100644
index 00000000000..7e4947bf078
--- /dev/null
+++ b/storage/spider/mysql-test/spider/include/direct_left_join_nullable_init.inc
@@ -0,0 +1,13 @@
+--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 WHERE argument LIKE '%select %';
+--let $OUTPUT_CHILD_GROUP2_BACKUP= $OUTPUT_CHILD_GROUP2
+--let $OUTPUT_CHILD_GROUP2= 1
+--let $USE_GENERAL_LOG_BACKUP= $USE_GENERAL_LOG
+--let $USE_GENERAL_LOG= 1
diff --git a/storage/spider/mysql-test/spider/include/direct_left_right_join_nullable_deinit.inc b/storage/spider/mysql-test/spider/include/direct_left_right_join_nullable_deinit.inc
new file mode 100644
index 00000000000..53bc29a0016
--- /dev/null
+++ b/storage/spider/mysql-test/spider/include/direct_left_right_join_nullable_deinit.inc
@@ -0,0 +1,9 @@
+--let $OUTPUT_CHILD_GROUP2= $OUTPUT_CHILD_GROUP2_BACKUP
+--let $USE_GENERAL_LOG= $USE_GENERAL_LOG_BACKUP
+--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/include/direct_left_right_join_nullable_init.inc b/storage/spider/mysql-test/spider/include/direct_left_right_join_nullable_init.inc
new file mode 100644
index 00000000000..7e4947bf078
--- /dev/null
+++ b/storage/spider/mysql-test/spider/include/direct_left_right_join_nullable_init.inc
@@ -0,0 +1,13 @@
+--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 WHERE argument LIKE '%select %';
+--let $OUTPUT_CHILD_GROUP2_BACKUP= $OUTPUT_CHILD_GROUP2
+--let $OUTPUT_CHILD_GROUP2= 1
+--let $USE_GENERAL_LOG_BACKUP= $USE_GENERAL_LOG
+--let $USE_GENERAL_LOG= 1
diff --git a/storage/spider/mysql-test/spider/include/direct_left_right_left_join_nullable_deinit.inc b/storage/spider/mysql-test/spider/include/direct_left_right_left_join_nullable_deinit.inc
new file mode 100644
index 00000000000..53bc29a0016
--- /dev/null
+++ b/storage/spider/mysql-test/spider/include/direct_left_right_left_join_nullable_deinit.inc
@@ -0,0 +1,9 @@
+--let $OUTPUT_CHILD_GROUP2= $OUTPUT_CHILD_GROUP2_BACKUP
+--let $USE_GENERAL_LOG= $USE_GENERAL_LOG_BACKUP
+--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/include/direct_left_right_left_join_nullable_init.inc b/storage/spider/mysql-test/spider/include/direct_left_right_left_join_nullable_init.inc
new file mode 100644
index 00000000000..7e4947bf078
--- /dev/null
+++ b/storage/spider/mysql-test/spider/include/direct_left_right_left_join_nullable_init.inc
@@ -0,0 +1,13 @@
+--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 WHERE argument LIKE '%select %';
+--let $OUTPUT_CHILD_GROUP2_BACKUP= $OUTPUT_CHILD_GROUP2
+--let $OUTPUT_CHILD_GROUP2= 1
+--let $USE_GENERAL_LOG_BACKUP= $USE_GENERAL_LOG
+--let $USE_GENERAL_LOG= 1
diff --git a/storage/spider/mysql-test/spider/include/direct_right_join_deinit.inc b/storage/spider/mysql-test/spider/include/direct_right_join_deinit.inc
new file mode 100644
index 00000000000..53bc29a0016
--- /dev/null
+++ b/storage/spider/mysql-test/spider/include/direct_right_join_deinit.inc
@@ -0,0 +1,9 @@
+--let $OUTPUT_CHILD_GROUP2= $OUTPUT_CHILD_GROUP2_BACKUP
+--let $USE_GENERAL_LOG= $USE_GENERAL_LOG_BACKUP
+--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/include/direct_right_join_init.inc b/storage/spider/mysql-test/spider/include/direct_right_join_init.inc
new file mode 100644
index 00000000000..7e4947bf078
--- /dev/null
+++ b/storage/spider/mysql-test/spider/include/direct_right_join_init.inc
@@ -0,0 +1,13 @@
+--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 WHERE argument LIKE '%select %';
+--let $OUTPUT_CHILD_GROUP2_BACKUP= $OUTPUT_CHILD_GROUP2
+--let $OUTPUT_CHILD_GROUP2= 1
+--let $USE_GENERAL_LOG_BACKUP= $USE_GENERAL_LOG
+--let $USE_GENERAL_LOG= 1
diff --git a/storage/spider/mysql-test/spider/include/direct_right_join_nullable_deinit.inc b/storage/spider/mysql-test/spider/include/direct_right_join_nullable_deinit.inc
new file mode 100644
index 00000000000..53bc29a0016
--- /dev/null
+++ b/storage/spider/mysql-test/spider/include/direct_right_join_nullable_deinit.inc
@@ -0,0 +1,9 @@
+--let $OUTPUT_CHILD_GROUP2= $OUTPUT_CHILD_GROUP2_BACKUP
+--let $USE_GENERAL_LOG= $USE_GENERAL_LOG_BACKUP
+--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/include/direct_right_join_nullable_init.inc b/storage/spider/mysql-test/spider/include/direct_right_join_nullable_init.inc
new file mode 100644
index 00000000000..7e4947bf078
--- /dev/null
+++ b/storage/spider/mysql-test/spider/include/direct_right_join_nullable_init.inc
@@ -0,0 +1,13 @@
+--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 WHERE argument LIKE '%select %';
+--let $OUTPUT_CHILD_GROUP2_BACKUP= $OUTPUT_CHILD_GROUP2
+--let $OUTPUT_CHILD_GROUP2= 1
+--let $USE_GENERAL_LOG_BACKUP= $USE_GENERAL_LOG
+--let $USE_GENERAL_LOG= 1
diff --git a/storage/spider/mysql-test/spider/include/direct_right_left_join_nullable_deinit.inc b/storage/spider/mysql-test/spider/include/direct_right_left_join_nullable_deinit.inc
new file mode 100644
index 00000000000..53bc29a0016
--- /dev/null
+++ b/storage/spider/mysql-test/spider/include/direct_right_left_join_nullable_deinit.inc
@@ -0,0 +1,9 @@
+--let $OUTPUT_CHILD_GROUP2= $OUTPUT_CHILD_GROUP2_BACKUP
+--let $USE_GENERAL_LOG= $USE_GENERAL_LOG_BACKUP
+--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/include/direct_right_left_join_nullable_init.inc b/storage/spider/mysql-test/spider/include/direct_right_left_join_nullable_init.inc
new file mode 100644
index 00000000000..7e4947bf078
--- /dev/null
+++ b/storage/spider/mysql-test/spider/include/direct_right_left_join_nullable_init.inc
@@ -0,0 +1,13 @@
+--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 WHERE argument LIKE '%select %';
+--let $OUTPUT_CHILD_GROUP2_BACKUP= $OUTPUT_CHILD_GROUP2
+--let $OUTPUT_CHILD_GROUP2= 1
+--let $USE_GENERAL_LOG_BACKUP= $USE_GENERAL_LOG
+--let $USE_GENERAL_LOG= 1
diff --git a/storage/spider/mysql-test/spider/include/direct_right_left_right_join_nullable_deinit.inc b/storage/spider/mysql-test/spider/include/direct_right_left_right_join_nullable_deinit.inc
new file mode 100644
index 00000000000..53bc29a0016
--- /dev/null
+++ b/storage/spider/mysql-test/spider/include/direct_right_left_right_join_nullable_deinit.inc
@@ -0,0 +1,9 @@
+--let $OUTPUT_CHILD_GROUP2= $OUTPUT_CHILD_GROUP2_BACKUP
+--let $USE_GENERAL_LOG= $USE_GENERAL_LOG_BACKUP
+--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/include/direct_right_left_right_join_nullable_init.inc b/storage/spider/mysql-test/spider/include/direct_right_left_right_join_nullable_init.inc
new file mode 100644
index 00000000000..7e4947bf078
--- /dev/null
+++ b/storage/spider/mysql-test/spider/include/direct_right_left_right_join_nullable_init.inc
@@ -0,0 +1,13 @@
+--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 WHERE argument LIKE '%select %';
+--let $OUTPUT_CHILD_GROUP2_BACKUP= $OUTPUT_CHILD_GROUP2
+--let $OUTPUT_CHILD_GROUP2= 1
+--let $USE_GENERAL_LOG_BACKUP= $USE_GENERAL_LOG
+--let $USE_GENERAL_LOG= 1
diff --git a/storage/spider/mysql-test/spider/include/init_spider.inc b/storage/spider/mysql-test/spider/include/init_spider.inc
index 90c4b7d7084..1da1ec970b5 100644
--- a/storage/spider/mysql-test/spider/include/init_spider.inc
+++ b/storage/spider/mysql-test/spider/include/init_spider.inc
@@ -103,10 +103,17 @@ if (!$VERSION_COMPILE_OS_WIN)
);
}
+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 = 1, 1, 0)`)
{
DROP TABLE IF EXISTS mysql.spider_xa;
@@ -245,22 +252,32 @@ if (`SELECT IF($PLUGIN_VERSION = 2, 1, 0)`)
}
if (`SELECT IF($PLUGIN_VERSION = 3, 1, 0)`)
{
+ let $ENGINE_NAME=
+ `SELECT IF (STRCMP('$SERVER_NAME', 'MariaDB') = 0,
+ IF ($SERVER_MAJOR_VERSION = 10,
+ IF ($SERVER_MINOR_VERSION < 4, 'MyISAM',
+ 'Aria transactional=1'),
+ IF ($SERVER_MAJOR_VERSION < 10, 'MyISAM',
+ 'Aria transactional=1')),
+ 'MyISAM')`;
DROP TABLE IF EXISTS mysql.spider_xa;
+ eval
CREATE TABLE mysql.spider_xa(
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)
- ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
+ ) ENGINE=$ENGINE_NAME DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
DROP TABLE IF EXISTS mysql.spider_xa_member;
+ eval
CREATE TABLE mysql.spider_xa_member(
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 '',
@@ -276,11 +293,38 @@ if (`SELECT IF($PLUGIN_VERSION = 3, 1, 0)`)
default_file text default null,
default_group char(64) default null,
KEY idx1 (data, format_id, gtrid_length, host)
- ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
+ ) ENGINE=$ENGINE_NAME DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
+ DROP TABLE IF EXISTS mysql.spider_xa_failed_log;
+ eval
+ CREATE TABLE mysql.spider_xa_failed_log(
+ format_id int not null default 0,
+ gtrid_length int not null default 0,
+ bqual_length int not null default 0,
+ data binary(128) not null default '',
+ scheme char(64) not null default '',
+ host char(64) not null default '',
+ port char(5) not null default '',
+ socket text not null,
+ username char(64) not null default '',
+ password char(64) not null default '',
+ ssl_ca text,
+ ssl_capath text,
+ ssl_cert text,
+ ssl_cipher char(64) default null,
+ ssl_key text,
+ ssl_verify_server_cert tinyint not null default 0,
+ default_file text,
+ default_group char(64) default null,
+ thread_id int default null,
+ status char(8) not null default '',
+ failed_time timestamp not null default current_timestamp,
+ key idx1 (data, format_id, gtrid_length, host)
+ ) ENGINE=$ENGINE_NAME DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
DROP TABLE IF EXISTS mysql.spider_tables;
+ eval
CREATE TABLE mysql.spider_tables(
db_name char(64) not null default '',
- table_name char(64) not null default '',
+ table_name char(199) not null default '',
link_id int not null default 0,
priority bigint not null default 0,
server char(64) default null,
@@ -296,20 +340,25 @@ if (`SELECT IF($PLUGIN_VERSION = 3, 1, 0)`)
ssl_cipher char(64) default null,
ssl_key text default null,
ssl_verify_server_cert tinyint not null default 0,
+ monitoring_binlog_pos_at_failing tinyint not null default 0,
default_file text default null,
default_group char(64) default null,
tgt_db_name char(64) default null,
tgt_table_name char(64) default null,
link_status tinyint not null default 1,
+ block_status tinyint not null default 0,
+ static_link_id char(64) default null,
PRIMARY KEY (db_name, table_name, link_id),
- KEY idx1 (priority)
- ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
+ KEY idx1 (priority),
+ UNIQUE KEY uidx1 (db_name, table_name, static_link_id)
+ ) ENGINE=$ENGINE_NAME DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
DROP TABLE IF EXISTS mysql.spider_link_mon_servers;
+ eval
CREATE TABLE mysql.spider_link_mon_servers(
db_name char(64) not null default '',
- table_name char(64) not null default '',
- link_id char(5) not null default '',
- sid int not null default 0,
+ table_name char(199) not null default '',
+ 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,
@@ -326,14 +375,51 @@ if (`SELECT IF($PLUGIN_VERSION = 3, 1, 0)`)
default_file text default null,
default_group char(64) default null,
PRIMARY KEY (db_name, table_name, link_id, sid)
- ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
+ ) ENGINE=$ENGINE_NAME DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
DROP TABLE IF EXISTS mysql.spider_link_failed_log;
+ eval
CREATE TABLE mysql.spider_link_failed_log(
db_name char(64) not null default '',
- table_name char(64) not null default '',
- link_id int not null default 0,
+ table_name char(199) not null default '',
+ link_id char(64) not null default '',
failed_time timestamp not null default current_timestamp
- ) ENGINE=MYISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
+ ) ENGINE=$ENGINE_NAME DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
+ DROP TABLE IF EXISTS mysql.spider_table_position_for_recovery;
+ eval
+ CREATE TABLE mysql.spider_table_position_for_recovery(
+ db_name char(64) not null default '',
+ table_name char(199) not null default '',
+ failed_link_id int not null default 0,
+ source_link_id int not null default 0,
+ file text,
+ position text,
+ gtid text,
+ primary key (db_name, table_name, failed_link_id, source_link_id)
+ ) ENGINE=$ENGINE_NAME DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
+ DROP TABLE IF EXISTS mysql.spider_table_sts;
+ eval
+ CREATE TABLE mysql.spider_table_sts(
+ db_name char(64) not null default '',
+ table_name char(199) not null default '',
+ data_file_length bigint unsigned not null default 0,
+ max_data_file_length bigint unsigned not null default 0,
+ index_file_length bigint unsigned not null default 0,
+ records bigint unsigned not null default 0,
+ mean_rec_length bigint unsigned not null default 0,
+ check_time datetime not null default '0000-00-00 00:00:00',
+ create_time datetime not null default '0000-00-00 00:00:00',
+ update_time datetime not null default '0000-00-00 00:00:00',
+ primary key (db_name, table_name)
+ ) ENGINE=$ENGINE_NAME DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
+ DROP TABLE IF EXISTS mysql.spider_table_crd;
+ eval
+ CREATE TABLE mysql.spider_table_crd(
+ db_name char(64) not null default '',
+ table_name char(199) not null default '',
+ key_seq int unsigned not null default 0,
+ cardinality bigint not null default 0,
+ primary key (db_name, table_name, key_seq)
+ ) ENGINE=$ENGINE_NAME DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
}
SET spider_internal_sql_log_off= 0;
diff --git a/storage/spider/mysql-test/spider/include/partition_cond_push_deinit.inc b/storage/spider/mysql-test/spider/include/partition_cond_push_deinit.inc
new file mode 100644
index 00000000000..668eaa2fdba
--- /dev/null
+++ b/storage/spider/mysql-test/spider/include/partition_cond_push_deinit.inc
@@ -0,0 +1,20 @@
+--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
+--let $CHILD2_3_DROP_TABLES= $CHILD2_3_DROP_TABLES_BACKUP
+--let $CHILD2_3_CREATE_TABLES= $CHILD2_3_CREATE_TABLES_BACKUP
+--let $CHILD2_3_SELECT_TABLES= $CHILD2_3_SELECT_TABLES_BACKUP
+--let $OUTPUT_CHILD_GROUP2= $OUTPUT_CHILD_GROUP2_BACKUP
+--let $USE_GENERAL_LOG= $USE_GENERAL_LOG_BACKUP
+--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/include/partition_cond_push_init.inc b/storage/spider/mysql-test/spider/include/partition_cond_push_init.inc
new file mode 100644
index 00000000000..30a333d6699
--- /dev/null
+++ b/storage/spider/mysql-test/spider/include/partition_cond_push_init.inc
@@ -0,0 +1,58 @@
+--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"'
+ PARTITION BY KEY(value) (
+ PARTITION pt1 COMMENT='srv "s_2_1"',
+ PARTITION pt2 COMMENT='srv "s_2_2"',
+ PARTITION pt3 COMMENT='srv "s_2_3"'
+ );
+--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 (
+ value int NOT NULL
+ ) $CHILD2_1_ENGINE $CHILD2_1_CHARSET;
+--let $CHILD2_1_SELECT_TABLES_BACKUP= $CHILD2_1_SELECT_TABLES
+let $CHILD2_1_SELECT_TABLES=
+ SELECT value FROM tbl_a ORDER BY value;
+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_a;
+--let $CHILD2_2_CREATE_TABLES_BACKUP= $CHILD2_2_CREATE_TABLES
+let $CHILD2_2_CREATE_TABLES=
+ CREATE TABLE tbl_a (
+ value int NOT NULL
+ ) $CHILD2_2_ENGINE $CHILD2_2_CHARSET;
+--let $CHILD2_2_SELECT_TABLES_BACKUP= $CHILD2_2_SELECT_TABLES
+let $CHILD2_2_SELECT_TABLES=
+ SELECT value FROM tbl_a ORDER BY value;
+let $CHILD2_2_SELECT_ARGUMENT1=
+ SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+--let $CHILD2_3_DROP_TABLES_BACKUP= $CHILD2_3_DROP_TABLES
+let $CHILD2_3_DROP_TABLES=
+ DROP TABLE IF EXISTS tbl_a;
+--let $CHILD2_3_CREATE_TABLES_BACKUP= $CHILD2_3_CREATE_TABLES
+let $CHILD2_3_CREATE_TABLES=
+ CREATE TABLE tbl_a (
+ value int NOT NULL
+ ) $CHILD2_3_ENGINE $CHILD2_3_CHARSET;
+--let $CHILD2_3_SELECT_TABLES_BACKUP= $CHILD2_3_SELECT_TABLES
+let $CHILD2_3_SELECT_TABLES=
+ SELECT value FROM tbl_a ORDER BY value;
+let $CHILD2_3_SELECT_ARGUMENT1=
+ SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+--let $OUTPUT_CHILD_GROUP2_BACKUP= $OUTPUT_CHILD_GROUP2
+--let $OUTPUT_CHILD_GROUP2= 1
+--let $USE_GENERAL_LOG_BACKUP= $USE_GENERAL_LOG
+--let $USE_GENERAL_LOG= 1
diff --git a/storage/spider/mysql-test/spider/include/partition_fulltext_deinit.inc b/storage/spider/mysql-test/spider/include/partition_fulltext_deinit.inc
new file mode 100644
index 00000000000..c0c652d14f5
--- /dev/null
+++ b/storage/spider/mysql-test/spider/include/partition_fulltext_deinit.inc
@@ -0,0 +1,23 @@
+--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
+--let $CHILD2_3_DROP_TABLES= $CHILD2_3_DROP_TABLES_BACKUP
+--let $CHILD2_3_CREATE_TABLES= $CHILD2_3_CREATE_TABLES_BACKUP
+--let $CHILD2_3_SELECT_TABLES= $CHILD2_3_SELECT_TABLES_BACKUP
+--let $OUTPUT_CHILD_GROUP2= $OUTPUT_CHILD_GROUP2_BACKUP
+--let $USE_GENERAL_LOG= $USE_GENERAL_LOG_BACKUP
+--connection master_1
+set session join_cache_level= @old_join_cache_level;
+set session optimizer_switch= @old_optimizer_switch;
+--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/include/partition_fulltext_init.inc b/storage/spider/mysql-test/spider/include/partition_fulltext_init.inc
new file mode 100644
index 00000000000..754395493af
--- /dev/null
+++ b/storage/spider/mysql-test/spider/include/partition_fulltext_init.inc
@@ -0,0 +1,72 @@
+--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", bka_mode "1"'
+ PARTITION BY KEY(pkey) (
+ PARTITION pt1 COMMENT='srv "s_2_1"',
+ PARTITION pt2 COMMENT='srv "s_2_2"',
+ PARTITION pt3 COMMENT='srv "s_2_3"'
+ );
+--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,
+ words text NOT NULL,
+ PRIMARY KEY (pkey),
+ FULLTEXT (words)
+ ) $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_a;
+--let $CHILD2_2_CREATE_TABLES_BACKUP= $CHILD2_2_CREATE_TABLES
+let $CHILD2_2_CREATE_TABLES=
+ CREATE TABLE tbl_a (
+ pkey int NOT NULL,
+ words text NOT NULL,
+ PRIMARY KEY (pkey),
+ FULLTEXT (words)
+ ) $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_a ORDER BY pkey;
+let $CHILD2_2_SELECT_ARGUMENT1=
+ SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+--let $CHILD2_3_DROP_TABLES_BACKUP= $CHILD2_3_DROP_TABLES
+let $CHILD2_3_DROP_TABLES=
+ DROP TABLE IF EXISTS tbl_a;
+--let $CHILD2_3_CREATE_TABLES_BACKUP= $CHILD2_3_CREATE_TABLES
+let $CHILD2_3_CREATE_TABLES=
+ CREATE TABLE tbl_a (
+ pkey int NOT NULL,
+ words text NOT NULL,
+ PRIMARY KEY (pkey),
+ FULLTEXT (words)
+ ) $CHILD2_3_ENGINE $CHILD2_3_CHARSET;
+--let $CHILD2_3_SELECT_TABLES_BACKUP= $CHILD2_3_SELECT_TABLES
+let $CHILD2_3_SELECT_TABLES=
+ SELECT pkey FROM tbl_a ORDER BY pkey;
+let $CHILD2_3_SELECT_ARGUMENT1=
+ SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+--let $OUTPUT_CHILD_GROUP2_BACKUP= $OUTPUT_CHILD_GROUP2
+--let $OUTPUT_CHILD_GROUP2= 1
+--let $USE_GENERAL_LOG_BACKUP= $USE_GENERAL_LOG
+--let $USE_GENERAL_LOG= 1
+--connection master_1
+set @old_join_cache_level= @@join_cache_level;
+set session join_cache_level= 5;
+set @old_optimizer_switch= @@optimizer_switch;
+set session optimizer_switch= 'mrr=on';
diff --git a/storage/spider/mysql-test/spider/include/partition_join_pushdown_for_single_partition_deinit.inc b/storage/spider/mysql-test/spider/include/partition_join_pushdown_for_single_partition_deinit.inc
new file mode 100644
index 00000000000..d9dfcf23ed6
--- /dev/null
+++ b/storage/spider/mysql-test/spider/include/partition_join_pushdown_for_single_partition_deinit.inc
@@ -0,0 +1,30 @@
+--connection master_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_1_DROP_TABLES2= $CHILD2_1_DROP_TABLES2_BACKUP
+--let $CHILD2_1_CREATE_TABLES2= $CHILD2_1_CREATE_TABLES2_BACKUP
+--let $CHILD2_1_SELECT_TABLES2= $CHILD2_1_SELECT_TABLES2_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
+--let $CHILD2_2_DROP_TABLES2= $CHILD2_2_DROP_TABLES2_BACKUP
+--let $CHILD2_2_CREATE_TABLES2= $CHILD2_2_CREATE_TABLES2_BACKUP
+--let $CHILD2_2_SELECT_TABLES2= $CHILD2_2_SELECT_TABLES2_BACKUP
+--let $CHILD2_3_DROP_TABLES= $CHILD2_3_DROP_TABLES_BACKUP
+--let $CHILD2_3_CREATE_TABLES= $CHILD2_3_CREATE_TABLES_BACKUP
+--let $CHILD2_3_SELECT_TABLES= $CHILD2_3_SELECT_TABLES_BACKUP
+--let $CHILD2_3_DROP_TABLES2= $CHILD2_3_DROP_TABLES2_BACKUP
+--let $CHILD2_3_CREATE_TABLES2= $CHILD2_3_CREATE_TABLES2_BACKUP
+--let $CHILD2_3_SELECT_TABLES2= $CHILD2_3_SELECT_TABLES2_BACKUP
+--let $OUTPUT_CHILD_GROUP2= $OUTPUT_CHILD_GROUP2_BACKUP
+--let $USE_GENERAL_LOG= $USE_GENERAL_LOG_BACKUP
+--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/include/partition_join_pushdown_for_single_partition_init.inc b/storage/spider/mysql-test/spider/include/partition_join_pushdown_for_single_partition_init.inc
new file mode 100644
index 00000000000..dccffa60c0d
--- /dev/null
+++ b/storage/spider/mysql-test/spider/include/partition_join_pushdown_for_single_partition_init.inc
@@ -0,0 +1,105 @@
+--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"'
+ PARTITION BY RANGE(value) (
+ PARTITION pt1 VALUES LESS THAN (5) COMMENT='srv "s_2_1"',
+ PARTITION pt2 VALUES LESS THAN (10) COMMENT='srv "s_2_2"',
+ PARTITION pt3 VALUES LESS THAN (15) COMMENT='srv "s_2_3"'
+ );
+--let $MASTER_1_COMMENT_2_2_BACKUP= $MASTER_1_COMMENT_2_2
+let $MASTER_1_COMMENT_2_2=
+ COMMENT='table "tbl_b"'
+ PARTITION BY RANGE(value2) (
+ PARTITION pt1 VALUES LESS THAN (5) COMMENT='srv "s_2_1"',
+ PARTITION pt2 VALUES LESS THAN (10) COMMENT='srv "s_2_2"',
+ PARTITION pt3 VALUES LESS THAN (15) COMMENT='srv "s_2_3"'
+ );
+--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 (
+ value int NOT NULL,
+ PRIMARY KEY(value)
+ ) $CHILD2_1_ENGINE $CHILD2_1_CHARSET;
+--let $CHILD2_1_SELECT_TABLES_BACKUP= $CHILD2_1_SELECT_TABLES
+let $CHILD2_1_SELECT_TABLES=
+ SELECT value FROM tbl_a ORDER BY value;
+--let $CHILD2_1_DROP_TABLES2_BACKUP= $CHILD2_1_DROP_TABLES2
+let $CHILD2_1_DROP_TABLES2=
+ DROP TABLE IF EXISTS tbl_b;
+--let $CHILD2_1_CREATE_TABLES2_BACKUP= $CHILD2_1_CREATE_TABLES2
+let $CHILD2_1_CREATE_TABLES2=
+ CREATE TABLE tbl_b (
+ value2 int NOT NULL,
+ PRIMARY KEY(value2)
+ ) $CHILD2_1_ENGINE $CHILD2_1_CHARSET;
+--let $CHILD2_1_SELECT_TABLES2_BACKUP= $CHILD2_1_SELECT_TABLES2
+let $CHILD2_1_SELECT_TABLES2=
+ SELECT value FROM tbl_b ORDER BY value2;
+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_a;
+--let $CHILD2_2_CREATE_TABLES_BACKUP= $CHILD2_2_CREATE_TABLES
+let $CHILD2_2_CREATE_TABLES=
+ CREATE TABLE tbl_a (
+ value int NOT NULL,
+ PRIMARY KEY(value)
+ ) $CHILD2_2_ENGINE $CHILD2_2_CHARSET;
+--let $CHILD2_2_SELECT_TABLES_BACKUP= $CHILD2_2_SELECT_TABLES
+let $CHILD2_2_SELECT_TABLES=
+ SELECT value FROM tbl_a ORDER BY value;
+--let $CHILD2_2_DROP_TABLES2_BACKUP= $CHILD2_2_DROP_TABLES2
+let $CHILD2_2_DROP_TABLES2=
+ DROP TABLE IF EXISTS tbl_b;
+--let $CHILD2_2_CREATE_TABLES2_BACKUP= $CHILD2_2_CREATE_TABLES2
+let $CHILD2_2_CREATE_TABLES2=
+ CREATE TABLE tbl_b (
+ value2 int NOT NULL,
+ PRIMARY KEY(value2)
+ ) $CHILD2_2_ENGINE $CHILD2_2_CHARSET;
+--let $CHILD2_2_SELECT_TABLES2_BACKUP= $CHILD2_2_SELECT_TABLES2
+let $CHILD2_2_SELECT_TABLES2=
+ SELECT value FROM tbl_b ORDER BY value;
+let $CHILD2_2_SELECT_ARGUMENT1=
+ SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+--let $CHILD2_3_DROP_TABLES_BACKUP= $CHILD2_3_DROP_TABLES
+let $CHILD2_3_DROP_TABLES=
+ DROP TABLE IF EXISTS tbl_a;
+--let $CHILD2_3_CREATE_TABLES_BACKUP= $CHILD2_3_CREATE_TABLES
+let $CHILD2_3_CREATE_TABLES=
+ CREATE TABLE tbl_a (
+ value int NOT NULL,
+ PRIMARY KEY(value)
+ ) $CHILD2_3_ENGINE $CHILD2_3_CHARSET;
+--let $CHILD2_3_SELECT_TABLES_BACKUP= $CHILD2_3_SELECT_TABLES
+let $CHILD2_3_SELECT_TABLES=
+ SELECT value FROM tbl_a ORDER BY value;
+--let $CHILD2_3_DROP_TABLES2_BACKUP= $CHILD2_3_DROP_TABLES2
+let $CHILD2_3_DROP_TABLES2=
+ DROP TABLE IF EXISTS tbl_b;
+--let $CHILD2_3_CREATE_TABLES2_BACKUP= $CHILD2_3_CREATE_TABLES2
+let $CHILD2_3_CREATE_TABLES2=
+ CREATE TABLE tbl_b (
+ value2 int NOT NULL,
+ PRIMARY KEY(value2)
+ ) $CHILD2_3_ENGINE $CHILD2_3_CHARSET;
+--let $CHILD2_3_SELECT_TABLES2_BACKUP= $CHILD2_3_SELECT_TABLES2
+let $CHILD2_3_SELECT_TABLES2=
+ SELECT value FROM tbl_b ORDER BY value;
+let $CHILD2_3_SELECT_ARGUMENT1=
+ SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+--let $OUTPUT_CHILD_GROUP2_BACKUP= $OUTPUT_CHILD_GROUP2
+--let $OUTPUT_CHILD_GROUP2= 1
+--let $USE_GENERAL_LOG_BACKUP= $USE_GENERAL_LOG
+--let $USE_GENERAL_LOG= 1
diff --git a/storage/spider/mysql-test/spider/include/partition_mrr_deinit.inc b/storage/spider/mysql-test/spider/include/partition_mrr_deinit.inc
new file mode 100644
index 00000000000..c0c652d14f5
--- /dev/null
+++ b/storage/spider/mysql-test/spider/include/partition_mrr_deinit.inc
@@ -0,0 +1,23 @@
+--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
+--let $CHILD2_3_DROP_TABLES= $CHILD2_3_DROP_TABLES_BACKUP
+--let $CHILD2_3_CREATE_TABLES= $CHILD2_3_CREATE_TABLES_BACKUP
+--let $CHILD2_3_SELECT_TABLES= $CHILD2_3_SELECT_TABLES_BACKUP
+--let $OUTPUT_CHILD_GROUP2= $OUTPUT_CHILD_GROUP2_BACKUP
+--let $USE_GENERAL_LOG= $USE_GENERAL_LOG_BACKUP
+--connection master_1
+set session join_cache_level= @old_join_cache_level;
+set session optimizer_switch= @old_optimizer_switch;
+--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/include/partition_mrr_init.inc b/storage/spider/mysql-test/spider/include/partition_mrr_init.inc
new file mode 100644
index 00000000000..03e113940a7
--- /dev/null
+++ b/storage/spider/mysql-test/spider/include/partition_mrr_init.inc
@@ -0,0 +1,92 @@
+--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", bka_mode "1"'
+ PARTITION BY KEY(pkey) (
+ PARTITION pt1 COMMENT='srv "s_2_1"',
+ PARTITION pt2 COMMENT='srv "s_2_2"',
+ PARTITION pt3 COMMENT='srv "s_2_3"'
+ );
+--let $MASTER_1_COMMENT_2_2_BACKUP= $MASTER_1_COMMENT_2_2
+let $MASTER_1_COMMENT_2_2=
+ COMMENT='table "tbl_b", bka_mode "1"'
+ PARTITION BY KEY(pkey) (
+ PARTITION pt1 COMMENT='srv "s_2_2"',
+ PARTITION pt2 COMMENT='srv "s_2_3"',
+ PARTITION pt3 COMMENT='srv "s_2_1"'
+ );
+--let $CHILD2_1_DROP_TABLES_BACKUP= $CHILD2_1_DROP_TABLES
+let $CHILD2_1_DROP_TABLES=
+ DROP TABLE IF EXISTS tbl_a $STR_SEMICOLON
+ DROP TABLE IF EXISTS tbl_b;
+--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 $STR_SEMICOLON
+ CREATE TABLE tbl_b (
+ 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 $STR_SEMICOLON
+ SELECT pkey FROM tbl_b 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_a $STR_SEMICOLON
+ DROP TABLE IF EXISTS tbl_b;
+--let $CHILD2_2_CREATE_TABLES_BACKUP= $CHILD2_2_CREATE_TABLES
+let $CHILD2_2_CREATE_TABLES=
+ CREATE TABLE tbl_a (
+ pkey int NOT NULL,
+ PRIMARY KEY (pkey)
+ ) $CHILD2_2_ENGINE $CHILD2_2_CHARSET $STR_SEMICOLON
+ 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_a ORDER BY pkey $STR_SEMICOLON
+ SELECT pkey FROM tbl_b ORDER BY pkey;
+let $CHILD2_2_SELECT_ARGUMENT1=
+ SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+--let $CHILD2_3_DROP_TABLES_BACKUP= $CHILD2_3_DROP_TABLES
+let $CHILD2_3_DROP_TABLES=
+ DROP TABLE IF EXISTS tbl_a $STR_SEMICOLON
+ DROP TABLE IF EXISTS tbl_b;
+--let $CHILD2_3_CREATE_TABLES_BACKUP= $CHILD2_3_CREATE_TABLES
+let $CHILD2_3_CREATE_TABLES=
+ CREATE TABLE tbl_a (
+ pkey int NOT NULL,
+ PRIMARY KEY (pkey)
+ ) $CHILD2_3_ENGINE $CHILD2_3_CHARSET $STR_SEMICOLON
+ CREATE TABLE tbl_b (
+ pkey int NOT NULL,
+ PRIMARY KEY (pkey)
+ ) $CHILD2_3_ENGINE $CHILD2_3_CHARSET;
+--let $CHILD2_3_SELECT_TABLES_BACKUP= $CHILD2_3_SELECT_TABLES
+let $CHILD2_3_SELECT_TABLES=
+ SELECT pkey FROM tbl_a ORDER BY pkey $STR_SEMICOLON
+ SELECT pkey FROM tbl_b ORDER BY pkey;
+let $CHILD2_3_SELECT_ARGUMENT1=
+ SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+--let $OUTPUT_CHILD_GROUP2_BACKUP= $OUTPUT_CHILD_GROUP2
+--let $OUTPUT_CHILD_GROUP2= 1
+--let $USE_GENERAL_LOG_BACKUP= $USE_GENERAL_LOG
+--let $USE_GENERAL_LOG= 1
+--connection master_1
+set @old_join_cache_level= @@join_cache_level;
+set session join_cache_level= 5;
+set @old_optimizer_switch= @@optimizer_switch;
+set session optimizer_switch= 'mrr=on';
diff --git a/storage/spider/mysql-test/spider/include/quick_mode_0_deinit.inc b/storage/spider/mysql-test/spider/include/quick_mode_0_deinit.inc
new file mode 100644
index 00000000000..72d09f54316
--- /dev/null
+++ b/storage/spider/mysql-test/spider/include/quick_mode_0_deinit.inc
@@ -0,0 +1,21 @@
+--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
+--let $OUTPUT_CHILD_GROUP2= $OUTPUT_CHILD_GROUP2_BACKUP
+--let $USE_GENERAL_LOG= $USE_GENERAL_LOG_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/include/quick_mode_0_init.inc b/storage/spider/mysql-test/spider/include/quick_mode_0_init.inc
new file mode 100644
index 00000000000..92afb3bf10b
--- /dev/null
+++ b/storage/spider/mysql-test/spider/include/quick_mode_0_init.inc
@@ -0,0 +1,55 @@
+--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 %';
+--let $OUTPUT_CHILD_GROUP2_BACKUP= $OUTPUT_CHILD_GROUP2
+--let $OUTPUT_CHILD_GROUP2= 1
+--let $USE_GENERAL_LOG_BACKUP= $USE_GENERAL_LOG
+--let $USE_GENERAL_LOG= 1
+--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;
+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/include/quick_mode_1_deinit.inc b/storage/spider/mysql-test/spider/include/quick_mode_1_deinit.inc
new file mode 100644
index 00000000000..72d09f54316
--- /dev/null
+++ b/storage/spider/mysql-test/spider/include/quick_mode_1_deinit.inc
@@ -0,0 +1,21 @@
+--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
+--let $OUTPUT_CHILD_GROUP2= $OUTPUT_CHILD_GROUP2_BACKUP
+--let $USE_GENERAL_LOG= $USE_GENERAL_LOG_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/include/quick_mode_1_init.inc b/storage/spider/mysql-test/spider/include/quick_mode_1_init.inc
new file mode 100644
index 00000000000..cc5a847fdc0
--- /dev/null
+++ b/storage/spider/mysql-test/spider/include/quick_mode_1_init.inc
@@ -0,0 +1,55 @@
+--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 %';
+--let $OUTPUT_CHILD_GROUP2_BACKUP= $OUTPUT_CHILD_GROUP2
+--let $OUTPUT_CHILD_GROUP2= 1
+--let $USE_GENERAL_LOG_BACKUP= $USE_GENERAL_LOG
+--let $USE_GENERAL_LOG= 1
+--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;
+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/include/quick_mode_2_deinit.inc b/storage/spider/mysql-test/spider/include/quick_mode_2_deinit.inc
new file mode 100644
index 00000000000..72d09f54316
--- /dev/null
+++ b/storage/spider/mysql-test/spider/include/quick_mode_2_deinit.inc
@@ -0,0 +1,21 @@
+--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
+--let $OUTPUT_CHILD_GROUP2= $OUTPUT_CHILD_GROUP2_BACKUP
+--let $USE_GENERAL_LOG= $USE_GENERAL_LOG_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/include/quick_mode_2_init.inc b/storage/spider/mysql-test/spider/include/quick_mode_2_init.inc
new file mode 100644
index 00000000000..3a16bb1dc63
--- /dev/null
+++ b/storage/spider/mysql-test/spider/include/quick_mode_2_init.inc
@@ -0,0 +1,55 @@
+--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 %';
+--let $OUTPUT_CHILD_GROUP2_BACKUP= $OUTPUT_CHILD_GROUP2
+--let $OUTPUT_CHILD_GROUP2= 1
+--let $USE_GENERAL_LOG_BACKUP= $USE_GENERAL_LOG
+--let $USE_GENERAL_LOG= 1
+--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;
+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/include/quick_mode_3_deinit.inc b/storage/spider/mysql-test/spider/include/quick_mode_3_deinit.inc
new file mode 100644
index 00000000000..72d09f54316
--- /dev/null
+++ b/storage/spider/mysql-test/spider/include/quick_mode_3_deinit.inc
@@ -0,0 +1,21 @@
+--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
+--let $OUTPUT_CHILD_GROUP2= $OUTPUT_CHILD_GROUP2_BACKUP
+--let $USE_GENERAL_LOG= $USE_GENERAL_LOG_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/include/quick_mode_3_init.inc b/storage/spider/mysql-test/spider/include/quick_mode_3_init.inc
new file mode 100644
index 00000000000..df7d713c4c7
--- /dev/null
+++ b/storage/spider/mysql-test/spider/include/quick_mode_3_init.inc
@@ -0,0 +1,55 @@
+--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 %';
+--let $OUTPUT_CHILD_GROUP2_BACKUP= $OUTPUT_CHILD_GROUP2
+--let $OUTPUT_CHILD_GROUP2= 1
+--let $USE_GENERAL_LOG_BACKUP= $USE_GENERAL_LOG
+--let $USE_GENERAL_LOG= 1
+--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;
+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/include/slave_trx_isolation_deinit.inc b/storage/spider/mysql-test/spider/include/slave_trx_isolation_deinit.inc
new file mode 100644
index 00000000000..e5f585e5cca
--- /dev/null
+++ b/storage/spider/mysql-test/spider/include/slave_trx_isolation_deinit.inc
@@ -0,0 +1,17 @@
+--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
+--let $USE_GENERAL_LOG= $USE_GENERAL_LOG_BACKUP
+--connection slave1_1
+set global spider_slave_trx_isolation= @old_spider_slave_trx_isolation;
+--disable_warnings
+--disable_query_log
+--disable_result_log
+--source ../include/deinit_spider.inc
+--source ../t/slave_test_deinit.inc
+--source ../t/test_deinit.inc
+--enable_result_log
+--enable_query_log
+--enable_warnings
diff --git a/storage/spider/mysql-test/spider/include/slave_trx_isolation_init.inc b/storage/spider/mysql-test/spider/include/slave_trx_isolation_init.inc
new file mode 100644
index 00000000000..94ccf1d3295
--- /dev/null
+++ b/storage/spider/mysql-test/spider/include/slave_trx_isolation_init.inc
@@ -0,0 +1,39 @@
+--disable_warnings
+--disable_query_log
+--disable_result_log
+--source ../t/test_init.inc
+--source ../t/slave_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 $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 '%set %';
+--let $OUTPUT_CHILD_GROUP2_BACKUP= $OUTPUT_CHILD_GROUP2
+--let $OUTPUT_CHILD_GROUP2= 1
+--let $USE_GENERAL_LOG_BACKUP= $USE_GENERAL_LOG
+--let $USE_GENERAL_LOG= 1
+--connection slave1_1
+--disable_warnings
+--disable_query_log
+--disable_result_log
+--source ../include/init_spider.inc
+--enable_result_log
+--enable_query_log
+--enable_warnings
+set @old_spider_slave_trx_isolation= @@spider_slave_trx_isolation;
+set global spider_slave_trx_isolation= 1;
diff --git a/storage/spider/mysql-test/spider/r/auto_increment.result b/storage/spider/mysql-test/spider/r/auto_increment.result
new file mode 100644
index 00000000000..d968d58e657
--- /dev/null
+++ b/storage/spider/mysql-test/spider/r/auto_increment.result
@@ -0,0 +1,186 @@
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+child3_1
+child3_2
+child3_3
+
+drop and create databases
+connection master_1;
+DROP DATABASE IF EXISTS auto_test_local;
+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';
+DROP DATABASE IF EXISTS auto_test_remote;
+CREATE DATABASE auto_test_remote;
+USE auto_test_remote;
+
+test select 1
+connection master_1;
+SELECT 1;
+1
+1
+connection child2_1;
+SELECT 1;
+1
+1
+
+create table select test
+connection child2_1;
+CHILD2_1_DROP_TABLES
+CHILD2_1_CREATE_TABLES
+TRUNCATE TABLE mysql.general_log;
+connection master_1;
+DROP TABLE IF EXISTS tbl_a;
+CREATE TABLE tbl_a (
+col_a INT NOT NULL AUTO_INCREMENT,
+col_b VARCHAR(20) DEFAULT 'defg',
+col_c INT NOT NULL DEFAULT 100,
+PRIMARY KEY(col_a)
+) MASTER_1_ENGINE MASTER_1_AUTO_INCREMENT_2_1 MASTER_1_COMMENT_2_1
+SHOW CREATE TABLE tbl_a;
+Table Create Table
+tbl_a CREATE TABLE `tbl_a` (
+ `col_a` int(11) NOT NULL AUTO_INCREMENT,
+ `col_b` varchar(20) DEFAULT 'defg',
+ `col_c` int(11) NOT NULL DEFAULT 100,
+ PRIMARY KEY (`col_a`)
+) ENGINE=SPIDER AUTO_INCREMENT=20 DEFAULT CHARSET=latin1 COMMENT='database "auto_test_remote", table "tbl_a", srv "s_2_1", aim "0"'
+INSERT INTO tbl_a () VALUES ();
+INSERT INTO tbl_a () VALUES ();
+SHOW CREATE TABLE tbl_a;
+Table Create Table
+tbl_a CREATE TABLE `tbl_a` (
+ `col_a` int(11) NOT NULL AUTO_INCREMENT,
+ `col_b` varchar(20) DEFAULT 'defg',
+ `col_c` int(11) NOT NULL DEFAULT 100,
+ PRIMARY KEY (`col_a`)
+) ENGINE=SPIDER DEFAULT CHARSET=latin1 COMMENT='database "auto_test_remote", table "tbl_a", srv "s_2_1", aim "0"'
+ALTER TABLE tbl_a MODIFY col_c MEDIUMINT NOT NULL DEFAULT 100;
+SHOW CREATE TABLE tbl_a;
+Table Create Table
+tbl_a CREATE TABLE `tbl_a` (
+ `col_a` int(11) NOT NULL AUTO_INCREMENT,
+ `col_b` varchar(20) DEFAULT 'defg',
+ `col_c` mediumint(9) NOT NULL DEFAULT 100,
+ PRIMARY KEY (`col_a`)
+) ENGINE=SPIDER AUTO_INCREMENT=20 DEFAULT CHARSET=latin1 COMMENT='database "auto_test_remote", table "tbl_a", srv "s_2_1", aim "0"'
+RENAME TABLE tbl_a TO tbl_x;
+SHOW CREATE TABLE tbl_x;
+Table Create Table
+tbl_x CREATE TABLE `tbl_x` (
+ `col_a` int(11) NOT NULL AUTO_INCREMENT,
+ `col_b` varchar(20) DEFAULT 'defg',
+ `col_c` mediumint(9) NOT NULL DEFAULT 100,
+ PRIMARY KEY (`col_a`)
+) ENGINE=SPIDER AUTO_INCREMENT=20 DEFAULT CHARSET=latin1 COMMENT='database "auto_test_remote", table "tbl_a", srv "s_2_1", aim "0"'
+RENAME TABLE tbl_x TO tbl_a;
+SHOW CREATE TABLE tbl_a;
+Table Create Table
+tbl_a CREATE TABLE `tbl_a` (
+ `col_a` int(11) NOT NULL AUTO_INCREMENT,
+ `col_b` varchar(20) DEFAULT 'defg',
+ `col_c` mediumint(9) NOT NULL DEFAULT 100,
+ PRIMARY KEY (`col_a`)
+) ENGINE=SPIDER AUTO_INCREMENT=20 DEFAULT CHARSET=latin1 COMMENT='database "auto_test_remote", table "tbl_a", srv "s_2_1", aim "0"'
+INSERT INTO tbl_a () VALUES ();
+INSERT INTO tbl_a () VALUES ();
+SHOW CREATE TABLE tbl_a;
+Table Create Table
+tbl_a CREATE TABLE `tbl_a` (
+ `col_a` int(11) NOT NULL AUTO_INCREMENT,
+ `col_b` varchar(20) DEFAULT 'defg',
+ `col_c` mediumint(9) NOT NULL DEFAULT 100,
+ PRIMARY KEY (`col_a`)
+) ENGINE=SPIDER AUTO_INCREMENT=3 DEFAULT CHARSET=latin1 COMMENT='database "auto_test_remote", table "tbl_a", srv "s_2_1", aim "0"'
+MASTER_1_AUTO_INCREMENT1
+SHOW CREATE TABLE tbl_a;
+Table Create Table
+tbl_a CREATE TABLE `tbl_a` (
+ `col_a` int(11) NOT NULL AUTO_INCREMENT,
+ `col_b` varchar(20) DEFAULT 'defg',
+ `col_c` mediumint(9) NOT NULL DEFAULT 100,
+ PRIMARY KEY (`col_a`)
+) ENGINE=SPIDER AUTO_INCREMENT=30 DEFAULT CHARSET=latin1 COMMENT='database "auto_test_remote", table "tbl_a", srv "s_2_1", aim "0"'
+INSERT INTO tbl_a () VALUES ();
+INSERT INTO tbl_a () VALUES ();
+SHOW CREATE TABLE tbl_a;
+Table Create Table
+tbl_a CREATE TABLE `tbl_a` (
+ `col_a` int(11) NOT NULL AUTO_INCREMENT,
+ `col_b` varchar(20) DEFAULT 'defg',
+ `col_c` mediumint(9) NOT NULL DEFAULT 100,
+ PRIMARY KEY (`col_a`)
+) ENGINE=SPIDER AUTO_INCREMENT=5 DEFAULT CHARSET=latin1 COMMENT='database "auto_test_remote", table "tbl_a", srv "s_2_1", aim "0"'
+MASTER_1_AUTO_INCREMENT2
+SHOW CREATE TABLE tbl_a;
+Table Create Table
+tbl_a CREATE TABLE `tbl_a` (
+ `col_a` int(11) NOT NULL AUTO_INCREMENT,
+ `col_b` varchar(20) DEFAULT 'defg',
+ `col_c` mediumint(9) NOT NULL DEFAULT 100,
+ PRIMARY KEY (`col_a`)
+) ENGINE=SPIDER AUTO_INCREMENT=20 DEFAULT CHARSET=latin1 COMMENT='database "auto_test_remote", table "tbl_a", srv "s_2_1", aim "0"'
+INSERT INTO tbl_a () VALUES ();
+INSERT INTO tbl_a () VALUES ();
+SHOW CREATE TABLE tbl_a;
+Table Create Table
+tbl_a CREATE TABLE `tbl_a` (
+ `col_a` int(11) NOT NULL AUTO_INCREMENT,
+ `col_b` varchar(20) DEFAULT 'defg',
+ `col_c` mediumint(9) NOT NULL DEFAULT 100,
+ PRIMARY KEY (`col_a`)
+) ENGINE=SPIDER AUTO_INCREMENT=7 DEFAULT CHARSET=latin1 COMMENT='database "auto_test_remote", table "tbl_a", srv "s_2_1", aim "0"'
+
+select test
+connection child2_1;
+TRUNCATE TABLE mysql.general_log;
+connection master_1;
+SELECT * FROM tbl_a;
+col_a col_b col_c
+1 def 10
+2 def 10
+3 def 10
+4 def 10
+5 def 10
+6 def 10
+7 def 10
+8 def 10
+connection child2_1;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+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
+1 def 10
+2 def 10
+3 def 10
+4 def 10
+5 def 10
+6 def 10
+7 def 10
+8 def 10
+
+deinit
+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;
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+child3_1
+child3_2
+child3_3
+
+end of test
diff --git a/storage/spider/mysql-test/spider/r/checksum_table_with_quick_mode_3.result b/storage/spider/mysql-test/spider/r/checksum_table_with_quick_mode_3.result
new file mode 100644
index 00000000000..ee8e1f056f3
--- /dev/null
+++ b/storage/spider/mysql-test/spider/r/checksum_table_with_quick_mode_3.result
@@ -0,0 +1,104 @@
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+child3_1
+child3_2
+child3_3
+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;
+
+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;
+USE auto_test_remote;
+
+create table and insert
+connection child2_1;
+CHILD2_1_CREATE_TABLES
+TRUNCATE TABLE mysql.general_log;
+connection master_1;
+CREATE TABLE tbl_a (
+pkey int NOT NULL,
+PRIMARY KEY (pkey)
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_1
+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);
+FLUSH TABLES;
+
+select test 1
+connection child2_1;
+TRUNCATE TABLE mysql.general_log;
+connection master_1;
+CHECKSUM TABLE tbl_a EXTENDED;
+Table Checksum
+auto_test_local.tbl_a 1061386331
+connection child2_1;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select `pkey` from `auto_test_remote`.`tbl_a`
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT pkey FROM tbl_a ORDER BY pkey;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+
+deinit
+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 master_1;
+set session spider_quick_mode= @old_spider_quick_mode;
+set session spider_quick_page_size= @old_spider_quick_page_size;
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+child3_1
+child3_2
+child3_3
+
+end of test
diff --git a/storage/spider/mysql-test/spider/r/direct_aggregate.result b/storage/spider/mysql-test/spider/r/direct_aggregate.result
index 9a8660ba79e..ede48906a84 100644
--- a/storage/spider/mysql-test/spider/r/direct_aggregate.result
+++ b/storage/spider/mysql-test/spider/r/direct_aggregate.result
@@ -60,25 +60,25 @@ MAX(a)
5
SHOW STATUS LIKE 'Spider_direct_aggregate';
Variable_name Value
-Spider_direct_aggregate 0
+Spider_direct_aggregate 1
SELECT MIN(a) FROM ta_l;
MIN(a)
1
SHOW STATUS LIKE 'Spider_direct_aggregate';
Variable_name Value
-Spider_direct_aggregate 0
+Spider_direct_aggregate 2
SELECT MAX(a) FROM ta_l WHERE a < 5;
MAX(a)
4
SHOW STATUS LIKE 'Spider_direct_aggregate';
Variable_name Value
-Spider_direct_aggregate 0
+Spider_direct_aggregate 3
SELECT MIN(a) FROM ta_l WHERE a > 1;
MIN(a)
2
SHOW STATUS LIKE 'Spider_direct_aggregate';
Variable_name Value
-Spider_direct_aggregate 0
+Spider_direct_aggregate 4
deinit
connection master_1;
diff --git a/storage/spider/mysql-test/spider/r/direct_aggregate_part.result b/storage/spider/mysql-test/spider/r/direct_aggregate_part.result
index 760b39e16d5..02cdc033a88 100644
--- a/storage/spider/mysql-test/spider/r/direct_aggregate_part.result
+++ b/storage/spider/mysql-test/spider/r/direct_aggregate_part.result
@@ -44,31 +44,31 @@ COUNT(*)
5
SHOW STATUS LIKE 'Spider_direct_aggregate';
Variable_name Value
-Spider_direct_aggregate 0
+Spider_direct_aggregate 2
SELECT MAX(a) FROM ta_l2;
MAX(a)
5
SHOW STATUS LIKE 'Spider_direct_aggregate';
Variable_name Value
-Spider_direct_aggregate 0
+Spider_direct_aggregate 4
SELECT MIN(a) FROM ta_l2;
MIN(a)
1
SHOW STATUS LIKE 'Spider_direct_aggregate';
Variable_name Value
-Spider_direct_aggregate 0
+Spider_direct_aggregate 6
SELECT MAX(a) FROM ta_l2 WHERE a < 5;
MAX(a)
4
SHOW STATUS LIKE 'Spider_direct_aggregate';
Variable_name Value
-Spider_direct_aggregate 0
+Spider_direct_aggregate 8
SELECT MIN(a) FROM ta_l2 WHERE a > 1;
MIN(a)
2
SHOW STATUS LIKE 'Spider_direct_aggregate';
Variable_name Value
-Spider_direct_aggregate 0
+Spider_direct_aggregate 10
deinit
connection master_1;
diff --git a/storage/spider/mysql-test/spider/r/direct_join.result b/storage/spider/mysql-test/spider/r/direct_join.result
new file mode 100644
index 00000000000..0a76c3246f9
--- /dev/null
+++ b/storage/spider/mysql-test/spider/r/direct_join.result
@@ -0,0 +1,197 @@
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+child3_1
+child3_2
+child3_3
+
+drop and create databases
+connection master_1;
+DROP DATABASE IF EXISTS auto_test_local;
+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';
+DROP DATABASE IF EXISTS auto_test_remote;
+CREATE DATABASE auto_test_remote;
+USE auto_test_remote;
+
+test select 1
+connection master_1;
+SELECT 1;
+1
+1
+connection child2_1;
+SELECT 1;
+1
+1
+
+create table and insert
+connection child2_1;
+CHILD2_1_DROP_TABLES
+CHILD2_1_DROP_TABLES6
+CHILD2_1_DROP_TABLES5
+CHILD2_1_CREATE_TABLES
+CHILD2_1_CREATE_TABLES6
+CHILD2_1_CREATE_TABLES5
+TRUNCATE TABLE mysql.general_log;
+connection master_1;
+DROP TABLE IF EXISTS tbl_a;
+CREATE TABLE tbl_a (
+a INT DEFAULT 10,
+b CHAR(1) DEFAULT 'c',
+c DATETIME DEFAULT '1999-10-10 10:10:10',
+PRIMARY KEY(a),
+KEY idx1(b)
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_1
+CREATE TABLE tbl_b (
+a INT DEFAULT 10,
+b CHAR(1) DEFAULT 'c',
+c DATETIME DEFAULT '1999-10-10 10:10:10'
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT5_2_1
+CREATE TABLE tbl_c (
+a INT AUTO_INCREMENT,
+b INT DEFAULT 10,
+c INT DEFAULT 11,
+PRIMARY KEY(a),
+KEY idx1(b),
+KEY idx2(c)
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT4_2_1
+insert into tbl_a values (1,'a','2000/01/01'),(2,'b','2000/01/02'),(3,'c','2000/01/03'),(4,'d','2000/01/04'),(5,'e','2000/01/05');
+insert into tbl_b values (1,'a','2000/01/01'),(2,'b','2000/01/02'),(3,'c','2000/01/03'),(4,'d','2000/01/04'),(5,'e','2000/01/05');
+insert into tbl_c values (1,10,100),(2,20,200),(3,30,300),(4,40,400),(5,50,500);
+
+select test
+connection child2_1;
+TRUNCATE TABLE mysql.general_log;
+connection master_1;
+SELECT a.a, c.b, c.c FROM tbl_a a, tbl_b b, tbl_c c WHERE a.a = b.a and a.a = c.a ORDER BY a.b DESC LIMIT 1,2;
+a b c
+4 40 400
+3 30 300
+connection child2_1;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select t0.`b` `b`,t0.`a` `a`,t2.`b` `b`,t2.`c` `c` from `auto_test_remote`.`ta_r` t0,`auto_test_remote`.`ta_r_3` t1,`auto_test_remote`.`ta_r_int` t2 where ((t0.`a` = t1.`a`) and (t2.`a` = t1.`a`)) order by t0.`b` desc limit 1,2
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_r ORDER BY a;
+a b date_format(c, '%Y-%m-%d %H:%i:%s')
+1 a 2000-01-01 00:00:00
+2 b 2000-01-02 00:00:00
+3 c 2000-01-03 00:00:00
+4 d 2000-01-04 00:00:00
+5 e 2000-01-05 00:00:00
+
+Test JOIN on a constant table.
+Spider should NOT push down the join because the tbl_person table
+is optimized as a constant table.
+connection child2_1;
+CHILD2_1_DROP_CONST_TABLE_JOIN
+CHILD2_1_DROP_CONST_TABLE2_JOIN
+CHILD2_1_CREATE_CONST_TABLE_JOIN
+CHILD2_1_CREATE_CONST_TABLE2_JOIN
+TRUNCATE TABLE mysql.general_log;
+connection master_1;
+DROP TABLE IF EXISTS tbl_person;
+DROP TABLE IF EXISTS tbl_ncd_cm_person;
+CREATE TABLE tbl_person (
+id VARCHAR(50) NOT NULL,
+hr_status VARCHAR(50) NULL DEFAULT NULL,
+region_code VARCHAR(50) NULL DEFAULT NULL,
+region INT(11) NOT NULL,
+PRIMARY KEY (id, region) USING BTREE
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_CONST_TABLE_JOIN
+MASTER_1_ROW_FORMAT_CONST_TABLE_JOIN MASTER_1_PART_CONST_TABLE_JOIN
+SHOW CREATE TABLE tbl_person
+Table Create Table
+tbl_person CREATE TABLE `tbl_person` (
+ `id` varchar(50) NOT NULL,
+ `hr_status` varchar(50) DEFAULT NULL,
+ `region_code` varchar(50) DEFAULT NULL,
+ `region` int(11) NOT NULL,
+ PRIMARY KEY (`id`,`region`) USING BTREE
+) ENGINE=SPIDER DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='table "tbl_ncd_cm_person"'
+ PARTITION BY LIST COLUMNS(`region`)
+(PARTITION `pt1` VALUES IN (510411) COMMENT = 'tbl "tbl_person", srv "s_2_1"' ENGINE = SPIDER)
+CREATE TABLE tbl_ncd_cm_person (
+id VARCHAR(50) NOT NULL,
+person_id VARCHAR(50) NULL DEFAULT '',
+diseaseKind_id VARCHAR(50) NULL DEFAULT NULL,
+region INT(11) NOT NULL,
+PRIMARY KEY (id, region) USING BTREE
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_CONST_TABLE2_JOIN
+MASTER_1_ROW_FORMAT_CONST_TABLE_JOIN MASTER_1_PART_CONST_TABLE2_JOIN
+SHOW CREATE TABLE tbl_ncd_cm_person
+Table Create Table
+tbl_ncd_cm_person CREATE TABLE `tbl_ncd_cm_person` (
+ `id` varchar(50) NOT NULL,
+ `person_id` varchar(50) DEFAULT '',
+ `diseaseKind_id` varchar(50) DEFAULT NULL,
+ `region` int(11) NOT NULL,
+ PRIMARY KEY (`id`,`region`) USING BTREE
+) ENGINE=SPIDER DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC
+ PARTITION BY LIST COLUMNS(`region`)
+(PARTITION `pt1` VALUES IN (510411) COMMENT = 'tbl "tbl_ncd_cm_person", srv "s_2_1"' ENGINE = SPIDER)
+INSERT INTO tbl_person VALUES ('24FC3F0A5119432BAE13DD65AABAA39C',
+'1', '123-51041110620301-321', 510411);
+INSERT INTO tbl_person VALUES ('123456789012345678901234567890AB',
+'1', '123-51041110620301-321', 510411);
+INSERT INTO tbl_ncd_cm_person VALUES ('123456789',
+'24FC3F0A5119432BAE13DD65AABAA39C',
+'52A0328740914BCE86ED10A4D2521816',
+510411);
+INSERT INTO tbl_ncd_cm_person VALUES ('123456789AB',
+'123456789012345678901234567890AB',
+'52A0328740914BCE86ED10A4D2521816',
+510411);
+DELETE FROM tbl_ncd_cm_person;
+INSERT INTO tbl_ncd_cm_person VALUES ('123456789',
+'24FC3F0A5119432BAE13DD65AABAA39C',
+'52A0328740914BCE86ED10A4D2521816',
+510411);
+INSERT INTO tbl_ncd_cm_person VALUES ('123456789AB',
+'123456789012345678901234567890AB',
+'52A0328740914BCE86ED10A4D2521816',
+510411);
+connection child2_1;
+TRUNCATE TABLE mysql.general_log;
+connection master_1;
+SELECT count(0) FROM tbl_person tp INNER JOIN tbl_ncd_cm_person tncp ON tp.id = tncp.person_id WHERE 1 = 1 AND tp.hr_status != "99" AND tp.hr_status != "2" AND tp.region_code LIKE CONCAT(CONCAT('%', '51041110620301', '%')) AND tp.id = '24FC3F0A5119432BAE13DD65AABAA39C' AND tncp.diseaseKind_id = '52A0328740914BCE86ED10A4D2521816' AND tp.region = 510411;
+count(0)
+1
+connection child2_1;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select `id`,`hr_status`,`region_code`,`region` from `auto_test_remote`.`tbl_person` where `id` = '24FC3F0A5119432BAE13DD65AABAA39C' and `region` = 510411
+select `person_id`,`diseaseKind_id` from `auto_test_remote`.`tbl_ncd_cm_person` where ((`diseaseKind_id` = '52A0328740914BCE86ED10A4D2521816'))
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT * FROM tbl_person;
+id hr_status region_code region
+123456789012345678901234567890AB 1 123-51041110620301-321 510411
+24FC3F0A5119432BAE13DD65AABAA39C 1 123-51041110620301-321 510411
+SELECT * FROM tbl_ncd_cm_person;
+id person_id diseaseKind_id region
+123456789 24FC3F0A5119432BAE13DD65AABAA39C 52A0328740914BCE86ED10A4D2521816 510411
+123456789AB 123456789012345678901234567890AB 52A0328740914BCE86ED10A4D2521816 510411
+
+deinit
+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;
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+child3_1
+child3_2
+child3_3
+
+end of test
diff --git a/storage/spider/mysql-test/spider/r/direct_join_using.result b/storage/spider/mysql-test/spider/r/direct_join_using.result
new file mode 100644
index 00000000000..66ae1503f9f
--- /dev/null
+++ b/storage/spider/mysql-test/spider/r/direct_join_using.result
@@ -0,0 +1,108 @@
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+child3_1
+child3_2
+child3_3
+
+drop and create databases
+connection master_1;
+DROP DATABASE IF EXISTS auto_test_local;
+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';
+DROP DATABASE IF EXISTS auto_test_remote;
+CREATE DATABASE auto_test_remote;
+USE auto_test_remote;
+
+test select 1
+connection master_1;
+SELECT 1;
+1
+1
+connection child2_1;
+SELECT 1;
+1
+1
+
+create table and insert
+connection child2_1;
+CHILD2_1_DROP_TABLES
+CHILD2_1_DROP_TABLES6
+CHILD2_1_DROP_TABLES5
+CHILD2_1_CREATE_TABLES
+CHILD2_1_CREATE_TABLES6
+CHILD2_1_CREATE_TABLES5
+TRUNCATE TABLE mysql.general_log;
+connection master_1;
+DROP TABLE IF EXISTS tbl_a;
+CREATE TABLE tbl_a (
+a INT DEFAULT 10,
+b CHAR(1) DEFAULT 'c',
+c DATETIME DEFAULT '1999-10-10 10:10:10',
+PRIMARY KEY(a),
+KEY idx1(b)
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_1
+CREATE TABLE tbl_b (
+a INT DEFAULT 10,
+b CHAR(1) DEFAULT 'c',
+c DATETIME DEFAULT '1999-10-10 10:10:10'
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT5_2_1
+CREATE TABLE tbl_c (
+a INT AUTO_INCREMENT,
+b INT DEFAULT 10,
+c INT DEFAULT 11,
+PRIMARY KEY(a),
+KEY idx1(b),
+KEY idx2(c)
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT4_2_1
+insert into tbl_a values (1,'a','2000/01/01'),(2,'b','2000/01/02'),(3,'c','2000/01/03'),(4,'d','2000/01/04'),(5,'e','2000/01/05');
+insert into tbl_b values (1,'a','2000/01/01'),(2,'b','2000/01/02'),(3,'c','2000/01/03'),(4,'d','2000/01/04'),(5,'e','2000/01/05');
+insert into tbl_c values (1,10,100),(2,20,200),(3,30,300),(4,40,400),(5,50,500);
+
+select test
+connection child2_1;
+TRUNCATE TABLE mysql.general_log;
+connection master_1;
+SELECT a.a, c.b, c.c FROM tbl_a a join tbl_b b using(a) join tbl_c c using(a) ORDER BY a.b DESC;
+a b c
+5 50 500
+4 40 400
+3 30 300
+2 20 200
+1 10 100
+connection child2_1;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select t0.`b` `b`,t0.`a` `a`,t2.`b` `b`,t2.`c` `c` from `auto_test_remote`.`ta_r` t0,`auto_test_remote`.`ta_r_3` t1,`auto_test_remote`.`ta_r_int` t2 where ((t0.`a` = t1.`a`) and (t2.`a` = t1.`a`)) order by t0.`b` desc
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_r ORDER BY a;
+a b date_format(c, '%Y-%m-%d %H:%i:%s')
+1 a 2000-01-01 00:00:00
+2 b 2000-01-02 00:00:00
+3 c 2000-01-03 00:00:00
+4 d 2000-01-04 00:00:00
+5 e 2000-01-05 00:00:00
+
+deinit
+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;
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+child3_1
+child3_2
+child3_3
+
+end of test
diff --git a/storage/spider/mysql-test/spider/r/direct_left_join.result b/storage/spider/mysql-test/spider/r/direct_left_join.result
new file mode 100644
index 00000000000..b63f0661b2e
--- /dev/null
+++ b/storage/spider/mysql-test/spider/r/direct_left_join.result
@@ -0,0 +1,108 @@
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+child3_1
+child3_2
+child3_3
+
+drop and create databases
+connection master_1;
+DROP DATABASE IF EXISTS auto_test_local;
+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';
+DROP DATABASE IF EXISTS auto_test_remote;
+CREATE DATABASE auto_test_remote;
+USE auto_test_remote;
+
+test select 1
+connection master_1;
+SELECT 1;
+1
+1
+connection child2_1;
+SELECT 1;
+1
+1
+
+create table and insert
+connection child2_1;
+CHILD2_1_DROP_TABLES
+CHILD2_1_DROP_TABLES6
+CHILD2_1_DROP_TABLES5
+CHILD2_1_CREATE_TABLES
+CHILD2_1_CREATE_TABLES6
+CHILD2_1_CREATE_TABLES5
+TRUNCATE TABLE mysql.general_log;
+connection master_1;
+DROP TABLE IF EXISTS tbl_a;
+CREATE TABLE tbl_a (
+a INT DEFAULT 10,
+b CHAR(1) DEFAULT 'c',
+c DATETIME DEFAULT '1999-10-10 10:10:10',
+PRIMARY KEY(a),
+KEY idx1(b)
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_1
+CREATE TABLE tbl_b (
+a INT DEFAULT 10,
+b CHAR(1) DEFAULT 'c',
+c DATETIME DEFAULT '1999-10-10 10:10:10'
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT5_2_1
+CREATE TABLE tbl_c (
+a INT AUTO_INCREMENT,
+b INT DEFAULT 10,
+c INT DEFAULT 11,
+PRIMARY KEY(a),
+KEY idx1(b),
+KEY idx2(c)
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT4_2_1
+insert into tbl_a values (1,'a','2000/01/01'),(2,'b','2000/01/02'),(3,'c','2000/01/03'),(4,'d','2000/01/04'),(5,'e','2000/01/05');
+insert into tbl_b values (1,'a','2000/01/01'),(2,'b','2000/01/02'),(3,'c','2000/01/03'),(4,'d','2000/01/04'),(5,'e','2000/01/05');
+insert into tbl_c values (1,10,100),(2,20,200),(3,30,300),(4,40,400),(5,50,500);
+
+select test
+connection child2_1;
+TRUNCATE TABLE mysql.general_log;
+connection master_1;
+SELECT a.a, c.b, c.c FROM tbl_a a left join tbl_b b on a.a = b.a left join tbl_c c on a.a = c.a ORDER BY a.b DESC;
+a b c
+5 50 500
+4 40 400
+3 30 300
+2 20 200
+1 10 100
+connection child2_1;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select t0.`b` `b`,t0.`a` `a`,t2.`b` `b`,t2.`c` `c` from `auto_test_remote`.`ta_r` t0 left join `auto_test_remote`.`ta_r_3` t1 on (t1.`a` = t0.`a`) left join `auto_test_remote`.`ta_r_int` t2 on (t2.`a` = t0.`a`) where 1 order by t0.`b` desc
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_r ORDER BY a;
+a b date_format(c, '%Y-%m-%d %H:%i:%s')
+1 a 2000-01-01 00:00:00
+2 b 2000-01-02 00:00:00
+3 c 2000-01-03 00:00:00
+4 d 2000-01-04 00:00:00
+5 e 2000-01-05 00:00:00
+
+deinit
+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;
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+child3_1
+child3_2
+child3_3
+
+end of test
diff --git a/storage/spider/mysql-test/spider/r/direct_left_join_nullable.result b/storage/spider/mysql-test/spider/r/direct_left_join_nullable.result
new file mode 100644
index 00000000000..e646bc9bf38
--- /dev/null
+++ b/storage/spider/mysql-test/spider/r/direct_left_join_nullable.result
@@ -0,0 +1,113 @@
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+child3_1
+child3_2
+child3_3
+
+drop and create databases
+connection master_1;
+DROP DATABASE IF EXISTS auto_test_local;
+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';
+DROP DATABASE IF EXISTS auto_test_remote;
+CREATE DATABASE auto_test_remote;
+USE auto_test_remote;
+
+test select 1
+connection master_1;
+SELECT 1;
+1
+1
+connection child2_1;
+SELECT 1;
+1
+1
+
+create table and insert
+connection child2_1;
+CHILD2_1_DROP_TABLES
+CHILD2_1_DROP_TABLES6
+CHILD2_1_DROP_TABLES4
+CHILD2_1_DROP_TABLES3
+CHILD2_1_CREATE_TABLES
+CHILD2_1_CREATE_TABLES6
+CHILD2_1_CREATE_TABLES4
+CHILD2_1_CREATE_TABLES3
+TRUNCATE TABLE mysql.general_log;
+connection master_1;
+DROP TABLE IF EXISTS tbl_a;
+CREATE TABLE tbl_a (
+a INT DEFAULT 10,
+b CHAR(1) DEFAULT 'c',
+c DATETIME DEFAULT '1999-10-10 10:10:10',
+KEY idx0(a),
+KEY idx1(b)
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_1
+CREATE TABLE tbl_b (
+a INT DEFAULT 10,
+b CHAR(1) DEFAULT 'c',
+c DATETIME DEFAULT '1999-10-10 10:10:10'
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT5_2_1
+CREATE TABLE tbl_c (
+a INT AUTO_INCREMENT,
+b CHAR(1) DEFAULT 'c',
+c DATETIME DEFAULT '1999-10-10 10:10:10',
+KEY idx0(a),
+KEY idx1(b),
+KEY idx2(c)
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT3_2_1
+CREATE TABLE tbl_d (
+a INT DEFAULT 10,
+b CHAR(1) DEFAULT 'c',
+c DATETIME DEFAULT '1999-10-10 10:10:10'
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT2_2_1
+insert into tbl_a values (1,'a','2000/01/01'),(2,'b','2000/01/02');
+insert into tbl_b values (1,'a','2000/01/01'),(2,'b','2000/01/02'),(3,'c','2000/01/03');
+insert into tbl_c values (1,'a','2000/01/01'),(2,'b','2000/01/02'),(3,'c','2000/01/03'),(4,'d','2000/01/04');
+insert into tbl_d values (1,'a','2000/01/01'),(2,'b','2000/01/02'),(3,'c','2000/01/03'),(4,'d','2000/01/04'),(5,'e','2000/01/05');
+
+select test
+connection child2_1;
+TRUNCATE TABLE mysql.general_log;
+connection master_1;
+SELECT a.a, c.b, c.c, d.a FROM tbl_d a left join tbl_c b on a.a = b.a left join tbl_b c on b.c = c.c left join tbl_a d on c.b = d.b ORDER BY a.a DESC;
+a b c a
+5 NULL NULL NULL
+4 NULL NULL NULL
+3 c 2000-01-03 00:00:00 NULL
+2 b 2000-01-02 00:00:00 2
+1 a 2000-01-01 00:00:00 1
+connection child2_1;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select t0.`a` `a`,t2.`b` `b`,t2.`c` `c`,t3.`a` `a` from `auto_test_remote`.`ta_r_no_idx` t0 left join `auto_test_remote`.`ta_r_auto_inc` t1 on ((t1.`a` = t0.`a`) and (t0.`a` is not null)) left join `auto_test_remote`.`ta_r_3` t2 on (t2.`c` = t1.`c`) left join `auto_test_remote`.`ta_r` t3 on ((t3.`b` = t2.`b`) and (t2.`b` is not null)) where 1 order by t0.`a` desc
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_r ORDER BY a;
+a b date_format(c, '%Y-%m-%d %H:%i:%s')
+1 a 2000-01-01 00:00:00
+2 b 2000-01-02 00:00:00
+
+deinit
+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;
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+child3_1
+child3_2
+child3_3
+
+end of test
diff --git a/storage/spider/mysql-test/spider/r/direct_left_right_join_nullable.result b/storage/spider/mysql-test/spider/r/direct_left_right_join_nullable.result
new file mode 100644
index 00000000000..f3c6e189444
--- /dev/null
+++ b/storage/spider/mysql-test/spider/r/direct_left_right_join_nullable.result
@@ -0,0 +1,113 @@
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+child3_1
+child3_2
+child3_3
+
+drop and create databases
+connection master_1;
+DROP DATABASE IF EXISTS auto_test_local;
+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';
+DROP DATABASE IF EXISTS auto_test_remote;
+CREATE DATABASE auto_test_remote;
+USE auto_test_remote;
+
+test select 1
+connection master_1;
+SELECT 1;
+1
+1
+connection child2_1;
+SELECT 1;
+1
+1
+
+create table and insert
+connection child2_1;
+CHILD2_1_DROP_TABLES
+CHILD2_1_DROP_TABLES6
+CHILD2_1_DROP_TABLES4
+CHILD2_1_DROP_TABLES3
+CHILD2_1_CREATE_TABLES
+CHILD2_1_CREATE_TABLES6
+CHILD2_1_CREATE_TABLES4
+CHILD2_1_CREATE_TABLES3
+TRUNCATE TABLE mysql.general_log;
+connection master_1;
+DROP TABLE IF EXISTS tbl_a;
+CREATE TABLE tbl_a (
+a INT DEFAULT 10,
+b CHAR(1) DEFAULT 'c',
+c DATETIME DEFAULT '1999-10-10 10:10:10',
+KEY idx0(a),
+KEY idx1(b)
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_1
+CREATE TABLE tbl_b (
+a INT DEFAULT 10,
+b CHAR(1) DEFAULT 'c',
+c DATETIME DEFAULT '1999-10-10 10:10:10'
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT5_2_1
+CREATE TABLE tbl_c (
+a INT AUTO_INCREMENT,
+b CHAR(1) DEFAULT 'c',
+c DATETIME DEFAULT '1999-10-10 10:10:10',
+KEY idx0(a),
+KEY idx1(b),
+KEY idx2(c)
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT3_2_1
+CREATE TABLE tbl_d (
+a INT DEFAULT 10,
+b CHAR(1) DEFAULT 'c',
+c DATETIME DEFAULT '1999-10-10 10:10:10'
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT2_2_1
+insert into tbl_a values (1,'a','2000/01/01'),(2,'b','2000/01/02');
+insert into tbl_b values (1,'a','2000/01/01'),(2,'b','2000/01/02'),(3,'c','2000/01/03');
+insert into tbl_c values (1,'a','2000/01/01'),(2,'b','2000/01/02'),(3,'c','2000/01/03'),(4,'d','2000/01/04');
+insert into tbl_d values (1,'a','2000/01/01'),(2,'b','2000/01/02'),(3,'c','2000/01/03'),(4,'d','2000/01/04'),(5,'e','2000/01/05');
+
+select test
+connection child2_1;
+TRUNCATE TABLE mysql.general_log;
+connection master_1;
+SELECT a.a, c.b, c.c, d.a FROM tbl_a a left join tbl_b b on a.a = b.a left join tbl_c c on b.c = c.c right join tbl_d d on c.b = d.b ORDER BY d.a DESC;
+a b c a
+NULL NULL NULL 5
+NULL NULL NULL 4
+NULL NULL NULL 3
+2 b 2000-01-02 00:00:00 2
+1 a 2000-01-01 00:00:00 1
+connection child2_1;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select t0.`a` `a`,t2.`b` `b`,t2.`c` `c`,t3.`a` `a` from `auto_test_remote`.`ta_r_no_idx` t3 left join (`auto_test_remote`.`ta_r_auto_inc` t2 join `auto_test_remote`.`ta_r_3` t1 join `auto_test_remote`.`ta_r` t0) on ((t2.`b` = t3.`b`) and (t2.`c` = t1.`c`) and (t0.`a` = t1.`a`) and (t1.`a` is not null) and (t3.`b` is not null)) where 1 order by t3.`a` desc
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_r ORDER BY a;
+a b date_format(c, '%Y-%m-%d %H:%i:%s')
+1 a 2000-01-01 00:00:00
+2 b 2000-01-02 00:00:00
+
+deinit
+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;
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+child3_1
+child3_2
+child3_3
+
+end of test
diff --git a/storage/spider/mysql-test/spider/r/direct_left_right_left_join_nullable.result b/storage/spider/mysql-test/spider/r/direct_left_right_left_join_nullable.result
new file mode 100644
index 00000000000..88205fb0f65
--- /dev/null
+++ b/storage/spider/mysql-test/spider/r/direct_left_right_left_join_nullable.result
@@ -0,0 +1,112 @@
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+child3_1
+child3_2
+child3_3
+
+drop and create databases
+connection master_1;
+DROP DATABASE IF EXISTS auto_test_local;
+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';
+DROP DATABASE IF EXISTS auto_test_remote;
+CREATE DATABASE auto_test_remote;
+USE auto_test_remote;
+
+test select 1
+connection master_1;
+SELECT 1;
+1
+1
+connection child2_1;
+SELECT 1;
+1
+1
+
+create table and insert
+connection child2_1;
+CHILD2_1_DROP_TABLES
+CHILD2_1_DROP_TABLES6
+CHILD2_1_DROP_TABLES4
+CHILD2_1_DROP_TABLES3
+CHILD2_1_CREATE_TABLES
+CHILD2_1_CREATE_TABLES6
+CHILD2_1_CREATE_TABLES4
+CHILD2_1_CREATE_TABLES3
+TRUNCATE TABLE mysql.general_log;
+connection master_1;
+DROP TABLE IF EXISTS tbl_a;
+CREATE TABLE tbl_a (
+a INT DEFAULT 10,
+b CHAR(1) DEFAULT 'c',
+c DATETIME DEFAULT '1999-10-10 10:10:10',
+KEY idx0(a),
+KEY idx1(b)
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_1
+CREATE TABLE tbl_b (
+a INT DEFAULT 10,
+b CHAR(1) DEFAULT 'c',
+c DATETIME DEFAULT '1999-10-10 10:10:10'
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT5_2_1
+CREATE TABLE tbl_c (
+a INT AUTO_INCREMENT,
+b CHAR(1) DEFAULT 'c',
+c DATETIME DEFAULT '1999-10-10 10:10:10',
+KEY idx0(a),
+KEY idx1(b),
+KEY idx2(c)
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT3_2_1
+CREATE TABLE tbl_d (
+a INT DEFAULT 10,
+b CHAR(1) DEFAULT 'c',
+c DATETIME DEFAULT '1999-10-10 10:10:10'
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT2_2_1
+insert into tbl_a values (1,'a','2000/01/01'),(2,'b','2000/01/02');
+insert into tbl_b values (1,'a','2000/01/01'),(2,'b','2000/01/02'),(3,'c','2000/01/03');
+insert into tbl_c values (1,'a','2000/01/01'),(2,'b','2000/01/02'),(3,'c','2000/01/03'),(4,'d','2000/01/04');
+insert into tbl_d values (1,'a','2000/01/01'),(2,'b','2000/01/02'),(3,'c','2000/01/03'),(4,'d','2000/01/04'),(5,'e','2000/01/05');
+
+select test
+connection child2_1;
+TRUNCATE TABLE mysql.general_log;
+connection master_1;
+SELECT a.a, c.b, c.c, d.a FROM tbl_a a left join tbl_b b on a.a = b.a right join tbl_c c on b.c = c.c left join tbl_d d on c.b = d.b ORDER BY d.a DESC;
+a b c a
+NULL d 2000-01-04 00:00:00 4
+NULL c 2000-01-03 00:00:00 3
+2 b 2000-01-02 00:00:00 2
+1 a 2000-01-01 00:00:00 1
+connection child2_1;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select t0.`a` `a`,t2.`b` `b`,t2.`c` `c`,t3.`a` `a` from `auto_test_remote`.`ta_r_auto_inc` t2 left join (`auto_test_remote`.`ta_r_3` t1 join `auto_test_remote`.`ta_r` t0) on ((t1.`c` = t2.`c`) and (t0.`a` = t1.`a`) and (t1.`a` is not null)) left join `auto_test_remote`.`ta_r_no_idx` t3 on (t3.`b` = t2.`b`) where 1 order by t3.`a` desc
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_r ORDER BY a;
+a b date_format(c, '%Y-%m-%d %H:%i:%s')
+1 a 2000-01-01 00:00:00
+2 b 2000-01-02 00:00:00
+
+deinit
+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;
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+child3_1
+child3_2
+child3_3
+
+end of test
diff --git a/storage/spider/mysql-test/spider/r/direct_right_join.result b/storage/spider/mysql-test/spider/r/direct_right_join.result
new file mode 100644
index 00000000000..8edfb682292
--- /dev/null
+++ b/storage/spider/mysql-test/spider/r/direct_right_join.result
@@ -0,0 +1,108 @@
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+child3_1
+child3_2
+child3_3
+
+drop and create databases
+connection master_1;
+DROP DATABASE IF EXISTS auto_test_local;
+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';
+DROP DATABASE IF EXISTS auto_test_remote;
+CREATE DATABASE auto_test_remote;
+USE auto_test_remote;
+
+test select 1
+connection master_1;
+SELECT 1;
+1
+1
+connection child2_1;
+SELECT 1;
+1
+1
+
+create table and insert
+connection child2_1;
+CHILD2_1_DROP_TABLES
+CHILD2_1_DROP_TABLES6
+CHILD2_1_DROP_TABLES5
+CHILD2_1_CREATE_TABLES
+CHILD2_1_CREATE_TABLES6
+CHILD2_1_CREATE_TABLES5
+TRUNCATE TABLE mysql.general_log;
+connection master_1;
+DROP TABLE IF EXISTS tbl_a;
+CREATE TABLE tbl_a (
+a INT DEFAULT 10,
+b CHAR(1) DEFAULT 'c',
+c DATETIME DEFAULT '1999-10-10 10:10:10',
+PRIMARY KEY(a),
+KEY idx1(b)
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_1
+CREATE TABLE tbl_b (
+a INT DEFAULT 10,
+b CHAR(1) DEFAULT 'c',
+c DATETIME DEFAULT '1999-10-10 10:10:10'
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT5_2_1
+CREATE TABLE tbl_c (
+a INT AUTO_INCREMENT,
+b INT DEFAULT 10,
+c INT DEFAULT 11,
+PRIMARY KEY(a),
+KEY idx1(b),
+KEY idx2(c)
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT4_2_1
+insert into tbl_a values (1,'a','2000/01/01'),(2,'b','2000/01/02'),(3,'c','2000/01/03'),(4,'d','2000/01/04'),(5,'e','2000/01/05');
+insert into tbl_b values (1,'a','2000/01/01'),(2,'b','2000/01/02'),(3,'c','2000/01/03'),(4,'d','2000/01/04'),(5,'e','2000/01/05');
+insert into tbl_c values (1,10,100),(2,20,200),(3,30,300),(4,40,400),(5,50,500);
+
+select test
+connection child2_1;
+TRUNCATE TABLE mysql.general_log;
+connection master_1;
+SELECT a.a, c.b, c.c FROM tbl_a a right join tbl_b b on a.a = b.a right join tbl_c c on a.a = c.a ORDER BY a.b DESC;
+a b c
+5 50 500
+4 40 400
+3 30 300
+2 20 200
+1 10 100
+connection child2_1;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select t0.`b` `b`,t0.`a` `a`,t2.`b` `b`,t2.`c` `c` from `auto_test_remote`.`ta_r_int` t2 left join (`auto_test_remote`.`ta_r` t0 join `auto_test_remote`.`ta_r_3` t1) on ((t0.`a` = t2.`a`) and (t1.`a` = t2.`a`)) where 1 order by t0.`b` desc
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_r ORDER BY a;
+a b date_format(c, '%Y-%m-%d %H:%i:%s')
+1 a 2000-01-01 00:00:00
+2 b 2000-01-02 00:00:00
+3 c 2000-01-03 00:00:00
+4 d 2000-01-04 00:00:00
+5 e 2000-01-05 00:00:00
+
+deinit
+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;
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+child3_1
+child3_2
+child3_3
+
+end of test
diff --git a/storage/spider/mysql-test/spider/r/direct_right_join_nullable.result b/storage/spider/mysql-test/spider/r/direct_right_join_nullable.result
new file mode 100644
index 00000000000..a05781cb6d6
--- /dev/null
+++ b/storage/spider/mysql-test/spider/r/direct_right_join_nullable.result
@@ -0,0 +1,113 @@
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+child3_1
+child3_2
+child3_3
+
+drop and create databases
+connection master_1;
+DROP DATABASE IF EXISTS auto_test_local;
+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';
+DROP DATABASE IF EXISTS auto_test_remote;
+CREATE DATABASE auto_test_remote;
+USE auto_test_remote;
+
+test select 1
+connection master_1;
+SELECT 1;
+1
+1
+connection child2_1;
+SELECT 1;
+1
+1
+
+create table and insert
+connection child2_1;
+CHILD2_1_DROP_TABLES
+CHILD2_1_DROP_TABLES6
+CHILD2_1_DROP_TABLES4
+CHILD2_1_DROP_TABLES3
+CHILD2_1_CREATE_TABLES
+CHILD2_1_CREATE_TABLES6
+CHILD2_1_CREATE_TABLES4
+CHILD2_1_CREATE_TABLES3
+TRUNCATE TABLE mysql.general_log;
+connection master_1;
+DROP TABLE IF EXISTS tbl_a;
+CREATE TABLE tbl_a (
+a INT DEFAULT 10,
+b CHAR(1) DEFAULT 'c',
+c DATETIME DEFAULT '1999-10-10 10:10:10',
+KEY idx0(a),
+KEY idx1(b)
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_1
+CREATE TABLE tbl_b (
+a INT DEFAULT 10,
+b CHAR(1) DEFAULT 'c',
+c DATETIME DEFAULT '1999-10-10 10:10:10'
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT5_2_1
+CREATE TABLE tbl_c (
+a INT AUTO_INCREMENT,
+b CHAR(1) DEFAULT 'c',
+c DATETIME DEFAULT '1999-10-10 10:10:10',
+KEY idx0(a),
+KEY idx1(b),
+KEY idx2(c)
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT3_2_1
+CREATE TABLE tbl_d (
+a INT DEFAULT 10,
+b CHAR(1) DEFAULT 'c',
+c DATETIME DEFAULT '1999-10-10 10:10:10'
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT2_2_1
+insert into tbl_a values (1,'a','2000/01/01'),(2,'b','2000/01/02');
+insert into tbl_b values (1,'a','2000/01/01'),(2,'b','2000/01/02'),(3,'c','2000/01/03');
+insert into tbl_c values (1,'a','2000/01/01'),(2,'b','2000/01/02'),(3,'c','2000/01/03'),(4,'d','2000/01/04');
+insert into tbl_d values (1,'a','2000/01/01'),(2,'b','2000/01/02'),(3,'c','2000/01/03'),(4,'d','2000/01/04'),(5,'e','2000/01/05');
+
+select test
+connection child2_1;
+TRUNCATE TABLE mysql.general_log;
+connection master_1;
+SELECT a.a, c.b, c.c, d.a FROM tbl_a a right join tbl_b b on a.a = b.a right join tbl_c c on b.c = c.c right join tbl_d d on c.b = d.b ORDER BY d.a DESC;
+a b c a
+NULL NULL NULL 5
+NULL d 2000-01-04 00:00:00 4
+NULL c 2000-01-03 00:00:00 3
+2 b 2000-01-02 00:00:00 2
+1 a 2000-01-01 00:00:00 1
+connection child2_1;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select t0.`a` `a`,t2.`b` `b`,t2.`c` `c`,t3.`a` `a` from `auto_test_remote`.`ta_r_no_idx` t3 left join `auto_test_remote`.`ta_r_auto_inc` t2 on ((t2.`b` = t3.`b`) and (t3.`b` is not null)) left join `auto_test_remote`.`ta_r_3` t1 on (t1.`c` = t2.`c`) left join `auto_test_remote`.`ta_r` t0 on ((t0.`a` = t1.`a`) and (t1.`a` is not null)) where 1 order by t3.`a` desc
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_r ORDER BY a;
+a b date_format(c, '%Y-%m-%d %H:%i:%s')
+1 a 2000-01-01 00:00:00
+2 b 2000-01-02 00:00:00
+
+deinit
+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;
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+child3_1
+child3_2
+child3_3
+
+end of test
diff --git a/storage/spider/mysql-test/spider/r/direct_right_left_join_nullable.result b/storage/spider/mysql-test/spider/r/direct_right_left_join_nullable.result
new file mode 100644
index 00000000000..25e0913ba06
--- /dev/null
+++ b/storage/spider/mysql-test/spider/r/direct_right_left_join_nullable.result
@@ -0,0 +1,112 @@
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+child3_1
+child3_2
+child3_3
+
+drop and create databases
+connection master_1;
+DROP DATABASE IF EXISTS auto_test_local;
+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';
+DROP DATABASE IF EXISTS auto_test_remote;
+CREATE DATABASE auto_test_remote;
+USE auto_test_remote;
+
+test select 1
+connection master_1;
+SELECT 1;
+1
+1
+connection child2_1;
+SELECT 1;
+1
+1
+
+create table and insert
+connection child2_1;
+CHILD2_1_DROP_TABLES
+CHILD2_1_DROP_TABLES6
+CHILD2_1_DROP_TABLES4
+CHILD2_1_DROP_TABLES3
+CHILD2_1_CREATE_TABLES
+CHILD2_1_CREATE_TABLES6
+CHILD2_1_CREATE_TABLES4
+CHILD2_1_CREATE_TABLES3
+TRUNCATE TABLE mysql.general_log;
+connection master_1;
+DROP TABLE IF EXISTS tbl_a;
+CREATE TABLE tbl_a (
+a INT DEFAULT 10,
+b CHAR(1) DEFAULT 'c',
+c DATETIME DEFAULT '1999-10-10 10:10:10',
+KEY idx0(a),
+KEY idx1(b)
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_1
+CREATE TABLE tbl_b (
+a INT DEFAULT 10,
+b CHAR(1) DEFAULT 'c',
+c DATETIME DEFAULT '1999-10-10 10:10:10'
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT5_2_1
+CREATE TABLE tbl_c (
+a INT AUTO_INCREMENT,
+b CHAR(1) DEFAULT 'c',
+c DATETIME DEFAULT '1999-10-10 10:10:10',
+KEY idx0(a),
+KEY idx1(b),
+KEY idx2(c)
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT3_2_1
+CREATE TABLE tbl_d (
+a INT DEFAULT 10,
+b CHAR(1) DEFAULT 'c',
+c DATETIME DEFAULT '1999-10-10 10:10:10'
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT2_2_1
+insert into tbl_a values (1,'a','2000/01/01'),(2,'b','2000/01/02');
+insert into tbl_b values (1,'a','2000/01/01'),(2,'b','2000/01/02'),(3,'c','2000/01/03');
+insert into tbl_c values (1,'a','2000/01/01'),(2,'b','2000/01/02'),(3,'c','2000/01/03'),(4,'d','2000/01/04');
+insert into tbl_d values (1,'a','2000/01/01'),(2,'b','2000/01/02'),(3,'c','2000/01/03'),(4,'d','2000/01/04'),(5,'e','2000/01/05');
+
+select test
+connection child2_1;
+TRUNCATE TABLE mysql.general_log;
+connection master_1;
+SELECT a.a, c.b, c.c, d.a FROM tbl_a a right join tbl_b b on a.a = b.a right join tbl_c c on b.c = c.c left join tbl_d d on c.b = d.b ORDER BY d.a DESC;
+a b c a
+NULL d 2000-01-04 00:00:00 4
+NULL c 2000-01-03 00:00:00 3
+2 b 2000-01-02 00:00:00 2
+1 a 2000-01-01 00:00:00 1
+connection child2_1;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select t0.`a` `a`,t2.`b` `b`,t2.`c` `c`,t3.`a` `a` from `auto_test_remote`.`ta_r_auto_inc` t2 left join `auto_test_remote`.`ta_r_3` t1 on (t1.`c` = t2.`c`) left join `auto_test_remote`.`ta_r` t0 on ((t0.`a` = t1.`a`) and (t1.`a` is not null)) left join `auto_test_remote`.`ta_r_no_idx` t3 on (t3.`b` = t2.`b`) where 1 order by t3.`a` desc
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_r ORDER BY a;
+a b date_format(c, '%Y-%m-%d %H:%i:%s')
+1 a 2000-01-01 00:00:00
+2 b 2000-01-02 00:00:00
+
+deinit
+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;
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+child3_1
+child3_2
+child3_3
+
+end of test
diff --git a/storage/spider/mysql-test/spider/r/direct_right_left_right_join_nullable.result b/storage/spider/mysql-test/spider/r/direct_right_left_right_join_nullable.result
new file mode 100644
index 00000000000..48cd9c2c75f
--- /dev/null
+++ b/storage/spider/mysql-test/spider/r/direct_right_left_right_join_nullable.result
@@ -0,0 +1,113 @@
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+child3_1
+child3_2
+child3_3
+
+drop and create databases
+connection master_1;
+DROP DATABASE IF EXISTS auto_test_local;
+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';
+DROP DATABASE IF EXISTS auto_test_remote;
+CREATE DATABASE auto_test_remote;
+USE auto_test_remote;
+
+test select 1
+connection master_1;
+SELECT 1;
+1
+1
+connection child2_1;
+SELECT 1;
+1
+1
+
+create table and insert
+connection child2_1;
+CHILD2_1_DROP_TABLES
+CHILD2_1_DROP_TABLES6
+CHILD2_1_DROP_TABLES4
+CHILD2_1_DROP_TABLES3
+CHILD2_1_CREATE_TABLES
+CHILD2_1_CREATE_TABLES6
+CHILD2_1_CREATE_TABLES4
+CHILD2_1_CREATE_TABLES3
+TRUNCATE TABLE mysql.general_log;
+connection master_1;
+DROP TABLE IF EXISTS tbl_a;
+CREATE TABLE tbl_a (
+a INT DEFAULT 10,
+b CHAR(1) DEFAULT 'c',
+c DATETIME DEFAULT '1999-10-10 10:10:10',
+KEY idx0(a),
+KEY idx1(b)
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_1
+CREATE TABLE tbl_b (
+a INT DEFAULT 10,
+b CHAR(1) DEFAULT 'c',
+c DATETIME DEFAULT '1999-10-10 10:10:10'
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT5_2_1
+CREATE TABLE tbl_c (
+a INT AUTO_INCREMENT,
+b CHAR(1) DEFAULT 'c',
+c DATETIME DEFAULT '1999-10-10 10:10:10',
+KEY idx0(a),
+KEY idx1(b),
+KEY idx2(c)
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT3_2_1
+CREATE TABLE tbl_d (
+a INT DEFAULT 10,
+b CHAR(1) DEFAULT 'c',
+c DATETIME DEFAULT '1999-10-10 10:10:10'
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT2_2_1
+insert into tbl_a values (1,'a','2000/01/01'),(2,'b','2000/01/02');
+insert into tbl_b values (1,'a','2000/01/01'),(2,'b','2000/01/02'),(3,'c','2000/01/03');
+insert into tbl_c values (1,'a','2000/01/01'),(2,'b','2000/01/02'),(3,'c','2000/01/03'),(4,'d','2000/01/04');
+insert into tbl_d values (1,'a','2000/01/01'),(2,'b','2000/01/02'),(3,'c','2000/01/03'),(4,'d','2000/01/04'),(5,'e','2000/01/05');
+
+select test
+connection child2_1;
+TRUNCATE TABLE mysql.general_log;
+connection master_1;
+SELECT a.a, c.b, c.c, d.a FROM tbl_a a right join tbl_b b on a.a = b.a left join tbl_c c on b.c = c.c right join tbl_d d on c.b = d.b ORDER BY d.a DESC;
+a b c a
+NULL NULL NULL 5
+NULL NULL NULL 4
+NULL c 2000-01-03 00:00:00 3
+2 b 2000-01-02 00:00:00 2
+1 a 2000-01-01 00:00:00 1
+connection child2_1;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select t0.`a` `a`,t2.`b` `b`,t2.`c` `c`,t3.`a` `a` from `auto_test_remote`.`ta_r_no_idx` t3 left join (`auto_test_remote`.`ta_r_auto_inc` t2 join `auto_test_remote`.`ta_r_3` t1 left join `auto_test_remote`.`ta_r` t0 on ((t0.`a` = t1.`a`) and (t1.`a` is not null))) on ((t2.`b` = t3.`b`) and (t2.`c` = t1.`c`) and (t3.`b` is not null)) where 1 order by t3.`a` desc
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_r ORDER BY a;
+a b date_format(c, '%Y-%m-%d %H:%i:%s')
+1 a 2000-01-01 00:00:00
+2 b 2000-01-02 00:00:00
+
+deinit
+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;
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+child3_1
+child3_2
+child3_3
+
+end of test
diff --git a/storage/spider/mysql-test/spider/r/direct_update.result b/storage/spider/mysql-test/spider/r/direct_update.result
index 74dae7aec2e..0e536d48617 100644
--- a/storage/spider/mysql-test/spider/r/direct_update.result
+++ b/storage/spider/mysql-test/spider/r/direct_update.result
@@ -48,6 +48,7 @@ direct_updating test
connection master_1;
SHOW STATUS LIKE 'Spider_direct_update';
Variable_name Value
+Spider_direct_update 0
SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a;
a b date_format(c, '%Y-%m-%d %H:%i:%s')
1 a 2008-08-01 10:21:39
@@ -59,6 +60,7 @@ update all rows with function
UPDATE ta_l SET c = ADDDATE(c, 1);
SHOW STATUS LIKE 'Spider_direct_update';
Variable_name Value
+Spider_direct_update 1
SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a;
a b date_format(c, '%Y-%m-%d %H:%i:%s')
1 a 2008-08-02 10:21:39
@@ -70,6 +72,7 @@ update by primary key
UPDATE ta_l SET b = 'x' WHERE a = 3;
SHOW STATUS LIKE 'Spider_direct_update';
Variable_name Value
+Spider_direct_update 2
SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a;
a b date_format(c, '%Y-%m-%d %H:%i:%s')
1 a 2008-08-02 10:21:39
@@ -81,6 +84,7 @@ update by a column without index
UPDATE ta_l SET c = '2011-10-17' WHERE b = 'x';
SHOW STATUS LIKE 'Spider_direct_update';
Variable_name Value
+Spider_direct_update 3
SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a;
a b date_format(c, '%Y-%m-%d %H:%i:%s')
1 a 2008-08-02 10:21:39
@@ -92,6 +96,7 @@ update by primary key with order and limit
UPDATE ta_l SET c = ADDDATE(c, 1) WHERE a < 4 ORDER BY b DESC LIMIT 1;
SHOW STATUS LIKE 'Spider_direct_update';
Variable_name Value
+Spider_direct_update 4
SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a;
a b date_format(c, '%Y-%m-%d %H:%i:%s')
1 a 2008-08-02 10:21:39
@@ -103,6 +108,7 @@ delete by primary key with order and limit
DELETE FROM ta_l WHERE a < 4 ORDER BY c LIMIT 1;
SHOW STATUS LIKE 'Spider_direct_delete';
Variable_name Value
+Spider_direct_delete 1
SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a;
a b date_format(c, '%Y-%m-%d %H:%i:%s')
1 a 2008-08-02 10:21:39
@@ -113,6 +119,7 @@ delete by a column without index
DELETE FROM ta_l WHERE b = 'c';
SHOW STATUS LIKE 'Spider_direct_delete';
Variable_name Value
+Spider_direct_delete 2
SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a;
a b date_format(c, '%Y-%m-%d %H:%i:%s')
1 a 2008-08-02 10:21:39
@@ -122,6 +129,7 @@ delete by primary key
DELETE FROM ta_l WHERE a = 3;
SHOW STATUS LIKE 'Spider_direct_delete';
Variable_name Value
+Spider_direct_delete 3
SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l ORDER BY a;
a b date_format(c, '%Y-%m-%d %H:%i:%s')
1 a 2008-08-02 10:21:39
diff --git a/storage/spider/mysql-test/spider/r/direct_update_part.result b/storage/spider/mysql-test/spider/r/direct_update_part.result
index 6db7c01f563..7069cd72fda 100644
--- a/storage/spider/mysql-test/spider/r/direct_update_part.result
+++ b/storage/spider/mysql-test/spider/r/direct_update_part.result
@@ -38,6 +38,7 @@ PRIMARY KEY(a)
) MASTER_1_ENGINE MASTER_1_COMMENT2_P_2_1
SHOW STATUS LIKE 'Spider_direct_update';
Variable_name Value
+Spider_direct_update 0
SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 ORDER BY a;
a b date_format(c, '%Y-%m-%d %H:%i:%s')
1 a 2008-08-01 10:21:39
@@ -49,6 +50,7 @@ update all rows with function
UPDATE ta_l2 SET c = ADDDATE(c, 1);
SHOW STATUS LIKE 'Spider_direct_update';
Variable_name Value
+Spider_direct_update 2
SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 ORDER BY a;
a b date_format(c, '%Y-%m-%d %H:%i:%s')
1 a 2008-08-02 10:21:39
@@ -60,6 +62,7 @@ update by primary key
UPDATE ta_l2 SET b = 'x' WHERE a = 3;
SHOW STATUS LIKE 'Spider_direct_update';
Variable_name Value
+Spider_direct_update 3
SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 ORDER BY a;
a b date_format(c, '%Y-%m-%d %H:%i:%s')
1 a 2008-08-02 10:21:39
@@ -71,6 +74,7 @@ update by a column without index
UPDATE ta_l2 SET c = '2011-10-17' WHERE b = 'x';
SHOW STATUS LIKE 'Spider_direct_update';
Variable_name Value
+Spider_direct_update 5
SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 ORDER BY a;
a b date_format(c, '%Y-%m-%d %H:%i:%s')
1 a 2008-08-02 10:21:39
@@ -82,6 +86,7 @@ update by primary key with order and limit
UPDATE ta_l2 SET c = ADDDATE(c, 1) WHERE a < 4 ORDER BY b DESC LIMIT 1;
SHOW STATUS LIKE 'Spider_direct_update';
Variable_name Value
+Spider_direct_update 6
SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 ORDER BY a;
a b date_format(c, '%Y-%m-%d %H:%i:%s')
1 a 2008-08-02 10:21:39
@@ -93,6 +98,7 @@ delete by primary key with order and limit
DELETE FROM ta_l2 WHERE a < 4 ORDER BY c LIMIT 1;
SHOW STATUS LIKE 'Spider_direct_delete';
Variable_name Value
+Spider_direct_delete 1
SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 ORDER BY a;
a b date_format(c, '%Y-%m-%d %H:%i:%s')
1 a 2008-08-02 10:21:39
@@ -103,6 +109,7 @@ delete by a column without index
DELETE FROM ta_l2 WHERE b = 'c';
SHOW STATUS LIKE 'Spider_direct_delete';
Variable_name Value
+Spider_direct_delete 3
SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 ORDER BY a;
a b date_format(c, '%Y-%m-%d %H:%i:%s')
1 a 2008-08-02 10:21:39
@@ -112,6 +119,7 @@ delete by primary key
DELETE FROM ta_l2 WHERE a = 3;
SHOW STATUS LIKE 'Spider_direct_delete';
Variable_name Value
+Spider_direct_delete 4
SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l2 ORDER BY a;
a b date_format(c, '%Y-%m-%d %H:%i:%s')
1 a 2008-08-02 10:21:39
diff --git a/storage/spider/mysql-test/spider/r/partition_cond_push.result b/storage/spider/mysql-test/spider/r/partition_cond_push.result
new file mode 100644
index 00000000000..ce26416b9f8
--- /dev/null
+++ b/storage/spider/mysql-test/spider/r/partition_cond_push.result
@@ -0,0 +1,168 @@
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+child3_1
+child3_2
+child3_3
+
+drop and create databases
+connection master_1;
+DROP DATABASE IF EXISTS auto_test_local;
+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';
+DROP DATABASE IF EXISTS auto_test_remote;
+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';
+DROP DATABASE IF EXISTS auto_test_remote2;
+CREATE DATABASE auto_test_remote2;
+USE auto_test_remote2;
+connection child2_3;
+SET @old_log_output = @@global.log_output;
+SET GLOBAL log_output = 'TABLE,FILE';
+DROP DATABASE IF EXISTS auto_test_remote3;
+CREATE DATABASE auto_test_remote3;
+USE auto_test_remote3;
+
+create table and insert
+connection child2_1;
+CHILD2_1_DROP_TABLES
+CHILD2_1_CREATE_TABLES
+TRUNCATE TABLE mysql.general_log;
+connection child2_2;
+CHILD2_2_DROP_TABLES
+CHILD2_2_CREATE_TABLES
+TRUNCATE TABLE mysql.general_log;
+connection child2_3;
+CHILD2_3_DROP_TABLES
+CHILD2_3_CREATE_TABLES
+TRUNCATE TABLE mysql.general_log;
+connection master_1;
+DROP TABLE IF EXISTS tbl_a;
+DROP TABLE IF EXISTS tbl_b;
+CREATE TABLE tbl_a (
+value int NOT NULL
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_1
+INSERT INTO tbl_a (value) VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
+INSERT INTO tbl_a (value) VALUES (10),(11),(12),(13),(14),(15),(16),(17),(18),(19);
+INSERT INTO tbl_a (value) VALUES (20),(21),(22),(23),(24),(25),(26),(27),(28),(29);
+
+select test
+connection child2_1;
+TRUNCATE TABLE mysql.general_log;
+connection master_1;
+SELECT value FROM tbl_a WHERE value < 100;
+value
+4
+5
+10
+11
+16
+17
+22
+23
+28
+29
+0
+1
+6
+7
+12
+13
+18
+19
+24
+25
+2
+3
+8
+9
+14
+15
+20
+21
+26
+27
+connection child2_1;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select `value` from `auto_test_remote`.`tbl_a` where (`value` < 100)
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT value FROM tbl_a ORDER BY value;
+value
+4
+5
+10
+11
+16
+17
+22
+23
+28
+29
+connection child2_2;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select `value` from `auto_test_remote2`.`tbl_a` where (`value` < 100)
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT value FROM tbl_a ORDER BY value;
+value
+0
+1
+6
+7
+12
+13
+18
+19
+24
+25
+connection child2_3;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select `value` from `auto_test_remote3`.`tbl_a` where (`value` < 100)
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT value FROM tbl_a ORDER BY value;
+value
+2
+3
+8
+9
+14
+15
+20
+21
+26
+27
+
+deinit
+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;
+connection child2_3;
+DROP DATABASE IF EXISTS auto_test_remote3;
+SET GLOBAL log_output = @old_log_output;
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+child3_1
+child3_2
+child3_3
+
+end of test
diff --git a/storage/spider/mysql-test/spider/r/partition_fulltext.result b/storage/spider/mysql-test/spider/r/partition_fulltext.result
new file mode 100644
index 00000000000..3289473b905
--- /dev/null
+++ b/storage/spider/mysql-test/spider/r/partition_fulltext.result
@@ -0,0 +1,126 @@
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+child3_1
+child3_2
+child3_3
+connection master_1;
+set @old_join_cache_level= @@join_cache_level;
+set session join_cache_level= 5;
+set @old_optimizer_switch= @@optimizer_switch;
+set session optimizer_switch= 'mrr=on';
+
+drop and create databases
+connection master_1;
+DROP DATABASE IF EXISTS auto_test_local;
+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';
+DROP DATABASE IF EXISTS auto_test_remote;
+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';
+DROP DATABASE IF EXISTS auto_test_remote2;
+CREATE DATABASE auto_test_remote2;
+USE auto_test_remote2;
+connection child2_3;
+SET @old_log_output = @@global.log_output;
+SET GLOBAL log_output = 'TABLE,FILE';
+DROP DATABASE IF EXISTS auto_test_remote3;
+CREATE DATABASE auto_test_remote3;
+USE auto_test_remote3;
+
+create table and insert
+connection child2_1;
+CHILD2_1_DROP_TABLES
+CHILD2_1_CREATE_TABLES
+TRUNCATE TABLE mysql.general_log;
+connection child2_2;
+CHILD2_2_DROP_TABLES
+CHILD2_2_CREATE_TABLES
+TRUNCATE TABLE mysql.general_log;
+connection child2_3;
+CHILD2_3_DROP_TABLES
+CHILD2_3_CREATE_TABLES
+TRUNCATE TABLE mysql.general_log;
+connection master_1;
+DROP TABLE IF EXISTS tbl_a;
+DROP TABLE IF EXISTS tbl_b;
+CREATE TABLE tbl_a (
+pkey int NOT NULL,
+words text NOT NULL,
+PRIMARY KEY (pkey),
+FULLTEXT (words)
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_1
+INSERT INTO tbl_a (pkey, words) VALUES (0, 'abc'),(1, 'def'),(2, 'ghi'),(3, 'jkl'),(4, 'mno'),(5, 'pqr'),(6, 'stu'),(7, 'vwx');
+
+select test
+connection child2_1;
+TRUNCATE TABLE mysql.general_log;
+connection master_1;
+SELECT pkey, words FROM tbl_a WHERE match(words) against('+ghi' in boolean mode);
+pkey words
+2 ghi
+connection child2_1;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select match(`words`)against('+ghi' in boolean mode),`pkey`,`words` from `auto_test_remote`.`tbl_a` where match(`words`)against('+ghi' in boolean mode) and (match(`words`)against('+ghi' in boolean mode))
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT pkey FROM tbl_a ORDER BY pkey;
+pkey
+4
+5
+connection child2_2;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select match(`words`)against('+ghi' in boolean mode),`pkey`,`words` from `auto_test_remote2`.`tbl_a` where match(`words`)against('+ghi' in boolean mode) and (match(`words`)against('+ghi' in boolean mode))
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT pkey FROM tbl_a ORDER BY pkey;
+pkey
+0
+1
+6
+7
+connection child2_3;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select match(`words`)against('+ghi' in boolean mode),`pkey`,`words` from `auto_test_remote3`.`tbl_a` where match(`words`)against('+ghi' in boolean mode) and (match(`words`)against('+ghi' in boolean mode))
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT pkey FROM tbl_a ORDER BY pkey;
+pkey
+2
+3
+
+deinit
+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;
+connection child2_3;
+DROP DATABASE IF EXISTS auto_test_remote3;
+SET GLOBAL log_output = @old_log_output;
+connection master_1;
+set session join_cache_level= @old_join_cache_level;
+set session optimizer_switch= @old_optimizer_switch;
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+child3_1
+child3_2
+child3_3
+
+end of test
diff --git a/storage/spider/mysql-test/spider/r/partition_join_pushdown_for_single_partition.result b/storage/spider/mysql-test/spider/r/partition_join_pushdown_for_single_partition.result
new file mode 100644
index 00000000000..899788ae1c1
--- /dev/null
+++ b/storage/spider/mysql-test/spider/r/partition_join_pushdown_for_single_partition.result
@@ -0,0 +1,130 @@
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+child3_1
+child3_2
+child3_3
+
+drop and create databases
+connection master_1;
+DROP DATABASE IF EXISTS auto_test_local;
+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';
+DROP DATABASE IF EXISTS auto_test_remote;
+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';
+DROP DATABASE IF EXISTS auto_test_remote2;
+CREATE DATABASE auto_test_remote2;
+USE auto_test_remote2;
+connection child2_3;
+SET @old_log_output = @@global.log_output;
+SET GLOBAL log_output = 'TABLE,FILE';
+DROP DATABASE IF EXISTS auto_test_remote3;
+CREATE DATABASE auto_test_remote3;
+USE auto_test_remote3;
+
+create table and insert
+connection child2_1;
+CHILD2_1_DROP_TABLES
+CHILD2_1_DROP_TABLES2
+CHILD2_1_CREATE_TABLES
+CHILD2_1_CREATE_TABLES2
+TRUNCATE TABLE mysql.general_log;
+connection child2_2;
+CHILD2_2_DROP_TABLES
+CHILD2_2_DROP_TABLES2
+CHILD2_2_CREATE_TABLES
+CHILD2_2_CREATE_TABLES2
+TRUNCATE TABLE mysql.general_log;
+connection child2_3;
+CHILD2_3_DROP_TABLES
+CHILD2_3_DROP_TABLES2
+CHILD2_3_CREATE_TABLES
+CHILD2_3_CREATE_TABLES2
+TRUNCATE TABLE mysql.general_log;
+connection master_1;
+DROP TABLE IF EXISTS tbl_a;
+DROP TABLE IF EXISTS tbl_b;
+CREATE TABLE tbl_a (
+value int NOT NULL,
+PRIMARY KEY(value)
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_1
+CREATE TABLE tbl_b (
+value2 int NOT NULL,
+PRIMARY KEY(value2)
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_2
+insert into tbl_a values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
+insert into tbl_b values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
+connection master_1;
+SELECT sum(a.value), count(b.value2) FROM tbl_a a, tbl_b b WHERE a.value = b.value2 AND a.value = 5;
+sum(a.value) count(b.value2)
+5 1
+SELECT sum(a.value), count(b.value2) FROM tbl_a a, tbl_b b WHERE a.value = 5 and b.value2 = 5;
+sum(a.value) count(b.value2)
+5 1
+connection child2_1;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT value FROM tbl_a ORDER BY value;
+value
+1
+2
+3
+4
+connection child2_2;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select `value` from `auto_test_remote2`.`tbl_a` where `value` = 5
+select `value2` from `auto_test_remote2`.`tbl_b` where `value2` = 5
+select `value` from `auto_test_remote2`.`tbl_a` where `value` = 5
+select `value2` from `auto_test_remote2`.`tbl_b` where `value2` = 5
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT value FROM tbl_a ORDER BY value;
+value
+5
+6
+7
+8
+9
+connection child2_3;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT value FROM tbl_a ORDER BY value;
+value
+10
+
+deinit
+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;
+connection child2_3;
+DROP DATABASE IF EXISTS auto_test_remote3;
+SET GLOBAL log_output = @old_log_output;
+connection master_1;
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+child3_1
+child3_2
+child3_3
+
+end of test
diff --git a/storage/spider/mysql-test/spider/r/partition_mrr.result b/storage/spider/mysql-test/spider/r/partition_mrr.result
new file mode 100644
index 00000000000..2335e8933a4
--- /dev/null
+++ b/storage/spider/mysql-test/spider/r/partition_mrr.result
@@ -0,0 +1,223 @@
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+child3_1
+child3_2
+child3_3
+connection master_1;
+set @old_join_cache_level= @@join_cache_level;
+set session join_cache_level= 5;
+set @old_optimizer_switch= @@optimizer_switch;
+set session optimizer_switch= 'mrr=on';
+
+drop and create databases
+connection master_1;
+DROP DATABASE IF EXISTS auto_test_local;
+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';
+DROP DATABASE IF EXISTS auto_test_remote;
+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';
+DROP DATABASE IF EXISTS auto_test_remote2;
+CREATE DATABASE auto_test_remote2;
+USE auto_test_remote2;
+connection child2_3;
+SET @old_log_output = @@global.log_output;
+SET GLOBAL log_output = 'TABLE,FILE';
+DROP DATABASE IF EXISTS auto_test_remote3;
+CREATE DATABASE auto_test_remote3;
+USE auto_test_remote3;
+
+create table and insert
+connection child2_1;
+CHILD2_1_DROP_TABLES
+CHILD2_1_CREATE_TABLES
+TRUNCATE TABLE mysql.general_log;
+connection child2_2;
+CHILD2_2_DROP_TABLES
+CHILD2_2_CREATE_TABLES
+TRUNCATE TABLE mysql.general_log;
+connection child2_3;
+CHILD2_3_DROP_TABLES
+CHILD2_3_CREATE_TABLES
+TRUNCATE TABLE mysql.general_log;
+connection master_1;
+DROP TABLE IF EXISTS tbl_a;
+DROP TABLE IF EXISTS tbl_b;
+CREATE TABLE tbl_a (
+pkey int NOT NULL,
+PRIMARY KEY (pkey)
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_1
+CREATE TABLE tbl_b (
+pkey int NOT NULL,
+PRIMARY KEY (pkey)
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_2
+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);
+
+select test
+connection child2_1;
+TRUNCATE TABLE mysql.general_log;
+connection master_1;
+SELECT a.pkey FROM tbl_a a, tbl_b b WHERE a.pkey = b.pkey;
+pkey
+4
+5
+10
+11
+16
+17
+22
+23
+28
+29
+0
+1
+6
+7
+12
+13
+18
+19
+24
+25
+2
+3
+8
+9
+14
+15
+20
+21
+26
+27
+connection child2_1;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select `pkey` from `auto_test_remote`.`tbl_a` order by `pkey`
+select a.id,b.`pkey` from auto_test_remote.tmp_spider_bka_xxxx a,`auto_test_remote`.`tbl_b` b where a.c0 <=> b.`pkey`
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT pkey FROM tbl_a ORDER BY pkey ;
+SELECT pkey FROM tbl_b ORDER BY pkey;
+pkey
+4
+5
+10
+11
+16
+17
+22
+23
+28
+29
+pkey
+2
+3
+8
+9
+14
+15
+20
+21
+26
+27
+connection child2_2;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select `pkey` from `auto_test_remote2`.`tbl_a` order by `pkey`
+select a.id,b.`pkey` from auto_test_remote2.tmp_spider_bka_xxxx a,`auto_test_remote2`.`tbl_b` b where a.c0 <=> b.`pkey`
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT pkey FROM tbl_a ORDER BY pkey ;
+SELECT pkey FROM tbl_b ORDER BY pkey;
+pkey
+0
+1
+6
+7
+12
+13
+18
+19
+24
+25
+pkey
+4
+5
+10
+11
+16
+17
+22
+23
+28
+29
+connection child2_3;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select `pkey` from `auto_test_remote3`.`tbl_a` order by `pkey`
+select a.id,b.`pkey` from auto_test_remote3.tmp_spider_bka_xxxx a,`auto_test_remote3`.`tbl_b` b where a.c0 <=> b.`pkey`
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT pkey FROM tbl_a ORDER BY pkey ;
+SELECT pkey FROM tbl_b ORDER BY pkey;
+pkey
+2
+3
+8
+9
+14
+15
+20
+21
+26
+27
+pkey
+0
+1
+6
+7
+12
+13
+18
+19
+24
+25
+
+deinit
+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;
+connection child2_3;
+DROP DATABASE IF EXISTS auto_test_remote3;
+SET GLOBAL log_output = @old_log_output;
+connection master_1;
+set session join_cache_level= @old_join_cache_level;
+set session optimizer_switch= @old_optimizer_switch;
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+child3_1
+child3_2
+child3_3
+
+end of test
diff --git a/storage/spider/mysql-test/spider/r/pushdown_not_like.result b/storage/spider/mysql-test/spider/r/pushdown_not_like.result
index cd926962180..0e007b094de 100644
--- a/storage/spider/mysql-test/spider/r/pushdown_not_like.result
+++ b/storage/spider/mysql-test/spider/r/pushdown_not_like.result
@@ -41,7 +41,7 @@ a b c
connection child2_1;
SELECT argument FROM mysql.general_log WHERE argument LIKE '%select%';
argument
-select `a`,`b`,`c` from `auto_test_remote`.`ta_r` where (`b` not like 'a%')
+select t0.`a` `a`,t0.`b` `b`,t0.`c` `c` from `auto_test_remote`.`ta_r` t0 where (t0.`b` not like 'a%')
SELECT argument FROM mysql.general_log WHERE argument LIKE '%select%'
deinit
diff --git a/storage/spider/mysql-test/spider/r/quick_mode_0.result b/storage/spider/mysql-test/spider/r/quick_mode_0.result
new file mode 100644
index 00000000000..239c3ee1175
--- /dev/null
+++ b/storage/spider/mysql-test/spider/r/quick_mode_0.result
@@ -0,0 +1,508 @@
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+child3_1
+child3_2
+child3_3
+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;
+
+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;
+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;
+
+create table and insert
+connection child2_1;
+CHILD2_1_CREATE_TABLES
+TRUNCATE TABLE mysql.general_log;
+connection child2_2;
+CHILD2_2_CREATE_TABLES
+TRUNCATE TABLE mysql.general_log;
+connection master_1;
+CREATE TABLE tbl_a (
+pkey int NOT NULL,
+PRIMARY KEY (pkey)
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_1
+CREATE TABLE tbl_b (
+pkey int NOT NULL,
+PRIMARY KEY (pkey)
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_2
+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);
+
+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;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+connection child2_1;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select `pkey` from `auto_test_remote`.`tbl_a` order by `pkey`
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT pkey FROM tbl_a ORDER BY pkey;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+connection child2_2;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 0
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 1
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 2
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 3
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 4
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 5
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 6
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 7
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 8
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 9
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 10
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 11
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 12
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 13
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 14
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 15
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 16
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 17
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 18
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 19
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 20
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 21
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 22
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 23
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 24
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 25
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 26
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 27
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 28
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 29
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT pkey FROM tbl_b ORDER BY pkey;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+connection master_1;
+set session spider_quick_page_byte= 6;
+
+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;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+connection child2_1;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select `pkey` from `auto_test_remote`.`tbl_a` order by `pkey`
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT pkey FROM tbl_a ORDER BY pkey;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+connection child2_2;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 0
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 1
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 2
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 3
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 4
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 5
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 6
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 7
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 8
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 9
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 10
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 11
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 12
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 13
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 14
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 15
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 16
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 17
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 18
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 19
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 20
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 21
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 22
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 23
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 24
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 25
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 26
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 27
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 28
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 29
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT pkey FROM tbl_b ORDER BY pkey;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+connection master_1;
+set session spider_quick_page_byte= 0;
+
+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;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+connection child2_1;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select `pkey` from `auto_test_remote`.`tbl_a` order by `pkey`
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT pkey FROM tbl_a ORDER BY pkey;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+connection child2_2;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 0
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 1
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 2
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 3
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 4
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 5
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 6
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 7
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 8
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 9
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 10
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 11
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 12
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 13
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 14
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 15
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 16
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 17
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 18
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 19
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 20
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 21
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 22
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 23
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 24
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 25
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 26
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 27
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 28
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 29
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT pkey FROM tbl_b ORDER BY pkey;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+
+deinit
+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;
+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;
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+child3_1
+child3_2
+child3_3
+
+end of test
diff --git a/storage/spider/mysql-test/spider/r/quick_mode_1.result b/storage/spider/mysql-test/spider/r/quick_mode_1.result
new file mode 100644
index 00000000000..d0db0729c39
--- /dev/null
+++ b/storage/spider/mysql-test/spider/r/quick_mode_1.result
@@ -0,0 +1,508 @@
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+child3_1
+child3_2
+child3_3
+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;
+
+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;
+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;
+
+create table and insert
+connection child2_1;
+CHILD2_1_CREATE_TABLES
+TRUNCATE TABLE mysql.general_log;
+connection child2_2;
+CHILD2_2_CREATE_TABLES
+TRUNCATE TABLE mysql.general_log;
+connection master_1;
+CREATE TABLE tbl_a (
+pkey int NOT NULL,
+PRIMARY KEY (pkey)
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_1
+CREATE TABLE tbl_b (
+pkey int NOT NULL,
+PRIMARY KEY (pkey)
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_2
+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);
+
+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;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+connection child2_1;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select `pkey` from `auto_test_remote`.`tbl_a` order by `pkey`
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT pkey FROM tbl_a ORDER BY pkey;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+connection child2_2;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 0
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 1
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 2
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 3
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 4
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 5
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 6
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 7
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 8
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 9
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 10
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 11
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 12
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 13
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 14
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 15
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 16
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 17
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 18
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 19
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 20
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 21
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 22
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 23
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 24
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 25
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 26
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 27
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 28
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 29
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT pkey FROM tbl_b ORDER BY pkey;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+connection master_1;
+set session spider_quick_page_byte= 6;
+
+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;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+connection child2_1;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select `pkey` from `auto_test_remote`.`tbl_a` order by `pkey`
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT pkey FROM tbl_a ORDER BY pkey;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+connection child2_2;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 0
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 1
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 2
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 3
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 4
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 5
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 6
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 7
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 8
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 9
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 10
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 11
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 12
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 13
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 14
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 15
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 16
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 17
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 18
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 19
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 20
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 21
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 22
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 23
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 24
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 25
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 26
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 27
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 28
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 29
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT pkey FROM tbl_b ORDER BY pkey;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+connection master_1;
+set session spider_quick_page_byte= 0;
+
+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;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+connection child2_1;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select `pkey` from `auto_test_remote`.`tbl_a` order by `pkey`
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT pkey FROM tbl_a ORDER BY pkey;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+connection child2_2;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 0
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 1
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 2
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 3
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 4
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 5
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 6
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 7
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 8
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 9
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 10
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 11
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 12
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 13
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 14
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 15
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 16
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 17
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 18
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 19
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 20
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 21
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 22
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 23
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 24
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 25
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 26
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 27
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 28
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 29
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT pkey FROM tbl_b ORDER BY pkey;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+
+deinit
+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;
+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;
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+child3_1
+child3_2
+child3_3
+
+end of test
diff --git a/storage/spider/mysql-test/spider/r/quick_mode_2.result b/storage/spider/mysql-test/spider/r/quick_mode_2.result
new file mode 100644
index 00000000000..538057e3cda
--- /dev/null
+++ b/storage/spider/mysql-test/spider/r/quick_mode_2.result
@@ -0,0 +1,508 @@
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+child3_1
+child3_2
+child3_3
+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;
+
+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;
+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;
+
+create table and insert
+connection child2_1;
+CHILD2_1_CREATE_TABLES
+TRUNCATE TABLE mysql.general_log;
+connection child2_2;
+CHILD2_2_CREATE_TABLES
+TRUNCATE TABLE mysql.general_log;
+connection master_1;
+CREATE TABLE tbl_a (
+pkey int NOT NULL,
+PRIMARY KEY (pkey)
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_1
+CREATE TABLE tbl_b (
+pkey int NOT NULL,
+PRIMARY KEY (pkey)
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_2
+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);
+
+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;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+connection child2_1;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select `pkey` from `auto_test_remote`.`tbl_a` order by `pkey`
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT pkey FROM tbl_a ORDER BY pkey;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+connection child2_2;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 0
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 1
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 2
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 3
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 4
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 5
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 6
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 7
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 8
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 9
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 10
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 11
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 12
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 13
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 14
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 15
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 16
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 17
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 18
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 19
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 20
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 21
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 22
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 23
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 24
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 25
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 26
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 27
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 28
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 29
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT pkey FROM tbl_b ORDER BY pkey;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+connection master_1;
+set session spider_quick_page_byte= 6;
+
+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;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+connection child2_1;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select `pkey` from `auto_test_remote`.`tbl_a` order by `pkey`
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT pkey FROM tbl_a ORDER BY pkey;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+connection child2_2;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 0
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 1
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 2
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 3
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 4
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 5
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 6
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 7
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 8
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 9
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 10
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 11
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 12
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 13
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 14
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 15
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 16
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 17
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 18
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 19
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 20
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 21
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 22
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 23
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 24
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 25
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 26
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 27
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 28
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 29
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT pkey FROM tbl_b ORDER BY pkey;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+connection master_1;
+set session spider_quick_page_byte= 0;
+
+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;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+connection child2_1;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select `pkey` from `auto_test_remote`.`tbl_a` order by `pkey`
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT pkey FROM tbl_a ORDER BY pkey;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+connection child2_2;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 0
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 1
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 2
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 3
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 4
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 5
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 6
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 7
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 8
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 9
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 10
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 11
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 12
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 13
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 14
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 15
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 16
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 17
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 18
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 19
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 20
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 21
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 22
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 23
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 24
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 25
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 26
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 27
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 28
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 29
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT pkey FROM tbl_b ORDER BY pkey;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+
+deinit
+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;
+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;
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+child3_1
+child3_2
+child3_3
+
+end of test
diff --git a/storage/spider/mysql-test/spider/r/quick_mode_3.result b/storage/spider/mysql-test/spider/r/quick_mode_3.result
new file mode 100644
index 00000000000..9232dd152de
--- /dev/null
+++ b/storage/spider/mysql-test/spider/r/quick_mode_3.result
@@ -0,0 +1,508 @@
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+child3_1
+child3_2
+child3_3
+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;
+
+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;
+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;
+
+create table and insert
+connection child2_1;
+CHILD2_1_CREATE_TABLES
+TRUNCATE TABLE mysql.general_log;
+connection child2_2;
+CHILD2_2_CREATE_TABLES
+TRUNCATE TABLE mysql.general_log;
+connection master_1;
+CREATE TABLE tbl_a (
+pkey int NOT NULL,
+PRIMARY KEY (pkey)
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_1
+CREATE TABLE tbl_b (
+pkey int NOT NULL,
+PRIMARY KEY (pkey)
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_2
+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);
+
+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;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+connection child2_1;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select `pkey` from `auto_test_remote`.`tbl_a` order by `pkey`
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT pkey FROM tbl_a ORDER BY pkey;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+connection child2_2;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 0
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 1
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 2
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 3
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 4
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 5
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 6
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 7
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 8
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 9
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 10
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 11
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 12
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 13
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 14
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 15
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 16
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 17
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 18
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 19
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 20
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 21
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 22
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 23
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 24
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 25
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 26
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 27
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 28
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 29
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT pkey FROM tbl_b ORDER BY pkey;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+connection master_1;
+set session spider_quick_page_byte= 6;
+
+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;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+connection child2_1;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select `pkey` from `auto_test_remote`.`tbl_a` order by `pkey`
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT pkey FROM tbl_a ORDER BY pkey;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+connection child2_2;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 0
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 1
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 2
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 3
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 4
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 5
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 6
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 7
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 8
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 9
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 10
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 11
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 12
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 13
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 14
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 15
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 16
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 17
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 18
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 19
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 20
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 21
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 22
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 23
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 24
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 25
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 26
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 27
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 28
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 29
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT pkey FROM tbl_b ORDER BY pkey;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+connection master_1;
+set session spider_quick_page_byte= 0;
+
+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;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+connection child2_1;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select `pkey` from `auto_test_remote`.`tbl_a` order by `pkey`
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT pkey FROM tbl_a ORDER BY pkey;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+connection child2_2;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 0
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 1
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 2
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 3
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 4
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 5
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 6
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 7
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 8
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 9
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 10
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 11
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 12
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 13
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 14
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 15
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 16
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 17
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 18
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 19
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 20
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 21
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 22
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 23
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 24
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 25
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 26
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 27
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 28
+select `pkey` from `auto_test_remote2`.`tbl_b` where `pkey` = 29
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'
+SELECT pkey FROM tbl_b ORDER BY pkey;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+
+deinit
+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;
+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;
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+child3_1
+child3_2
+child3_3
+
+end of test
diff --git a/storage/spider/mysql-test/spider/r/show_system_tables.result b/storage/spider/mysql-test/spider/r/show_system_tables.result
new file mode 100644
index 00000000000..831d4578efe
--- /dev/null
+++ b/storage/spider/mysql-test/spider/r/show_system_tables.result
@@ -0,0 +1,37 @@
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+child3_1
+child3_2
+child3_3
+
+Show system tables on the Spider node
+connection master_1;
+SELECT table_name, engine FROM information_schema.tables
+WHERE table_schema = 'mysql' AND table_name like '%spider_%';
+table_name engine
+spider_link_failed_log MyISAM
+spider_link_mon_servers MyISAM
+spider_table_crd MyISAM
+spider_table_position_for_recovery MyISAM
+spider_table_sts MyISAM
+spider_tables MyISAM
+spider_xa MyISAM
+spider_xa_failed_log MyISAM
+spider_xa_member MyISAM
+
+deinit
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+child3_1
+child3_2
+child3_3
+
+end of test
diff --git a/storage/spider/mysql-test/spider/r/slave_trx_isolation.result b/storage/spider/mysql-test/spider/r/slave_trx_isolation.result
new file mode 100644
index 00000000000..7d9ba40cab3
--- /dev/null
+++ b/storage/spider/mysql-test/spider/r/slave_trx_isolation.result
@@ -0,0 +1,105 @@
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+child3_1
+child3_2
+child3_3
+for slave1_1
+connection slave1_1;
+set @old_spider_slave_trx_isolation= @@spider_slave_trx_isolation;
+set global spider_slave_trx_isolation= 1;
+
+drop and create databases
+connection master_1;
+CREATE DATABASE auto_test_local;
+USE auto_test_local;
+connection slave1_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;
+USE auto_test_remote;
+
+create table and insert
+connection child2_1;
+CHILD2_1_CREATE_TABLES
+TRUNCATE TABLE mysql.general_log;
+connection master_1;
+connection slave1_1;
+connection master_1;
+SET SESSION sql_log_bin= 0;
+CREATE TABLE tbl_a (
+pkey int NOT NULL,
+PRIMARY KEY (pkey)
+) MASTER_1_ENGINE2 MASTER_1_CHARSET MASTER_1_COMMENT_2_1
+SET SESSION sql_log_bin= 1;
+connection slave1_1;
+CREATE TABLE tbl_a (
+pkey int NOT NULL,
+PRIMARY KEY (pkey)
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_1
+connection master_1;
+INSERT INTO tbl_a (pkey) VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
+connection slave1_1;
+connection master_1;
+SET SESSION sql_log_bin= 0;
+connection child2_1;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%set %';
+argument
+set session time_zone = '+00:00'
+SET NAMES utf8
+set session transaction isolation level read committed;set session autocommit = 1;start transaction
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%set %'
+SELECT pkey FROM tbl_a ORDER BY pkey;
+pkey
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+connection slave1_1;
+SELECT pkey FROM 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 slave1_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 slave1_1;
+set global spider_slave_trx_isolation= @old_spider_slave_trx_isolation;
+for slave1_1
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+child3_1
+child3_2
+child3_3
+
+end of test
diff --git a/storage/spider/mysql-test/spider/r/spider3_fixes_part.result b/storage/spider/mysql-test/spider/r/spider3_fixes_part.result
index b793346df4b..937f222f02f 100644
--- a/storage/spider/mysql-test/spider/r/spider3_fixes_part.result
+++ b/storage/spider/mysql-test/spider/r/spider3_fixes_part.result
@@ -85,10 +85,10 @@ MASTER_1_AUTO_INCREMENT_OFFSET3
INSERT INTO t1 (id) VALUES (null);
SELECT LAST_INSERT_ID();
LAST_INSERT_ID()
-778
+1555
SELECT MAX(id) FROM t1;
MAX(id)
-1554
+1555
MASTER_1_AUTO_INCREMENT_OFFSET4
INSERT INTO t2 (id) VALUES (null);
SELECT LAST_INSERT_ID();
@@ -101,36 +101,36 @@ MASTER_1_AUTO_INCREMENT_OFFSET3
INSERT INTO t1 () VALUES (),(),(),();
SELECT LAST_INSERT_ID();
LAST_INSERT_ID()
-1555
+2332
SELECT id FROM t1 ORDER BY id;
id
777
-778
1554
1555
2331
2332
3109
3886
+4663
MASTER_1_AUTO_INCREMENT_OFFSET4
INSERT INTO t2 () VALUES (),(),(),();
SELECT LAST_INSERT_ID();
LAST_INSERT_ID()
-3108
+5439
SELECT id FROM t2 ORDER BY id;
id
777
-778
1554
1555
2331
2332
-3108
3109
-3885
3886
-4662
+4663
5439
+6216
+6993
+7770
TRUNCATE TABLE t1;
TRUNCATE TABLE t2;
INSERT INTO t1 () VALUES (),(),(),();
diff --git a/storage/spider/mysql-test/spider/r/spider_fixes.result b/storage/spider/mysql-test/spider/r/spider_fixes.result
index f50c9822534..1db31ca9f95 100644
--- a/storage/spider/mysql-test/spider/r/spider_fixes.result
+++ b/storage/spider/mysql-test/spider/r/spider_fixes.result
@@ -461,6 +461,7 @@ Error 1146 Table 'auto_test_remote.ter1_1' doesn't exist
DELETE FROM t1;
Warnings:
Error 12702 Remote table 'auto_test_remote.ter1_1' is not found
+Error 12702 Remote table 'auto_test_remote.ter1_1' is not found
Error 1146 Table 'auto_test_remote.ter1_1' doesn't exist
TRUNCATE t1;
Warnings:
diff --git a/storage/spider/mysql-test/spider/r/spider_fixes_part.result b/storage/spider/mysql-test/spider/r/spider_fixes_part.result
index d2367af9bbd..234d52fed0d 100644
--- a/storage/spider/mysql-test/spider/r/spider_fixes_part.result
+++ b/storage/spider/mysql-test/spider/r/spider_fixes_part.result
@@ -263,6 +263,37 @@ a b c d e f
51ECF2C0CD3C48D99C91792E99D3C1A0 017B8A460DBC444682B791305EF75356 51041110620308 2018-08-02 13:48:29 510411 0
093B37A93A534DF883787AF5F6799674 996C7F14989D480589A553717D735E3E 51041110620302 2018-08-02 13:48:30 510411 0
+Crash from b4a2baffa82e5c07b96a1c752228560dcac1359b (MDEV-11084)
+Fixed with 4968049799193394d442f26b4e3a8d95b185be72
+Spider crashed if the first partition was not used first
+connection master_1;
+CREATE TABLE ta_l2 (
+a INT,
+b CHAR(1),
+c DATETIME,
+PRIMARY KEY(a)
+) MASTER_1_ENGINE MASTER_1_COMMENT2_P_2_1
+INSERT INTO ta_l2 SELECT a, b, c FROM tb_l;
+Query a Spider table only using the second partition
+SELECT a,b,c FROM ta_l2 PARTITION (pt2);
+a b c
+4 d 2003-11-30 05:01:03
+5 c 2001-12-31 23:59:59
+Query a Spider table only using the first partition
+SELECT a,b,c FROM ta_l2 PARTITION (pt1);
+a b c
+1 a 2008-08-01 10:21:39
+2 b 2000-01-01 00:00:00
+3 e 2007-06-04 20:03:11
+Query a Spider table by all paritions, then the second partition
+SELECT min(a), max(a), min(b), max(b) FROM ta_l2;
+min(a) max(a) min(b) max(b)
+1 5 a e
+SELECT a,b,c FROM ta_l2 PARTITION (pt2);
+a b c
+4 d 2003-11-30 05:01:03
+5 c 2001-12-31 23:59:59
+
deinit
connection master_1;
DROP DATABASE IF EXISTS auto_test_local;
diff --git a/storage/spider/mysql-test/spider/r/timestamp.result b/storage/spider/mysql-test/spider/r/timestamp.result
new file mode 100644
index 00000000000..4e4badccc41
--- /dev/null
+++ b/storage/spider/mysql-test/spider/r/timestamp.result
@@ -0,0 +1,431 @@
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+child3_1
+child3_2
+child3_3
+
+Initialize Time Zone
+connection master_1;
+SET GLOBAL time_zone='MET';
+SET time_zone='MET';
+connection child2_1;
+SET GLOBAL time_zone='MET';
+SET time_zone='MET';
+
+drop and create databases
+connection master_1;
+DROP DATABASE IF EXISTS ts_test_local;
+CREATE DATABASE ts_test_local;
+USE ts_test_local;
+connection child2_1;
+SET @old_log_output = @@global.log_output;
+SET GLOBAL log_output = 'TABLE,FILE';
+DROP DATABASE IF EXISTS ts_test_remote;
+CREATE DATABASE ts_test_remote;
+USE ts_test_remote;
+
+test select 1
+connection master_1;
+SELECT 1;
+1
+1
+connection child2_1;
+SELECT 1;
+1
+1
+
+create table
+connection child2_1;
+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;
+CREATE TABLE tbl_a (
+col_a INT UNSIGNED NOT NULL AUTO_INCREMENT,
+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` (
+ `col_a` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `col_dt` datetime DEFAULT NULL,
+ `col_ts` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
+ 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';
+
+Insert Rows
+connection master_1;
+Min value
+SET @@timestamp=1;
+INSERT INTO tbl_a VALUES (1, now(), now());
+SET @@timestamp=0;
+Ambiguous DST values for MET time zone that result in the
+same UTC timestamp
+INSERT INTO tbl_a VALUES (2, '2018-03-25 02:00:00', '2018-03-25 02:00:00');
+INSERT INTO tbl_a VALUES (3, '2018-03-25 02:30:00', '2018-03-25 02:30:00');
+Ambiguous DST values for MET time zone in the 2:00 am to 3:00 am hour
+that occur twice when transitioning from DST to standard time
+SET @@timestamp=1540686600;
+INSERT INTO tbl_a VALUES (4, now(), now());
+SET @@timestamp=1540690200;
+INSERT INTO tbl_a VALUES (5, now(), now());
+Max value
+SET @@timestamp=2147483647;
+INSERT INTO tbl_a VALUES (6, now(), now());
+SET @@timestamp=0;
+
+SELECTs
+connection child2_1;
+TRUNCATE TABLE mysql.general_log;
+connection master_1;
+SELECT *, unix_timestamp(col_ts) FROM tbl_a;
+col_a col_dt col_ts unix_timestamp(col_ts)
+1 1970-01-01 01:00:01 1970-01-01 01:00:01 1
+2 2018-03-25 02:00:00 2018-03-25 02:00:00 1521939600
+3 2018-03-25 02:30:00 2018-03-25 02:30:00 1521941400
+4 2018-10-28 01:30:00 2018-10-28 01:30:00 1540686600
+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
+connection child2_1;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+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)
+1 1970-01-01 01:00:01 1970-01-01 01:00:01 1
+2 2018-03-25 02:00:00 2018-03-25 03:00:00 1521939600
+3 2018-03-25 02:30:00 2018-03-25 03:30:00 1521941400
+4 2018-10-28 01:30:00 2018-10-28 02:30:00 1540686600
+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
+
+DELETEs
+connection child2_1;
+TRUNCATE TABLE mysql.general_log;
+connection master_1;
+DELETE FROM tbl_a WHERE col_ts='1970-01-01 01:00:01';
+SELECT *, unix_timestamp(col_ts) FROM tbl_a;
+col_a col_dt col_ts unix_timestamp(col_ts)
+2 2018-03-25 02:00:00 2018-03-25 02:00:00 1521939600
+3 2018-03-25 02:30:00 2018-03-25 02:30:00 1521941400
+4 2018-10-28 01:30:00 2018-10-28 01:30:00 1540686600
+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
+connection child2_1;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+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)
+2 2018-03-25 02:00:00 2018-03-25 03:00:00 1521939600
+3 2018-03-25 02:30:00 2018-03-25 03:30:00 1521941400
+4 2018-10-28 01:30:00 2018-10-28 02:30:00 1540686600
+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
+connection child2_1;
+TRUNCATE TABLE mysql.general_log;
+connection master_1;
+SET @@timestamp=1;
+INSERT INTO tbl_a VALUES (1, now(), now());
+SET @@timestamp=0;
+SELECT *, unix_timestamp(col_ts) FROM tbl_a;
+col_a col_dt col_ts unix_timestamp(col_ts)
+1 1970-01-01 01:00:01 1970-01-01 01:00:01 1
+2 2018-03-25 02:00:00 2018-03-25 02:00:00 1521939600
+3 2018-03-25 02:30:00 2018-03-25 02:30:00 1521941400
+4 2018-10-28 01:30:00 2018-10-28 01:30:00 1540686600
+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
+connection child2_1;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+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)
+1 1970-01-01 01:00:01 1970-01-01 01:00:01 1
+2 2018-03-25 02:00:00 2018-03-25 03:00:00 1521939600
+3 2018-03-25 02:30:00 2018-03-25 03:30:00 1521941400
+4 2018-10-28 01:30:00 2018-10-28 02:30:00 1540686600
+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
+
+UPDATEs
+connection child2_1;
+TRUNCATE TABLE mysql.general_log;
+connection master_1;
+UPDATE tbl_a SET col_ts=col_dt;
+SELECT *, unix_timestamp(col_ts) FROM tbl_a;
+col_a col_dt col_ts unix_timestamp(col_ts)
+1 1970-01-01 01:00:01 1970-01-01 01:00:01 1
+2 2018-03-25 02:00:00 2018-03-25 02:00:00 1521939600
+3 2018-03-25 02:30:00 2018-03-25 02:30:00 1521941400
+4 2018-10-28 01:30:00 2018-10-28 01:30:00 1540686600
+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
+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 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)
+1 1970-01-01 01:00:01 1970-01-01 01:00:01 1
+2 2018-03-25 02:00:00 2018-03-25 03:00:00 1521939600
+3 2018-03-25 02:30:00 2018-03-25 03:30:00 1521941400
+4 2018-10-28 01:30:00 2018-10-28 02:30:00 1540686600
+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
+
+Lookups
+connection child2_1;
+TRUNCATE TABLE mysql.general_log;
+connection master_1;
+SELECT *, unix_timestamp(col_ts) FROM tbl_a WHERE col_ts > '2018-01-01';
+col_a col_dt col_ts unix_timestamp(col_ts)
+2 2018-03-25 02:00:00 2018-03-25 02:00:00 1521939600
+3 2018-03-25 02:30:00 2018-03-25 02:30:00 1521941400
+4 2018-10-28 01:30:00 2018-10-28 01:30:00 1540686600
+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
+SELECT *, unix_timestamp(col_ts) FROM tbl_a WHERE col_ts < '2018-10-28 02:30:00';
+col_a col_dt col_ts unix_timestamp(col_ts)
+1 1970-01-01 01:00:01 1970-01-01 01:00:01 1
+2 2018-03-25 02:00:00 2018-03-25 02:00:00 1521939600
+3 2018-03-25 02:30:00 2018-03-25 02:30:00 1521941400
+4 2018-10-28 01:30:00 2018-10-28 01:30:00 1540686600
+SELECT *, unix_timestamp(col_ts) FROM tbl_a WHERE '2018-10-28 02:30:00' > col_ts;
+col_a col_dt col_ts unix_timestamp(col_ts)
+1 1970-01-01 01:00:01 1970-01-01 01:00:01 1
+2 2018-03-25 02:00:00 2018-03-25 02:00:00 1521939600
+3 2018-03-25 02:30:00 2018-03-25 02:30:00 1521941400
+4 2018-10-28 01:30:00 2018-10-28 01:30:00 1540686600
+SELECT *, unix_timestamp(col_ts) FROM tbl_a WHERE col_ts BETWEEN '2018-10-28 01:30:00' AND '2018-10-28 02:30:00';
+col_a col_dt col_ts unix_timestamp(col_ts)
+4 2018-10-28 01:30:00 2018-10-28 01:30:00 1540686600
+5 2018-10-28 02:30:00 2018-10-28 02:30:00 1540690200
+SELECT *, unix_timestamp(col_ts) FROM tbl_a WHERE col_ts >= '2018-10-28 01:30:00' AND col_ts <= '2018-10-28 02:30:00';
+col_a col_dt col_ts unix_timestamp(col_ts)
+4 2018-10-28 01:30:00 2018-10-28 01:30:00 1540686600
+5 2018-10-28 02:30:00 2018-10-28 02:30:00 1540690200
+SELECT *, unix_timestamp(col_ts) FROM tbl_a WHERE col_ts > 180325020000;
+col_a col_dt col_ts unix_timestamp(col_ts)
+3 2018-03-25 02:30:00 2018-03-25 02:30:00 1521941400
+4 2018-10-28 01:30:00 2018-10-28 01:30:00 1540686600
+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
+SELECT *, unix_timestamp(col_ts) FROM tbl_a WHERE col_ts > 19700101010001;
+col_a col_dt col_ts unix_timestamp(col_ts)
+2 2018-03-25 02:00:00 2018-03-25 02:00:00 1521939600
+3 2018-03-25 02:30:00 2018-03-25 02:30:00 1521941400
+4 2018-10-28 01:30:00 2018-10-28 01:30:00 1540686600
+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
+connection child2_1;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+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)
+1 1970-01-01 01:00:01 1970-01-01 01:00:01 1
+2 2018-03-25 02:00:00 2018-03-25 03:00:00 1521939600
+3 2018-03-25 02:30:00 2018-03-25 03:30:00 1521941400
+4 2018-10-28 01:30:00 2018-10-28 02:30:00 1540686600
+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
+
+Drop the index on the timestamp column
+connection child2_1;
+DROP INDEX i_ts ON tbl_a;
+SHOW CREATE TABLE tbl_a;
+Table Create Table
+tbl_a CREATE TABLE `tbl_a` (
+ `col_a` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `col_dt` datetime DEFAULT NULL,
+ `col_ts` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
+ PRIMARY KEY (`col_a`)
+) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8mb4
+TRUNCATE TABLE mysql.general_log;
+connection master_1;
+DROP INDEX i_ts ON tbl_a;
+SHOW CREATE TABLE tbl_a;
+Table Create Table
+tbl_a CREATE TABLE `tbl_a` (
+ `col_a` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `col_dt` datetime DEFAULT NULL,
+ `col_ts` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
+ PRIMARY KEY (`col_a`)
+) ENGINE=SPIDER AUTO_INCREMENT=17 DEFAULT CHARSET=utf8mb4 COMMENT='database "ts_test_remote", table "tbl_a", srv "s_2_1"'
+
+Retry lookups on unindexed timestamp column
+connection child2_1;
+TRUNCATE TABLE mysql.general_log;
+connection master_1;
+SELECT *, unix_timestamp(col_ts) FROM tbl_a WHERE col_ts > '2018-01-01';
+col_a col_dt col_ts unix_timestamp(col_ts)
+2 2018-03-25 02:00:00 2018-03-25 02:00:00 1521939600
+3 2018-03-25 02:30:00 2018-03-25 02:30:00 1521941400
+4 2018-10-28 01:30:00 2018-10-28 01:30:00 1540686600
+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
+SELECT *, unix_timestamp(col_ts) FROM tbl_a WHERE col_ts < '2018-10-28 02:30:00';
+col_a col_dt col_ts unix_timestamp(col_ts)
+1 1970-01-01 01:00:01 1970-01-01 01:00:01 1
+2 2018-03-25 02:00:00 2018-03-25 02:00:00 1521939600
+3 2018-03-25 02:30:00 2018-03-25 02:30:00 1521941400
+4 2018-10-28 01:30:00 2018-10-28 01:30:00 1540686600
+SELECT *, unix_timestamp(col_ts) FROM tbl_a WHERE '2018-10-28 02:30:00' > col_ts;
+col_a col_dt col_ts unix_timestamp(col_ts)
+1 1970-01-01 01:00:01 1970-01-01 01:00:01 1
+2 2018-03-25 02:00:00 2018-03-25 02:00:00 1521939600
+3 2018-03-25 02:30:00 2018-03-25 02:30:00 1521941400
+4 2018-10-28 01:30:00 2018-10-28 01:30:00 1540686600
+SELECT *, unix_timestamp(col_ts) FROM tbl_a WHERE col_ts BETWEEN '2018-10-28 01:30:00' AND '2018-10-28 02:30:00';
+col_a col_dt col_ts unix_timestamp(col_ts)
+4 2018-10-28 01:30:00 2018-10-28 01:30:00 1540686600
+5 2018-10-28 02:30:00 2018-10-28 02:30:00 1540690200
+SELECT *, unix_timestamp(col_ts) FROM tbl_a WHERE col_ts >= '2018-10-28 01:30:00' AND col_ts <= '2018-10-28 02:30:00';
+col_a col_dt col_ts unix_timestamp(col_ts)
+4 2018-10-28 01:30:00 2018-10-28 01:30:00 1540686600
+5 2018-10-28 02:30:00 2018-10-28 02:30:00 1540690200
+SELECT *, unix_timestamp(col_ts) FROM tbl_a WHERE col_ts > 180325020000;
+col_a col_dt col_ts unix_timestamp(col_ts)
+3 2018-03-25 02:30:00 2018-03-25 02:30:00 1521941400
+4 2018-10-28 01:30:00 2018-10-28 01:30:00 1540686600
+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
+SELECT *, unix_timestamp(col_ts) FROM tbl_a WHERE col_ts > 19700101010001;
+col_a col_dt col_ts unix_timestamp(col_ts)
+2 2018-03-25 02:00:00 2018-03-25 02:00:00 1521939600
+3 2018-03-25 02:30:00 2018-03-25 02:30:00 1521941400
+4 2018-10-28 01:30:00 2018-10-28 01:30:00 1540686600
+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
+connection child2_1;
+SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+argument
+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)
+1 1970-01-01 01:00:01 1970-01-01 01:00:01 1
+2 2018-03-25 02:00:00 2018-03-25 03:00:00 1521939600
+3 2018-03-25 02:30:00 2018-03-25 03:30:00 1521941400
+4 2018-10-28 01:30:00 2018-10-28 02:30:00 1540686600
+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 1 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;
+SET time_zone=DEFAULT;
+connection child2_1;
+SET GLOBAL time_zone=DEFAULT;
+SET time_zone=DEFAULT;
+
+deinit
+connection master_1;
+DROP DATABASE IF EXISTS ts_test_local;
+connection child2_1;
+DROP DATABASE IF EXISTS ts_test_remote;
+SET GLOBAL log_output = @old_log_output;
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+child3_1
+child3_2
+child3_3
+
+end of test
diff --git a/storage/spider/mysql-test/spider/t/auto_increment.test b/storage/spider/mysql-test/spider/t/auto_increment.test
new file mode 100644
index 00000000000..12d93ca3e72
--- /dev/null
+++ b/storage/spider/mysql-test/spider/t/auto_increment.test
@@ -0,0 +1,185 @@
+--source auto_increment_init.inc
+
+--echo
+--echo drop and create databases
+--connection master_1
+--disable_warnings
+DROP DATABASE IF EXISTS auto_test_local;
+CREATE DATABASE auto_test_local;
+USE auto_test_local;
+if ($USE_CHILD_GROUP2)
+{
+ --connection child2_1
+ if ($USE_GENERAL_LOG)
+ {
+ SET @old_log_output = @@global.log_output;
+ SET GLOBAL log_output = 'TABLE,FILE';
+ }
+ DROP DATABASE IF EXISTS auto_test_remote;
+ CREATE DATABASE auto_test_remote;
+ USE auto_test_remote;
+}
+--enable_warnings
+
+--echo
+--echo test select 1
+--connection master_1
+SELECT 1;
+if ($USE_CHILD_GROUP2)
+{
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ --disable_result_log
+ }
+ --connection child2_1
+ SELECT 1;
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+
+--echo
+--echo create table select test
+if ($USE_CHILD_GROUP2)
+{
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ --disable_result_log
+ }
+ --connection child2_1
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ echo CHILD2_1_DROP_TABLES;
+ echo CHILD2_1_CREATE_TABLES;
+ }
+ --disable_warnings
+ eval $CHILD2_1_DROP_TABLES;
+ --enable_warnings
+ eval $CHILD2_1_CREATE_TABLES;
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ }
+ if ($USE_GENERAL_LOG)
+ {
+ TRUNCATE TABLE mysql.general_log;
+ }
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+--connection master_1
+--disable_warnings
+DROP TABLE IF EXISTS tbl_a;
+--enable_warnings
+--disable_query_log
+echo CREATE TABLE tbl_a (
+ col_a INT NOT NULL AUTO_INCREMENT,
+ col_b VARCHAR(20) DEFAULT 'defg',
+ col_c INT NOT NULL DEFAULT 100,
+ PRIMARY KEY(col_a)
+) MASTER_1_ENGINE MASTER_1_AUTO_INCREMENT_2_1 MASTER_1_COMMENT_2_1;
+eval CREATE TABLE tbl_a (
+ col_a INT NOT NULL AUTO_INCREMENT,
+ col_b VARCHAR(20) DEFAULT 'defg',
+ col_c INT NOT NULL DEFAULT 100,
+ PRIMARY KEY(col_a)
+) $MASTER_1_ENGINE $MASTER_1_AUTO_INCREMENT_2_1 $MASTER_1_COMMENT_2_1;
+--enable_query_log
+SHOW CREATE TABLE tbl_a;
+INSERT INTO tbl_a () VALUES ();
+INSERT INTO tbl_a () VALUES ();
+SHOW CREATE TABLE tbl_a;
+ALTER TABLE tbl_a MODIFY col_c MEDIUMINT NOT NULL DEFAULT 100;
+SHOW CREATE TABLE tbl_a;
+RENAME TABLE tbl_a TO tbl_x;
+SHOW CREATE TABLE tbl_x;
+RENAME TABLE tbl_x TO tbl_a;
+SHOW CREATE TABLE tbl_a;
+INSERT INTO tbl_a () VALUES ();
+INSERT INTO tbl_a () VALUES ();
+SHOW CREATE TABLE tbl_a;
+--disable_query_log
+echo MASTER_1_AUTO_INCREMENT1;
+eval $MASTER_1_AUTO_INCREMENT1;
+--enable_query_log
+SHOW CREATE TABLE tbl_a;
+INSERT INTO tbl_a () VALUES ();
+INSERT INTO tbl_a () VALUES ();
+SHOW CREATE TABLE tbl_a;
+--disable_query_log
+echo MASTER_1_AUTO_INCREMENT2;
+eval $MASTER_1_AUTO_INCREMENT2;
+--enable_query_log
+SHOW CREATE TABLE tbl_a;
+INSERT INTO tbl_a () VALUES ();
+INSERT INTO tbl_a () VALUES ();
+SHOW CREATE TABLE tbl_a;
+
+--echo
+--echo select test
+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_a;
+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_TABLES;
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+
+--echo
+--echo deinit
+--disable_warnings
+--connection master_1
+DROP DATABASE IF EXISTS auto_test_local;
+if ($USE_CHILD_GROUP2)
+{
+ --connection child2_1
+ DROP DATABASE IF EXISTS auto_test_remote;
+ if ($USE_GENERAL_LOG)
+ {
+ SET GLOBAL log_output = @old_log_output;
+ }
+}
+--enable_warnings
+--source auto_increment_deinit.inc
+--echo
+--echo end of test
diff --git a/storage/spider/mysql-test/spider/t/auto_increment_deinit.inc b/storage/spider/mysql-test/spider/t/auto_increment_deinit.inc
new file mode 100644
index 00000000000..52be67a1d09
--- /dev/null
+++ b/storage/spider/mysql-test/spider/t/auto_increment_deinit.inc
@@ -0,0 +1,13 @@
+--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
+--let $USE_GENERAL_LOG= $USE_GENERAL_LOG_BACKUP
+--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/t/auto_increment_init.inc b/storage/spider/mysql-test/spider/t/auto_increment_init.inc
new file mode 100644
index 00000000000..e4c1325072a
--- /dev/null
+++ b/storage/spider/mysql-test/spider/t/auto_increment_init.inc
@@ -0,0 +1,38 @@
+--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='database "auto_test_remote", table "tbl_a", srv "s_2_1", aim "0"';
+let $MASTER_1_AUTO_INCREMENT_2_1=
+ AUTO_INCREMENT=20;
+let $MASTER_1_AUTO_INCREMENT1=
+ ALTER TABLE tbl_a AUTO_INCREMENT=30;
+let $MASTER_1_AUTO_INCREMENT2=
+ ALTER TABLE tbl_a AUTO_INCREMENT=10;
+let $CHILD2_1_CHARSET_AUTO_INCREMENT=
+ AUTO_INCREMENT=20;
+--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 (
+ col_a INT NOT NULL AUTO_INCREMENT,
+ col_b VARCHAR(20) DEFAULT 'def',
+ col_c INT NOT NULL DEFAULT 10,
+ PRIMARY KEY(col_a)
+ ) $CHILD2_1_ENGINE $CHILD2_1_CHARSET_AUTO_INCREMENT $CHILD2_1_CHARSET;
+--let $CHILD2_1_SELECT_TABLES_BACKUP= $CHILD2_1_SELECT_TABLES
+let $CHILD2_1_SELECT_TABLES=
+ SELECT col_a, col_b, col_c FROM tbl_a ORDER BY col_a;
+let $CHILD2_1_SELECT_ARGUMENT1=
+ SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+--let $OUTPUT_CHILD_GROUP2_BACKUP= $OUTPUT_CHILD_GROUP2
+--let $OUTPUT_CHILD_GROUP2= 1
+--let $USE_GENERAL_LOG_BACKUP= $USE_GENERAL_LOG
+--let $USE_GENERAL_LOG= 1
diff --git a/storage/spider/mysql-test/spider/t/checksum_table_with_quick_mode_3.test b/storage/spider/mysql-test/spider/t/checksum_table_with_quick_mode_3.test
new file mode 100644
index 00000000000..d108fda7e41
--- /dev/null
+++ b/storage/spider/mysql-test/spider/t/checksum_table_with_quick_mode_3.test
@@ -0,0 +1,126 @@
+--source ../include/checksum_table_with_quick_mode_3_init.inc
+--echo
+--echo drop and create databases
+--connection master_1
+--disable_warnings
+CREATE DATABASE auto_test_local;
+USE auto_test_local;
+if ($USE_CHILD_GROUP2)
+{
+ --connection child2_1
+ if ($USE_GENERAL_LOG)
+ {
+ SET @old_log_output = @@global.log_output;
+ SET GLOBAL log_output = 'TABLE,FILE';
+ }
+ CREATE DATABASE auto_test_remote;
+ USE auto_test_remote;
+}
+--enable_warnings
+
+--echo
+--echo create table and insert
+if ($USE_CHILD_GROUP2)
+{
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ --disable_result_log
+ }
+ --connection child2_1
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ echo CHILD2_1_CREATE_TABLES;
+ }
+ eval $CHILD2_1_CREATE_TABLES;
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ }
+ if ($USE_GENERAL_LOG)
+ {
+ TRUNCATE TABLE mysql.general_log;
+ }
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_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;
+eval CREATE TABLE tbl_a (
+ pkey int NOT NULL,
+ PRIMARY KEY (pkey)
+) $MASTER_1_ENGINE $MASTER_1_CHARSET $MASTER_1_COMMENT_2_1;
+--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);
+FLUSH TABLES;
+
+--echo
+--echo select test 1
+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
+CHECKSUM TABLE tbl_a EXTENDED;
+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_TABLES;
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+
+--echo
+--echo deinit
+--disable_warnings
+--connection master_1
+DROP DATABASE IF EXISTS auto_test_local;
+if ($USE_CHILD_GROUP2)
+{
+ --connection child2_1
+ DROP DATABASE IF EXISTS auto_test_remote;
+ if ($USE_GENERAL_LOG)
+ {
+ SET GLOBAL log_output = @old_log_output;
+ }
+}
+--enable_warnings
+--source ../include/checksum_table_with_quick_mode_3_deinit.inc
+--echo
+--echo end of test
diff --git a/storage/spider/mysql-test/spider/t/direct_join.test b/storage/spider/mysql-test/spider/t/direct_join.test
new file mode 100644
index 00000000000..3f7c692d2c2
--- /dev/null
+++ b/storage/spider/mysql-test/spider/t/direct_join.test
@@ -0,0 +1,343 @@
+--source ../include/direct_join_init.inc
+
+--echo
+--echo drop and create databases
+--connection master_1
+--disable_warnings
+DROP DATABASE IF EXISTS auto_test_local;
+CREATE DATABASE auto_test_local;
+USE auto_test_local;
+if ($USE_CHILD_GROUP2)
+{
+ --connection child2_1
+ if ($USE_GENERAL_LOG)
+ {
+ SET @old_log_output = @@global.log_output;
+ SET GLOBAL log_output = 'TABLE,FILE';
+ }
+ DROP DATABASE IF EXISTS auto_test_remote;
+ CREATE DATABASE auto_test_remote;
+ USE auto_test_remote;
+}
+--enable_warnings
+
+--echo
+--echo test select 1
+--connection master_1
+SELECT 1;
+if ($USE_CHILD_GROUP2)
+{
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ --disable_result_log
+ }
+ --connection child2_1
+ SELECT 1;
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+
+--echo
+--echo create table and insert
+if ($USE_CHILD_GROUP2)
+{
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ --disable_result_log
+ }
+ --connection child2_1
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ echo CHILD2_1_DROP_TABLES;
+ echo CHILD2_1_DROP_TABLES6;
+ echo CHILD2_1_DROP_TABLES5;
+ echo CHILD2_1_CREATE_TABLES;
+ echo CHILD2_1_CREATE_TABLES6;
+ echo CHILD2_1_CREATE_TABLES5;
+ }
+ --disable_warnings
+ eval $CHILD2_1_DROP_TABLES;
+ eval $CHILD2_1_DROP_TABLES6;
+ eval $CHILD2_1_DROP_TABLES5;
+ --enable_warnings
+ eval $CHILD2_1_CREATE_TABLES;
+ eval $CHILD2_1_CREATE_TABLES6;
+ eval $CHILD2_1_CREATE_TABLES5;
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ }
+ if ($USE_GENERAL_LOG)
+ {
+ TRUNCATE TABLE mysql.general_log;
+ }
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+--connection master_1
+--disable_warnings
+DROP TABLE IF EXISTS tbl_a;
+--enable_warnings
+--disable_query_log
+echo CREATE TABLE tbl_a (
+ a INT DEFAULT 10,
+ b CHAR(1) DEFAULT 'c',
+ c DATETIME DEFAULT '1999-10-10 10:10:10',
+ PRIMARY KEY(a),
+ KEY idx1(b)
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_1;
+eval CREATE TABLE tbl_a (
+ a INT DEFAULT 10,
+ b CHAR(1) DEFAULT 'c',
+ c DATETIME DEFAULT '1999-10-10 10:10:10',
+ PRIMARY KEY(a),
+ KEY idx1(b)
+) $MASTER_1_ENGINE $MASTER_1_CHARSET $MASTER_1_COMMENT_2_1;
+echo CREATE TABLE tbl_b (
+ a INT DEFAULT 10,
+ b CHAR(1) DEFAULT 'c',
+ c DATETIME DEFAULT '1999-10-10 10:10:10'
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT5_2_1;
+eval CREATE TABLE tbl_b (
+ a INT DEFAULT 10,
+ b CHAR(1) DEFAULT 'c',
+ c DATETIME DEFAULT '1999-10-10 10:10:10'
+) $MASTER_1_ENGINE $MASTER_1_CHARSET $MASTER_1_COMMENT5_2_1;
+echo CREATE TABLE tbl_c (
+ a INT AUTO_INCREMENT,
+ b INT DEFAULT 10,
+ c INT DEFAULT 11,
+ PRIMARY KEY(a),
+ KEY idx1(b),
+ KEY idx2(c)
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT4_2_1;
+eval CREATE TABLE tbl_c (
+ a INT AUTO_INCREMENT,
+ b INT DEFAULT 10,
+ c INT DEFAULT 11,
+ PRIMARY KEY(a),
+ KEY idx1(b),
+ KEY idx2(c)
+) $MASTER_1_ENGINE $MASTER_1_CHARSET $MASTER_1_COMMENT4_2_1;
+--enable_query_log
+insert into tbl_a values (1,'a','2000/01/01'),(2,'b','2000/01/02'),(3,'c','2000/01/03'),(4,'d','2000/01/04'),(5,'e','2000/01/05');
+insert into tbl_b values (1,'a','2000/01/01'),(2,'b','2000/01/02'),(3,'c','2000/01/03'),(4,'d','2000/01/04'),(5,'e','2000/01/05');
+insert into tbl_c values (1,10,100),(2,20,200),(3,30,300),(4,40,400),(5,50,500);
+
+--echo
+--echo select test
+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 a.a, c.b, c.c FROM tbl_a a, tbl_b b, tbl_c c WHERE a.a = b.a and a.a = c.a ORDER BY a.b DESC LIMIT 1,2;
+
+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_TABLES;
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+
+--echo
+--echo Test JOIN on a constant table.
+--echo Spider should NOT push down the join because the tbl_person table
+--echo is optimized as a constant table.
+if ($USE_CHILD_GROUP2)
+{
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ --disable_result_log
+ }
+ --connection child2_1
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ echo CHILD2_1_DROP_CONST_TABLE_JOIN;
+ echo CHILD2_1_DROP_CONST_TABLE2_JOIN;
+ echo CHILD2_1_CREATE_CONST_TABLE_JOIN;
+ echo CHILD2_1_CREATE_CONST_TABLE2_JOIN;
+ }
+ --disable_warnings
+ eval $CHILD2_1_DROP_CONST_TABLE_JOIN;
+ eval $CHILD2_1_DROP_CONST_TABLE2_JOIN;
+ --enable_warnings
+ eval $CHILD2_1_CREATE_CONST_TABLE_JOIN;
+ eval $CHILD2_1_CREATE_CONST_TABLE2_JOIN;
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ }
+ if ($USE_GENERAL_LOG)
+ {
+ TRUNCATE TABLE mysql.general_log;
+ }
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+--connection master_1
+--disable_warnings
+DROP TABLE IF EXISTS tbl_person;
+DROP TABLE IF EXISTS tbl_ncd_cm_person;
+--enable_warnings
+--disable_query_log
+echo CREATE TABLE tbl_person (
+ id VARCHAR(50) NOT NULL,
+ hr_status VARCHAR(50) NULL DEFAULT NULL,
+ region_code VARCHAR(50) NULL DEFAULT NULL,
+ region INT(11) NOT NULL,
+ PRIMARY KEY (id, region) USING BTREE
+ ) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_CONST_TABLE_JOIN
+ MASTER_1_ROW_FORMAT_CONST_TABLE_JOIN MASTER_1_PART_CONST_TABLE_JOIN;
+eval CREATE TABLE tbl_person (
+ id VARCHAR(50) NOT NULL,
+ hr_status VARCHAR(50) NULL DEFAULT NULL,
+ region_code VARCHAR(50) NULL DEFAULT NULL,
+ region INT(11) NOT NULL,
+ PRIMARY KEY (id, region) USING BTREE
+ ) $MASTER_1_ENGINE $MASTER_1_CHARSET $MASTER_1_COMMENT_CONST_TABLE_JOIN
+ $MASTER_1_ROW_FORMAT_CONST_TABLE_JOIN $MASTER_1_PART_CONST_TABLE_JOIN;
+echo SHOW CREATE TABLE tbl_person;
+SHOW CREATE TABLE tbl_person;
+echo CREATE TABLE tbl_ncd_cm_person (
+ id VARCHAR(50) NOT NULL,
+ person_id VARCHAR(50) NULL DEFAULT '',
+ diseaseKind_id VARCHAR(50) NULL DEFAULT NULL,
+ region INT(11) NOT NULL,
+ PRIMARY KEY (id, region) USING BTREE
+ ) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_CONST_TABLE2_JOIN
+ MASTER_1_ROW_FORMAT_CONST_TABLE_JOIN MASTER_1_PART_CONST_TABLE2_JOIN;
+eval CREATE TABLE tbl_ncd_cm_person (
+ id VARCHAR(50) NOT NULL,
+ person_id VARCHAR(50) NULL DEFAULT '',
+ diseaseKind_id VARCHAR(50) NULL DEFAULT NULL,
+ region INT(11) NOT NULL,
+ PRIMARY KEY (id, region) USING BTREE
+ ) $MASTER_1_ENGINE $MASTER_1_CHARSET $MASTER_1_COMMENT_CONST_TABLE2_JOIN
+ $MASTER_1_ROW_FORMAT_CONST_TABLE_JOIN $MASTER_1_PART_CONST_TABLE2_JOIN;
+echo SHOW CREATE TABLE tbl_ncd_cm_person;
+SHOW CREATE TABLE tbl_ncd_cm_person;
+--enable_query_log
+INSERT INTO tbl_person VALUES ('24FC3F0A5119432BAE13DD65AABAA39C',
+ '1', '123-51041110620301-321', 510411);
+INSERT INTO tbl_person VALUES ('123456789012345678901234567890AB',
+ '1', '123-51041110620301-321', 510411);
+INSERT INTO tbl_ncd_cm_person VALUES ('123456789',
+ '24FC3F0A5119432BAE13DD65AABAA39C',
+ '52A0328740914BCE86ED10A4D2521816',
+ 510411);
+INSERT INTO tbl_ncd_cm_person VALUES ('123456789AB',
+ '123456789012345678901234567890AB',
+ '52A0328740914BCE86ED10A4D2521816',
+ 510411);
+DELETE FROM tbl_ncd_cm_person;
+INSERT INTO tbl_ncd_cm_person VALUES ('123456789',
+ '24FC3F0A5119432BAE13DD65AABAA39C',
+ '52A0328740914BCE86ED10A4D2521816',
+ 510411);
+INSERT INTO tbl_ncd_cm_person VALUES ('123456789AB',
+ '123456789012345678901234567890AB',
+ '52A0328740914BCE86ED10A4D2521816',
+ 510411);
+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 count(0) FROM tbl_person tp INNER JOIN tbl_ncd_cm_person tncp ON tp.id = tncp.person_id WHERE 1 = 1 AND tp.hr_status != "99" AND tp.hr_status != "2" AND tp.region_code LIKE CONCAT(CONCAT('%', '51041110620301', '%')) AND tp.id = '24FC3F0A5119432BAE13DD65AABAA39C' AND tncp.diseaseKind_id = '52A0328740914BCE86ED10A4D2521816' AND tp.region = 510411;
+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_CONST_TABLE_JOIN;
+ eval $CHILD2_1_SELECT_CONST_TABLE2_JOIN;
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+
+--echo
+--echo deinit
+--disable_warnings
+--connection master_1
+DROP DATABASE IF EXISTS auto_test_local;
+if ($USE_CHILD_GROUP2)
+{
+ --connection child2_1
+ DROP DATABASE IF EXISTS auto_test_remote;
+ if ($USE_GENERAL_LOG)
+ {
+ SET GLOBAL log_output = @old_log_output;
+ }
+}
+--enable_warnings
+--source ../include/direct_join_deinit.inc
+--echo
+--echo end of test
diff --git a/storage/spider/mysql-test/spider/t/direct_join_using.test b/storage/spider/mysql-test/spider/t/direct_join_using.test
new file mode 100644
index 00000000000..819e56ff21c
--- /dev/null
+++ b/storage/spider/mysql-test/spider/t/direct_join_using.test
@@ -0,0 +1,197 @@
+--source ../include/direct_join_using_init.inc
+
+--echo
+--echo drop and create databases
+--connection master_1
+--disable_warnings
+DROP DATABASE IF EXISTS auto_test_local;
+CREATE DATABASE auto_test_local;
+USE auto_test_local;
+if ($USE_CHILD_GROUP2)
+{
+ --connection child2_1
+ if ($USE_GENERAL_LOG)
+ {
+ SET @old_log_output = @@global.log_output;
+ SET GLOBAL log_output = 'TABLE,FILE';
+ }
+ DROP DATABASE IF EXISTS auto_test_remote;
+ CREATE DATABASE auto_test_remote;
+ USE auto_test_remote;
+}
+--enable_warnings
+
+--echo
+--echo test select 1
+--connection master_1
+SELECT 1;
+if ($USE_CHILD_GROUP2)
+{
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ --disable_result_log
+ }
+ --connection child2_1
+ SELECT 1;
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+
+--echo
+--echo create table and insert
+if ($USE_CHILD_GROUP2)
+{
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ --disable_result_log
+ }
+ --connection child2_1
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ echo CHILD2_1_DROP_TABLES;
+ echo CHILD2_1_DROP_TABLES6;
+ echo CHILD2_1_DROP_TABLES5;
+ echo CHILD2_1_CREATE_TABLES;
+ echo CHILD2_1_CREATE_TABLES6;
+ echo CHILD2_1_CREATE_TABLES5;
+ }
+ --disable_warnings
+ eval $CHILD2_1_DROP_TABLES;
+ eval $CHILD2_1_DROP_TABLES6;
+ eval $CHILD2_1_DROP_TABLES5;
+ --enable_warnings
+ eval $CHILD2_1_CREATE_TABLES;
+ eval $CHILD2_1_CREATE_TABLES6;
+ eval $CHILD2_1_CREATE_TABLES5;
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ }
+ if ($USE_GENERAL_LOG)
+ {
+ TRUNCATE TABLE mysql.general_log;
+ }
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+--connection master_1
+--disable_warnings
+DROP TABLE IF EXISTS tbl_a;
+--enable_warnings
+--disable_query_log
+echo CREATE TABLE tbl_a (
+ a INT DEFAULT 10,
+ b CHAR(1) DEFAULT 'c',
+ c DATETIME DEFAULT '1999-10-10 10:10:10',
+ PRIMARY KEY(a),
+ KEY idx1(b)
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_1;
+eval CREATE TABLE tbl_a (
+ a INT DEFAULT 10,
+ b CHAR(1) DEFAULT 'c',
+ c DATETIME DEFAULT '1999-10-10 10:10:10',
+ PRIMARY KEY(a),
+ KEY idx1(b)
+) $MASTER_1_ENGINE $MASTER_1_CHARSET $MASTER_1_COMMENT_2_1;
+echo CREATE TABLE tbl_b (
+ a INT DEFAULT 10,
+ b CHAR(1) DEFAULT 'c',
+ c DATETIME DEFAULT '1999-10-10 10:10:10'
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT5_2_1;
+eval CREATE TABLE tbl_b (
+ a INT DEFAULT 10,
+ b CHAR(1) DEFAULT 'c',
+ c DATETIME DEFAULT '1999-10-10 10:10:10'
+) $MASTER_1_ENGINE $MASTER_1_CHARSET $MASTER_1_COMMENT5_2_1;
+echo CREATE TABLE tbl_c (
+ a INT AUTO_INCREMENT,
+ b INT DEFAULT 10,
+ c INT DEFAULT 11,
+ PRIMARY KEY(a),
+ KEY idx1(b),
+ KEY idx2(c)
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT4_2_1;
+eval CREATE TABLE tbl_c (
+ a INT AUTO_INCREMENT,
+ b INT DEFAULT 10,
+ c INT DEFAULT 11,
+ PRIMARY KEY(a),
+ KEY idx1(b),
+ KEY idx2(c)
+) $MASTER_1_ENGINE $MASTER_1_CHARSET $MASTER_1_COMMENT4_2_1;
+--enable_query_log
+insert into tbl_a values (1,'a','2000/01/01'),(2,'b','2000/01/02'),(3,'c','2000/01/03'),(4,'d','2000/01/04'),(5,'e','2000/01/05');
+insert into tbl_b values (1,'a','2000/01/01'),(2,'b','2000/01/02'),(3,'c','2000/01/03'),(4,'d','2000/01/04'),(5,'e','2000/01/05');
+insert into tbl_c values (1,10,100),(2,20,200),(3,30,300),(4,40,400),(5,50,500);
+
+--echo
+--echo select test
+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 a.a, c.b, c.c FROM tbl_a a join tbl_b b using(a) join tbl_c c using(a) ORDER BY a.b DESC;
+
+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_TABLES;
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+
+--echo
+--echo deinit
+--disable_warnings
+--connection master_1
+DROP DATABASE IF EXISTS auto_test_local;
+if ($USE_CHILD_GROUP2)
+{
+ --connection child2_1
+ DROP DATABASE IF EXISTS auto_test_remote;
+ if ($USE_GENERAL_LOG)
+ {
+ SET GLOBAL log_output = @old_log_output;
+ }
+}
+--enable_warnings
+--source ../include/direct_join_using_deinit.inc
+--echo
+--echo end of test
diff --git a/storage/spider/mysql-test/spider/t/direct_left_join.test b/storage/spider/mysql-test/spider/t/direct_left_join.test
new file mode 100644
index 00000000000..e09b6a12488
--- /dev/null
+++ b/storage/spider/mysql-test/spider/t/direct_left_join.test
@@ -0,0 +1,197 @@
+--source ../include/direct_left_join_init.inc
+
+--echo
+--echo drop and create databases
+--connection master_1
+--disable_warnings
+DROP DATABASE IF EXISTS auto_test_local;
+CREATE DATABASE auto_test_local;
+USE auto_test_local;
+if ($USE_CHILD_GROUP2)
+{
+ --connection child2_1
+ if ($USE_GENERAL_LOG)
+ {
+ SET @old_log_output = @@global.log_output;
+ SET GLOBAL log_output = 'TABLE,FILE';
+ }
+ DROP DATABASE IF EXISTS auto_test_remote;
+ CREATE DATABASE auto_test_remote;
+ USE auto_test_remote;
+}
+--enable_warnings
+
+--echo
+--echo test select 1
+--connection master_1
+SELECT 1;
+if ($USE_CHILD_GROUP2)
+{
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ --disable_result_log
+ }
+ --connection child2_1
+ SELECT 1;
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+
+--echo
+--echo create table and insert
+if ($USE_CHILD_GROUP2)
+{
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ --disable_result_log
+ }
+ --connection child2_1
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ echo CHILD2_1_DROP_TABLES;
+ echo CHILD2_1_DROP_TABLES6;
+ echo CHILD2_1_DROP_TABLES5;
+ echo CHILD2_1_CREATE_TABLES;
+ echo CHILD2_1_CREATE_TABLES6;
+ echo CHILD2_1_CREATE_TABLES5;
+ }
+ --disable_warnings
+ eval $CHILD2_1_DROP_TABLES;
+ eval $CHILD2_1_DROP_TABLES6;
+ eval $CHILD2_1_DROP_TABLES5;
+ --enable_warnings
+ eval $CHILD2_1_CREATE_TABLES;
+ eval $CHILD2_1_CREATE_TABLES6;
+ eval $CHILD2_1_CREATE_TABLES5;
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ }
+ if ($USE_GENERAL_LOG)
+ {
+ TRUNCATE TABLE mysql.general_log;
+ }
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+--connection master_1
+--disable_warnings
+DROP TABLE IF EXISTS tbl_a;
+--enable_warnings
+--disable_query_log
+echo CREATE TABLE tbl_a (
+ a INT DEFAULT 10,
+ b CHAR(1) DEFAULT 'c',
+ c DATETIME DEFAULT '1999-10-10 10:10:10',
+ PRIMARY KEY(a),
+ KEY idx1(b)
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_1;
+eval CREATE TABLE tbl_a (
+ a INT DEFAULT 10,
+ b CHAR(1) DEFAULT 'c',
+ c DATETIME DEFAULT '1999-10-10 10:10:10',
+ PRIMARY KEY(a),
+ KEY idx1(b)
+) $MASTER_1_ENGINE $MASTER_1_CHARSET $MASTER_1_COMMENT_2_1;
+echo CREATE TABLE tbl_b (
+ a INT DEFAULT 10,
+ b CHAR(1) DEFAULT 'c',
+ c DATETIME DEFAULT '1999-10-10 10:10:10'
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT5_2_1;
+eval CREATE TABLE tbl_b (
+ a INT DEFAULT 10,
+ b CHAR(1) DEFAULT 'c',
+ c DATETIME DEFAULT '1999-10-10 10:10:10'
+) $MASTER_1_ENGINE $MASTER_1_CHARSET $MASTER_1_COMMENT5_2_1;
+echo CREATE TABLE tbl_c (
+ a INT AUTO_INCREMENT,
+ b INT DEFAULT 10,
+ c INT DEFAULT 11,
+ PRIMARY KEY(a),
+ KEY idx1(b),
+ KEY idx2(c)
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT4_2_1;
+eval CREATE TABLE tbl_c (
+ a INT AUTO_INCREMENT,
+ b INT DEFAULT 10,
+ c INT DEFAULT 11,
+ PRIMARY KEY(a),
+ KEY idx1(b),
+ KEY idx2(c)
+) $MASTER_1_ENGINE $MASTER_1_CHARSET $MASTER_1_COMMENT4_2_1;
+--enable_query_log
+insert into tbl_a values (1,'a','2000/01/01'),(2,'b','2000/01/02'),(3,'c','2000/01/03'),(4,'d','2000/01/04'),(5,'e','2000/01/05');
+insert into tbl_b values (1,'a','2000/01/01'),(2,'b','2000/01/02'),(3,'c','2000/01/03'),(4,'d','2000/01/04'),(5,'e','2000/01/05');
+insert into tbl_c values (1,10,100),(2,20,200),(3,30,300),(4,40,400),(5,50,500);
+
+--echo
+--echo select test
+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 a.a, c.b, c.c FROM tbl_a a left join tbl_b b on a.a = b.a left join tbl_c c on a.a = c.a ORDER BY a.b DESC;
+
+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_TABLES;
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+
+--echo
+--echo deinit
+--disable_warnings
+--connection master_1
+DROP DATABASE IF EXISTS auto_test_local;
+if ($USE_CHILD_GROUP2)
+{
+ --connection child2_1
+ DROP DATABASE IF EXISTS auto_test_remote;
+ if ($USE_GENERAL_LOG)
+ {
+ SET GLOBAL log_output = @old_log_output;
+ }
+}
+--enable_warnings
+--source ../include/direct_left_join_deinit.inc
+--echo
+--echo end of test
diff --git a/storage/spider/mysql-test/spider/t/direct_left_join_nullable.test b/storage/spider/mysql-test/spider/t/direct_left_join_nullable.test
new file mode 100644
index 00000000000..dc67a01b4b2
--- /dev/null
+++ b/storage/spider/mysql-test/spider/t/direct_left_join_nullable.test
@@ -0,0 +1,212 @@
+--source ../include/direct_left_join_nullable_init.inc
+
+--echo
+--echo drop and create databases
+--connection master_1
+--disable_warnings
+DROP DATABASE IF EXISTS auto_test_local;
+CREATE DATABASE auto_test_local;
+USE auto_test_local;
+if ($USE_CHILD_GROUP2)
+{
+ --connection child2_1
+ if ($USE_GENERAL_LOG)
+ {
+ SET @old_log_output = @@global.log_output;
+ SET GLOBAL log_output = 'TABLE,FILE';
+ }
+ DROP DATABASE IF EXISTS auto_test_remote;
+ CREATE DATABASE auto_test_remote;
+ USE auto_test_remote;
+}
+--enable_warnings
+
+--echo
+--echo test select 1
+--connection master_1
+SELECT 1;
+if ($USE_CHILD_GROUP2)
+{
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ --disable_result_log
+ }
+ --connection child2_1
+ SELECT 1;
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+
+--echo
+--echo create table and insert
+if ($USE_CHILD_GROUP2)
+{
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ --disable_result_log
+ }
+ --connection child2_1
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ echo CHILD2_1_DROP_TABLES;
+ echo CHILD2_1_DROP_TABLES6;
+ echo CHILD2_1_DROP_TABLES4;
+ echo CHILD2_1_DROP_TABLES3;
+ echo CHILD2_1_CREATE_TABLES;
+ echo CHILD2_1_CREATE_TABLES6;
+ echo CHILD2_1_CREATE_TABLES4;
+ echo CHILD2_1_CREATE_TABLES3;
+ }
+ --disable_warnings
+ eval $CHILD2_1_DROP_TABLES;
+ eval $CHILD2_1_DROP_TABLES6;
+ eval $CHILD2_1_DROP_TABLES4;
+ eval $CHILD2_1_DROP_TABLES3;
+ --enable_warnings
+ eval $CHILD2_1_CREATE_TABLES;
+ eval $CHILD2_1_CREATE_TABLES6;
+ eval $CHILD2_1_CREATE_TABLES4;
+ eval $CHILD2_1_CREATE_TABLES3;
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ }
+ if ($USE_GENERAL_LOG)
+ {
+ TRUNCATE TABLE mysql.general_log;
+ }
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+--connection master_1
+--disable_warnings
+DROP TABLE IF EXISTS tbl_a;
+--enable_warnings
+--disable_query_log
+echo CREATE TABLE tbl_a (
+ a INT DEFAULT 10,
+ b CHAR(1) DEFAULT 'c',
+ c DATETIME DEFAULT '1999-10-10 10:10:10',
+ KEY idx0(a),
+ KEY idx1(b)
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_1;
+eval CREATE TABLE tbl_a (
+ a INT DEFAULT 10,
+ b CHAR(1) DEFAULT 'c',
+ c DATETIME DEFAULT '1999-10-10 10:10:10',
+ KEY idx0(a),
+ KEY idx1(b)
+) $MASTER_1_ENGINE $MASTER_1_CHARSET $MASTER_1_COMMENT_2_1;
+echo CREATE TABLE tbl_b (
+ a INT DEFAULT 10,
+ b CHAR(1) DEFAULT 'c',
+ c DATETIME DEFAULT '1999-10-10 10:10:10'
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT5_2_1;
+eval CREATE TABLE tbl_b (
+ a INT DEFAULT 10,
+ b CHAR(1) DEFAULT 'c',
+ c DATETIME DEFAULT '1999-10-10 10:10:10'
+) $MASTER_1_ENGINE $MASTER_1_CHARSET $MASTER_1_COMMENT5_2_1;
+echo CREATE TABLE tbl_c (
+ a INT AUTO_INCREMENT,
+ b CHAR(1) DEFAULT 'c',
+ c DATETIME DEFAULT '1999-10-10 10:10:10',
+ KEY idx0(a),
+ KEY idx1(b),
+ KEY idx2(c)
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT3_2_1;
+eval CREATE TABLE tbl_c (
+ a INT AUTO_INCREMENT,
+ b CHAR(1) DEFAULT 'c',
+ c DATETIME DEFAULT '1999-10-10 10:10:10',
+ KEY idx0(a),
+ KEY idx1(b),
+ KEY idx2(c)
+) $MASTER_1_ENGINE $MASTER_1_CHARSET $MASTER_1_COMMENT3_2_1;
+echo CREATE TABLE tbl_d (
+ a INT DEFAULT 10,
+ b CHAR(1) DEFAULT 'c',
+ c DATETIME DEFAULT '1999-10-10 10:10:10'
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT2_2_1;
+eval CREATE TABLE tbl_d (
+ a INT DEFAULT 10,
+ b CHAR(1) DEFAULT 'c',
+ c DATETIME DEFAULT '1999-10-10 10:10:10'
+) $MASTER_1_ENGINE $MASTER_1_CHARSET $MASTER_1_COMMENT2_2_1;
+--enable_query_log
+insert into tbl_a values (1,'a','2000/01/01'),(2,'b','2000/01/02');
+insert into tbl_b values (1,'a','2000/01/01'),(2,'b','2000/01/02'),(3,'c','2000/01/03');
+insert into tbl_c values (1,'a','2000/01/01'),(2,'b','2000/01/02'),(3,'c','2000/01/03'),(4,'d','2000/01/04');
+insert into tbl_d values (1,'a','2000/01/01'),(2,'b','2000/01/02'),(3,'c','2000/01/03'),(4,'d','2000/01/04'),(5,'e','2000/01/05');
+
+--echo
+--echo select test
+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 a.a, c.b, c.c, d.a FROM tbl_d a left join tbl_c b on a.a = b.a left join tbl_b c on b.c = c.c left join tbl_a d on c.b = d.b ORDER BY a.a DESC;
+
+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_TABLES;
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+
+--echo
+--echo deinit
+--disable_warnings
+--connection master_1
+DROP DATABASE IF EXISTS auto_test_local;
+if ($USE_CHILD_GROUP2)
+{
+ --connection child2_1
+ DROP DATABASE IF EXISTS auto_test_remote;
+ if ($USE_GENERAL_LOG)
+ {
+ SET GLOBAL log_output = @old_log_output;
+ }
+}
+--enable_warnings
+--source ../include/direct_left_join_nullable_deinit.inc
+--echo
+--echo end of test
diff --git a/storage/spider/mysql-test/spider/t/direct_left_right_join_nullable.test b/storage/spider/mysql-test/spider/t/direct_left_right_join_nullable.test
new file mode 100644
index 00000000000..9d5a990e0ba
--- /dev/null
+++ b/storage/spider/mysql-test/spider/t/direct_left_right_join_nullable.test
@@ -0,0 +1,212 @@
+--source ../include/direct_left_right_join_nullable_init.inc
+
+--echo
+--echo drop and create databases
+--connection master_1
+--disable_warnings
+DROP DATABASE IF EXISTS auto_test_local;
+CREATE DATABASE auto_test_local;
+USE auto_test_local;
+if ($USE_CHILD_GROUP2)
+{
+ --connection child2_1
+ if ($USE_GENERAL_LOG)
+ {
+ SET @old_log_output = @@global.log_output;
+ SET GLOBAL log_output = 'TABLE,FILE';
+ }
+ DROP DATABASE IF EXISTS auto_test_remote;
+ CREATE DATABASE auto_test_remote;
+ USE auto_test_remote;
+}
+--enable_warnings
+
+--echo
+--echo test select 1
+--connection master_1
+SELECT 1;
+if ($USE_CHILD_GROUP2)
+{
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ --disable_result_log
+ }
+ --connection child2_1
+ SELECT 1;
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+
+--echo
+--echo create table and insert
+if ($USE_CHILD_GROUP2)
+{
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ --disable_result_log
+ }
+ --connection child2_1
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ echo CHILD2_1_DROP_TABLES;
+ echo CHILD2_1_DROP_TABLES6;
+ echo CHILD2_1_DROP_TABLES4;
+ echo CHILD2_1_DROP_TABLES3;
+ echo CHILD2_1_CREATE_TABLES;
+ echo CHILD2_1_CREATE_TABLES6;
+ echo CHILD2_1_CREATE_TABLES4;
+ echo CHILD2_1_CREATE_TABLES3;
+ }
+ --disable_warnings
+ eval $CHILD2_1_DROP_TABLES;
+ eval $CHILD2_1_DROP_TABLES6;
+ eval $CHILD2_1_DROP_TABLES4;
+ eval $CHILD2_1_DROP_TABLES3;
+ --enable_warnings
+ eval $CHILD2_1_CREATE_TABLES;
+ eval $CHILD2_1_CREATE_TABLES6;
+ eval $CHILD2_1_CREATE_TABLES4;
+ eval $CHILD2_1_CREATE_TABLES3;
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ }
+ if ($USE_GENERAL_LOG)
+ {
+ TRUNCATE TABLE mysql.general_log;
+ }
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+--connection master_1
+--disable_warnings
+DROP TABLE IF EXISTS tbl_a;
+--enable_warnings
+--disable_query_log
+echo CREATE TABLE tbl_a (
+ a INT DEFAULT 10,
+ b CHAR(1) DEFAULT 'c',
+ c DATETIME DEFAULT '1999-10-10 10:10:10',
+ KEY idx0(a),
+ KEY idx1(b)
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_1;
+eval CREATE TABLE tbl_a (
+ a INT DEFAULT 10,
+ b CHAR(1) DEFAULT 'c',
+ c DATETIME DEFAULT '1999-10-10 10:10:10',
+ KEY idx0(a),
+ KEY idx1(b)
+) $MASTER_1_ENGINE $MASTER_1_CHARSET $MASTER_1_COMMENT_2_1;
+echo CREATE TABLE tbl_b (
+ a INT DEFAULT 10,
+ b CHAR(1) DEFAULT 'c',
+ c DATETIME DEFAULT '1999-10-10 10:10:10'
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT5_2_1;
+eval CREATE TABLE tbl_b (
+ a INT DEFAULT 10,
+ b CHAR(1) DEFAULT 'c',
+ c DATETIME DEFAULT '1999-10-10 10:10:10'
+) $MASTER_1_ENGINE $MASTER_1_CHARSET $MASTER_1_COMMENT5_2_1;
+echo CREATE TABLE tbl_c (
+ a INT AUTO_INCREMENT,
+ b CHAR(1) DEFAULT 'c',
+ c DATETIME DEFAULT '1999-10-10 10:10:10',
+ KEY idx0(a),
+ KEY idx1(b),
+ KEY idx2(c)
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT3_2_1;
+eval CREATE TABLE tbl_c (
+ a INT AUTO_INCREMENT,
+ b CHAR(1) DEFAULT 'c',
+ c DATETIME DEFAULT '1999-10-10 10:10:10',
+ KEY idx0(a),
+ KEY idx1(b),
+ KEY idx2(c)
+) $MASTER_1_ENGINE $MASTER_1_CHARSET $MASTER_1_COMMENT3_2_1;
+echo CREATE TABLE tbl_d (
+ a INT DEFAULT 10,
+ b CHAR(1) DEFAULT 'c',
+ c DATETIME DEFAULT '1999-10-10 10:10:10'
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT2_2_1;
+eval CREATE TABLE tbl_d (
+ a INT DEFAULT 10,
+ b CHAR(1) DEFAULT 'c',
+ c DATETIME DEFAULT '1999-10-10 10:10:10'
+) $MASTER_1_ENGINE $MASTER_1_CHARSET $MASTER_1_COMMENT2_2_1;
+--enable_query_log
+insert into tbl_a values (1,'a','2000/01/01'),(2,'b','2000/01/02');
+insert into tbl_b values (1,'a','2000/01/01'),(2,'b','2000/01/02'),(3,'c','2000/01/03');
+insert into tbl_c values (1,'a','2000/01/01'),(2,'b','2000/01/02'),(3,'c','2000/01/03'),(4,'d','2000/01/04');
+insert into tbl_d values (1,'a','2000/01/01'),(2,'b','2000/01/02'),(3,'c','2000/01/03'),(4,'d','2000/01/04'),(5,'e','2000/01/05');
+
+--echo
+--echo select test
+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 a.a, c.b, c.c, d.a FROM tbl_a a left join tbl_b b on a.a = b.a left join tbl_c c on b.c = c.c right join tbl_d d on c.b = d.b ORDER BY d.a DESC;
+
+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_TABLES;
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+
+--echo
+--echo deinit
+--disable_warnings
+--connection master_1
+DROP DATABASE IF EXISTS auto_test_local;
+if ($USE_CHILD_GROUP2)
+{
+ --connection child2_1
+ DROP DATABASE IF EXISTS auto_test_remote;
+ if ($USE_GENERAL_LOG)
+ {
+ SET GLOBAL log_output = @old_log_output;
+ }
+}
+--enable_warnings
+--source ../include/direct_left_right_join_nullable_deinit.inc
+--echo
+--echo end of test
diff --git a/storage/spider/mysql-test/spider/t/direct_left_right_left_join_nullable.test b/storage/spider/mysql-test/spider/t/direct_left_right_left_join_nullable.test
new file mode 100644
index 00000000000..90e3666957d
--- /dev/null
+++ b/storage/spider/mysql-test/spider/t/direct_left_right_left_join_nullable.test
@@ -0,0 +1,212 @@
+--source ../include/direct_left_right_left_join_nullable_init.inc
+
+--echo
+--echo drop and create databases
+--connection master_1
+--disable_warnings
+DROP DATABASE IF EXISTS auto_test_local;
+CREATE DATABASE auto_test_local;
+USE auto_test_local;
+if ($USE_CHILD_GROUP2)
+{
+ --connection child2_1
+ if ($USE_GENERAL_LOG)
+ {
+ SET @old_log_output = @@global.log_output;
+ SET GLOBAL log_output = 'TABLE,FILE';
+ }
+ DROP DATABASE IF EXISTS auto_test_remote;
+ CREATE DATABASE auto_test_remote;
+ USE auto_test_remote;
+}
+--enable_warnings
+
+--echo
+--echo test select 1
+--connection master_1
+SELECT 1;
+if ($USE_CHILD_GROUP2)
+{
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ --disable_result_log
+ }
+ --connection child2_1
+ SELECT 1;
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+
+--echo
+--echo create table and insert
+if ($USE_CHILD_GROUP2)
+{
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ --disable_result_log
+ }
+ --connection child2_1
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ echo CHILD2_1_DROP_TABLES;
+ echo CHILD2_1_DROP_TABLES6;
+ echo CHILD2_1_DROP_TABLES4;
+ echo CHILD2_1_DROP_TABLES3;
+ echo CHILD2_1_CREATE_TABLES;
+ echo CHILD2_1_CREATE_TABLES6;
+ echo CHILD2_1_CREATE_TABLES4;
+ echo CHILD2_1_CREATE_TABLES3;
+ }
+ --disable_warnings
+ eval $CHILD2_1_DROP_TABLES;
+ eval $CHILD2_1_DROP_TABLES6;
+ eval $CHILD2_1_DROP_TABLES4;
+ eval $CHILD2_1_DROP_TABLES3;
+ --enable_warnings
+ eval $CHILD2_1_CREATE_TABLES;
+ eval $CHILD2_1_CREATE_TABLES6;
+ eval $CHILD2_1_CREATE_TABLES4;
+ eval $CHILD2_1_CREATE_TABLES3;
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ }
+ if ($USE_GENERAL_LOG)
+ {
+ TRUNCATE TABLE mysql.general_log;
+ }
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+--connection master_1
+--disable_warnings
+DROP TABLE IF EXISTS tbl_a;
+--enable_warnings
+--disable_query_log
+echo CREATE TABLE tbl_a (
+ a INT DEFAULT 10,
+ b CHAR(1) DEFAULT 'c',
+ c DATETIME DEFAULT '1999-10-10 10:10:10',
+ KEY idx0(a),
+ KEY idx1(b)
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_1;
+eval CREATE TABLE tbl_a (
+ a INT DEFAULT 10,
+ b CHAR(1) DEFAULT 'c',
+ c DATETIME DEFAULT '1999-10-10 10:10:10',
+ KEY idx0(a),
+ KEY idx1(b)
+) $MASTER_1_ENGINE $MASTER_1_CHARSET $MASTER_1_COMMENT_2_1;
+echo CREATE TABLE tbl_b (
+ a INT DEFAULT 10,
+ b CHAR(1) DEFAULT 'c',
+ c DATETIME DEFAULT '1999-10-10 10:10:10'
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT5_2_1;
+eval CREATE TABLE tbl_b (
+ a INT DEFAULT 10,
+ b CHAR(1) DEFAULT 'c',
+ c DATETIME DEFAULT '1999-10-10 10:10:10'
+) $MASTER_1_ENGINE $MASTER_1_CHARSET $MASTER_1_COMMENT5_2_1;
+echo CREATE TABLE tbl_c (
+ a INT AUTO_INCREMENT,
+ b CHAR(1) DEFAULT 'c',
+ c DATETIME DEFAULT '1999-10-10 10:10:10',
+ KEY idx0(a),
+ KEY idx1(b),
+ KEY idx2(c)
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT3_2_1;
+eval CREATE TABLE tbl_c (
+ a INT AUTO_INCREMENT,
+ b CHAR(1) DEFAULT 'c',
+ c DATETIME DEFAULT '1999-10-10 10:10:10',
+ KEY idx0(a),
+ KEY idx1(b),
+ KEY idx2(c)
+) $MASTER_1_ENGINE $MASTER_1_CHARSET $MASTER_1_COMMENT3_2_1;
+echo CREATE TABLE tbl_d (
+ a INT DEFAULT 10,
+ b CHAR(1) DEFAULT 'c',
+ c DATETIME DEFAULT '1999-10-10 10:10:10'
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT2_2_1;
+eval CREATE TABLE tbl_d (
+ a INT DEFAULT 10,
+ b CHAR(1) DEFAULT 'c',
+ c DATETIME DEFAULT '1999-10-10 10:10:10'
+) $MASTER_1_ENGINE $MASTER_1_CHARSET $MASTER_1_COMMENT2_2_1;
+--enable_query_log
+insert into tbl_a values (1,'a','2000/01/01'),(2,'b','2000/01/02');
+insert into tbl_b values (1,'a','2000/01/01'),(2,'b','2000/01/02'),(3,'c','2000/01/03');
+insert into tbl_c values (1,'a','2000/01/01'),(2,'b','2000/01/02'),(3,'c','2000/01/03'),(4,'d','2000/01/04');
+insert into tbl_d values (1,'a','2000/01/01'),(2,'b','2000/01/02'),(3,'c','2000/01/03'),(4,'d','2000/01/04'),(5,'e','2000/01/05');
+
+--echo
+--echo select test
+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 a.a, c.b, c.c, d.a FROM tbl_a a left join tbl_b b on a.a = b.a right join tbl_c c on b.c = c.c left join tbl_d d on c.b = d.b ORDER BY d.a DESC;
+
+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_TABLES;
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+
+--echo
+--echo deinit
+--disable_warnings
+--connection master_1
+DROP DATABASE IF EXISTS auto_test_local;
+if ($USE_CHILD_GROUP2)
+{
+ --connection child2_1
+ DROP DATABASE IF EXISTS auto_test_remote;
+ if ($USE_GENERAL_LOG)
+ {
+ SET GLOBAL log_output = @old_log_output;
+ }
+}
+--enable_warnings
+--source ../include/direct_left_right_left_join_nullable_deinit.inc
+--echo
+--echo end of test
diff --git a/storage/spider/mysql-test/spider/t/direct_right_join.test b/storage/spider/mysql-test/spider/t/direct_right_join.test
new file mode 100644
index 00000000000..0c0496651d6
--- /dev/null
+++ b/storage/spider/mysql-test/spider/t/direct_right_join.test
@@ -0,0 +1,197 @@
+--source ../include/direct_right_join_init.inc
+
+--echo
+--echo drop and create databases
+--connection master_1
+--disable_warnings
+DROP DATABASE IF EXISTS auto_test_local;
+CREATE DATABASE auto_test_local;
+USE auto_test_local;
+if ($USE_CHILD_GROUP2)
+{
+ --connection child2_1
+ if ($USE_GENERAL_LOG)
+ {
+ SET @old_log_output = @@global.log_output;
+ SET GLOBAL log_output = 'TABLE,FILE';
+ }
+ DROP DATABASE IF EXISTS auto_test_remote;
+ CREATE DATABASE auto_test_remote;
+ USE auto_test_remote;
+}
+--enable_warnings
+
+--echo
+--echo test select 1
+--connection master_1
+SELECT 1;
+if ($USE_CHILD_GROUP2)
+{
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ --disable_result_log
+ }
+ --connection child2_1
+ SELECT 1;
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+
+--echo
+--echo create table and insert
+if ($USE_CHILD_GROUP2)
+{
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ --disable_result_log
+ }
+ --connection child2_1
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ echo CHILD2_1_DROP_TABLES;
+ echo CHILD2_1_DROP_TABLES6;
+ echo CHILD2_1_DROP_TABLES5;
+ echo CHILD2_1_CREATE_TABLES;
+ echo CHILD2_1_CREATE_TABLES6;
+ echo CHILD2_1_CREATE_TABLES5;
+ }
+ --disable_warnings
+ eval $CHILD2_1_DROP_TABLES;
+ eval $CHILD2_1_DROP_TABLES6;
+ eval $CHILD2_1_DROP_TABLES5;
+ --enable_warnings
+ eval $CHILD2_1_CREATE_TABLES;
+ eval $CHILD2_1_CREATE_TABLES6;
+ eval $CHILD2_1_CREATE_TABLES5;
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ }
+ if ($USE_GENERAL_LOG)
+ {
+ TRUNCATE TABLE mysql.general_log;
+ }
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+--connection master_1
+--disable_warnings
+DROP TABLE IF EXISTS tbl_a;
+--enable_warnings
+--disable_query_log
+echo CREATE TABLE tbl_a (
+ a INT DEFAULT 10,
+ b CHAR(1) DEFAULT 'c',
+ c DATETIME DEFAULT '1999-10-10 10:10:10',
+ PRIMARY KEY(a),
+ KEY idx1(b)
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_1;
+eval CREATE TABLE tbl_a (
+ a INT DEFAULT 10,
+ b CHAR(1) DEFAULT 'c',
+ c DATETIME DEFAULT '1999-10-10 10:10:10',
+ PRIMARY KEY(a),
+ KEY idx1(b)
+) $MASTER_1_ENGINE $MASTER_1_CHARSET $MASTER_1_COMMENT_2_1;
+echo CREATE TABLE tbl_b (
+ a INT DEFAULT 10,
+ b CHAR(1) DEFAULT 'c',
+ c DATETIME DEFAULT '1999-10-10 10:10:10'
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT5_2_1;
+eval CREATE TABLE tbl_b (
+ a INT DEFAULT 10,
+ b CHAR(1) DEFAULT 'c',
+ c DATETIME DEFAULT '1999-10-10 10:10:10'
+) $MASTER_1_ENGINE $MASTER_1_CHARSET $MASTER_1_COMMENT5_2_1;
+echo CREATE TABLE tbl_c (
+ a INT AUTO_INCREMENT,
+ b INT DEFAULT 10,
+ c INT DEFAULT 11,
+ PRIMARY KEY(a),
+ KEY idx1(b),
+ KEY idx2(c)
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT4_2_1;
+eval CREATE TABLE tbl_c (
+ a INT AUTO_INCREMENT,
+ b INT DEFAULT 10,
+ c INT DEFAULT 11,
+ PRIMARY KEY(a),
+ KEY idx1(b),
+ KEY idx2(c)
+) $MASTER_1_ENGINE $MASTER_1_CHARSET $MASTER_1_COMMENT4_2_1;
+--enable_query_log
+insert into tbl_a values (1,'a','2000/01/01'),(2,'b','2000/01/02'),(3,'c','2000/01/03'),(4,'d','2000/01/04'),(5,'e','2000/01/05');
+insert into tbl_b values (1,'a','2000/01/01'),(2,'b','2000/01/02'),(3,'c','2000/01/03'),(4,'d','2000/01/04'),(5,'e','2000/01/05');
+insert into tbl_c values (1,10,100),(2,20,200),(3,30,300),(4,40,400),(5,50,500);
+
+--echo
+--echo select test
+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 a.a, c.b, c.c FROM tbl_a a right join tbl_b b on a.a = b.a right join tbl_c c on a.a = c.a ORDER BY a.b DESC;
+
+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_TABLES;
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+
+--echo
+--echo deinit
+--disable_warnings
+--connection master_1
+DROP DATABASE IF EXISTS auto_test_local;
+if ($USE_CHILD_GROUP2)
+{
+ --connection child2_1
+ DROP DATABASE IF EXISTS auto_test_remote;
+ if ($USE_GENERAL_LOG)
+ {
+ SET GLOBAL log_output = @old_log_output;
+ }
+}
+--enable_warnings
+--source ../include/direct_right_join_deinit.inc
+--echo
+--echo end of test
diff --git a/storage/spider/mysql-test/spider/t/direct_right_join_nullable.test b/storage/spider/mysql-test/spider/t/direct_right_join_nullable.test
new file mode 100644
index 00000000000..3ab4a30ea84
--- /dev/null
+++ b/storage/spider/mysql-test/spider/t/direct_right_join_nullable.test
@@ -0,0 +1,212 @@
+--source ../include/direct_right_join_nullable_init.inc
+
+--echo
+--echo drop and create databases
+--connection master_1
+--disable_warnings
+DROP DATABASE IF EXISTS auto_test_local;
+CREATE DATABASE auto_test_local;
+USE auto_test_local;
+if ($USE_CHILD_GROUP2)
+{
+ --connection child2_1
+ if ($USE_GENERAL_LOG)
+ {
+ SET @old_log_output = @@global.log_output;
+ SET GLOBAL log_output = 'TABLE,FILE';
+ }
+ DROP DATABASE IF EXISTS auto_test_remote;
+ CREATE DATABASE auto_test_remote;
+ USE auto_test_remote;
+}
+--enable_warnings
+
+--echo
+--echo test select 1
+--connection master_1
+SELECT 1;
+if ($USE_CHILD_GROUP2)
+{
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ --disable_result_log
+ }
+ --connection child2_1
+ SELECT 1;
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+
+--echo
+--echo create table and insert
+if ($USE_CHILD_GROUP2)
+{
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ --disable_result_log
+ }
+ --connection child2_1
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ echo CHILD2_1_DROP_TABLES;
+ echo CHILD2_1_DROP_TABLES6;
+ echo CHILD2_1_DROP_TABLES4;
+ echo CHILD2_1_DROP_TABLES3;
+ echo CHILD2_1_CREATE_TABLES;
+ echo CHILD2_1_CREATE_TABLES6;
+ echo CHILD2_1_CREATE_TABLES4;
+ echo CHILD2_1_CREATE_TABLES3;
+ }
+ --disable_warnings
+ eval $CHILD2_1_DROP_TABLES;
+ eval $CHILD2_1_DROP_TABLES6;
+ eval $CHILD2_1_DROP_TABLES4;
+ eval $CHILD2_1_DROP_TABLES3;
+ --enable_warnings
+ eval $CHILD2_1_CREATE_TABLES;
+ eval $CHILD2_1_CREATE_TABLES6;
+ eval $CHILD2_1_CREATE_TABLES4;
+ eval $CHILD2_1_CREATE_TABLES3;
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ }
+ if ($USE_GENERAL_LOG)
+ {
+ TRUNCATE TABLE mysql.general_log;
+ }
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+--connection master_1
+--disable_warnings
+DROP TABLE IF EXISTS tbl_a;
+--enable_warnings
+--disable_query_log
+echo CREATE TABLE tbl_a (
+ a INT DEFAULT 10,
+ b CHAR(1) DEFAULT 'c',
+ c DATETIME DEFAULT '1999-10-10 10:10:10',
+ KEY idx0(a),
+ KEY idx1(b)
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_1;
+eval CREATE TABLE tbl_a (
+ a INT DEFAULT 10,
+ b CHAR(1) DEFAULT 'c',
+ c DATETIME DEFAULT '1999-10-10 10:10:10',
+ KEY idx0(a),
+ KEY idx1(b)
+) $MASTER_1_ENGINE $MASTER_1_CHARSET $MASTER_1_COMMENT_2_1;
+echo CREATE TABLE tbl_b (
+ a INT DEFAULT 10,
+ b CHAR(1) DEFAULT 'c',
+ c DATETIME DEFAULT '1999-10-10 10:10:10'
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT5_2_1;
+eval CREATE TABLE tbl_b (
+ a INT DEFAULT 10,
+ b CHAR(1) DEFAULT 'c',
+ c DATETIME DEFAULT '1999-10-10 10:10:10'
+) $MASTER_1_ENGINE $MASTER_1_CHARSET $MASTER_1_COMMENT5_2_1;
+echo CREATE TABLE tbl_c (
+ a INT AUTO_INCREMENT,
+ b CHAR(1) DEFAULT 'c',
+ c DATETIME DEFAULT '1999-10-10 10:10:10',
+ KEY idx0(a),
+ KEY idx1(b),
+ KEY idx2(c)
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT3_2_1;
+eval CREATE TABLE tbl_c (
+ a INT AUTO_INCREMENT,
+ b CHAR(1) DEFAULT 'c',
+ c DATETIME DEFAULT '1999-10-10 10:10:10',
+ KEY idx0(a),
+ KEY idx1(b),
+ KEY idx2(c)
+) $MASTER_1_ENGINE $MASTER_1_CHARSET $MASTER_1_COMMENT3_2_1;
+echo CREATE TABLE tbl_d (
+ a INT DEFAULT 10,
+ b CHAR(1) DEFAULT 'c',
+ c DATETIME DEFAULT '1999-10-10 10:10:10'
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT2_2_1;
+eval CREATE TABLE tbl_d (
+ a INT DEFAULT 10,
+ b CHAR(1) DEFAULT 'c',
+ c DATETIME DEFAULT '1999-10-10 10:10:10'
+) $MASTER_1_ENGINE $MASTER_1_CHARSET $MASTER_1_COMMENT2_2_1;
+--enable_query_log
+insert into tbl_a values (1,'a','2000/01/01'),(2,'b','2000/01/02');
+insert into tbl_b values (1,'a','2000/01/01'),(2,'b','2000/01/02'),(3,'c','2000/01/03');
+insert into tbl_c values (1,'a','2000/01/01'),(2,'b','2000/01/02'),(3,'c','2000/01/03'),(4,'d','2000/01/04');
+insert into tbl_d values (1,'a','2000/01/01'),(2,'b','2000/01/02'),(3,'c','2000/01/03'),(4,'d','2000/01/04'),(5,'e','2000/01/05');
+
+--echo
+--echo select test
+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 a.a, c.b, c.c, d.a FROM tbl_a a right join tbl_b b on a.a = b.a right join tbl_c c on b.c = c.c right join tbl_d d on c.b = d.b ORDER BY d.a DESC;
+
+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_TABLES;
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+
+--echo
+--echo deinit
+--disable_warnings
+--connection master_1
+DROP DATABASE IF EXISTS auto_test_local;
+if ($USE_CHILD_GROUP2)
+{
+ --connection child2_1
+ DROP DATABASE IF EXISTS auto_test_remote;
+ if ($USE_GENERAL_LOG)
+ {
+ SET GLOBAL log_output = @old_log_output;
+ }
+}
+--enable_warnings
+--source ../include/direct_right_join_nullable_deinit.inc
+--echo
+--echo end of test
diff --git a/storage/spider/mysql-test/spider/t/direct_right_left_join_nullable.test b/storage/spider/mysql-test/spider/t/direct_right_left_join_nullable.test
new file mode 100644
index 00000000000..fefe255890d
--- /dev/null
+++ b/storage/spider/mysql-test/spider/t/direct_right_left_join_nullable.test
@@ -0,0 +1,212 @@
+--source ../include/direct_right_left_join_nullable_init.inc
+
+--echo
+--echo drop and create databases
+--connection master_1
+--disable_warnings
+DROP DATABASE IF EXISTS auto_test_local;
+CREATE DATABASE auto_test_local;
+USE auto_test_local;
+if ($USE_CHILD_GROUP2)
+{
+ --connection child2_1
+ if ($USE_GENERAL_LOG)
+ {
+ SET @old_log_output = @@global.log_output;
+ SET GLOBAL log_output = 'TABLE,FILE';
+ }
+ DROP DATABASE IF EXISTS auto_test_remote;
+ CREATE DATABASE auto_test_remote;
+ USE auto_test_remote;
+}
+--enable_warnings
+
+--echo
+--echo test select 1
+--connection master_1
+SELECT 1;
+if ($USE_CHILD_GROUP2)
+{
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ --disable_result_log
+ }
+ --connection child2_1
+ SELECT 1;
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+
+--echo
+--echo create table and insert
+if ($USE_CHILD_GROUP2)
+{
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ --disable_result_log
+ }
+ --connection child2_1
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ echo CHILD2_1_DROP_TABLES;
+ echo CHILD2_1_DROP_TABLES6;
+ echo CHILD2_1_DROP_TABLES4;
+ echo CHILD2_1_DROP_TABLES3;
+ echo CHILD2_1_CREATE_TABLES;
+ echo CHILD2_1_CREATE_TABLES6;
+ echo CHILD2_1_CREATE_TABLES4;
+ echo CHILD2_1_CREATE_TABLES3;
+ }
+ --disable_warnings
+ eval $CHILD2_1_DROP_TABLES;
+ eval $CHILD2_1_DROP_TABLES6;
+ eval $CHILD2_1_DROP_TABLES4;
+ eval $CHILD2_1_DROP_TABLES3;
+ --enable_warnings
+ eval $CHILD2_1_CREATE_TABLES;
+ eval $CHILD2_1_CREATE_TABLES6;
+ eval $CHILD2_1_CREATE_TABLES4;
+ eval $CHILD2_1_CREATE_TABLES3;
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ }
+ if ($USE_GENERAL_LOG)
+ {
+ TRUNCATE TABLE mysql.general_log;
+ }
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+--connection master_1
+--disable_warnings
+DROP TABLE IF EXISTS tbl_a;
+--enable_warnings
+--disable_query_log
+echo CREATE TABLE tbl_a (
+ a INT DEFAULT 10,
+ b CHAR(1) DEFAULT 'c',
+ c DATETIME DEFAULT '1999-10-10 10:10:10',
+ KEY idx0(a),
+ KEY idx1(b)
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_1;
+eval CREATE TABLE tbl_a (
+ a INT DEFAULT 10,
+ b CHAR(1) DEFAULT 'c',
+ c DATETIME DEFAULT '1999-10-10 10:10:10',
+ KEY idx0(a),
+ KEY idx1(b)
+) $MASTER_1_ENGINE $MASTER_1_CHARSET $MASTER_1_COMMENT_2_1;
+echo CREATE TABLE tbl_b (
+ a INT DEFAULT 10,
+ b CHAR(1) DEFAULT 'c',
+ c DATETIME DEFAULT '1999-10-10 10:10:10'
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT5_2_1;
+eval CREATE TABLE tbl_b (
+ a INT DEFAULT 10,
+ b CHAR(1) DEFAULT 'c',
+ c DATETIME DEFAULT '1999-10-10 10:10:10'
+) $MASTER_1_ENGINE $MASTER_1_CHARSET $MASTER_1_COMMENT5_2_1;
+echo CREATE TABLE tbl_c (
+ a INT AUTO_INCREMENT,
+ b CHAR(1) DEFAULT 'c',
+ c DATETIME DEFAULT '1999-10-10 10:10:10',
+ KEY idx0(a),
+ KEY idx1(b),
+ KEY idx2(c)
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT3_2_1;
+eval CREATE TABLE tbl_c (
+ a INT AUTO_INCREMENT,
+ b CHAR(1) DEFAULT 'c',
+ c DATETIME DEFAULT '1999-10-10 10:10:10',
+ KEY idx0(a),
+ KEY idx1(b),
+ KEY idx2(c)
+) $MASTER_1_ENGINE $MASTER_1_CHARSET $MASTER_1_COMMENT3_2_1;
+echo CREATE TABLE tbl_d (
+ a INT DEFAULT 10,
+ b CHAR(1) DEFAULT 'c',
+ c DATETIME DEFAULT '1999-10-10 10:10:10'
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT2_2_1;
+eval CREATE TABLE tbl_d (
+ a INT DEFAULT 10,
+ b CHAR(1) DEFAULT 'c',
+ c DATETIME DEFAULT '1999-10-10 10:10:10'
+) $MASTER_1_ENGINE $MASTER_1_CHARSET $MASTER_1_COMMENT2_2_1;
+--enable_query_log
+insert into tbl_a values (1,'a','2000/01/01'),(2,'b','2000/01/02');
+insert into tbl_b values (1,'a','2000/01/01'),(2,'b','2000/01/02'),(3,'c','2000/01/03');
+insert into tbl_c values (1,'a','2000/01/01'),(2,'b','2000/01/02'),(3,'c','2000/01/03'),(4,'d','2000/01/04');
+insert into tbl_d values (1,'a','2000/01/01'),(2,'b','2000/01/02'),(3,'c','2000/01/03'),(4,'d','2000/01/04'),(5,'e','2000/01/05');
+
+--echo
+--echo select test
+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 a.a, c.b, c.c, d.a FROM tbl_a a right join tbl_b b on a.a = b.a right join tbl_c c on b.c = c.c left join tbl_d d on c.b = d.b ORDER BY d.a DESC;
+
+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_TABLES;
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+
+--echo
+--echo deinit
+--disable_warnings
+--connection master_1
+DROP DATABASE IF EXISTS auto_test_local;
+if ($USE_CHILD_GROUP2)
+{
+ --connection child2_1
+ DROP DATABASE IF EXISTS auto_test_remote;
+ if ($USE_GENERAL_LOG)
+ {
+ SET GLOBAL log_output = @old_log_output;
+ }
+}
+--enable_warnings
+--source ../include/direct_right_left_join_nullable_deinit.inc
+--echo
+--echo end of test
diff --git a/storage/spider/mysql-test/spider/t/direct_right_left_right_join_nullable.test b/storage/spider/mysql-test/spider/t/direct_right_left_right_join_nullable.test
new file mode 100644
index 00000000000..48882d27939
--- /dev/null
+++ b/storage/spider/mysql-test/spider/t/direct_right_left_right_join_nullable.test
@@ -0,0 +1,212 @@
+--source ../include/direct_right_left_right_join_nullable_init.inc
+
+--echo
+--echo drop and create databases
+--connection master_1
+--disable_warnings
+DROP DATABASE IF EXISTS auto_test_local;
+CREATE DATABASE auto_test_local;
+USE auto_test_local;
+if ($USE_CHILD_GROUP2)
+{
+ --connection child2_1
+ if ($USE_GENERAL_LOG)
+ {
+ SET @old_log_output = @@global.log_output;
+ SET GLOBAL log_output = 'TABLE,FILE';
+ }
+ DROP DATABASE IF EXISTS auto_test_remote;
+ CREATE DATABASE auto_test_remote;
+ USE auto_test_remote;
+}
+--enable_warnings
+
+--echo
+--echo test select 1
+--connection master_1
+SELECT 1;
+if ($USE_CHILD_GROUP2)
+{
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ --disable_result_log
+ }
+ --connection child2_1
+ SELECT 1;
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+
+--echo
+--echo create table and insert
+if ($USE_CHILD_GROUP2)
+{
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ --disable_result_log
+ }
+ --connection child2_1
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ echo CHILD2_1_DROP_TABLES;
+ echo CHILD2_1_DROP_TABLES6;
+ echo CHILD2_1_DROP_TABLES4;
+ echo CHILD2_1_DROP_TABLES3;
+ echo CHILD2_1_CREATE_TABLES;
+ echo CHILD2_1_CREATE_TABLES6;
+ echo CHILD2_1_CREATE_TABLES4;
+ echo CHILD2_1_CREATE_TABLES3;
+ }
+ --disable_warnings
+ eval $CHILD2_1_DROP_TABLES;
+ eval $CHILD2_1_DROP_TABLES6;
+ eval $CHILD2_1_DROP_TABLES4;
+ eval $CHILD2_1_DROP_TABLES3;
+ --enable_warnings
+ eval $CHILD2_1_CREATE_TABLES;
+ eval $CHILD2_1_CREATE_TABLES6;
+ eval $CHILD2_1_CREATE_TABLES4;
+ eval $CHILD2_1_CREATE_TABLES3;
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ }
+ if ($USE_GENERAL_LOG)
+ {
+ TRUNCATE TABLE mysql.general_log;
+ }
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+--connection master_1
+--disable_warnings
+DROP TABLE IF EXISTS tbl_a;
+--enable_warnings
+--disable_query_log
+echo CREATE TABLE tbl_a (
+ a INT DEFAULT 10,
+ b CHAR(1) DEFAULT 'c',
+ c DATETIME DEFAULT '1999-10-10 10:10:10',
+ KEY idx0(a),
+ KEY idx1(b)
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_1;
+eval CREATE TABLE tbl_a (
+ a INT DEFAULT 10,
+ b CHAR(1) DEFAULT 'c',
+ c DATETIME DEFAULT '1999-10-10 10:10:10',
+ KEY idx0(a),
+ KEY idx1(b)
+) $MASTER_1_ENGINE $MASTER_1_CHARSET $MASTER_1_COMMENT_2_1;
+echo CREATE TABLE tbl_b (
+ a INT DEFAULT 10,
+ b CHAR(1) DEFAULT 'c',
+ c DATETIME DEFAULT '1999-10-10 10:10:10'
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT5_2_1;
+eval CREATE TABLE tbl_b (
+ a INT DEFAULT 10,
+ b CHAR(1) DEFAULT 'c',
+ c DATETIME DEFAULT '1999-10-10 10:10:10'
+) $MASTER_1_ENGINE $MASTER_1_CHARSET $MASTER_1_COMMENT5_2_1;
+echo CREATE TABLE tbl_c (
+ a INT AUTO_INCREMENT,
+ b CHAR(1) DEFAULT 'c',
+ c DATETIME DEFAULT '1999-10-10 10:10:10',
+ KEY idx0(a),
+ KEY idx1(b),
+ KEY idx2(c)
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT3_2_1;
+eval CREATE TABLE tbl_c (
+ a INT AUTO_INCREMENT,
+ b CHAR(1) DEFAULT 'c',
+ c DATETIME DEFAULT '1999-10-10 10:10:10',
+ KEY idx0(a),
+ KEY idx1(b),
+ KEY idx2(c)
+) $MASTER_1_ENGINE $MASTER_1_CHARSET $MASTER_1_COMMENT3_2_1;
+echo CREATE TABLE tbl_d (
+ a INT DEFAULT 10,
+ b CHAR(1) DEFAULT 'c',
+ c DATETIME DEFAULT '1999-10-10 10:10:10'
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT2_2_1;
+eval CREATE TABLE tbl_d (
+ a INT DEFAULT 10,
+ b CHAR(1) DEFAULT 'c',
+ c DATETIME DEFAULT '1999-10-10 10:10:10'
+) $MASTER_1_ENGINE $MASTER_1_CHARSET $MASTER_1_COMMENT2_2_1;
+--enable_query_log
+insert into tbl_a values (1,'a','2000/01/01'),(2,'b','2000/01/02');
+insert into tbl_b values (1,'a','2000/01/01'),(2,'b','2000/01/02'),(3,'c','2000/01/03');
+insert into tbl_c values (1,'a','2000/01/01'),(2,'b','2000/01/02'),(3,'c','2000/01/03'),(4,'d','2000/01/04');
+insert into tbl_d values (1,'a','2000/01/01'),(2,'b','2000/01/02'),(3,'c','2000/01/03'),(4,'d','2000/01/04'),(5,'e','2000/01/05');
+
+--echo
+--echo select test
+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 a.a, c.b, c.c, d.a FROM tbl_a a right join tbl_b b on a.a = b.a left join tbl_c c on b.c = c.c right join tbl_d d on c.b = d.b ORDER BY d.a DESC;
+
+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_TABLES;
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+
+--echo
+--echo deinit
+--disable_warnings
+--connection master_1
+DROP DATABASE IF EXISTS auto_test_local;
+if ($USE_CHILD_GROUP2)
+{
+ --connection child2_1
+ DROP DATABASE IF EXISTS auto_test_remote;
+ if ($USE_GENERAL_LOG)
+ {
+ SET GLOBAL log_output = @old_log_output;
+ }
+}
+--enable_warnings
+--source ../include/direct_right_left_right_join_nullable_deinit.inc
+--echo
+--echo end of test
diff --git a/storage/spider/mysql-test/spider/t/partition_cond_push.test b/storage/spider/mysql-test/spider/t/partition_cond_push.test
new file mode 100644
index 00000000000..4bcfc2aa386
--- /dev/null
+++ b/storage/spider/mysql-test/spider/t/partition_cond_push.test
@@ -0,0 +1,219 @@
+--source ../include/partition_cond_push_init.inc
+if (!$HAVE_PARTITION)
+{
+ --source ../include/partition_cond_push_deinit.inc
+ skip Test requires partitioning;
+}
+
+--echo
+--echo drop and create databases
+--connection master_1
+--disable_warnings
+DROP DATABASE IF EXISTS auto_test_local;
+CREATE DATABASE auto_test_local;
+USE auto_test_local;
+if ($USE_CHILD_GROUP2)
+{
+ --connection child2_1
+ if ($USE_GENERAL_LOG)
+ {
+ SET @old_log_output = @@global.log_output;
+ SET GLOBAL log_output = 'TABLE,FILE';
+ }
+ DROP DATABASE IF EXISTS auto_test_remote;
+ CREATE DATABASE auto_test_remote;
+ USE auto_test_remote;
+ --connection child2_2
+ if ($USE_GENERAL_LOG)
+ {
+ SET @old_log_output = @@global.log_output;
+ SET GLOBAL log_output = 'TABLE,FILE';
+ }
+ DROP DATABASE IF EXISTS auto_test_remote2;
+ CREATE DATABASE auto_test_remote2;
+ USE auto_test_remote2;
+ --connection child2_3
+ if ($USE_GENERAL_LOG)
+ {
+ SET @old_log_output = @@global.log_output;
+ SET GLOBAL log_output = 'TABLE,FILE';
+ }
+ DROP DATABASE IF EXISTS auto_test_remote3;
+ CREATE DATABASE auto_test_remote3;
+ USE auto_test_remote3;
+}
+--enable_warnings
+
+--echo
+--echo create table and insert
+if ($USE_CHILD_GROUP2)
+{
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ --disable_result_log
+ }
+ --connection child2_1
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ echo CHILD2_1_DROP_TABLES;
+ echo CHILD2_1_CREATE_TABLES;
+ }
+ --disable_warnings
+ eval $CHILD2_1_DROP_TABLES;
+ --enable_warnings
+ eval $CHILD2_1_CREATE_TABLES;
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ }
+ if ($USE_GENERAL_LOG)
+ {
+ TRUNCATE TABLE mysql.general_log;
+ }
+ --connection child2_2
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ echo CHILD2_2_DROP_TABLES;
+ echo CHILD2_2_CREATE_TABLES;
+ }
+ --disable_warnings
+ eval $CHILD2_2_DROP_TABLES;
+ --enable_warnings
+ eval $CHILD2_2_CREATE_TABLES;
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ }
+ if ($USE_GENERAL_LOG)
+ {
+ TRUNCATE TABLE mysql.general_log;
+ }
+ --connection child2_3
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ echo CHILD2_3_DROP_TABLES;
+ echo CHILD2_3_CREATE_TABLES;
+ }
+ --disable_warnings
+ eval $CHILD2_3_DROP_TABLES;
+ --enable_warnings
+ eval $CHILD2_3_CREATE_TABLES;
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ }
+ if ($USE_GENERAL_LOG)
+ {
+ TRUNCATE TABLE mysql.general_log;
+ }
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+--connection master_1
+--disable_warnings
+DROP TABLE IF EXISTS tbl_a;
+DROP TABLE IF EXISTS tbl_b;
+--enable_warnings
+--disable_query_log
+echo CREATE TABLE tbl_a (
+ value int NOT NULL
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_1;
+eval CREATE TABLE tbl_a (
+ value int NOT NULL
+) $MASTER_1_ENGINE $MASTER_1_CHARSET $MASTER_1_COMMENT_2_1;
+--enable_query_log
+INSERT INTO tbl_a (value) VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
+INSERT INTO tbl_a (value) VALUES (10),(11),(12),(13),(14),(15),(16),(17),(18),(19);
+INSERT INTO tbl_a (value) VALUES (20),(21),(22),(23),(24),(25),(26),(27),(28),(29);
+
+--echo
+--echo select test
+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 value FROM tbl_a WHERE value < 100;
+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_TABLES;
+ --connection child2_2
+ if ($USE_GENERAL_LOG)
+ {
+ eval $CHILD2_2_SELECT_ARGUMENT1;
+ }
+ eval $CHILD2_2_SELECT_TABLES;
+ --connection child2_3
+ if ($USE_GENERAL_LOG)
+ {
+ eval $CHILD2_3_SELECT_ARGUMENT1;
+ }
+ eval $CHILD2_3_SELECT_TABLES;
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+
+--echo
+--echo deinit
+--disable_warnings
+--connection master_1
+DROP DATABASE IF EXISTS auto_test_local;
+if ($USE_CHILD_GROUP2)
+{
+ --connection child2_1
+ DROP DATABASE IF EXISTS auto_test_remote;
+ if ($USE_GENERAL_LOG)
+ {
+ SET GLOBAL log_output = @old_log_output;
+ }
+ --connection child2_2
+ DROP DATABASE IF EXISTS auto_test_remote2;
+ if ($USE_GENERAL_LOG)
+ {
+ SET GLOBAL log_output = @old_log_output;
+ }
+ --connection child2_3
+ DROP DATABASE IF EXISTS auto_test_remote3;
+ if ($USE_GENERAL_LOG)
+ {
+ SET GLOBAL log_output = @old_log_output;
+ }
+}
+--enable_warnings
+--source ../include/partition_cond_push_deinit.inc
+--echo
+--echo end of test
diff --git a/storage/spider/mysql-test/spider/t/partition_fulltext.test b/storage/spider/mysql-test/spider/t/partition_fulltext.test
new file mode 100644
index 00000000000..cd9f9b05e9d
--- /dev/null
+++ b/storage/spider/mysql-test/spider/t/partition_fulltext.test
@@ -0,0 +1,223 @@
+--source ../include/partition_fulltext_init.inc
+if (!$HAVE_PARTITION)
+{
+ --source ../include/partition_fulltext_deinit.inc
+ skip Test requires partitioning;
+}
+
+--echo
+--echo drop and create databases
+--connection master_1
+--disable_warnings
+DROP DATABASE IF EXISTS auto_test_local;
+CREATE DATABASE auto_test_local;
+USE auto_test_local;
+if ($USE_CHILD_GROUP2)
+{
+ --connection child2_1
+ if ($USE_GENERAL_LOG)
+ {
+ SET @old_log_output = @@global.log_output;
+ SET GLOBAL log_output = 'TABLE,FILE';
+ }
+ DROP DATABASE IF EXISTS auto_test_remote;
+ CREATE DATABASE auto_test_remote;
+ USE auto_test_remote;
+ --connection child2_2
+ if ($USE_GENERAL_LOG)
+ {
+ SET @old_log_output = @@global.log_output;
+ SET GLOBAL log_output = 'TABLE,FILE';
+ }
+ DROP DATABASE IF EXISTS auto_test_remote2;
+ CREATE DATABASE auto_test_remote2;
+ USE auto_test_remote2;
+ --connection child2_3
+ if ($USE_GENERAL_LOG)
+ {
+ SET @old_log_output = @@global.log_output;
+ SET GLOBAL log_output = 'TABLE,FILE';
+ }
+ DROP DATABASE IF EXISTS auto_test_remote3;
+ CREATE DATABASE auto_test_remote3;
+ USE auto_test_remote3;
+}
+--enable_warnings
+
+--echo
+--echo create table and insert
+if ($USE_CHILD_GROUP2)
+{
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ --disable_result_log
+ }
+ --connection child2_1
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ echo CHILD2_1_DROP_TABLES;
+ echo CHILD2_1_CREATE_TABLES;
+ }
+ --disable_warnings
+ eval $CHILD2_1_DROP_TABLES;
+ --enable_warnings
+ eval $CHILD2_1_CREATE_TABLES;
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ }
+ if ($USE_GENERAL_LOG)
+ {
+ TRUNCATE TABLE mysql.general_log;
+ }
+ --connection child2_2
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ echo CHILD2_2_DROP_TABLES;
+ echo CHILD2_2_CREATE_TABLES;
+ }
+ --disable_warnings
+ eval $CHILD2_2_DROP_TABLES;
+ --enable_warnings
+ eval $CHILD2_2_CREATE_TABLES;
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ }
+ if ($USE_GENERAL_LOG)
+ {
+ TRUNCATE TABLE mysql.general_log;
+ }
+ --connection child2_3
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ echo CHILD2_3_DROP_TABLES;
+ echo CHILD2_3_CREATE_TABLES;
+ }
+ --disable_warnings
+ eval $CHILD2_3_DROP_TABLES;
+ --enable_warnings
+ eval $CHILD2_3_CREATE_TABLES;
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ }
+ if ($USE_GENERAL_LOG)
+ {
+ TRUNCATE TABLE mysql.general_log;
+ }
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+--connection master_1
+--disable_warnings
+DROP TABLE IF EXISTS tbl_a;
+DROP TABLE IF EXISTS tbl_b;
+--enable_warnings
+--disable_query_log
+echo CREATE TABLE tbl_a (
+ pkey int NOT NULL,
+ words text NOT NULL,
+ PRIMARY KEY (pkey),
+ FULLTEXT (words)
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_1;
+eval CREATE TABLE tbl_a (
+ pkey int NOT NULL,
+ words text NOT NULL,
+ PRIMARY KEY (pkey),
+ FULLTEXT (words)
+) $MASTER_1_ENGINE $MASTER_1_CHARSET $MASTER_1_COMMENT_2_1;
+--enable_query_log
+INSERT INTO tbl_a (pkey, words) VALUES (0, 'abc'),(1, 'def'),(2, 'ghi'),(3, 'jkl'),(4, 'mno'),(5, 'pqr'),(6, 'stu'),(7, 'vwx');
+
+--echo
+--echo select test
+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 pkey, words FROM tbl_a WHERE match(words) against('+ghi' in boolean mode);
+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_TABLES;
+ --connection child2_2
+ if ($USE_GENERAL_LOG)
+ {
+ eval $CHILD2_2_SELECT_ARGUMENT1;
+ }
+ eval $CHILD2_2_SELECT_TABLES;
+ --connection child2_3
+ if ($USE_GENERAL_LOG)
+ {
+ eval $CHILD2_3_SELECT_ARGUMENT1;
+ }
+ eval $CHILD2_3_SELECT_TABLES;
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+
+--echo
+--echo deinit
+--disable_warnings
+--connection master_1
+DROP DATABASE IF EXISTS auto_test_local;
+if ($USE_CHILD_GROUP2)
+{
+ --connection child2_1
+ DROP DATABASE IF EXISTS auto_test_remote;
+ if ($USE_GENERAL_LOG)
+ {
+ SET GLOBAL log_output = @old_log_output;
+ }
+ --connection child2_2
+ DROP DATABASE IF EXISTS auto_test_remote2;
+ if ($USE_GENERAL_LOG)
+ {
+ SET GLOBAL log_output = @old_log_output;
+ }
+ --connection child2_3
+ DROP DATABASE IF EXISTS auto_test_remote3;
+ if ($USE_GENERAL_LOG)
+ {
+ SET GLOBAL log_output = @old_log_output;
+ }
+}
+--enable_warnings
+--source ../include/partition_fulltext_deinit.inc
+--echo
+--echo end of test
diff --git a/storage/spider/mysql-test/spider/t/partition_join_pushdown_for_single_partition.test b/storage/spider/mysql-test/spider/t/partition_join_pushdown_for_single_partition.test
new file mode 100644
index 00000000000..f4e155be5e2
--- /dev/null
+++ b/storage/spider/mysql-test/spider/t/partition_join_pushdown_for_single_partition.test
@@ -0,0 +1,222 @@
+--source ../include/partition_join_pushdown_for_single_partition_init.inc
+if (!$HAVE_PARTITION)
+{
+ --source ../include/partition_join_pushdown_for_single_partition_deinit.inc
+ skip Test requires partitioning;
+}
+
+--echo
+--echo drop and create databases
+--connection master_1
+--disable_warnings
+DROP DATABASE IF EXISTS auto_test_local;
+CREATE DATABASE auto_test_local;
+USE auto_test_local;
+if ($USE_CHILD_GROUP2)
+{
+ --connection child2_1
+ if ($USE_GENERAL_LOG)
+ {
+ SET @old_log_output = @@global.log_output;
+ SET GLOBAL log_output = 'TABLE,FILE';
+ }
+ DROP DATABASE IF EXISTS auto_test_remote;
+ CREATE DATABASE auto_test_remote;
+ USE auto_test_remote;
+ --connection child2_2
+ if ($USE_GENERAL_LOG)
+ {
+ SET @old_log_output = @@global.log_output;
+ SET GLOBAL log_output = 'TABLE,FILE';
+ }
+ DROP DATABASE IF EXISTS auto_test_remote2;
+ CREATE DATABASE auto_test_remote2;
+ USE auto_test_remote2;
+ --connection child2_3
+ if ($USE_GENERAL_LOG)
+ {
+ SET @old_log_output = @@global.log_output;
+ SET GLOBAL log_output = 'TABLE,FILE';
+ }
+ DROP DATABASE IF EXISTS auto_test_remote3;
+ CREATE DATABASE auto_test_remote3;
+ USE auto_test_remote3;
+}
+--enable_warnings
+
+--echo
+--echo create table and insert
+if ($USE_CHILD_GROUP2)
+{
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ --disable_result_log
+ }
+ --connection child2_1
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ echo CHILD2_1_DROP_TABLES;
+ echo CHILD2_1_DROP_TABLES2;
+ echo CHILD2_1_CREATE_TABLES;
+ echo CHILD2_1_CREATE_TABLES2;
+ }
+ --disable_warnings
+ eval $CHILD2_1_DROP_TABLES;
+ eval $CHILD2_1_DROP_TABLES2;
+ --enable_warnings
+ eval $CHILD2_1_CREATE_TABLES;
+ eval $CHILD2_1_CREATE_TABLES2;
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ }
+ if ($USE_GENERAL_LOG)
+ {
+ TRUNCATE TABLE mysql.general_log;
+ }
+ --connection child2_2
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ echo CHILD2_2_DROP_TABLES;
+ echo CHILD2_2_DROP_TABLES2;
+ echo CHILD2_2_CREATE_TABLES;
+ echo CHILD2_2_CREATE_TABLES2;
+ }
+ --disable_warnings
+ eval $CHILD2_2_DROP_TABLES;
+ eval $CHILD2_2_DROP_TABLES2;
+ --enable_warnings
+ eval $CHILD2_2_CREATE_TABLES;
+ eval $CHILD2_2_CREATE_TABLES2;
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ }
+ if ($USE_GENERAL_LOG)
+ {
+ TRUNCATE TABLE mysql.general_log;
+ }
+ --connection child2_3
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ echo CHILD2_3_DROP_TABLES;
+ echo CHILD2_3_DROP_TABLES2;
+ echo CHILD2_3_CREATE_TABLES;
+ echo CHILD2_3_CREATE_TABLES2;
+ }
+ --disable_warnings
+ eval $CHILD2_3_DROP_TABLES;
+ eval $CHILD2_3_DROP_TABLES2;
+ --enable_warnings
+ eval $CHILD2_3_CREATE_TABLES;
+ eval $CHILD2_3_CREATE_TABLES2;
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ }
+ if ($USE_GENERAL_LOG)
+ {
+ TRUNCATE TABLE mysql.general_log;
+ }
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+--connection master_1
+--disable_warnings
+DROP TABLE IF EXISTS tbl_a;
+DROP TABLE IF EXISTS tbl_b;
+--enable_warnings
+--disable_query_log
+echo CREATE TABLE tbl_a (
+ value int NOT NULL,
+ PRIMARY KEY(value)
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_1;
+eval CREATE TABLE tbl_a (
+ value int NOT NULL,
+ PRIMARY KEY(value)
+) $MASTER_1_ENGINE $MASTER_1_CHARSET $MASTER_1_COMMENT_2_1;
+echo CREATE TABLE tbl_b (
+ value2 int NOT NULL,
+ PRIMARY KEY(value2)
+) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_2;
+eval CREATE TABLE tbl_b (
+ value2 int NOT NULL,
+ PRIMARY KEY(value2)
+) $MASTER_1_ENGINE $MASTER_1_CHARSET $MASTER_1_COMMENT_2_2;
+--enable_query_log
+
+insert into tbl_a values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
+insert into tbl_b values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
+
+--connection master_1
+SELECT sum(a.value), count(b.value2) FROM tbl_a a, tbl_b b WHERE a.value = b.value2 AND a.value = 5;
+SELECT sum(a.value), count(b.value2) FROM tbl_a a, tbl_b b WHERE a.value = 5 and b.value2 = 5;
+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_TABLES;
+ --connection child2_2
+ if ($USE_GENERAL_LOG)
+ {
+ eval $CHILD2_2_SELECT_ARGUMENT1;
+ }
+ eval $CHILD2_2_SELECT_TABLES;
+ --connection child2_3
+ if ($USE_GENERAL_LOG)
+ {
+ eval $CHILD2_3_SELECT_ARGUMENT1;
+ }
+ eval $CHILD2_3_SELECT_TABLES;
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+
+--echo
+--echo deinit
+--disable_warnings
+--connection master_1
+DROP DATABASE IF EXISTS auto_test_local;
+if ($USE_CHILD_GROUP2)
+{
+ --connection child2_1
+ DROP DATABASE IF EXISTS auto_test_remote;
+ if ($USE_GENERAL_LOG)
+ {
+ SET GLOBAL log_output = @old_log_output;
+ }
+ --connection child2_2
+ DROP DATABASE IF EXISTS auto_test_remote2;
+ if ($USE_GENERAL_LOG)
+ {
+ SET GLOBAL log_output = @old_log_output;
+ }
+ --connection child2_3
+ DROP DATABASE IF EXISTS auto_test_remote3;
+ if ($USE_GENERAL_LOG)
+ {
+ SET GLOBAL log_output = @old_log_output;
+ }
+}
+--enable_warnings
+--source ../include/partition_join_pushdown_for_single_partition_deinit.inc
+--echo
+--echo end of test
diff --git a/storage/spider/mysql-test/spider/t/partition_mrr.test b/storage/spider/mysql-test/spider/t/partition_mrr.test
new file mode 100644
index 00000000000..e7fedce33e6
--- /dev/null
+++ b/storage/spider/mysql-test/spider/t/partition_mrr.test
@@ -0,0 +1,235 @@
+--source ../include/partition_mrr_init.inc
+if (!$HAVE_PARTITION)
+{
+ --source ../include/partition_mrr_deinit.inc
+ skip Test requires partitioning;
+}
+
+--echo
+--echo drop and create databases
+--connection master_1
+--disable_warnings
+DROP DATABASE IF EXISTS auto_test_local;
+CREATE DATABASE auto_test_local;
+USE auto_test_local;
+if ($USE_CHILD_GROUP2)
+{
+ --connection child2_1
+ if ($USE_GENERAL_LOG)
+ {
+ SET @old_log_output = @@global.log_output;
+ SET GLOBAL log_output = 'TABLE,FILE';
+ }
+ DROP DATABASE IF EXISTS auto_test_remote;
+ CREATE DATABASE auto_test_remote;
+ USE auto_test_remote;
+ --connection child2_2
+ if ($USE_GENERAL_LOG)
+ {
+ SET @old_log_output = @@global.log_output;
+ SET GLOBAL log_output = 'TABLE,FILE';
+ }
+ DROP DATABASE IF EXISTS auto_test_remote2;
+ CREATE DATABASE auto_test_remote2;
+ USE auto_test_remote2;
+ --connection child2_3
+ if ($USE_GENERAL_LOG)
+ {
+ SET @old_log_output = @@global.log_output;
+ SET GLOBAL log_output = 'TABLE,FILE';
+ }
+ DROP DATABASE IF EXISTS auto_test_remote3;
+ CREATE DATABASE auto_test_remote3;
+ USE auto_test_remote3;
+}
+--enable_warnings
+
+--echo
+--echo create table and insert
+if ($USE_CHILD_GROUP2)
+{
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ --disable_result_log
+ }
+ --connection child2_1
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ echo CHILD2_1_DROP_TABLES;
+ echo CHILD2_1_CREATE_TABLES;
+ }
+ --disable_warnings
+ eval $CHILD2_1_DROP_TABLES;
+ --enable_warnings
+ eval $CHILD2_1_CREATE_TABLES;
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ }
+ if ($USE_GENERAL_LOG)
+ {
+ TRUNCATE TABLE mysql.general_log;
+ }
+ --connection child2_2
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ echo CHILD2_2_DROP_TABLES;
+ echo CHILD2_2_CREATE_TABLES;
+ }
+ --disable_warnings
+ eval $CHILD2_2_DROP_TABLES;
+ --enable_warnings
+ eval $CHILD2_2_CREATE_TABLES;
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ }
+ if ($USE_GENERAL_LOG)
+ {
+ TRUNCATE TABLE mysql.general_log;
+ }
+ --connection child2_3
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ echo CHILD2_3_DROP_TABLES;
+ echo CHILD2_3_CREATE_TABLES;
+ }
+ --disable_warnings
+ eval $CHILD2_3_DROP_TABLES;
+ --enable_warnings
+ eval $CHILD2_3_CREATE_TABLES;
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ }
+ if ($USE_GENERAL_LOG)
+ {
+ TRUNCATE TABLE mysql.general_log;
+ }
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+--connection master_1
+--disable_warnings
+DROP TABLE IF EXISTS tbl_a;
+DROP TABLE IF EXISTS tbl_b;
+--enable_warnings
+--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
+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 a.pkey FROM tbl_a a, tbl_b b WHERE a.pkey = b.pkey;
+if ($USE_CHILD_GROUP2)
+{
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ --disable_result_log
+ }
+ --connection child2_1
+ if ($USE_GENERAL_LOG)
+ {
+--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
+ if ($USE_GENERAL_LOG)
+ {
+--replace_regex /tmp_spider_bka_0x[0-9a-f]*/tmp_spider_bka_xxxx/
+ eval $CHILD2_2_SELECT_ARGUMENT1;
+ }
+ eval $CHILD2_2_SELECT_TABLES;
+ --connection child2_3
+ if ($USE_GENERAL_LOG)
+ {
+--replace_regex /tmp_spider_bka_0x[0-9a-f]*/tmp_spider_bka_xxxx/
+ eval $CHILD2_3_SELECT_ARGUMENT1;
+ }
+ eval $CHILD2_3_SELECT_TABLES;
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+
+--echo
+--echo deinit
+--disable_warnings
+--connection master_1
+DROP DATABASE IF EXISTS auto_test_local;
+if ($USE_CHILD_GROUP2)
+{
+ --connection child2_1
+ DROP DATABASE IF EXISTS auto_test_remote;
+ if ($USE_GENERAL_LOG)
+ {
+ SET GLOBAL log_output = @old_log_output;
+ }
+ --connection child2_2
+ DROP DATABASE IF EXISTS auto_test_remote2;
+ if ($USE_GENERAL_LOG)
+ {
+ SET GLOBAL log_output = @old_log_output;
+ }
+ --connection child2_3
+ DROP DATABASE IF EXISTS auto_test_remote3;
+ if ($USE_GENERAL_LOG)
+ {
+ SET GLOBAL log_output = @old_log_output;
+ }
+}
+--enable_warnings
+--source ../include/partition_mrr_deinit.inc
+--echo
+--echo end of test
diff --git a/storage/spider/mysql-test/spider/t/quick_mode_0.test b/storage/spider/mysql-test/spider/t/quick_mode_0.test
new file mode 100644
index 00000000000..6945d97a049
--- /dev/null
+++ b/storage/spider/mysql-test/spider/t/quick_mode_0.test
@@ -0,0 +1,294 @@
+--source ../include/quick_mode_0_init.inc
+--echo
+--echo drop and create databases
+--connection master_1
+--disable_warnings
+CREATE DATABASE auto_test_local;
+USE auto_test_local;
+if ($USE_CHILD_GROUP2)
+{
+ --connection child2_1
+ if ($USE_GENERAL_LOG)
+ {
+ 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
+ if ($USE_GENERAL_LOG)
+ {
+ 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
+if ($USE_CHILD_GROUP2)
+{
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ --disable_result_log
+ }
+ --connection child2_1
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ echo CHILD2_1_CREATE_TABLES;
+ }
+ eval $CHILD2_1_CREATE_TABLES;
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ }
+ if ($USE_GENERAL_LOG)
+ {
+ TRUNCATE TABLE mysql.general_log;
+ }
+ --connection child2_2
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ echo CHILD2_2_CREATE_TABLES;
+ }
+ eval $CHILD2_2_CREATE_TABLES;
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ }
+ if ($USE_GENERAL_LOG)
+ {
+ TRUNCATE TABLE mysql.general_log;
+ }
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_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
+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;
+ }
+ --connection child2_2
+ if ($USE_GENERAL_LOG)
+ {
+ TRUNCATE TABLE mysql.general_log;
+ }
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+--connection master_1
+SELECT a.pkey FROM tbl_a a, tbl_b b WHERE a.pkey = b.pkey;
+if ($USE_CHILD_GROUP2)
+{
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ --disable_result_log
+ }
+ --connection child2_1
+ if ($USE_GENERAL_LOG)
+ {
+ --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
+ if ($USE_GENERAL_LOG)
+ {
+ --replace_regex /tmp_spider_bka_0x[0-9a-f]*/tmp_spider_bka_xxxx/
+ eval $CHILD2_2_SELECT_ARGUMENT1;
+ }
+ eval $CHILD2_2_SELECT_TABLES;
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+
+--connection master_1
+eval $MASTER_1_SET_QUICK_PAGE_BYTE_6;
+
+--echo
+--echo select test 2
+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;
+ }
+ --connection child2_2
+ if ($USE_GENERAL_LOG)
+ {
+ TRUNCATE TABLE mysql.general_log;
+ }
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+--connection master_1
+SELECT a.pkey FROM tbl_a a, tbl_b b WHERE a.pkey = b.pkey;
+if ($USE_CHILD_GROUP2)
+{
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ --disable_result_log
+ }
+ --connection child2_1
+ if ($USE_GENERAL_LOG)
+ {
+ --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
+ if ($USE_GENERAL_LOG)
+ {
+ --replace_regex /tmp_spider_bka_0x[0-9a-f]*/tmp_spider_bka_xxxx/
+ eval $CHILD2_2_SELECT_ARGUMENT1;
+ }
+ eval $CHILD2_2_SELECT_TABLES;
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+
+--connection master_1
+eval $MASTER_1_SET_QUICK_PAGE_BYTE_0;
+
+--echo
+--echo select test 3
+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;
+ }
+ --connection child2_2
+ if ($USE_GENERAL_LOG)
+ {
+ TRUNCATE TABLE mysql.general_log;
+ }
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+--connection master_1
+SELECT a.pkey FROM tbl_a a, tbl_b b WHERE a.pkey = b.pkey;
+if ($USE_CHILD_GROUP2)
+{
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ --disable_result_log
+ }
+ --connection child2_1
+ if ($USE_GENERAL_LOG)
+ {
+ --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
+ if ($USE_GENERAL_LOG)
+ {
+ --replace_regex /tmp_spider_bka_0x[0-9a-f]*/tmp_spider_bka_xxxx/
+ eval $CHILD2_2_SELECT_ARGUMENT1;
+ }
+ eval $CHILD2_2_SELECT_TABLES;
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+
+--echo
+--echo deinit
+--disable_warnings
+--connection master_1
+DROP DATABASE IF EXISTS auto_test_local;
+if ($USE_CHILD_GROUP2)
+{
+ --connection child2_1
+ DROP DATABASE IF EXISTS auto_test_remote;
+ if ($USE_GENERAL_LOG)
+ {
+ SET GLOBAL log_output = @old_log_output;
+ }
+ --connection child2_2
+ DROP DATABASE IF EXISTS auto_test_remote2;
+ if ($USE_GENERAL_LOG)
+ {
+ SET GLOBAL log_output = @old_log_output;
+ }
+}
+--enable_warnings
+--source ../include/quick_mode_0_deinit.inc
+--echo
+--echo end of test
diff --git a/storage/spider/mysql-test/spider/t/quick_mode_1.test b/storage/spider/mysql-test/spider/t/quick_mode_1.test
new file mode 100644
index 00000000000..d382d5dbe95
--- /dev/null
+++ b/storage/spider/mysql-test/spider/t/quick_mode_1.test
@@ -0,0 +1,294 @@
+--source ../include/quick_mode_1_init.inc
+--echo
+--echo drop and create databases
+--connection master_1
+--disable_warnings
+CREATE DATABASE auto_test_local;
+USE auto_test_local;
+if ($USE_CHILD_GROUP2)
+{
+ --connection child2_1
+ if ($USE_GENERAL_LOG)
+ {
+ 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
+ if ($USE_GENERAL_LOG)
+ {
+ 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
+if ($USE_CHILD_GROUP2)
+{
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ --disable_result_log
+ }
+ --connection child2_1
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ echo CHILD2_1_CREATE_TABLES;
+ }
+ eval $CHILD2_1_CREATE_TABLES;
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ }
+ if ($USE_GENERAL_LOG)
+ {
+ TRUNCATE TABLE mysql.general_log;
+ }
+ --connection child2_2
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ echo CHILD2_2_CREATE_TABLES;
+ }
+ eval $CHILD2_2_CREATE_TABLES;
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ }
+ if ($USE_GENERAL_LOG)
+ {
+ TRUNCATE TABLE mysql.general_log;
+ }
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_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
+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;
+ }
+ --connection child2_2
+ if ($USE_GENERAL_LOG)
+ {
+ TRUNCATE TABLE mysql.general_log;
+ }
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+--connection master_1
+SELECT a.pkey FROM tbl_a a, tbl_b b WHERE a.pkey = b.pkey;
+if ($USE_CHILD_GROUP2)
+{
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ --disable_result_log
+ }
+ --connection child2_1
+ if ($USE_GENERAL_LOG)
+ {
+ --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
+ if ($USE_GENERAL_LOG)
+ {
+ --replace_regex /tmp_spider_bka_0x[0-9a-f]*/tmp_spider_bka_xxxx/
+ eval $CHILD2_2_SELECT_ARGUMENT1;
+ }
+ eval $CHILD2_2_SELECT_TABLES;
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+
+--connection master_1
+eval $MASTER_1_SET_QUICK_PAGE_BYTE_6;
+
+--echo
+--echo select test 2
+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;
+ }
+ --connection child2_2
+ if ($USE_GENERAL_LOG)
+ {
+ TRUNCATE TABLE mysql.general_log;
+ }
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+--connection master_1
+SELECT a.pkey FROM tbl_a a, tbl_b b WHERE a.pkey = b.pkey;
+if ($USE_CHILD_GROUP2)
+{
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ --disable_result_log
+ }
+ --connection child2_1
+ if ($USE_GENERAL_LOG)
+ {
+ --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
+ if ($USE_GENERAL_LOG)
+ {
+ --replace_regex /tmp_spider_bka_0x[0-9a-f]*/tmp_spider_bka_xxxx/
+ eval $CHILD2_2_SELECT_ARGUMENT1;
+ }
+ eval $CHILD2_2_SELECT_TABLES;
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+
+--connection master_1
+eval $MASTER_1_SET_QUICK_PAGE_BYTE_0;
+
+--echo
+--echo select test 3
+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;
+ }
+ --connection child2_2
+ if ($USE_GENERAL_LOG)
+ {
+ TRUNCATE TABLE mysql.general_log;
+ }
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+--connection master_1
+SELECT a.pkey FROM tbl_a a, tbl_b b WHERE a.pkey = b.pkey;
+if ($USE_CHILD_GROUP2)
+{
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ --disable_result_log
+ }
+ --connection child2_1
+ if ($USE_GENERAL_LOG)
+ {
+ --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
+ if ($USE_GENERAL_LOG)
+ {
+ --replace_regex /tmp_spider_bka_0x[0-9a-f]*/tmp_spider_bka_xxxx/
+ eval $CHILD2_2_SELECT_ARGUMENT1;
+ }
+ eval $CHILD2_2_SELECT_TABLES;
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+
+--echo
+--echo deinit
+--disable_warnings
+--connection master_1
+DROP DATABASE IF EXISTS auto_test_local;
+if ($USE_CHILD_GROUP2)
+{
+ --connection child2_1
+ DROP DATABASE IF EXISTS auto_test_remote;
+ if ($USE_GENERAL_LOG)
+ {
+ SET GLOBAL log_output = @old_log_output;
+ }
+ --connection child2_2
+ DROP DATABASE IF EXISTS auto_test_remote2;
+ if ($USE_GENERAL_LOG)
+ {
+ SET GLOBAL log_output = @old_log_output;
+ }
+}
+--enable_warnings
+--source ../include/quick_mode_1_deinit.inc
+--echo
+--echo end of test
diff --git a/storage/spider/mysql-test/spider/t/quick_mode_2.test b/storage/spider/mysql-test/spider/t/quick_mode_2.test
new file mode 100644
index 00000000000..ebb889868a6
--- /dev/null
+++ b/storage/spider/mysql-test/spider/t/quick_mode_2.test
@@ -0,0 +1,294 @@
+--source ../include/quick_mode_2_init.inc
+--echo
+--echo drop and create databases
+--connection master_1
+--disable_warnings
+CREATE DATABASE auto_test_local;
+USE auto_test_local;
+if ($USE_CHILD_GROUP2)
+{
+ --connection child2_1
+ if ($USE_GENERAL_LOG)
+ {
+ 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
+ if ($USE_GENERAL_LOG)
+ {
+ 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
+if ($USE_CHILD_GROUP2)
+{
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ --disable_result_log
+ }
+ --connection child2_1
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ echo CHILD2_1_CREATE_TABLES;
+ }
+ eval $CHILD2_1_CREATE_TABLES;
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ }
+ if ($USE_GENERAL_LOG)
+ {
+ TRUNCATE TABLE mysql.general_log;
+ }
+ --connection child2_2
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ echo CHILD2_2_CREATE_TABLES;
+ }
+ eval $CHILD2_2_CREATE_TABLES;
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ }
+ if ($USE_GENERAL_LOG)
+ {
+ TRUNCATE TABLE mysql.general_log;
+ }
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_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
+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;
+ }
+ --connection child2_2
+ if ($USE_GENERAL_LOG)
+ {
+ TRUNCATE TABLE mysql.general_log;
+ }
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+--connection master_1
+SELECT a.pkey FROM tbl_a a, tbl_b b WHERE a.pkey = b.pkey;
+if ($USE_CHILD_GROUP2)
+{
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ --disable_result_log
+ }
+ --connection child2_1
+ if ($USE_GENERAL_LOG)
+ {
+ --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
+ if ($USE_GENERAL_LOG)
+ {
+ --replace_regex /tmp_spider_bka_0x[0-9a-f]*/tmp_spider_bka_xxxx/
+ eval $CHILD2_2_SELECT_ARGUMENT1;
+ }
+ eval $CHILD2_2_SELECT_TABLES;
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+
+--connection master_1
+eval $MASTER_1_SET_QUICK_PAGE_BYTE_6;
+
+--echo
+--echo select test 2
+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;
+ }
+ --connection child2_2
+ if ($USE_GENERAL_LOG)
+ {
+ TRUNCATE TABLE mysql.general_log;
+ }
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+--connection master_1
+SELECT a.pkey FROM tbl_a a, tbl_b b WHERE a.pkey = b.pkey;
+if ($USE_CHILD_GROUP2)
+{
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ --disable_result_log
+ }
+ --connection child2_1
+ if ($USE_GENERAL_LOG)
+ {
+ --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
+ if ($USE_GENERAL_LOG)
+ {
+ --replace_regex /tmp_spider_bka_0x[0-9a-f]*/tmp_spider_bka_xxxx/
+ eval $CHILD2_2_SELECT_ARGUMENT1;
+ }
+ eval $CHILD2_2_SELECT_TABLES;
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+
+--connection master_1
+eval $MASTER_1_SET_QUICK_PAGE_BYTE_0;
+
+--echo
+--echo select test 3
+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;
+ }
+ --connection child2_2
+ if ($USE_GENERAL_LOG)
+ {
+ TRUNCATE TABLE mysql.general_log;
+ }
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+--connection master_1
+SELECT a.pkey FROM tbl_a a, tbl_b b WHERE a.pkey = b.pkey;
+if ($USE_CHILD_GROUP2)
+{
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ --disable_result_log
+ }
+ --connection child2_1
+ if ($USE_GENERAL_LOG)
+ {
+ --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
+ if ($USE_GENERAL_LOG)
+ {
+ --replace_regex /tmp_spider_bka_0x[0-9a-f]*/tmp_spider_bka_xxxx/
+ eval $CHILD2_2_SELECT_ARGUMENT1;
+ }
+ eval $CHILD2_2_SELECT_TABLES;
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+
+--echo
+--echo deinit
+--disable_warnings
+--connection master_1
+DROP DATABASE IF EXISTS auto_test_local;
+if ($USE_CHILD_GROUP2)
+{
+ --connection child2_1
+ DROP DATABASE IF EXISTS auto_test_remote;
+ if ($USE_GENERAL_LOG)
+ {
+ SET GLOBAL log_output = @old_log_output;
+ }
+ --connection child2_2
+ DROP DATABASE IF EXISTS auto_test_remote2;
+ if ($USE_GENERAL_LOG)
+ {
+ SET GLOBAL log_output = @old_log_output;
+ }
+}
+--enable_warnings
+--source ../include/quick_mode_2_deinit.inc
+--echo
+--echo end of test
diff --git a/storage/spider/mysql-test/spider/t/quick_mode_3.test b/storage/spider/mysql-test/spider/t/quick_mode_3.test
new file mode 100644
index 00000000000..5992284f301
--- /dev/null
+++ b/storage/spider/mysql-test/spider/t/quick_mode_3.test
@@ -0,0 +1,294 @@
+--source ../include/quick_mode_3_init.inc
+--echo
+--echo drop and create databases
+--connection master_1
+--disable_warnings
+CREATE DATABASE auto_test_local;
+USE auto_test_local;
+if ($USE_CHILD_GROUP2)
+{
+ --connection child2_1
+ if ($USE_GENERAL_LOG)
+ {
+ 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
+ if ($USE_GENERAL_LOG)
+ {
+ 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
+if ($USE_CHILD_GROUP2)
+{
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ --disable_result_log
+ }
+ --connection child2_1
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ echo CHILD2_1_CREATE_TABLES;
+ }
+ eval $CHILD2_1_CREATE_TABLES;
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ }
+ if ($USE_GENERAL_LOG)
+ {
+ TRUNCATE TABLE mysql.general_log;
+ }
+ --connection child2_2
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ echo CHILD2_2_CREATE_TABLES;
+ }
+ eval $CHILD2_2_CREATE_TABLES;
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ }
+ if ($USE_GENERAL_LOG)
+ {
+ TRUNCATE TABLE mysql.general_log;
+ }
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_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
+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;
+ }
+ --connection child2_2
+ if ($USE_GENERAL_LOG)
+ {
+ TRUNCATE TABLE mysql.general_log;
+ }
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+--connection master_1
+SELECT a.pkey FROM tbl_a a, tbl_b b WHERE a.pkey = b.pkey;
+if ($USE_CHILD_GROUP2)
+{
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ --disable_result_log
+ }
+ --connection child2_1
+ if ($USE_GENERAL_LOG)
+ {
+ --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
+ if ($USE_GENERAL_LOG)
+ {
+ --replace_regex /tmp_spider_bka_0x[0-9a-f]*/tmp_spider_bka_xxxx/
+ eval $CHILD2_2_SELECT_ARGUMENT1;
+ }
+ eval $CHILD2_2_SELECT_TABLES;
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+
+--connection master_1
+eval $MASTER_1_SET_QUICK_PAGE_BYTE_6;
+
+--echo
+--echo select test 2
+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;
+ }
+ --connection child2_2
+ if ($USE_GENERAL_LOG)
+ {
+ TRUNCATE TABLE mysql.general_log;
+ }
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+--connection master_1
+SELECT a.pkey FROM tbl_a a, tbl_b b WHERE a.pkey = b.pkey;
+if ($USE_CHILD_GROUP2)
+{
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ --disable_result_log
+ }
+ --connection child2_1
+ if ($USE_GENERAL_LOG)
+ {
+ --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
+ if ($USE_GENERAL_LOG)
+ {
+ --replace_regex /tmp_spider_bka_0x[0-9a-f]*/tmp_spider_bka_xxxx/
+ eval $CHILD2_2_SELECT_ARGUMENT1;
+ }
+ eval $CHILD2_2_SELECT_TABLES;
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+
+--connection master_1
+eval $MASTER_1_SET_QUICK_PAGE_BYTE_0;
+
+--echo
+--echo select test 3
+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;
+ }
+ --connection child2_2
+ if ($USE_GENERAL_LOG)
+ {
+ TRUNCATE TABLE mysql.general_log;
+ }
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+--connection master_1
+SELECT a.pkey FROM tbl_a a, tbl_b b WHERE a.pkey = b.pkey;
+if ($USE_CHILD_GROUP2)
+{
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ --disable_result_log
+ }
+ --connection child2_1
+ if ($USE_GENERAL_LOG)
+ {
+ --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
+ if ($USE_GENERAL_LOG)
+ {
+ --replace_regex /tmp_spider_bka_0x[0-9a-f]*/tmp_spider_bka_xxxx/
+ eval $CHILD2_2_SELECT_ARGUMENT1;
+ }
+ eval $CHILD2_2_SELECT_TABLES;
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+
+--echo
+--echo deinit
+--disable_warnings
+--connection master_1
+DROP DATABASE IF EXISTS auto_test_local;
+if ($USE_CHILD_GROUP2)
+{
+ --connection child2_1
+ DROP DATABASE IF EXISTS auto_test_remote;
+ if ($USE_GENERAL_LOG)
+ {
+ SET GLOBAL log_output = @old_log_output;
+ }
+ --connection child2_2
+ DROP DATABASE IF EXISTS auto_test_remote2;
+ if ($USE_GENERAL_LOG)
+ {
+ SET GLOBAL log_output = @old_log_output;
+ }
+}
+--enable_warnings
+--source ../include/quick_mode_3_deinit.inc
+--echo
+--echo end of test
diff --git a/storage/spider/mysql-test/spider/t/show_system_tables.test b/storage/spider/mysql-test/spider/t/show_system_tables.test
new file mode 100644
index 00000000000..ae8259b01bc
--- /dev/null
+++ b/storage/spider/mysql-test/spider/t/show_system_tables.test
@@ -0,0 +1,26 @@
+--disable_warnings
+--disable_query_log
+--disable_result_log
+--source test_init.inc
+--enable_result_log
+--enable_query_log
+--enable_warnings
+
+--echo
+--echo Show system tables on the Spider node
+--connection master_1
+--sorted_result
+SELECT table_name, engine FROM information_schema.tables
+ WHERE table_schema = 'mysql' AND table_name like '%spider_%';
+
+--echo
+--echo deinit
+--disable_warnings
+--disable_query_log
+--disable_result_log
+--source test_deinit.inc
+--enable_result_log
+--enable_query_log
+--enable_warnings
+--echo
+--echo end of test
diff --git a/storage/spider/mysql-test/spider/t/slave_trx_isolation.test b/storage/spider/mysql-test/spider/t/slave_trx_isolation.test
new file mode 100644
index 00000000000..507e5340779
--- /dev/null
+++ b/storage/spider/mysql-test/spider/t/slave_trx_isolation.test
@@ -0,0 +1,148 @@
+--source ../include/slave_trx_isolation_init.inc
+--echo
+--echo drop and create databases
+--connection master_1
+--disable_warnings
+CREATE DATABASE auto_test_local;
+USE auto_test_local;
+if ($USE_REPLICATION)
+{
+ --connection slave1_1
+ CREATE DATABASE auto_test_local;
+ USE auto_test_local;
+}
+if ($USE_CHILD_GROUP2)
+{
+ --connection child2_1
+ if ($USE_GENERAL_LOG)
+ {
+ SET @old_log_output = @@global.log_output;
+ SET GLOBAL log_output = 'TABLE,FILE';
+ }
+ CREATE DATABASE auto_test_remote;
+ USE auto_test_remote;
+}
+--enable_warnings
+
+--echo
+--echo create table and insert
+if ($USE_CHILD_GROUP2)
+{
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ --disable_result_log
+ }
+ --connection child2_1
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ echo CHILD2_1_CREATE_TABLES;
+ }
+ eval $CHILD2_1_CREATE_TABLES;
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ }
+ if ($USE_GENERAL_LOG)
+ {
+ TRUNCATE TABLE mysql.general_log;
+ }
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+--connection master_1
+if ($USE_REPLICATION)
+{
+ save_master_pos;
+ --connection slave1_1
+ sync_with_master;
+ --connection master_1
+ SET SESSION sql_log_bin= 0;
+}
+--disable_query_log
+echo CREATE TABLE tbl_a (
+ pkey int NOT NULL,
+ PRIMARY KEY (pkey)
+) MASTER_1_ENGINE2 MASTER_1_CHARSET MASTER_1_COMMENT_2_1;
+eval CREATE TABLE tbl_a (
+ pkey int NOT NULL,
+ PRIMARY KEY (pkey)
+) $MASTER_1_ENGINE2 $MASTER_1_CHARSET $MASTER_1_COMMENT_2_1;
+--enable_query_log
+if ($USE_REPLICATION)
+{
+ SET SESSION sql_log_bin= 1;
+ --connection slave1_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;
+ eval CREATE TABLE tbl_a (
+ pkey int NOT NULL,
+ PRIMARY KEY (pkey)
+ ) $MASTER_1_ENGINE $MASTER_1_CHARSET $MASTER_1_COMMENT_2_1;
+ --enable_query_log
+ --connection master_1
+}
+INSERT INTO tbl_a (pkey) VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
+if ($USE_REPLICATION)
+{
+ save_master_pos;
+ --connection slave1_1
+ sync_with_master;
+ --connection master_1
+ SET SESSION sql_log_bin= 0;
+}
+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_TABLES;
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+if ($USE_REPLICATION)
+{
+ --connection slave1_1
+ SELECT pkey FROM tbl_a ORDER BY pkey;
+}
+
+--echo
+--echo deinit
+--disable_warnings
+--connection master_1
+DROP DATABASE IF EXISTS auto_test_local;
+if ($USE_REPLICATION)
+{
+ --connection slave1_1
+ DROP DATABASE IF EXISTS auto_test_local;
+}
+if ($USE_CHILD_GROUP2)
+{
+ --connection child2_1
+ DROP DATABASE IF EXISTS auto_test_remote;
+ if ($USE_GENERAL_LOG)
+ {
+ SET GLOBAL log_output = @old_log_output;
+ }
+}
+--enable_warnings
+--source ../include/slave_trx_isolation_deinit.inc
+--echo
+--echo end of test
diff --git a/storage/spider/mysql-test/spider/t/spider_fixes_part.test b/storage/spider/mysql-test/spider/t/spider_fixes_part.test
index 868e684f959..b0b9ce86588 100644
--- a/storage/spider/mysql-test/spider/t/spider_fixes_part.test
+++ b/storage/spider/mysql-test/spider/t/spider_fixes_part.test
@@ -727,6 +727,116 @@ if ($HAVE_PARTITION)
}
--echo
+--echo Crash from b4a2baffa82e5c07b96a1c752228560dcac1359b (MDEV-11084)
+--echo Fixed with 4968049799193394d442f26b4e3a8d95b185be72
+--echo Spider crashed if the first partition was not used first
+if ($HAVE_PARTITION)
+{
+ if ($USE_CHILD_GROUP2)
+ {
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ --disable_result_log
+ }
+ --connection child2_2
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ echo CHILD2_2_DROP_TABLES;
+ echo CHILD2_2_CREATE_TABLES;
+ }
+ --disable_warnings
+ eval $CHILD2_2_DROP_TABLES;
+ --enable_warnings
+ eval $CHILD2_2_CREATE_TABLES;
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ }
+ if ($USE_GENERAL_LOG)
+ {
+ TRUNCATE TABLE mysql.general_log;
+ }
+ --connection child2_1
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ echo CHILD2_1_DROP_TABLES2;
+ echo CHILD2_1_CREATE_TABLES2;
+ }
+ --disable_warnings
+ eval $CHILD2_1_DROP_TABLES2;
+ --enable_warnings
+ eval $CHILD2_1_CREATE_TABLES2;
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ }
+ if ($USE_GENERAL_LOG)
+ {
+ TRUNCATE TABLE mysql.general_log;
+ }
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+ }
+ --connection master_1
+ --disable_query_log
+ --disable_warnings
+ DROP TABLE IF EXISTS ta_l2;
+ --enable_warnings
+ echo CREATE TABLE ta_l2 (
+ a INT,
+ b CHAR(1),
+ c DATETIME,
+ PRIMARY KEY(a)
+ ) MASTER_1_ENGINE MASTER_1_COMMENT2_P_2_1;
+ eval CREATE TABLE ta_l2 (
+ a INT,
+ b CHAR(1),
+ c DATETIME,
+ PRIMARY KEY(a)
+ ) $MASTER_1_ENGINE $MASTER_1_COMMENT2_P_2_1;
+ --enable_query_log
+ INSERT INTO ta_l2 SELECT a, b, c FROM tb_l;
+ --echo Query a Spider table only using the second partition
+ SELECT a,b,c FROM ta_l2 PARTITION (pt2);
+ --echo Query a Spider table only using the first partition
+ SELECT a,b,c FROM ta_l2 PARTITION (pt1);
+ --echo Query a Spider table by all paritions, then the second partition
+ SELECT min(a), max(a), min(b), max(b) FROM ta_l2;
+ SELECT a,b,c FROM ta_l2 PARTITION (pt2);
+ if ($USE_CHILD_GROUP2)
+ {
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ --disable_result_log
+ }
+ --connection child2_2
+ if ($USE_GENERAL_LOG)
+ {
+ SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+ }
+ eval $CHILD2_2_SELECT_TABLES;
+ --connection child2_1
+ if ($USE_GENERAL_LOG)
+ {
+ SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %';
+ }
+ eval $CHILD2_1_SELECT_TABLES2;
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+ }
+}
+
+--echo
--echo deinit
--disable_warnings
--connection master_1
diff --git a/storage/spider/mysql-test/spider/t/timestamp.test b/storage/spider/mysql-test/spider/t/timestamp.test
new file mode 100644
index 00000000000..225851a9d13
--- /dev/null
+++ b/storage/spider/mysql-test/spider/t/timestamp.test
@@ -0,0 +1,528 @@
+--source timestamp_init.inc
+
+--echo
+--echo Initialize Time Zone
+--connection master_1
+SET GLOBAL time_zone='MET';
+SET time_zone='MET';
+if ($USE_CHILD_GROUP2)
+{
+ --connection child2_1
+ SET GLOBAL time_zone='MET';
+ SET time_zone='MET';
+}
+
+--echo
+--echo drop and create databases
+--connection master_1
+--disable_warnings
+DROP DATABASE IF EXISTS ts_test_local;
+CREATE DATABASE ts_test_local;
+USE ts_test_local;
+if ($USE_CHILD_GROUP2)
+{
+ --connection child2_1
+ if ($USE_GENERAL_LOG)
+ {
+ SET @old_log_output = @@global.log_output;
+ SET GLOBAL log_output = 'TABLE,FILE';
+ }
+ DROP DATABASE IF EXISTS ts_test_remote;
+ CREATE DATABASE ts_test_remote;
+ USE ts_test_remote;
+}
+--enable_warnings
+
+--echo
+--echo test select 1
+--connection master_1
+SELECT 1;
+if ($USE_CHILD_GROUP2)
+{
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ --disable_result_log
+ }
+ --connection child2_1
+ SELECT 1;
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+
+--echo
+--echo create table
+if ($USE_CHILD_GROUP2)
+{
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ --disable_result_log
+ }
+ --connection child2_1
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ 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_TABLE;
+ eval $CHILD2_1_DROP_TABLE_F;
+ --enable_warnings
+ eval $CHILD2_1_CREATE_TABLE;
+ eval $CHILD2_1_CREATE_TABLE_F;
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ }
+ if ($USE_GENERAL_LOG)
+ {
+ TRUNCATE TABLE mysql.general_log;
+ }
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+--connection master_1
+--disable_warnings
+DROP TABLE IF EXISTS tbl_a;
+--enable_warnings
+--disable_query_log
+echo CREATE TABLE tbl_a (
+ col_a INT UNSIGNED NOT NULL AUTO_INCREMENT,
+ 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;
+eval CREATE TABLE tbl_a (
+ col_a INT UNSIGNED NOT NULL AUTO_INCREMENT,
+ 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;
+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
+SET time_zone='+01:00';
+
+--echo
+--echo Insert Rows
+--connection master_1
+--echo Min value
+SET @@timestamp=1;
+INSERT INTO tbl_a VALUES (1, now(), now());
+SET @@timestamp=0;
+--echo Ambiguous DST values for MET time zone that result in the
+--echo same UTC timestamp
+INSERT INTO tbl_a VALUES (2, '2018-03-25 02:00:00', '2018-03-25 02:00:00');
+INSERT INTO tbl_a VALUES (3, '2018-03-25 02:30:00', '2018-03-25 02:30:00');
+--echo Ambiguous DST values for MET time zone in the 2:00 am to 3:00 am hour
+--echo that occur twice when transitioning from DST to standard time
+SET @@timestamp=1540686600;
+INSERT INTO tbl_a VALUES (4, now(), now());
+SET @@timestamp=1540690200;
+INSERT INTO tbl_a VALUES (5, now(), now());
+--echo Max value
+SET @@timestamp=2147483647;
+INSERT INTO tbl_a VALUES (6, now(), now());
+SET @@timestamp=0;
+
+--echo
+--echo SELECTs
+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 *, unix_timestamp(col_ts) FROM tbl_a;
+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;
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+
+--echo
+--echo DELETEs
+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
+DELETE FROM tbl_a WHERE col_ts='1970-01-01 01:00:01';
+SELECT *, unix_timestamp(col_ts) FROM tbl_a;
+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;
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+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
+SET @@timestamp=1;
+INSERT INTO tbl_a VALUES (1, now(), now());
+SET @@timestamp=0;
+SELECT *, unix_timestamp(col_ts) FROM tbl_a;
+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;
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+
+--echo
+--echo UPDATEs
+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
+UPDATE tbl_a SET col_ts=col_dt;
+SELECT *, unix_timestamp(col_ts) FROM tbl_a;
+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;
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+
+--echo
+--echo Lookups
+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 *, unix_timestamp(col_ts) FROM tbl_a WHERE col_ts > '2018-01-01';
+SELECT *, unix_timestamp(col_ts) FROM tbl_a WHERE col_ts < '2018-10-28 02:30:00';
+SELECT *, unix_timestamp(col_ts) FROM tbl_a WHERE '2018-10-28 02:30:00' > col_ts;
+SELECT *, unix_timestamp(col_ts) FROM tbl_a WHERE col_ts BETWEEN '2018-10-28 01:30:00' AND '2018-10-28 02:30:00';
+SELECT *, unix_timestamp(col_ts) FROM tbl_a WHERE col_ts >= '2018-10-28 01:30:00' AND col_ts <= '2018-10-28 02:30:00';
+SELECT *, unix_timestamp(col_ts) FROM tbl_a WHERE col_ts > 180325020000;
+SELECT *, unix_timestamp(col_ts) FROM tbl_a WHERE col_ts > 19700101010001;
+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;
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+
+--echo
+--echo Drop the index on the timestamp column
+if ($USE_CHILD_GROUP2)
+{
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --disable_query_log
+ --disable_result_log
+ }
+ --connection child2_1
+ eval $CHILD2_1_DROP_INDEX;
+ eval $CHILD2_1_SHOW_CREATE_TABLE;
+ if ($OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ }
+ if ($USE_GENERAL_LOG)
+ {
+ TRUNCATE TABLE mysql.general_log;
+ }
+ if (!$OUTPUT_CHILD_GROUP2)
+ {
+ --enable_query_log
+ --enable_result_log
+ }
+}
+--connection master_1
+DROP INDEX i_ts ON tbl_a;
+SHOW CREATE TABLE tbl_a;
+
+--echo
+--echo Retry lookups on unindexed timestamp column
+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 *, unix_timestamp(col_ts) FROM tbl_a WHERE col_ts > '2018-01-01';
+SELECT *, unix_timestamp(col_ts) FROM tbl_a WHERE col_ts < '2018-10-28 02:30:00';
+SELECT *, unix_timestamp(col_ts) FROM tbl_a WHERE '2018-10-28 02:30:00' > col_ts;
+SELECT *, unix_timestamp(col_ts) FROM tbl_a WHERE col_ts BETWEEN '2018-10-28 01:30:00' AND '2018-10-28 02:30:00';
+SELECT *, unix_timestamp(col_ts) FROM tbl_a WHERE col_ts >= '2018-10-28 01:30:00' AND col_ts <= '2018-10-28 02:30:00';
+SELECT *, unix_timestamp(col_ts) FROM tbl_a WHERE col_ts > 180325020000;
+SELECT *, unix_timestamp(col_ts) FROM tbl_a WHERE col_ts > 19700101010001;
+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;
+ 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
+ --enable_result_log
+ }
+}
+
+--echo
+--echo Restore Time Zone settings
+--connection master_1
+SET GLOBAL time_zone=DEFAULT;
+SET time_zone=DEFAULT;
+if ($USE_CHILD_GROUP2)
+{
+ --connection child2_1
+ SET GLOBAL time_zone=DEFAULT;
+ SET time_zone=DEFAULT;
+}
+
+--echo
+--echo deinit
+--disable_warnings
+--connection master_1
+DROP DATABASE IF EXISTS ts_test_local;
+if ($USE_CHILD_GROUP2)
+{
+ --connection child2_1
+ DROP DATABASE IF EXISTS ts_test_remote;
+ if ($USE_GENERAL_LOG)
+ {
+ SET GLOBAL log_output = @old_log_output;
+ }
+}
+--enable_warnings
+--source timestamp_deinit.inc
+--echo
+--echo end of test
diff --git a/storage/spider/mysql-test/spider/t/timestamp_deinit.inc b/storage/spider/mysql-test/spider/t/timestamp_deinit.inc
new file mode 100644
index 00000000000..52be67a1d09
--- /dev/null
+++ b/storage/spider/mysql-test/spider/t/timestamp_deinit.inc
@@ -0,0 +1,13 @@
+--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
+--let $USE_GENERAL_LOG= $USE_GENERAL_LOG_BACKUP
+--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/t/timestamp_init.inc b/storage/spider/mysql-test/spider/t/timestamp_init.inc
new file mode 100644
index 00000000000..811c34c9b9a
--- /dev/null
+++ b/storage/spider/mysql-test/spider/t/timestamp_init.inc
@@ -0,0 +1,62 @@
+--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_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=
+ AUTO_INCREMENT=17 DEFAULT CHARSET=utf8mb4;
+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_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_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,
+ col_ts TIMESTAMP NOT NULL
+ DEFAULT current_timestamp() ON UPDATE current_timestamp(),
+ PRIMARY KEY(col_a),
+ UNIQUE INDEX i_ts (col_ts)
+ ) $CHILD2_1_ENGINE $CHILD2_1_AUTO_INCREMENT;
+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
+--let $USE_GENERAL_LOG= 1
diff --git a/storage/spider/scripts/install_spider.sql b/storage/spider/scripts/install_spider.sql
index 21a9836cbd2..f52c78e496d 100644
--- a/storage/spider/scripts/install_spider.sql
+++ b/storage/spider/scripts/install_spider.sql
@@ -1,4 +1,4 @@
-# Copyright (C) 2010-2013 Kentoku Shiba
+# Copyright (C) 2010-2018 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
@@ -73,7 +73,7 @@ create table if not exists mysql.spider_xa_failed_log(
) engine=MyISAM default charset=utf8 collate=utf8_bin;
create table if not exists mysql.spider_tables(
db_name char(64) not null default '',
- table_name char(64) not null default '',
+ table_name char(199) not null default '',
link_id int not null default 0,
priority bigint not null default 0,
server char(64) default null,
@@ -89,18 +89,22 @@ create table if not exists mysql.spider_tables(
ssl_cipher char(64) default null,
ssl_key text,
ssl_verify_server_cert tinyint not null default 0,
+ monitoring_binlog_pos_at_failing tinyint not null default 0,
default_file text,
default_group char(64) default null,
tgt_db_name char(64) default null,
tgt_table_name char(64) default null,
link_status tinyint not null default 1,
+ block_status tinyint not null default 0,
+ static_link_id char(64) default null,
primary key (db_name, table_name, link_id),
- key idx1 (priority)
+ key idx1 (priority),
+ unique key uidx1 (db_name, table_name, static_link_id)
) engine=MyISAM default charset=utf8 collate=utf8_bin;
create table if not exists mysql.spider_link_mon_servers(
db_name char(64) not null default '',
- table_name char(64) not null default '',
- link_id char(5) not null default '',
+ table_name char(199) not null default '',
+ link_id char(64) not null default '',
sid int unsigned not null default 0,
server char(64) default null,
scheme char(64) default null,
@@ -121,10 +125,40 @@ create table if not exists mysql.spider_link_mon_servers(
) engine=MyISAM default charset=utf8 collate=utf8_bin;
create table if not exists mysql.spider_link_failed_log(
db_name char(64) not null default '',
- table_name char(64) not null default '',
- link_id int not null default 0,
+ table_name char(199) not null default '',
+ link_id char(64) not null default '',
failed_time timestamp not null default current_timestamp
) engine=MyISAM default charset=utf8 collate=utf8_bin;
+create table if not exists mysql.spider_table_position_for_recovery(
+ db_name char(64) not null default '',
+ table_name char(199) not null default '',
+ failed_link_id int not null default 0,
+ source_link_id int not null default 0,
+ file text,
+ position text,
+ gtid text,
+ primary key (db_name, table_name, failed_link_id, source_link_id)
+) engine=MyISAM default charset=utf8 collate=utf8_bin;
+create table if not exists mysql.spider_table_sts(
+ db_name char(64) not null default '',
+ table_name char(199) not null default '',
+ data_file_length bigint unsigned not null default 0,
+ max_data_file_length bigint unsigned not null default 0,
+ index_file_length bigint unsigned not null default 0,
+ records bigint unsigned not null default 0,
+ mean_rec_length bigint unsigned not null default 0,
+ check_time datetime not null default '0000-00-00 00:00:00',
+ create_time datetime not null default '0000-00-00 00:00:00',
+ update_time datetime not null default '0000-00-00 00:00:00',
+ primary key (db_name, table_name)
+) engine=MyISAM default charset=utf8 collate=utf8_bin;
+create table if not exists mysql.spider_table_crd(
+ db_name char(64) not null default '',
+ table_name char(199) not null default '',
+ key_seq int unsigned not null default 0,
+ cardinality bigint not null default 0,
+ primary key (db_name, table_name, key_seq)
+) engine=MyISAM default charset=utf8 collate=utf8_bin;
-- If tables already exist and their definition differ from the latest ones,
-- we fix them here.
@@ -133,8 +167,8 @@ drop procedure if exists mysql.spider_fix_system_tables;
delimiter //
create procedure mysql.spider_fix_one_table
(tab_name char(255) charset utf8 collate utf8_bin,
- test_col_name char(255) charset utf8 collate utf8_bin,
- _sql text charset utf8 collate utf8_bin)
+ test_col_name char(255) charset utf8 collate utf8_bin,
+ _sql text charset utf8 collate utf8_bin)
begin
set @col_exists := 0;
select 1 into @col_exists from INFORMATION_SCHEMA.COLUMNS
@@ -150,6 +184,13 @@ end;//
create procedure mysql.spider_fix_system_tables()
begin
+ select substring_index(substring_index(version(), '-', 2), '-', -1)
+ into @server_name;
+ select substring_index(version(), '.', 1)
+ into @server_major_version;
+ select substring_index(substring_index(version(), '.', 2), '.', -1)
+ into @server_minor_version;
+
-- Fix for 0.5
call mysql.spider_fix_one_table('spider_tables', 'server',
'alter table mysql.spider_tables
@@ -224,14 +265,14 @@ begin
add column default_group char(64) default null after default_file');
-- Fix for version 2.25
- select COLUMN_TYPE INTO @col_type from INFORMATION_SCHEMA.COLUMNS
- where TABLE_SCHEMA = 'mysql'
- AND TABLE_NAME = 'spider_link_mon_servers'
- AND COLUMN_NAME = 'link_id';
- if @col_type != 'char(5)' then
- alter table mysql.spider_link_mon_servers
- modify link_id char(5) not null default '';
- end if;
+ -- select COLUMN_TYPE INTO @col_type from INFORMATION_SCHEMA.COLUMNS
+ -- where TABLE_SCHEMA = 'mysql'
+ -- AND TABLE_NAME = 'spider_link_mon_servers'
+ -- AND COLUMN_NAME = 'link_id';
+ -- if @col_type != 'char(5)' then
+ -- alter table mysql.spider_link_mon_servers
+ -- modify link_id char(5) not null default '';
+ -- end if;
-- Fix for version 2.28
select COLUMN_TYPE INTO @col_type from INFORMATION_SCHEMA.COLUMNS
@@ -285,6 +326,162 @@ begin
modify ssl_key text,
modify default_file text;
end if;
+
+ -- Fix for version 3.3.0
+ call mysql.spider_fix_one_table('spider_tables',
+ 'monitoring_binlog_pos_at_failing',
+ 'alter table mysql.spider_tables
+ add monitoring_binlog_pos_at_failing tinyint not null default 0 after ssl_verify_server_cert');
+
+ -- Fix for version 3.3.6
+ call mysql.spider_fix_one_table('spider_tables', 'block_status',
+ 'alter table mysql.spider_tables
+ add column block_status tinyint not null default 0 after link_status');
+ call mysql.spider_fix_one_table('spider_tables', 'static_link_id',
+ 'alter table mysql.spider_tables
+ add column static_link_id char(64) default null after block_status,
+ add unique index uidx1 (db_name, table_name, static_link_id)');
+ select COLUMN_TYPE INTO @col_type from INFORMATION_SCHEMA.COLUMNS
+ where TABLE_SCHEMA = 'mysql'
+ AND TABLE_NAME = 'spider_link_mon_servers'
+ AND COLUMN_NAME = 'link_id';
+ if @col_type != 'char(64)' then
+ alter table mysql.spider_link_mon_servers
+ modify link_id char(64) not null default '';
+ end if;
+ select COLUMN_TYPE INTO @col_type from INFORMATION_SCHEMA.COLUMNS
+ where TABLE_SCHEMA = 'mysql'
+ AND TABLE_NAME = 'spider_link_failed_log'
+ AND COLUMN_NAME = 'link_id';
+ if @col_type != 'char(64)' then
+ alter table mysql.spider_link_failed_log
+ modify link_id char(64) not null default '';
+ end if;
+
+ -- Fix for version 3.3.10
+ select COLUMN_TYPE INTO @col_type from INFORMATION_SCHEMA.COLUMNS
+ where TABLE_SCHEMA = 'mysql'
+ AND TABLE_NAME = 'spider_tables'
+ AND COLUMN_NAME = 'table_name';
+ if @col_type != 'char(199)' then
+ alter table mysql.spider_tables
+ modify table_name char(199) not null default '';
+ end if;
+ select COLUMN_TYPE INTO @col_type from INFORMATION_SCHEMA.COLUMNS
+ where TABLE_SCHEMA = 'mysql'
+ AND TABLE_NAME = 'spider_link_mon_servers'
+ AND COLUMN_NAME = 'table_name';
+ if @col_type != 'char(199)' then
+ alter table mysql.spider_link_mon_servers
+ modify table_name char(199) not null default '';
+ end if;
+ select COLUMN_TYPE INTO @col_type from INFORMATION_SCHEMA.COLUMNS
+ where TABLE_SCHEMA = 'mysql'
+ AND TABLE_NAME = 'spider_link_failed_log'
+ AND COLUMN_NAME = 'table_name';
+ if @col_type != 'char(199)' then
+ alter table mysql.spider_link_failed_log
+ modify table_name char(199) not null default '';
+ end if;
+ select COLUMN_TYPE INTO @col_type from INFORMATION_SCHEMA.COLUMNS
+ where TABLE_SCHEMA = 'mysql'
+ AND TABLE_NAME = 'spider_table_position_for_recovery'
+ AND COLUMN_NAME = 'table_name';
+ if @col_type != 'char(199)' then
+ alter table mysql.spider_table_position_for_recovery
+ modify table_name char(199) not null default '';
+ end if;
+ select COLUMN_TYPE INTO @col_type from INFORMATION_SCHEMA.COLUMNS
+ where TABLE_SCHEMA = 'mysql'
+ AND TABLE_NAME = 'spider_table_sts'
+ AND COLUMN_NAME = 'table_name';
+ if @col_type != 'char(199)' then
+ alter table mysql.spider_table_sts
+ modify table_name char(199) not null default '';
+ end if;
+ select COLUMN_TYPE INTO @col_type from INFORMATION_SCHEMA.COLUMNS
+ where TABLE_SCHEMA = 'mysql'
+ AND TABLE_NAME = 'spider_table_crd'
+ AND COLUMN_NAME = 'table_name';
+ if @col_type != 'char(199)' then
+ alter table mysql.spider_table_crd
+ modify table_name char(199) not null default '';
+ end if;
+
+ -- Fix for MariaDB 10.4: Crash-Safe system tables
+ if @server_name = 'MariaDB' and
+ (
+ @server_major_version > 10 or
+ (
+ @server_major_version = 10 and
+ @server_minor_version >= 4
+ )
+ )
+ then
+ select ENGINE INTO @engine_name from INFORMATION_SCHEMA.TABLES
+ where TABLE_SCHEMA = 'mysql'
+ AND TABLE_NAME = 'spider_link_failed_log';
+ if @engine_name != 'Aria' then
+ alter table mysql.spider_link_failed_log
+ engine=Aria transactional=1;
+ end if;
+ select ENGINE INTO @engine_name from INFORMATION_SCHEMA.TABLES
+ where TABLE_SCHEMA = 'mysql'
+ AND TABLE_NAME = 'spider_link_mon_servers';
+ if @engine_name != 'Aria' then
+ alter table mysql.spider_link_mon_servers
+ engine=Aria transactional=1;
+ end if;
+ select ENGINE INTO @engine_name from INFORMATION_SCHEMA.TABLES
+ where TABLE_SCHEMA = 'mysql'
+ AND TABLE_NAME = 'spider_table_crd';
+ if @engine_name != 'Aria' then
+ alter table mysql.spider_table_crd
+ engine=Aria transactional=1;
+ end if;
+ select ENGINE INTO @engine_name from INFORMATION_SCHEMA.TABLES
+ where TABLE_SCHEMA = 'mysql'
+ AND TABLE_NAME = 'spider_table_position_for_recovery';
+ if @engine_name != 'Aria' then
+ alter table mysql.spider_table_position_for_recovery
+ engine=Aria transactional=1;
+ end if;
+ select ENGINE INTO @engine_name from INFORMATION_SCHEMA.TABLES
+ where TABLE_SCHEMA = 'mysql'
+ AND TABLE_NAME = 'spider_table_sts';
+ if @engine_name != 'Aria' then
+ alter table mysql.spider_table_sts
+ engine=Aria transactional=1;
+ end if;
+ select ENGINE INTO @engine_name from INFORMATION_SCHEMA.TABLES
+ where TABLE_SCHEMA = 'mysql'
+ AND TABLE_NAME = 'spider_tables';
+ if @engine_name != 'Aria' then
+ alter table mysql.spider_tables
+ engine=Aria transactional=1;
+ end if;
+ select ENGINE INTO @engine_name from INFORMATION_SCHEMA.TABLES
+ where TABLE_SCHEMA = 'mysql'
+ AND TABLE_NAME = 'spider_xa';
+ if @engine_name != 'Aria' then
+ alter table mysql.spider_xa
+ engine=Aria transactional=1;
+ end if;
+ select ENGINE INTO @engine_name from INFORMATION_SCHEMA.TABLES
+ where TABLE_SCHEMA = 'mysql'
+ AND TABLE_NAME = 'spider_xa_failed_log';
+ if @engine_name != 'Aria' then
+ alter table mysql.spider_xa_failed_log
+ engine=Aria transactional=1;
+ end if;
+ select ENGINE INTO @engine_name from INFORMATION_SCHEMA.TABLES
+ where TABLE_SCHEMA = 'mysql'
+ AND TABLE_NAME = 'spider_xa_member';
+ if @engine_name != 'Aria' then
+ alter table mysql.spider_xa_member
+ engine=Aria transactional=1;
+ end if;
+ end if;
end;//
delimiter ;
call mysql.spider_fix_system_tables;
diff --git a/storage/spider/spd_conn.cc b/storage/spider/spd_conn.cc
index 30296215952..e7e48b40add 100644
--- a/storage/spider/spd_conn.cc
+++ b/storage/spider/spd_conn.cc
@@ -1,4 +1,4 @@
-/* Copyright (C) 2008-2015 Kentoku Shiba
+/* Copyright (C) 2008-2018 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
@@ -14,7 +14,9 @@
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */
#define MYSQL_SERVER 1
+#include <my_global.h>
#include "mysql_version.h"
+#include "spd_environ.h"
#if MYSQL_VERSION_ID < 50500
#include "mysql_priv.h"
#include <mysql/plugin.h>
@@ -25,6 +27,7 @@
#include "sql_partition.h"
#include "tztime.h"
#endif
+#include "spd_err.h"
#include "spd_param.h"
#include "spd_db_include.h"
#include "spd_include.h"
@@ -36,10 +39,24 @@
#include "spd_direct_sql.h"
#include "spd_ping_table.h"
#include "spd_malloc.h"
+#include "spd_err.h"
+
+#ifdef SPIDER_HAS_NEXT_THREAD_ID
+#define SPIDER_set_next_thread_id(A)
+#else
+extern ulong *spd_db_att_thread_id;
+inline void SPIDER_set_next_thread_id(THD *A)
+{
+ pthread_mutex_lock(&LOCK_thread_count);
+ A->thread_id = (*spd_db_att_thread_id)++;
+ pthread_mutex_unlock(&LOCK_thread_count);
+}
+#endif
extern handlerton *spider_hton_ptr;
extern SPIDER_DBTON spider_dbton[SPIDER_DBTON_SIZE];
pthread_mutex_t spider_conn_id_mutex;
+pthread_mutex_t spider_ipport_conn_mutex;
ulonglong spider_conn_id = 1;
#ifndef WITHOUT_SPIDER_BG_SEARCH
@@ -47,6 +64,8 @@ extern pthread_attr_t spider_pt_attr;
#ifdef HAVE_PSI_INTERFACE
extern PSI_mutex_key spd_key_mutex_mta_conn;
+extern PSI_mutex_key spd_key_mutex_conn_i;
+extern PSI_cond_key spd_key_cond_conn_i;
#ifndef WITHOUT_SPIDER_BG_SEARCH
extern PSI_mutex_key spd_key_mutex_bg_conn_chain;
extern PSI_mutex_key spd_key_mutex_bg_conn_sync;
@@ -69,8 +88,14 @@ extern PSI_thread_key spd_key_thd_bg_mon;
#endif
#endif
+/* UTC time zone for timestamp columns */
+extern Time_zone *UTC;
+
HASH spider_open_connections;
uint spider_open_connections_id;
+HASH spider_ipport_conns;
+long spider_conn_mutex_id = 0;
+
const char *spider_open_connections_func_name;
const char *spider_open_connections_file_name;
ulong spider_open_connections_line_no;
@@ -105,6 +130,17 @@ uchar *spider_conn_get_key(
DBUG_RETURN((uchar*) conn->conn_key);
}
+uchar *spider_ipport_conn_get_key(
+ SPIDER_IP_PORT_CONN *ip_port,
+ size_t *length,
+ my_bool not_used __attribute__ ((unused))
+)
+{
+ DBUG_ENTER("spider_ipport_conn_get_key");
+ *length = ip_port->key_len;
+ DBUG_RETURN((uchar*) ip_port->key);
+}
+
int spider_reset_conn_setted_parameter(
SPIDER_CONN *conn,
THD *thd
@@ -148,10 +184,10 @@ int spider_free_conn_alloc(
SPIDER_CONN *conn
) {
DBUG_ENTER("spider_free_conn_alloc");
- spider_db_disconnect(conn);
#ifndef WITHOUT_SPIDER_BG_SEARCH
spider_free_conn_thread(conn);
#endif
+ spider_db_disconnect(conn);
if (conn->db_conn)
{
delete conn->db_conn;
@@ -171,6 +207,7 @@ void spider_free_conn_from_trx(
int *roop_count
) {
ha_spider *spider;
+ SPIDER_IP_PORT_CONN *ip_port_conn = conn->ip_port_conn;
DBUG_ENTER("spider_free_conn_from_trx");
spider_conn_clear_queue(conn);
conn->use_for_active_standby = FALSE;
@@ -248,6 +285,15 @@ void spider_free_conn_from_trx(
pthread_mutex_unlock(&spider_conn_mutex);
spider_free_conn(conn);
} else {
+ if (ip_port_conn)
+ { /* exists */
+ if (ip_port_conn->waiting_count)
+ {
+ pthread_mutex_lock(&ip_port_conn->mutex);
+ pthread_cond_signal(&ip_port_conn->cond);
+ pthread_mutex_unlock(&ip_port_conn->mutex);
+ }
+ }
if (spider_open_connections.array.max_element > old_elements)
{
spider_alloc_calc_mem(spider_current_trx,
@@ -405,11 +451,19 @@ SPIDER_CONN *spider_create_conn(
) {
int *need_mon;
SPIDER_CONN *conn;
+ SPIDER_IP_PORT_CONN *ip_port_conn;
char *tmp_name, *tmp_host, *tmp_username, *tmp_password, *tmp_socket;
char *tmp_wrapper, *tmp_ssl_ca, *tmp_ssl_capath, *tmp_ssl_cert;
char *tmp_ssl_cipher, *tmp_ssl_key, *tmp_default_file, *tmp_default_group;
DBUG_ENTER("spider_create_conn");
+ if (unlikely(!UTC))
+ {
+ /* UTC time zone for timestamp columns */
+ String tz_00_name(STRING_WITH_LEN("+00:00"), &my_charset_bin);
+ UTC = my_tz_find(current_thd, &tz_00_name);
+ }
+
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
if (conn_kind == SPIDER_CONN_KIND_MYSQL)
{
@@ -621,6 +675,28 @@ SPIDER_CONN *spider_create_conn(
conn->dbton_id = share->hs_dbton_ids[link_idx];
}
#endif
+ if (conn->dbton_id == SPIDER_DBTON_SIZE)
+ {
+#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
+ if (conn->conn_kind == SPIDER_CONN_KIND_MYSQL)
+ {
+#endif
+ my_printf_error(
+ ER_SPIDER_SQL_WRAPPER_IS_INVALID_NUM,
+ ER_SPIDER_SQL_WRAPPER_IS_INVALID_STR,
+ MYF(0), conn->tgt_wrapper);
+ *error_num = ER_SPIDER_SQL_WRAPPER_IS_INVALID_NUM;
+#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
+ } else {
+ my_printf_error(
+ ER_SPIDER_NOSQL_WRAPPER_IS_INVALID_NUM,
+ ER_SPIDER_NOSQL_WRAPPER_IS_INVALID_STR,
+ MYF(0), conn->tgt_wrapper);
+ *error_num = ER_SPIDER_NOSQL_WRAPPER_IS_INVALID_NUM;
+ }
+#endif
+ goto error_invalid_wrapper;
+ }
if (!(conn->db_conn = spider_dbton[conn->dbton_id].create_db_conn(conn)))
{
*error_num = HA_ERR_OUT_OF_MEM;
@@ -663,6 +739,47 @@ SPIDER_CONN *spider_create_conn(
++spider_conn_id;
pthread_mutex_unlock(&spider_conn_id_mutex);
+ pthread_mutex_lock(&spider_ipport_conn_mutex);
+#ifdef SPIDER_HAS_HASH_VALUE_TYPE
+ if ((ip_port_conn = (SPIDER_IP_PORT_CONN*) my_hash_search_using_hash_value(
+ &spider_ipport_conns, conn->conn_key_hash_value,
+ (uchar*)conn->conn_key, conn->conn_key_length)))
+#else
+ if ((ip_port_conn = (SPIDER_IP_PORT_CONN*) my_hash_search(
+ &spider_ipport_conns, (uchar*)conn->conn_key, conn->conn_key_length)))
+#endif
+ { /* exists, +1 */
+ pthread_mutex_unlock(&spider_ipport_conn_mutex);
+ pthread_mutex_lock(&ip_port_conn->mutex);
+ if (spider_param_max_connections())
+ { /* enable conncetion pool */
+ if (ip_port_conn->ip_port_count >= spider_param_max_connections())
+ { /* bigger than the max num of connections, free conn and return NULL */
+ pthread_mutex_unlock(&ip_port_conn->mutex);
+ *error_num = ER_SPIDER_CON_COUNT_ERROR;
+ goto error_too_many_ipport_count;
+ }
+ }
+ ip_port_conn->ip_port_count++;
+ pthread_mutex_unlock(&ip_port_conn->mutex);
+ }
+ else
+ {// do not exist
+ ip_port_conn = spider_create_ipport_conn(conn);
+ if (!ip_port_conn) {
+ /* failed, always do not effect 'create conn' */
+ pthread_mutex_unlock(&spider_ipport_conn_mutex);
+ DBUG_RETURN(conn);
+ }
+ if (my_hash_insert(&spider_ipport_conns, (uchar *)ip_port_conn)) {
+ /* insert failed, always do not effect 'create conn' */
+ pthread_mutex_unlock(&spider_ipport_conn_mutex);
+ DBUG_RETURN(conn);
+ }
+ pthread_mutex_unlock(&spider_ipport_conn_mutex);
+ }
+ conn->ip_port_conn = ip_port_conn;
+
DBUG_RETURN(conn);
/*
@@ -670,10 +787,12 @@ error_init_lock_table_hash:
DBUG_ASSERT(!conn->mta_conn_mutex_file_pos.file_name);
pthread_mutex_destroy(&conn->mta_conn_mutex);
*/
+error_too_many_ipport_count:
error_mta_conn_mutex_init:
error_db_conn_init:
delete conn->db_conn;
error_db_conn_create:
+error_invalid_wrapper:
spider_free(spider_current_trx, conn, MYF(0));
error_alloc_conn:
DBUG_RETURN(NULL);
@@ -823,16 +942,27 @@ SPIDER_CONN *spider_get_conn(
#endif
{
pthread_mutex_unlock(&spider_conn_mutex);
- DBUG_PRINT("info",("spider create new conn"));
- if (!(conn = spider_create_conn(share, spider, link_idx,
- base_link_idx, conn_kind, error_num)))
- goto error;
- *conn->conn_key = *conn_key;
- if (spider)
- {
- spider->conns[base_link_idx] = conn;
- if (spider_bit_is_set(spider->conn_can_fo, base_link_idx))
- conn->use_for_active_standby = TRUE;
+ if (spider_param_max_connections())
+ { /* enable connection pool */
+ conn = spider_get_conn_from_idle_connection(share, link_idx, conn_key, spider, conn_kind, base_link_idx, error_num);
+ /* failed get conn, goto error */
+ if (!conn)
+ goto error;
+
+ }
+ else
+ { /* did not enable conncetion pool , create_conn */
+ DBUG_PRINT("info",("spider create new conn"));
+ if (!(conn = spider_create_conn(share, spider, link_idx,
+ base_link_idx, conn_kind, error_num)))
+ goto error;
+ *conn->conn_key = *conn_key;
+ if (spider)
+ {
+ spider->conns[base_link_idx] = conn;
+ if (spider_bit_is_set(spider->conn_can_fo, base_link_idx))
+ conn->use_for_active_standby = TRUE;
+ }
}
} else {
#ifdef HASH_UPDATE_WITH_HASH_VALUE
@@ -1104,6 +1234,14 @@ int spider_free_conn(
) {
DBUG_ENTER("spider_free_conn");
DBUG_PRINT("info", ("spider conn=%p", conn));
+ SPIDER_IP_PORT_CONN* ip_port_conn = conn->ip_port_conn;
+ if (ip_port_conn)
+ { /* free conn, ip_port_count-- */
+ pthread_mutex_lock(&ip_port_conn->mutex);
+ if (ip_port_conn->ip_port_count > 0)
+ ip_port_conn->ip_port_count--;
+ pthread_mutex_unlock(&ip_port_conn->mutex);
+ }
spider_free_conn_alloc(conn);
spider_free(spider_current_trx, conn, MYF(0));
DBUG_RETURN(0);
@@ -1301,6 +1439,15 @@ void spider_conn_queue_time_zone(
DBUG_VOID_RETURN;
}
+void spider_conn_queue_UTC_time_zone(
+ SPIDER_CONN *conn
+) {
+ DBUG_ENTER("spider_conn_queue_UTC_time_zone");
+ DBUG_PRINT("info", ("spider conn=%p", conn));
+ spider_conn_queue_time_zone(conn, UTC);
+ DBUG_VOID_RETURN;
+}
+
void spider_conn_queue_start_transaction(
SPIDER_CONN *conn
) {
@@ -1566,6 +1713,7 @@ int spider_set_conn_bg_param(
SPIDER_RESULT_LIST *result_list = &spider->result_list;
THD *thd = spider->trx->thd;
DBUG_ENTER("spider_set_conn_bg_param");
+ DBUG_PRINT("info",("spider spider=%p", spider));
bgs_mode =
spider_param_bgs_mode(thd, share->bgs_mode);
if (bgs_mode == 0)
@@ -1606,28 +1754,44 @@ int spider_set_conn_bg_param(
if (result_list->bgs_phase > 0)
{
- for (
- roop_count = spider_conn_link_idx_next(share->link_statuses,
- spider->conn_link_idx, -1, share->link_count,
- spider->lock_mode ?
- SPIDER_LINK_STATUS_RECOVERY : SPIDER_LINK_STATUS_OK);
- roop_count < (int) share->link_count;
- roop_count = spider_conn_link_idx_next(share->link_statuses,
- spider->conn_link_idx, roop_count, share->link_count,
- spider->lock_mode ?
- SPIDER_LINK_STATUS_RECOVERY : SPIDER_LINK_STATUS_OK)
- ) {
- if ((error_num = spider_create_conn_thread(spider->conns[roop_count])))
- DBUG_RETURN(error_num);
+#ifdef SPIDER_HAS_GROUP_BY_HANDLER
+ if (spider->use_fields)
+ {
+ SPIDER_LINK_IDX_CHAIN *link_idx_chain;
+ spider_fields *fields = spider->fields;
+ fields->set_pos_to_first_link_idx_chain();
+ while ((link_idx_chain = fields->get_next_link_idx_chain()))
+ {
+ if ((error_num = spider_create_conn_thread(link_idx_chain->conn)))
+ DBUG_RETURN(error_num);
+ }
+ } else {
+#endif
+ for (
+ roop_count = spider_conn_link_idx_next(share->link_statuses,
+ spider->conn_link_idx, -1, share->link_count,
+ spider->lock_mode ?
+ SPIDER_LINK_STATUS_RECOVERY : SPIDER_LINK_STATUS_OK);
+ roop_count < (int) share->link_count;
+ roop_count = spider_conn_link_idx_next(share->link_statuses,
+ spider->conn_link_idx, roop_count, share->link_count,
+ spider->lock_mode ?
+ SPIDER_LINK_STATUS_RECOVERY : SPIDER_LINK_STATUS_OK)
+ ) {
+ if ((error_num = spider_create_conn_thread(spider->conns[roop_count])))
+ DBUG_RETURN(error_num);
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if ((error_num = spider_create_conn_thread(
- spider->hs_r_conns[roop_count])))
- DBUG_RETURN(error_num);
- if ((error_num = spider_create_conn_thread(
- spider->hs_w_conns[roop_count])))
- DBUG_RETURN(error_num);
+ if ((error_num = spider_create_conn_thread(
+ spider->hs_r_conns[roop_count])))
+ DBUG_RETURN(error_num);
+ if ((error_num = spider_create_conn_thread(
+ spider->hs_w_conns[roop_count])))
+ DBUG_RETURN(error_num);
#endif
+ }
+#ifdef SPIDER_HAS_GROUP_BY_HANDLER
}
+#endif
}
DBUG_RETURN(0);
}
@@ -1923,6 +2087,7 @@ void spider_bg_all_conn_break(
#endif
if (spider->quick_targets[roop_count])
{
+ spider_db_free_one_quick_result((SPIDER_RESULT *) result_list->current);
DBUG_ASSERT(spider->quick_targets[roop_count] == conn->quick_target);
DBUG_PRINT("info", ("spider conn[%p]->quick_target=NULL", conn));
conn->quick_target = NULL;
@@ -1972,6 +2137,7 @@ int spider_bg_conn_search(
SPIDER_RESULT_LIST *result_list = &spider->result_list;
bool with_lock = FALSE;
DBUG_ENTER("spider_bg_conn_search");
+ DBUG_PRINT("info",("spider spider=%p", spider));
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
if (spider->conn_kind[link_idx] == SPIDER_CONN_KIND_MYSQL)
{
@@ -2013,7 +2179,7 @@ int spider_bg_conn_search(
DBUG_RETURN(result_list->bgs_error);
}
}
- if (!result_list->finish_flg)
+ if (result_list->bgs_working || !result_list->finish_flg)
{
pthread_mutex_lock(&conn->bg_conn_mutex);
if (!result_list->finish_flg)
@@ -2037,10 +2203,18 @@ int spider_bg_conn_search(
result_list->bgs_error_msg, MYF(0));
DBUG_RETURN(result_list->bgs_error);
}
+ DBUG_PRINT("info",("spider result_list->quick_mode=%d",
+ result_list->quick_mode));
+ DBUG_PRINT("info",("spider result_list->bgs_current->result=%p",
+ result_list->bgs_current->result));
if (
result_list->quick_mode == 0 ||
!result_list->bgs_current->result
) {
+ DBUG_PRINT("info",("spider result_list->bgs_second_read=%lld",
+ result_list->bgs_second_read));
+ DBUG_PRINT("info",("spider result_list->bgs_split_read=%lld",
+ result_list->bgs_split_read));
result_list->split_read =
result_list->bgs_second_read > 0 ?
result_list->bgs_second_read :
@@ -2050,6 +2224,7 @@ int spider_bg_conn_search(
result_list->split_read ?
result_list->split_read :
result_list->internal_limit - result_list->record_num;
+ DBUG_PRINT("info",("spider sql_kinds=%u", spider->sql_kinds));
if (spider->sql_kinds & SPIDER_SQL_KIND_SQL)
{
if ((error_num = spider->reappend_limit_sql_part(
@@ -2091,6 +2266,9 @@ int spider_bg_conn_search(
conn->bg_target = spider;
conn->link_idx = link_idx;
conn->bg_discard_result = discard_result;
+#ifdef SPIDER_HAS_GROUP_BY_HANDLER
+ conn->link_idx_chain = spider->link_idx_chain;
+#endif
pthread_mutex_lock(&conn->bg_conn_sync_mutex);
pthread_cond_signal(&conn->bg_conn_cond);
pthread_mutex_unlock(&conn->bg_conn_mutex);
@@ -2102,11 +2280,33 @@ int spider_bg_conn_search(
DBUG_PRINT("info",("spider bg current->finish_flg=%s",
result_list->current ?
(result_list->current->finish_flg ? "TRUE" : "FALSE") : "NULL"));
+ if (result_list->bgs_error)
+ {
+ DBUG_PRINT("info",("spider bg error"));
+ if (result_list->bgs_error != HA_ERR_END_OF_FILE)
+ {
+ if (result_list->bgs_error_with_message)
+ my_message(result_list->bgs_error,
+ result_list->bgs_error_msg, MYF(0));
+ DBUG_RETURN(result_list->bgs_error);
+ }
+ }
}
} else {
DBUG_PRINT("info",("spider bg current->finish_flg=%s",
result_list->current ?
(result_list->current->finish_flg ? "TRUE" : "FALSE") : "NULL"));
+ if (result_list->bgs_error)
+ {
+ DBUG_PRINT("info",("spider bg error"));
+ if (result_list->bgs_error != HA_ERR_END_OF_FILE)
+ {
+ if (result_list->bgs_error_with_message)
+ my_message(result_list->bgs_error,
+ result_list->bgs_error_msg, MYF(0));
+ DBUG_RETURN(result_list->bgs_error);
+ }
+ }
}
} else {
DBUG_PRINT("info",("spider bg search"));
@@ -2144,6 +2344,10 @@ int spider_bg_conn_search(
DBUG_PRINT("info",("spider bg next search"));
if (!result_list->current->finish_flg)
{
+ DBUG_PRINT("info",("spider result_list->quick_mode=%d",
+ result_list->quick_mode));
+ DBUG_PRINT("info",("spider result_list->bgs_current->result=%p",
+ result_list->bgs_current->result));
pthread_mutex_lock(&conn->bg_conn_mutex);
result_list->bgs_phase = 3;
if (
@@ -2156,6 +2360,7 @@ int spider_bg_conn_search(
result_list->split_read ?
result_list->split_read :
result_list->internal_limit - result_list->record_num;
+ DBUG_PRINT("info",("spider sql_kinds=%u", spider->sql_kinds));
if (spider->sql_kinds & SPIDER_SQL_KIND_SQL)
{
if ((error_num = spider->reappend_limit_sql_part(
@@ -2190,6 +2395,9 @@ int spider_bg_conn_search(
conn->bg_target = spider;
conn->link_idx = link_idx;
conn->bg_discard_result = discard_result;
+#ifdef SPIDER_HAS_GROUP_BY_HANDLER
+ conn->link_idx_chain = spider->link_idx_chain;
+#endif
result_list->bgs_working = TRUE;
conn->bg_search = TRUE;
if (with_lock)
@@ -2256,7 +2464,7 @@ void *spider_bg_conn_action(
my_thread_init();
DBUG_ENTER("spider_bg_conn_action");
/* init start */
- if (!(thd = new THD(next_thread_id())))
+ if (!(thd = SPIDER_new_THD(next_thread_id())))
{
pthread_mutex_lock(&conn->bg_conn_sync_mutex);
pthread_cond_signal(&conn->bg_conn_sync_cond);
@@ -2264,6 +2472,7 @@ void *spider_bg_conn_action(
my_thread_end();
DBUG_RETURN(NULL);
}
+ SPIDER_set_next_thread_id(thd);
#ifdef HAVE_PSI_INTERFACE
mysql_thread_set_psi_id(thd->thread_id);
#endif
@@ -2391,12 +2600,23 @@ void *spider_bg_conn_action(
pthread_mutex_lock(&conn->mta_conn_mutex);
SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
}
- if ((error_num = dbton_handler->set_sql_for_exec(sql_type,
- conn->link_idx)))
+ if (spider->use_fields)
{
- result_list->bgs_error = error_num;
- if ((result_list->bgs_error_with_message = thd->is_error()))
- strmov(result_list->bgs_error_msg, spider_stmt_da_message(thd));
+ if ((error_num = dbton_handler->set_sql_for_exec(sql_type,
+ conn->link_idx, conn->link_idx_chain)))
+ {
+ result_list->bgs_error = error_num;
+ if ((result_list->bgs_error_with_message = thd->is_error()))
+ strmov(result_list->bgs_error_msg, spider_stmt_da_message(thd));
+ }
+ } else {
+ if ((error_num = dbton_handler->set_sql_for_exec(sql_type,
+ conn->link_idx)))
+ {
+ result_list->bgs_error = error_num;
+ if ((result_list->bgs_error_with_message = thd->is_error()))
+ strmov(result_list->bgs_error_msg, spider_stmt_da_message(thd));
+ }
}
if (!dbton_handler->need_lock_before_set_sql_for_exec(sql_type))
{
@@ -2720,7 +2940,6 @@ void *spider_bg_sts_action(
SPIDER_TRX *trx;
int error_num = 0, roop_count;
ha_spider spider;
-#if defined(_MSC_VER) || defined(__SUNPRO_CC)
int *need_mons;
SPIDER_CONN **conns;
uint *conn_link_idx;
@@ -2731,48 +2950,31 @@ void *spider_bg_sts_action(
char **hs_w_conn_keys;
#endif
spider_db_handler **dbton_hdl;
-#else
- int need_mons[share->link_count];
- SPIDER_CONN *conns[share->link_count];
- uint conn_link_idx[share->link_count];
- uchar conn_can_fo[share->link_bitmap_size];
- char *conn_keys[share->link_count];
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- char *hs_r_conn_keys[share->link_count];
- char *hs_w_conn_keys[share->link_count];
-#endif
- spider_db_handler *dbton_hdl[SPIDER_DBTON_SIZE];
-#endif
THD *thd;
my_thread_init();
DBUG_ENTER("spider_bg_sts_action");
/* init start */
-#if defined(_MSC_VER) || defined(__SUNPRO_CC)
+ char *ptr;
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (!(need_mons = (int *)
- spider_bulk_malloc(spider_current_trx, 21, MYF(MY_WME),
- &need_mons, sizeof(int) * share->link_count,
- &conns, sizeof(SPIDER_CONN *) * share->link_count,
- &conn_link_idx, sizeof(uint) * share->link_count,
- &conn_can_fo, sizeof(uchar) * share->link_bitmap_size,
- &conn_keys, sizeof(char *) * share->link_count,
- &hs_r_conn_keys, sizeof(char *) * share->link_count,
- &hs_w_conn_keys, sizeof(char *) * share->link_count,
- &dbton_hdl, sizeof(spider_db_handler *) * SPIDER_DBTON_SIZE,
- NullS))
- )
+ ptr = (char *) my_alloca(
+ (sizeof(int) * share->link_count) +
+ (sizeof(SPIDER_CONN *) * share->link_count) +
+ (sizeof(uint) * share->link_count) +
+ (sizeof(uchar) * share->link_bitmap_size) +
+ (sizeof(char *) * share->link_count) +
+ (sizeof(char *) * share->link_count) +
+ (sizeof(char *) * share->link_count) +
+ (sizeof(spider_db_handler *) * SPIDER_DBTON_SIZE));
#else
- if (!(need_mons = (int *)
- spider_bulk_malloc(spider_current_trx, 21, MYF(MY_WME),
- &need_mons, sizeof(int) * share->link_count,
- &conns, sizeof(SPIDER_CONN *) * share->link_count,
- &conn_link_idx, sizeof(uint) * share->link_count,
- &conn_can_fo, sizeof(uchar) * share->link_bitmap_size,
- &conn_keys, sizeof(char *) * share->link_count,
- &dbton_hdl, sizeof(spider_db_handler *) * SPIDER_DBTON_SIZE,
- NullS))
- )
-#endif
+ ptr = (char *) my_alloca(
+ (sizeof(int) * share->link_count) +
+ (sizeof(SPIDER_CONN *) * share->link_count) +
+ (sizeof(uint) * share->link_count) +
+ (sizeof(uchar) * share->link_bitmap_size) +
+ (sizeof(char *) * share->link_count) +
+ (sizeof(spider_db_handler *) * SPIDER_DBTON_SIZE));
+#endif
+ if (!ptr)
{
pthread_mutex_lock(&share->sts_mutex);
share->bg_sts_thd_wait = FALSE;
@@ -2782,20 +2984,35 @@ void *spider_bg_sts_action(
my_thread_end();
DBUG_RETURN(NULL);
}
+ need_mons = (int *) ptr;
+ ptr += (sizeof(int) * share->link_count);
+ conns = (SPIDER_CONN **) ptr;
+ ptr += (sizeof(SPIDER_CONN *) * share->link_count);
+ conn_link_idx = (uint *) ptr;
+ ptr += (sizeof(uint) * share->link_count);
+ conn_can_fo = (uchar *) ptr;
+ ptr += (sizeof(uchar) * share->link_bitmap_size);
+ conn_keys = (char **) ptr;
+ ptr += (sizeof(char *) * share->link_count);
+#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
+ hs_r_conn_keys = (char **) ptr;
+ ptr += (sizeof(char *) * share->link_count);
+ hs_w_conn_keys = (char **) ptr;
+ ptr += (sizeof(char *) * share->link_count);
#endif
+ dbton_hdl = (spider_db_handler **) ptr;
pthread_mutex_lock(&share->sts_mutex);
- if (!(thd = new THD(next_thread_id())))
+ if (!(thd = SPIDER_new_THD(next_thread_id())))
{
share->bg_sts_thd_wait = FALSE;
share->bg_sts_kill = FALSE;
share->bg_sts_init = FALSE;
pthread_mutex_unlock(&share->sts_mutex);
my_thread_end();
-#if defined(_MSC_VER) || defined(__SUNPRO_CC)
- spider_free(NULL, need_mons, MYF(MY_WME));
-#endif
+ my_afree(need_mons);
DBUG_RETURN(NULL);
}
+ SPIDER_set_next_thread_id(thd);
#ifdef HAVE_PSI_INTERFACE
mysql_thread_set_psi_id(thd->thread_id);
#endif
@@ -2812,9 +3029,7 @@ void *spider_bg_sts_action(
my_pthread_setspecific_ptr(THR_THD, NULL);
#endif
my_thread_end();
-#if defined(_MSC_VER) || defined(__SUNPRO_CC)
- spider_free(NULL, need_mons, MYF(MY_WME));
-#endif
+ my_afree(need_mons);
DBUG_RETURN(NULL);
}
share->bg_sts_thd = thd;
@@ -2844,14 +3059,14 @@ void *spider_bg_sts_action(
spider_bit_is_set(share->dbton_bitmap, roop_count) &&
spider_dbton[roop_count].create_db_handler
) {
- if ((dbton_hdl[roop_count] = spider_dbton[roop_count].create_db_handler(
+ if (!(dbton_hdl[roop_count] = spider_dbton[roop_count].create_db_handler(
&spider, share->dbton_share[roop_count])))
break;
if (dbton_hdl[roop_count]->init())
break;
}
}
- if (roop_count == SPIDER_DBTON_SIZE)
+ if (roop_count < SPIDER_DBTON_SIZE)
{
DBUG_PRINT("info",("spider handler init error"));
for (roop_count = SPIDER_DBTON_SIZE - 1; roop_count >= 0; --roop_count)
@@ -2874,9 +3089,7 @@ void *spider_bg_sts_action(
my_pthread_setspecific_ptr(THR_THD, NULL);
#endif
my_thread_end();
-#if defined(_MSC_VER) || defined(__SUNPRO_CC)
- spider_free(NULL, need_mons, MYF(MY_WME));
-#endif
+ my_afree(need_mons);
DBUG_RETURN(NULL);
}
/* init end */
@@ -2905,12 +3118,10 @@ void *spider_bg_sts_action(
my_pthread_setspecific_ptr(THR_THD, NULL);
#endif
my_thread_end();
-#if defined(_MSC_VER) || defined(__SUNPRO_CC)
- spider_free(NULL, need_mons, MYF(MY_WME));
-#endif
+ my_afree(need_mons);
DBUG_RETURN(NULL);
}
- if (spider.search_link_idx == -1)
+ if (spider.search_link_idx < 0)
{
spider_trx_set_link_idx_for_all(&spider);
/*
@@ -2946,6 +3157,7 @@ void *spider_bg_sts_action(
trx,
thd,
share,
+ spider.search_link_idx,
(uint32) share->monitoring_sid[spider.search_link_idx],
share->table_name,
share->table_name_length,
@@ -2987,6 +3199,7 @@ void *spider_bg_sts_action(
trx,
thd,
share,
+ spider.search_link_idx,
(uint32) share->monitoring_sid[spider.search_link_idx],
share->table_name,
share->table_name_length,
@@ -3093,7 +3306,6 @@ void *spider_bg_crd_action(
int error_num = 0, roop_count;
ha_spider spider;
TABLE table;
-#if defined(_MSC_VER) || defined(__SUNPRO_CC)
int *need_mons;
SPIDER_CONN **conns;
uint *conn_link_idx;
@@ -3104,48 +3316,31 @@ void *spider_bg_crd_action(
char **hs_w_conn_keys;
#endif
spider_db_handler **dbton_hdl;
-#else
- int need_mons[share->link_count];
- SPIDER_CONN *conns[share->link_count];
- uint conn_link_idx[share->link_count];
- uchar conn_can_fo[share->link_bitmap_size];
- char *conn_keys[share->link_count];
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- char *hs_r_conn_keys[share->link_count];
- char *hs_w_conn_keys[share->link_count];
-#endif
- spider_db_handler *dbton_hdl[SPIDER_DBTON_SIZE];
-#endif
THD *thd;
my_thread_init();
DBUG_ENTER("spider_bg_crd_action");
/* init start */
-#if defined(_MSC_VER) || defined(__SUNPRO_CC)
+ char *ptr;
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (!(need_mons = (int *)
- spider_bulk_malloc(spider_current_trx, 22, MYF(MY_WME),
- &need_mons, sizeof(int) * share->link_count,
- &conns, sizeof(SPIDER_CONN *) * share->link_count,
- &conn_link_idx, sizeof(uint) * share->link_count,
- &conn_can_fo, sizeof(uchar) * share->link_bitmap_size,
- &conn_keys, sizeof(char *) * share->link_count,
- &hs_r_conn_keys, sizeof(char *) * share->link_count,
- &hs_w_conn_keys, sizeof(char *) * share->link_count,
- &dbton_hdl, sizeof(spider_db_handler *) * SPIDER_DBTON_SIZE,
- NullS))
- )
+ ptr = (char *) my_alloca(
+ (sizeof(int) * share->link_count) +
+ (sizeof(SPIDER_CONN *) * share->link_count) +
+ (sizeof(uint) * share->link_count) +
+ (sizeof(uchar) * share->link_bitmap_size) +
+ (sizeof(char *) * share->link_count) +
+ (sizeof(char *) * share->link_count) +
+ (sizeof(char *) * share->link_count) +
+ (sizeof(spider_db_handler *) * SPIDER_DBTON_SIZE));
#else
- if (!(need_mons = (int *)
- spider_bulk_malloc(spider_current_trx, 22, MYF(MY_WME),
- &need_mons, sizeof(int) * share->link_count,
- &conns, sizeof(SPIDER_CONN *) * share->link_count,
- &conn_link_idx, sizeof(uint) * share->link_count,
- &conn_can_fo, sizeof(uchar) * share->link_bitmap_size,
- &conn_keys, sizeof(char *) * share->link_count,
- &dbton_hdl, sizeof(spider_db_handler *) * SPIDER_DBTON_SIZE,
- NullS))
- )
-#endif
+ ptr = (char *) my_alloca(
+ (sizeof(int) * share->link_count) +
+ (sizeof(SPIDER_CONN *) * share->link_count) +
+ (sizeof(uint) * share->link_count) +
+ (sizeof(uchar) * share->link_bitmap_size) +
+ (sizeof(char *) * share->link_count) +
+ (sizeof(spider_db_handler *) * SPIDER_DBTON_SIZE));
+#endif
+ if (!ptr)
{
pthread_mutex_lock(&share->crd_mutex);
share->bg_crd_thd_wait = FALSE;
@@ -3155,20 +3350,35 @@ void *spider_bg_crd_action(
my_thread_end();
DBUG_RETURN(NULL);
}
+ need_mons = (int *) ptr;
+ ptr += (sizeof(int) * share->link_count);
+ conns = (SPIDER_CONN **) ptr;
+ ptr += (sizeof(SPIDER_CONN *) * share->link_count);
+ conn_link_idx = (uint *) ptr;
+ ptr += (sizeof(uint) * share->link_count);
+ conn_can_fo = (uchar *) ptr;
+ ptr += (sizeof(uchar) * share->link_bitmap_size);
+ conn_keys = (char **) ptr;
+ ptr += (sizeof(char *) * share->link_count);
+#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
+ hs_r_conn_keys = (char **) ptr;
+ ptr += (sizeof(char *) * share->link_count);
+ hs_w_conn_keys = (char **) ptr;
+ ptr += (sizeof(char *) * share->link_count);
#endif
+ dbton_hdl = (spider_db_handler **) ptr;
pthread_mutex_lock(&share->crd_mutex);
- if (!(thd = new THD(next_thread_id())))
+ if (!(thd = SPIDER_new_THD(next_thread_id())))
{
share->bg_crd_thd_wait = FALSE;
share->bg_crd_kill = FALSE;
share->bg_crd_init = FALSE;
pthread_mutex_unlock(&share->crd_mutex);
my_thread_end();
-#if defined(_MSC_VER) || defined(__SUNPRO_CC)
- spider_free(NULL, need_mons, MYF(MY_WME));
-#endif
+ my_afree(need_mons);
DBUG_RETURN(NULL);
}
+ SPIDER_set_next_thread_id(thd);
#ifdef HAVE_PSI_INTERFACE
mysql_thread_set_psi_id(thd->thread_id);
#endif
@@ -3185,9 +3395,7 @@ void *spider_bg_crd_action(
my_pthread_setspecific_ptr(THR_THD, NULL);
#endif
my_thread_end();
-#if defined(_MSC_VER) || defined(__SUNPRO_CC)
- spider_free(NULL, need_mons, MYF(MY_WME));
-#endif
+ my_afree(need_mons);
DBUG_RETURN(NULL);
}
share->bg_crd_thd = thd;
@@ -3221,14 +3429,14 @@ void *spider_bg_crd_action(
spider_bit_is_set(share->dbton_bitmap, roop_count) &&
spider_dbton[roop_count].create_db_handler
) {
- if ((dbton_hdl[roop_count] = spider_dbton[roop_count].create_db_handler(
+ if (!(dbton_hdl[roop_count] = spider_dbton[roop_count].create_db_handler(
&spider, share->dbton_share[roop_count])))
break;
if (dbton_hdl[roop_count]->init())
break;
}
}
- if (roop_count == SPIDER_DBTON_SIZE)
+ if (roop_count < SPIDER_DBTON_SIZE)
{
DBUG_PRINT("info",("spider handler init error"));
for (roop_count = SPIDER_DBTON_SIZE - 1; roop_count >= 0; --roop_count)
@@ -3251,9 +3459,7 @@ void *spider_bg_crd_action(
my_pthread_setspecific_ptr(THR_THD, NULL);
#endif
my_thread_end();
-#if defined(_MSC_VER) || defined(__SUNPRO_CC)
- spider_free(NULL, need_mons, MYF(MY_WME));
-#endif
+ my_afree(need_mons);
DBUG_RETURN(NULL);
}
/* init end */
@@ -3282,12 +3488,10 @@ void *spider_bg_crd_action(
my_pthread_setspecific_ptr(THR_THD, NULL);
#endif
my_thread_end();
-#if defined(_MSC_VER) || defined(__SUNPRO_CC)
- spider_free(NULL, need_mons, MYF(MY_WME));
-#endif
+ my_afree(need_mons);
DBUG_RETURN(NULL);
}
- if (spider.search_link_idx == -1)
+ if (spider.search_link_idx < 0)
{
spider_trx_set_link_idx_for_all(&spider);
/*
@@ -3323,6 +3527,7 @@ void *spider_bg_crd_action(
trx,
thd,
share,
+ spider.search_link_idx,
(uint32) share->monitoring_sid[spider.search_link_idx],
share->table_name,
share->table_name_length,
@@ -3364,6 +3569,7 @@ void *spider_bg_crd_action(
trx,
thd,
share,
+ spider.search_link_idx,
(uint32) share->monitoring_sid[spider.search_link_idx],
share->table_name,
share->table_name_length,
@@ -3413,15 +3619,9 @@ int spider_create_mon_threads(
{
char link_idx_str[SPIDER_SQL_INT_LEN];
int link_idx_str_length;
-#if defined(_MSC_VER) || defined(__SUNPRO_CC)
- spider_string conv_name_str(share->table_name_length +
- SPIDER_SQL_INT_LEN + 1);
- conv_name_str.set_charset(system_charset_info);
-#else
- char buf[share->table_name_length + SPIDER_SQL_INT_LEN + 1];
+ char *buf = (char *) my_alloca(share->table_name_length + SPIDER_SQL_INT_LEN + 1);
spider_string conv_name_str(buf, share->table_name_length +
SPIDER_SQL_INT_LEN + 1, system_charset_info);
-#endif
conv_name_str.init_calc_mem(105);
conv_name_str.length(0);
conv_name_str.q_append(share->table_name, share->table_name_length);
@@ -3431,14 +3631,26 @@ int spider_create_mon_threads(
if (share->monitoring_bg_kind[roop_count])
{
conv_name_str.length(share->table_name_length);
- link_idx_str_length = my_sprintf(link_idx_str, (link_idx_str,
- "%010d", roop_count));
+ if (share->static_link_ids[roop_count])
+ {
+ memcpy(link_idx_str, share->static_link_ids[roop_count],
+ share->static_link_ids_lengths[roop_count] + 1);
+ link_idx_str_length = share->static_link_ids_lengths[roop_count];
+ } else {
+ link_idx_str_length = my_sprintf(link_idx_str, (link_idx_str,
+ "%010d", roop_count));
+ }
conv_name_str.q_append(link_idx_str, link_idx_str_length + 1);
conv_name_str.length(conv_name_str.length() - 1);
if (!(table_mon_list = spider_get_ping_table_mon_list(trx, trx->thd,
&conv_name_str, share->table_name_length, roop_count,
+ share->static_link_ids[roop_count],
+ share->static_link_ids_lengths[roop_count],
(uint32) share->monitoring_sid[roop_count], FALSE, &error_num)))
+ {
+ my_afree(buf);
goto error_get_ping_table_mon_list;
+ }
spider_free_ping_table_mon_list(table_mon_list);
}
}
@@ -3454,6 +3666,7 @@ int spider_create_mon_threads(
NullS))
) {
error_num = HA_ERR_OUT_OF_MEM;
+ my_afree(buf);
goto error_alloc_base;
}
for (roop_count = 0; roop_count < (int) share->all_link_count;
@@ -3470,6 +3683,7 @@ int spider_create_mon_threads(
#endif
) {
error_num = HA_ERR_OUT_OF_MEM;
+ my_afree(buf);
goto error_mutex_init;
}
}
@@ -3486,6 +3700,7 @@ int spider_create_mon_threads(
#endif
) {
error_num = HA_ERR_OUT_OF_MEM;
+ my_afree(buf);
goto error_cond_init;
}
}
@@ -3502,6 +3717,7 @@ int spider_create_mon_threads(
#endif
) {
error_num = HA_ERR_OUT_OF_MEM;
+ my_afree(buf);
goto error_sleep_cond_init;
}
}
@@ -3525,6 +3741,7 @@ int spider_create_mon_threads(
#endif
{
error_num = HA_ERR_OUT_OF_MEM;
+ my_afree(buf);
goto error_thread_create;
}
pthread_cond_wait(&share->bg_mon_conds[roop_count],
@@ -3533,6 +3750,7 @@ int spider_create_mon_threads(
}
}
share->bg_mon_init = TRUE;
+ my_afree(buf);
}
}
DBUG_RETURN(0);
@@ -3640,7 +3858,7 @@ void *spider_bg_mon_action(
DBUG_ENTER("spider_bg_mon_action");
/* init start */
pthread_mutex_lock(&share->bg_mon_mutexes[link_idx]);
- if (!(thd = new THD(next_thread_id())))
+ if (!(thd = SPIDER_new_THD(next_thread_id())))
{
share->bg_mon_kill = FALSE;
share->bg_mon_init = FALSE;
@@ -3649,6 +3867,7 @@ void *spider_bg_mon_action(
my_thread_end();
DBUG_RETURN(NULL);
}
+ SPIDER_set_next_thread_id(thd);
#ifdef HAVE_PSI_INTERFACE
mysql_thread_set_psi_id(thd->thread_id);
#endif
@@ -3713,6 +3932,7 @@ void *spider_bg_mon_action(
trx,
thd,
share,
+ link_idx,
(uint32) share->monitoring_sid[link_idx],
share->table_name,
share->table_name_length,
@@ -3741,25 +3961,19 @@ int spider_conn_first_link_idx(
int roop_count, active_links = 0;
longlong balance_total = 0, balance_val;
double rand_val;
-#if defined(_MSC_VER) || defined(__SUNPRO_CC)
int *link_idxs, link_idx;
long *balances;
-#else
- int link_idxs[link_count];
- long balances[link_count];
-#endif
DBUG_ENTER("spider_conn_first_link_idx");
-#if defined(_MSC_VER) || defined(__SUNPRO_CC)
- if (!(link_idxs = (int *)
- spider_bulk_malloc(spider_current_trx, 24, MYF(MY_WME),
- &link_idxs, sizeof(int) * link_count,
- &balances, sizeof(long) * link_count,
- NullS))
- ) {
+ char *ptr;
+ ptr = (char *) my_alloca((sizeof(int) * link_count) + (sizeof(long) * link_count));
+ if (!ptr)
+ {
DBUG_PRINT("info",("spider out of memory"));
- DBUG_RETURN(-1);
+ DBUG_RETURN(-2);
}
-#endif
+ link_idxs = (int *) ptr;
+ ptr += sizeof(int) * link_count;
+ balances = (long *) ptr;
for (roop_count = 0; roop_count < link_count; roop_count++)
{
DBUG_ASSERT((conn_link_idx[roop_count] - roop_count) % link_count == 0);
@@ -3775,9 +3989,7 @@ int spider_conn_first_link_idx(
if (active_links == 0)
{
DBUG_PRINT("info",("spider all links are failed"));
-#if defined(_MSC_VER) || defined(__SUNPRO_CC)
- spider_free(spider_current_trx, link_idxs, MYF(MY_WME));
-#endif
+ my_afree(link_idxs);
DBUG_RETURN(-1);
}
#if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100002
@@ -3804,13 +4016,9 @@ int spider_conn_first_link_idx(
}
DBUG_PRINT("info",("spider first link_idx=%d", link_idxs[roop_count]));
-#if defined(_MSC_VER) || defined(__SUNPRO_CC)
link_idx = link_idxs[roop_count];
- spider_free(spider_current_trx, link_idxs, MYF(MY_WME));
+ my_afree(link_idxs);
DBUG_RETURN(link_idx);
-#else
- DBUG_RETURN(link_idxs[roop_count]);
-#endif
}
int spider_conn_next_link_idx(
@@ -3863,6 +4071,17 @@ int spider_conn_link_idx_next(
DBUG_RETURN(link_idx);
}
+int spider_conn_get_link_status(
+ long *link_statuses,
+ uint *conn_link_idx,
+ int link_idx
+) {
+ DBUG_ENTER("spider_conn_get_link_status");
+ DBUG_PRINT("info",("spider link_status=%d",
+ (int) link_statuses[conn_link_idx[link_idx]]));
+ DBUG_RETURN((int) link_statuses[conn_link_idx[link_idx]]);
+}
+
int spider_conn_lock_mode(
ha_spider *spider
) {
@@ -4172,3 +4391,209 @@ bool spider_conn_need_open_handler(
}
DBUG_RETURN(TRUE);
}
+
+SPIDER_CONN* spider_get_conn_from_idle_connection(
+ SPIDER_SHARE *share,
+ int link_idx,
+ char *conn_key,
+ ha_spider *spider,
+ uint conn_kind,
+ int base_link_idx,
+ int *error_num
+ )
+{
+ DBUG_ENTER("spider_get_conn_from_idle_connection");
+ SPIDER_IP_PORT_CONN *ip_port_conn;
+ SPIDER_CONN *conn = NULL;
+ uint spider_max_connections = spider_param_max_connections();
+ struct timespec abstime;
+ ulonglong start, inter_val = 0;
+ longlong last_ntime = 0;
+ ulonglong wait_time = (ulonglong)spider_param_conn_wait_timeout()*1000*1000*1000; // default 10s
+
+ unsigned long ip_port_count = 0; // init 0
+
+ set_timespec(abstime, 0);
+
+ pthread_mutex_lock(&spider_ipport_conn_mutex);
+#ifdef SPIDER_HAS_HASH_VALUE_TYPE
+ if ((ip_port_conn = (SPIDER_IP_PORT_CONN*) my_hash_search_using_hash_value(
+ &spider_ipport_conns, share->conn_keys_hash_value[link_idx],
+ (uchar*) share->conn_keys[link_idx], share->conn_keys_lengths[link_idx])))
+#else
+ if ((ip_port_conn = (SPIDER_IP_PORT_CONN*) my_hash_search(
+ &spider_ipport_conns,
+ (uchar*) share->conn_keys[link_idx], share->conn_keys_lengths[link_idx])))
+#endif
+ { /* exists */
+ pthread_mutex_unlock(&spider_ipport_conn_mutex);
+ pthread_mutex_lock(&ip_port_conn->mutex);
+ ip_port_count = ip_port_conn->ip_port_count;
+ } else {
+ pthread_mutex_unlock(&spider_ipport_conn_mutex);
+ }
+
+ if (
+ ip_port_conn &&
+ ip_port_count >= spider_max_connections &&
+ spider_max_connections > 0
+ ) { /* no idle conn && enable connection pool, wait */
+ pthread_mutex_unlock(&ip_port_conn->mutex);
+ start = my_hrtime().val;
+ while(1)
+ {
+ int error;
+ inter_val = my_hrtime().val - start; // us
+ last_ntime = wait_time - inter_val*1000; // *1000, to ns
+ if(last_ntime <= 0)
+ {/* wait timeout */
+ *error_num = ER_SPIDER_CON_COUNT_ERROR;
+ DBUG_RETURN(NULL);
+ }
+ set_timespec_nsec(abstime, last_ntime);
+ pthread_mutex_lock(&ip_port_conn->mutex);
+ ++ip_port_conn->waiting_count;
+ error = pthread_cond_timedwait(&ip_port_conn->cond, &ip_port_conn->mutex, &abstime);
+ --ip_port_conn->waiting_count;
+ pthread_mutex_unlock(&ip_port_conn->mutex);
+ if (error == ETIMEDOUT || error == ETIME || error != 0 )
+ {
+ *error_num = ER_SPIDER_CON_COUNT_ERROR;
+ DBUG_RETURN(NULL);
+ }
+
+ pthread_mutex_lock(&spider_conn_mutex);
+#ifdef SPIDER_HAS_HASH_VALUE_TYPE
+ if ((conn = (SPIDER_CONN*) my_hash_search_using_hash_value(
+ &spider_open_connections, share->conn_keys_hash_value[link_idx],
+ (uchar*) share->conn_keys[link_idx],
+ share->conn_keys_lengths[link_idx])))
+#else
+ if ((conn = (SPIDER_CONN*) my_hash_search(&spider_open_connections,
+ (uchar*) share->conn_keys[link_idx],
+ share->conn_keys_lengths[link_idx])))
+#endif
+ {
+ /* get conn from spider_open_connections, then delete conn in spider_open_connections */
+#ifdef HASH_UPDATE_WITH_HASH_VALUE
+ my_hash_delete_with_hash_value(&spider_open_connections,
+ conn->conn_key_hash_value, (uchar*) conn);
+#else
+ my_hash_delete(&spider_open_connections, (uchar*) conn);
+#endif
+ pthread_mutex_unlock(&spider_conn_mutex);
+ DBUG_PRINT("info",("spider get global conn"));
+ if (spider)
+ {
+ spider->conns[base_link_idx] = conn;
+ if (spider_bit_is_set(spider->conn_can_fo, base_link_idx))
+ conn->use_for_active_standby = TRUE;
+ }
+ DBUG_RETURN(conn);
+ }
+ else
+ {
+ pthread_mutex_unlock(&spider_conn_mutex);
+ }
+ }
+ }
+ else
+ { /* create conn */
+ if (ip_port_conn)
+ pthread_mutex_unlock(&ip_port_conn->mutex);
+ DBUG_PRINT("info",("spider create new conn"));
+ if (!(conn = spider_create_conn(share, spider, link_idx, base_link_idx, conn_kind, error_num)))
+ DBUG_RETURN(conn);
+ *conn->conn_key = *conn_key;
+ if (spider)
+ {
+ spider->conns[base_link_idx] = conn;
+ if (spider_bit_is_set(spider->conn_can_fo, base_link_idx))
+ conn->use_for_active_standby = TRUE;
+ }
+ }
+
+ DBUG_RETURN(conn);
+}
+
+
+SPIDER_IP_PORT_CONN* spider_create_ipport_conn(SPIDER_CONN *conn)
+{
+ DBUG_ENTER("spider_create_ipport_conn");
+ if (conn)
+ {
+ SPIDER_IP_PORT_CONN *ret = (SPIDER_IP_PORT_CONN *) my_malloc(sizeof(*ret), MY_ZEROFILL | MY_WME);
+ if (!ret)
+ {
+ goto err_return_direct;
+ }
+
+#if MYSQL_VERSION_ID < 50500
+ if (pthread_mutex_init(&ret->mutex, MY_MUTEX_INIT_FAST))
+#else
+ if (mysql_mutex_init(spd_key_mutex_conn_i, &ret->mutex, MY_MUTEX_INIT_FAST))
+#endif
+ {
+ //error
+ goto err_malloc_key;
+ }
+
+#if MYSQL_VERSION_ID < 50500
+ if (pthread_cond_init(&ret->cond, NULL))
+#else
+ if (mysql_cond_init(spd_key_cond_conn_i, &ret->cond, NULL))
+#endif
+ {
+ pthread_mutex_destroy(&ret->mutex);
+ goto err_malloc_key;
+ //error
+ }
+
+ ret->key_len = conn->conn_key_length;
+ if (ret->key_len <= 0) {
+ pthread_cond_destroy(&ret->cond);
+ pthread_mutex_destroy(&ret->mutex);
+ goto err_malloc_key;
+ }
+
+ ret->key = (char *) my_malloc(ret->key_len, MY_ZEROFILL | MY_WME);
+ if (!ret->key) {
+ pthread_cond_destroy(&ret->cond);
+ pthread_mutex_destroy(&ret->mutex);
+ goto err_malloc_key;
+ }
+
+ memcpy(ret->key, conn->conn_key, ret->key_len);
+
+ strncpy(ret->remote_ip_str, conn->tgt_host, sizeof(ret->remote_ip_str));
+ ret->remote_ip_str[sizeof ret->remote_ip_str - 1] = '\0';
+ ret->remote_port = conn->tgt_port;
+ ret->conn_id = conn->conn_id;
+ ret->ip_port_count = 1; // init
+
+#ifdef SPIDER_HAS_HASH_VALUE_TYPE
+ ret->key_hash_value = conn->conn_key_hash_value;
+#endif
+ DBUG_RETURN(ret);
+err_malloc_key:
+ spider_my_free(ret, MYF(0));
+err_return_direct:
+ DBUG_RETURN(NULL);
+ }
+ DBUG_RETURN(NULL);
+}
+
+
+void spider_free_ipport_conn(void *info)
+{
+ DBUG_ENTER("spider_free_ipport_conn");
+ if (info)
+ {
+ SPIDER_IP_PORT_CONN *p = (SPIDER_IP_PORT_CONN *)info;
+ pthread_cond_destroy(&p->cond);
+ pthread_mutex_destroy(&p->mutex);
+ spider_my_free(p->key, MYF(0));
+ spider_my_free(p, MYF(0));
+ }
+ DBUG_VOID_RETURN;
+}
diff --git a/storage/spider/spd_conn.h b/storage/spider/spd_conn.h
index 06e3c696f35..a066da6a5ea 100644
--- a/storage/spider/spd_conn.h
+++ b/storage/spider/spd_conn.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2008-2014 Kentoku Shiba
+/* Copyright (C) 2008-2018 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
@@ -28,6 +28,12 @@ uchar *spider_conn_get_key(
my_bool not_used __attribute__ ((unused))
);
+uchar *spider_ipport_conn_get_key(
+ SPIDER_IP_PORT_CONN *ip_port,
+ size_t *length,
+ my_bool not_used __attribute__ ((unused))
+);
+
int spider_reset_conn_setted_parameter(
SPIDER_CONN *conn,
THD *thd
@@ -131,6 +137,10 @@ void spider_conn_queue_time_zone(
Time_zone *time_zone
);
+void spider_conn_queue_UTC_time_zone(
+ SPIDER_CONN *conn
+);
+
void spider_conn_queue_start_transaction(
SPIDER_CONN *conn
);
@@ -315,6 +325,12 @@ int spider_conn_link_idx_next(
int link_status
);
+int spider_conn_get_link_status(
+ long *link_statuses,
+ uint *conn_link_idx,
+ int link_idx
+);
+
int spider_conn_lock_mode(
ha_spider *spider
);
@@ -334,3 +350,16 @@ bool spider_conn_need_open_handler(
uint idx,
int link_idx
);
+
+SPIDER_IP_PORT_CONN *spider_create_ipport_conn(SPIDER_CONN *conn);
+SPIDER_CONN* spider_get_conn_from_idle_connection
+(
+ SPIDER_SHARE *share,
+ int link_idx,
+ char *conn_key,
+ ha_spider *spider,
+ uint conn_kind,
+ int base_link_idx,
+ int *error_num
+ );
+void spider_free_ipport_conn(void *info);
diff --git a/storage/spider/spd_copy_tables.cc b/storage/spider/spd_copy_tables.cc
index dbd8ace3f47..13c53220b16 100644
--- a/storage/spider/spd_copy_tables.cc
+++ b/storage/spider/spd_copy_tables.cc
@@ -1,4 +1,4 @@
-/* Copyright (C) 2009-2014 Kentoku Shiba
+/* Copyright (C) 2009-2018 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
@@ -14,7 +14,9 @@
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */
#define MYSQL_SERVER 1
+#include <my_global.h>
#include "mysql_version.h"
+#include "spd_environ.h"
#if MYSQL_VERSION_ID < 50500
#include "mysql_priv.h"
#include <mysql/plugin.h>
@@ -51,10 +53,10 @@ int spider_udf_set_copy_tables_param_default(
if (!copy_tables->database)
{
DBUG_PRINT("info",("spider create default database"));
- copy_tables->database_length = copy_tables->trx->thd->db_length;
+ copy_tables->database_length = SPIDER_THD_db_length(copy_tables->trx->thd);
if (
!(copy_tables->database = spider_create_string(
- copy_tables->trx->thd->db,
+ SPIDER_THD_db_str(copy_tables->trx->thd),
copy_tables->database_length))
) {
my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
@@ -88,8 +90,7 @@ int spider_udf_set_copy_tables_param_default(
start_ptr, TRUE, &param_string_parse))) \
copy_tables->SPIDER_PARAM_STR_LEN(param_name) = \
strlen(copy_tables->param_name); \
- else \
- { \
+ else { \
error_num = param_string_parse.print_param_error(); \
goto error; \
} \
@@ -966,28 +967,37 @@ long long spider_copy_tables_body(
goto error;
table_list = &copy_tables->spider_table_list;
- table_list->db = copy_tables->spider_db_name;
- table_list->db_length = copy_tables->spider_db_name_length;
- table_list->alias = table_list->table_name =
+ SPIDER_TABLE_LIST_db_str(table_list) = copy_tables->spider_db_name;
+ SPIDER_TABLE_LIST_db_length(table_list) = copy_tables->spider_db_name_length;
+ SPIDER_TABLE_LIST_alias_str(table_list) =
+ SPIDER_TABLE_LIST_table_name_str(table_list) =
copy_tables->spider_real_table_name;
- table_list->table_name_length = copy_tables->spider_real_table_name_length;
+ SPIDER_TABLE_LIST_table_name_length(table_list) =
+ copy_tables->spider_real_table_name_length;
+#ifdef SPIDER_use_LEX_CSTRING_for_database_tablename_alias
+ SPIDER_TABLE_LIST_alias_length(table_list) =
+ SPIDER_TABLE_LIST_table_name_length(table_list);
+#endif
table_list->lock_type = TL_READ;
- DBUG_PRINT("info",("spider db=%s", table_list->db));
- DBUG_PRINT("info",("spider db_length=%zd", table_list->db_length));
- DBUG_PRINT("info",("spider table_name=%s", table_list->table_name));
+ DBUG_PRINT("info",("spider db=%s", SPIDER_TABLE_LIST_db_str(table_list)));
+ DBUG_PRINT("info",("spider db_length=%zd", SPIDER_TABLE_LIST_db_length(table_list)));
+ DBUG_PRINT("info",("spider table_name=%s",
+ SPIDER_TABLE_LIST_table_name_str(table_list)));
DBUG_PRINT("info",("spider table_name_length=%zd",
- table_list->table_name_length));
+ SPIDER_TABLE_LIST_table_name_length(table_list)));
reprepare_observer_backup = thd->m_reprepare_observer;
thd->m_reprepare_observer = NULL;
copy_tables->trx->trx_start = TRUE;
+ copy_tables->trx->updated_in_this_trx = FALSE;
+ DBUG_PRINT("info",("spider trx->updated_in_this_trx=FALSE"));
#if MYSQL_VERSION_ID < 50500
if (open_and_lock_tables(thd, table_list))
#else
table_list->mdl_request.init(
MDL_key::TABLE,
- table_list->db,
- table_list->table_name,
+ SPIDER_TABLE_LIST_db_str(table_list),
+ SPIDER_TABLE_LIST_table_name_str(table_list),
MDL_SHARED_READ,
MDL_TRANSACTION
);
@@ -996,13 +1006,18 @@ long long spider_copy_tables_body(
{
thd->m_reprepare_observer = reprepare_observer_backup;
copy_tables->trx->trx_start = FALSE;
+ copy_tables->trx->updated_in_this_trx = FALSE;
+ DBUG_PRINT("info",("spider trx->updated_in_this_trx=FALSE"));
my_printf_error(ER_SPIDER_UDF_CANT_OPEN_TABLE_NUM,
- ER_SPIDER_UDF_CANT_OPEN_TABLE_STR, MYF(0), table_list->db,
- table_list->table_name);
+ ER_SPIDER_UDF_CANT_OPEN_TABLE_STR, MYF(0),
+ SPIDER_TABLE_LIST_db_str(table_list),
+ SPIDER_TABLE_LIST_table_name_str(table_list));
goto error;
}
thd->m_reprepare_observer = reprepare_observer_backup;
copy_tables->trx->trx_start = FALSE;
+ copy_tables->trx->updated_in_this_trx = FALSE;
+ DBUG_PRINT("info",("spider trx->updated_in_this_trx=FALSE"));
table = table_list->table;
table_share = table->s;
@@ -1010,7 +1025,8 @@ long long spider_copy_tables_body(
{
my_printf_error(ER_SPIDER_UDF_COPY_TABLE_NEED_PK_NUM,
ER_SPIDER_UDF_COPY_TABLE_NEED_PK_STR, MYF(0),
- table_list->db, table_list->table_name);
+ SPIDER_TABLE_LIST_db_str(table_list),
+ SPIDER_TABLE_LIST_table_name_str(table_list));
goto error;
}
key_info = &table->key_info[table_share->primary_key];
diff --git a/storage/spider/spd_db_conn.cc b/storage/spider/spd_db_conn.cc
index 8d4e9acda07..424f22d46ee 100644
--- a/storage/spider/spd_db_conn.cc
+++ b/storage/spider/spd_db_conn.cc
@@ -1,4 +1,4 @@
-/* Copyright (C) 2008-2015 Kentoku Shiba
+/* Copyright (C) 2008-2018 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
@@ -14,7 +14,9 @@
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */
#define MYSQL_SERVER 1
+#include <my_global.h>
#include "mysql_version.h"
+#include "spd_environ.h"
#if MYSQL_VERSION_ID < 50500
#include "mysql_priv.h"
#include <mysql/plugin.h>
@@ -74,6 +76,9 @@ extern HASH spider_open_connections;
pthread_mutex_t spider_open_conn_mutex;
const char spider_dig_upper[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+/* UTC time zone for timestamp columns */
+Time_zone *UTC = 0;
+
int spider_db_connect(
const SPIDER_SHARE *share,
SPIDER_CONN *conn,
@@ -189,31 +194,30 @@ int spider_db_connect(
}
DBUG_RETURN(error_num);
}
+
conn->connect_error = 0;
conn->opened_handlers = 0;
conn->db_conn->reset_opened_handler();
++conn->connection_id;
+
+ /* Set the connection's time zone to UTC */
+ spider_conn_queue_UTC_time_zone(conn);
DBUG_RETURN(0);
}
-int spider_db_ping(
- ha_spider *spider,
+int spider_db_ping_internal(
+ SPIDER_SHARE *share,
SPIDER_CONN *conn,
- int link_idx
+ int all_link_idx,
+ int *need_mon
) {
int error_num;
- DBUG_ENTER("spider_db_ping");
-#ifndef DBUG_OFF
- if (spider->trx->thd)
- DBUG_PRINT("info", ("spider thd->query_id is %lld",
- spider->trx->thd->query_id));
-#endif
+ DBUG_ENTER("spider_db_ping_internal");
pthread_mutex_assert_owner(&conn->mta_conn_mutex);
DBUG_ASSERT(conn->mta_conn_mutex_file_pos.file_name);
if (conn->server_lost || conn->queued_connect)
{
- if ((error_num = spider_db_connect(spider->share, conn,
- spider->conn_link_idx[link_idx])))
+ if ((error_num = spider_db_connect(share, conn, all_link_idx)))
{
pthread_mutex_assert_owner(&conn->mta_conn_mutex);
DBUG_RETURN(error_num);
@@ -224,8 +228,7 @@ int spider_db_ping(
if ((error_num = conn->db_conn->ping()))
{
spider_db_disconnect(conn);
- if ((error_num = spider_db_connect(spider->share, conn,
- spider->conn_link_idx[link_idx])))
+ if ((error_num = spider_db_connect(share, conn, all_link_idx)))
{
DBUG_PRINT("info", ("spider conn=%p SERVER_LOST", conn));
conn->server_lost = TRUE;
@@ -246,6 +249,21 @@ int spider_db_ping(
DBUG_RETURN(0);
}
+int spider_db_ping(
+ ha_spider *spider,
+ SPIDER_CONN *conn,
+ int link_idx
+) {
+ DBUG_ENTER("spider_db_ping");
+#ifndef DBUG_OFF
+ if (spider->trx->thd)
+ DBUG_PRINT("info", ("spider thd->query_id is %lld",
+ spider->trx->thd->query_id));
+#endif
+ DBUG_RETURN(spider_db_ping_internal(spider->share, conn,
+ spider->conn_link_idx[link_idx], &spider->need_mons[link_idx]));
+}
+
void spider_db_disconnect(
SPIDER_CONN *conn
) {
@@ -716,11 +734,11 @@ int spider_db_errorno(
struct tm lt;
struct tm *l_time = localtime_r(&cur_time, &lt);
fprintf(stderr, "%04d%02d%02d %02d:%02d:%02d [WARN SPIDER RESULT] "
- "to %ld: %d %s\n",
+ "to %lld: %d %s\n",
l_time->tm_year + 1900, l_time->tm_mon + 1, l_time->tm_mday,
l_time->tm_hour, l_time->tm_min, l_time->tm_sec,
- (ulong) current_thd->thread_id, error_num,
- conn->db_conn->get_error());
+ (long long int) current_thd->thread_id, error_num,
+ conn->db_conn->get_error());
}
if (!conn->mta_conn_mutex_unlock_later)
{
@@ -738,11 +756,11 @@ int spider_db_errorno(
struct tm lt;
struct tm *l_time = localtime_r(&cur_time, &lt);
fprintf(stderr, "%04d%02d%02d %02d:%02d:%02d [ERROR SPIDER RESULT] "
- "to %ld: %d %s\n",
+ "to %lld: %d %s\n",
l_time->tm_year + 1900, l_time->tm_mon + 1, l_time->tm_mday,
l_time->tm_hour, l_time->tm_min, l_time->tm_sec,
- (ulong) current_thd->thread_id, error_num,
- conn->db_conn->get_error());
+ (long long int) current_thd->thread_id, error_num,
+ conn->db_conn->get_error());
}
if (!conn->mta_conn_mutex_unlock_later)
{
@@ -790,7 +808,7 @@ int spider_db_errorno(
"to %ld: %d %s\n",
l_time->tm_year + 1900, l_time->tm_mon + 1, l_time->tm_mday,
l_time->tm_hour, l_time->tm_min, l_time->tm_sec,
- current_thd->thread_id, conn->db_conn->get_errno(),
+ (ulong) current_thd->thread_id, conn->db_conn->get_errno(),
conn->db_conn->get_error());
}
*conn->need_mon = ER_SPIDER_HS_NUM;
@@ -915,6 +933,7 @@ int spider_db_query_with_set_names(
spider->trx,
spider->trx->thd,
share,
+ link_idx,
(uint32) share->monitoring_sid[link_idx],
share->table_name,
share->table_name_length,
@@ -946,6 +965,7 @@ int spider_db_query_with_set_names(
spider->trx,
spider->trx->thd,
share,
+ link_idx,
(uint32) share->monitoring_sid[link_idx],
share->table_name,
share->table_name_length,
@@ -967,7 +987,7 @@ int spider_db_query_for_bulk_update(
ha_spider *spider,
SPIDER_CONN *conn,
int link_idx,
- uint *dup_key_found
+ ha_rows *dup_key_found
) {
int error_num;
SPIDER_SHARE *share = spider->share;
@@ -995,6 +1015,7 @@ int spider_db_query_for_bulk_update(
spider->trx,
spider->trx->thd,
share,
+ link_idx,
(uint32) share->monitoring_sid[link_idx],
share->table_name,
share->table_name_length,
@@ -1034,6 +1055,7 @@ int spider_db_query_for_bulk_update(
spider->trx,
spider->trx->thd,
share,
+ link_idx,
(uint32) share->monitoring_sid[link_idx],
share->table_name,
share->table_name_length,
@@ -1080,6 +1102,7 @@ int spider_db_query_for_bulk_update(
spider->trx,
spider->trx->thd,
share,
+ link_idx,
(uint32) share->monitoring_sid[link_idx],
share->table_name,
share->table_name_length,
@@ -1325,16 +1348,42 @@ int spider_db_unlock_tables(
int spider_db_append_name_with_quote_str(
spider_string *str,
- char *name,
+ const char *name,
uint dbton_id
) {
- int error_num, length = strlen(name);
- char *name_end, head_code;
DBUG_ENTER("spider_db_append_name_with_quote_str");
+ DBUG_RETURN(spider_db_append_name_with_quote_str_internal(
+ str, name, strlen(name), dbton_id));
+}
+
+int spider_db_append_name_with_quote_str(
+ spider_string *str,
+ LEX_CSTRING &name,
+ uint dbton_id
+) {
+ DBUG_ENTER("spider_db_append_name_with_quote_str");
+ DBUG_RETURN(spider_db_append_name_with_quote_str_internal(
+ str, name.str, name.length, dbton_id));
+}
+
+int spider_db_append_name_with_quote_str_internal(
+ spider_string *str,
+ const char *name,
+ int length,
+ uint dbton_id
+) {
+ int error_num;
+ const char *name_end;
+ char head_code;
+ DBUG_ENTER("spider_db_append_name_with_quote_str_internal");
for (name_end = name + length; name < name_end; name += length)
{
head_code = *name;
- if ((length= my_charlen(system_charset_info, name, name_end)) < 1)
+#ifdef SPIDER_HAS_MY_CHARLEN
+ if ((length = my_charlen(system_charset_info, name, name_end)) < 1)
+#else
+ if (!(length = my_mbcharlen(system_charset_info, (uchar) head_code)))
+#endif
{
my_message(ER_SPIDER_WRONG_CHARACTER_IN_NAME_NUM,
ER_SPIDER_WRONG_CHARACTER_IN_NAME_STR, MYF(0));
@@ -1629,8 +1678,13 @@ int spider_db_append_key_where_internal(
if (sql_kind == SPIDER_SQL_KIND_HANDLER)
{
- char *key_name = key_info->name;
+#ifdef SPIDER_use_LEX_CSTRING_for_KEY_Field_name
+ const char *key_name = key_info->name.str;
+ key_name_length = key_info->name.length;
+#else
+ const char *key_name = key_info->name;
key_name_length = strlen(key_name);
+#endif
if (str->reserve(SPIDER_SQL_READ_LEN +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + key_name_length))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
@@ -2612,7 +2666,7 @@ int spider_db_fetch_for_item_sum_func(
thd->free_list = free_list;
}
- Item_sum_hybrid *item_hybrid = (Item_sum_hybrid *) item_sum;
+ Item_sum_min_max *item_sum_min_max = (Item_sum_min_max *) item_sum;
Item_string *item =
(Item_string *) spider->direct_aggregate_item_current->item;
if (row->is_null())
@@ -2639,7 +2693,7 @@ int spider_db_fetch_for_item_sum_func(
#endif
item->null_value = FALSE;
}
- item_hybrid->direct_add(item);
+ item_sum_min_max->direct_add(item);
row->next();
}
break;
@@ -2807,12 +2861,20 @@ int spider_db_fetch_row(
my_ptrdiff_t ptr_diff
) {
int error_num;
+ THD *thd = field->table->in_use;
+ Time_zone *saved_time_zone = thd->variables.time_zone;
DBUG_ENTER("spider_db_fetch_row");
- DBUG_PRINT("info", ("spider field_name %s", field->field_name));
+ DBUG_PRINT("info", ("spider field_name %s", SPIDER_field_name_str(field)));
DBUG_PRINT("info", ("spider fieldcharset %s", field->charset()->csname));
+
+ thd->variables.time_zone = UTC;
+
field->move_field_offset(ptr_diff);
error_num = row->store_to_field(field, share->access_charset);
field->move_field_offset(-ptr_diff);
+
+ thd->variables.time_zone = saved_time_zone;
+
DBUG_RETURN(error_num);
}
@@ -2844,6 +2906,11 @@ int spider_db_fetch_table(
} else {
if (result_list->current_row_num < result_list->quick_page_size)
{
+ if (!current->first_position)
+ {
+ table->status = STATUS_NOT_FOUND;
+ DBUG_RETURN(HA_ERR_END_OF_FILE);
+ }
row = current->first_position[result_list->current_row_num].row;
} else {
if ((error_num = spider_db_get_row_from_tmp_tbl(
@@ -2900,9 +2967,16 @@ int spider_db_fetch_table(
}
#endif
- if ((error_num = spider_db_append_match_fetch(spider,
- spider->ft_first, spider->ft_current, row)))
- DBUG_RETURN(error_num);
+#ifdef SPIDER_HAS_GROUP_BY_HANDLER
+ if (!spider->use_fields)
+ {
+#endif
+ if ((error_num = spider_db_append_match_fetch(spider,
+ spider->ft_first, spider->ft_current, row)))
+ DBUG_RETURN(error_num);
+#ifdef SPIDER_HAS_GROUP_BY_HANDLER
+ }
+#endif
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
} else {
if (!(row = result_list->hs_result->fetch_row_from_result_buffer(
@@ -2931,13 +3005,17 @@ int spider_db_fetch_table(
MY_BITMAP *tmp_map =
dbug_tmp_use_all_columns(table, &table->write_set);
#endif
- DBUG_PRINT("info", ("spider bitmap is set %s", (*field)->field_name));
+ DBUG_PRINT("info", ("spider bitmap is set %s",
+ SPIDER_field_name_str(*field)));
if ((error_num =
spider_db_fetch_row(share, *field, row, ptr_diff)))
DBUG_RETURN(error_num);
#ifndef DBUG_OFF
dbug_tmp_restore_column_map(&table->write_set, tmp_map);
#endif
+ } else {
+ DBUG_PRINT("info", ("spider bitmap is not set %s",
+ SPIDER_field_name_str(*field)));
}
row->next();
}
@@ -3034,6 +3112,11 @@ int spider_db_fetch_key(
} else {
if (result_list->current_row_num < result_list->quick_page_size)
{
+ if (!current->first_position)
+ {
+ table->status = STATUS_NOT_FOUND;
+ DBUG_RETURN(HA_ERR_END_OF_FILE);
+ }
row = current->first_position[result_list->current_row_num].row;
} else {
if ((error_num = spider_db_get_row_from_tmp_tbl(
@@ -3102,7 +3185,8 @@ int spider_db_fetch_key(
MY_BITMAP *tmp_map =
dbug_tmp_use_all_columns(table, &table->write_set);
#endif
- DBUG_PRINT("info", ("spider bitmap is set %s", field->field_name));
+ DBUG_PRINT("info", ("spider bitmap is set %s",
+ SPIDER_field_name_str(field)));
if ((error_num =
spider_db_fetch_row(share, field, row, ptr_diff)))
DBUG_RETURN(error_num);
@@ -3141,6 +3225,15 @@ int spider_db_fetch_minimum_columns(
} else {
if (result_list->current_row_num < result_list->quick_page_size)
{
+ DBUG_PRINT("info", ("spider current=%p", current));
+ DBUG_PRINT("info", ("spider first_position=%p", current->first_position));
+ if (!current->first_position)
+ {
+ table->status = STATUS_NOT_FOUND;
+ DBUG_RETURN(HA_ERR_END_OF_FILE);
+ }
+ DBUG_PRINT("info", ("spider current_row_num=%lld", result_list->current_row_num));
+ DBUG_PRINT("info", ("spider first_position[]=%p", &current->first_position[result_list->current_row_num]));
row = current->first_position[result_list->current_row_num].row;
} else {
if ((error_num = spider_db_get_row_from_tmp_tbl(
@@ -3216,7 +3309,8 @@ int spider_db_fetch_minimum_columns(
MY_BITMAP *tmp_map =
dbug_tmp_use_all_columns(table, &table->write_set);
#endif
- DBUG_PRINT("info", ("spider bitmap is set %s", (*field)->field_name));
+ DBUG_PRINT("info", ("spider bitmap is set %s",
+ SPIDER_field_name_str(*field)));
if ((error_num = spider_db_fetch_row(share, *field, row, ptr_diff)))
DBUG_RETURN(error_num);
#ifndef DBUG_OFF
@@ -3358,6 +3452,22 @@ void spider_db_free_one_result(
DBUG_VOID_RETURN;
}
+void spider_db_free_one_quick_result(
+ SPIDER_RESULT *result
+) {
+ DBUG_ENTER("spider_db_free_one_quick_result");
+ if (result && result->result)
+ {
+ result->result->free_result();
+ if (!result->result_tmp_tbl)
+ {
+ delete result->result;
+ result->result = NULL;
+ }
+ }
+ DBUG_VOID_RETURN;
+}
+
int spider_db_free_result(
ha_spider *spider,
bool final
@@ -3864,6 +3974,7 @@ int spider_db_store_result(
SPIDER_DB_ROW *row;
if (!(row = current->result->fetch_row()))
{
+ error_num = current->result->get_errno();
DBUG_PRINT("info",("spider set finish_flg point 3"));
DBUG_PRINT("info",("spider current->finish_flg = TRUE"));
DBUG_PRINT("info",("spider result_list->finish_flg = TRUE"));
@@ -3883,18 +3994,32 @@ int spider_db_store_result(
) {
result_list->current_row_num = 0;
table->status = STATUS_NOT_FOUND;
- } else if (result_list->quick_phase > 0)
+ }
+ if (error_num)
+ DBUG_RETURN(error_num);
+ else if (result_list->quick_phase > 0)
DBUG_RETURN(0);
DBUG_RETURN(HA_ERR_END_OF_FILE);
}
SPIDER_DB_ROW *tmp_row;
uint field_count = current->result->num_fields();
SPIDER_POSITION *position;
- longlong page_size =
- !result_list->quick_page_size ||
- result_list->limit_num < result_list->quick_page_size ?
- result_list->limit_num : result_list->quick_page_size;
+ longlong page_size;
int roop_count = 0;
+ if (!result_list->quick_page_size)
+ {
+ if (result_list->quick_mode == 3)
+ {
+ page_size = 0;
+ } else {
+ result_list->quick_page_size = result_list->limit_num;
+ page_size = result_list->limit_num;
+ }
+ } else {
+ page_size =
+ result_list->limit_num < result_list->quick_page_size ?
+ result_list->limit_num : result_list->quick_page_size;
+ }
current->field_count = field_count;
if (!(position = (SPIDER_POSITION *)
spider_bulk_malloc(spider_current_trx, 7, MYF(MY_WME | MY_ZEROFILL),
@@ -3906,22 +4031,56 @@ int spider_db_store_result(
current->pos_page_size = (int) page_size;
current->first_position = position;
current->tmp_tbl_row = tmp_row;
- do {
- if (!(position->row = row->clone()))
+ if (result_list->quick_mode == 3)
+ {
+ while (page_size > roop_count && row)
{
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ if (result_list->quick_page_byte < row->get_byte_size())
+ {
+ current->pos_page_size = roop_count;
+ page_size = roop_count;
+ result_list->quick_page_size = roop_count;
+ result_list->quick_page_byte = 0;
+ break;
+ } else {
+ result_list->quick_page_byte -= row->get_byte_size();
+ }
+ if (!(position->row = row->clone()))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ position++;
+ roop_count++;
+ row = current->result->fetch_row();
}
- position++;
- roop_count++;
- } while (
- page_size > roop_count &&
- (row = current->result->fetch_row())
- );
+ } else {
+ do {
+ if (!(position->row = row->clone()))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ position++;
+ roop_count++;
+ if (result_list->quick_page_byte < row->get_byte_size())
+ {
+ current->pos_page_size = roop_count;
+ page_size = roop_count;
+ result_list->quick_page_size = roop_count;
+ result_list->quick_page_byte = 0;
+ break;
+ } else {
+ result_list->quick_page_byte -= row->get_byte_size();
+ }
+ } while (
+ page_size > roop_count &&
+ (row = current->result->fetch_row())
+ );
+ }
if (
result_list->quick_mode == 3 &&
page_size == roop_count &&
result_list->limit_num > roop_count &&
- (row = current->result->fetch_row())
+ row
) {
THD *thd = current_thd;
char buf[MAX_FIELD_WIDTH];
@@ -3930,9 +4089,18 @@ int spider_db_store_result(
DBUG_PRINT("info",("spider store result to temporary table"));
DBUG_ASSERT(!current->result_tmp_tbl);
+#ifdef SPIDER_use_LEX_CSTRING_for_Field_blob_constructor
+ LEX_CSTRING field_name1 = {STRING_WITH_LEN("a")};
+ LEX_CSTRING field_name2 = {STRING_WITH_LEN("b")};
+ LEX_CSTRING field_name3 = {STRING_WITH_LEN("c")};
+ if (!(current->result_tmp_tbl = spider_mk_sys_tmp_table_for_result(
+ thd, table, &current->result_tmp_tbl_prm, &field_name1, &field_name2,
+ &field_name3, &my_charset_bin)))
+#else
if (!(current->result_tmp_tbl = spider_mk_sys_tmp_table_for_result(
thd, table, &current->result_tmp_tbl_prm, "a", "b", "c",
&my_charset_bin)))
+#endif
{
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
@@ -3958,7 +4126,11 @@ int spider_db_store_result(
result_list->record_num += roop_count;
if (
result_list->internal_limit <= result_list->record_num ||
- page_size > roop_count
+ page_size > roop_count ||
+ (
+ result_list->quick_mode == 3 &&
+ result_list->limit_num > roop_count
+ )
) {
DBUG_PRINT("info",("spider set finish_flg point 4"));
DBUG_PRINT("info",("spider current->finish_flg = TRUE"));
@@ -3988,6 +4160,10 @@ int spider_db_store_result(
conn->quick_target = NULL;
spider->quick_targets[link_idx] = NULL;
}
+#ifndef WITHOUT_SPIDER_BG_SEARCH
+ DBUG_PRINT("info", ("spider bgs_phase=%d", result_list->bgs_phase));
+#endif
+ DBUG_PRINT("info", ("spider quick_phase=%d", result_list->quick_phase));
if (
#ifndef WITHOUT_SPIDER_BG_SEARCH
result_list->bgs_phase <= 1 &&
@@ -3996,6 +4172,12 @@ int spider_db_store_result(
) {
result_list->current_row_num = 0;
}
+ DBUG_PRINT("info", ("spider result_list->current=%p", result_list->current));
+ DBUG_PRINT("info", ("spider current=%p", current));
+ DBUG_PRINT("info", ("spider first_position=%p", current->first_position));
+ DBUG_PRINT("info", ("spider current_row_num=%lld", result_list->current_row_num));
+ DBUG_PRINT("info", ("spider first_position[]=%p", &current->first_position[result_list->current_row_num]));
+ DBUG_PRINT("info", ("spider row=%p", current->first_position[result_list->current_row_num].row));
}
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
} else {
@@ -4239,39 +4421,74 @@ int spider_db_seek_next(
spider_db_free_one_result(result_list,
(SPIDER_RESULT*) result_list->current);
- int roop_start, roop_end, roop_count, lock_mode, link_ok;
- lock_mode = spider_conn_lock_mode(spider);
- if (lock_mode)
+ int roop_start = 0, roop_end = 1, roop_count, lock_mode, link_ok = 0;
+#ifdef SPIDER_HAS_GROUP_BY_HANDLER
+ if (!spider->use_fields)
{
- /* "for update" or "lock in share mode" */
- link_ok = spider_conn_link_idx_next(share->link_statuses,
- spider->conn_link_idx, -1, share->link_count,
- SPIDER_LINK_STATUS_OK);
- roop_start = spider_conn_link_idx_next(share->link_statuses,
- spider->conn_link_idx, -1, share->link_count,
- SPIDER_LINK_STATUS_RECOVERY);
- roop_end = spider->share->link_count;
- } else {
- link_ok = link_idx;
- roop_start = link_idx;
- roop_end = link_idx + 1;
+#endif
+ lock_mode = spider_conn_lock_mode(spider);
+ if (lock_mode)
+ {
+ /* "for update" or "lock in share mode" */
+ link_ok = spider_conn_link_idx_next(share->link_statuses,
+ spider->conn_link_idx, -1, share->link_count,
+ SPIDER_LINK_STATUS_OK);
+ roop_start = spider_conn_link_idx_next(share->link_statuses,
+ spider->conn_link_idx, -1, share->link_count,
+ SPIDER_LINK_STATUS_RECOVERY);
+ roop_end = spider->share->link_count;
+ } else {
+ link_ok = link_idx;
+ roop_start = link_idx;
+ roop_end = link_idx + 1;
+ }
+#ifdef SPIDER_HAS_GROUP_BY_HANDLER
}
+#endif
#ifndef WITHOUT_SPIDER_BG_SEARCH
if (result_list->bgs_phase > 0)
{
- for (roop_count = roop_start; roop_count < roop_end;
- roop_count = spider_conn_link_idx_next(share->link_statuses,
- spider->conn_link_idx, roop_count, share->link_count,
- SPIDER_LINK_STATUS_RECOVERY)
- ) {
- if ((error_num = spider_bg_conn_search(spider, roop_count, roop_start,
- FALSE, FALSE, (roop_count != link_ok))))
+#ifdef SPIDER_HAS_GROUP_BY_HANDLER
+ if (spider->use_fields)
+ {
+ SPIDER_LINK_IDX_CHAIN *link_idx_chain;
+ SPIDER_LINK_IDX_HOLDER *link_idx_holder;
+ spider_fields *fields = spider->fields;
+ fields->set_pos_to_first_link_idx_chain();
+ while ((link_idx_chain = fields->get_next_link_idx_chain()))
{
- DBUG_PRINT("info",("spider error_num 1=%d", error_num));
- DBUG_RETURN(error_num);
+ conn = link_idx_chain->conn;
+ link_idx_holder = link_idx_chain->link_idx_holder;
+ spider_db_handler *dbton_hdl =
+ spider->dbton_handler[conn->dbton_id];
+ spider->link_idx_chain = link_idx_chain;
+ if ((error_num = spider_bg_conn_search(spider,
+ link_idx_holder->link_idx, dbton_hdl->first_link_idx,
+ FALSE, FALSE,
+ !fields->is_first_link_ok_chain(link_idx_chain))))
+ {
+ DBUG_PRINT("info",("spider error_num 1=%d", error_num));
+ DBUG_RETURN(error_num);
+ }
}
+ } else {
+#endif
+ for (roop_count = roop_start; roop_count < roop_end;
+ roop_count = spider_conn_link_idx_next(share->link_statuses,
+ spider->conn_link_idx, roop_count, share->link_count,
+ SPIDER_LINK_STATUS_RECOVERY)
+ ) {
+ if ((error_num = spider_bg_conn_search(spider, roop_count, roop_start,
+ FALSE, FALSE, (roop_count != link_ok))))
+ {
+ DBUG_PRINT("info",("spider error_num 1=%d", error_num));
+ DBUG_RETURN(error_num);
+ }
+ }
+#ifdef SPIDER_HAS_GROUP_BY_HANDLER
}
+#endif
} else {
#endif
if (result_list->current == result_list->bgs_current)
@@ -4323,121 +4540,166 @@ int spider_db_seek_next(
}
}
- for (roop_count = roop_start; roop_count < roop_end;
- roop_count = spider_conn_link_idx_next(share->link_statuses,
- spider->conn_link_idx, roop_count, share->link_count,
- SPIDER_LINK_STATUS_RECOVERY)
- ) {
- ulong sql_type;
- conn = spider->conns[roop_count];
- if (spider->sql_kind[roop_count] == SPIDER_SQL_KIND_SQL)
+#ifdef SPIDER_HAS_GROUP_BY_HANDLER
+ if (spider->use_fields)
+ {
+ SPIDER_LINK_IDX_CHAIN *link_idx_chain;
+ SPIDER_LINK_IDX_HOLDER *link_idx_holder;
+ spider_fields *fields = spider->fields;
+ fields->set_pos_to_first_link_idx_chain();
+ while ((link_idx_chain = fields->get_next_link_idx_chain()))
{
+ ulong sql_type;
+ conn = link_idx_chain->conn;
sql_type = SPIDER_SQL_TYPE_SELECT_SQL;
- } else {
- sql_type = SPIDER_SQL_TYPE_HANDLER;
- }
- spider_db_handler *dbton_handler =
- spider->dbton_handler[conn->dbton_id];
- if (dbton_handler->need_lock_before_set_sql_for_exec(sql_type))
- {
- pthread_mutex_lock(&conn->mta_conn_mutex);
- SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
- }
- if ((error_num = dbton_handler->set_sql_for_exec(sql_type,
- roop_count)))
- {
- DBUG_PRINT("info",("spider error_num 6=%d", error_num));
- DBUG_RETURN(error_num);
- }
- if (!dbton_handler->need_lock_before_set_sql_for_exec(sql_type))
- {
- pthread_mutex_lock(&conn->mta_conn_mutex);
- SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
- }
- conn->need_mon = &spider->need_mons[roop_count];
- DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
- DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
- conn->mta_conn_mutex_lock_already = TRUE;
- conn->mta_conn_mutex_unlock_later = TRUE;
- if ((error_num = spider_db_set_names(spider, conn, roop_count)))
- {
- DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
- DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
- 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 (
- share->monitoring_kind[roop_count] &&
- spider->need_mons[roop_count]
+ link_idx_holder = link_idx_chain->link_idx_holder;
+ link_idx = link_idx_holder->link_idx;
+ spider_db_handler *dbton_handler =
+ spider->dbton_handler[conn->dbton_id];
+ pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
+ if (dbton_handler->need_lock_before_set_sql_for_exec(sql_type))
+ {
+ pthread_mutex_lock(&conn->mta_conn_mutex);
+ SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ }
+ if ((error_num = dbton_handler->set_sql_for_exec(sql_type,
+ link_idx)))
+ {
+ if (dbton_handler->need_lock_before_set_sql_for_exec(sql_type))
+ {
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ }
+ DBUG_PRINT("info",("spider error_num 6=%d", error_num));
+ DBUG_RETURN(error_num);
+ }
+ if (!dbton_handler->need_lock_before_set_sql_for_exec(sql_type))
+ {
+ 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];
+ DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
+ DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
+ 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)))
+ {
+ DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
+ DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
+ 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 (
+ spider->need_mons[link_idx]
+ ) {
+ error_num = fields->ping_table_mon_from_table(link_idx_chain);
+ }
+ DBUG_PRINT("info",("spider error_num 7a=%d", error_num));
+ DBUG_RETURN(error_num);
+ }
+ spider_conn_set_timeout_from_share(conn, link_idx,
+ spider->trx->thd, share);
+ if (dbton_handler->execute_sql(
+ sql_type,
+ conn,
+ result_list->quick_mode,
+ &spider->need_mons[link_idx])
) {
- error_num = spider_ping_table_mon_from_table(
- spider->trx,
- spider->trx->thd,
- share,
- (uint32) share->monitoring_sid[roop_count],
- share->table_name,
- share->table_name_length,
- spider->conn_link_idx[roop_count],
- NULL,
- 0,
- share->monitoring_kind[roop_count],
- share->monitoring_limit[roop_count],
- share->monitoring_flag[roop_count],
- TRUE
- );
+ DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
+ DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ error_num = spider_db_errorno(conn);
+ if (
+ spider->need_mons[link_idx]
+ ) {
+ error_num = fields->ping_table_mon_from_table(link_idx_chain);
+ }
+ DBUG_PRINT("info",("spider error_num 8a=%d", error_num));
+ DBUG_RETURN(error_num);
}
- DBUG_PRINT("info",("spider error_num 7=%d", error_num));
- DBUG_RETURN(error_num);
- }
- spider_conn_set_timeout_from_share(conn, roop_count,
- spider->trx->thd, share);
- if (dbton_handler->execute_sql(
- sql_type,
- conn,
- result_list->quick_mode,
- &spider->need_mons[roop_count])
- ) {
+ spider->connection_ids[link_idx] = conn->connection_id;
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
- error_num = spider_db_errorno(conn);
- if (
- share->monitoring_kind[roop_count] &&
- spider->need_mons[roop_count]
- ) {
- error_num = spider_ping_table_mon_from_table(
- spider->trx,
- spider->trx->thd,
- share,
- (uint32) share->monitoring_sid[roop_count],
- share->table_name,
- share->table_name_length,
- spider->conn_link_idx[roop_count],
- NULL,
- 0,
- share->monitoring_kind[roop_count],
- share->monitoring_limit[roop_count],
- share->monitoring_flag[roop_count],
- TRUE
- );
+ if (fields->is_first_link_ok_chain(link_idx_chain))
+ {
+ if ((error_num = spider_db_store_result(spider, link_idx,
+ table)))
+ {
+ if (
+ error_num != HA_ERR_END_OF_FILE &&
+ spider->need_mons[link_idx]
+ ) {
+ error_num =
+ fields->ping_table_mon_from_table(link_idx_chain);
+ }
+ DBUG_PRINT("info",("spider error_num 9a=%d", error_num));
+ DBUG_RETURN(error_num);
+ }
+ spider->result_link_idx = link_ok;
+ } else {
+ spider_db_discard_result(spider, link_idx, conn);
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
}
- DBUG_PRINT("info",("spider error_num 8=%d", error_num));
- DBUG_RETURN(error_num);
}
- spider->connection_ids[roop_count] = conn->connection_id;
- DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
- DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- if (roop_count == link_ok)
- {
- if ((error_num = spider_db_store_result(spider, roop_count,
- table)))
+ } else {
+#endif
+ for (roop_count = roop_start; roop_count < roop_end;
+ roop_count = spider_conn_link_idx_next(share->link_statuses,
+ spider->conn_link_idx, roop_count, share->link_count,
+ SPIDER_LINK_STATUS_RECOVERY)
+ ) {
+ ulong sql_type;
+ conn = spider->conns[roop_count];
+ if (spider->sql_kind[roop_count] == SPIDER_SQL_KIND_SQL)
{
+ sql_type = SPIDER_SQL_TYPE_SELECT_SQL;
+ } else {
+ sql_type = SPIDER_SQL_TYPE_HANDLER;
+ }
+ spider_db_handler *dbton_handler =
+ spider->dbton_handler[conn->dbton_id];
+ pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
+ if (dbton_handler->need_lock_before_set_sql_for_exec(sql_type))
+ {
+ pthread_mutex_lock(&conn->mta_conn_mutex);
+ SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ }
+ if ((error_num = dbton_handler->set_sql_for_exec(sql_type,
+ roop_count)))
+ {
+ if (dbton_handler->need_lock_before_set_sql_for_exec(sql_type))
+ {
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ }
+ DBUG_PRINT("info",("spider error_num 6=%d", error_num));
+ DBUG_RETURN(error_num);
+ }
+ if (!dbton_handler->need_lock_before_set_sql_for_exec(sql_type))
+ {
+ pthread_mutex_lock(&conn->mta_conn_mutex);
+ SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ }
+ conn->need_mon = &spider->need_mons[roop_count];
+ DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
+ DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
+ conn->mta_conn_mutex_lock_already = TRUE;
+ conn->mta_conn_mutex_unlock_later = TRUE;
+ if ((error_num = spider_db_set_names(spider, conn, roop_count)))
+ {
+ DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
+ DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
+ 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 != HA_ERR_END_OF_FILE &&
share->monitoring_kind[roop_count] &&
spider->need_mons[roop_count]
) {
@@ -4445,6 +4707,7 @@ int spider_db_seek_next(
spider->trx,
spider->trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -4457,16 +4720,91 @@ int spider_db_seek_next(
TRUE
);
}
- DBUG_PRINT("info",("spider error_num 9=%d", error_num));
+ DBUG_PRINT("info",("spider error_num 7=%d", error_num));
DBUG_RETURN(error_num);
}
- spider->result_link_idx = link_ok;
- } else {
- spider_db_discard_result(spider, roop_count, conn);
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
+ spider_conn_set_timeout_from_share(conn, roop_count,
+ spider->trx->thd, share);
+ if (dbton_handler->execute_sql(
+ sql_type,
+ conn,
+ result_list->quick_mode,
+ &spider->need_mons[roop_count])
+ ) {
+ DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
+ DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ error_num = spider_db_errorno(conn);
+ if (
+ share->monitoring_kind[roop_count] &&
+ spider->need_mons[roop_count]
+ ) {
+ error_num = spider_ping_table_mon_from_table(
+ spider->trx,
+ spider->trx->thd,
+ share,
+ roop_count,
+ (uint32) share->monitoring_sid[roop_count],
+ share->table_name,
+ share->table_name_length,
+ spider->conn_link_idx[roop_count],
+ NULL,
+ 0,
+ share->monitoring_kind[roop_count],
+ share->monitoring_limit[roop_count],
+ share->monitoring_flag[roop_count],
+ TRUE
+ );
+ }
+ DBUG_PRINT("info",("spider error_num 8=%d", error_num));
+ DBUG_RETURN(error_num);
+ }
+ spider->connection_ids[roop_count] = conn->connection_id;
+ DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
+ DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ if (roop_count == link_ok)
+ {
+ if ((error_num = spider_db_store_result(spider, roop_count,
+ table)))
+ {
+ if (
+ error_num != HA_ERR_END_OF_FILE &&
+ share->monitoring_kind[roop_count] &&
+ spider->need_mons[roop_count]
+ ) {
+ error_num = spider_ping_table_mon_from_table(
+ spider->trx,
+ spider->trx->thd,
+ share,
+ roop_count,
+ (uint32) share->monitoring_sid[roop_count],
+ share->table_name,
+ share->table_name_length,
+ spider->conn_link_idx[roop_count],
+ NULL,
+ 0,
+ share->monitoring_kind[roop_count],
+ share->monitoring_limit[roop_count],
+ share->monitoring_flag[roop_count],
+ TRUE
+ );
+ }
+ DBUG_PRINT("info",("spider error_num 9=%d", error_num));
+ DBUG_RETURN(error_num);
+ }
+ spider->result_link_idx = link_ok;
+ } else {
+ spider_db_discard_result(spider, roop_count, conn);
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ }
}
+#ifdef SPIDER_HAS_GROUP_BY_HANDLER
}
+#endif
} else {
spider->connection_ids[link_idx] = conn->connection_id;
pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
@@ -4639,6 +4977,7 @@ int spider_db_seek_last(
spider->trx,
spider->trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -4674,6 +5013,7 @@ int spider_db_seek_last(
spider->trx,
spider->trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -4706,6 +5046,7 @@ int spider_db_seek_last(
spider->trx,
spider->trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -4853,6 +5194,7 @@ int spider_db_seek_last(
spider->trx,
spider->trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -4888,6 +5230,7 @@ int spider_db_seek_last(
spider->trx,
spider->trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -4920,6 +5263,7 @@ int spider_db_seek_last(
spider->trx,
spider->trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -5131,7 +5475,8 @@ int spider_db_seek_tmp_table(
MY_BITMAP *tmp_map =
dbug_tmp_use_all_columns(table, &table->write_set);
#endif
- DBUG_PRINT("info", ("spider bitmap is set %s", (*field)->field_name));
+ DBUG_PRINT("info", ("spider bitmap is set %s",
+ SPIDER_field_name_str(*field)));
if ((error_num =
spider_db_fetch_row(spider->share, *field, row, ptr_diff)))
DBUG_RETURN(error_num);
@@ -5218,7 +5563,8 @@ int spider_db_seek_tmp_key(
MY_BITMAP *tmp_map =
dbug_tmp_use_all_columns(table, &table->write_set);
#endif
- DBUG_PRINT("info", ("spider bitmap is set %s", field->field_name));
+ DBUG_PRINT("info", ("spider bitmap is set %s",
+ SPIDER_field_name_str(field)));
if ((error_num =
spider_db_fetch_row(spider->share, field, row, ptr_diff)))
DBUG_RETURN(error_num);
@@ -5308,7 +5654,8 @@ int spider_db_seek_tmp_minimum_columns(
MY_BITMAP *tmp_map =
dbug_tmp_use_all_columns(table, &table->write_set);
#endif
- DBUG_PRINT("info", ("spider bitmap is set %s", (*field)->field_name));
+ DBUG_PRINT("info", ("spider bitmap is set %s",
+ SPIDER_field_name_str(*field)));
if ((error_num =
spider_db_fetch_row(spider->share, *field, row, ptr_diff)))
DBUG_RETURN(error_num);
@@ -5320,7 +5667,7 @@ int spider_db_seek_tmp_minimum_columns(
else if (bitmap_is_set(table->read_set, (*field)->field_index))
{
DBUG_PRINT("info", ("spider bitmap is cleared %s",
- (*field)->field_name));
+ SPIDER_field_name_str(*field)));
bitmap_clear_bit(table->read_set, (*field)->field_index);
}
}
@@ -5522,6 +5869,7 @@ int spider_db_bulk_insert_init(
spider->trx,
spider->trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -5679,6 +6027,7 @@ int spider_db_bulk_insert(
spider->trx,
spider->trx->thd,
share,
+ roop_count2,
(uint32) share->monitoring_sid[roop_count2],
share->table_name,
share->table_name_length,
@@ -5725,6 +6074,7 @@ int spider_db_bulk_insert(
spider->trx,
spider->trx->thd,
share,
+ roop_count2,
(uint32) share->monitoring_sid[roop_count2],
share->table_name,
share->table_name_length,
@@ -6094,7 +6444,7 @@ int spider_db_bulk_update_size_limit(
SPIDER_SHARE *share = spider->share;
SPIDER_RESULT_LIST *result_list = &spider->result_list;
SPIDER_CONN *conn;
- uint dup_key_found = 0;
+ ha_rows dup_key_found = 0;
DBUG_ENTER("spider_db_bulk_update_size_limit");
if (result_list->bulk_update_mode == 1)
@@ -6168,7 +6518,7 @@ error_mk_table:
int spider_db_bulk_update_end(
ha_spider *spider,
- uint *dup_key_found
+ ha_rows *dup_key_found
) {
int error_num = 0, error_num2, roop_count;
THD *thd = spider->trx->thd;
@@ -6409,6 +6759,7 @@ int spider_db_update(
spider->trx,
spider->trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -6447,6 +6798,7 @@ int spider_db_update(
spider->trx,
spider->trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -6503,6 +6855,7 @@ int spider_db_update(
spider->trx,
spider->trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -6531,12 +6884,13 @@ int spider_db_update(
}
#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
+#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS_WITH_HS
int spider_db_direct_update(
ha_spider *spider,
TABLE *table,
KEY_MULTI_RANGE *ranges,
uint range_count,
- uint *update_rows
+ ha_rows *update_rows
) {
int error_num, roop_count;
SPIDER_SHARE *share = spider->share;
@@ -6756,6 +7110,7 @@ int spider_db_direct_update(
spider->trx,
spider->trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -6797,6 +7152,7 @@ int spider_db_direct_update(
spider->trx,
spider->trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -6818,7 +7174,7 @@ int spider_db_direct_update(
if (!counted)
{
*update_rows = spider->conns[roop_count]->db_conn->affected_rows();
- DBUG_PRINT("info", ("spider update_rows = %u", *update_rows));
+ DBUG_PRINT("info", ("spider update_rows = %llu", *update_rows));
counted = TRUE;
}
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
@@ -6839,7 +7195,7 @@ int spider_db_direct_update(
if (!counted)
{
*update_rows = conn->db_conn->affected_rows();
- DBUG_PRINT("info", ("spider update_rows = %u", *update_rows));
+ DBUG_PRINT("info", ("spider update_rows = %llu", *update_rows));
counted = TRUE;
}
result->free_result();
@@ -6877,12 +7233,237 @@ int spider_db_direct_update(
#endif
DBUG_RETURN(0);
}
+#else
+int spider_db_direct_update(
+ ha_spider *spider,
+ TABLE *table,
+ ha_rows *update_rows
+) {
+ int error_num, roop_count;
+ SPIDER_SHARE *share = spider->share;
+ SPIDER_CONN *conn;
+ SPIDER_RESULT_LIST *result_list = &spider->result_list;
+ bool counted = FALSE;
+ st_select_lex *select_lex;
+ longlong select_limit;
+ longlong offset_limit;
+ DBUG_ENTER("spider_db_direct_update");
+
+ spider_set_result_list_param(spider);
+ result_list->finish_flg = FALSE;
+ DBUG_PRINT("info", ("spider do_direct_update=%s",
+ spider->do_direct_update ? "TRUE" : "FALSE"));
+ DBUG_PRINT("info", ("spider direct_update_kinds=%u",
+ spider->direct_update_kinds));
+ if ((error_num = spider->append_update_sql_part()))
+ DBUG_RETURN(error_num);
+
+/*
+ SQL access -> SQL remote access
+ !spider->do_direct_update &&
+ (spider->sql_kinds & SPIDER_SQL_KIND_SQL)
+
+ SQL access -> SQL remote access with dirct_update
+ spider->do_direct_update &&
+ spider->direct_update_kinds == SPIDER_SQL_KIND_SQL &&
+ spider->direct_update_fields
+*/
+
+#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
+ if (!spider->do_direct_update)
+ {
+#endif
+ if (
+ (spider->sql_kinds & SPIDER_SQL_KIND_SQL) &&
+ (error_num = spider->append_update_set_sql_part())
+ ) {
+ DBUG_RETURN(error_num);
+ }
+#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
+ } else {
+ if (
+ (spider->direct_update_kinds & SPIDER_SQL_KIND_SQL) &&
+ (error_num = spider->append_direct_update_set_sql_part())
+ ) {
+ DBUG_RETURN(error_num);
+ }
+ }
+#endif
+
+ result_list->desc_flg = FALSE;
+ result_list->sorted = TRUE;
+ if (spider->active_index == MAX_KEY)
+ result_list->key_info = NULL;
+ else
+ result_list->key_info = &table->key_info[spider->active_index];
+ spider_get_select_limit(spider, &select_lex, &select_limit, &offset_limit);
+ result_list->limit_num =
+ result_list->internal_limit >= select_limit ?
+ select_limit : result_list->internal_limit;
+ result_list->internal_offset += offset_limit;
+ if (spider->direct_update_kinds & SPIDER_SQL_KIND_SQL)
+ {
+ if (
+ (error_num = spider->append_key_where_sql_part(
+ NULL,
+ NULL,
+ SPIDER_SQL_TYPE_UPDATE_SQL)) ||
+ (error_num = spider->
+ append_key_order_for_direct_order_limit_with_alias_sql_part(
+ NULL, 0, SPIDER_SQL_TYPE_UPDATE_SQL)) ||
+ (error_num = spider->append_limit_sql_part(
+ result_list->internal_offset, result_list->limit_num,
+ SPIDER_SQL_TYPE_UPDATE_SQL))
+ ) {
+ DBUG_RETURN(error_num);
+ }
+ }
+
+ for (
+ roop_count = spider_conn_link_idx_next(share->link_statuses,
+ spider->conn_link_idx, -1, share->link_count,
+ SPIDER_LINK_STATUS_RECOVERY);
+ roop_count < (int) share->link_count;
+ roop_count = spider_conn_link_idx_next(share->link_statuses,
+ spider->conn_link_idx, roop_count, share->link_count,
+ SPIDER_LINK_STATUS_RECOVERY)
+ ) {
+ ulong sql_type;
+ DBUG_PRINT("info", ("spider exec sql"));
+ conn = spider->conns[roop_count];
+ sql_type = SPIDER_SQL_TYPE_UPDATE_SQL;
+ spider_db_handler *dbton_hdl = spider->dbton_handler[conn->dbton_id];
+ pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
+ if (dbton_hdl->need_lock_before_set_sql_for_exec(sql_type))
+ {
+ pthread_mutex_lock(&conn->mta_conn_mutex);
+ SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ }
+ if ((error_num = dbton_hdl->set_sql_for_exec(sql_type, roop_count)))
+ {
+ if (dbton_hdl->need_lock_before_set_sql_for_exec(sql_type))
+ {
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ }
+ DBUG_RETURN(error_num);
+ }
+ if (!dbton_hdl->need_lock_before_set_sql_for_exec(sql_type))
+ {
+ pthread_mutex_lock(&conn->mta_conn_mutex);
+ SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ }
+#ifdef HA_CAN_BULK_ACCESS
+ if (spider->is_bulk_access_clone)
+ {
+ spider->connection_ids[roop_count] = conn->connection_id;
+ spider_trx_add_bulk_access_conn(spider->trx, conn);
+ } else {
+#endif
+ conn->need_mon = &spider->need_mons[roop_count];
+ DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
+ DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
+ conn->mta_conn_mutex_lock_already = TRUE;
+ conn->mta_conn_mutex_unlock_later = TRUE;
+ if ((error_num = spider_db_set_names(spider, conn, roop_count)))
+ {
+ DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
+ DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
+ 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 (
+ share->monitoring_kind[roop_count] &&
+ spider->need_mons[roop_count]
+ ) {
+ error_num = spider_ping_table_mon_from_table(
+ spider->trx,
+ spider->trx->thd,
+ share,
+ roop_count,
+ (uint32) share->monitoring_sid[roop_count],
+ share->table_name,
+ share->table_name_length,
+ spider->conn_link_idx[roop_count],
+ NULL,
+ 0,
+ share->monitoring_kind[roop_count],
+ share->monitoring_limit[roop_count],
+ share->monitoring_flag[roop_count],
+ TRUE
+ );
+ }
+ DBUG_RETURN(error_num);
+ }
+ spider_conn_set_timeout_from_share(conn, roop_count, spider->trx->thd,
+ share);
+ if (
+ (error_num = dbton_hdl->execute_sql(
+ sql_type,
+ conn,
+ -1,
+ &spider->need_mons[roop_count])
+ ) &&
+ (error_num != HA_ERR_FOUND_DUPP_KEY || !spider->ignore_dup_key)
+ ) {
+ DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
+ DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ error_num = spider_db_errorno(conn);
+ if (
+ error_num != ER_DUP_ENTRY &&
+ error_num != ER_DUP_KEY &&
+ error_num != HA_ERR_FOUND_DUPP_KEY &&
+ share->monitoring_kind[roop_count] &&
+ spider->need_mons[roop_count]
+ ) {
+ error_num = spider_ping_table_mon_from_table(
+ spider->trx,
+ spider->trx->thd,
+ share,
+ roop_count,
+ (uint32) share->monitoring_sid[roop_count],
+ share->table_name,
+ share->table_name_length,
+ spider->conn_link_idx[roop_count],
+ NULL,
+ 0,
+ share->monitoring_kind[roop_count],
+ share->monitoring_limit[roop_count],
+ share->monitoring_flag[roop_count],
+ TRUE
+ );
+ }
+ DBUG_RETURN(error_num);
+ }
+ if (!counted)
+ {
+ *update_rows = spider->conns[roop_count]->db_conn->affected_rows();
+ DBUG_PRINT("info", ("spider update_rows = %llu", *update_rows));
+ counted = TRUE;
+ }
+ DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
+ DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+#ifdef HA_CAN_BULK_ACCESS
+ }
+#endif
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ }
+ spider->reset_sql_sql(SPIDER_SQL_TYPE_UPDATE_SQL);
+ DBUG_RETURN(0);
+}
+#endif
#endif
#ifdef HA_CAN_BULK_ACCESS
int spider_db_bulk_direct_update(
ha_spider *spider,
- uint *update_rows
+ ha_rows *update_rows
) {
int error_num = 0, roop_count, tmp_error_num;
SPIDER_SHARE *share = spider->share;
@@ -6929,7 +7510,7 @@ int spider_db_bulk_direct_update(
if (!counted)
{
*update_rows = spider->conns[roop_count]->db_conn->affected_rows();
- DBUG_PRINT("info", ("spider update_rows = %u", *update_rows));
+ DBUG_PRINT("info", ("spider update_rows = %llu", *update_rows));
counted = TRUE;
}
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
@@ -6950,7 +7531,7 @@ int spider_db_bulk_direct_update(
if (!counted)
{
*update_rows = conn->db_conn->affected_rows();
- DBUG_PRINT("info", ("spider update_rows = %u", *update_rows));
+ DBUG_PRINT("info", ("spider update_rows = %llu", *update_rows));
counted = TRUE;
}
result->free_result();
@@ -7083,12 +7664,13 @@ int spider_db_delete(
}
#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
+#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS_WITH_HS
int spider_db_direct_delete(
ha_spider *spider,
TABLE *table,
KEY_MULTI_RANGE *ranges,
uint range_count,
- uint *delete_rows
+ ha_rows *delete_rows
) {
int error_num, roop_count;
SPIDER_SHARE *share = spider->share;
@@ -7232,6 +7814,7 @@ int spider_db_direct_delete(
spider->trx,
spider->trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -7267,6 +7850,7 @@ int spider_db_direct_delete(
spider->trx,
spider->trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -7292,7 +7876,7 @@ int spider_db_direct_delete(
if (!counted)
{
*delete_rows = spider->conns[roop_count]->db_conn->affected_rows();
- DBUG_PRINT("info", ("spider delete_rows = %u", *delete_rows));
+ DBUG_PRINT("info", ("spider delete_rows = %llu", *delete_rows));
counted = TRUE;
}
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
@@ -7313,7 +7897,7 @@ int spider_db_direct_delete(
if (!counted)
{
*delete_rows = conn->db_conn->affected_rows();
- DBUG_PRINT("info", ("spider delete_rows = %u", *delete_rows));
+ DBUG_PRINT("info", ("spider delete_rows = %llu", *delete_rows));
counted = TRUE;
}
result->free_result();
@@ -7350,6 +7934,198 @@ int spider_db_direct_delete(
#endif
DBUG_RETURN(error_num2);
}
+#else
+int spider_db_direct_delete(
+ ha_spider *spider,
+ TABLE *table,
+ ha_rows *delete_rows
+) {
+ int error_num, roop_count;
+ SPIDER_SHARE *share = spider->share;
+ SPIDER_CONN *conn;
+ SPIDER_RESULT_LIST *result_list = &spider->result_list;
+ bool counted = FALSE;
+ st_select_lex *select_lex;
+ longlong select_limit;
+ longlong offset_limit;
+ DBUG_ENTER("spider_db_direct_delete");
+
+ spider_set_result_list_param(spider);
+ result_list->finish_flg = FALSE;
+ result_list->desc_flg = FALSE;
+ result_list->sorted = TRUE;
+ if (spider->active_index == MAX_KEY)
+ result_list->key_info = NULL;
+ else
+ result_list->key_info = &table->key_info[spider->active_index];
+ spider_get_select_limit(spider, &select_lex, &select_limit, &offset_limit);
+ result_list->limit_num =
+ result_list->internal_limit >= select_limit ?
+ select_limit : result_list->internal_limit;
+ result_list->internal_offset += offset_limit;
+ if (spider->direct_update_kinds & SPIDER_SQL_KIND_SQL)
+ {
+ if (
+ (error_num = spider->append_delete_sql_part()) ||
+ (error_num = spider->append_from_sql_part(SPIDER_SQL_TYPE_DELETE_SQL))
+ ) {
+ DBUG_RETURN(error_num);
+ }
+ spider->set_where_pos_sql(SPIDER_SQL_TYPE_DELETE_SQL);
+ if (
+ (error_num = spider->append_key_where_sql_part(
+ NULL,
+ NULL,
+ SPIDER_SQL_TYPE_DELETE_SQL)) ||
+ (error_num = spider->
+ append_key_order_for_direct_order_limit_with_alias_sql_part(
+ NULL, 0, SPIDER_SQL_TYPE_DELETE_SQL)) ||
+ (error_num = spider->append_limit_sql_part(
+ result_list->internal_offset, result_list->limit_num,
+ SPIDER_SQL_TYPE_DELETE_SQL))
+ ) {
+ DBUG_RETURN(error_num);
+ }
+ }
+
+ for (
+ roop_count = spider_conn_link_idx_next(share->link_statuses,
+ spider->conn_link_idx, -1, share->link_count,
+ SPIDER_LINK_STATUS_RECOVERY);
+ roop_count < (int) share->link_count;
+ roop_count = spider_conn_link_idx_next(share->link_statuses,
+ spider->conn_link_idx, roop_count, share->link_count,
+ SPIDER_LINK_STATUS_RECOVERY)
+ ) {
+ ulong sql_type;
+ DBUG_PRINT("info", ("spider exec sql"));
+ conn = spider->conns[roop_count];
+ sql_type = SPIDER_SQL_TYPE_DELETE_SQL;
+ spider_db_handler *dbton_hdl = spider->dbton_handler[conn->dbton_id];
+ pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
+ if (dbton_hdl->need_lock_before_set_sql_for_exec(sql_type))
+ {
+ pthread_mutex_lock(&conn->mta_conn_mutex);
+ SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ }
+ if ((error_num = dbton_hdl->set_sql_for_exec(sql_type, roop_count)))
+ {
+ if (dbton_hdl->need_lock_before_set_sql_for_exec(sql_type))
+ {
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ }
+ DBUG_RETURN(error_num);
+ }
+ if (!dbton_hdl->need_lock_before_set_sql_for_exec(sql_type))
+ {
+ pthread_mutex_lock(&conn->mta_conn_mutex);
+ SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ }
+#ifdef HA_CAN_BULK_ACCESS
+ if (spider->is_bulk_access_clone)
+ {
+ spider->connection_ids[roop_count] = conn->connection_id;
+ spider_trx_add_bulk_access_conn(spider->trx, conn);
+ } else {
+#endif
+ conn->need_mon = &spider->need_mons[roop_count];
+ DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
+ DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
+ conn->mta_conn_mutex_lock_already = TRUE;
+ conn->mta_conn_mutex_unlock_later = TRUE;
+ if ((error_num = spider_db_set_names(spider, conn, roop_count)))
+ {
+ DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
+ DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
+ 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 (
+ share->monitoring_kind[roop_count] &&
+ spider->need_mons[roop_count]
+ ) {
+ error_num = spider_ping_table_mon_from_table(
+ spider->trx,
+ spider->trx->thd,
+ share,
+ roop_count,
+ (uint32) share->monitoring_sid[roop_count],
+ share->table_name,
+ share->table_name_length,
+ spider->conn_link_idx[roop_count],
+ NULL,
+ 0,
+ share->monitoring_kind[roop_count],
+ share->monitoring_limit[roop_count],
+ share->monitoring_flag[roop_count],
+ TRUE
+ );
+ }
+ DBUG_RETURN(error_num);
+ }
+ spider_conn_set_timeout_from_share(conn, roop_count, spider->trx->thd,
+ share);
+ if (dbton_hdl->execute_sql(
+ sql_type,
+ conn,
+ -1,
+ &spider->need_mons[roop_count])
+ ) {
+ DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
+ DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ error_num = spider_db_errorno(conn);
+ if (
+ share->monitoring_kind[roop_count] &&
+ spider->need_mons[roop_count]
+ ) {
+ error_num = spider_ping_table_mon_from_table(
+ spider->trx,
+ spider->trx->thd,
+ share,
+ roop_count,
+ (uint32) share->monitoring_sid[roop_count],
+ share->table_name,
+ share->table_name_length,
+ spider->conn_link_idx[roop_count],
+ NULL,
+ 0,
+ share->monitoring_kind[roop_count],
+ share->monitoring_limit[roop_count],
+ share->monitoring_flag[roop_count],
+ TRUE
+ );
+ }
+ DBUG_RETURN(error_num);
+ }
+ DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
+ DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ if (!counted)
+ {
+ *delete_rows = spider->conns[roop_count]->db_conn->affected_rows();
+ DBUG_PRINT("info", ("spider delete_rows = %llu", *delete_rows));
+ counted = TRUE;
+ }
+#ifdef HA_CAN_BULK_ACCESS
+ }
+#endif
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ }
+ int error_num2 = 0;
+ if (spider->direct_update_kinds & SPIDER_SQL_KIND_SQL)
+ {
+ if ((error_num = spider->reset_sql_sql(SPIDER_SQL_TYPE_DELETE_SQL)))
+ error_num2 = error_num;
+ }
+ DBUG_RETURN(error_num2);
+}
+#endif
#endif
int spider_db_delete_all_rows(
@@ -7438,6 +8214,7 @@ int spider_db_delete_all_rows(
spider->trx,
spider->trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -7468,6 +8245,7 @@ int spider_db_delete_all_rows(
spider->trx,
spider->trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -7503,6 +8281,7 @@ int spider_db_delete_all_rows(
spider->trx,
spider->trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -7532,6 +8311,7 @@ int spider_db_delete_all_rows(
spider->trx,
spider->trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -7592,6 +8372,7 @@ int spider_db_disable_keys(
spider->trx,
spider->trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -7644,6 +8425,7 @@ int spider_db_enable_keys(
spider->trx,
spider->trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -7697,6 +8479,7 @@ int spider_db_check_table(
spider->trx,
spider->trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -7750,6 +8533,7 @@ int spider_db_repair_table(
spider->trx,
spider->trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -7802,6 +8586,7 @@ int spider_db_analyze_table(
spider->trx,
spider->trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -7854,6 +8639,7 @@ int spider_db_optimize_table(
spider->trx,
spider->trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -7903,6 +8689,7 @@ int spider_db_flush_tables(
spider->trx,
spider->trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -7950,6 +8737,7 @@ int spider_db_flush_logs(
spider->trx,
spider->trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -7968,52 +8756,145 @@ int spider_db_flush_logs(
DBUG_RETURN(0);
}
+/**
+ Find the field among the items in an expression tree.
+
+ @param item_list List of items of the expression.
+ @param item_count Number of items in the item list.
+ @param start_item Index of the first item to consider.
+ @param str String into which the expression is to be printed.
+ @param func_name Function or operator name.
+ @param func_name_length Length of function or operator name.
+
+ @return Pointer to the field in the item list if the list
+ contains only one field; NULL otherwise.
+*/
+
+Field *spider_db_find_field_in_item_list(
+ Item **item_list,
+ uint item_count,
+ uint start_item,
+ spider_string *str,
+ const char *func_name,
+ int func_name_length
+) {
+ uint item_num;
+ Item *item;
+ Field *field = NULL;
+ DBUG_ENTER("spider_db_find_field_in_item_list");
+
+ if (str && func_name_length)
+ {
+ if (strncasecmp(func_name, ",", 1))
+ {
+ /* A known function or operator */
+ for (item_num = start_item; item_num < item_count; item_num++)
+ {
+ item = item_list[item_num];
+
+ if (item->type() == Item::FIELD_ITEM)
+ {
+ if (field)
+ {
+ /* Field is not relevant if there are multiple fields */
+ DBUG_RETURN(NULL);
+ }
+
+ field = ((Item_field *) item)->field;
+ }
+ }
+ }
+ }
+
+ DBUG_RETURN(field);
+}
+
+/**
+ Print an operand value within a statement generated for an expression.
+
+ @param item Operand value to print.
+ @param field Field related to the operand value.
+ @param spider Spider.
+ @param str String into which the value is to be printed.
+ @param alias Name related to the operand.
+ @param alias_length Length of the name.
+ @param dbton_id Spider Db/Table id.
+ @param use_fields Use fields or exchange fields.
+ @param fields Array of fields in the expression.
+
+ @return Error code.
+*/
+
int spider_db_print_item_type(
Item *item,
+ Field *field,
ha_spider *spider,
spider_string *str,
const char *alias,
uint alias_length,
- uint dbton_id
+ uint dbton_id,
+ bool use_fields,
+ spider_fields *fields
) {
DBUG_ENTER("spider_db_print_item_type");
DBUG_PRINT("info",("spider COND type=%d", item->type()));
+
switch (item->type())
{
case Item::FUNC_ITEM:
DBUG_RETURN(spider_db_open_item_func((Item_func *) item, spider, str,
- alias, alias_length, dbton_id));
+ alias, alias_length, dbton_id, use_fields, fields));
#ifdef HANDLER_HAS_DIRECT_AGGREGATE
case Item::SUM_FUNC_ITEM:
DBUG_RETURN(spider_db_open_item_sum_func((Item_sum *)item, spider, str,
- alias, alias_length, dbton_id));
+ alias, alias_length, dbton_id, use_fields, fields));
#endif
case Item::COND_ITEM:
DBUG_RETURN(spider_db_open_item_cond((Item_cond *) item, spider, str,
- alias, alias_length, dbton_id));
+ alias, alias_length, dbton_id, use_fields, fields));
case Item::FIELD_ITEM:
DBUG_RETURN(spider_db_open_item_field((Item_field *) item, spider, str,
- alias, alias_length, dbton_id));
+ alias, alias_length, dbton_id, use_fields, fields));
case Item::REF_ITEM:
DBUG_RETURN(spider_db_open_item_ref((Item_ref *) item, spider, str,
- alias, alias_length, dbton_id));
+ alias, alias_length, dbton_id, use_fields, fields));
case Item::ROW_ITEM:
DBUG_RETURN(spider_db_open_item_row((Item_row *) item, spider, str,
- alias, alias_length, dbton_id));
+ alias, alias_length, dbton_id, use_fields, fields));
+#ifdef SPIDER_USE_CONST_ITEM_FOR_STRING_INT_REAL_DECIMAL_DATE_ITEM
+ case Item::CONST_ITEM:
+ {
+ switch (item->cmp_type()) {
+ case TIME_RESULT:
+ case STRING_RESULT:
+ DBUG_RETURN(spider_db_open_item_string(item, field, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields));
+ case INT_RESULT:
+ case REAL_RESULT:
+ case DECIMAL_RESULT:
+ DBUG_RETURN(spider_db_open_item_int(item, field, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields));
+ default:
+ DBUG_ASSERT(FALSE);
+ DBUG_RETURN(spider_db_print_item_type_default(item, spider, str));
+ }
+ }
+#else
case Item::STRING_ITEM:
- DBUG_RETURN(spider_db_open_item_string(item, spider, str,
- alias, alias_length, dbton_id));
+ DBUG_RETURN(spider_db_open_item_string(item, field, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields));
case Item::INT_ITEM:
case Item::REAL_ITEM:
case Item::DECIMAL_ITEM:
- DBUG_RETURN(spider_db_open_item_int(item, spider, str,
- alias, alias_length, dbton_id));
+ DBUG_RETURN(spider_db_open_item_int(item, field, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields));
+#endif
case Item::CACHE_ITEM:
- DBUG_RETURN(spider_db_open_item_cache((Item_cache *)item, spider, str,
- alias, alias_length, dbton_id));
+ DBUG_RETURN(spider_db_open_item_cache((Item_cache *) item, field, spider,
+ str, alias, alias_length, dbton_id, use_fields, fields));
case Item::INSERT_VALUE_ITEM:
- DBUG_RETURN(spider_db_open_item_insert_value((Item_insert_value *)item, spider, str,
- alias, alias_length, dbton_id));
+ DBUG_RETURN(spider_db_open_item_insert_value((Item_insert_value *) item,
+ field, spider, str, alias, alias_length, dbton_id, use_fields, fields));
case Item::SUBSELECT_ITEM:
case Item::TRIGGER_FIELD_ITEM:
#ifdef SPIDER_HAS_EXPR_CACHE_ITEM
@@ -8021,26 +8902,36 @@ int spider_db_print_item_type(
#endif
DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
default:
- THD *thd = spider->trx->thd;
- SPIDER_SHARE *share = spider->share;
- if (spider_param_skip_default_condition(thd,
- share->skip_default_condition))
- DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
- if (str)
- {
- if (spider->share->access_charset->cset == system_charset_info->cset)
- {
+ DBUG_RETURN(spider_db_print_item_type_default(item, spider, str));
+ }
+
+ DBUG_RETURN(0);
+}
+
+int spider_db_print_item_type_default(
+ Item *item,
+ ha_spider *spider,
+ spider_string *str
+) {
+ DBUG_ENTER("spider_db_print_item_type_default");
+ THD *thd = spider->trx->thd;
+ SPIDER_SHARE *share = spider->share;
+ if (spider_param_skip_default_condition(thd,
+ share->skip_default_condition))
+ DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
+ if (str)
+ {
+ if (spider->share->access_charset->cset == system_charset_info->cset)
+ {
#if MYSQL_VERSION_ID < 50500
- item->print(str->get_str(), QT_IS);
+ item->print(str->get_str(), QT_IS);
#else
- item->print(str->get_str(), QT_TO_SYSTEM_CHARSET);
+ item->print(str->get_str(), QT_TO_SYSTEM_CHARSET);
#endif
- } else {
- item->print(str->get_str(), QT_ORDINARY);
- }
- str->mem_calc();
- }
- break;
+ } else {
+ item->print(str->get_str(), QT_ORDINARY);
+ }
+ str->mem_calc();
}
DBUG_RETURN(0);
}
@@ -8051,7 +8942,9 @@ int spider_db_open_item_cond(
spider_string *str,
const char *alias,
uint alias_length,
- uint dbton_id
+ uint dbton_id,
+ bool use_fields,
+ spider_fields *fields
) {
int error_num = 0;
List_iterator_fast<Item> lif(*(item_cond->argument_list()));
@@ -8071,8 +8964,8 @@ restart_first:
{
if (str)
restart_pos = str->length();
- if ((error_num = spider_db_print_item_type(item, spider, str,
- alias, alias_length, dbton_id)))
+ if ((error_num = spider_db_print_item_type(item, NULL, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields)))
{
if (
str &&
@@ -8105,8 +8998,8 @@ restart_first:
str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
}
- if ((error_num = spider_db_print_item_type(item, spider, str,
- alias, alias_length, dbton_id)))
+ if ((error_num = spider_db_print_item_type(item, NULL, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields)))
{
if (
str &&
@@ -8134,11 +9027,13 @@ int spider_db_open_item_func(
spider_string *str,
const char *alias,
uint alias_length,
- uint dbton_id
+ uint dbton_id,
+ bool use_fields,
+ spider_fields *fields
) {
DBUG_ENTER("spider_db_open_item_func");
DBUG_RETURN(spider_dbton[dbton_id].db_util->open_item_func(
- item_func, spider, str, alias, alias_length));
+ item_func, spider, str, alias, alias_length, use_fields, fields));
}
#ifdef HANDLER_HAS_DIRECT_AGGREGATE
@@ -8148,11 +9043,13 @@ int spider_db_open_item_sum_func(
spider_string *str,
const char *alias,
uint alias_length,
- uint dbton_id
+ uint dbton_id,
+ bool use_fields,
+ spider_fields *fields
) {
DBUG_ENTER("spider_db_open_item_func");
DBUG_RETURN(spider_dbton[dbton_id].db_util->open_item_sum_func(
- item_sum, spider, str, alias, alias_length));
+ item_sum, spider, str, alias, alias_length, use_fields, fields));
}
#endif
@@ -8162,7 +9059,9 @@ int spider_db_open_item_ident(
spider_string *str,
const char *alias,
uint alias_length,
- uint dbton_id
+ uint dbton_id,
+ bool use_fields,
+ spider_fields *fields
) {
int error_num, field_name_length;
SPIDER_SHARE *share = spider->share;
@@ -8173,22 +9072,49 @@ int spider_db_open_item_ident(
) {
Field *field = item_ident->cached_table->table->field[
item_ident->cached_field_index];
- if (!(field = spider->field_exchange(field)))
- DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
DBUG_PRINT("info",("spider use cached_field_index"));
- if (str)
+ if (!use_fields)
{
- if ((error_num = share->dbton_share[dbton_id]->
- append_column_name_with_alias(str, field->field_index,
- alias, alias_length)))
- DBUG_RETURN(error_num);
+ if (!(field = spider->field_exchange(field)))
+ DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
+ if (str)
+ {
+ if ((error_num = share->dbton_share[dbton_id]->
+ append_column_name_with_alias(str, field->field_index,
+ alias, alias_length)))
+ DBUG_RETURN(error_num);
+ }
+ } else {
+ if (str)
+ {
+ SPIDER_FIELD_CHAIN *field_chain = fields->get_next_field_chain();
+ SPIDER_FIELD_HOLDER *field_holder = field_chain->field_holder;
+ spider = field_holder->spider;
+ share = spider->share;
+ field = spider->field_exchange(field);
+ DBUG_ASSERT(field);
+ if ((error_num = share->dbton_share[dbton_id]->
+ append_column_name_with_alias(str, field->field_index,
+ field_holder->alias->ptr(), field_holder->alias->length())))
+ DBUG_RETURN(error_num);
+ } else {
+ if ((error_num = fields->add_field(field)))
+ {
+ DBUG_RETURN(error_num);
+ }
+ }
}
DBUG_RETURN(0);
}
if (str)
{
+#ifdef SPIDER_use_LEX_CSTRING_for_KEY_Field_name
+ if (item_ident->field_name.str)
+ field_name_length = item_ident->field_name.length;
+#else
if (item_ident->field_name)
field_name_length = strlen(item_ident->field_name);
+#endif
else
field_name_length = 0;
if (share->access_charset->cset == system_charset_info->cset)
@@ -8199,8 +9125,13 @@ int spider_db_open_item_ident(
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
str->q_append(alias, alias_length);
+#ifdef SPIDER_use_LEX_CSTRING_for_KEY_Field_name
+ if ((error_num = spider_dbton[dbton_id].db_util->
+ append_name(str, item_ident->field_name.str, field_name_length)))
+#else
if ((error_num = spider_dbton[dbton_id].db_util->
append_name(str, item_ident->field_name, field_name_length)))
+#endif
{
DBUG_RETURN(error_num);
}
@@ -8208,9 +9139,15 @@ int spider_db_open_item_ident(
if (str->reserve(alias_length))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(alias, alias_length);
+#ifdef SPIDER_use_LEX_CSTRING_for_KEY_Field_name
+ if ((error_num = spider_dbton[dbton_id].db_util->
+ append_name_with_charset(str, item_ident->field_name.str,
+ field_name_length, system_charset_info)))
+#else
if ((error_num = spider_dbton[dbton_id].db_util->
append_name_with_charset(str, item_ident->field_name,
field_name_length, system_charset_info)))
+#endif
{
DBUG_RETURN(error_num);
}
@@ -8225,31 +9162,60 @@ int spider_db_open_item_field(
spider_string *str,
const char *alias,
uint alias_length,
- uint dbton_id
+ uint dbton_id,
+ bool use_fields,
+ spider_fields *fields
) {
int error_num;
Field *field = item_field->field;
SPIDER_SHARE *share = spider->share;
DBUG_ENTER("spider_db_open_item_field");
- if (field)
+ if (field && !field->table->const_table)
{
DBUG_PRINT("info",("spider field=%p", field));
- if (!(field = spider->field_exchange(field)))
- DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
- if (field->table->const_table)
+ DBUG_PRINT("info",("spider db=%s", field->table->s->db.str));
+ DBUG_PRINT("info",("spider table_name=%s", field->table->s->table_name.str));
+ DBUG_PRINT("info",("spider tmp_table=%u", field->table->s->tmp_table));
+ if (field->table->s->tmp_table != INTERNAL_TMP_TABLE)
{
- if (str)
+ if (!use_fields)
{
- if ((error_num = share->dbton_share[dbton_id]->
- append_column_name_with_alias(str, field->field_index,
- alias, alias_length)))
- DBUG_RETURN(error_num);
+ if (!(field = spider->field_exchange(field)))
+ DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
+ if (str)
+ {
+ if ((error_num = share->dbton_share[dbton_id]->
+ append_column_name_with_alias(str, field->field_index,
+ alias, alias_length)))
+ DBUG_RETURN(error_num);
+ }
+ DBUG_RETURN(0);
+ } else {
+ if (str)
+ {
+ SPIDER_FIELD_CHAIN *field_chain = fields->get_next_field_chain();
+ SPIDER_FIELD_HOLDER *field_holder = field_chain->field_holder;
+ spider = field_holder->spider;
+ share = spider->share;
+ field = spider->field_exchange(field);
+ DBUG_ASSERT(field);
+ if ((error_num = share->dbton_share[dbton_id]->
+ append_column_name_with_alias(str, field->field_index,
+ field_holder->alias->ptr(), field_holder->alias->length())))
+ DBUG_RETURN(error_num);
+ } else {
+ if ((error_num = fields->add_field(field)))
+ {
+ DBUG_RETURN(error_num);
+ }
+ }
+ DBUG_RETURN(0);
}
- DBUG_RETURN(0);
}
}
DBUG_RETURN(spider_db_open_item_ident(
- (Item_ident *) item_field, spider, str, alias, alias_length, dbton_id));
+ (Item_ident *) item_field, spider, str, alias, alias_length, dbton_id,
+ use_fields, fields));
}
int spider_db_open_item_ref(
@@ -8258,39 +9224,61 @@ int spider_db_open_item_ref(
spider_string *str,
const char *alias,
uint alias_length,
- uint dbton_id
+ uint dbton_id,
+ bool use_fields,
+ spider_fields *fields
) {
int error_num;
DBUG_ENTER("spider_db_open_item_ref");
if (item_ref->ref)
{
+#ifdef SPIDER_use_LEX_CSTRING_for_KEY_Field_name
+ if (
+ (*(item_ref->ref))->type() != Item::CACHE_ITEM &&
+ item_ref->ref_type() != Item_ref::VIEW_REF &&
+ !item_ref->table_name &&
+ item_ref->name.str &&
+ item_ref->alias_name_used
+ )
+#else
if (
(*(item_ref->ref))->type() != Item::CACHE_ITEM &&
item_ref->ref_type() != Item_ref::VIEW_REF &&
!item_ref->table_name &&
item_ref->name &&
item_ref->alias_name_used
- ) {
+ )
+#endif
+ {
if (str)
{
+#ifdef SPIDER_use_LEX_CSTRING_for_KEY_Field_name
+ uint length = item_ref->name.length;
+#else
uint length = strlen(item_ref->name);
+#endif
if (str->reserve(length + /* SPIDER_SQL_NAME_QUOTE_LEN */ 2))
{
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
+#ifdef SPIDER_use_LEX_CSTRING_for_KEY_Field_name
+ if ((error_num = spider_dbton[dbton_id].db_util->
+ append_name(str, item_ref->name.str, length)))
+#else
if ((error_num = spider_dbton[dbton_id].db_util->
append_name(str, item_ref->name, length)))
+#endif
{
DBUG_RETURN(error_num);
}
}
DBUG_RETURN(0);
}
- DBUG_RETURN(spider_db_print_item_type(*(item_ref->ref), spider, str,
- alias, alias_length, dbton_id));
+ DBUG_RETURN(spider_db_print_item_type(*(item_ref->ref), NULL, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields));
}
DBUG_RETURN(spider_db_open_item_ident((Item_ident *) item_ref, spider, str,
- alias, alias_length, dbton_id));
+ alias, alias_length, dbton_id, use_fields, fields));
}
int spider_db_open_item_row(
@@ -8299,7 +9287,9 @@ int spider_db_open_item_row(
spider_string *str,
const char *alias,
uint alias_length,
- uint dbton_id
+ uint dbton_id,
+ bool use_fields,
+ spider_fields *fields
) {
int error_num;
uint roop_count, cols = item_row->cols() - 1;
@@ -8314,8 +9304,8 @@ int spider_db_open_item_row(
for (roop_count = 0; roop_count < cols; roop_count++)
{
item = item_row->element_index(roop_count);
- if ((error_num = spider_db_print_item_type(item, spider, str,
- alias, alias_length, dbton_id)))
+ if ((error_num = spider_db_print_item_type(item, NULL, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields)))
DBUG_RETURN(error_num);
if (str)
{
@@ -8325,8 +9315,8 @@ int spider_db_open_item_row(
}
}
item = item_row->element_index(roop_count);
- if ((error_num = spider_db_print_item_type(item, spider, str,
- alias, alias_length, dbton_id)))
+ if ((error_num = spider_db_print_item_type(item, NULL, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields)))
DBUG_RETURN(error_num);
if (str)
{
@@ -8338,98 +9328,267 @@ int spider_db_open_item_row(
DBUG_RETURN(0);
}
+/**
+ Print a string value within a generated statement.
+
+ @param item String value to print.
+ @param field Field related to the string value.
+ @param spider Spider.
+ @param str String into which the value is to be printed.
+ @param alias Name related to the string value.
+ @param alias_length Length of the name.
+ @param dbton_id Spider Db/Table id.
+ @param use_fields Use fields or exchange fields.
+ @param fields Array of fields in an expression containing
+ the string value.
+
+ @return Error code.
+*/
+
int spider_db_open_item_string(
Item *item,
+ Field *field,
ha_spider *spider,
spider_string *str,
const char *alias,
uint alias_length,
- uint dbton_id
+ uint dbton_id,
+ bool use_fields,
+ spider_fields *fields
) {
+ int error_num = 0;
DBUG_ENTER("spider_db_open_item_string");
+
if (str)
{
+ THD *thd = NULL;
+ TABLE *table;
+ MY_BITMAP *saved_map;
+ Time_zone *saved_time_zone;
+ String str_value;
char tmp_buf[MAX_FIELD_WIDTH];
spider_string tmp_str(tmp_buf, MAX_FIELD_WIDTH, str->charset());
String *tmp_str2;
tmp_str.init_calc_mem(126);
+
if (!(tmp_str2 = item->val_str(tmp_str.get_str())))
{
if (str->reserve(SPIDER_SQL_NULL_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ {
+ error_num = HA_ERR_OUT_OF_MEM;
+ goto end;
+ }
str->q_append(SPIDER_SQL_NULL_STR, SPIDER_SQL_NULL_LEN);
} else {
+ if (
+ field &&
+ field->type() == FIELD_TYPE_TIMESTAMP &&
+ field->table->in_use->variables.time_zone != UTC
+ ) {
+ /*
+ Store the string value in the field. This is necessary
+ when the statement contains more than one value for the
+ same field.
+ */
+ table = field->table;
+ thd = table->in_use;
+ saved_map = dbug_tmp_use_all_columns(table, &table->write_set);
+ item->save_in_field(field, FALSE);
+ saved_time_zone = thd->variables.time_zone;
+ thd->variables.time_zone = UTC;
+
+ /* Retrieve the stored value converted to UTC */
+ tmp_str2 = field->val_str(&str_value);
+
+ if (!tmp_str2)
+ {
+ error_num = HA_ERR_OUT_OF_MEM;
+ goto end;
+ }
+ }
if (str->reserve(SPIDER_SQL_VALUE_QUOTE_LEN * 2 +
tmp_str2->length() * 2))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- tmp_str.mem_calc();
+ {
+ error_num = HA_ERR_OUT_OF_MEM;
+ goto end;
+ }
+ if (!thd)
+ tmp_str.mem_calc();
str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
str->append_escape_string(tmp_str2->ptr(), tmp_str2->length());
- if (
- str->reserve(SPIDER_SQL_VALUE_QUOTE_LEN)
- )
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ if (str->reserve(SPIDER_SQL_VALUE_QUOTE_LEN))
+ {
+ error_num = HA_ERR_OUT_OF_MEM;
+ goto end;
+ }
str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
}
+
+end:
+ if (thd)
+ {
+ thd->variables.time_zone = saved_time_zone;
+ dbug_tmp_restore_column_map(&table->write_set, saved_map);
+ }
}
- DBUG_RETURN(0);
+
+ DBUG_RETURN(error_num);
}
+/**
+ Print an integer value within a generated statement.
+
+ @param item Integer value to print.
+ @param field Field related to the integer value.
+ @param spider Spider.
+ @param str String into which the value is to be printed.
+ @param alias Name related to the integer value.
+ @param alias_length Length of the name.
+ @param dbton_id Spider Db/Table id.
+ @param use_fields Use fields or exchange fields.
+ @param fields Array of fields in an expression containing
+ the integer value.
+
+ @return Error code.
+*/
+
int spider_db_open_item_int(
Item *item,
+ Field *field,
ha_spider *spider,
spider_string *str,
const char *alias,
uint alias_length,
- uint dbton_id
+ uint dbton_id,
+ bool use_fields,
+ spider_fields *fields
) {
+ int error_num = 0;
DBUG_ENTER("spider_db_open_item_int");
+
if (str)
{
+ THD *thd = NULL;
+ TABLE *table;
+ MY_BITMAP *saved_map;
+ Time_zone *saved_time_zone;
+ String str_value;
+ bool print_quoted_string;
char tmp_buf[MAX_FIELD_WIDTH];
spider_string tmp_str(tmp_buf, MAX_FIELD_WIDTH, str->charset());
String *tmp_str2;
tmp_str.init_calc_mem(127);
+
if (!(tmp_str2 = item->val_str(tmp_str.get_str())))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ {
+ error_num = HA_ERR_OUT_OF_MEM;
+ goto end;
+ }
tmp_str.mem_calc();
+
+ if (
+ field &&
+ field->type() == FIELD_TYPE_TIMESTAMP &&
+ field->table->in_use->variables.time_zone != UTC
+ ) {
+ /*
+ Store the int value in the field. This is necessary
+ when the statement contains more than one value for the
+ same field.
+ */
+ table = field->table;
+ thd = table->in_use;
+ saved_map = dbug_tmp_use_all_columns(table, &table->write_set);
+ item->save_in_field(field, FALSE);
+ saved_time_zone = thd->variables.time_zone;
+ thd->variables.time_zone = UTC;
+ print_quoted_string = TRUE;
+ } else {
#ifdef SPIDER_ITEM_HAS_CMP_TYPE
- DBUG_PRINT("info",("spider cmp_type=%u", item->cmp_type()));
- if (item->cmp_type() == TIME_RESULT)
+ DBUG_PRINT("info",("spider cmp_type=%u", item->cmp_type()));
+ if (item->cmp_type() == TIME_RESULT)
+ print_quoted_string = TRUE;
+ else
+#endif
+ print_quoted_string = FALSE;
+ }
+
+ if (print_quoted_string)
{
+ if (thd)
+ {
+ /* Retrieve the stored value converted to UTC */
+ tmp_str2 = field->val_str(&str_value);
+
+ if (!tmp_str2)
+ {
+ error_num = HA_ERR_OUT_OF_MEM;
+ goto end;
+ }
+ }
+
if (str->reserve(SPIDER_SQL_VALUE_QUOTE_LEN * 2 + tmp_str2->length()))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ {
+ error_num = HA_ERR_OUT_OF_MEM;
+ goto end;
+ }
str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
str->append(*tmp_str2);
str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
} else {
-#endif
if (str->append(*tmp_str2))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
-#ifdef SPIDER_ITEM_HAS_CMP_TYPE
+ error_num = HA_ERR_OUT_OF_MEM;
+ }
+
+end:
+ if (thd)
+ {
+ thd->variables.time_zone = saved_time_zone;
+ dbug_tmp_restore_column_map(&table->write_set, saved_map);
}
-#endif
}
- DBUG_RETURN(0);
+
+ DBUG_RETURN(error_num);
}
+/**
+ Print a cached value within a generated statement.
+
+ @param item Cached value to print.
+ @param field Field related to the cached value.
+ @param spider Spider.
+ @param str String into which the value is to be printed.
+ @param alias Name related to the cached value.
+ @param alias_length Length of the name.
+ @param dbton_id Spider Db/Table id.
+ @param use_fields Use fields or exchange fields.
+ @param fields Array of fields in the expression containing
+ the cached value.
+
+ @return Error code.
+*/
+
int spider_db_open_item_cache(
Item_cache *item_cache,
+ Field *field,
ha_spider *spider,
spider_string *str,
const char *alias,
uint alias_length,
- uint dbton_id
+ uint dbton_id,
+ bool use_fields,
+ spider_fields *fields
) {
DBUG_ENTER("spider_db_open_item_cache");
if (!item_cache->const_item())
DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
DBUG_PRINT("info",("spider result_type=%u", item_cache->result_type()));
+
switch (item_cache->result_type())
{
case STRING_RESULT:
- DBUG_RETURN(spider_db_open_item_string(item_cache, spider, str,
- alias, alias_length, dbton_id));
+ DBUG_RETURN(spider_db_open_item_string(item_cache, field, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields));
case ROW_RESULT:
{
int error_num;
@@ -8444,8 +9603,8 @@ int spider_db_open_item_cache(
for (roop_count = 0; roop_count < item_count; ++roop_count)
{
if ((error_num = spider_db_open_item_cache(
- (Item_cache *) item_cache_row->element_index(roop_count),
- spider, str, alias, alias_length, dbton_id
+ (Item_cache *) item_cache_row->element_index(roop_count), NULL,
+ spider, str, alias, alias_length, dbton_id, use_fields, fields
))) {
DBUG_RETURN(error_num);
}
@@ -8457,8 +9616,8 @@ int spider_db_open_item_cache(
}
}
if ((error_num = spider_db_open_item_cache(
- (Item_cache *) item_cache_row->element_index(roop_count),
- spider, str, alias, alias_length, dbton_id
+ (Item_cache *) item_cache_row->element_index(roop_count), NULL,
+ spider, str, alias, alias_length, dbton_id, use_fields, fields
))) {
DBUG_RETURN(error_num);
}
@@ -8477,20 +9636,40 @@ int spider_db_open_item_cache(
default:
break;
}
- DBUG_RETURN(spider_db_open_item_int(item_cache, spider, str,
- alias, alias_length, dbton_id));
+ DBUG_RETURN(spider_db_open_item_int(item_cache, field, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields));
}
+/**
+ Print an INSERT value within a generated INSERT statement.
+
+ @param item INSERT value to print.
+ @param field Field related to the INSERT value.
+ @param spider Spider.
+ @param str String into which the value is to be printed.
+ @param alias Name related to the INSERT value.
+ @param alias_length Length of the name.
+ @param dbton_id Spider Db/Table id.
+ @param use_fields Use fields or exchange fields.
+ @param fields Array of fields in the expression.
+
+ @return Error code.
+*/
+
int spider_db_open_item_insert_value(
Item_insert_value *item_insert_value,
+ Field *field,
ha_spider *spider,
spider_string *str,
const char *alias,
uint alias_length,
- uint dbton_id
+ uint dbton_id,
+ bool use_fields,
+ spider_fields *fields
) {
int error_num;
DBUG_ENTER("spider_db_open_item_insert_value");
+
if (item_insert_value->arg)
{
if (str)
@@ -8500,8 +9679,8 @@ int spider_db_open_item_insert_value(
str->q_append(SPIDER_SQL_VALUES_STR, SPIDER_SQL_VALUES_LEN);
str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
}
- if ((error_num = spider_db_print_item_type(item_insert_value->arg, spider,
- str, alias, alias_length, dbton_id)))
+ if ((error_num = spider_db_print_item_type(item_insert_value->arg, field,
+ spider, str, alias, alias_length, dbton_id, use_fields, fields)))
DBUG_RETURN(error_num);
if (str)
{
@@ -8510,6 +9689,7 @@ int spider_db_open_item_insert_value(
str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
}
}
+
DBUG_RETURN(0);
}
@@ -8552,7 +9732,9 @@ int spider_db_append_update_columns(
spider_string *str,
const char *alias,
uint alias_length,
- uint dbton_id
+ uint dbton_id,
+ bool use_fields,
+ spider_fields *fields
) {
int error_num;
bool add_comma = FALSE;
@@ -8564,7 +9746,8 @@ int spider_db_append_update_columns(
{
value = vi++;
if ((error_num = spider_db_print_item_type(
- (Item *) field, spider, str, alias, alias_length, dbton_id)))
+ (Item *) field, NULL, spider, str, alias, alias_length, dbton_id,
+ use_fields, fields)))
{
if (
error_num == ER_SPIDER_COND_SKIP_NUM &&
@@ -8583,7 +9766,8 @@ int spider_db_append_update_columns(
str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
}
if ((error_num = spider_db_print_item_type(
- (Item *) value, spider, str, alias, alias_length, dbton_id)))
+ (Item *) value, ((Item_field *) field)->field, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields)))
DBUG_RETURN(error_num);
if (str)
{
@@ -9405,18 +10589,19 @@ int spider_db_udf_ping_table(
{
int init_sql_alloc_size =
spider_param_init_sql_alloc_size(trx->thd, share->init_sql_alloc_size);
-#if defined(_MSC_VER) || defined(__SUNPRO_CC)
- spider_string sql_str(init_sql_alloc_size);
- sql_str.set_charset(system_charset_info);
- spider_string where_str(init_sql_alloc_size);
- where_str.set_charset(system_charset_info);
-#else
- char sql_buf[init_sql_alloc_size], where_buf[init_sql_alloc_size];
+ char *sql_buf = (char *) my_alloca(init_sql_alloc_size * 2);
+ if (!sql_buf)
+ {
+ table_mon_list->last_mon_result = HA_ERR_OUT_OF_MEM;
+ pthread_mutex_unlock(&table_mon_list->monitor_mutex);
+ my_error(HA_ERR_OUT_OF_MEM, MYF(0));
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ char *where_buf = sql_buf + init_sql_alloc_size;
spider_string sql_str(sql_buf, sizeof(sql_buf),
system_charset_info);
spider_string where_str(where_buf, sizeof(where_buf),
system_charset_info);
-#endif
sql_str.init_calc_mem(128);
where_str.init_calc_mem(129);
sql_str.length(0);
@@ -9429,6 +10614,7 @@ int spider_db_udf_ping_table(
table_mon_list->last_mon_result = HA_ERR_OUT_OF_MEM;
pthread_mutex_unlock(&table_mon_list->monitor_mutex);
my_error(HA_ERR_OUT_OF_MEM, MYF(0));
+ my_afree(sql_buf);
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
share->access_charset = system_charset_info;
@@ -9438,6 +10624,7 @@ int spider_db_udf_ping_table(
table_mon_list->last_mon_result = error_num;
pthread_mutex_unlock(&table_mon_list->monitor_mutex);
my_error(error_num, MYF(0));
+ my_afree(sql_buf);
DBUG_RETURN(error_num);
}
pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
@@ -9459,6 +10646,7 @@ int spider_db_udf_ping_table(
table_mon_list->last_mon_result = error_num;
pthread_mutex_unlock(&table_mon_list->monitor_mutex);
DBUG_PRINT("info",("spider error_num=%d", error_num));
+ my_afree(sql_buf);
DBUG_RETURN(error_num);
}
spider_conn_set_timeout_from_share(conn, 0, trx->thd, share);
@@ -9477,6 +10665,7 @@ int spider_db_udf_ping_table(
table_mon_list->last_mon_result = error_num;
pthread_mutex_unlock(&table_mon_list->monitor_mutex);
DBUG_PRINT("info",("spider error_num=%d", error_num));
+ my_afree(sql_buf);
DBUG_RETURN(error_num);
}
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
@@ -9486,6 +10675,7 @@ int spider_db_udf_ping_table(
spider_db_discard_result(&spider, 0, conn);
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
+ my_afree(sql_buf);
}
table_mon_list->last_mon_result = 0;
pthread_mutex_unlock(&table_mon_list->monitor_mutex);
@@ -9504,6 +10694,8 @@ int spider_db_udf_ping_table_append_mon_next(
char *child_table_name,
uint child_table_name_length,
int link_id,
+ char *static_link_id,
+ uint static_link_id_length,
char *where_clause,
uint where_clause_length,
longlong first_sid,
@@ -9531,7 +10723,13 @@ int spider_db_udf_ping_table_append_mon_next(
SPIDER_SQL_SELECT_LEN +
SPIDER_SQL_PING_TABLE_LEN +
(child_table_name_length * 2) +
- (SPIDER_SQL_INT_LEN * 6) +
+ (
+ static_link_id ?
+ (SPIDER_SQL_INT_LEN * 5) +
+ (SPIDER_SQL_VALUE_QUOTE_LEN * 2) +
+ (static_link_id_length * 2) :
+ (SPIDER_SQL_INT_LEN * 6)
+ ) +
sid_str_length +
limit_str_length +
(where_clause_length * 2) +
@@ -9546,7 +10744,14 @@ int spider_db_udf_ping_table_append_mon_next(
str->append_escape_string(child_table_name_str.ptr(), child_table_name_str.length());
str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- str->qs_append(link_id);
+ if (static_link_id)
+ {
+ str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
+ str->append_for_single_quote(static_link_id, static_link_id_length);
+ str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
+ } else {
+ str->qs_append(link_id);
+ }
str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
str->qs_append(flags);
str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
@@ -9637,17 +10842,17 @@ int spider_db_udf_ping_table_mon_next(
SPIDER_SHARE *share = table_mon->share;
int init_sql_alloc_size =
spider_param_init_sql_alloc_size(thd, share->init_sql_alloc_size);
-#if defined(_MSC_VER) || defined(__SUNPRO_CC)
- spider_string sql_str(init_sql_alloc_size);
- sql_str.set_charset(thd->variables.character_set_client);
-#else
- char sql_buf[init_sql_alloc_size];
- spider_string sql_str(sql_buf, sizeof(sql_buf),
- thd->variables.character_set_client);
-#endif
ha_spider spider;
SPIDER_TRX trx;
DBUG_ENTER("spider_db_udf_ping_table_mon_next");
+ char *sql_buf = (char *) my_alloca(init_sql_alloc_size);
+ if (!sql_buf)
+ {
+ my_error(HA_ERR_OUT_OF_MEM, MYF(0));
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ spider_string sql_str(sql_buf, sizeof(sql_buf),
+ thd->variables.character_set_client);
sql_str.init_calc_mem(132);
sql_str.length(0);
trx.thd = thd;
@@ -9658,11 +10863,15 @@ int spider_db_udf_ping_table_mon_next(
share->access_charset = thd->variables.character_set_client;
if ((error_num = spider_db_udf_ping_table_append_mon_next(&sql_str,
- child_table_name, child_table_name_length, link_id, where_clause,
+ child_table_name, child_table_name_length, link_id,
+ table_mon->parent->share->static_link_ids[0],
+ table_mon->parent->share->static_link_ids_lengths[0],
+ where_clause,
where_clause_length, first_sid, full_mon_count, current_mon_count,
success_count, fault_count, flags, limit)))
{
my_error(error_num, MYF(0));
+ my_afree(sql_buf);
DBUG_RETURN(error_num);
}
@@ -9684,6 +10893,7 @@ int spider_db_udf_ping_table_mon_next(
pthread_mutex_unlock(&conn->mta_conn_mutex);
my_error(ER_CONNECT_TO_FOREIGN_DATA_SOURCE, MYF(0),
share->server_names[0]);
+ my_afree(sql_buf);
DBUG_RETURN(ER_CONNECT_TO_FOREIGN_DATA_SOURCE);
}
if ((error_num = spider_db_set_names(&spider, conn, 0)))
@@ -9694,6 +10904,7 @@ int spider_db_udf_ping_table_mon_next(
conn->mta_conn_mutex_unlock_later = FALSE;
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
+ my_afree(sql_buf);
DBUG_RETURN(error_num);
}
spider_conn_set_timeout_from_share(conn, 0, thd, share);
@@ -9708,6 +10919,7 @@ int spider_db_udf_ping_table_mon_next(
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
+ my_afree(sql_buf);
DBUG_RETURN(spider_db_errorno(conn));
}
st_spider_db_request_key request_key;
@@ -9726,13 +10938,16 @@ int spider_db_udf_ping_table_mon_next(
{
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
+ my_afree(sql_buf);
DBUG_RETURN(error_num);
}
else if ((error_num = spider_db_errorno(conn)))
{
+ my_afree(sql_buf);
DBUG_RETURN(error_num);
}
my_error(HA_ERR_OUT_OF_MEM, MYF(0));
+ my_afree(sql_buf);
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
@@ -9741,6 +10956,7 @@ int spider_db_udf_ping_table_mon_next(
conn->mta_conn_mutex_unlock_later = FALSE;
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
+ my_afree(sql_buf);
error_num = res->fetch_table_mon_status(mon_table_result->result_status);
res->free_result();
delete res;
@@ -9759,8 +10975,13 @@ int spider_db_udf_copy_key_row(
) {
int error_num;
DBUG_ENTER("spider_db_udf_copy_key_row");
+#ifdef SPIDER_use_LEX_CSTRING_for_KEY_Field_name
+ if ((error_num = spider_db_append_name_with_quote_str(str,
+ (char *) field->field_name.str, dbton_id)))
+#else
if ((error_num = spider_db_append_name_with_quote_str(str,
(char *) field->field_name, dbton_id)))
+#endif
DBUG_RETURN(error_num);
if (str->reserve(joint_length + *length + SPIDER_SQL_AND_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
diff --git a/storage/spider/spd_db_conn.h b/storage/spider/spd_db_conn.h
index e137a35243a..e3f95f7b28d 100644
--- a/storage/spider/spd_db_conn.h
+++ b/storage/spider/spd_db_conn.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2008-2015 Kentoku Shiba
+/* Copyright (C) 2008-2018 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
@@ -192,6 +192,8 @@
#define SPIDER_SQL_PF_EQUAL_LEN (sizeof(SPIDER_SQL_PF_EQUAL_STR) - 1)
#define SPIDER_SQL_GROUP_STR " group by "
#define SPIDER_SQL_GROUP_LEN (sizeof(SPIDER_SQL_GROUP_STR) - 1)
+#define SPIDER_SQL_HAVING_STR " having "
+#define SPIDER_SQL_HAVING_LEN (sizeof(SPIDER_SQL_HAVING_STR) - 1)
#define SPIDER_SQL_PLUS_STR " + "
#define SPIDER_SQL_PLUS_LEN (sizeof(SPIDER_SQL_PLUS_STR) - 1)
#define SPIDER_SQL_MINUS_STR " - "
@@ -250,6 +252,13 @@
#define SPIDER_SQL_B_STR "b"
#define SPIDER_SQL_B_LEN (sizeof(SPIDER_SQL_B_STR) - 1)
+#define SPIDER_SQL_INDEX_IGNORE_STR " IGNORE INDEX "
+#define SPIDER_SQL_INDEX_IGNORE_LEN (sizeof(SPIDER_SQL_INDEX_IGNORE_STR) - 1)
+#define SPIDER_SQL_INDEX_USE_STR " USE INDEX "
+#define SPIDER_SQL_INDEX_USE_LEN (sizeof(SPIDER_SQL_INDEX_USE_STR) - 1)
+#define SPIDER_SQL_INDEX_FORCE_STR " FORCE INDEX "
+#define SPIDER_SQL_INDEX_FORCE_LEN (sizeof(SPIDER_SQL_INDEX_FORCE_STR) - 1)
+
#define SPIDER_SQL_INT_LEN 20
#define SPIDER_SQL_HANDLER_CID_LEN 6
#define SPIDER_SQL_HANDLER_CID_FORMAT "t%05u"
@@ -263,6 +272,13 @@ int spider_db_connect(
int link_idx
);
+int spider_db_ping_internal(
+ SPIDER_SHARE *share,
+ SPIDER_CONN *conn,
+ int all_link_idx,
+ int *need_mon
+);
+
int spider_db_ping(
ha_spider *spider,
SPIDER_CONN *conn,
@@ -325,7 +341,7 @@ int spider_db_query_for_bulk_update(
ha_spider *spider,
SPIDER_CONN *conn,
int link_idx,
- uint *dup_key_found
+ ha_rows *dup_key_found
);
size_t spider_db_real_escape_string(
@@ -396,7 +412,20 @@ int spider_db_unlock_tables(
int spider_db_append_name_with_quote_str(
spider_string *str,
- char *name,
+ const char *name,
+ uint dbton_id
+);
+
+int spider_db_append_name_with_quote_str(
+ spider_string *str,
+ LEX_CSTRING &name,
+ uint dbton_id
+);
+
+int spider_db_append_name_with_quote_str_internal(
+ spider_string *str,
+ const char *name,
+ int length,
uint dbton_id
);
@@ -550,6 +579,10 @@ void spider_db_free_one_result(
SPIDER_RESULT *result
);
+void spider_db_free_one_quick_result(
+ SPIDER_RESULT *result
+);
+
int spider_db_free_result(
ha_spider *spider,
bool final
@@ -713,7 +746,7 @@ int spider_db_bulk_update_size_limit(
int spider_db_bulk_update_end(
ha_spider *spider,
- uint *dup_key_found
+ ha_rows *dup_key_found
);
int spider_db_bulk_update(
@@ -729,19 +762,27 @@ int spider_db_update(
);
#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
+#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS_WITH_HS
int spider_db_direct_update(
ha_spider *spider,
TABLE *table,
KEY_MULTI_RANGE *ranges,
uint range_count,
- uint *update_rows
+ ha_rows *update_rows
+);
+#else
+int spider_db_direct_update(
+ ha_spider *spider,
+ TABLE *table,
+ ha_rows *update_rows
);
#endif
+#endif
#ifdef HA_CAN_BULK_ACCESS
int spider_db_bulk_direct_update(
ha_spider *spider,
- uint *update_rows
+ ha_rows *update_rows
);
#endif
@@ -758,14 +799,22 @@ int spider_db_delete(
);
#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
+#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS_WITH_HS
int spider_db_direct_delete(
ha_spider *spider,
TABLE *table,
KEY_MULTI_RANGE *ranges,
uint range_count,
- uint *delete_rows
+ ha_rows *delete_rows
+);
+#else
+int spider_db_direct_delete(
+ ha_spider *spider,
+ TABLE *table,
+ ha_rows *delete_rows
);
#endif
+#endif
int spider_db_delete_all_rows(
ha_spider *spider
@@ -806,13 +855,31 @@ int spider_db_flush_logs(
ha_spider *spider
);
+Field *spider_db_find_field_in_item_list(
+ Item **item_list,
+ uint item_count,
+ uint start_item,
+ spider_string *str,
+ const char *func_name,
+ int func_name_length
+);
+
int spider_db_print_item_type(
Item *item,
+ Field *field,
ha_spider *spider,
spider_string *str,
const char *alias,
uint alias_length,
- uint dbton_id
+ uint dbton_id,
+ bool use_fields,
+ spider_fields *fields
+);
+
+int spider_db_print_item_type_default(
+ Item *item,
+ ha_spider *spider,
+ spider_string *str
);
int spider_db_open_item_cond(
@@ -821,7 +888,9 @@ int spider_db_open_item_cond(
spider_string *str,
const char *alias,
uint alias_length,
- uint dbton_id
+ uint dbton_id,
+ bool use_fields,
+ spider_fields *fields
);
int spider_db_open_item_func(
@@ -830,7 +899,9 @@ int spider_db_open_item_func(
spider_string *str,
const char *alias,
uint alias_length,
- uint dbton_id
+ uint dbton_id,
+ bool use_fields,
+ spider_fields *fields
);
#ifdef HANDLER_HAS_DIRECT_AGGREGATE
@@ -840,7 +911,9 @@ int spider_db_open_item_sum_func(
spider_string *str,
const char *alias,
uint alias_length,
- uint dbton_id
+ uint dbton_id,
+ bool use_fields,
+ spider_fields *fields
);
#endif
@@ -850,7 +923,9 @@ int spider_db_open_item_ident(
spider_string *str,
const char *alias,
uint alias_length,
- uint dbton_id
+ uint dbton_id,
+ bool use_fields,
+ spider_fields *fields
);
int spider_db_open_item_field(
@@ -859,7 +934,9 @@ int spider_db_open_item_field(
spider_string *str,
const char *alias,
uint alias_length,
- uint dbton_id
+ uint dbton_id,
+ bool use_fields,
+ spider_fields *fields
);
int spider_db_open_item_ref(
@@ -868,7 +945,9 @@ int spider_db_open_item_ref(
spider_string *str,
const char *alias,
uint alias_length,
- uint dbton_id
+ uint dbton_id,
+ bool use_fields,
+ spider_fields *fields
);
int spider_db_open_item_row(
@@ -877,43 +956,57 @@ int spider_db_open_item_row(
spider_string *str,
const char *alias,
uint alias_length,
- uint dbton_id
+ uint dbton_id,
+ bool use_fields,
+ spider_fields *fields
);
int spider_db_open_item_string(
Item *item,
+ Field *field,
ha_spider *spider,
spider_string *str,
const char *alias,
uint alias_length,
- uint dbton_id
+ uint dbton_id,
+ bool use_fields,
+ spider_fields *fields
);
int spider_db_open_item_int(
Item *item,
+ Field *field,
ha_spider *spider,
spider_string *str,
const char *alias,
uint alias_length,
- uint dbton_id
+ uint dbton_id,
+ bool use_fields,
+ spider_fields *fields
);
int spider_db_open_item_cache(
Item_cache *item_cache,
+ Field *field,
ha_spider *spider,
spider_string *str,
const char *alias,
uint alias_length,
- uint dbton_id
+ uint dbton_id,
+ bool use_fields,
+ spider_fields *fields
);
int spider_db_open_item_insert_value(
Item_insert_value *item_insert_value,
+ Field *field,
ha_spider *spider,
spider_string *str,
const char *alias,
uint alias_length,
- uint dbton_id
+ uint dbton_id,
+ bool use_fields,
+ spider_fields *fields
);
int spider_db_append_condition(
@@ -929,7 +1022,9 @@ int spider_db_append_update_columns(
spider_string *str,
const char *alias,
uint alias_length,
- uint dbton_id
+ uint dbton_id,
+ bool use_fields,
+ spider_fields *fields
);
#endif
diff --git a/storage/spider/spd_db_handlersocket.cc b/storage/spider/spd_db_handlersocket.cc
index b977444d4f2..1e42838f40a 100644
--- a/storage/spider/spd_db_handlersocket.cc
+++ b/storage/spider/spd_db_handlersocket.cc
@@ -1,4 +1,4 @@
-/* Copyright (C) 2012-2014 Kentoku Shiba
+/* Copyright (C) 2012-2018 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
@@ -14,7 +14,9 @@
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */
#define MYSQL_SERVER 1
+#include <my_global.h>
#include "mysql_version.h"
+#include "spd_environ.h"
#if MYSQL_VERSION_ID < 50500
#include "mysql_priv.h"
#include <mysql/plugin.h>
@@ -38,6 +40,7 @@
extern handlerton *spider_hton_ptr;
extern HASH spider_open_connections;
+extern HASH spider_ipport_conns;
extern SPIDER_DBTON spider_dbton[SPIDER_DBTON_SIZE];
extern const char spider_dig_upper[];
@@ -105,6 +108,12 @@ SPIDER_DB_CONN *spider_handlersocket_create_conn(
DBUG_RETURN(new spider_db_handlersocket(conn));
}
+bool spider_handlersocket_support_direct_join(
+) {
+ DBUG_ENTER("spider_handlersocket_support_direct_join");
+ DBUG_RETURN(FALSE);
+}
+
spider_db_handlersocket_util spider_db_handlersocket_utility;
SPIDER_DBTON spider_dbton_handlersocket = {
@@ -117,6 +126,7 @@ SPIDER_DBTON spider_dbton_handlersocket = {
spider_handlersocket_create_handler,
NULL,
spider_handlersocket_create_conn,
+ spider_handlersocket_support_direct_join,
&spider_db_handlersocket_utility
};
@@ -349,7 +359,7 @@ spider_string *spider_db_hs_str_buffer::add(
spider_db_handlersocket_row::spider_db_handlersocket_row() :
spider_db_row(spider_dbton_handlersocket.dbton_id),
- hs_row(NULL), field_count(0), cloned(FALSE)
+ hs_row(NULL), field_count(0), row_size(0), cloned(FALSE)
{
DBUG_ENTER("spider_db_handlersocket_row::spider_db_handlersocket_row");
DBUG_PRINT("info",("spider this=%p", this));
@@ -487,18 +497,13 @@ SPIDER_DB_ROW *spider_db_handlersocket_row::clone()
{
spider_db_handlersocket_row *clone_row;
char *tmp_char;
- uint row_size, i;
+ uint i;
DBUG_ENTER("spider_db_handlersocket_row::clone");
DBUG_PRINT("info",("spider this=%p", this));
- if (!(clone_row = new spider_db_handlersocket_row()))
+ if (!(clone_row = new spider_db_handlersocket_row(dbton_id)))
{
DBUG_RETURN(NULL);
}
- row_size = 0;
- for (i = 0; i < field_count; i++)
- {
- row_size += hs_row_first[i].size();
- }
if (!spider_bulk_malloc(spider_current_trx, 169, MYF(MY_WME),
&clone_row->hs_row, sizeof(SPIDER_HS_STRING_REF) * field_count,
&tmp_char, row_size,
@@ -515,6 +520,7 @@ SPIDER_DB_ROW *spider_db_handlersocket_row::clone()
}
clone_row->hs_row_first = clone_row->hs_row;
clone_row->cloned = TRUE;;
+ clone_row->row_size = row_size;;
DBUG_RETURN(NULL);
}
@@ -550,6 +556,13 @@ int spider_db_handlersocket_row::store_to_tmp_table(
DBUG_RETURN(tmp_table->file->ha_write_row(tmp_table->record[0]));
}
+uint spider_db_handlersocket_row::get_byte_size()
+{
+ DBUG_ENTER("spider_db_handlersocket_row::get_byte_size");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(row_size);
+}
+
spider_db_handlersocket_result_buffer::spider_db_handlersocket_result_buffer(
) : spider_db_result_buffer()
@@ -589,7 +602,8 @@ bool spider_db_handlersocket_result_buffer::check_size(
}
spider_db_handlersocket_result::spider_db_handlersocket_result(
-) : spider_db_result(spider_dbton_handlersocket.dbton_id)
+ SPIDER_DB_CONN *in_db_conn
+) : spider_db_result(in_db_conn), row(in_db_conn->dbton_id)
{
DBUG_ENTER("spider_db_handlersocket_result::spider_db_handlersocket_result");
DBUG_PRINT("info",("spider this=%p", this));
@@ -665,6 +679,7 @@ SPIDER_DB_ROW *spider_db_handlersocket_result::fetch_row()
}
row.field_count = field_count;
row.hs_row_first = row.hs_row;
+ row.row_size = (*hs_conn_p)->get_row_size();
DBUG_RETURN((SPIDER_DB_ROW *) &row);
}
@@ -683,6 +698,7 @@ SPIDER_DB_ROW *spider_db_handlersocket_result::fetch_row_from_result_buffer(
}
row.field_count = field_count;
row.hs_row_first = row.hs_row;
+ row.row_size = (*hs_conn_p)->get_row_size_from_result(hs_res_buf->hs_result);
DBUG_RETURN((SPIDER_DB_ROW *) &row);
}
@@ -718,6 +734,7 @@ SPIDER_DB_ROW *spider_db_handlersocket_result::fetch_row_from_tmp_table(
}
tmp_hs_row++;
}
+ row.row_size = row_ptr - tmp_str2.ptr();
DBUG_RETURN((SPIDER_DB_ROW *) &row);
}
@@ -1226,7 +1243,7 @@ spider_db_result *spider_db_handlersocket::store_result(
*spider_res_buf = (spider_db_result_buffer *) hs_res_buf;
}
hs_res_buf->clear();
- if (!(result = new spider_db_handlersocket_result()))
+ if (!(result = new spider_db_handlersocket_result(this)))
{
*error_num = HA_ERR_OUT_OF_MEM;
DBUG_RETURN(NULL);
@@ -1436,7 +1453,7 @@ spider_db_result *spider_db_handlersocket::use_result(
spider_db_handlersocket_result *result;
DBUG_ENTER("spider_db_handlersocket::use_result");
DBUG_PRINT("info",("spider this=%p", this));
- if (!(result = new spider_db_handlersocket_result()))
+ if (!(result = new spider_db_handlersocket_result(this)))
{
*error_num = HA_ERR_OUT_OF_MEM;
DBUG_RETURN(NULL);
@@ -1839,6 +1856,22 @@ int spider_db_handlersocket::set_time_zone(
DBUG_RETURN(0);
}
+int spider_db_handlersocket::show_master_status(
+ SPIDER_TRX *trx,
+ SPIDER_SHARE *share,
+ int all_link_idx,
+ int *need_mon,
+ TABLE *table,
+ spider_string *str,
+ int mode,
+ SPIDER_DB_RESULT **res1,
+ SPIDER_DB_RESULT **res2
+) {
+ DBUG_ENTER("spider_db_handlersocket::show_master_status");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(0);
+}
+
int spider_db_handlersocket::append_sql(
char *sql,
ulong sql_length,
@@ -2719,19 +2752,22 @@ int spider_db_handlersocket_util::open_item_func(
ha_spider *spider,
spider_string *str,
const char *alias,
- uint alias_length
+ uint alias_length,
+ bool use_fields,
+ spider_fields *fields
) {
uint dbton_id = spider_dbton_handlersocket.dbton_id;
int error_num;
Item *item, **item_list = item_func->arguments();
uint roop_count, item_count = item_func->argument_count(), start_item = 0;
const char *func_name = SPIDER_SQL_NULL_CHAR_STR,
- *separete_str = SPIDER_SQL_NULL_CHAR_STR,
+ *separator_str = SPIDER_SQL_NULL_CHAR_STR,
*last_str = SPIDER_SQL_NULL_CHAR_STR;
int func_name_length = SPIDER_SQL_NULL_CHAR_LEN,
- separete_str_length = SPIDER_SQL_NULL_CHAR_LEN,
+ separator_str_length = SPIDER_SQL_NULL_CHAR_LEN,
last_str_length = SPIDER_SQL_NULL_CHAR_LEN;
int use_pushdown_udf;
+ bool merge_func = FALSE;
DBUG_ENTER("spider_db_handlersocket_util::open_item_func");
if (str)
{
@@ -2794,8 +2830,8 @@ int spider_db_handlersocket_util::open_item_func(
) {
if (str)
str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- DBUG_RETURN(spider_db_open_item_int(item_func, spider, str,
- alias, alias_length, dbton_id));
+ DBUG_RETURN(spider_db_open_item_int(item_func, NULL, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields));
} else if (
!strncasecmp("case", func_name, func_name_length)
) {
@@ -2810,8 +2846,8 @@ int spider_db_handlersocket_util::open_item_func(
if (item_func_case->first_expr_num != -1)
{
if ((error_num = spider_db_print_item_type(
- item_list[item_func_case->first_expr_num], spider, str,
- alias, alias_length, dbton_id)))
+ item_list[item_func_case->first_expr_num], NULL, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields)))
DBUG_RETURN(error_num);
}
for (roop_count = 0; roop_count < item_func_case->ncases;
@@ -2824,8 +2860,8 @@ int spider_db_handlersocket_util::open_item_func(
str->q_append(SPIDER_SQL_WHEN_STR, SPIDER_SQL_WHEN_LEN);
}
if ((error_num = spider_db_print_item_type(
- item_list[roop_count], spider, str,
- alias, alias_length, dbton_id)))
+ item_list[roop_count], NULL, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields)))
DBUG_RETURN(error_num);
if (str)
{
@@ -2834,8 +2870,8 @@ int spider_db_handlersocket_util::open_item_func(
str->q_append(SPIDER_SQL_THEN_STR, SPIDER_SQL_THEN_LEN);
}
if ((error_num = spider_db_print_item_type(
- item_list[roop_count + 1], spider, str,
- alias, alias_length, dbton_id)))
+ item_list[roop_count + 1], NULL, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields)))
DBUG_RETURN(error_num);
}
if (item_func_case->else_expr_num != -1)
@@ -2847,8 +2883,8 @@ int spider_db_handlersocket_util::open_item_func(
str->q_append(SPIDER_SQL_ELSE_STR, SPIDER_SQL_ELSE_LEN);
}
if ((error_num = spider_db_print_item_type(
- item_list[item_func_case->else_expr_num], spider, str,
- alias, alias_length, dbton_id)))
+ item_list[item_func_case->else_expr_num], NULL, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields)))
DBUG_RETURN(error_num);
}
if (str)
@@ -2884,8 +2920,8 @@ int spider_db_handlersocket_util::open_item_func(
) {
if (str)
str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- DBUG_RETURN(spider_db_open_item_string(item_func, spider, str,
- alias, alias_length, dbton_id));
+ DBUG_RETURN(spider_db_open_item_string(item_func, NULL, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields));
} else if (
!strncasecmp("convert", func_name, func_name_length)
) {
@@ -2909,42 +2945,111 @@ int spider_db_handlersocket_util::open_item_func(
) {
if (str)
str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- DBUG_RETURN(spider_db_open_item_string(item_func, spider, str,
- alias, alias_length, dbton_id));
+ DBUG_RETURN(spider_db_open_item_string(item_func, NULL, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields));
} else if (func_name_length == 9 &&
!strncasecmp("isnottrue", func_name, func_name_length)
) {
last_str = SPIDER_SQL_IS_NOT_TRUE_STR;
last_str_length = SPIDER_SQL_IS_NOT_TRUE_LEN;
break;
- } else if (func_name_length == 10 &&
- !strncasecmp("isnotfalse", func_name, func_name_length)
- ) {
- last_str = SPIDER_SQL_IS_NOT_FALSE_STR;
- last_str_length = SPIDER_SQL_IS_NOT_FALSE_LEN;
- break;
+ } else if (func_name_length == 10)
+ {
+ if (!strncasecmp("isnotfalse", func_name, func_name_length))
+ {
+ last_str = SPIDER_SQL_IS_NOT_FALSE_STR;
+ last_str_length = SPIDER_SQL_IS_NOT_FALSE_LEN;
+ break;
+ } else if (!strncasecmp("column_get", func_name, func_name_length))
+ {
+ if (str)
+ {
+ str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
+ if (str->reserve(func_name_length + SPIDER_SQL_OPEN_PAREN_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(func_name, func_name_length);
+ str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
+ }
+ func_name = SPIDER_SQL_COMMA_STR;
+ func_name_length = SPIDER_SQL_COMMA_LEN;
+ separator_str = SPIDER_SQL_COMMA_STR;
+ separator_str_length = SPIDER_SQL_COMMA_LEN;
+ break;
+ }
} else if (func_name_length == 12)
{
if (!strncasecmp("cast_as_date", func_name, func_name_length))
{
+ item = item_list[0];
+ if (item->type() == Item::FUNC_ITEM)
+ {
+ DBUG_PRINT("info",("spider child is FUNC_ITEM"));
+ Item_func *ifunc = (Item_func *) item;
+ if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
+ {
+ const char *child_func_name;
+ int child_func_name_length;
+ DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
+ child_func_name = (char*) ifunc->func_name();
+ child_func_name_length = strlen(child_func_name);
+ DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
+ if (
+ child_func_name_length == 10 &&
+ !strncasecmp("column_get", child_func_name, child_func_name_length)
+ ) {
+ DBUG_PRINT("info",("spider this is merge func"));
+ merge_func = TRUE;
+ }
+ }
+ }
+
if (str)
{
str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- if (str->reserve(SPIDER_SQL_CAST_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
+ if (!merge_func)
+ {
+ if (str->reserve(SPIDER_SQL_CAST_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
+ }
}
last_str = SPIDER_SQL_AS_DATE_STR;
last_str_length = SPIDER_SQL_AS_DATE_LEN;
break;
} else if (!strncasecmp("cast_as_time", func_name, func_name_length))
{
+ item = item_list[0];
+ if (item->type() == Item::FUNC_ITEM)
+ {
+ DBUG_PRINT("info",("spider child is FUNC_ITEM"));
+ Item_func *ifunc = (Item_func *) item;
+ if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
+ {
+ const char *child_func_name;
+ int child_func_name_length;
+ DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
+ child_func_name = (char*) ifunc->func_name();
+ child_func_name_length = strlen(child_func_name);
+ DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
+ if (
+ child_func_name_length == 10 &&
+ !strncasecmp("column_get", child_func_name, child_func_name_length)
+ ) {
+ DBUG_PRINT("info",("spider this is merge func"));
+ merge_func = TRUE;
+ }
+ }
+ }
+
if (str)
{
str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- if (str->reserve(SPIDER_SQL_CAST_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
+ if (!merge_func)
+ {
+ if (str->reserve(SPIDER_SQL_CAST_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
+ }
}
last_str = SPIDER_SQL_AS_TIME_STR;
last_str_length = SPIDER_SQL_AS_TIME_LEN;
@@ -2956,8 +3061,8 @@ int spider_db_handlersocket_util::open_item_func(
{
if (str)
str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- DBUG_RETURN(spider_db_open_item_string(item_func, spider, str,
- alias, alias_length, dbton_id));
+ DBUG_RETURN(spider_db_open_item_string(item_func, NULL, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields));
} else if (!strncasecmp("timestampdiff", func_name, func_name_length))
{
#ifdef ITEM_FUNC_TIMESTAMPDIFF_ARE_PUBLIC
@@ -3019,8 +3124,8 @@ int spider_db_handlersocket_util::open_item_func(
str->q_append(interval_str, interval_len);
str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
}
- if ((error_num = spider_db_print_item_type(item_list[0], spider,
- str, alias, alias_length, dbton_id)))
+ if ((error_num = spider_db_print_item_type(item_list[0], NULL, spider,
+ str, alias, alias_length, dbton_id, use_fields, fields)))
DBUG_RETURN(error_num);
if (str)
{
@@ -3028,8 +3133,8 @@ int spider_db_handlersocket_util::open_item_func(
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
}
- if ((error_num = spider_db_print_item_type(item_list[1], spider,
- str, alias, alias_length, dbton_id)))
+ if ((error_num = spider_db_print_item_type(item_list[1], NULL, spider,
+ str, alias, alias_length, dbton_id, use_fields, fields)))
DBUG_RETURN(error_num);
if (str)
{
@@ -3047,6 +3152,29 @@ int spider_db_handlersocket_util::open_item_func(
{
if (!strncasecmp("cast_as_binary", func_name, func_name_length))
{
+ item = item_list[0];
+ if (item->type() == Item::FUNC_ITEM)
+ {
+ DBUG_PRINT("info",("spider child is FUNC_ITEM"));
+ Item_func *ifunc = (Item_func *) item;
+ if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
+ {
+ const char *child_func_name;
+ int child_func_name_length;
+ DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
+ child_func_name = (char*) ifunc->func_name();
+ child_func_name_length = strlen(child_func_name);
+ DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
+ if (
+ child_func_name_length == 10 &&
+ !strncasecmp("column_get", child_func_name, child_func_name_length)
+ ) {
+ DBUG_PRINT("info",("spider this is merge func"));
+ merge_func = TRUE;
+ }
+ }
+ }
+
if (str)
{
char tmp_buf[MAX_FIELD_WIDTH], *tmp_ptr, *tmp_ptr2;
@@ -3054,9 +3182,12 @@ int spider_db_handlersocket_util::open_item_func(
tmp_str.init_calc_mem(123);
tmp_str.length(0);
str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- if (str->reserve(SPIDER_SQL_CAST_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
+ if (!merge_func)
+ {
+ if (str->reserve(SPIDER_SQL_CAST_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
+ }
#if MYSQL_VERSION_ID < 50500
item_func->print(tmp_str.get_str(), QT_IS);
#else
@@ -3075,12 +3206,38 @@ int spider_db_handlersocket_util::open_item_func(
break;
} else if (!strncasecmp("cast_as_signed", func_name, func_name_length))
{
+ item = item_list[0];
+ if (item->type() == Item::FUNC_ITEM)
+ {
+ DBUG_PRINT("info",("spider child is FUNC_ITEM"));
+ Item_func *ifunc = (Item_func *) item;
+ if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
+ {
+ const char *child_func_name;
+ int child_func_name_length;
+ DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
+ child_func_name = (char*) ifunc->func_name();
+ child_func_name_length = strlen(child_func_name);
+ DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
+ if (
+ child_func_name_length == 10 &&
+ !strncasecmp("column_get", child_func_name, child_func_name_length)
+ ) {
+ DBUG_PRINT("info",("spider this is merge func"));
+ merge_func = TRUE;
+ }
+ }
+ }
+
if (str)
{
str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- if (str->reserve(SPIDER_SQL_CAST_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
+ if (!merge_func)
+ {
+ if (str->reserve(SPIDER_SQL_CAST_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
+ }
}
last_str = SPIDER_SQL_AS_SIGNED_STR;
last_str_length = SPIDER_SQL_AS_SIGNED_LEN;
@@ -3090,12 +3247,38 @@ int spider_db_handlersocket_util::open_item_func(
{
if (!strncasecmp("cast_as_unsigned", func_name, func_name_length))
{
+ item = item_list[0];
+ if (item->type() == Item::FUNC_ITEM)
+ {
+ DBUG_PRINT("info",("spider child is FUNC_ITEM"));
+ Item_func *ifunc = (Item_func *) item;
+ if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
+ {
+ const char *child_func_name;
+ int child_func_name_length;
+ DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
+ child_func_name = (char*) ifunc->func_name();
+ child_func_name_length = strlen(child_func_name);
+ DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
+ if (
+ child_func_name_length == 10 &&
+ !strncasecmp("column_get", child_func_name, child_func_name_length)
+ ) {
+ DBUG_PRINT("info",("spider this is merge func"));
+ merge_func = TRUE;
+ }
+ }
+ }
+
if (str)
{
str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- if (str->reserve(SPIDER_SQL_CAST_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
+ if (!merge_func)
+ {
+ if (str->reserve(SPIDER_SQL_CAST_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
+ }
}
last_str = SPIDER_SQL_AS_UNSIGNED_STR;
last_str_length = SPIDER_SQL_AS_UNSIGNED_LEN;
@@ -3103,6 +3286,29 @@ int spider_db_handlersocket_util::open_item_func(
} else if (!strncasecmp("decimal_typecast", func_name,
func_name_length))
{
+ item = item_list[0];
+ if (item->type() == Item::FUNC_ITEM)
+ {
+ DBUG_PRINT("info",("spider child is FUNC_ITEM"));
+ Item_func *ifunc = (Item_func *) item;
+ if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
+ {
+ const char *child_func_name;
+ int child_func_name_length;
+ DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
+ child_func_name = (char*) ifunc->func_name();
+ child_func_name_length = strlen(child_func_name);
+ DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
+ if (
+ child_func_name_length == 10 &&
+ !strncasecmp("column_get", child_func_name, child_func_name_length)
+ ) {
+ DBUG_PRINT("info",("spider this is merge func"));
+ merge_func = TRUE;
+ }
+ }
+ }
+
if (str)
{
char tmp_buf[MAX_FIELD_WIDTH], *tmp_ptr, *tmp_ptr2;
@@ -3110,9 +3316,12 @@ int spider_db_handlersocket_util::open_item_func(
tmp_str.init_calc_mem(124);
tmp_str.length(0);
str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- if (str->reserve(SPIDER_SQL_CAST_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
+ if (!merge_func)
+ {
+ if (str->reserve(SPIDER_SQL_CAST_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
+ }
#if MYSQL_VERSION_ID < 50500
item_func->print(tmp_str.get_str(), QT_IS);
#else
@@ -3132,12 +3341,38 @@ int spider_db_handlersocket_util::open_item_func(
} else if (!strncasecmp("cast_as_datetime", func_name,
func_name_length))
{
+ item = item_list[0];
+ if (item->type() == Item::FUNC_ITEM)
+ {
+ DBUG_PRINT("info",("spider child is FUNC_ITEM"));
+ Item_func *ifunc = (Item_func *) item;
+ if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
+ {
+ const char *child_func_name;
+ int child_func_name_length;
+ DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
+ child_func_name = (char*) ifunc->func_name();
+ child_func_name_length = strlen(child_func_name);
+ DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
+ if (
+ child_func_name_length == 10 &&
+ !strncasecmp("column_get", child_func_name, child_func_name_length)
+ ) {
+ DBUG_PRINT("info",("spider this is merge func"));
+ merge_func = TRUE;
+ }
+ }
+ }
+
if (str)
{
str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- if (str->reserve(SPIDER_SQL_CAST_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
+ if (!merge_func)
+ {
+ if (str->reserve(SPIDER_SQL_CAST_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
+ }
}
last_str = SPIDER_SQL_AS_DATETIME_STR;
last_str_length = SPIDER_SQL_AS_DATETIME_LEN;
@@ -3152,8 +3387,8 @@ int spider_db_handlersocket_util::open_item_func(
func_name = spider_db_timefunc_interval_str[
item_date_add_interval->int_type];
func_name_length = strlen(func_name);
- if ((error_num = spider_db_print_item_type(item_list[0], spider, str,
- alias, alias_length, dbton_id)))
+ if ((error_num = spider_db_print_item_type(item_list[0], NULL, spider,
+ str, alias, alias_length, dbton_id, use_fields, fields)))
DBUG_RETURN(error_num);
if (str)
{
@@ -3169,8 +3404,8 @@ int spider_db_handlersocket_util::open_item_func(
str->q_append(SPIDER_SQL_INTERVAL_STR, SPIDER_SQL_INTERVAL_LEN);
}
}
- if ((error_num = spider_db_print_item_type(item_list[1], spider, str,
- alias, alias_length, dbton_id)))
+ if ((error_num = spider_db_print_item_type(item_list[1], NULL, spider,
+ str, alias, alias_length, dbton_id, use_fields, fields)))
DBUG_RETURN(error_num);
if (str)
{
@@ -3192,18 +3427,42 @@ int spider_db_handlersocket_util::open_item_func(
}
func_name = SPIDER_SQL_COMMA_STR;
func_name_length = SPIDER_SQL_COMMA_LEN;
- separete_str = SPIDER_SQL_COMMA_STR;
- separete_str_length = SPIDER_SQL_COMMA_LEN;
+ separator_str = SPIDER_SQL_COMMA_STR;
+ separator_str_length = SPIDER_SQL_COMMA_LEN;
last_str = SPIDER_SQL_CLOSE_PAREN_STR;
last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
break;
case Item_func::NOW_FUNC:
if (str)
str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- DBUG_RETURN(spider_db_open_item_string(item_func, spider, str,
- alias, alias_length, dbton_id));
+ DBUG_RETURN(spider_db_open_item_string(item_func, NULL, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields));
case Item_func::CHAR_TYPECAST_FUNC:
+ DBUG_PRINT("info",("spider CHAR_TYPECAST_FUNC"));
{
+ item = item_list[0];
+ if (item->type() == Item::FUNC_ITEM)
+ {
+ DBUG_PRINT("info",("spider child is FUNC_ITEM"));
+ Item_func *ifunc = (Item_func *) item;
+ if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
+ {
+ const char *child_func_name;
+ int child_func_name_length;
+ DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
+ child_func_name = (char*) ifunc->func_name();
+ child_func_name_length = strlen(child_func_name);
+ DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
+ if (
+ child_func_name_length == 10 &&
+ !strncasecmp("column_get", child_func_name, child_func_name_length)
+ ) {
+ DBUG_PRINT("info",("spider this is merge func"));
+ merge_func = TRUE;
+ }
+ }
+ }
+
if (str)
{
char tmp_buf[MAX_FIELD_WIDTH], *tmp_ptr, *tmp_ptr2;
@@ -3211,9 +3470,12 @@ int spider_db_handlersocket_util::open_item_func(
tmp_str.init_calc_mem(125);
tmp_str.length(0);
str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- if (str->reserve(SPIDER_SQL_CAST_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
+ if (!merge_func)
+ {
+ if (str->reserve(SPIDER_SQL_CAST_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
+ }
#if MYSQL_VERSION_ID < 50500
item_func->print(tmp_str.get_str(), QT_IS);
#else
@@ -3246,12 +3508,15 @@ int spider_db_handlersocket_util::open_item_func(
bool has_other_item = FALSE;
while((item = lif++))
{
+#ifdef SPIDER_HAS_EXPR_CACHE_ITEM
if (
item->type() == Item::EXPR_CACHE_ITEM
) {
DBUG_PRINT("info",("spider EXPR_CACHE_ITEM"));
has_expr_cache_item = TRUE;
- } else if (
+ } else
+#endif
+ if (
item->type() == Item::FUNC_ITEM &&
((Item_func *) item)->functype() == Item_func::ISNOTNULL_FUNC
) {
@@ -3296,15 +3561,15 @@ int spider_db_handlersocket_util::open_item_func(
{
func_name = SPIDER_SQL_NOT_IN_STR;
func_name_length = SPIDER_SQL_NOT_IN_LEN;
- separete_str = SPIDER_SQL_COMMA_STR;
- separete_str_length = SPIDER_SQL_COMMA_LEN;
+ separator_str = SPIDER_SQL_COMMA_STR;
+ separator_str_length = SPIDER_SQL_COMMA_LEN;
last_str = SPIDER_SQL_CLOSE_PAREN_STR;
last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
} else {
func_name = SPIDER_SQL_IN_STR;
func_name_length = SPIDER_SQL_IN_LEN;
- separete_str = SPIDER_SQL_COMMA_STR;
- separete_str_length = SPIDER_SQL_COMMA_LEN;
+ separator_str = SPIDER_SQL_COMMA_STR;
+ separator_str_length = SPIDER_SQL_COMMA_LEN;
last_str = SPIDER_SQL_CLOSE_PAREN_STR;
last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
}
@@ -3314,13 +3579,13 @@ int spider_db_handlersocket_util::open_item_func(
{
func_name = SPIDER_SQL_NOT_BETWEEN_STR;
func_name_length = SPIDER_SQL_NOT_BETWEEN_LEN;
- separete_str = SPIDER_SQL_AND_STR;
- separete_str_length = SPIDER_SQL_AND_LEN;
+ separator_str = SPIDER_SQL_AND_STR;
+ separator_str_length = SPIDER_SQL_AND_LEN;
} else {
func_name = (char*) item_func->func_name();
func_name_length = strlen(func_name);
- separete_str = SPIDER_SQL_AND_STR;
- separete_str_length = SPIDER_SQL_AND_LEN;
+ separator_str = SPIDER_SQL_AND_STR;
+ separator_str_length = SPIDER_SQL_AND_LEN;
}
break;
case Item_func::UDF_FUNC:
@@ -3341,8 +3606,8 @@ int spider_db_handlersocket_util::open_item_func(
}
func_name = SPIDER_SQL_COMMA_STR;
func_name_length = SPIDER_SQL_COMMA_LEN;
- separete_str = SPIDER_SQL_COMMA_STR;
- separete_str_length = SPIDER_SQL_COMMA_LEN;
+ separator_str = SPIDER_SQL_COMMA_STR;
+ separator_str_length = SPIDER_SQL_COMMA_LEN;
last_str = SPIDER_SQL_CLOSE_PAREN_STR;
last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
break;
@@ -3355,18 +3620,18 @@ int spider_db_handlersocket_util::open_item_func(
str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
DBUG_RETURN(
spider_db_open_item_cond((Item_cond *) item_func, spider, str,
- alias, alias_length, dbton_id));
+ alias, alias_length, dbton_id, use_fields, fields));
case Item_func::TRIG_COND_FUNC:
DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
case Item_func::GUSERVAR_FUNC:
if (str)
str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
if (item_func->result_type() == STRING_RESULT)
- DBUG_RETURN(spider_db_open_item_string(item_func, spider, str,
- alias, alias_length, dbton_id));
+ DBUG_RETURN(spider_db_open_item_string(item_func, NULL, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields));
else
- DBUG_RETURN(spider_db_open_item_int(item_func, spider, str,
- alias, alias_length, dbton_id));
+ DBUG_RETURN(spider_db_open_item_int(item_func, NULL, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields));
case Item_func::FT_FUNC:
if (spider_db_check_ft_idx(item_func, spider) == MAX_KEY)
DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
@@ -3377,8 +3642,8 @@ int spider_db_handlersocket_util::open_item_func(
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_MATCH_STR, SPIDER_SQL_MATCH_LEN);
}
- separete_str = SPIDER_SQL_COMMA_STR;
- separete_str_length = SPIDER_SQL_COMMA_LEN;
+ separator_str = SPIDER_SQL_COMMA_STR;
+ separator_str_length = SPIDER_SQL_COMMA_LEN;
last_str = SPIDER_SQL_CLOSE_PAREN_STR;
last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
break;
@@ -3395,8 +3660,8 @@ int spider_db_handlersocket_util::open_item_func(
}
func_name = SPIDER_SQL_COMMA_STR;
func_name_length = SPIDER_SQL_COMMA_LEN;
- separete_str = SPIDER_SQL_COMMA_STR;
- separete_str_length = SPIDER_SQL_COMMA_LEN;
+ separator_str = SPIDER_SQL_COMMA_STR;
+ separator_str_length = SPIDER_SQL_COMMA_LEN;
last_str = SPIDER_SQL_CLOSE_PAREN_STR;
last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
break;
@@ -3427,8 +3692,8 @@ int spider_db_handlersocket_util::open_item_func(
}
func_name = SPIDER_SQL_COMMA_STR;
func_name_length = SPIDER_SQL_COMMA_LEN;
- separete_str = SPIDER_SQL_COMMA_STR;
- separete_str_length = SPIDER_SQL_COMMA_LEN;
+ separator_str = SPIDER_SQL_COMMA_STR;
+ separator_str_length = SPIDER_SQL_COMMA_LEN;
last_str = SPIDER_SQL_CLOSE_PAREN_STR;
last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
break;
@@ -3461,8 +3726,8 @@ int spider_db_handlersocket_util::open_item_func(
}
DBUG_PRINT("info",("spider func_name = %s", func_name));
DBUG_PRINT("info",("spider func_name_length = %d", func_name_length));
- DBUG_PRINT("info",("spider separete_str = %s", separete_str));
- DBUG_PRINT("info",("spider separete_str_length = %d", separete_str_length));
+ DBUG_PRINT("info",("spider separator_str = %s", separator_str));
+ DBUG_PRINT("info",("spider separator_str_length = %d", separator_str_length));
DBUG_PRINT("info",("spider last_str = %s", last_str));
DBUG_PRINT("info",("spider last_str_length = %d", last_str_length));
if (item_count)
@@ -3471,13 +3736,13 @@ int spider_db_handlersocket_util::open_item_func(
for (roop_count = start_item; roop_count < item_count; roop_count++)
{
item = item_list[roop_count];
- if ((error_num = spider_db_print_item_type(item, spider, str,
- alias, alias_length, dbton_id)))
+ if ((error_num = spider_db_print_item_type(item, NULL, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields)))
DBUG_RETURN(error_num);
if (roop_count == 1)
{
- func_name = separete_str;
- func_name_length = separete_str_length;
+ func_name = separator_str;
+ func_name_length = separator_str_length;
}
if (str)
{
@@ -3489,8 +3754,8 @@ int spider_db_handlersocket_util::open_item_func(
}
}
item = item_list[roop_count];
- if ((error_num = spider_db_print_item_type(item, spider, str,
- alias, alias_length, dbton_id)))
+ if ((error_num = spider_db_print_item_type(item, NULL, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields)))
DBUG_RETURN(error_num);
}
if (item_func->functype() == Item_func::FT_FUNC)
@@ -3503,8 +3768,8 @@ int spider_db_handlersocket_util::open_item_func(
str->q_append(SPIDER_SQL_AGAINST_STR, SPIDER_SQL_AGAINST_LEN);
}
item = item_list[0];
- if ((error_num = spider_db_print_item_type(item, spider, str,
- alias, alias_length, dbton_id)))
+ if ((error_num = spider_db_print_item_type(item, NULL, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields)))
DBUG_RETURN(error_num);
if (str)
{
@@ -3532,7 +3797,8 @@ int spider_db_handlersocket_util::open_item_func(
{
Item_func_conv_charset *item_func_conv_charset =
(Item_func_conv_charset *)item_func;
- CHARSET_INFO *conv_charset = item_func_conv_charset->conv_charset;
+ CHARSET_INFO *conv_charset =
+ item_func_conv_charset->SPIDER_Item_func_conv_charset_conv_charset;
uint cset_length = strlen(conv_charset->csname);
if (str->reserve(SPIDER_SQL_USING_LEN + cset_length))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
@@ -3543,6 +3809,8 @@ int spider_db_handlersocket_util::open_item_func(
}
if (str)
{
+ if (merge_func)
+ str->length(str->length() - SPIDER_SQL_CLOSE_PAREN_LEN);
if (str->reserve(last_str_length + SPIDER_SQL_CLOSE_PAREN_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(last_str, last_str_length);
@@ -3557,7 +3825,9 @@ int spider_db_handlersocket_util::open_item_sum_func(
ha_spider *spider,
spider_string *str,
const char *alias,
- uint alias_length
+ uint alias_length,
+ bool use_fields,
+ spider_fields *fields
) {
uint dbton_id = spider_dbton_handlersocket.dbton_id;
uint roop_count, item_count = item_sum->get_arg_count();
@@ -3586,8 +3856,8 @@ int spider_db_handlersocket_util::open_item_sum_func(
for (roop_count = 0; roop_count < item_count; roop_count++)
{
item = args[roop_count];
- if ((error_num = spider_db_print_item_type(item, spider, str,
- alias, alias_length, dbton_id)))
+ if ((error_num = spider_db_print_item_type(item, NULL, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields)))
DBUG_RETURN(error_num);
if (str)
{
@@ -3597,8 +3867,8 @@ int spider_db_handlersocket_util::open_item_sum_func(
}
}
item = args[roop_count];
- if ((error_num = spider_db_print_item_type(item, spider, str,
- alias, alias_length, dbton_id)))
+ if ((error_num = spider_db_print_item_type(item, NULL, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields)))
DBUG_RETURN(error_num);
}
if (str)
@@ -3636,10 +3906,55 @@ int spider_db_handlersocket_util::append_escaped_util(
DBUG_RETURN(0);
}
+#ifdef SPIDER_HAS_GROUP_BY_HANDLER
+int spider_db_handlersocket_util::append_from_and_tables(
+ ha_spider *spider,
+ spider_fields *fields,
+ spider_string *str,
+ TABLE_LIST *table_list,
+ uint table_count
+) {
+ DBUG_ENTER("spider_db_handlersocket_util::append_from_and_tables");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_db_handlersocket_util::reappend_tables(
+ spider_fields *fields,
+ SPIDER_LINK_IDX_CHAIN *link_idx_chain,
+ spider_string *str
+) {
+ DBUG_ENTER("spider_db_handlersocket_util::reappend_tables");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_db_handlersocket_util::append_where(
+ spider_string *str
+) {
+ DBUG_ENTER("spider_db_handlersocket_util::append_where");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_db_handlersocket_util::append_having(
+ spider_string *str
+) {
+ DBUG_ENTER("spider_db_handlersocket_util::append_having");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+#endif
+
spider_handlersocket_share::spider_handlersocket_share(
st_spider_share *share
) : spider_db_share(
- share
+ share,
+ spider_dbton_handlersocket.dbton_id
),
table_names_str(NULL),
db_names_str(NULL),
@@ -3904,7 +4219,7 @@ int spider_handlersocket_share::create_column_name_str()
str->init_calc_mem(202);
str->set_charset(spider_share->access_charset);
if ((error_num = spider_db_append_name_with_quote_str(str,
- (char *) (*field)->field_name, dbton_id)))
+ (*field)->field_name, dbton_id)))
goto error;
}
DBUG_RETURN(0);
@@ -4051,6 +4366,16 @@ int spider_handlersocket_handler::init()
DBUG_RETURN(0);
}
+int spider_handlersocket_handler::append_index_hint(
+ spider_string *str,
+ int link_idx,
+ ulong sql_type
+ )
+{
+ DBUG_ENTER("spider_handlersocket_handler::append_index_hint");
+ DBUG_RETURN(0);
+}
+
int spider_handlersocket_handler::append_table_name_with_adjusting(
spider_string *str,
int link_idx,
@@ -4998,7 +5323,7 @@ int spider_handlersocket_handler::is_sole_projection_field(
uint16 field_index
) {
DBUG_ENTER("spider_handlersocket_handler::is_sole_projection_field");
- DBUG_PRINT("info", ("spider this=%p", this));
+ DBUG_PRINT("info",("spider this=%p", this));
DBUG_ASSERT(0);
DBUG_RETURN(0);
}
@@ -5365,6 +5690,19 @@ bool spider_handlersocket_handler::need_lock_before_set_sql_for_exec(
DBUG_RETURN(TRUE);
}
+#ifdef SPIDER_HAS_GROUP_BY_HANDLER
+int spider_handlersocket_handler::set_sql_for_exec(
+ ulong sql_type,
+ int link_idx,
+ SPIDER_LINK_IDX_CHAIN *link_idx_chain
+) {
+ DBUG_ENTER("spider_handlersocket_handler::set_sql_for_exec");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+#endif
+
int spider_handlersocket_handler::set_sql_for_exec(
ulong sql_type,
int link_idx
@@ -5442,7 +5780,7 @@ int spider_handlersocket_handler::show_table_status(
int sts_mode,
uint flag
) {
- spider_db_handlersocket_result res;
+ spider_db_handlersocket_result res(NULL);
SPIDER_SHARE *share = spider->share;
ulonglong auto_increment_value = 0;
DBUG_ENTER("spider_handlersocket_show_table_status");
@@ -5790,4 +6128,100 @@ int spider_handlersocket_handler::reset_union_table_name(
DBUG_ASSERT(0);
DBUG_RETURN(0);
}
+
+#ifdef SPIDER_HAS_GROUP_BY_HANDLER
+int spider_handlersocket_handler::append_list_item_select_part(
+ List<Item> *select,
+ const char *alias,
+ uint alias_length,
+ bool use_fields,
+ spider_fields *fields,
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_handlersocket_handler::append_list_item_select_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::append_from_and_tables_part(
+ spider_fields *fields,
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_handlersocket_handler::append_from_and_tables_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::reappend_tables_part(
+ spider_fields *fields,
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_handlersocket_handler::reappend_tables_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::append_where_part(
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_handlersocket_handler::append_where_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::append_having_part(
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_handlersocket_handler::append_having_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::append_item_type_part(
+ Item *item,
+ const char *alias,
+ uint alias_length,
+ bool use_fields,
+ spider_fields *fields,
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_handlersocket_handler::append_item_type_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::append_group_by_part(
+ ORDER *order,
+ const char *alias,
+ uint alias_length,
+ bool use_fields,
+ spider_fields *fields,
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_handlersocket_handler::append_group_by_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+
+int spider_handlersocket_handler::append_order_by_part(
+ ORDER *order,
+ const char *alias,
+ uint alias_length,
+ bool use_fields,
+ spider_fields *fields,
+ ulong sql_type
+) {
+ DBUG_ENTER("spider_handlersocket_handler::append_order_by_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(0);
+ DBUG_RETURN(0);
+}
+#endif
#endif
diff --git a/storage/spider/spd_db_handlersocket.h b/storage/spider/spd_db_handlersocket.h
index 6796acc26c3..d1b59386cbe 100644
--- a/storage/spider/spd_db_handlersocket.h
+++ b/storage/spider/spd_db_handlersocket.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2012-2014 Kentoku Shiba
+/* Copyright (C) 2012-2018 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
@@ -94,7 +94,9 @@ public:
ha_spider *spider,
spider_string *str,
const char *alias,
- uint alias_length
+ uint alias_length,
+ bool use_fields,
+ spider_fields *fields
);
#ifdef HANDLER_HAS_DIRECT_AGGREGATE
int open_item_sum_func(
@@ -102,13 +104,39 @@ public:
ha_spider *spider,
spider_string *str,
const char *alias,
- uint alias_length
+ uint alias_length,
+ bool use_fields,
+ spider_fields *fields
);
#endif
int append_escaped_util(
spider_string *to,
String *from
);
+ int append_escaped_util(
+ spider_string *to,
+ String *from
+ );
+#ifdef SPIDER_HAS_GROUP_BY_HANDLER
+ int append_from_and_tables(
+ ha_spider *spider,
+ spider_fields *fields,
+ spider_string *str,
+ TABLE_LIST *table_list,
+ uint table_count
+ );
+ int reappend_tables(
+ spider_fields *fields,
+ SPIDER_LINK_IDX_CHAIN *link_idx_chain,
+ spider_string *str
+ );
+ int append_where(
+ spider_string *str
+ );
+ int append_having(
+ spider_string *str
+ );
+#endif
};
class spider_db_handlersocket_row: public spider_db_row
@@ -117,6 +145,7 @@ public:
SPIDER_HS_STRING_REF *hs_row;
SPIDER_HS_STRING_REF *hs_row_first;
uint field_count;
+ uint row_size;
bool cloned;
spider_db_handlersocket_row();
~spider_db_handlersocket_row();
@@ -145,6 +174,7 @@ public:
TABLE *tmp_table,
spider_string *str
);
+ uint get_byte_size();
};
class spider_db_handlersocket_result_buffer: public spider_db_result_buffer
@@ -167,7 +197,7 @@ public:
SPIDER_HS_STRING_REF hs_row;
uint field_count;
int store_error_num;
- spider_db_handlersocket_result();
+ spider_db_handlersocket_result(SPIDER_DB_CONN *in_db_conn);
~spider_db_handlersocket_result();
bool has_result();
void free_result();
@@ -355,6 +385,17 @@ public:
Time_zone *time_zone,
int *need_mon
);
+ int show_master_status(
+ SPIDER_TRX *trx,
+ SPIDER_SHARE *share,
+ int all_link_idx,
+ int *need_mon,
+ TABLE *table,
+ spider_string *str,
+ int mode,
+ SPIDER_DB_RESULT **res1,
+ SPIDER_DB_RESULT **res2
+ );
int append_sql(
char *sql,
ulong sql_length,
@@ -505,6 +546,11 @@ public:
);
~spider_handlersocket_handler();
int init();
+ int append_index_hint(
+ spider_string *str,
+ int link_idx,
+ ulong sql_type
+ );
int append_table_name_with_adjusting(
spider_string *str,
int link_idx,
@@ -849,6 +895,13 @@ public:
bool need_lock_before_set_sql_for_exec(
ulong sql_type
);
+#ifdef SPIDER_HAS_GROUP_BY_HANDLER
+ int set_sql_for_exec(
+ ulong sql_type,
+ int link_idx,
+ SPIDER_LINK_IDX_CHAIN *link_idx_chain
+ );
+#endif
int set_sql_for_exec(
ulong sql_type,
int link_idx
@@ -960,4 +1013,52 @@ public:
int link_idx,
ulong sql_type
);
+#ifdef SPIDER_HAS_GROUP_BY_HANDLER
+ int append_from_and_tables_part(
+ spider_fields *fields,
+ ulong sql_type
+ );
+ int reappend_tables_part(
+ spider_fields *fields,
+ ulong sql_type
+ );
+ int append_where_part(
+ ulong sql_type
+ );
+ int append_having_part(
+ ulong sql_type
+ );
+ int append_item_type_part(
+ Item *item,
+ const char *alias,
+ uint alias_length,
+ bool use_fields,
+ spider_fields *fields,
+ ulong sql_type
+ );
+ int append_list_item_select_part(
+ List<Item> *select,
+ const char *alias,
+ uint alias_length,
+ bool use_fields,
+ spider_fields *fields,
+ ulong sql_type
+ );
+ int append_group_by_part(
+ ORDER *order,
+ const char *alias,
+ uint alias_length,
+ bool use_fields,
+ spider_fields *fields,
+ ulong sql_type
+ );
+ int append_order_by_part(
+ ORDER *order,
+ const char *alias,
+ uint alias_length,
+ bool use_fields,
+ spider_fields *fields,
+ ulong sql_type
+ );
+#endif
};
diff --git a/storage/spider/spd_db_include.cc b/storage/spider/spd_db_include.cc
new file mode 100644
index 00000000000..2910aa97690
--- /dev/null
+++ b/storage/spider/spd_db_include.cc
@@ -0,0 +1,51 @@
+/* Copyright (C) 2018-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
+ 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
+#include <my_global.h>
+#include "mysql_version.h"
+#include "spd_environ.h"
+#if MYSQL_VERSION_ID < 50500
+#include "mysql_priv.h"
+#include <mysql/plugin.h>
+#else
+#include "sql_priv.h"
+#include "probes_mysql.h"
+#include "sql_class.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"
+
+spider_db_result::spider_db_result(
+ SPIDER_DB_CONN *in_db_conn
+) : db_conn(in_db_conn), dbton_id(in_db_conn->dbton_id)
+{
+ DBUG_ENTER("spider_db_result::spider_db_result");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_VOID_RETURN;
+}
+
+spider_db_conn::spider_db_conn(
+ SPIDER_CONN *in_conn
+) : conn(in_conn), dbton_id(in_conn->dbton_id)
+{
+ DBUG_ENTER("spider_db_conn::spider_db_conn");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_VOID_RETURN;
+}
diff --git a/storage/spider/spd_db_include.h b/storage/spider/spd_db_include.h
index 39e2c8650c4..d51770c1a77 100644
--- a/storage/spider/spd_db_include.h
+++ b/storage/spider/spd_db_include.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2008-2014 Kentoku Shiba
+/* Copyright (C) 2008-2018 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
@@ -18,7 +18,22 @@
#include "hstcpcli.hpp"
#endif
+#define SPIDER_DBTON_SIZE 15
+
#define SPIDER_DB_WRAPPER_MYSQL "mysql"
+#define SPIDER_DB_WRAPPER_MARIADB "mariadb"
+
+#if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100204
+#define PLUGIN_VAR_CAN_MEMALLOC
+/*
+#define ITEM_FUNC_CASE_PARAMS_ARE_PUBLIC
+#define HASH_UPDATE_WITH_HASH_VALUE
+*/
+#else
+#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
+#define HANDLER_HAS_DIRECT_UPDATE_ROWS_WITH_HS
+#endif
+#endif
#if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100002
#define SPIDER_HAS_DISCOVER_TABLE_STRUCTURE
@@ -31,7 +46,6 @@
#endif
#if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100007
-#define SPIDER_HAS_DISCOVER_TABLE_STRUCTURE_COMMENT
#define SPIDER_ITEM_HAS_CMP_TYPE
#endif
@@ -47,6 +61,14 @@
#endif
#endif
+#if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100108
+#define SPIDER_HAS_GROUP_BY_HANDLER
+#endif
+
+#if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100200
+#define SPIDER_ORDER_HAS_ENUM_ORDER
+#endif
+
#if defined(MARIADB_BASE_VERSION)
#define SPIDER_ITEM_GEOFUNC_NAME_HAS_MBR
#define SPIDER_HANDLER_AUTO_REPAIR_HAS_ERROR
@@ -184,32 +206,32 @@ typedef st_spider_result SPIDER_RESULT;
#define SPIDER_SQL_LCL_NAME_QUOTE_STR "`"
#define SPIDER_SQL_LCL_NAME_QUOTE_LEN (sizeof(SPIDER_SQL_LCL_NAME_QUOTE_STR) - 1)
-#define SPIDER_CONN_KIND_MYSQL (1U << 0)
+#define SPIDER_CONN_KIND_MYSQL (1 << 0)
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
-#define SPIDER_CONN_KIND_HS_READ (1U << 2)
-#define SPIDER_CONN_KIND_HS_WRITE (1U << 3)
+#define SPIDER_CONN_KIND_HS_READ (1 << 2)
+#define SPIDER_CONN_KIND_HS_WRITE (1 << 3)
#endif
-#define SPIDER_SQL_KIND_SQL (1U << 0)
-#define SPIDER_SQL_KIND_HANDLER (1U << 1)
+#define SPIDER_SQL_KIND_SQL (1 << 0)
+#define SPIDER_SQL_KIND_HANDLER (1 << 1)
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
-#define SPIDER_SQL_KIND_HS (1U << 2)
+#define SPIDER_SQL_KIND_HS (1 << 2)
#endif
-#define SPIDER_SQL_TYPE_SELECT_SQL (1U << 0)
-#define SPIDER_SQL_TYPE_INSERT_SQL (1U << 1)
-#define SPIDER_SQL_TYPE_UPDATE_SQL (1U << 2)
-#define SPIDER_SQL_TYPE_DELETE_SQL (1U << 3)
-#define SPIDER_SQL_TYPE_BULK_UPDATE_SQL (1U << 4)
-#define SPIDER_SQL_TYPE_TMP_SQL (1U << 5)
-#define SPIDER_SQL_TYPE_DROP_TMP_TABLE_SQL (1U << 6)
-#define SPIDER_SQL_TYPE_OTHER_SQL (1U << 7)
-#define SPIDER_SQL_TYPE_HANDLER (1U << 8)
-#define SPIDER_SQL_TYPE_SELECT_HS (1U << 9)
-#define SPIDER_SQL_TYPE_INSERT_HS (1U << 10)
-#define SPIDER_SQL_TYPE_UPDATE_HS (1U << 11)
-#define SPIDER_SQL_TYPE_DELETE_HS (1U << 12)
-#define SPIDER_SQL_TYPE_OTHER_HS (1U << 13)
+#define SPIDER_SQL_TYPE_SELECT_SQL (1 << 0)
+#define SPIDER_SQL_TYPE_INSERT_SQL (1 << 1)
+#define SPIDER_SQL_TYPE_UPDATE_SQL (1 << 2)
+#define SPIDER_SQL_TYPE_DELETE_SQL (1 << 3)
+#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)
enum spider_bulk_upd_start {
SPD_BU_NOT_START,
@@ -533,6 +555,172 @@ public:
bool is_ascii() const;
};
+typedef struct spider_table_link_idx_holder SPIDER_TABLE_LINK_IDX_HOLDER;
+typedef struct spider_table_holder SPIDER_TABLE_HOLDER;
+
+typedef struct spider_link_idx_holder
+{
+ spider_table_link_idx_holder *table_link_idx_holder;
+ int link_idx;
+ int link_status;
+ spider_link_idx_holder *next_table;
+ spider_link_idx_holder *next;
+} SPIDER_LINK_IDX_HOLDER;
+
+typedef struct spider_link_idx_chain
+{
+ SPIDER_CONN *conn;
+ spider_link_idx_holder *link_idx_holder;
+ spider_link_idx_holder *current_link_idx_holder;
+ int link_status;
+ spider_link_idx_chain *next;
+} SPIDER_LINK_IDX_CHAIN;
+
+typedef struct spider_table_link_idx_holder
+{
+ spider_table_holder *table_holder;
+ spider_link_idx_holder *first_link_idx_holder;
+ spider_link_idx_holder *last_link_idx_holder;
+ spider_link_idx_holder *current_link_idx_holder;
+ uint link_idx_holder_count;
+} SPIDER_TABLE_LINK_IDX_HOLDER;
+
+typedef struct spider_conn_holder
+{
+ SPIDER_CONN *conn;
+ spider_table_link_idx_holder *table_link_idx_holder;
+ uint link_idx_holder_count_max;
+ bool checked_for_same_conn;
+ long access_balance;
+ spider_conn_holder *prev;
+ spider_conn_holder *next;
+} SPIDER_CONN_HOLDER;
+
+typedef struct spider_table_holder
+{
+ TABLE *table;
+ ha_spider *spider;
+ spider_string *alias;
+} SPIDER_TABLE_HOLDER;
+
+typedef struct spider_field_holder
+{
+ Field *field;
+ ha_spider *spider;
+ spider_string *alias;
+ spider_field_holder *next;
+} SPIDER_FIELD_HOLDER;
+
+typedef struct spider_field_chain
+{
+ spider_field_holder *field_holder;
+ spider_field_chain *next;
+} SPIDER_FIELD_CHAIN;
+
+class spider_fields
+{
+ uint dbton_count;
+ uint current_dbton_num;
+ uint dbton_ids[SPIDER_DBTON_SIZE];
+ uint table_count;
+ uint current_table_num;
+ SPIDER_TABLE_HOLDER *table_holder;
+ SPIDER_LINK_IDX_CHAIN *first_link_idx_chain;
+ SPIDER_LINK_IDX_CHAIN *last_link_idx_chain;
+ SPIDER_LINK_IDX_CHAIN *current_link_idx_chain;
+ SPIDER_LINK_IDX_CHAIN *first_ok_link_idx_chain;
+ SPIDER_CONN_HOLDER *first_conn_holder;
+ SPIDER_CONN_HOLDER *last_conn_holder;
+ SPIDER_CONN_HOLDER *current_conn_holder;
+ SPIDER_FIELD_HOLDER *first_field_holder;
+ SPIDER_FIELD_HOLDER *last_field_holder;
+ SPIDER_FIELD_HOLDER *current_field_holder;
+ SPIDER_FIELD_CHAIN *first_field_chain;
+ SPIDER_FIELD_CHAIN *last_field_chain;
+ SPIDER_FIELD_CHAIN *current_field_chain;
+ Field **first_field_ptr;
+ Field **current_field_ptr;
+public:
+ spider_fields();
+ virtual ~spider_fields();
+ void add_dbton_id(
+ uint dbton_id_arg
+ );
+ void set_pos_to_first_dbton_id();
+ uint get_next_dbton_id();
+ int make_link_idx_chain(
+ int link_status
+ );
+ SPIDER_LINK_IDX_CHAIN *create_link_idx_chain();
+ void set_pos_to_first_link_idx_chain();
+ SPIDER_LINK_IDX_CHAIN *get_next_link_idx_chain();
+ SPIDER_LINK_IDX_HOLDER *get_dup_link_idx_holder(
+ SPIDER_TABLE_LINK_IDX_HOLDER *table_link_idx_holder,
+ SPIDER_LINK_IDX_HOLDER *current
+ );
+ bool check_link_ok_chain();
+ bool is_first_link_ok_chain(
+ SPIDER_LINK_IDX_CHAIN *link_idx_chain_arg
+ );
+ int get_ok_link_idx();
+ void set_first_link_idx();
+ int add_link_idx(
+ SPIDER_CONN_HOLDER *conn_holder_arg,
+ ha_spider *spider_arg,
+ int link_idx
+ );
+ SPIDER_LINK_IDX_HOLDER *create_link_idx_holder();
+ void set_pos_to_first_table_on_link_idx_chain(
+ SPIDER_LINK_IDX_CHAIN *link_idx_chain_arg
+ );
+ SPIDER_LINK_IDX_HOLDER *get_next_table_on_link_idx_chain(
+ SPIDER_LINK_IDX_CHAIN *link_idx_chain_arg
+ );
+ SPIDER_CONN_HOLDER *add_conn(
+ SPIDER_CONN *conn_arg,
+ long access_balance
+ );
+ SPIDER_CONN_HOLDER *create_conn_holder();
+ void set_pos_to_first_conn_holder();
+ SPIDER_CONN_HOLDER *get_next_conn_holder();
+ bool has_conn_holder();
+ void clear_conn_holder_from_conn();
+ bool check_conn_same_conn(
+ SPIDER_CONN *conn_arg
+ );
+ bool remove_conn_if_not_checked();
+ void check_support_dbton(
+ uchar *dbton_bitmap
+ );
+ void choose_a_conn();
+ void free_conn_holder(
+ SPIDER_CONN_HOLDER *conn_holder_arg
+ );
+ SPIDER_TABLE_HOLDER *add_table(
+ ha_spider *spider_arg
+ );
+ bool all_query_fields_are_query_table_members();
+ int create_table_holder(
+ uint table_count_arg
+ );
+ void set_pos_to_first_table_holder();
+ SPIDER_TABLE_HOLDER *get_next_table_holder();
+ SPIDER_TABLE_HOLDER *get_table_holder(TABLE *table);
+ uint get_table_count();
+ int add_field(Field *field_arg);
+ SPIDER_FIELD_HOLDER *create_field_holder();
+ void set_pos_to_first_field_holder();
+ SPIDER_FIELD_HOLDER *get_next_field_holder();
+ SPIDER_FIELD_CHAIN *create_field_chain();
+ void set_pos_to_first_field_chain();
+ SPIDER_FIELD_CHAIN *get_next_field_chain();
+ void set_field_ptr(Field **field_arg);
+ Field **get_next_field_ptr();
+ int ping_table_mon_from_table(
+ SPIDER_LINK_IDX_CHAIN *link_idx_chain
+ );
+};
+
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
#define SPIDER_HS_UINT32_INFO dena::uint32_info
#define SPIDER_HS_STRING_REF dena::string_ref
@@ -610,6 +798,7 @@ struct st_spider_db_request_key
class spider_db_util
{
public:
+ uint dbton_id;
spider_db_util() {}
virtual ~spider_db_util() {}
virtual int append_name(
@@ -683,7 +872,9 @@ public:
ha_spider *spider,
spider_string *str,
const char *alias,
- uint alias_length
+ uint alias_length,
+ bool use_fields,
+ spider_fields *fields
) = 0;
#ifdef HANDLER_HAS_DIRECT_AGGREGATE
virtual int open_item_sum_func(
@@ -691,13 +882,35 @@ public:
ha_spider *spider,
spider_string *str,
const char *alias,
- uint alias_length
+ uint alias_length,
+ bool use_fields,
+ spider_fields *fields
) = 0;
#endif
virtual int append_escaped_util(
spider_string *to,
String *from
) = 0;
+#ifdef SPIDER_HAS_GROUP_BY_HANDLER
+ virtual int append_from_and_tables(
+ ha_spider *spider,
+ spider_fields *fields,
+ spider_string *str,
+ TABLE_LIST *table_list,
+ uint table_count
+ ) = 0;
+ virtual int reappend_tables(
+ spider_fields *fields,
+ SPIDER_LINK_IDX_CHAIN *link_idx_chain,
+ spider_string *str
+ ) = 0;
+ virtual int append_where(
+ spider_string *str
+ ) = 0;
+ virtual int append_having(
+ spider_string *str
+ ) = 0;
+#endif
};
class spider_db_row
@@ -732,6 +945,7 @@ public:
TABLE *tmp_table,
spider_string *str
) = 0;
+ virtual uint get_byte_size() = 0;
};
class spider_db_result_buffer
@@ -747,9 +961,11 @@ public:
class spider_db_result
{
+protected:
+ SPIDER_DB_CONN *db_conn;
public:
uint dbton_id;
- spider_db_result(uint in_dbton_id) : dbton_id(in_dbton_id) {}
+ spider_db_result(SPIDER_DB_CONN *in_db_conn);
virtual ~spider_db_result() {}
virtual bool has_result() = 0;
virtual void free_result() = 0;
@@ -815,9 +1031,10 @@ class spider_db_conn
protected:
SPIDER_CONN *conn;
public:
+ uint dbton_id;
spider_db_conn(
- SPIDER_CONN *conn
- ) : conn(conn) {}
+ SPIDER_CONN *in_conn
+ );
virtual ~spider_db_conn() {}
virtual int init() = 0;
virtual bool is_connected() = 0;
@@ -924,6 +1141,17 @@ public:
Time_zone *time_zone,
int *need_mon
) = 0;
+ virtual int show_master_status(
+ SPIDER_TRX *trx,
+ SPIDER_SHARE *share,
+ int all_link_idx,
+ int *need_mon,
+ TABLE *table,
+ spider_string *str,
+ int mode,
+ SPIDER_DB_RESULT **res1,
+ SPIDER_DB_RESULT **res2
+ ) = 0;
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
virtual int append_sql(
char *sql,
@@ -1005,8 +1233,12 @@ protected:
const char *mem_calc_file_name;
ulong mem_calc_line_no;
public:
+ uint dbton_id;
st_spider_share *spider_share;
- spider_db_share(st_spider_share *share) : spider_share(share) {}
+ spider_db_share(
+ st_spider_share *share,
+ uint dbton_id
+ ) : dbton_id(dbton_id), spider_share(share) {}
virtual ~spider_db_share() {}
virtual int init() = 0;
virtual uint get_column_name_length(
@@ -1040,13 +1272,23 @@ protected:
const char *mem_calc_file_name;
ulong mem_calc_line_no;
public:
+ uint dbton_id;
ha_spider *spider;
spider_db_share *db_share;
int first_link_idx;
+#ifdef SPIDER_HAS_GROUP_BY_HANDLER
+ SPIDER_LINK_IDX_CHAIN *link_idx_chain;
+#endif
spider_db_handler(ha_spider *spider, spider_db_share *db_share) :
- spider(spider), db_share(db_share), first_link_idx(-1) {}
+ dbton_id(db_share->dbton_id), spider(spider), db_share(db_share),
+ first_link_idx(-1) {}
virtual ~spider_db_handler() {}
virtual int init() = 0;
+ virtual int append_index_hint(
+ spider_string *str,
+ int link_idx,
+ ulong sql_type
+ ) = 0;
virtual int append_table_name_with_adjusting(
spider_string *str,
int link_idx,
@@ -1106,6 +1348,10 @@ public:
virtual int append_select_part(
ulong sql_type
) = 0;
+ virtual int append_select(
+ spider_string *str,
+ ulong sql_type
+ ) = 0;
virtual int append_table_select_part(
ulong sql_type
) = 0;
@@ -1282,7 +1528,7 @@ public:
int link_idx
) = 0;
virtual bool is_sole_projection_field(
- uint16 field_index
+ uint16 field_index
) = 0;
virtual bool is_bulk_insert_exec_period(
bool bulk_end
@@ -1344,6 +1590,13 @@ public:
virtual bool need_lock_before_set_sql_for_exec(
ulong sql_type
) = 0;
+#ifdef SPIDER_HAS_GROUP_BY_HANDLER
+ virtual int set_sql_for_exec(
+ ulong sql_type,
+ int link_idx,
+ SPIDER_LINK_IDX_CHAIN *link_idx_chain
+ ) = 0;
+#endif
virtual int set_sql_for_exec(
ulong sql_type,
int link_idx
@@ -1454,14 +1707,63 @@ public:
int link_idx,
ulong sql_type
) = 0;
+#ifdef SPIDER_HAS_GROUP_BY_HANDLER
+ virtual int append_from_and_tables_part(
+ spider_fields *fields,
+ ulong sql_type
+ ) = 0;
+ virtual int reappend_tables_part(
+ spider_fields *fields,
+ ulong sql_type
+ ) = 0;
+ virtual int append_where_part(
+ ulong sql_type
+ ) = 0;
+ virtual int append_having_part(
+ ulong sql_type
+ ) = 0;
+ virtual int append_item_type_part(
+ Item *item,
+ const char *alias,
+ uint alias_length,
+ bool use_fields,
+ spider_fields *fields,
+ ulong sql_type
+ ) = 0;
+ virtual int append_list_item_select_part(
+ List<Item> *select,
+ const char *alias,
+ uint alias_length,
+ bool use_fields,
+ spider_fields *fields,
+ ulong sql_type
+ ) = 0;
+ virtual int append_group_by_part(
+ ORDER *order,
+ const char *alias,
+ uint alias_length,
+ bool use_fields,
+ spider_fields *fields,
+ ulong sql_type
+ ) = 0;
+ virtual int append_order_by_part(
+ ORDER *order,
+ const char *alias,
+ uint alias_length,
+ bool use_fields,
+ spider_fields *fields,
+ ulong sql_type
+ ) = 0;
+#endif
};
class spider_db_copy_table
{
public:
+ uint dbton_id;
spider_db_share *db_share;
spider_db_copy_table(spider_db_share *db_share) :
- db_share(db_share) {}
+ dbton_id(db_share->dbton_id), db_share(db_share) {}
virtual ~spider_db_copy_table() {}
virtual int init() = 0;
virtual void set_sql_charset(
@@ -1541,9 +1843,9 @@ 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);
+ bool (*support_direct_join)();
spider_db_util *db_util;
} SPIDER_DBTON;
-#define SPIDER_DBTON_SIZE 15
typedef struct st_spider_position
{
@@ -1657,12 +1959,15 @@ typedef struct st_spider_result_list
int max_order;
int quick_mode;
longlong quick_page_size;
+ longlong quick_page_byte;
int low_mem_read;
int bulk_update_mode;
int bulk_update_size;
spider_bulk_upd_start bulk_update_start;
bool check_direct_order_limit;
bool direct_order_limit;
+ /* the limit_offeset, without where condition */
+ bool direct_limit_offset;
bool direct_distinct;
#ifdef HANDLER_HAS_DIRECT_AGGREGATE
bool direct_aggregate;
diff --git a/storage/spider/spd_db_mysql.cc b/storage/spider/spd_db_mysql.cc
index 1a24d80a95f..ce6aef63fd8 100644
--- a/storage/spider/spd_db_mysql.cc
+++ b/storage/spider/spd_db_mysql.cc
@@ -1,4 +1,4 @@
-/* Copyright (C) 2012-2015 Kentoku Shiba
+/* Copyright (C) 2012-2018 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
@@ -14,7 +14,9 @@
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */
#define MYSQL_SERVER 1
+#include <my_global.h>
#include "mysql_version.h"
+#include "spd_environ.h"
#if MYSQL_VERSION_ID < 50500
#include "mysql_priv.h"
#include <mysql/plugin.h>
@@ -51,9 +53,13 @@ extern bool volatile *spd_abort_loop;
extern handlerton *spider_hton_ptr;
extern pthread_mutex_t spider_open_conn_mutex;
extern HASH spider_open_connections;
+extern HASH spider_ipport_conns;
extern SPIDER_DBTON spider_dbton[SPIDER_DBTON_SIZE];
extern const char spider_dig_upper[];
+spider_db_mysql_util spider_db_mysql_utility;
+spider_db_mariadb_util spider_db_mariadb_utility;
+
#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;
@@ -106,6 +112,15 @@ static const char *name_quote_str = SPIDER_SQL_NAME_QUOTE_STR;
#define SPIDER_SQL_UNLOCK_TABLE_STR "unlock tables"
#define SPIDER_SQL_UNLOCK_TABLE_LEN (sizeof(SPIDER_SQL_UNLOCK_TABLE_STR) - 1)
+#define SPIDER_SQL_LEFT_JOIN_STR " left join "
+#define SPIDER_SQL_LEFT_JOIN_LEN (sizeof(SPIDER_SQL_LEFT_JOIN_STR) - 1)
+#define SPIDER_SQL_RIGHT_JOIN_STR " right join "
+#define SPIDER_SQL_RIGHT_JOIN_LEN (sizeof(SPIDER_SQL_RIGHT_JOIN_STR) - 1)
+#define SPIDER_SQL_JOIN_STR " join "
+#define SPIDER_SQL_JOIN_LEN (sizeof(SPIDER_SQL_JOIN_STR) - 1)
+#define SPIDER_SQL_ON_STR " on "
+#define SPIDER_SQL_ON_LEN (sizeof(SPIDER_SQL_ON_STR) - 1)
+
#define SPIDER_SQL_SHOW_TABLE_STATUS_STR "show table status from "
#define SPIDER_SQL_SHOW_TABLE_STATUS_LEN sizeof(SPIDER_SQL_SHOW_TABLE_STATUS_STR) - 1
#define SPIDER_SQL_SELECT_TABLES_STATUS_STR "select `table_rows`,`avg_row_length`,`data_length`,`max_data_length`,`index_length`,`auto_increment`,`create_time`,`update_time`,`check_time` from `information_schema`.`tables` where `table_schema` = "
@@ -113,6 +128,11 @@ static const char *name_quote_str = SPIDER_SQL_NAME_QUOTE_STR;
#define SPIDER_SQL_SHOW_WARNINGS_STR "show warnings"
#define SPIDER_SQL_SHOW_WARNINGS_LEN sizeof(SPIDER_SQL_SHOW_WARNINGS_STR) - 1
+#define SPIDER_SQL_SHOW_MASTER_STATUS_STR "show master status"
+#define SPIDER_SQL_SHOW_MASTER_STATUS_LEN sizeof(SPIDER_SQL_SHOW_MASTER_STATUS_STR) - 1
+#define SPIDER_SQL_BINLOG_GTID_POS_STR "select binlog_gtid_pos"
+#define SPIDER_SQL_BINLOG_GTID_POS_LEN sizeof(SPIDER_SQL_BINLOG_GTID_POS_STR) - 1
+
#ifdef SPIDER_HAS_DISCOVER_TABLE_STRUCTURE
#define SPIDER_SQL_SHOW_COLUMNS_STR "show columns from "
#define SPIDER_SQL_SHOW_COLUMNS_LEN sizeof(SPIDER_SQL_SHOW_COLUMNS_STR) - 1
@@ -171,18 +191,33 @@ static const char *spider_db_timefunc_interval_str[] =
" minute_microsecond", " second_microsecond"
};
+/* UTC time zone for timestamp columns */
+extern Time_zone *UTC;
+
int spider_mysql_init()
{
DBUG_ENTER("spider_mysql_init");
DBUG_RETURN(0);
}
+int spider_mariadb_init()
+{
+ DBUG_ENTER("spider_mariadb_init");
+ DBUG_RETURN(0);
+}
+
int spider_mysql_deinit()
{
DBUG_ENTER("spider_mysql_deinit");
DBUG_RETURN(0);
}
+int spider_mariadb_deinit()
+{
+ DBUG_ENTER("spider_mariadb_deinit");
+ DBUG_RETURN(0);
+}
+
spider_db_share *spider_mysql_create_share(
SPIDER_SHARE *share
) {
@@ -190,13 +225,29 @@ spider_db_share *spider_mysql_create_share(
DBUG_RETURN(new spider_mysql_share(share));
}
+spider_db_share *spider_mariadb_create_share(
+ SPIDER_SHARE *share
+) {
+ DBUG_ENTER("spider_mariadb_create_share");
+ DBUG_RETURN(new spider_mariadb_share(share));
+}
+
spider_db_handler *spider_mysql_create_handler(
ha_spider *spider,
spider_db_share *db_share
) {
DBUG_ENTER("spider_mysql_create_handler");
DBUG_RETURN(new spider_mysql_handler(spider,
- (spider_mysql_share *) db_share));
+ (spider_mbase_share *) db_share));
+}
+
+spider_db_handler *spider_mariadb_create_handler(
+ ha_spider *spider,
+ spider_db_share *db_share
+) {
+ DBUG_ENTER("spider_mariadb_create_handler");
+ DBUG_RETURN(new spider_mariadb_handler(spider,
+ (spider_mbase_share *) db_share));
}
spider_db_copy_table *spider_mysql_create_copy_table(
@@ -204,7 +255,15 @@ spider_db_copy_table *spider_mysql_create_copy_table(
) {
DBUG_ENTER("spider_mysql_create_copy_table");
DBUG_RETURN(new spider_mysql_copy_table(
- (spider_mysql_share *) db_share));
+ (spider_mbase_share *) db_share));
+}
+
+spider_db_copy_table *spider_mariadb_create_copy_table(
+ spider_db_share *db_share
+) {
+ DBUG_ENTER("spider_mariadb_create_copy_table");
+ DBUG_RETURN(new spider_mariadb_copy_table(
+ (spider_mbase_share *) db_share));
}
SPIDER_DB_CONN *spider_mysql_create_conn(
@@ -214,7 +273,24 @@ SPIDER_DB_CONN *spider_mysql_create_conn(
DBUG_RETURN(new spider_db_mysql(conn));
}
-spider_db_mysql_util spider_db_mysql_utility;
+SPIDER_DB_CONN *spider_mariadb_create_conn(
+ SPIDER_CONN *conn
+) {
+ DBUG_ENTER("spider_mariadb_create_conn");
+ DBUG_RETURN(new spider_db_mariadb(conn));
+}
+
+bool spider_mysql_support_direct_join(
+) {
+ DBUG_ENTER("spider_mysql_support_direct_join");
+ DBUG_RETURN(TRUE);
+}
+
+bool spider_mariadb_support_direct_join(
+) {
+ DBUG_ENTER("spider_mariadb_support_direct_join");
+ DBUG_RETURN(TRUE);
+}
SPIDER_DBTON spider_dbton_mysql = {
0,
@@ -226,21 +302,53 @@ SPIDER_DBTON spider_dbton_mysql = {
spider_mysql_create_handler,
spider_mysql_create_copy_table,
spider_mysql_create_conn,
+ spider_mysql_support_direct_join,
&spider_db_mysql_utility
};
-spider_db_mysql_row::spider_db_mysql_row() :
- spider_db_row(spider_dbton_mysql.dbton_id),
+SPIDER_DBTON spider_dbton_mariadb = {
+ 0,
+ SPIDER_DB_WRAPPER_MARIADB,
+ SPIDER_DB_ACCESS_TYPE_SQL,
+ spider_mariadb_init,
+ spider_mariadb_deinit,
+ spider_mariadb_create_share,
+ spider_mariadb_create_handler,
+ spider_mariadb_create_copy_table,
+ spider_mariadb_create_conn,
+ spider_mariadb_support_direct_join,
+ &spider_db_mariadb_utility
+};
+
+spider_db_mbase_row::spider_db_mbase_row(
+ uint dbton_id
+) : spider_db_row(dbton_id),
row(NULL), lengths(NULL), cloned(FALSE)
{
+ DBUG_ENTER("spider_db_mbase_row::spider_db_mbase_row");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_VOID_RETURN;
+}
+
+spider_db_mysql_row::spider_db_mysql_row() :
+ spider_db_mbase_row(spider_db_mysql_utility.dbton_id)
+{
DBUG_ENTER("spider_db_mysql_row::spider_db_mysql_row");
DBUG_PRINT("info",("spider this=%p", this));
DBUG_VOID_RETURN;
}
-spider_db_mysql_row::~spider_db_mysql_row()
+spider_db_mariadb_row::spider_db_mariadb_row() :
+ spider_db_mbase_row(spider_db_mariadb_utility.dbton_id)
{
- DBUG_ENTER("spider_db_mysql_row::~spider_db_mysql_row");
+ DBUG_ENTER("spider_db_mariadb_row::spider_db_mariadb_row");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_VOID_RETURN;
+}
+
+spider_db_mbase_row::~spider_db_mbase_row()
+{
+ DBUG_ENTER("spider_db_mbase_row::~spider_db_mbase_row");
DBUG_PRINT("info",("spider this=%p", this));
if (cloned)
{
@@ -249,11 +357,25 @@ spider_db_mysql_row::~spider_db_mysql_row()
DBUG_VOID_RETURN;
}
-int spider_db_mysql_row::store_to_field(
+spider_db_mysql_row::~spider_db_mysql_row()
+{
+ DBUG_ENTER("spider_db_mysql_row::~spider_db_mysql_row");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_VOID_RETURN;
+}
+
+spider_db_mariadb_row::~spider_db_mariadb_row()
+{
+ DBUG_ENTER("spider_db_mariadb_row::~spider_db_mariadb_row");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_VOID_RETURN;
+}
+
+int spider_db_mbase_row::store_to_field(
Field *field,
CHARSET_INFO *access_charset
) {
- DBUG_ENTER("spider_db_mysql_row::store_to_field");
+ DBUG_ENTER("spider_db_mbase_row::store_to_field");
DBUG_PRINT("info",("spider this=%p", this));
if (!*row)
{
@@ -290,10 +412,10 @@ int spider_db_mysql_row::store_to_field(
DBUG_RETURN(0);
}
-int spider_db_mysql_row::append_to_str(
+int spider_db_mbase_row::append_to_str(
spider_string *str
) {
- DBUG_ENTER("spider_db_mysql_row::append_to_str");
+ DBUG_ENTER("spider_db_mbase_row::append_to_str");
DBUG_PRINT("info",("spider this=%p", this));
if (str->reserve(*lengths))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
@@ -301,11 +423,11 @@ int spider_db_mysql_row::append_to_str(
DBUG_RETURN(0);
}
-int spider_db_mysql_row::append_escaped_to_str(
+int spider_db_mbase_row::append_escaped_to_str(
spider_string *str,
uint dbton_id
) {
- DBUG_ENTER("spider_db_mysql_row::append_escaped_to_str");
+ DBUG_ENTER("spider_db_mbase_row::append_escaped_to_str");
DBUG_PRINT("info",("spider this=%p", this));
spider_string tmp_str(*row, *lengths + 1, str->charset());
tmp_str.init_calc_mem(133);
@@ -316,50 +438,50 @@ int spider_db_mysql_row::append_escaped_to_str(
DBUG_RETURN(0);
}
-void spider_db_mysql_row::first()
+void spider_db_mbase_row::first()
{
- DBUG_ENTER("spider_db_mysql_row::first");
+ DBUG_ENTER("spider_db_mbase_row::first");
DBUG_PRINT("info",("spider this=%p", this));
row = row_first;
lengths = lengths_first;
DBUG_VOID_RETURN;
}
-void spider_db_mysql_row::next()
+void spider_db_mbase_row::next()
{
- DBUG_ENTER("spider_db_mysql_row::next");
+ DBUG_ENTER("spider_db_mbase_row::next");
DBUG_PRINT("info",("spider this=%p", this));
row++;
lengths++;
DBUG_VOID_RETURN;
}
-bool spider_db_mysql_row::is_null()
+bool spider_db_mbase_row::is_null()
{
- DBUG_ENTER("spider_db_mysql_row::is_null");
+ DBUG_ENTER("spider_db_mbase_row::is_null");
DBUG_PRINT("info",("spider this=%p", this));
DBUG_RETURN(!(*row));
}
-int spider_db_mysql_row::val_int()
+int spider_db_mbase_row::val_int()
{
- DBUG_ENTER("spider_db_mysql_row::val_int");
+ DBUG_ENTER("spider_db_mbase_row::val_int");
DBUG_PRINT("info",("spider this=%p", this));
DBUG_RETURN(*row ? atoi(*row) : 0);
}
-double spider_db_mysql_row::val_real()
+double spider_db_mbase_row::val_real()
{
- DBUG_ENTER("spider_db_mysql_row::val_real");
+ DBUG_ENTER("spider_db_mbase_row::val_real");
DBUG_PRINT("info",("spider this=%p", this));
DBUG_RETURN(*row ? my_atof(*row) : 0.0);
}
-my_decimal *spider_db_mysql_row::val_decimal(
+my_decimal *spider_db_mbase_row::val_decimal(
my_decimal *decimal_value,
CHARSET_INFO *access_charset
) {
- DBUG_ENTER("spider_db_mysql_row::val_decimal");
+ DBUG_ENTER("spider_db_mbase_row::val_decimal");
DBUG_PRINT("info",("spider this=%p", this));
if (!*row)
DBUG_RETURN(NULL);
@@ -375,24 +497,30 @@ my_decimal *spider_db_mysql_row::val_decimal(
DBUG_RETURN(decimal_value);
}
-SPIDER_DB_ROW *spider_db_mysql_row::clone()
+SPIDER_DB_ROW *spider_db_mbase_row::clone()
{
- spider_db_mysql_row *clone_row;
+ spider_db_mbase_row *clone_row;
char *tmp_char;
MYSQL_ROW tmp_row = row_first, ctmp_row;
ulong *tmp_lengths = lengths_first;
uint row_size, i;
- DBUG_ENTER("spider_db_mysql_row::clone");
+ DBUG_ENTER("spider_db_mbase_row::clone");
DBUG_PRINT("info",("spider this=%p", this));
- if (!(clone_row = new spider_db_mysql_row()))
+ if (!(clone_row = new spider_db_mbase_row(dbton_id)))
{
DBUG_RETURN(NULL);
}
- row_size = field_count;
- for (i = 0; i < field_count; i++)
+ if (!record_size)
{
- row_size += *tmp_lengths;
- tmp_lengths++;
+ row_size = field_count;
+ for (i = 0; i < field_count; i++)
+ {
+ row_size += *tmp_lengths;
+ tmp_lengths++;
+ }
+ record_size = row_size - field_count;
+ } else {
+ row_size = record_size + field_count;
}
if (!spider_bulk_malloc(spider_current_trx, 29, MYF(MY_WME),
&clone_row->row, sizeof(char*) * field_count,
@@ -424,20 +552,21 @@ SPIDER_DB_ROW *spider_db_mysql_row::clone()
tmp_row++;
}
clone_row->field_count = field_count;
+ clone_row->record_size = record_size;
clone_row->row_first = clone_row->row;
clone_row->lengths_first = clone_row->lengths;
clone_row->cloned = TRUE;
DBUG_RETURN((SPIDER_DB_ROW *) clone_row);
}
-int spider_db_mysql_row::store_to_tmp_table(
+int spider_db_mbase_row::store_to_tmp_table(
TABLE *tmp_table,
spider_string *str
) {
uint i;
MYSQL_ROW tmp_row = row;
ulong *tmp_lengths = lengths;
- DBUG_ENTER("spider_db_mysql_row::store_to_tmp_table");
+ DBUG_ENTER("spider_db_mbase_row::store_to_tmp_table");
DBUG_PRINT("info",("spider this=%p", this));
str->length(0);
for (i = 0; i < field_count; i++)
@@ -466,18 +595,54 @@ int spider_db_mysql_row::store_to_tmp_table(
DBUG_RETURN(tmp_table->file->ha_write_row(tmp_table->record[0]));
}
-spider_db_mysql_result::spider_db_mysql_result() :
- spider_db_result(spider_dbton_mysql.dbton_id),
- db_result(NULL)
+uint spider_db_mbase_row::get_byte_size()
+{
+ ulong *tmp_lengths = lengths_first;
+ uint i;
+ DBUG_ENTER("spider_db_mbase_row::get_byte_size");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (!record_size)
+ {
+ for (i = 0; i < field_count; i++)
+ {
+ record_size += *tmp_lengths;
+ tmp_lengths++;
+ }
+ }
+ DBUG_RETURN(record_size);
+}
+
+spider_db_mbase_result::spider_db_mbase_result(
+ SPIDER_DB_CONN *in_db_conn
+) : spider_db_result(in_db_conn),
+ db_result(NULL), row(in_db_conn->dbton_id)
+{
+ DBUG_ENTER("spider_db_mbase_result::spider_db_mbase_result");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_VOID_RETURN;
+}
+
+spider_db_mysql_result::spider_db_mysql_result(
+ SPIDER_DB_CONN *in_db_conn
+) : spider_db_mbase_result(in_db_conn)
{
DBUG_ENTER("spider_db_mysql_result::spider_db_mysql_result");
DBUG_PRINT("info",("spider this=%p", this));
DBUG_VOID_RETURN;
}
-spider_db_mysql_result::~spider_db_mysql_result()
+spider_db_mariadb_result::spider_db_mariadb_result(
+ SPIDER_DB_CONN *in_db_conn
+) : spider_db_mbase_result(in_db_conn)
{
- DBUG_ENTER("spider_db_mysql_result::~spider_db_mysql_result");
+ DBUG_ENTER("spider_db_mariadb_result::spider_db_mariadb_result");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_VOID_RETURN;
+}
+
+spider_db_mbase_result::~spider_db_mbase_result()
+{
+ DBUG_ENTER("spider_db_mbase_result::~spider_db_mbase_result");
DBUG_PRINT("info",("spider this=%p", this));
if (db_result)
{
@@ -486,16 +651,30 @@ spider_db_mysql_result::~spider_db_mysql_result()
DBUG_VOID_RETURN;
}
-bool spider_db_mysql_result::has_result()
+spider_db_mysql_result::~spider_db_mysql_result()
+{
+ DBUG_ENTER("spider_db_mysql_result::~spider_db_mysql_result");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_VOID_RETURN;
+}
+
+spider_db_mariadb_result::~spider_db_mariadb_result()
+{
+ DBUG_ENTER("spider_db_mariadb_result::~spider_db_mariadb_result");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_VOID_RETURN;
+}
+
+bool spider_db_mbase_result::has_result()
{
- DBUG_ENTER("spider_db_mysql_result::has_result");
+ DBUG_ENTER("spider_db_mbase_result::has_result");
DBUG_PRINT("info",("spider this=%p", this));
DBUG_RETURN(db_result);
}
-void spider_db_mysql_result::free_result()
+void spider_db_mbase_result::free_result()
{
- DBUG_ENTER("spider_db_mysql_result::free_result");
+ DBUG_ENTER("spider_db_mbase_result::free_result");
DBUG_PRINT("info",("spider this=%p", this));
/* need 2 times execution design */
if (db_result)
@@ -506,47 +685,61 @@ void spider_db_mysql_result::free_result()
DBUG_VOID_RETURN;
}
-SPIDER_DB_ROW *spider_db_mysql_result::current_row()
+SPIDER_DB_ROW *spider_db_mbase_result::current_row()
{
- DBUG_ENTER("spider_db_mysql_result::current_row");
+ DBUG_ENTER("spider_db_mbase_result::current_row");
DBUG_PRINT("info",("spider this=%p", this));
DBUG_RETURN((SPIDER_DB_ROW *) row.clone());
}
-SPIDER_DB_ROW *spider_db_mysql_result::fetch_row()
+SPIDER_DB_ROW *spider_db_mbase_result::fetch_row()
{
- DBUG_ENTER("spider_db_mysql_result::fetch_row");
+ DBUG_ENTER("spider_db_mbase_result::fetch_row");
DBUG_PRINT("info",("spider this=%p", this));
if (!(row.row = mysql_fetch_row(db_result)))
{
- store_error_num = HA_ERR_END_OF_FILE;
+ if (mysql_errno(((spider_db_mbase *) db_conn)->db_conn))
+ {
+ store_error_num = mysql_errno(((spider_db_mbase *) db_conn)->db_conn);
+ my_message(store_error_num,
+ mysql_error(((spider_db_mbase *) db_conn)->db_conn), MYF(0));
+ } else
+ store_error_num = HA_ERR_END_OF_FILE;
DBUG_RETURN(NULL);
}
row.lengths = mysql_fetch_lengths(db_result);
row.field_count = mysql_num_fields(db_result);
row.row_first = row.row;
row.lengths_first = row.lengths;
+ row.record_size = 0;
DBUG_RETURN((SPIDER_DB_ROW *) &row);
}
-SPIDER_DB_ROW *spider_db_mysql_result::fetch_row_from_result_buffer(
+SPIDER_DB_ROW *spider_db_mbase_result::fetch_row_from_result_buffer(
spider_db_result_buffer *spider_res_buf
) {
- DBUG_ENTER("spider_db_mysql_result::fetch_row_from_result_buffer");
+ DBUG_ENTER("spider_db_mbase_result::fetch_row_from_result_buffer");
DBUG_PRINT("info",("spider this=%p", this));
if (!(row.row = mysql_fetch_row(db_result)))
{
- store_error_num = HA_ERR_END_OF_FILE;
+ if (mysql_errno(((spider_db_mbase *) db_conn)->db_conn))
+ {
+ store_error_num = mysql_errno(((spider_db_mbase *) db_conn)->db_conn);
+ my_message(store_error_num,
+ mysql_error(((spider_db_mbase *) db_conn)->db_conn), MYF(0));
+ } else
+ store_error_num = HA_ERR_END_OF_FILE;
DBUG_RETURN(NULL);
}
row.lengths = mysql_fetch_lengths(db_result);
row.field_count = mysql_num_fields(db_result);
row.row_first = row.row;
row.lengths_first = row.lengths;
+ row.record_size = 0;
DBUG_RETURN((SPIDER_DB_ROW *) &row);
}
-SPIDER_DB_ROW *spider_db_mysql_result::fetch_row_from_tmp_table(
+SPIDER_DB_ROW *spider_db_mbase_result::fetch_row_from_tmp_table(
TABLE *tmp_table
) {
uint i;
@@ -555,7 +748,7 @@ SPIDER_DB_ROW *spider_db_mysql_result::fetch_row_from_tmp_table(
MYSQL_ROW tmp_row;
ulong *tmp_lengths;
uint field_count;
- DBUG_ENTER("spider_db_mysql_result::fetch_row_from_tmp_table");
+ DBUG_ENTER("spider_db_mbase_result::fetch_row_from_tmp_table");
DBUG_PRINT("info",("spider this=%p", this));
tmp_str1.init_calc_mem(117);
tmp_str2.init_calc_mem(118);
@@ -575,6 +768,7 @@ SPIDER_DB_ROW *spider_db_mysql_result::fetch_row_from_tmp_table(
row.field_count = field_count;
row.row_first = row.row;
row.lengths_first = row.lengths;
+ row.record_size = tmp_str2.length();
for (i = 0; i < field_count; i++)
{
if (*tmp_row)
@@ -588,7 +782,7 @@ SPIDER_DB_ROW *spider_db_mysql_result::fetch_row_from_tmp_table(
DBUG_RETURN((SPIDER_DB_ROW *) &row);
}
-int spider_db_mysql_result::fetch_table_status(
+int spider_db_mbase_result::fetch_table_status(
int mode,
ha_rows &records,
ulong &mean_rec_length,
@@ -614,18 +808,25 @@ int spider_db_mysql_result::fetch_table_status(
int time_status;
#endif
long not_used_long;
- DBUG_ENTER("spider_db_mysql_result::fetch_table_status");
+ DBUG_ENTER("spider_db_mbase_result::fetch_table_status");
DBUG_PRINT("info",("spider this=%p", this));
if (!(mysql_row = mysql_fetch_row(db_result)))
{
DBUG_PRINT("info",("spider fetch row is null"));
+ if ((error_num = mysql_errno(((spider_db_mbase *) db_conn)->db_conn)))
+ {
+ my_message(error_num,
+ mysql_error(((spider_db_mbase *) db_conn)->db_conn), MYF(0));
+ DBUG_RETURN(error_num);
+ }
DBUG_RETURN(ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM);
}
if (mode == 1)
{
- if (num_fields() != 18)
+ /* Ok to test for 18 fields as all new fields are added last */
+ if (num_fields() < 18)
{
- DBUG_PRINT("info",("spider field_count != 18"));
+ DBUG_PRINT("info",("spider field_count < 18"));
DBUG_RETURN(ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM);
}
@@ -676,8 +877,8 @@ int spider_db_mysql_result::fetch_table_status(
#ifdef SPIDER_HAS_TIME_STATUS
my_time_status_init(&time_status);
#endif
- str_to_datetime(mysql_row[11], strlen(mysql_row[11]), &mysql_time, 0,
- &time_status);
+ SPIDER_str_to_datetime(mysql_row[11], strlen(mysql_row[11]),
+ &mysql_time, 0, &time_status);
#ifdef MARIADB_BASE_VERSION
create_time = (time_t) my_system_gmt_sec(&mysql_time,
&not_used_long, &not_used_uint);
@@ -701,8 +902,8 @@ int spider_db_mysql_result::fetch_table_status(
#ifdef SPIDER_HAS_TIME_STATUS
my_time_status_init(&time_status);
#endif
- str_to_datetime(mysql_row[12], strlen(mysql_row[12]), &mysql_time, 0,
- &time_status);
+ SPIDER_str_to_datetime(mysql_row[12], strlen(mysql_row[12]),
+ &mysql_time, 0, &time_status);
#ifdef MARIADB_BASE_VERSION
update_time = (time_t) my_system_gmt_sec(&mysql_time,
&not_used_long, &not_used_uint);
@@ -726,8 +927,8 @@ int spider_db_mysql_result::fetch_table_status(
#ifdef SPIDER_HAS_TIME_STATUS
my_time_status_init(&time_status);
#endif
- str_to_datetime(mysql_row[13], strlen(mysql_row[13]), &mysql_time, 0,
- &time_status);
+ SPIDER_str_to_datetime(mysql_row[13], strlen(mysql_row[13]),
+ &mysql_time, 0, &time_status);
#ifdef MARIADB_BASE_VERSION
check_time = (time_t) my_system_gmt_sec(&mysql_time,
&not_used_long, &not_used_uint);
@@ -794,8 +995,8 @@ int spider_db_mysql_result::fetch_table_status(
#ifdef SPIDER_HAS_TIME_STATUS
my_time_status_init(&time_status);
#endif
- str_to_datetime(mysql_row[6], strlen(mysql_row[6]), &mysql_time, 0,
- &time_status);
+ SPIDER_str_to_datetime(mysql_row[6], strlen(mysql_row[6]),
+ &mysql_time, 0, &time_status);
#ifdef MARIADB_BASE_VERSION
create_time = (time_t) my_system_gmt_sec(&mysql_time,
&not_used_long, &not_used_uint);
@@ -819,8 +1020,8 @@ int spider_db_mysql_result::fetch_table_status(
#ifdef SPIDER_HAS_TIME_STATUS
my_time_status_init(&time_status);
#endif
- str_to_datetime(mysql_row[7], strlen(mysql_row[7]), &mysql_time, 0,
- &time_status);
+ SPIDER_str_to_datetime(mysql_row[7], strlen(mysql_row[7]),
+ &mysql_time, 0, &time_status);
#ifdef MARIADB_BASE_VERSION
update_time = (time_t) my_system_gmt_sec(&mysql_time,
&not_used_long, &not_used_uint);
@@ -844,8 +1045,8 @@ int spider_db_mysql_result::fetch_table_status(
#ifdef SPIDER_HAS_TIME_STATUS
my_time_status_init(&time_status);
#endif
- str_to_datetime(mysql_row[8], strlen(mysql_row[8]), &mysql_time, 0,
- &time_status);
+ SPIDER_str_to_datetime(mysql_row[8], strlen(mysql_row[8]),
+ &mysql_time, 0, &time_status);
#ifdef MARIADB_BASE_VERSION
check_time = (time_t) my_system_gmt_sec(&mysql_time,
&not_used_long, &not_used_uint);
@@ -868,17 +1069,23 @@ int spider_db_mysql_result::fetch_table_status(
DBUG_RETURN(0);
}
-int spider_db_mysql_result::fetch_table_records(
+int spider_db_mbase_result::fetch_table_records(
int mode,
ha_rows &records
) {
int error_num;
MYSQL_ROW mysql_row;
- DBUG_ENTER("spider_db_mysql_result::fetch_table_records");
+ DBUG_ENTER("spider_db_mbase_result::fetch_table_records");
DBUG_PRINT("info",("spider this=%p", this));
if (!(mysql_row = mysql_fetch_row(db_result)))
{
DBUG_PRINT("info",("spider fetch row is null"));
+ if ((error_num = mysql_errno(((spider_db_mbase *) db_conn)->db_conn)))
+ {
+ my_message(error_num,
+ mysql_error(((spider_db_mbase *) db_conn)->db_conn), MYF(0));
+ DBUG_RETURN(error_num);
+ }
DBUG_RETURN(ER_QUERY_ON_FOREIGN_DATA_SOURCE);
}
if (mode == 1)
@@ -907,7 +1114,7 @@ int spider_db_mysql_result::fetch_table_records(
DBUG_RETURN(0);
}
-int spider_db_mysql_result::fetch_table_cardinality(
+int spider_db_mbase_result::fetch_table_cardinality(
int mode,
TABLE *table,
longlong *cardinality,
@@ -917,12 +1124,18 @@ int spider_db_mysql_result::fetch_table_cardinality(
int error_num;
MYSQL_ROW mysql_row;
Field *field;
- DBUG_ENTER("spider_db_mysql_result::fetch_table_cardinality");
+ DBUG_ENTER("spider_db_mbase_result::fetch_table_cardinality");
DBUG_PRINT("info",("spider this=%p", this));
memset((uchar *) cardinality_upd, 0, sizeof(uchar) * bitmap_size);
if (!(mysql_row = mysql_fetch_row(db_result)))
{
DBUG_PRINT("info",("spider fetch row is null"));
+ if ((error_num = mysql_errno(((spider_db_mbase *) db_conn)->db_conn)))
+ {
+ my_message(error_num,
+ mysql_error(((spider_db_mbase *) db_conn)->db_conn), MYF(0));
+ DBUG_RETURN(error_num);
+ }
/* no index */
DBUG_RETURN(0);
}
@@ -989,18 +1202,31 @@ int spider_db_mysql_result::fetch_table_cardinality(
mysql_row = mysql_fetch_row(db_result);
}
}
+ if ((error_num = mysql_errno(((spider_db_mbase *) db_conn)->db_conn)))
+ {
+ my_message(error_num,
+ mysql_error(((spider_db_mbase *) db_conn)->db_conn), MYF(0));
+ DBUG_RETURN(error_num);
+ }
DBUG_RETURN(0);
}
-int spider_db_mysql_result::fetch_table_mon_status(
+int spider_db_mbase_result::fetch_table_mon_status(
int &status
) {
+ int error_num;
MYSQL_ROW mysql_row;
- DBUG_ENTER("spider_db_mysql_result::fetch_table_mon_status");
+ DBUG_ENTER("spider_db_mbase_result::fetch_table_mon_status");
DBUG_PRINT("info",("spider this=%p", this));
if (!(mysql_row = mysql_fetch_row(db_result)))
{
DBUG_PRINT("info",("spider fetch row is null"));
+ if ((error_num = mysql_errno(((spider_db_mbase *) db_conn)->db_conn)))
+ {
+ my_message(error_num,
+ mysql_error(((spider_db_mbase *) db_conn)->db_conn), MYF(0));
+ DBUG_RETURN(error_num);
+ }
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
if (num_fields() != 1)
@@ -1017,24 +1243,83 @@ int spider_db_mysql_result::fetch_table_mon_status(
DBUG_RETURN(0);
}
-longlong spider_db_mysql_result::num_rows()
+int spider_db_mbase_result::fetch_show_master_status(
+ const char **binlog_file_name,
+ const char **binlog_pos
+) {
+ int error_num;
+ MYSQL_ROW mysql_row;
+ DBUG_ENTER("spider_db_mbase_result::fetch_show_master_status");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (!(mysql_row = mysql_fetch_row(db_result)))
+ {
+ DBUG_PRINT("info",("spider fetch row is null"));
+ if ((error_num = mysql_errno(((spider_db_mbase *) db_conn)->db_conn)))
+ {
+ my_message(error_num,
+ mysql_error(((spider_db_mbase *) db_conn)->db_conn), MYF(0));
+ DBUG_RETURN(error_num);
+ }
+ DBUG_RETURN(ER_QUERY_ON_FOREIGN_DATA_SOURCE);
+ }
+ if (num_fields() != 4)
+ {
+ DBUG_RETURN(ER_QUERY_ON_FOREIGN_DATA_SOURCE);
+ }
+
+ *binlog_file_name = mysql_row[0];
+ DBUG_PRINT("info",("spider binlog_file_name=%s", *binlog_file_name));
+ *binlog_pos = mysql_row[1];
+ DBUG_PRINT("info",("spider binlog_pos=%s", *binlog_pos));
+ DBUG_RETURN(0);
+}
+
+int spider_db_mbase_result::fetch_select_binlog_gtid_pos(
+ const char **gtid_pos
+) {
+ int error_num;
+ MYSQL_ROW mysql_row;
+ DBUG_ENTER("spider_db_mbase_result::fetch_select_binlog_gtid_pos");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (!(mysql_row = mysql_fetch_row(db_result)))
+ {
+ DBUG_PRINT("info",("spider fetch row is null"));
+ if ((error_num = mysql_errno(((spider_db_mbase *) db_conn)->db_conn)))
+ {
+ my_message(error_num,
+ mysql_error(((spider_db_mbase *) db_conn)->db_conn), MYF(0));
+ DBUG_RETURN(error_num);
+ }
+ DBUG_RETURN(ER_QUERY_ON_FOREIGN_DATA_SOURCE);
+ }
+ if (num_fields() != 1)
+ {
+ DBUG_RETURN(ER_QUERY_ON_FOREIGN_DATA_SOURCE);
+ }
+
+ *gtid_pos = mysql_row[0];
+ DBUG_PRINT("info",("spider gtid_pos=%s", *gtid_pos));
+ DBUG_RETURN(0);
+}
+
+longlong spider_db_mbase_result::num_rows()
{
- DBUG_ENTER("spider_db_mysql_result::num_rows");
+ DBUG_ENTER("spider_db_mbase_result::num_rows");
DBUG_PRINT("info",("spider this=%p", this));
DBUG_RETURN((longlong) mysql_num_rows(db_result));
}
-uint spider_db_mysql_result::num_fields()
+uint spider_db_mbase_result::num_fields()
{
- DBUG_ENTER("spider_db_mysql_result::num_fields");
+ DBUG_ENTER("spider_db_mbase_result::num_fields");
DBUG_PRINT("info",("spider this=%p", this));
DBUG_RETURN(mysql_num_fields(db_result));
}
-void spider_db_mysql_result::move_to_pos(
+void spider_db_mbase_result::move_to_pos(
longlong pos
) {
- DBUG_ENTER("spider_db_mysql_result::move_to_pos");
+ DBUG_ENTER("spider_db_mbase_result::move_to_pos");
DBUG_PRINT("info",("spider this=%p", this));
DBUG_PRINT("info",("spider pos=%lld", pos));
/*
@@ -1044,25 +1329,33 @@ void spider_db_mysql_result::move_to_pos(
DBUG_VOID_RETURN;
}
-int spider_db_mysql_result::get_errno()
+int spider_db_mbase_result::get_errno()
{
- DBUG_ENTER("spider_db_mysql_result::get_errno");
+ DBUG_ENTER("spider_db_mbase_result::get_errno");
DBUG_PRINT("info",("spider this=%p", this));
DBUG_PRINT("info",("spider store_error_num=%d", store_error_num));
DBUG_RETURN(store_error_num);
}
#ifdef SPIDER_HAS_DISCOVER_TABLE_STRUCTURE
-int spider_db_mysql_result::fetch_columns_for_discover_table_structure(
+int spider_db_mbase_result::fetch_columns_for_discover_table_structure(
spider_string *str,
CHARSET_INFO *access_charset
) {
+ int error_num;
+ uint length;
MYSQL_ROW mysql_row;
- DBUG_ENTER("spider_db_mysql_result::fetch_columns_for_discover_table_structure");
+ DBUG_ENTER("spider_db_mbase_result::fetch_columns_for_discover_table_structure");
DBUG_PRINT("info",("spider this=%p", this));
if (!(mysql_row = mysql_fetch_row(db_result)))
{
DBUG_PRINT("info",("spider fetch row is null"));
+ if ((error_num = mysql_errno(((spider_db_mbase *) db_conn)->db_conn)))
+ {
+ my_message(error_num,
+ mysql_error(((spider_db_mbase *) db_conn)->db_conn), MYF(0));
+ DBUG_RETURN(error_num);
+ }
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
if (num_fields() != 7)
@@ -1093,21 +1386,23 @@ int spider_db_mysql_result::fetch_columns_for_discover_table_structure(
}
if (mysql_row[3])
{
- if (str->reserve(SPIDER_SQL_CHARACTER_SET_LEN))
+ length = strlen(mysql_row[3]);
+ if (str->reserve(SPIDER_SQL_CHARACTER_SET_LEN + length))
{
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
str->q_append(SPIDER_SQL_CHARACTER_SET_STR, SPIDER_SQL_CHARACTER_SET_LEN);
- str->q_append(mysql_row[3], strlen(mysql_row[3]));
+ str->q_append(mysql_row[3], length);
}
if (mysql_row[4])
{
- if (str->reserve(SPIDER_SQL_COLLATE_LEN))
+ length = strlen(mysql_row[4]);
+ if (str->reserve(SPIDER_SQL_COLLATE_LEN + length))
{
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
str->q_append(SPIDER_SQL_COLLATE_STR, SPIDER_SQL_COLLATE_LEN);
- str->q_append(mysql_row[4], strlen(mysql_row[4]));
+ str->q_append(mysql_row[4], length);
}
if (!strcmp(mysql_row[2], "NO"))
{
@@ -1123,16 +1418,10 @@ int spider_db_mysql_result::fetch_columns_for_discover_table_structure(
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
str->q_append(SPIDER_SQL_DEFAULT_STR, SPIDER_SQL_DEFAULT_LEN);
- if (str->reserve(SPIDER_SQL_VALUE_QUOTE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
if (str->append(mysql_row[1], strlen(mysql_row[1]), access_charset))
{
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
- if (str->reserve(SPIDER_SQL_VALUE_QUOTE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
}
} else {
if (str->reserve(SPIDER_SQL_DEFAULT_LEN))
@@ -1142,16 +1431,10 @@ int spider_db_mysql_result::fetch_columns_for_discover_table_structure(
str->q_append(SPIDER_SQL_DEFAULT_STR, SPIDER_SQL_DEFAULT_LEN);
if (mysql_row[1])
{
- if (str->reserve(SPIDER_SQL_VALUE_QUOTE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
if (str->append(mysql_row[1], strlen(mysql_row[1]), access_charset))
{
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
- if (str->reserve(SPIDER_SQL_VALUE_QUOTE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
} else {
if (str->reserve(SPIDER_SQL_NULL_LEN))
{
@@ -1172,22 +1455,31 @@ int spider_db_mysql_result::fetch_columns_for_discover_table_structure(
}
str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
} while ((mysql_row = mysql_fetch_row(db_result)));
+ if ((error_num = mysql_errno(((spider_db_mbase *) db_conn)->db_conn)))
+ {
+ my_message(error_num,
+ mysql_error(((spider_db_mbase *) db_conn)->db_conn), MYF(0));
+ DBUG_RETURN(error_num);
+ }
DBUG_RETURN(0);
}
-int spider_db_mysql_result::fetch_index_for_discover_table_structure(
+int spider_db_mbase_result::fetch_index_for_discover_table_structure(
spider_string *str,
CHARSET_INFO *access_charset
) {
+ int error_num;
MYSQL_ROW mysql_row;
- DBUG_ENTER("spider_db_mysql_result::fetch_index_for_discover_table_structure");
+ DBUG_ENTER("spider_db_mbase_result::fetch_index_for_discover_table_structure");
DBUG_PRINT("info",("spider this=%p", this));
if (!(mysql_row = mysql_fetch_row(db_result)))
{
DBUG_PRINT("info",("spider fetch row is null"));
- if (mysql_errno(db_result->handle))
+ if ((error_num = mysql_errno(((spider_db_mbase *) db_conn)->db_conn)))
{
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ my_message(error_num,
+ mysql_error(((spider_db_mbase *) db_conn)->db_conn), MYF(0));
+ DBUG_RETURN(error_num);
}
DBUG_RETURN(0);
}
@@ -1355,6 +1647,12 @@ int spider_db_mysql_result::fetch_index_for_discover_table_structure(
else
using_hash = FALSE;
} while ((mysql_row = mysql_fetch_row(db_result)));
+ if ((error_num = mysql_errno(((spider_db_mbase *) db_conn)->db_conn)))
+ {
+ my_message(error_num,
+ mysql_error(((spider_db_mbase *) db_conn)->db_conn), MYF(0));
+ DBUG_RETURN(error_num);
+ }
if (!first)
{
if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN + SPIDER_SQL_COMMA_LEN +
@@ -1370,20 +1668,27 @@ int spider_db_mysql_result::fetch_index_for_discover_table_structure(
DBUG_RETURN(0);
}
-int spider_db_mysql_result::fetch_table_for_discover_table_structure(
+int spider_db_mbase_result::fetch_table_for_discover_table_structure(
spider_string *str,
SPIDER_SHARE *spider_share,
CHARSET_INFO *access_charset
) {
+ int error_num;
MYSQL_ROW mysql_row;
- DBUG_ENTER("spider_db_mysql_result::fetch_table_for_discover_table_structure");
+ DBUG_ENTER("spider_db_mbase_result::fetch_table_for_discover_table_structure");
DBUG_PRINT("info",("spider this=%p", this));
if (!(mysql_row = mysql_fetch_row(db_result)))
{
DBUG_PRINT("info",("spider fetch row is null"));
+ if ((error_num = mysql_errno(((spider_db_mbase *) db_conn)->db_conn)))
+ {
+ my_message(error_num,
+ mysql_error(((spider_db_mbase *) db_conn)->db_conn), MYF(0));
+ DBUG_RETURN(error_num);
+ }
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
- if (num_fields() != 18)
+ if (num_fields() < 18)
{
DBUG_PRINT("info",("spider num_fields != 18"));
my_printf_error(ER_SPIDER_UNKNOWN_NUM, ER_SPIDER_UNKNOWN_STR, MYF(0));
@@ -1404,20 +1709,39 @@ int spider_db_mysql_result::fetch_table_for_discover_table_structure(
}
#endif
+spider_db_mbase::spider_db_mbase(
+ SPIDER_CONN *conn,
+ spider_db_mbase_util *spider_db_mbase_utility
+) : spider_db_conn(conn), spider_db_mbase_utility(spider_db_mbase_utility),
+ lock_table_hash_inited(FALSE), handler_open_array_inited(FALSE)
+{
+ DBUG_ENTER("spider_db_mbase::spider_db_mbase");
+ DBUG_PRINT("info",("spider this=%p", this));
+ db_conn = NULL;
+ DBUG_VOID_RETURN;
+}
+
spider_db_mysql::spider_db_mysql(
SPIDER_CONN *conn
-) : spider_db_conn(conn), lock_table_hash_inited(FALSE),
- handler_open_array_inited(FALSE)
+) : spider_db_mbase(conn, &spider_db_mysql_utility)
{
DBUG_ENTER("spider_db_mysql::spider_db_mysql");
DBUG_PRINT("info",("spider this=%p", this));
- db_conn = NULL;
DBUG_VOID_RETURN;
}
-spider_db_mysql::~spider_db_mysql()
+spider_db_mariadb::spider_db_mariadb(
+ SPIDER_CONN *conn
+) : spider_db_mbase(conn, &spider_db_mariadb_utility)
{
- DBUG_ENTER("spider_db_mysql::~spider_db_mysql");
+ DBUG_ENTER("spider_db_mariadb::spider_db_mariadb");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_VOID_RETURN;
+}
+
+spider_db_mbase::~spider_db_mbase()
+{
+ DBUG_ENTER("spider_db_mbase::~spider_db_mbase");
DBUG_PRINT("info",("spider this=%p", this));
if (handler_open_array_inited)
{
@@ -1439,9 +1763,23 @@ spider_db_mysql::~spider_db_mysql()
DBUG_VOID_RETURN;
}
-int spider_db_mysql::init()
+spider_db_mysql::~spider_db_mysql()
+{
+ DBUG_ENTER("spider_db_mysql::~spider_db_mysql");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_VOID_RETURN;
+}
+
+spider_db_mariadb::~spider_db_mariadb()
+{
+ DBUG_ENTER("spider_db_mariadb::~spider_db_mariadb");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_VOID_RETURN;
+}
+
+int spider_db_mbase::init()
{
- DBUG_ENTER("spider_db_mysql::init");
+ DBUG_ENTER("spider_db_mbase::init");
DBUG_PRINT("info",("spider this=%p", this));
if (
my_hash_init(&lock_table_hash, spd_charset_utf8_bin, 32, 0, 0,
@@ -1471,21 +1809,21 @@ int spider_db_mysql::init()
DBUG_RETURN(0);
}
-bool spider_db_mysql::is_connected()
+bool spider_db_mbase::is_connected()
{
- DBUG_ENTER("spider_db_mysql::is_connected");
+ DBUG_ENTER("spider_db_mbase::is_connected");
DBUG_PRINT("info",("spider this=%p", this));
DBUG_RETURN(db_conn);
}
-void spider_db_mysql::bg_connect()
+void spider_db_mbase::bg_connect()
{
- DBUG_ENTER("spider_db_mysql::bg_connect");
+ DBUG_ENTER("spider_db_mbase::bg_connect");
DBUG_PRINT("info",("spider this=%p", this));
DBUG_VOID_RETURN;
}
-int spider_db_mysql::connect(
+int spider_db_mbase::connect(
char *tgt_host,
char *tgt_username,
char *tgt_password,
@@ -1497,7 +1835,7 @@ int spider_db_mysql::connect(
) {
int error_num;
my_bool connect_mutex = spider_param_connect_mutex();
- DBUG_ENTER("spider_db_mysql::connect");
+ DBUG_ENTER("spider_db_mbase::connect");
DBUG_PRINT("info",("spider this=%p", this));
while (TRUE)
{
@@ -1610,6 +1948,9 @@ int spider_db_mysql::connect(
connect_retry_count--;
my_sleep((ulong) connect_retry_interval);
} else {
+#ifdef SPIDER_NET_HAS_THD
+ db_conn->net.thd = NULL;
+#endif
if (connect_mutex)
pthread_mutex_unlock(&spider_open_conn_mutex);
break;
@@ -1618,25 +1959,25 @@ int spider_db_mysql::connect(
DBUG_RETURN(0);
}
-int spider_db_mysql::ping(
+int spider_db_mbase::ping(
) {
- DBUG_ENTER("spider_db_mysql::ping");
+ DBUG_ENTER("spider_db_mbase::ping");
DBUG_PRINT("info",("spider this=%p", this));
if (spider_param_dry_access())
DBUG_RETURN(0);
DBUG_RETURN(simple_command(db_conn, COM_PING, 0, 0, 0));
}
-void spider_db_mysql::bg_disconnect()
+void spider_db_mbase::bg_disconnect()
{
- DBUG_ENTER("spider_db_mysql::bg_disconnect");
+ DBUG_ENTER("spider_db_mbase::bg_disconnect");
DBUG_PRINT("info",("spider this=%p", this));
DBUG_VOID_RETURN;
}
-void spider_db_mysql::disconnect()
+void spider_db_mbase::disconnect()
{
- DBUG_ENTER("spider_db_mysql::disconnect");
+ DBUG_ENTER("spider_db_mbase::disconnect");
DBUG_PRINT("info",("spider this=%p", this));
DBUG_PRINT("info",("spider db_conn=%p", db_conn));
if (db_conn)
@@ -1647,9 +1988,9 @@ void spider_db_mysql::disconnect()
DBUG_VOID_RETURN;
}
-int spider_db_mysql::set_net_timeout()
+int spider_db_mbase::set_net_timeout()
{
- DBUG_ENTER("spider_db_mysql::set_net_timeout");
+ DBUG_ENTER("spider_db_mbase::set_net_timeout");
DBUG_PRINT("info",("spider this=%p", this));
DBUG_PRINT("info",("spider conn=%p", conn));
my_net_set_read_timeout(&db_conn->net, conn->net_read_timeout);
@@ -1657,14 +1998,14 @@ int spider_db_mysql::set_net_timeout()
DBUG_RETURN(0);
}
-int spider_db_mysql::exec_query(
+int spider_db_mbase::exec_query(
const char *query,
uint length,
int quick_mode
) {
int error_num = 0;
uint log_result_errors = spider_param_log_result_errors();
- DBUG_ENTER("spider_db_mysql::exec_query");
+ DBUG_ENTER("spider_db_mbase::exec_query");
DBUG_PRINT("info",("spider this=%p", this));
if (spider_param_general_log())
{
@@ -1768,30 +2109,30 @@ int spider_db_mysql::exec_query(
DBUG_RETURN(error_num);
}
-int spider_db_mysql::get_errno()
+int spider_db_mbase::get_errno()
{
- DBUG_ENTER("spider_db_mysql::get_errno");
+ DBUG_ENTER("spider_db_mbase::get_errno");
DBUG_PRINT("info",("spider this=%p", this));
stored_error = mysql_errno(db_conn);
DBUG_PRINT("info",("spider stored_error=%d", stored_error));
DBUG_RETURN(stored_error);
}
-const char *spider_db_mysql::get_error()
+const char *spider_db_mbase::get_error()
{
const char *error_ptr;
- DBUG_ENTER("spider_db_mysql::get_error");
+ DBUG_ENTER("spider_db_mbase::get_error");
DBUG_PRINT("info",("spider this=%p", this));
error_ptr = mysql_error(db_conn);
DBUG_PRINT("info",("spider error=%s", error_ptr));
DBUG_RETURN(error_ptr);
}
-bool spider_db_mysql::is_server_gone_error(
+bool spider_db_mbase::is_server_gone_error(
int error_num
) {
bool server_gone;
- DBUG_ENTER("spider_db_mysql::is_server_gone_error");
+ DBUG_ENTER("spider_db_mbase::is_server_gone_error");
DBUG_PRINT("info",("spider this=%p", this));
server_gone =
(error_num == CR_SERVER_GONE_ERROR || error_num == CR_SERVER_LOST);
@@ -1799,11 +2140,11 @@ bool spider_db_mysql::is_server_gone_error(
DBUG_RETURN(server_gone);
}
-bool spider_db_mysql::is_dup_entry_error(
+bool spider_db_mbase::is_dup_entry_error(
int error_num
) {
bool dup_entry;
- DBUG_ENTER("spider_db_mysql::is_dup_entry_error");
+ DBUG_ENTER("spider_db_mbase::is_dup_entry_error");
DBUG_PRINT("info",("spider this=%p", this));
dup_entry =
(
@@ -1815,11 +2156,11 @@ bool spider_db_mysql::is_dup_entry_error(
DBUG_RETURN(dup_entry);
}
-bool spider_db_mysql::is_xa_nota_error(
+bool spider_db_mbase::is_xa_nota_error(
int error_num
) {
bool xa_nota;
- DBUG_ENTER("spider_db_mysql::is_xa_nota_error");
+ DBUG_ENTER("spider_db_mbase::is_xa_nota_error");
DBUG_PRINT("info",("spider this=%p", this));
xa_nota =
(
@@ -1831,10 +2172,10 @@ bool spider_db_mysql::is_xa_nota_error(
DBUG_RETURN(xa_nota);
}
-void spider_db_mysql::print_warnings(
+void spider_db_mbase::print_warnings(
struct tm *l_time
) {
- DBUG_ENTER("spider_db_mysql::print_warnings");
+ DBUG_ENTER("spider_db_mbase::print_warnings");
DBUG_PRINT("info",("spider this=%p", this));
if (db_conn->status == MYSQL_STATUS_READY)
{
@@ -1889,16 +2230,16 @@ void spider_db_mysql::print_warnings(
DBUG_VOID_RETURN;
}
-spider_db_result *spider_db_mysql::store_result(
+spider_db_result *spider_db_mbase::store_result(
spider_db_result_buffer **spider_res_buf,
st_spider_db_request_key *request_key,
int *error_num
) {
- spider_db_mysql_result *result;
- DBUG_ENTER("spider_db_mysql::store_result");
+ spider_db_mbase_result *result;
+ DBUG_ENTER("spider_db_mbase::store_result");
DBUG_PRINT("info",("spider this=%p", this));
DBUG_ASSERT(!spider_res_buf);
- if ((result = new spider_db_mysql_result()))
+ if ((result = new spider_db_mbase_result(this)))
{
*error_num = 0;
if (
@@ -1917,14 +2258,14 @@ spider_db_result *spider_db_mysql::store_result(
DBUG_RETURN(result);
}
-spider_db_result *spider_db_mysql::use_result(
+spider_db_result *spider_db_mbase::use_result(
st_spider_db_request_key *request_key,
int *error_num
) {
- spider_db_mysql_result *result;
- DBUG_ENTER("spider_db_mysql::use_result");
+ spider_db_mbase_result *result;
+ DBUG_ENTER("spider_db_mbase::use_result");
DBUG_PRINT("info",("spider this=%p", this));
- if ((result = new spider_db_mysql_result()))
+ if ((result = new spider_db_mbase_result(this)))
{
*error_num = 0;
if (
@@ -1942,10 +2283,10 @@ spider_db_result *spider_db_mysql::use_result(
DBUG_RETURN(result);
}
-int spider_db_mysql::next_result()
+int spider_db_mbase::next_result()
{
int status;
- DBUG_ENTER("spider_db_mysql::next_result");
+ DBUG_ENTER("spider_db_mbase::next_result");
DBUG_PRINT("info",("spider this=%p", this));
if (db_conn->status != MYSQL_STATUS_READY)
{
@@ -1971,10 +2312,10 @@ int spider_db_mysql::next_result()
DBUG_RETURN(-1);
}
-uint spider_db_mysql::affected_rows()
+uint spider_db_mbase::affected_rows()
{
MYSQL *last_used_con;
- DBUG_ENTER("spider_db_mysql::affected_rows");
+ DBUG_ENTER("spider_db_mbase::affected_rows");
DBUG_PRINT("info",("spider this=%p", this));
#if MYSQL_VERSION_ID < 50500
last_used_con = db_conn->last_used_con;
@@ -1984,10 +2325,10 @@ uint spider_db_mysql::affected_rows()
DBUG_RETURN((uint) last_used_con->affected_rows);
}
-ulonglong spider_db_mysql::last_insert_id()
+ulonglong spider_db_mbase::last_insert_id()
{
MYSQL *last_used_con;
- DBUG_ENTER("spider_db_mysql::last_insert_id");
+ DBUG_ENTER("spider_db_mbase::last_insert_id");
DBUG_PRINT("info",("spider this=%p", this));
#if MYSQL_VERSION_ID < 50500
last_used_con = db_conn->last_used_con;
@@ -1997,30 +2338,30 @@ ulonglong spider_db_mysql::last_insert_id()
DBUG_RETURN((uint) last_used_con->insert_id);
}
-int spider_db_mysql::set_character_set(
+int spider_db_mbase::set_character_set(
const char *csname
) {
- DBUG_ENTER("spider_db_mysql::set_character_set");
+ DBUG_ENTER("spider_db_mbase::set_character_set");
DBUG_PRINT("info",("spider this=%p", this));
if (spider_param_dry_access())
DBUG_RETURN(0);
DBUG_RETURN(mysql_set_character_set(db_conn, csname));
}
-int spider_db_mysql::select_db(
+int spider_db_mbase::select_db(
const char *dbname
) {
- DBUG_ENTER("spider_db_mysql::select_db");
+ DBUG_ENTER("spider_db_mbase::select_db");
DBUG_PRINT("info",("spider this=%p", this));
if (spider_param_dry_access())
DBUG_RETURN(0);
DBUG_RETURN(mysql_select_db(db_conn, dbname));
}
-int spider_db_mysql::consistent_snapshot(
+int spider_db_mbase::consistent_snapshot(
int *need_mon
) {
- DBUG_ENTER("spider_db_mysql::consistent_snapshot");
+ DBUG_ENTER("spider_db_mbase::consistent_snapshot");
DBUG_PRINT("info",("spider this=%p", this));
pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
pthread_mutex_lock(&conn->mta_conn_mutex);
@@ -2052,17 +2393,17 @@ int spider_db_mysql::consistent_snapshot(
DBUG_RETURN(0);
}
-bool spider_db_mysql::trx_start_in_bulk_sql()
+bool spider_db_mbase::trx_start_in_bulk_sql()
{
- DBUG_ENTER("spider_db_mysql::trx_start_in_bulk_sql");
+ DBUG_ENTER("spider_db_mbase::trx_start_in_bulk_sql");
DBUG_PRINT("info",("spider this=%p", this));
DBUG_RETURN(TRUE);
}
-int spider_db_mysql::start_transaction(
+int spider_db_mbase::start_transaction(
int *need_mon
) {
- DBUG_ENTER("spider_db_mysql::start_transaction");
+ DBUG_ENTER("spider_db_mbase::start_transaction");
DBUG_PRINT("info",("spider this=%p", this));
pthread_mutex_assert_owner(&conn->mta_conn_mutex);
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
@@ -2079,10 +2420,10 @@ int spider_db_mysql::start_transaction(
DBUG_RETURN(0);
}
-int spider_db_mysql::commit(
+int spider_db_mbase::commit(
int *need_mon
) {
- DBUG_ENTER("spider_db_mysql::commit");
+ DBUG_ENTER("spider_db_mbase::commit");
DBUG_PRINT("info",("spider this=%p", this));
pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
pthread_mutex_lock(&conn->mta_conn_mutex);
@@ -2114,12 +2455,12 @@ int spider_db_mysql::commit(
DBUG_RETURN(0);
}
-int spider_db_mysql::rollback(
+int spider_db_mbase::rollback(
int *need_mon
) {
bool is_error;
int error_num;
- DBUG_ENTER("spider_db_mysql::rollback");
+ DBUG_ENTER("spider_db_mbase::rollback");
DBUG_PRINT("info",("spider this=%p", this));
pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
pthread_mutex_lock(&conn->mta_conn_mutex);
@@ -2162,30 +2503,30 @@ int spider_db_mysql::rollback(
DBUG_RETURN(0);
}
-int spider_db_mysql::xa_start(
+int spider_db_mbase::xa_start(
XID *xid,
int *need_mon
) {
- DBUG_ENTER("spider_db_mysql::xa_start");
+ DBUG_ENTER("spider_db_mbase::xa_start");
DBUG_PRINT("info",("spider this=%p", this));
DBUG_ASSERT(0);
DBUG_RETURN(0);
}
-bool spider_db_mysql::xa_start_in_bulk_sql()
+bool spider_db_mbase::xa_start_in_bulk_sql()
{
- DBUG_ENTER("spider_db_mysql::xa_start_in_bulk_sql");
+ DBUG_ENTER("spider_db_mbase::xa_start_in_bulk_sql");
DBUG_PRINT("info",("spider this=%p", this));
DBUG_RETURN(TRUE);
}
-int spider_db_mysql::xa_end(
+int spider_db_mbase::xa_end(
XID *xid,
int *need_mon
) {
char sql_buf[SPIDER_SQL_XA_END_LEN + XIDDATASIZE + sizeof(long) + 9];
spider_string sql_str(sql_buf, sizeof(sql_buf), &my_charset_bin);
- DBUG_ENTER("spider_db_mysql::xa_end");
+ DBUG_ENTER("spider_db_mbase::xa_end");
DBUG_PRINT("info",("spider this=%p", this));
sql_str.init_calc_mem(108);
@@ -2222,13 +2563,13 @@ int spider_db_mysql::xa_end(
DBUG_RETURN(0);
}
-int spider_db_mysql::xa_prepare(
+int spider_db_mbase::xa_prepare(
XID *xid,
int *need_mon
) {
char sql_buf[SPIDER_SQL_XA_PREPARE_LEN + XIDDATASIZE + sizeof(long) + 9];
spider_string sql_str(sql_buf, sizeof(sql_buf), &my_charset_bin);
- DBUG_ENTER("spider_db_mysql::xa_prepare");
+ DBUG_ENTER("spider_db_mbase::xa_prepare");
DBUG_PRINT("info",("spider this=%p", this));
sql_str.init_calc_mem(109);
@@ -2265,13 +2606,13 @@ int spider_db_mysql::xa_prepare(
DBUG_RETURN(0);
}
-int spider_db_mysql::xa_commit(
+int spider_db_mbase::xa_commit(
XID *xid,
int *need_mon
) {
char sql_buf[SPIDER_SQL_XA_COMMIT_LEN + XIDDATASIZE + sizeof(long) + 9];
spider_string sql_str(sql_buf, sizeof(sql_buf), &my_charset_bin);
- DBUG_ENTER("spider_db_mysql::xa_commit");
+ DBUG_ENTER("spider_db_mbase::xa_commit");
DBUG_PRINT("info",("spider this=%p", this));
sql_str.init_calc_mem(110);
@@ -2308,13 +2649,13 @@ int spider_db_mysql::xa_commit(
DBUG_RETURN(0);
}
-int spider_db_mysql::xa_rollback(
+int spider_db_mbase::xa_rollback(
XID *xid,
int *need_mon
) {
char sql_buf[SPIDER_SQL_XA_ROLLBACK_LEN + XIDDATASIZE + sizeof(long) + 9];
spider_string sql_str(sql_buf, sizeof(sql_buf), &my_charset_bin);
- DBUG_ENTER("spider_db_mysql::xa_rollback");
+ DBUG_ENTER("spider_db_mbase::xa_rollback");
DBUG_PRINT("info",("spider this=%p", this));
sql_str.init_calc_mem(111);
@@ -2351,18 +2692,18 @@ int spider_db_mysql::xa_rollback(
DBUG_RETURN(0);
}
-bool spider_db_mysql::set_trx_isolation_in_bulk_sql()
+bool spider_db_mbase::set_trx_isolation_in_bulk_sql()
{
- DBUG_ENTER("spider_db_mysql::set_trx_isolation_in_bulk_sql");
+ DBUG_ENTER("spider_db_mbase::set_trx_isolation_in_bulk_sql");
DBUG_PRINT("info",("spider this=%p", this));
DBUG_RETURN(TRUE);
}
-int spider_db_mysql::set_trx_isolation(
+int spider_db_mbase::set_trx_isolation(
int trx_isolation,
int *need_mon
) {
- DBUG_ENTER("spider_db_mysql::set_trx_isolation");
+ DBUG_ENTER("spider_db_mbase::set_trx_isolation");
DBUG_PRINT("info",("spider this=%p", this));
switch (trx_isolation)
{
@@ -2488,18 +2829,18 @@ int spider_db_mysql::set_trx_isolation(
DBUG_RETURN(0);
}
-bool spider_db_mysql::set_autocommit_in_bulk_sql()
+bool spider_db_mbase::set_autocommit_in_bulk_sql()
{
- DBUG_ENTER("spider_db_mysql::set_autocommit_in_bulk_sql");
+ DBUG_ENTER("spider_db_mbase::set_autocommit_in_bulk_sql");
DBUG_PRINT("info",("spider this=%p", this));
DBUG_RETURN(TRUE);
}
-int spider_db_mysql::set_autocommit(
+int spider_db_mbase::set_autocommit(
bool autocommit,
int *need_mon
) {
- DBUG_ENTER("spider_db_mysql::set_autocommit");
+ DBUG_ENTER("spider_db_mbase::set_autocommit");
DBUG_PRINT("info",("spider this=%p", this));
if (autocommit)
{
@@ -2562,18 +2903,18 @@ int spider_db_mysql::set_autocommit(
DBUG_RETURN(0);
}
-bool spider_db_mysql::set_sql_log_off_in_bulk_sql()
+bool spider_db_mbase::set_sql_log_off_in_bulk_sql()
{
- DBUG_ENTER("spider_db_mysql::set_sql_log_off_in_bulk_sql");
+ DBUG_ENTER("spider_db_mbase::set_sql_log_off_in_bulk_sql");
DBUG_PRINT("info",("spider this=%p", this));
DBUG_RETURN(TRUE);
}
-int spider_db_mysql::set_sql_log_off(
+int spider_db_mbase::set_sql_log_off(
bool sql_log_off,
int *need_mon
) {
- DBUG_ENTER("spider_db_mysql::set_sql_log_off");
+ DBUG_ENTER("spider_db_mbase::set_sql_log_off");
DBUG_PRINT("info",("spider this=%p", this));
if (sql_log_off)
{
@@ -2636,21 +2977,21 @@ int spider_db_mysql::set_sql_log_off(
DBUG_RETURN(0);
}
-bool spider_db_mysql::set_time_zone_in_bulk_sql()
+bool spider_db_mbase::set_time_zone_in_bulk_sql()
{
- DBUG_ENTER("spider_db_mysql::set_time_zone_in_bulk_sql");
+ DBUG_ENTER("spider_db_mbase::set_time_zone_in_bulk_sql");
DBUG_PRINT("info",("spider this=%p", this));
DBUG_RETURN(TRUE);
}
-int spider_db_mysql::set_time_zone(
+int spider_db_mbase::set_time_zone(
Time_zone *time_zone,
int *need_mon
) {
const String *tz_str = time_zone->get_name();
char sql_buf[MAX_FIELD_WIDTH];
spider_string sql_str(sql_buf, sizeof(sql_buf), &my_charset_bin);
- DBUG_ENTER("spider_db_mysql::set_time_zone");
+ DBUG_ENTER("spider_db_mbase::set_time_zone");
DBUG_PRINT("info",("spider this=%p", this));
sql_str.init_calc_mem(214);
sql_str.length(0);
@@ -2690,19 +3031,272 @@ int spider_db_mysql::set_time_zone(
DBUG_RETURN(0);
}
+int spider_db_mbase::exec_simple_sql_with_result(
+ SPIDER_TRX *trx,
+ SPIDER_SHARE *share,
+ const char *sql,
+ uint sql_length,
+ int all_link_idx,
+ int *need_mon,
+ SPIDER_DB_RESULT **res
+) {
+ int error_num;
+ DBUG_ENTER("spider_db_mbase::exec_simple_sql_with_result");
+ pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
+ pthread_mutex_lock(&conn->mta_conn_mutex);
+ SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ conn->need_mon = need_mon;
+ DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
+ DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
+ conn->mta_conn_mutex_lock_already = TRUE;
+ conn->mta_conn_mutex_unlock_later = TRUE;
+ spider_conn_set_timeout_from_share(conn, all_link_idx, trx->thd,
+ share);
+ if (
+ (error_num = spider_db_set_names_internal(trx, share, conn,
+ all_link_idx, need_mon)) ||
+ (
+ spider_db_query(
+ conn,
+ sql,
+ sql_length,
+ -1,
+ need_mon) &&
+ (error_num = spider_db_errorno(conn))
+ )
+ ) {
+ if (
+ error_num == ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM &&
+ !conn->disable_reconnect
+ ) {
+ /* retry */
+ if ((error_num = spider_db_ping_internal(share, conn,
+ all_link_idx, need_mon)))
+ {
+ DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
+ DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
+ 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);
+ DBUG_PRINT("info", ("spider error_num=%d 1", error_num));
+ DBUG_RETURN(error_num);
+ }
+ if ((error_num = spider_db_set_names_internal(trx, share, conn,
+ all_link_idx, need_mon)))
+ {
+ DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
+ DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
+ 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);
+ DBUG_PRINT("info", ("spider error_num=%d 2", error_num));
+ DBUG_RETURN(error_num);
+ }
+ spider_conn_set_timeout_from_share(conn, all_link_idx, trx->thd,
+ share);
+ if (spider_db_query(
+ conn,
+ sql,
+ sql_length,
+ -1,
+ need_mon)
+ ) {
+ DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
+ DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ DBUG_PRINT("info", ("spider error_num=%d 3", error_num));
+ DBUG_RETURN(spider_db_errorno(conn));
+ }
+ } else {
+ DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
+ DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
+ 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);
+ DBUG_PRINT("info", ("spider error_num=%d 4", error_num));
+ DBUG_RETURN(error_num);
+ }
+ }
+ if (!(*res = store_result(NULL, NULL, &error_num)))
+ {
+ DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
+ DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ if (error_num)
+ {
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ DBUG_PRINT("info", ("spider error_num=%d 5", error_num));
+ DBUG_RETURN(error_num);
+ }
+ else if ((error_num = spider_db_errorno(conn)))
+ {
+ DBUG_PRINT("info", ("spider error_num=%d 6", error_num));
+ DBUG_RETURN(error_num);
+ } else {
+ DBUG_PRINT("info", ("spider error_num=%d 7",
+ ER_QUERY_ON_FOREIGN_DATA_SOURCE));
+ DBUG_RETURN(ER_QUERY_ON_FOREIGN_DATA_SOURCE);
+ }
+ }
+ DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
+ DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
+ 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);
+ DBUG_RETURN(0);
+}
+
+int spider_db_mbase::show_master_status(
+ SPIDER_TRX *trx,
+ SPIDER_SHARE *share,
+ int all_link_idx,
+ int *need_mon,
+ TABLE *table,
+ spider_string *str,
+ int mode,
+ SPIDER_DB_RESULT **res1,
+ SPIDER_DB_RESULT **res2
+) {
+ int error_num;
+ const char *binlog_file_name, *binlog_pos;
+ uint binlog_file_name_length, binlog_pos_length;
+ DBUG_ENTER("spider_db_mbase::show_master_status");
+ if ((error_num = exec_simple_sql_with_result(trx, share,
+ SPIDER_SQL_SHOW_MASTER_STATUS_STR, SPIDER_SQL_SHOW_MASTER_STATUS_LEN,
+ all_link_idx, need_mon, res1))
+ ) {
+ DBUG_PRINT("info", ("spider error_num=%d 1", error_num));
+ DBUG_RETURN(error_num);
+ }
+
+ if (!(error_num = ((spider_db_mbase_result *)*res1)->fetch_show_master_status(
+ &binlog_file_name, &binlog_pos))
+ ) {
+ binlog_file_name_length = strlen(binlog_file_name);
+ binlog_pos_length = strlen(binlog_pos);
+ spider_store_binlog_pos_binlog_file(table,
+ binlog_file_name, binlog_file_name_length,
+ binlog_pos, binlog_pos_length, conn->access_charset);
+ if (mode > 0)
+ {
+ error_num = select_binlog_gtid_pos(
+ trx,
+ share,
+ all_link_idx,
+ need_mon,
+ table,
+ str,
+ binlog_file_name,
+ binlog_file_name_length,
+ binlog_pos,
+ binlog_pos_length,
+ res2
+ );
+ } else {
+ spider_store_binlog_pos_gtid(table, NULL, 0, conn->access_charset);
+ }
+ }
+/*
+ res->free_result();
+ delete res;
+*/
+ if (error_num)
+ {
+ DBUG_PRINT("info", ("spider error_num=%d 2", error_num));
+ DBUG_RETURN(error_num);
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_db_mbase::select_binlog_gtid_pos(
+ SPIDER_TRX *trx,
+ SPIDER_SHARE *share,
+ int all_link_idx,
+ int *need_mon,
+ TABLE *table,
+ spider_string *str,
+ const char *binlog_file_name,
+ uint binlog_file_name_length,
+ const char *binlog_pos,
+ uint binlog_pos_length,
+ SPIDER_DB_RESULT **res
+) {
+ int error_num;
+ size_t length;
+ const char *gtid_pos;
+ DBUG_ENTER("spider_db_mbase::select_binlog_gtid_pos");
+ str->length(0);
+ if (str->reserve(
+ SPIDER_SQL_BINLOG_GTID_POS_LEN +
+ SPIDER_SQL_OPEN_PAREN_LEN +
+ SPIDER_SQL_VALUE_QUOTE_LEN +
+ binlog_file_name_length * 2 +
+ SPIDER_SQL_VALUE_QUOTE_LEN +
+ SPIDER_SQL_COMMA_LEN +
+ SPIDER_SQL_VALUE_QUOTE_LEN +
+ binlog_pos_length * 2 +
+ SPIDER_SQL_VALUE_QUOTE_LEN +
+ SPIDER_SQL_CLOSE_PAREN_LEN
+ ))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_BINLOG_GTID_POS_STR,
+ SPIDER_SQL_BINLOG_GTID_POS_LEN);
+ str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
+ str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
+ length = conn->db_conn->escape_string((char *)str->ptr() + str->length(),
+ binlog_file_name, binlog_file_name_length);
+ str->length(str->length() + length);
+ str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
+ length = conn->db_conn->escape_string((char *)str->ptr() + str->length(),
+ binlog_pos, binlog_pos_length);
+ str->length(str->length() + length);
+ str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
+ str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
+
+ if ((error_num = exec_simple_sql_with_result(trx, share,
+ str->ptr(), str->length(), all_link_idx, need_mon, res)))
+ {
+ DBUG_PRINT("info", ("spider error_num=%d 1", error_num));
+ DBUG_RETURN(error_num);
+ }
+ if (!(error_num = ((spider_db_mbase_result *)*res)->fetch_select_binlog_gtid_pos(&gtid_pos)))
+ {
+ spider_store_binlog_pos_gtid(table, gtid_pos, strlen(gtid_pos), conn->access_charset);
+ }
+/*
+ res->free_result();
+ delete res;
+*/
+ if (error_num)
+ {
+ DBUG_PRINT("info", ("spider error_num=%d 2", error_num));
+ DBUG_RETURN(error_num);
+ }
+ DBUG_RETURN(0);
+}
+
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
-int spider_db_mysql::append_sql(
+int spider_db_mbase::append_sql(
char *sql,
ulong sql_length,
st_spider_db_request_key *request_key
) {
- DBUG_ENTER("spider_db_mysql::append_sql");
+ DBUG_ENTER("spider_db_mbase::append_sql");
DBUG_PRINT("info",("spider this=%p", this));
DBUG_ASSERT(0);
DBUG_RETURN(0);
}
-int spider_db_mysql::append_open_handler(
+int spider_db_mbase::append_open_handler(
uint handler_id,
const char *db_name,
const char *table_name,
@@ -2710,13 +3304,13 @@ int spider_db_mysql::append_open_handler(
const char *sql,
st_spider_db_request_key *request_key
) {
- DBUG_ENTER("spider_db_mysql::append_open_handler");
+ DBUG_ENTER("spider_db_mbase::append_open_handler");
DBUG_PRINT("info",("spider this=%p", this));
DBUG_ASSERT(0);
DBUG_RETURN(0);
}
-int spider_db_mysql::append_select(
+int spider_db_mbase::append_select(
uint handler_id,
spider_string *sql,
SPIDER_DB_HS_STRING_REF_BUFFER *keys,
@@ -2724,24 +3318,24 @@ int spider_db_mysql::append_select(
int skip,
st_spider_db_request_key *request_key
) {
- DBUG_ENTER("spider_db_mysql::append_select");
+ DBUG_ENTER("spider_db_mbase::append_select");
DBUG_PRINT("info",("spider this=%p", this));
DBUG_ASSERT(0);
DBUG_RETURN(0);
}
-int spider_db_mysql::append_insert(
+int spider_db_mbase::append_insert(
uint handler_id,
SPIDER_DB_HS_STRING_REF_BUFFER *upds,
st_spider_db_request_key *request_key
) {
- DBUG_ENTER("spider_db_mysql::append_insert");
+ DBUG_ENTER("spider_db_mbase::append_insert");
DBUG_PRINT("info",("spider this=%p", this));
DBUG_ASSERT(0);
DBUG_RETURN(0);
}
-int spider_db_mysql::append_update(
+int spider_db_mbase::append_update(
uint handler_id,
spider_string *sql,
SPIDER_DB_HS_STRING_REF_BUFFER *keys,
@@ -2752,13 +3346,13 @@ int spider_db_mysql::append_update(
bool decrement,
st_spider_db_request_key *request_key
) {
- DBUG_ENTER("spider_db_mysql::append_update");
+ DBUG_ENTER("spider_db_mbase::append_update");
DBUG_PRINT("info",("spider this=%p", this));
DBUG_ASSERT(0);
DBUG_RETURN(0);
}
-int spider_db_mysql::append_delete(
+int spider_db_mbase::append_delete(
uint handler_id,
spider_string *sql,
SPIDER_DB_HS_STRING_REF_BUFFER *keys,
@@ -2766,27 +3360,27 @@ int spider_db_mysql::append_delete(
int skip,
st_spider_db_request_key *request_key
) {
- DBUG_ENTER("spider_db_mysql::append_delete");
+ DBUG_ENTER("spider_db_mbase::append_delete");
DBUG_PRINT("info",("spider this=%p", this));
DBUG_ASSERT(0);
DBUG_RETURN(0);
}
-void spider_db_mysql::reset_request_queue()
+void spider_db_mbase::reset_request_queue()
{
- DBUG_ENTER("spider_db_mysql::reset_request_queue");
+ DBUG_ENTER("spider_db_mbase::reset_request_queue");
DBUG_PRINT("info",("spider this=%p", this));
DBUG_ASSERT(0);
DBUG_VOID_RETURN;
}
#endif
-size_t spider_db_mysql::escape_string(
+size_t spider_db_mbase::escape_string(
char *to,
const char *from,
size_t from_length
) {
- DBUG_ENTER("spider_db_mysql::escape_string");
+ DBUG_ENTER("spider_db_mbase::escape_string");
DBUG_PRINT("info",("spider this=%p", this));
if (db_conn->server_status & SERVER_STATUS_NO_BACKSLASH_ESCAPES)
DBUG_RETURN(escape_quotes_for_mysql(db_conn->charset, to, 0,
@@ -2795,14 +3389,14 @@ size_t spider_db_mysql::escape_string(
from, from_length));
}
-bool spider_db_mysql::have_lock_table_list()
+bool spider_db_mbase::have_lock_table_list()
{
- DBUG_ENTER("spider_db_mysql::have_lock_table_list");
+ DBUG_ENTER("spider_db_mbase::have_lock_table_list");
DBUG_PRINT("info",("spider this=%p", this));
DBUG_RETURN(lock_table_hash.records);
}
-int spider_db_mysql::append_lock_tables(
+int spider_db_mbase::append_lock_tables(
spider_string *str
) {
int error_num;
@@ -2817,9 +3411,9 @@ int spider_db_mysql::append_lock_tables(
const char *table_name;
uint table_name_length;
CHARSET_INFO *table_name_charset;
- DBUG_ENTER("spider_db_mysql::lock_tables");
+ DBUG_ENTER("spider_db_mbase::lock_tables");
DBUG_PRINT("info",("spider this=%p", this));
- if ((error_num = spider_db_mysql_utility.append_lock_table_head(str)))
+ if ((error_num = spider_db_mbase_utility->append_lock_table_head(str)))
{
DBUG_RETURN(error_num);
}
@@ -2848,7 +3442,7 @@ int spider_db_mysql::append_lock_tables(
DBUG_RETURN(0);
}
conn_link_idx = tmp_spider->conn_link_idx[tmp_link_idx];
- spider_mysql_share *db_share = (spider_mysql_share *)
+ spider_mbase_share *db_share = (spider_mbase_share *)
tmp_spider->share->dbton_share[conn->dbton_id];
if (&db_share->db_names_str[conn_link_idx])
{
@@ -2871,7 +3465,7 @@ int spider_db_mysql::append_lock_tables(
tmp_spider->share->tgt_table_names_lengths[conn_link_idx];
table_name_charset = system_charset_info;
}
- if ((error_num = spider_db_mysql_utility.
+ if ((error_num = spider_db_mbase_utility->
append_lock_table_body(
str,
db_name,
@@ -2893,54 +3487,54 @@ int spider_db_mysql::append_lock_tables(
my_hash_delete(&lock_table_hash, (uchar*) tmp_link_for_hash);
#endif
}
- if ((error_num = spider_db_mysql_utility.append_lock_table_tail(str)))
+ if ((error_num = spider_db_mbase_utility->append_lock_table_tail(str)))
{
DBUG_RETURN(error_num);
}
DBUG_RETURN(0);
}
-int spider_db_mysql::append_unlock_tables(
+int spider_db_mbase::append_unlock_tables(
spider_string *str
) {
int error_num;
- DBUG_ENTER("spider_db_mysql::append_unlock_tables");
+ DBUG_ENTER("spider_db_mbase::append_unlock_tables");
DBUG_PRINT("info",("spider this=%p", this));
- if ((error_num = spider_db_mysql_utility.append_unlock_table(str)))
+ if ((error_num = spider_db_mbase_utility->append_unlock_table(str)))
{
DBUG_RETURN(error_num);
}
DBUG_RETURN(0);
}
-uint spider_db_mysql::get_lock_table_hash_count()
+uint spider_db_mbase::get_lock_table_hash_count()
{
- DBUG_ENTER("spider_db_mysql::get_lock_table_hash_count");
+ DBUG_ENTER("spider_db_mbase::get_lock_table_hash_count");
DBUG_PRINT("info",("spider this=%p", this));
DBUG_RETURN(lock_table_hash.records);
}
-void spider_db_mysql::reset_lock_table_hash()
+void spider_db_mbase::reset_lock_table_hash()
{
- DBUG_ENTER("spider_db_mysql::reset_lock_table_hash");
+ DBUG_ENTER("spider_db_mbase::reset_lock_table_hash");
DBUG_PRINT("info",("spider this=%p", this));
my_hash_reset(&lock_table_hash);
DBUG_VOID_RETURN;
}
-uint spider_db_mysql::get_opened_handler_count()
+uint spider_db_mbase::get_opened_handler_count()
{
- DBUG_ENTER("spider_db_mysql::get_opened_handler_count");
+ DBUG_ENTER("spider_db_mbase::get_opened_handler_count");
DBUG_PRINT("info",("spider this=%p", this));
DBUG_RETURN(handler_open_array.elements);
}
-void spider_db_mysql::reset_opened_handler()
+void spider_db_mbase::reset_opened_handler()
{
ha_spider *tmp_spider;
int tmp_link_idx;
SPIDER_LINK_FOR_HASH **tmp_link_for_hash;
- DBUG_ENTER("spider_db_mysql::reset_opened_handler");
+ DBUG_ENTER("spider_db_mbase::reset_opened_handler");
DBUG_PRINT("info",("spider this=%p", this));
while ((tmp_link_for_hash =
(SPIDER_LINK_FOR_HASH **) pop_dynamic(&handler_open_array)))
@@ -2952,7 +3546,7 @@ void spider_db_mysql::reset_opened_handler()
DBUG_VOID_RETURN;
}
-void spider_db_mysql::set_dup_key_idx(
+void spider_db_mbase::set_dup_key_idx(
ha_spider *spider,
int link_idx
) {
@@ -2960,8 +3554,8 @@ void spider_db_mysql::set_dup_key_idx(
uint roop_count, pk_idx = table->s->primary_key;
int key_name_length;
int max_length = 0;
- char *key_name;
- DBUG_ENTER("spider_db_mysql::set_dup_key_idx");
+ const char *key_name;
+ DBUG_ENTER("spider_db_mbase::set_dup_key_idx");
DBUG_PRINT("info",("spider this=%p", this));
DBUG_PRINT("info",("spider error_str=%s", conn->error_str));
for (roop_count = 0; roop_count < table->s->keys; roop_count++)
@@ -2973,8 +3567,13 @@ void spider_db_mysql::set_dup_key_idx(
key_name = spider->share->tgt_pk_names[all_link_idx];
key_name_length = spider->share->tgt_pk_names_lengths[all_link_idx];
} else {
+#ifdef SPIDER_use_LEX_CSTRING_for_KEY_Field_name
+ key_name = table->s->key_info[roop_count].name.str;
+ key_name_length = table->s->key_info[roop_count].name.length;
+#else
key_name = table->s->key_info[roop_count].name;
key_name_length = strlen(key_name);
+#endif
}
DBUG_PRINT("info",("spider key_name=%s", key_name));
if (
@@ -2996,21 +3595,42 @@ void spider_db_mysql::set_dup_key_idx(
DBUG_VOID_RETURN;
}
-bool spider_db_mysql::cmp_request_key_to_snd(
+bool spider_db_mbase::cmp_request_key_to_snd(
st_spider_db_request_key *request_key
) {
- DBUG_ENTER("spider_db_mysql::cmp_request_key_to_snd");
+ DBUG_ENTER("spider_db_mbase::cmp_request_key_to_snd");
DBUG_PRINT("info",("spider this=%p", this));
DBUG_RETURN(TRUE);
}
-spider_db_mysql_util::spider_db_mysql_util() : spider_db_util()
+spider_db_mbase_util::spider_db_mbase_util() : spider_db_util()
+{
+ DBUG_ENTER("spider_db_mbase_util::spider_db_mbase_util");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_VOID_RETURN;
+}
+
+spider_db_mysql_util::spider_db_mysql_util() : spider_db_mbase_util()
{
DBUG_ENTER("spider_db_mysql_util::spider_db_mysql_util");
DBUG_PRINT("info",("spider this=%p", this));
DBUG_VOID_RETURN;
}
+spider_db_mariadb_util::spider_db_mariadb_util() : spider_db_mbase_util()
+{
+ DBUG_ENTER("spider_db_mariadb_util::spider_db_mariadb_util");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_VOID_RETURN;
+}
+
+spider_db_mbase_util::~spider_db_mbase_util()
+{
+ DBUG_ENTER("spider_db_mbase_util::~spider_db_mbase_util");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_VOID_RETURN;
+}
+
spider_db_mysql_util::~spider_db_mysql_util()
{
DBUG_ENTER("spider_db_mysql_util::~spider_db_mysql_util");
@@ -3018,25 +3638,32 @@ spider_db_mysql_util::~spider_db_mysql_util()
DBUG_VOID_RETURN;
}
-int spider_db_mysql_util::append_name(
+spider_db_mariadb_util::~spider_db_mariadb_util()
+{
+ DBUG_ENTER("spider_db_mariadb_util::~spider_db_mariadb_util");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_VOID_RETURN;
+}
+
+int spider_db_mbase_util::append_name(
spider_string *str,
const char *name,
uint name_length
) {
- DBUG_ENTER("spider_db_mysql_util::append_name");
+ DBUG_ENTER("spider_db_mbase_util::append_name");
str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
str->q_append(name, name_length);
str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
DBUG_RETURN(0);
}
-int spider_db_mysql_util::append_name_with_charset(
+int spider_db_mbase_util::append_name_with_charset(
spider_string *str,
const char *name,
uint name_length,
CHARSET_INFO *name_charset
) {
- DBUG_ENTER("spider_db_mysql_util::append_name_with_charset");
+ DBUG_ENTER("spider_db_mbase_util::append_name_with_charset");
if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN * 2 + name_length * 2))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
@@ -3047,17 +3674,17 @@ int spider_db_mysql_util::append_name_with_charset(
DBUG_RETURN(0);
}
-bool spider_db_mysql_util::is_name_quote(
+bool spider_db_mbase_util::is_name_quote(
const char head_code
) {
- DBUG_ENTER("spider_db_mysql_util::is_name_quote");
+ DBUG_ENTER("spider_db_mbase_util::is_name_quote");
DBUG_RETURN(head_code == *name_quote_str);
}
-int spider_db_mysql_util::append_escaped_name_quote(
+int spider_db_mbase_util::append_escaped_name_quote(
spider_string *str
) {
- DBUG_ENTER("spider_db_mysql_util::append_escaped_name_quote");
+ DBUG_ENTER("spider_db_mbase_util::append_escaped_name_quote");
if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN * 2))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
@@ -3065,7 +3692,7 @@ int spider_db_mysql_util::append_escaped_name_quote(
DBUG_RETURN(0);
}
-int spider_db_mysql_util::append_column_value(
+int spider_db_mbase_util::append_column_value(
ha_spider *spider,
spider_string *str,
Field *field,
@@ -3076,9 +3703,13 @@ int spider_db_mysql_util::append_column_value(
spider_string tmp_str(buf, MAX_FIELD_WIDTH, &my_charset_bin);
String *ptr;
uint length;
- DBUG_ENTER("spider_db_mysql_util::append_column_value");
+ THD *thd = field->table->in_use;
+ Time_zone *saved_time_zone = thd->variables.time_zone;
+ DBUG_ENTER("spider_db_mbase_util::append_column_value");
tmp_str.init_calc_mem(113);
+ thd->variables.time_zone = UTC;
+
if (new_ptr)
{
if (
@@ -3174,6 +3805,9 @@ int spider_db_mysql_util::append_column_value(
ptr = field->val_str(tmp_str.get_str());
tmp_str.mem_calc();
}
+
+ thd->variables.time_zone = saved_time_zone;
+
DBUG_PRINT("info", ("spider field->type() is %d", field->type()));
DBUG_PRINT("info", ("spider ptr->length() is %d", ptr->length()));
/*
@@ -3236,7 +3870,7 @@ int spider_db_mysql_util::append_column_value(
DBUG_RETURN(0);
}
-int spider_db_mysql_util::append_from_with_alias(
+int spider_db_mbase_util::append_from_with_alias(
spider_string *str,
const char **table_names,
uint *table_name_lengths,
@@ -3247,7 +3881,7 @@ int spider_db_mysql_util::append_from_with_alias(
bool over_write
) {
uint roop_count, length = 0;
- DBUG_ENTER("spider_db_mysql_util::append_from_with_alias");
+ DBUG_ENTER("spider_db_mbase_util::append_from_with_alias");
DBUG_PRINT("info",("spider this=%p", this));
if (!over_write)
{
@@ -3270,11 +3904,11 @@ int spider_db_mysql_util::append_from_with_alias(
DBUG_RETURN(0);
}
-int spider_db_mysql_util::append_trx_isolation(
+int spider_db_mbase_util::append_trx_isolation(
spider_string *str,
int trx_isolation
) {
- DBUG_ENTER("spider_db_mysql_util::append_trx_isolation");
+ DBUG_ENTER("spider_db_mbase_util::append_trx_isolation");
DBUG_PRINT("info",("spider this=%p", this));
if (str->reserve(SPIDER_SQL_SEMICOLON_LEN +
SPIDER_SQL_ISO_READ_UNCOMMITTED_LEN))
@@ -3307,11 +3941,11 @@ int spider_db_mysql_util::append_trx_isolation(
DBUG_RETURN(0);
}
-int spider_db_mysql_util::append_autocommit(
+int spider_db_mbase_util::append_autocommit(
spider_string *str,
bool autocommit
) {
- DBUG_ENTER("spider_db_mysql_util::append_autocommit");
+ DBUG_ENTER("spider_db_mbase_util::append_autocommit");
DBUG_PRINT("info",("spider this=%p", this));
if (str->reserve(SPIDER_SQL_SEMICOLON_LEN + SPIDER_SQL_AUTOCOMMIT_OFF_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
@@ -3330,11 +3964,11 @@ int spider_db_mysql_util::append_autocommit(
DBUG_RETURN(0);
}
-int spider_db_mysql_util::append_sql_log_off(
+int spider_db_mbase_util::append_sql_log_off(
spider_string *str,
bool sql_log_off
) {
- DBUG_ENTER("spider_db_mysql_util::append_sql_log_off");
+ DBUG_ENTER("spider_db_mbase_util::append_sql_log_off");
DBUG_PRINT("info",("spider this=%p", this));
if (str->reserve(SPIDER_SQL_SEMICOLON_LEN + SPIDER_SQL_SQL_LOG_OFF_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
@@ -3351,12 +3985,12 @@ int spider_db_mysql_util::append_sql_log_off(
DBUG_RETURN(0);
}
-int spider_db_mysql_util::append_time_zone(
+int spider_db_mbase_util::append_time_zone(
spider_string *str,
Time_zone *time_zone
) {
const String *tz_str = time_zone->get_name();
- DBUG_ENTER("spider_db_mysql_util::append_time_zone");
+ DBUG_ENTER("spider_db_mbase_util::append_time_zone");
DBUG_PRINT("info",("spider this=%p", this));
if (str->reserve(SPIDER_SQL_SEMICOLON_LEN + SPIDER_SQL_TIME_ZONE_LEN +
tz_str->length() + SPIDER_SQL_VALUE_QUOTE_LEN))
@@ -3369,10 +4003,10 @@ int spider_db_mysql_util::append_time_zone(
DBUG_RETURN(0);
}
-int spider_db_mysql_util::append_start_transaction(
+int spider_db_mbase_util::append_start_transaction(
spider_string *str
) {
- DBUG_ENTER("spider_db_mysql_util::append_start_transaction");
+ DBUG_ENTER("spider_db_mbase_util::append_start_transaction");
DBUG_PRINT("info",("spider this=%p", this));
if (str->reserve(SPIDER_SQL_SEMICOLON_LEN +
SPIDER_SQL_START_TRANSACTION_LEN))
@@ -3386,11 +4020,11 @@ int spider_db_mysql_util::append_start_transaction(
DBUG_RETURN(0);
}
-int spider_db_mysql_util::append_xa_start(
+int spider_db_mbase_util::append_xa_start(
spider_string *str,
XID *xid
) {
- DBUG_ENTER("spider_db_mysql_util::append_xa_start");
+ DBUG_ENTER("spider_db_mbase_util::append_xa_start");
DBUG_PRINT("info",("spider this=%p", this));
if (str->reserve(SPIDER_SQL_SEMICOLON_LEN +
SPIDER_SQL_XA_START_LEN + XIDDATASIZE + sizeof(long) + 9))
@@ -3404,10 +4038,10 @@ int spider_db_mysql_util::append_xa_start(
DBUG_RETURN(0);
}
-int spider_db_mysql_util::append_lock_table_head(
+int spider_db_mbase_util::append_lock_table_head(
spider_string *str
) {
- DBUG_ENTER("spider_db_mysql_util::append_lock_table_head");
+ DBUG_ENTER("spider_db_mbase_util::append_lock_table_head");
DBUG_PRINT("info",("spider this=%p", this));
if (str->reserve(SPIDER_SQL_LOCK_TABLE_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
@@ -3415,7 +4049,7 @@ int spider_db_mysql_util::append_lock_table_head(
DBUG_RETURN(0);
}
-int spider_db_mysql_util::append_lock_table_body(
+int spider_db_mbase_util::append_lock_table_body(
spider_string *str,
const char *db_name,
uint db_name_length,
@@ -3425,7 +4059,7 @@ int spider_db_mysql_util::append_lock_table_body(
CHARSET_INFO *table_name_charset,
int lock_type
) {
- DBUG_ENTER("spider_db_mysql_util::append_lock_table_body");
+ DBUG_ENTER("spider_db_mbase_util::append_lock_table_body");
DBUG_PRINT("info",("spider this=%p", this));
if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN))
{
@@ -3454,19 +4088,19 @@ int spider_db_mysql_util::append_lock_table_body(
DBUG_RETURN(0);
}
-int spider_db_mysql_util::append_lock_table_tail(
+int spider_db_mbase_util::append_lock_table_tail(
spider_string *str
) {
- DBUG_ENTER("spider_db_mysql_util::append_lock_table_tail");
+ DBUG_ENTER("spider_db_mbase_util::append_lock_table_tail");
DBUG_PRINT("info",("spider this=%p", this));
str->length(str->length() - SPIDER_SQL_COMMA_LEN);
DBUG_RETURN(0);
}
-int spider_db_mysql_util::append_unlock_table(
+int spider_db_mbase_util::append_unlock_table(
spider_string *str
) {
- DBUG_ENTER("spider_db_mysql_util::append_unlock_table");
+ DBUG_ENTER("spider_db_mbase_util::append_unlock_table");
DBUG_PRINT("info",("spider this=%p", this));
if (str->reserve(SPIDER_SQL_UNLOCK_TABLE_LEN))
{
@@ -3476,25 +4110,28 @@ int spider_db_mysql_util::append_unlock_table(
DBUG_RETURN(0);
}
-int spider_db_mysql_util::open_item_func(
+int spider_db_mbase_util::open_item_func(
Item_func *item_func,
ha_spider *spider,
spider_string *str,
const char *alias,
- uint alias_length
+ uint alias_length,
+ bool use_fields,
+ spider_fields *fields
) {
- uint dbton_id = spider_dbton_mysql.dbton_id;
int error_num;
Item *item, **item_list = item_func->arguments();
+ Field *field;
uint roop_count, item_count = item_func->argument_count(), start_item = 0;
const char *func_name = SPIDER_SQL_NULL_CHAR_STR,
- *separete_str = SPIDER_SQL_NULL_CHAR_STR,
+ *separator_str = SPIDER_SQL_NULL_CHAR_STR,
*last_str = SPIDER_SQL_NULL_CHAR_STR;
int func_name_length = SPIDER_SQL_NULL_CHAR_LEN,
- separete_str_length = SPIDER_SQL_NULL_CHAR_LEN,
+ separator_str_length = SPIDER_SQL_NULL_CHAR_LEN,
last_str_length = SPIDER_SQL_NULL_CHAR_LEN;
int use_pushdown_udf;
- DBUG_ENTER("spider_db_mysql_util::open_item_func");
+ bool merge_func = FALSE;
+ DBUG_ENTER("spider_db_mbase_util::open_item_func");
if (str)
{
if (str->reserve(SPIDER_SQL_OPEN_PAREN_LEN))
@@ -3556,8 +4193,8 @@ int spider_db_mysql_util::open_item_func(
) {
if (str)
str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- DBUG_RETURN(spider_db_open_item_int(item_func, spider, str,
- alias, alias_length, dbton_id));
+ DBUG_RETURN(spider_db_open_item_int(item_func, NULL, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields));
} else if (
!strncasecmp("case", func_name, func_name_length)
) {
@@ -3572,8 +4209,8 @@ int spider_db_mysql_util::open_item_func(
if (item_func_case->first_expr_num != -1)
{
if ((error_num = spider_db_print_item_type(
- item_list[item_func_case->first_expr_num], spider, str,
- alias, alias_length, dbton_id)))
+ item_list[item_func_case->first_expr_num], NULL, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields)))
DBUG_RETURN(error_num);
}
for (roop_count = 0; roop_count < item_func_case->ncases;
@@ -3586,8 +4223,8 @@ int spider_db_mysql_util::open_item_func(
str->q_append(SPIDER_SQL_WHEN_STR, SPIDER_SQL_WHEN_LEN);
}
if ((error_num = spider_db_print_item_type(
- item_list[roop_count], spider, str,
- alias, alias_length, dbton_id)))
+ item_list[roop_count], NULL, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields)))
DBUG_RETURN(error_num);
if (str)
{
@@ -3596,8 +4233,8 @@ int spider_db_mysql_util::open_item_func(
str->q_append(SPIDER_SQL_THEN_STR, SPIDER_SQL_THEN_LEN);
}
if ((error_num = spider_db_print_item_type(
- item_list[roop_count + 1], spider, str,
- alias, alias_length, dbton_id)))
+ item_list[roop_count + 1], NULL, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields)))
DBUG_RETURN(error_num);
}
if (item_func_case->else_expr_num != -1)
@@ -3609,8 +4246,8 @@ int spider_db_mysql_util::open_item_func(
str->q_append(SPIDER_SQL_ELSE_STR, SPIDER_SQL_ELSE_LEN);
}
if ((error_num = spider_db_print_item_type(
- item_list[item_func_case->else_expr_num], spider, str,
- alias, alias_length, dbton_id)))
+ item_list[item_func_case->else_expr_num], NULL, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields)))
DBUG_RETURN(error_num);
}
if (str)
@@ -3646,8 +4283,8 @@ int spider_db_mysql_util::open_item_func(
) {
if (str)
str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- DBUG_RETURN(spider_db_open_item_string(item_func, spider, str,
- alias, alias_length, dbton_id));
+ DBUG_RETURN(spider_db_open_item_string(item_func, NULL, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields));
} else if (
!strncasecmp("convert", func_name, func_name_length)
) {
@@ -3671,42 +4308,111 @@ int spider_db_mysql_util::open_item_func(
) {
if (str)
str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- DBUG_RETURN(spider_db_open_item_string(item_func, spider, str,
- alias, alias_length, dbton_id));
+ DBUG_RETURN(spider_db_open_item_string(item_func, NULL, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields));
} else if (func_name_length == 9 &&
!strncasecmp("isnottrue", func_name, func_name_length)
) {
last_str = SPIDER_SQL_IS_NOT_TRUE_STR;
last_str_length = SPIDER_SQL_IS_NOT_TRUE_LEN;
break;
- } else if (func_name_length == 10 &&
- !strncasecmp("isnotfalse", func_name, func_name_length)
- ) {
- last_str = SPIDER_SQL_IS_NOT_FALSE_STR;
- last_str_length = SPIDER_SQL_IS_NOT_FALSE_LEN;
- break;
+ } else if (func_name_length == 10)
+ {
+ if (!strncasecmp("isnotfalse", func_name, func_name_length))
+ {
+ last_str = SPIDER_SQL_IS_NOT_FALSE_STR;
+ last_str_length = SPIDER_SQL_IS_NOT_FALSE_LEN;
+ break;
+ } else if (!strncasecmp("column_get", func_name, func_name_length))
+ {
+ if (str)
+ {
+ str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
+ if (str->reserve(func_name_length + SPIDER_SQL_OPEN_PAREN_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(func_name, func_name_length);
+ str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
+ }
+ func_name = SPIDER_SQL_COMMA_STR;
+ func_name_length = SPIDER_SQL_COMMA_LEN;
+ separator_str = SPIDER_SQL_COMMA_STR;
+ separator_str_length = SPIDER_SQL_COMMA_LEN;
+ break;
+ }
} else if (func_name_length == 12)
{
if (!strncasecmp("cast_as_date", func_name, func_name_length))
{
+ item = item_list[0];
+ if (item->type() == Item::FUNC_ITEM)
+ {
+ DBUG_PRINT("info",("spider child is FUNC_ITEM"));
+ Item_func *ifunc = (Item_func *) item;
+ if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
+ {
+ const char *child_func_name;
+ int child_func_name_length;
+ DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
+ child_func_name = (char*) ifunc->func_name();
+ child_func_name_length = strlen(child_func_name);
+ DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
+ if (
+ child_func_name_length == 10 &&
+ !strncasecmp("column_get", child_func_name, child_func_name_length)
+ ) {
+ DBUG_PRINT("info",("spider this is merge func"));
+ merge_func = TRUE;
+ }
+ }
+ }
+
if (str)
{
str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- if (str->reserve(SPIDER_SQL_CAST_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
+ if (!merge_func)
+ {
+ if (str->reserve(SPIDER_SQL_CAST_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
+ }
}
last_str = SPIDER_SQL_AS_DATE_STR;
last_str_length = SPIDER_SQL_AS_DATE_LEN;
break;
} else if (!strncasecmp("cast_as_time", func_name, func_name_length))
{
+ item = item_list[0];
+ if (item->type() == Item::FUNC_ITEM)
+ {
+ DBUG_PRINT("info",("spider child is FUNC_ITEM"));
+ Item_func *ifunc = (Item_func *) item;
+ if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
+ {
+ const char *child_func_name;
+ int child_func_name_length;
+ DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
+ child_func_name = (char*) ifunc->func_name();
+ child_func_name_length = strlen(child_func_name);
+ DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
+ if (
+ child_func_name_length == 10 &&
+ !strncasecmp("column_get", child_func_name, child_func_name_length)
+ ) {
+ DBUG_PRINT("info",("spider this is merge func"));
+ merge_func = TRUE;
+ }
+ }
+ }
+
if (str)
{
str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- if (str->reserve(SPIDER_SQL_CAST_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
+ if (!merge_func)
+ {
+ if (str->reserve(SPIDER_SQL_CAST_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
+ }
}
last_str = SPIDER_SQL_AS_TIME_STR;
last_str_length = SPIDER_SQL_AS_TIME_LEN;
@@ -3718,8 +4424,8 @@ int spider_db_mysql_util::open_item_func(
{
if (str)
str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- DBUG_RETURN(spider_db_open_item_string(item_func, spider, str,
- alias, alias_length, dbton_id));
+ DBUG_RETURN(spider_db_open_item_string(item_func, NULL, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields));
} else if (!strncasecmp("timestampdiff", func_name, func_name_length))
{
#ifdef ITEM_FUNC_TIMESTAMPDIFF_ARE_PUBLIC
@@ -3781,8 +4487,8 @@ int spider_db_mysql_util::open_item_func(
str->q_append(interval_str, interval_len);
str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
}
- if ((error_num = spider_db_print_item_type(item_list[0], spider,
- str, alias, alias_length, dbton_id)))
+ if ((error_num = spider_db_print_item_type(item_list[0], NULL, spider,
+ str, alias, alias_length, dbton_id, use_fields, fields)))
DBUG_RETURN(error_num);
if (str)
{
@@ -3790,8 +4496,8 @@ int spider_db_mysql_util::open_item_func(
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
}
- if ((error_num = spider_db_print_item_type(item_list[1], spider,
- str, alias, alias_length, dbton_id)))
+ if ((error_num = spider_db_print_item_type(item_list[1], NULL, spider,
+ str, alias, alias_length, dbton_id, use_fields, fields)))
DBUG_RETURN(error_num);
if (str)
{
@@ -3809,6 +4515,29 @@ int spider_db_mysql_util::open_item_func(
{
if (!strncasecmp("cast_as_binary", func_name, func_name_length))
{
+ item = item_list[0];
+ if (item->type() == Item::FUNC_ITEM)
+ {
+ DBUG_PRINT("info",("spider child is FUNC_ITEM"));
+ Item_func *ifunc = (Item_func *) item;
+ if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
+ {
+ const char *child_func_name;
+ int child_func_name_length;
+ DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
+ child_func_name = (char*) ifunc->func_name();
+ child_func_name_length = strlen(child_func_name);
+ DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
+ if (
+ child_func_name_length == 10 &&
+ !strncasecmp("column_get", child_func_name, child_func_name_length)
+ ) {
+ DBUG_PRINT("info",("spider this is merge func"));
+ merge_func = TRUE;
+ }
+ }
+ }
+
if (str)
{
char tmp_buf[MAX_FIELD_WIDTH], *tmp_ptr, *tmp_ptr2;
@@ -3816,9 +4545,12 @@ int spider_db_mysql_util::open_item_func(
tmp_str.init_calc_mem(123);
tmp_str.length(0);
str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- if (str->reserve(SPIDER_SQL_CAST_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
+ if (!merge_func)
+ {
+ if (str->reserve(SPIDER_SQL_CAST_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
+ }
#if MYSQL_VERSION_ID < 50500
item_func->print(tmp_str.get_str(), QT_IS);
#else
@@ -3837,12 +4569,38 @@ int spider_db_mysql_util::open_item_func(
break;
} else if (!strncasecmp("cast_as_signed", func_name, func_name_length))
{
+ item = item_list[0];
+ if (item->type() == Item::FUNC_ITEM)
+ {
+ DBUG_PRINT("info",("spider child is FUNC_ITEM"));
+ Item_func *ifunc = (Item_func *) item;
+ if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
+ {
+ const char *child_func_name;
+ int child_func_name_length;
+ DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
+ child_func_name = (char*) ifunc->func_name();
+ child_func_name_length = strlen(child_func_name);
+ DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
+ if (
+ child_func_name_length == 10 &&
+ !strncasecmp("column_get", child_func_name, child_func_name_length)
+ ) {
+ DBUG_PRINT("info",("spider this is merge func"));
+ merge_func = TRUE;
+ }
+ }
+ }
+
if (str)
{
str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- if (str->reserve(SPIDER_SQL_CAST_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
+ if (!merge_func)
+ {
+ if (str->reserve(SPIDER_SQL_CAST_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
+ }
}
last_str = SPIDER_SQL_AS_SIGNED_STR;
last_str_length = SPIDER_SQL_AS_SIGNED_LEN;
@@ -3852,12 +4610,38 @@ int spider_db_mysql_util::open_item_func(
{
if (!strncasecmp("cast_as_unsigned", func_name, func_name_length))
{
+ item = item_list[0];
+ if (item->type() == Item::FUNC_ITEM)
+ {
+ DBUG_PRINT("info",("spider child is FUNC_ITEM"));
+ Item_func *ifunc = (Item_func *) item;
+ if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
+ {
+ const char *child_func_name;
+ int child_func_name_length;
+ DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
+ child_func_name = (char*) ifunc->func_name();
+ child_func_name_length = strlen(child_func_name);
+ DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
+ if (
+ child_func_name_length == 10 &&
+ !strncasecmp("column_get", child_func_name, child_func_name_length)
+ ) {
+ DBUG_PRINT("info",("spider this is merge func"));
+ merge_func = TRUE;
+ }
+ }
+ }
+
if (str)
{
str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- if (str->reserve(SPIDER_SQL_CAST_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
+ if (!merge_func)
+ {
+ if (str->reserve(SPIDER_SQL_CAST_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
+ }
}
last_str = SPIDER_SQL_AS_UNSIGNED_STR;
last_str_length = SPIDER_SQL_AS_UNSIGNED_LEN;
@@ -3865,6 +4649,29 @@ int spider_db_mysql_util::open_item_func(
} else if (!strncasecmp("decimal_typecast", func_name,
func_name_length))
{
+ item = item_list[0];
+ if (item->type() == Item::FUNC_ITEM)
+ {
+ DBUG_PRINT("info",("spider child is FUNC_ITEM"));
+ Item_func *ifunc = (Item_func *) item;
+ if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
+ {
+ const char *child_func_name;
+ int child_func_name_length;
+ DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
+ child_func_name = (char*) ifunc->func_name();
+ child_func_name_length = strlen(child_func_name);
+ DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
+ if (
+ child_func_name_length == 10 &&
+ !strncasecmp("column_get", child_func_name, child_func_name_length)
+ ) {
+ DBUG_PRINT("info",("spider this is merge func"));
+ merge_func = TRUE;
+ }
+ }
+ }
+
if (str)
{
char tmp_buf[MAX_FIELD_WIDTH], *tmp_ptr, *tmp_ptr2;
@@ -3872,9 +4679,12 @@ int spider_db_mysql_util::open_item_func(
tmp_str.init_calc_mem(124);
tmp_str.length(0);
str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- if (str->reserve(SPIDER_SQL_CAST_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
+ if (!merge_func)
+ {
+ if (str->reserve(SPIDER_SQL_CAST_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
+ }
#if MYSQL_VERSION_ID < 50500
item_func->print(tmp_str.get_str(), QT_IS);
#else
@@ -3894,12 +4704,38 @@ int spider_db_mysql_util::open_item_func(
} else if (!strncasecmp("cast_as_datetime", func_name,
func_name_length))
{
+ item = item_list[0];
+ if (item->type() == Item::FUNC_ITEM)
+ {
+ DBUG_PRINT("info",("spider child is FUNC_ITEM"));
+ Item_func *ifunc = (Item_func *) item;
+ if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
+ {
+ const char *child_func_name;
+ int child_func_name_length;
+ DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
+ child_func_name = (char*) ifunc->func_name();
+ child_func_name_length = strlen(child_func_name);
+ DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
+ if (
+ child_func_name_length == 10 &&
+ !strncasecmp("column_get", child_func_name, child_func_name_length)
+ ) {
+ DBUG_PRINT("info",("spider this is merge func"));
+ merge_func = TRUE;
+ }
+ }
+ }
+
if (str)
{
str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- if (str->reserve(SPIDER_SQL_CAST_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
+ if (!merge_func)
+ {
+ if (str->reserve(SPIDER_SQL_CAST_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
+ }
}
last_str = SPIDER_SQL_AS_DATETIME_STR;
last_str_length = SPIDER_SQL_AS_DATETIME_LEN;
@@ -3914,8 +4750,8 @@ int spider_db_mysql_util::open_item_func(
func_name = spider_db_timefunc_interval_str[
item_date_add_interval->int_type];
func_name_length = strlen(func_name);
- if ((error_num = spider_db_print_item_type(item_list[0], spider, str,
- alias, alias_length, dbton_id)))
+ if ((error_num = spider_db_print_item_type(item_list[0], NULL, spider,
+ str, alias, alias_length, dbton_id, use_fields, fields)))
DBUG_RETURN(error_num);
if (str)
{
@@ -3931,8 +4767,8 @@ int spider_db_mysql_util::open_item_func(
str->q_append(SPIDER_SQL_INTERVAL_STR, SPIDER_SQL_INTERVAL_LEN);
}
}
- if ((error_num = spider_db_print_item_type(item_list[1], spider, str,
- alias, alias_length, dbton_id)))
+ if ((error_num = spider_db_print_item_type(item_list[1], NULL, spider,
+ str, alias, alias_length, dbton_id, use_fields, fields)))
DBUG_RETURN(error_num);
if (str)
{
@@ -3954,18 +4790,42 @@ int spider_db_mysql_util::open_item_func(
}
func_name = SPIDER_SQL_COMMA_STR;
func_name_length = SPIDER_SQL_COMMA_LEN;
- separete_str = SPIDER_SQL_COMMA_STR;
- separete_str_length = SPIDER_SQL_COMMA_LEN;
+ separator_str = SPIDER_SQL_COMMA_STR;
+ separator_str_length = SPIDER_SQL_COMMA_LEN;
last_str = SPIDER_SQL_CLOSE_PAREN_STR;
last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
break;
case Item_func::NOW_FUNC:
if (str)
str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- DBUG_RETURN(spider_db_open_item_string(item_func, spider, str,
- alias, alias_length, dbton_id));
+ DBUG_RETURN(spider_db_open_item_string(item_func, NULL, spider,
+ str, alias, alias_length, dbton_id, use_fields, fields));
case Item_func::CHAR_TYPECAST_FUNC:
+ DBUG_PRINT("info",("spider CHAR_TYPECAST_FUNC"));
{
+ item = item_list[0];
+ if (item->type() == Item::FUNC_ITEM)
+ {
+ DBUG_PRINT("info",("spider child is FUNC_ITEM"));
+ Item_func *ifunc = (Item_func *) item;
+ if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
+ {
+ const char *child_func_name;
+ int child_func_name_length;
+ DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
+ child_func_name = (char*) ifunc->func_name();
+ child_func_name_length = strlen(child_func_name);
+ DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
+ if (
+ child_func_name_length == 10 &&
+ !strncasecmp("column_get", child_func_name, child_func_name_length)
+ ) {
+ DBUG_PRINT("info",("spider this is merge func"));
+ merge_func = TRUE;
+ }
+ }
+ }
+
if (str)
{
char tmp_buf[MAX_FIELD_WIDTH], *tmp_ptr, *tmp_ptr2;
@@ -3973,9 +4833,12 @@ int spider_db_mysql_util::open_item_func(
tmp_str.init_calc_mem(125);
tmp_str.length(0);
str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- if (str->reserve(SPIDER_SQL_CAST_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
+ if (!merge_func)
+ {
+ if (str->reserve(SPIDER_SQL_CAST_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
+ }
#if MYSQL_VERSION_ID < 50500
item_func->print(tmp_str.get_str(), QT_IS);
#else
@@ -4008,12 +4871,15 @@ int spider_db_mysql_util::open_item_func(
bool has_other_item = FALSE;
while((item = lif++))
{
+#ifdef SPIDER_HAS_EXPR_CACHE_ITEM
if (
item->type() == Item::EXPR_CACHE_ITEM
) {
DBUG_PRINT("info",("spider EXPR_CACHE_ITEM"));
has_expr_cache_item = TRUE;
- } else if (
+ } else
+#endif
+ if (
item->type() == Item::FUNC_ITEM &&
((Item_func *) item)->functype() == Item_func::ISNOTNULL_FUNC
) {
@@ -4058,15 +4924,15 @@ int spider_db_mysql_util::open_item_func(
{
func_name = SPIDER_SQL_NOT_IN_STR;
func_name_length = SPIDER_SQL_NOT_IN_LEN;
- separete_str = SPIDER_SQL_COMMA_STR;
- separete_str_length = SPIDER_SQL_COMMA_LEN;
+ separator_str = SPIDER_SQL_COMMA_STR;
+ separator_str_length = SPIDER_SQL_COMMA_LEN;
last_str = SPIDER_SQL_CLOSE_PAREN_STR;
last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
} else {
func_name = SPIDER_SQL_IN_STR;
func_name_length = SPIDER_SQL_IN_LEN;
- separete_str = SPIDER_SQL_COMMA_STR;
- separete_str_length = SPIDER_SQL_COMMA_LEN;
+ separator_str = SPIDER_SQL_COMMA_STR;
+ separator_str_length = SPIDER_SQL_COMMA_LEN;
last_str = SPIDER_SQL_CLOSE_PAREN_STR;
last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
}
@@ -4076,13 +4942,13 @@ int spider_db_mysql_util::open_item_func(
{
func_name = SPIDER_SQL_NOT_BETWEEN_STR;
func_name_length = SPIDER_SQL_NOT_BETWEEN_LEN;
- separete_str = SPIDER_SQL_AND_STR;
- separete_str_length = SPIDER_SQL_AND_LEN;
+ separator_str = SPIDER_SQL_AND_STR;
+ separator_str_length = SPIDER_SQL_AND_LEN;
} else {
func_name = (char*) item_func->func_name();
func_name_length = strlen(func_name);
- separete_str = SPIDER_SQL_AND_STR;
- separete_str_length = SPIDER_SQL_AND_LEN;
+ separator_str = SPIDER_SQL_AND_STR;
+ separator_str_length = SPIDER_SQL_AND_LEN;
}
break;
case Item_func::UDF_FUNC:
@@ -4103,8 +4969,8 @@ int spider_db_mysql_util::open_item_func(
}
func_name = SPIDER_SQL_COMMA_STR;
func_name_length = SPIDER_SQL_COMMA_LEN;
- separete_str = SPIDER_SQL_COMMA_STR;
- separete_str_length = SPIDER_SQL_COMMA_LEN;
+ separator_str = SPIDER_SQL_COMMA_STR;
+ separator_str_length = SPIDER_SQL_COMMA_LEN;
last_str = SPIDER_SQL_CLOSE_PAREN_STR;
last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
break;
@@ -4117,18 +4983,18 @@ int spider_db_mysql_util::open_item_func(
str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
DBUG_RETURN(
spider_db_open_item_cond((Item_cond *) item_func, spider, str,
- alias, alias_length, dbton_id));
+ alias, alias_length, dbton_id, use_fields, fields));
case Item_func::TRIG_COND_FUNC:
DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
case Item_func::GUSERVAR_FUNC:
if (str)
str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
if (item_func->result_type() == STRING_RESULT)
- DBUG_RETURN(spider_db_open_item_string(item_func, spider, str,
- alias, alias_length, dbton_id));
+ DBUG_RETURN(spider_db_open_item_string(item_func, NULL, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields));
else
- DBUG_RETURN(spider_db_open_item_int(item_func, spider, str,
- alias, alias_length, dbton_id));
+ DBUG_RETURN(spider_db_open_item_int(item_func, NULL, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields));
case Item_func::FT_FUNC:
if (spider_db_check_ft_idx(item_func, spider) == MAX_KEY)
DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
@@ -4139,8 +5005,8 @@ int spider_db_mysql_util::open_item_func(
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_MATCH_STR, SPIDER_SQL_MATCH_LEN);
}
- separete_str = SPIDER_SQL_COMMA_STR;
- separete_str_length = SPIDER_SQL_COMMA_LEN;
+ separator_str = SPIDER_SQL_COMMA_STR;
+ separator_str_length = SPIDER_SQL_COMMA_LEN;
last_str = SPIDER_SQL_CLOSE_PAREN_STR;
last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
break;
@@ -4157,8 +5023,8 @@ int spider_db_mysql_util::open_item_func(
}
func_name = SPIDER_SQL_COMMA_STR;
func_name_length = SPIDER_SQL_COMMA_LEN;
- separete_str = SPIDER_SQL_COMMA_STR;
- separete_str_length = SPIDER_SQL_COMMA_LEN;
+ separator_str = SPIDER_SQL_COMMA_STR;
+ separator_str_length = SPIDER_SQL_COMMA_LEN;
last_str = SPIDER_SQL_CLOSE_PAREN_STR;
last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
break;
@@ -4189,8 +5055,8 @@ int spider_db_mysql_util::open_item_func(
}
func_name = SPIDER_SQL_COMMA_STR;
func_name_length = SPIDER_SQL_COMMA_LEN;
- separete_str = SPIDER_SQL_COMMA_STR;
- separete_str_length = SPIDER_SQL_COMMA_LEN;
+ separator_str = SPIDER_SQL_COMMA_STR;
+ separator_str_length = SPIDER_SQL_COMMA_LEN;
last_str = SPIDER_SQL_CLOSE_PAREN_STR;
last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
break;
@@ -4237,23 +5103,33 @@ int spider_db_mysql_util::open_item_func(
}
DBUG_PRINT("info",("spider func_name = %s", func_name));
DBUG_PRINT("info",("spider func_name_length = %d", func_name_length));
- DBUG_PRINT("info",("spider separete_str = %s", separete_str));
- DBUG_PRINT("info",("spider separete_str_length = %d", separete_str_length));
+ DBUG_PRINT("info",("spider separator_str = %s", separator_str));
+ DBUG_PRINT("info",("spider separator_str_length = %d", separator_str_length));
DBUG_PRINT("info",("spider last_str = %s", last_str));
DBUG_PRINT("info",("spider last_str_length = %d", last_str_length));
if (item_count)
{
+ /* Find the field in the list of items of the expression tree */
+ field = spider_db_find_field_in_item_list(item_list,
+ item_count, start_item,
+ str,
+ func_name, func_name_length);
item_count--;
+ /*
+ Loop through the items of the current function expression to
+ print its portion of the statement
+ */
for (roop_count = start_item; roop_count < item_count; roop_count++)
{
item = item_list[roop_count];
- if ((error_num = spider_db_print_item_type(item, spider, str,
- alias, alias_length, dbton_id)))
+ if ((error_num = spider_db_print_item_type(item, field, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields)))
DBUG_RETURN(error_num);
if (roop_count == 1)
{
- func_name = separete_str;
- func_name_length = separete_str_length;
+ /* Remaining operands need to be preceded by the separator */
+ func_name = separator_str;
+ func_name_length = separator_str_length;
}
if (str)
{
@@ -4264,11 +5140,14 @@ int spider_db_mysql_util::open_item_func(
str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
}
}
+
+ /* Print the last operand value */
item = item_list[roop_count];
- if ((error_num = spider_db_print_item_type(item, spider, str,
- alias, alias_length, dbton_id)))
+ if ((error_num = spider_db_print_item_type(item, field, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields)))
DBUG_RETURN(error_num);
}
+
if (item_func->functype() == Item_func::FT_FUNC)
{
Item_func_match *item_func_match = (Item_func_match *)item_func;
@@ -4279,8 +5158,8 @@ int spider_db_mysql_util::open_item_func(
str->q_append(SPIDER_SQL_AGAINST_STR, SPIDER_SQL_AGAINST_LEN);
}
item = item_list[0];
- if ((error_num = spider_db_print_item_type(item, spider, str,
- alias, alias_length, dbton_id)))
+ if ((error_num = spider_db_print_item_type(item, NULL, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields)))
DBUG_RETURN(error_num);
if (str)
{
@@ -4308,7 +5187,8 @@ int spider_db_mysql_util::open_item_func(
{
Item_func_conv_charset *item_func_conv_charset =
(Item_func_conv_charset *)item_func;
- CHARSET_INFO *conv_charset = item_func_conv_charset->collation.collation;
+ CHARSET_INFO *conv_charset =
+ item_func_conv_charset->SPIDER_Item_func_conv_charset_conv_charset;
uint cset_length = strlen(conv_charset->csname);
if (str->reserve(SPIDER_SQL_USING_LEN + cset_length))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
@@ -4319,6 +5199,8 @@ int spider_db_mysql_util::open_item_func(
}
if (str)
{
+ if (merge_func)
+ str->length(str->length() - SPIDER_SQL_CLOSE_PAREN_LEN);
if (str->reserve(last_str_length + SPIDER_SQL_CLOSE_PAREN_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(last_str, last_str_length);
@@ -4328,17 +5210,18 @@ int spider_db_mysql_util::open_item_func(
}
#ifdef HANDLER_HAS_DIRECT_AGGREGATE
-int spider_db_mysql_util::open_item_sum_func(
+int spider_db_mbase_util::open_item_sum_func(
Item_sum *item_sum,
ha_spider *spider,
spider_string *str,
const char *alias,
- uint alias_length
+ uint alias_length,
+ bool use_fields,
+ spider_fields *fields
) {
- uint dbton_id = spider_dbton_mysql.dbton_id;
uint roop_count, item_count = item_sum->get_arg_count();
int error_num;
- DBUG_ENTER("spider_db_mysql_util::open_item_sum_func");
+ DBUG_ENTER("spider_db_mbase_util::open_item_sum_func");
DBUG_PRINT("info",("spider Sumfunctype = %d", item_sum->sum_func()));
switch (item_sum->sum_func())
{
@@ -4362,8 +5245,8 @@ int spider_db_mysql_util::open_item_sum_func(
for (roop_count = 0; roop_count < item_count; roop_count++)
{
item = args[roop_count];
- if ((error_num = spider_db_print_item_type(item, spider, str,
- alias, alias_length, dbton_id)))
+ if ((error_num = spider_db_print_item_type(item, NULL, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields)))
DBUG_RETURN(error_num);
if (str)
{
@@ -4373,8 +5256,8 @@ int spider_db_mysql_util::open_item_sum_func(
}
}
item = args[roop_count];
- if ((error_num = spider_db_print_item_type(item, spider, str,
- alias, alias_length, dbton_id)))
+ if ((error_num = spider_db_print_item_type(item, NULL, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields)))
DBUG_RETURN(error_num);
}
if (str)
@@ -4390,6 +5273,48 @@ int spider_db_mysql_util::open_item_sum_func(
case Item_sum::SUM_DISTINCT_FUNC:
case Item_sum::AVG_FUNC:
case Item_sum::AVG_DISTINCT_FUNC:
+ {
+ if (!use_fields)
+ DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
+ const char *func_name = item_sum->func_name();
+ uint func_name_length = strlen(func_name);
+ Item *item, **args = item_sum->get_args();
+ if (str)
+ {
+ if (str->reserve(func_name_length))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(func_name, func_name_length);
+ }
+ if (item_count)
+ {
+ item_count--;
+ for (roop_count = 0; roop_count < item_count; roop_count++)
+ {
+ item = args[roop_count];
+ if ((error_num = spider_db_print_item_type(item, NULL, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields)))
+ DBUG_RETURN(error_num);
+ if (str)
+ {
+ if (str->reserve(SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ }
+ item = args[roop_count];
+ if ((error_num = spider_db_print_item_type(item, NULL, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields)))
+ DBUG_RETURN(error_num);
+ }
+ if (str)
+ {
+ 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);
+ }
+ }
+ break;
case Item_sum::STD_FUNC:
case Item_sum::VARIANCE_FUNC:
case Item_sum::SUM_BIT_FUNC:
@@ -4402,11 +5327,11 @@ int spider_db_mysql_util::open_item_sum_func(
}
#endif
-int spider_db_mysql_util::append_escaped_util(
+int spider_db_mbase_util::append_escaped_util(
spider_string *to,
String *from
) {
- DBUG_ENTER("spider_db_mysql_util::append_escaped_util");
+ DBUG_ENTER("spider_db_mbase_util::append_escaped_util");
DBUG_PRINT("info",("spider this=%p", this));
DBUG_PRINT("info",("spider from=%s", from->charset()->csname));
DBUG_PRINT("info",("spider to=%s", to->charset()->csname));
@@ -4414,11 +5339,603 @@ int spider_db_mysql_util::append_escaped_util(
DBUG_RETURN(0);
}
-spider_mysql_share::spider_mysql_share(
- st_spider_share *share
+#ifdef SPIDER_HAS_GROUP_BY_HANDLER
+int spider_db_mbase_util::append_table(
+ ha_spider *spider,
+ spider_fields *fields,
+ spider_string *str,
+ TABLE_LIST *table_list,
+ TABLE_LIST **used_table_list,
+ uint *current_pos,
+ TABLE_LIST **cond_table_list_ptr,
+ bool top_down,
+ bool first
+) {
+ int error_num;
+ bool use_cond_table_list = FALSE;
+ spider_mbase_share *db_share;
+ spider_mbase_handler *dbton_hdl;
+ SPIDER_TABLE_HOLDER *table_holder;
+ TABLE_LIST *cond_table_list = *cond_table_list_ptr;
+ ha_spider *spd;
+ DBUG_ENTER("spider_db_mbase_util::append_table");
+ DBUG_PRINT("info",("spider table_list=%p", table_list));
+ DBUG_PRINT("info",("spider table_list->outer_join=%u",
+ table_list->outer_join));
+ DBUG_PRINT("info",("spider table_list->on_expr=%p",
+ table_list->on_expr));
+ DBUG_PRINT("info",("spider table_list->join_using_fields=%p",
+ table_list->join_using_fields));
+ DBUG_PRINT("info",("spider table_list->table=%p",
+ table_list->table));
+ if (!top_down && table_list->embedding)
+ {
+ if ((error_num = append_embedding_tables(spider, fields, str,
+ table_list->embedding, used_table_list, current_pos,
+ cond_table_list_ptr)))
+ DBUG_RETURN(error_num);
+ } else if (!table_list->table)
+ {
+ if ((error_num = append_tables_top_down(spider, fields, str, table_list,
+ used_table_list, current_pos, cond_table_list_ptr)))
+ DBUG_RETURN(error_num);
+ } else {
+ if (
+ table_list->outer_join ||
+ table_list->on_expr ||
+ table_list->join_using_fields
+ ) {
+ DBUG_PRINT("info",("spider use table_list"));
+ if (table_list->outer_join & JOIN_TYPE_LEFT)
+ {
+ if (str)
+ {
+ if (str->reserve(SPIDER_SQL_LEFT_JOIN_LEN))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ str->q_append(SPIDER_SQL_LEFT_JOIN_STR, SPIDER_SQL_LEFT_JOIN_LEN);
+ }
+ } else {
+ if (str)
+ {
+ if (str->reserve(SPIDER_SQL_JOIN_LEN))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ str->q_append(SPIDER_SQL_JOIN_STR, SPIDER_SQL_JOIN_LEN);
+ }
+ }
+ } else if (
+ cond_table_list &&
+ (
+ cond_table_list->outer_join ||
+ cond_table_list->on_expr ||
+ cond_table_list->join_using_fields
+ )
+ ) {
+ DBUG_PRINT("info",("spider use cond_table_list"));
+ if (cond_table_list->outer_join & (JOIN_TYPE_LEFT | JOIN_TYPE_RIGHT))
+ {
+ if (str)
+ {
+ if (str->reserve(SPIDER_SQL_LEFT_JOIN_LEN))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ str->q_append(SPIDER_SQL_LEFT_JOIN_STR, SPIDER_SQL_LEFT_JOIN_LEN);
+ }
+ } else {
+ if (str)
+ {
+ if (str->reserve(SPIDER_SQL_JOIN_LEN))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ str->q_append(SPIDER_SQL_JOIN_STR, SPIDER_SQL_JOIN_LEN);
+ }
+ }
+ use_cond_table_list = TRUE;
+ } else if (*current_pos > 0 && !first)
+ {
+ DBUG_PRINT("info",("spider no condition"));
+ if (top_down)
+ {
+ if (str)
+ {
+ if (str->reserve(SPIDER_SQL_JOIN_LEN))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ str->q_append(SPIDER_SQL_JOIN_STR, SPIDER_SQL_JOIN_LEN);
+ }
+ } else {
+ if (str)
+ {
+ if (str->reserve(SPIDER_SQL_COMMA_LEN))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ }
+ }
+
+ if (str)
+ {
+ table_holder = fields->get_table_holder(table_list->table);
+ spd = table_holder->spider;
+ db_share = (spider_mbase_share *)
+ spd->share->dbton_share[dbton_id];
+ dbton_hdl = (spider_mbase_handler *)
+ spd->dbton_handler[dbton_id];
+
+ dbton_hdl->table_name_pos = str->length();
+
+ if (str->reserve(
+ db_share->db_nm_max_length +
+ SPIDER_SQL_DOT_LEN + /* SPIDER_SQL_NAME_QUOTE_LEN */ 4 +
+ db_share->table_nm_max_length + SPIDER_SQL_SPACE_LEN +
+ table_holder->alias->length() - SPIDER_SQL_DOT_LEN
+ )) {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+
+ if ((error_num = db_share->append_table_name_with_adjusting(str,
+ spd->conn_link_idx[dbton_hdl->first_link_idx])))
+ {
+ DBUG_RETURN(error_num);
+ }
+ str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
+ str->q_append(table_holder->alias->ptr(),
+ table_holder->alias->length() - SPIDER_SQL_DOT_LEN);
+ }
+ used_table_list[(*current_pos)++] = table_list;
+
+ if (str)
+ {
+ List<String> *join_using_fields = table_list->join_using_fields;
+ if (!join_using_fields && cond_table_list)
+ {
+ join_using_fields = cond_table_list->join_using_fields;
+ }
+
+ if (join_using_fields)
+ {
+ if (str->reserve(SPIDER_SQL_USING_LEN + SPIDER_SQL_OPEN_PAREN_LEN))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ str->q_append(SPIDER_SQL_USING_STR, SPIDER_SQL_USING_LEN);
+ str->q_append(SPIDER_SQL_OPEN_PAREN_STR,
+ SPIDER_SQL_OPEN_PAREN_LEN);
+ List_iterator_fast<String> it2(*join_using_fields);
+ String *ptr;
+ while ((ptr = it2++))
+ {
+ if (str->reserve(ptr->length() + SPIDER_SQL_COMMA_LEN))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ str->q_append(ptr->ptr(), ptr->length());
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ str->length(str->length() - 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);
+ }
+ }
+
+ Item *on_expr = table_list->on_expr;
+ if (!on_expr && cond_table_list)
+ {
+ on_expr = cond_table_list->on_expr;
+ }
+
+ if (on_expr)
+ {
+ if (str)
+ {
+ if (str->reserve(SPIDER_SQL_ON_LEN))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ str->q_append(SPIDER_SQL_ON_STR, SPIDER_SQL_ON_LEN);
+ }
+ if ((error_num = spider_db_print_item_type(on_expr, NULL,
+ spider, str, NULL, 0, dbton_id, TRUE, fields)))
+ {
+ DBUG_RETURN(error_num);
+ }
+ }
+
+ if (use_cond_table_list)
+ {
+ (*cond_table_list_ptr) = NULL;
+ DBUG_PRINT("info",("spider cond_table_list=%p", (*cond_table_list_ptr)));
+ }
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_db_mbase_util::append_tables_top_down(
+ ha_spider *spider,
+ spider_fields *fields,
+ spider_string *str,
+ TABLE_LIST *table_list,
+ TABLE_LIST **used_table_list,
+ uint *current_pos,
+ TABLE_LIST **cond_table_list_ptr
+) {
+ int error_num;
+ uint outer_join_backup;
+ TABLE_LIST *cur_table_list, *prev_table_list = NULL, *cond_table_list = NULL;
+ bool first = TRUE;
+ DBUG_ENTER("spider_db_mbase_util::append_tables_top_down");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (
+ table_list->outer_join ||
+ table_list->on_expr ||
+ table_list->join_using_fields
+ ) {
+ DBUG_ASSERT(!(*cond_table_list_ptr));
+ (*cond_table_list_ptr) = table_list;
+ DBUG_PRINT("info",("spider cond_table_list=%p", table_list));
+ }
+ List_iterator_fast<TABLE_LIST> it1(table_list->nested_join->join_list);
+ cur_table_list = it1++;
+ if (cur_table_list->outer_join & JOIN_TYPE_RIGHT)
+ {
+ first = FALSE;
+ prev_table_list = cur_table_list;
+ cur_table_list = it1++;
+ } else if (*cond_table_list_ptr)
+ {
+ first = TRUE;
+ cond_table_list = (*cond_table_list_ptr);
+ (*cond_table_list_ptr) = NULL;
+ if (cond_table_list->outer_join & JOIN_TYPE_LEFT)
+ {
+ if (str)
+ {
+ if (str->reserve(SPIDER_SQL_LEFT_JOIN_LEN + SPIDER_SQL_OPEN_PAREN_LEN))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ str->q_append(SPIDER_SQL_LEFT_JOIN_STR, SPIDER_SQL_LEFT_JOIN_LEN);
+ str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
+ }
+ } else {
+ if (str)
+ {
+ if (str->reserve(SPIDER_SQL_JOIN_LEN + SPIDER_SQL_OPEN_PAREN_LEN))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ str->q_append(SPIDER_SQL_JOIN_STR, SPIDER_SQL_JOIN_LEN);
+ str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
+ }
+ }
+ }
+
+ do {
+ if (cur_table_list->outer_join & JOIN_TYPE_RIGHT)
+ {
+ prev_table_list = cur_table_list;
+ } else {
+ if ((error_num = append_table(spider, fields, str, cur_table_list,
+ used_table_list, current_pos, cond_table_list_ptr, TRUE, first)))
+ DBUG_RETURN(error_num);
+ first = FALSE;
+ if (prev_table_list)
+ {
+ outer_join_backup = prev_table_list->outer_join;
+ prev_table_list->outer_join = JOIN_TYPE_LEFT;
+ if ((error_num = append_table(spider, fields, str, prev_table_list,
+ used_table_list, current_pos, cond_table_list_ptr, TRUE, FALSE)))
+ {
+ prev_table_list->outer_join = outer_join_backup;
+ DBUG_RETURN(error_num);
+ }
+ prev_table_list->outer_join = outer_join_backup;
+ prev_table_list = NULL;
+ }
+ }
+ } while ((cur_table_list = it1++));
+
+ if (cond_table_list)
+ {
+ if (str)
+ {
+ 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);
+
+ List<String> *join_using_fields = cond_table_list->join_using_fields;
+ if (join_using_fields)
+ {
+ if (str->reserve(SPIDER_SQL_USING_LEN + SPIDER_SQL_OPEN_PAREN_LEN))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ str->q_append(SPIDER_SQL_USING_STR, SPIDER_SQL_USING_LEN);
+ str->q_append(SPIDER_SQL_OPEN_PAREN_STR,
+ SPIDER_SQL_OPEN_PAREN_LEN);
+ List_iterator_fast<String> it2(*join_using_fields);
+ String *ptr;
+ while ((ptr = it2++))
+ {
+ if (str->reserve(ptr->length() + SPIDER_SQL_COMMA_LEN))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ str->q_append(ptr->ptr(), ptr->length());
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ str->length(str->length() - 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);
+ }
+ }
+
+ Item *on_expr = cond_table_list->on_expr;
+ if (on_expr)
+ {
+ if (str)
+ {
+ if (str->reserve(SPIDER_SQL_ON_LEN))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ str->q_append(SPIDER_SQL_ON_STR, SPIDER_SQL_ON_LEN);
+ }
+ if ((error_num = spider_db_print_item_type(on_expr, NULL,
+ spider, str, NULL, 0, dbton_id, TRUE, fields)))
+ {
+ DBUG_RETURN(error_num);
+ }
+ }
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_db_mbase_util::append_tables_top_down_check(
+ TABLE_LIST *table_list,
+ TABLE_LIST **used_table_list,
+ uint *current_pos
+) {
+ int error_num;
+ TABLE_LIST *cur_table_list;
+ DBUG_ENTER("spider_db_mbase_util::append_tables_top_down_check");
+ DBUG_PRINT("info",("spider this=%p", this));
+ List_iterator_fast<TABLE_LIST> it1(table_list->nested_join->join_list);
+ while ((cur_table_list = it1++))
+ {
+ if (!cur_table_list->table)
+ {
+ if ((error_num = append_tables_top_down_check(
+ cur_table_list, used_table_list, current_pos)))
+ DBUG_RETURN(error_num);
+ } else {
+ used_table_list[(*current_pos)++] = cur_table_list;
+ }
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_db_mbase_util::append_embedding_tables(
+ ha_spider *spider,
+ spider_fields *fields,
+ spider_string *str,
+ TABLE_LIST *table_list,
+ TABLE_LIST **used_table_list,
+ uint *current_pos,
+ TABLE_LIST **cond_table_list_ptr
+) {
+ int error_num;
+ TABLE_LIST *embedding = table_list->embedding;
+ DBUG_ENTER("spider_db_mbase_util::append_embedding_tables");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (embedding)
+ {
+ DBUG_PRINT("info",("spider embedding=%p", embedding));
+ DBUG_PRINT("info",("spider embedding->outer_join=%u",
+ embedding->outer_join));
+ DBUG_PRINT("info",("spider embedding->on_expr=%p",
+ embedding->on_expr));
+ DBUG_PRINT("info",("spider embedding->join_using_fields=%p",
+ embedding->join_using_fields));
+ DBUG_PRINT("info",("spider embedding->table=%p",
+ embedding->table));
+ if ((error_num = append_embedding_tables(spider, fields, str, embedding,
+ used_table_list, current_pos, cond_table_list_ptr)))
+ DBUG_RETURN(error_num);
+ } else {
+ DBUG_PRINT("info",("spider table_list=%p", table_list));
+ DBUG_PRINT("info",("spider table_list->outer_join=%u",
+ table_list->outer_join));
+ DBUG_PRINT("info",("spider table_list->on_expr=%p",
+ table_list->on_expr));
+ DBUG_PRINT("info",("spider table_list->join_using_fields=%p",
+ table_list->join_using_fields));
+ DBUG_PRINT("info",("spider table_list->table=%p",
+ table_list->table));
+ if (table_list->outer_join & JOIN_TYPE_RIGHT)
+ {
+ if ((error_num = append_tables_top_down_check(table_list,
+ used_table_list, current_pos)))
+ DBUG_RETURN(error_num);
+ DBUG_ASSERT(!(*cond_table_list_ptr));
+ (*cond_table_list_ptr) = table_list;
+ DBUG_PRINT("info",("spider cond_table_list=%p", table_list));
+ } else {
+ if ((error_num = append_tables_top_down(spider, fields, str, table_list,
+ used_table_list, current_pos, cond_table_list_ptr)))
+ DBUG_RETURN(error_num);
+ }
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_db_mbase_util::append_from_and_tables(
+ ha_spider *spider,
+ spider_fields *fields,
+ spider_string *str,
+ TABLE_LIST *table_list,
+ uint table_count
+) {
+ int error_num;
+ uint current_pos = 0, roop_count, backup_pos, outer_join_backup;
+ TABLE *table;
+ TABLE_LIST **used_table_list, *prev_table_list = NULL,
+ *cond_table_list = NULL;
+ DBUG_ENTER("spider_db_mbase_util::append_from_and_tables");
+ DBUG_PRINT("info",("spider this=%p", this));
+ used_table_list = (TABLE_LIST **)
+ my_alloca(sizeof(TABLE_LIST *) * table_count);
+ if (!used_table_list)
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+
+ if (str)
+ {
+ if (str->reserve(SPIDER_SQL_FROM_LEN))
+ {
+ my_afree(used_table_list);
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ str->q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN);
+ }
+
+ do {
+ table = table_list->table;
+ if (table->const_table)
+ continue;
+
+ for (roop_count = 0; roop_count < current_pos; ++roop_count)
+ {
+ if (used_table_list[roop_count] == table_list)
+ break;
+ }
+ if (roop_count < current_pos)
+ continue;
+
+ if (prev_table_list)
+ current_pos = backup_pos;
+ else
+ backup_pos = current_pos;
+ if ((error_num = append_table(spider, fields, str, table_list, used_table_list,
+ &current_pos, &cond_table_list, FALSE, FALSE)))
+ {
+ my_afree(used_table_list);
+ DBUG_RETURN(error_num);
+ }
+ if (prev_table_list)
+ {
+ outer_join_backup = prev_table_list->outer_join;
+ prev_table_list->outer_join = JOIN_TYPE_LEFT;
+ if ((error_num = append_table(spider, fields, str, prev_table_list,
+ used_table_list, &current_pos, &cond_table_list, FALSE, FALSE)))
+ {
+ prev_table_list->outer_join = outer_join_backup;
+ my_afree(used_table_list);
+ DBUG_RETURN(error_num);
+ }
+ prev_table_list->outer_join = outer_join_backup;
+ prev_table_list = NULL;
+ }
+ if (cond_table_list && (cond_table_list->outer_join & JOIN_TYPE_RIGHT))
+ {
+ prev_table_list = cond_table_list;
+ cond_table_list = NULL;
+ DBUG_PRINT("info",("spider cond_table_list=%p", cond_table_list));
+ }
+ } while ((table_list = table_list->next_local));
+ my_afree(used_table_list);
+ DBUG_RETURN(0);
+}
+
+int spider_db_mbase_util::reappend_tables(
+ spider_fields *fields,
+ SPIDER_LINK_IDX_CHAIN *link_idx_chain,
+ spider_string *str
+) {
+ int error_num;
+ uint32 length;
+ ha_spider *spider;
+ spider_mbase_share *db_share;
+ spider_mbase_handler *dbton_hdl;
+ SPIDER_TABLE_HOLDER *table_holder;
+ SPIDER_LINK_IDX_HOLDER *link_idx_holder;
+ DBUG_ENTER("spider_db_mbase_util::reappend_tables");
+ DBUG_PRINT("info",("spider this=%p", this));
+ length = str->length();
+ fields->set_pos_to_first_table_on_link_idx_chain(link_idx_chain);
+ fields->set_pos_to_first_table_holder();
+ while ((table_holder = fields->get_next_table_holder()))
+ {
+ link_idx_holder =
+ fields->get_next_table_on_link_idx_chain(link_idx_chain);
+ spider = table_holder->spider;
+ db_share = (spider_mbase_share *)
+ spider->share->dbton_share[dbton_id];
+ if (!db_share->same_db_table_name)
+ {
+ dbton_hdl = (spider_mbase_handler *) spider->dbton_handler[dbton_id];
+ str->length(dbton_hdl->table_name_pos);
+ if ((error_num = db_share->append_table_name_with_adjusting(str,
+ spider->conn_link_idx[link_idx_holder->link_idx])))
+ {
+ DBUG_RETURN(error_num);
+ }
+ }
+ }
+ str->length(length);
+ DBUG_RETURN(0);
+}
+
+int spider_db_mbase_util::append_where(
+ spider_string *str
+) {
+ DBUG_ENTER("spider_db_mbase_util::append_where");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (str->reserve(SPIDER_SQL_WHERE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_WHERE_STR, SPIDER_SQL_WHERE_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_db_mbase_util::append_having(
+ spider_string *str
+) {
+ DBUG_ENTER("spider_db_mbase_util::append_having");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (str->reserve(SPIDER_SQL_HAVING_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_HAVING_STR, SPIDER_SQL_HAVING_LEN);
+ DBUG_RETURN(0);
+}
+#endif
+
+spider_mbase_share::spider_mbase_share(
+ st_spider_share *share,
+ uint dbton_id,
+ spider_db_mbase_util *spider_db_mbase_utility
) : spider_db_share(
- share
+ share,
+ dbton_id
),
+ spider_db_mbase_utility(spider_db_mbase_utility),
table_select(NULL),
table_select_pos(0),
key_select(NULL),
@@ -4439,16 +5956,39 @@ spider_mysql_share::spider_mysql_share(
same_db_table_name(TRUE),
first_all_link_idx(-1)
{
- DBUG_ENTER("spider_mysql_share::spider_mysql_share");
+ DBUG_ENTER("spider_mbase_share::spider_mbase_share");
DBUG_PRINT("info",("spider this=%p", this));
spider_alloc_calc_mem_init(mem_calc, 71);
spider_alloc_calc_mem(spider_current_trx, mem_calc, sizeof(*this));
DBUG_VOID_RETURN;
}
-spider_mysql_share::~spider_mysql_share()
+spider_mysql_share::spider_mysql_share(
+ st_spider_share *share
+) : spider_mbase_share(
+ share,
+ spider_db_mysql_utility.dbton_id,
+ &spider_db_mysql_utility
+) {
+ DBUG_ENTER("spider_mysql_share::spider_mysql_share");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_VOID_RETURN;
+}
+spider_mariadb_share::spider_mariadb_share(
+ st_spider_share *share
+) : spider_mbase_share(
+ share,
+ spider_db_mariadb_utility.dbton_id,
+ &spider_db_mariadb_utility
+) {
+ DBUG_ENTER("spider_mariadb_share::spider_mariadb_share");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_VOID_RETURN;
+}
+
+spider_mbase_share::~spider_mbase_share()
{
- DBUG_ENTER("spider_mysql_share::~spider_mysql_share");
+ DBUG_ENTER("spider_mbase_share::~spider_mbase_share");
DBUG_PRINT("info",("spider this=%p", this));
if (table_select)
delete [] table_select;
@@ -4469,13 +6009,27 @@ spider_mysql_share::~spider_mysql_share()
DBUG_VOID_RETURN;
}
-int spider_mysql_share::init()
+spider_mysql_share::~spider_mysql_share()
+{
+ DBUG_ENTER("spider_mysql_share::~spider_mysql_share");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_VOID_RETURN;
+}
+
+spider_mariadb_share::~spider_mariadb_share()
+{
+ DBUG_ENTER("spider_mariadb_share::~spider_mariadb_share");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_VOID_RETURN;
+}
+
+int spider_mbase_share::init()
{
int error_num;
uint roop_count;
TABLE_SHARE *table_share = spider_share->table_share;
uint keys = table_share ? table_share->keys : 0;
- DBUG_ENTER("spider_mysql_share::init");
+ DBUG_ENTER("spider_mbase_share::init");
DBUG_PRINT("info",("spider this=%p", this));
if (!(key_select_pos = (int *)
spider_bulk_alloc_mem(spider_current_trx, 112,
@@ -4536,33 +6090,33 @@ int spider_mysql_share::init()
DBUG_RETURN(error_num);
}
-uint spider_mysql_share::get_column_name_length(
+uint spider_mbase_share::get_column_name_length(
uint field_index
) {
- DBUG_ENTER("spider_mysql_share::get_column_name_length");
+ DBUG_ENTER("spider_mbase_share::get_column_name_length");
DBUG_PRINT("info",("spider this=%p", this));
DBUG_RETURN(column_name_str[field_index].length());
}
-int spider_mysql_share::append_column_name(
+int spider_mbase_share::append_column_name(
spider_string *str,
uint field_index
) {
int error_num;
- DBUG_ENTER("spider_mysql_share::append_column_name");
+ DBUG_ENTER("spider_mbase_share::append_column_name");
DBUG_PRINT("info",("spider this=%p", this));
- error_num = spider_db_mysql_utility.append_name(str,
+ error_num = spider_db_mbase_utility->append_name(str,
column_name_str[field_index].ptr(), column_name_str[field_index].length());
DBUG_RETURN(error_num);
}
-int spider_mysql_share::append_column_name_with_alias(
+int spider_mbase_share::append_column_name_with_alias(
spider_string *str,
uint field_index,
const char *alias,
uint alias_length
) {
- DBUG_ENTER("spider_mysql_share::append_column_name_with_alias");
+ DBUG_ENTER("spider_mbase_share::append_column_name_with_alias");
DBUG_PRINT("info",("spider this=%p", this));
if (str->reserve(
alias_length +
@@ -4574,7 +6128,7 @@ int spider_mysql_share::append_column_name_with_alias(
DBUG_RETURN(0);
}
-int spider_mysql_share::append_table_name(
+int spider_mbase_share::append_table_name(
spider_string *str,
int all_link_idx
) {
@@ -4582,20 +6136,20 @@ int spider_mysql_share::append_table_name(
uint db_nm_len = db_names_str[all_link_idx].length();
const char *table_nm = table_names_str[all_link_idx].ptr();
uint table_nm_len = table_names_str[all_link_idx].length();
- DBUG_ENTER("spider_mysql_share::append_table_name");
+ DBUG_ENTER("spider_mbase_share::append_table_name");
DBUG_PRINT("info",("spider this=%p", this));
if (str->reserve(db_nm_len + SPIDER_SQL_DOT_LEN + table_nm_len +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 4))
{
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
- spider_db_mysql_utility.append_name(str, db_nm, db_nm_len);
+ spider_db_mbase_utility->append_name(str, db_nm, db_nm_len);
str->q_append(SPIDER_SQL_DOT_STR, SPIDER_SQL_DOT_LEN);
- spider_db_mysql_utility.append_name(str, table_nm, table_nm_len);
+ spider_db_mbase_utility->append_name(str, table_nm, table_nm_len);
DBUG_RETURN(0);
}
-int spider_mysql_share::append_table_name_with_adjusting(
+int spider_mbase_share::append_table_name_with_adjusting(
spider_string *str,
int all_link_idx
) {
@@ -4605,11 +6159,11 @@ int spider_mysql_share::append_table_name_with_adjusting(
const char *table_nm = table_names_str[all_link_idx].ptr();
uint table_nm_len = table_names_str[all_link_idx].length();
uint table_nm_max_len = table_nm_max_length;
- DBUG_ENTER("spider_mysql_share::append_table_name_with_adjusting");
+ DBUG_ENTER("spider_mbase_share::append_table_name_with_adjusting");
DBUG_PRINT("info",("spider this=%p", this));
- spider_db_mysql_utility.append_name(str, db_nm, db_nm_len);
+ spider_db_mbase_utility->append_name(str, db_nm, db_nm_len);
str->q_append(SPIDER_SQL_DOT_STR, SPIDER_SQL_DOT_LEN);
- spider_db_mysql_utility.append_name(str, table_nm, table_nm_len);
+ spider_db_mbase_utility->append_name(str, table_nm, table_nm_len);
uint length =
db_nm_max_len - db_nm_len +
table_nm_max_len - table_nm_len;
@@ -4618,7 +6172,7 @@ int spider_mysql_share::append_table_name_with_adjusting(
DBUG_RETURN(0);
}
-int spider_mysql_share::append_from_with_adjusted_table_name(
+int spider_mbase_share::append_from_with_adjusted_table_name(
spider_string *str,
int *table_name_pos
) {
@@ -4628,7 +6182,7 @@ int spider_mysql_share::append_from_with_adjusted_table_name(
const char *table_nm = table_names_str[0].ptr();
uint table_nm_len = table_names_str[0].length();
uint table_nm_max_len = table_nm_max_length;
- DBUG_ENTER("spider_mysql_share::append_from_with_adjusted_table_name");
+ DBUG_ENTER("spider_mbase_share::append_from_with_adjusted_table_name");
DBUG_PRINT("info",("spider this=%p", this));
if (str->reserve(SPIDER_SQL_FROM_LEN + db_nm_max_length +
SPIDER_SQL_DOT_LEN + table_nm_max_length +
@@ -4638,9 +6192,9 @@ int spider_mysql_share::append_from_with_adjusted_table_name(
}
str->q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN);
*table_name_pos = str->length();
- spider_db_mysql_utility.append_name(str, db_nm, db_nm_len);
+ spider_db_mbase_utility->append_name(str, db_nm, db_nm_len);
str->q_append(SPIDER_SQL_DOT_STR, SPIDER_SQL_DOT_LEN);
- spider_db_mysql_utility.append_name(str, table_nm, table_nm_len);
+ spider_db_mbase_utility->append_name(str, table_nm, table_nm_len);
uint length =
db_nm_max_len - db_nm_len +
table_nm_max_len - table_nm_len;
@@ -4649,14 +6203,13 @@ int spider_mysql_share::append_from_with_adjusted_table_name(
DBUG_RETURN(0);
}
-int spider_mysql_share::create_table_names_str()
+int spider_mbase_share::create_table_names_str()
{
int error_num, roop_count;
uint table_nm_len, db_nm_len;
spider_string *str, *first_tbl_nm_str, *first_db_nm_str, *first_db_tbl_str;
char *first_tbl_nm, *first_db_nm;
- uint dbton_id = spider_dbton_mysql.dbton_id;
- DBUG_ENTER("spider_mysql_share::create_table_names_str");
+ DBUG_ENTER("spider_mbase_share::create_table_names_str");
table_names_str = NULL;
db_names_str = NULL;
db_table_str = NULL;
@@ -4787,9 +6340,9 @@ error:
DBUG_RETURN(error_num);
}
-void spider_mysql_share::free_table_names_str()
+void spider_mbase_share::free_table_names_str()
{
- DBUG_ENTER("spider_mysql_share::free_table_names_str");
+ DBUG_ENTER("spider_mbase_share::free_table_names_str");
if (db_table_str)
{
delete [] db_table_str;
@@ -4808,14 +6361,13 @@ void spider_mysql_share::free_table_names_str()
DBUG_VOID_RETURN;
}
-int spider_mysql_share::create_column_name_str()
+int spider_mbase_share::create_column_name_str()
{
spider_string *str;
int error_num;
Field **field;
TABLE_SHARE *table_share = spider_share->table_share;
- uint dbton_id = spider_dbton_mysql.dbton_id;
- DBUG_ENTER("spider_mysql_share::create_column_name_str");
+ DBUG_ENTER("spider_mbase_share::create_column_name_str");
if (
table_share->fields &&
!(column_name_str = new spider_string[table_share->fields])
@@ -4827,7 +6379,7 @@ int spider_mysql_share::create_column_name_str()
str->init_calc_mem(89);
str->set_charset(spider_share->access_charset);
if ((error_num = spider_db_append_name_with_quote_str(str,
- (char *) (*field)->field_name, dbton_id)))
+ (*field)->field_name, dbton_id)))
goto error;
}
DBUG_RETURN(0);
@@ -4841,9 +6393,9 @@ error:
DBUG_RETURN(error_num);
}
-void spider_mysql_share::free_column_name_str()
+void spider_mbase_share::free_column_name_str()
{
- DBUG_ENTER("spider_mysql_share::free_column_name_str");
+ DBUG_ENTER("spider_mbase_share::free_column_name_str");
if (column_name_str)
{
delete [] column_name_str;
@@ -4852,15 +6404,15 @@ void spider_mysql_share::free_column_name_str()
DBUG_VOID_RETURN;
}
-int spider_mysql_share::convert_key_hint_str()
+int spider_mbase_share::convert_key_hint_str()
{
spider_string *tmp_key_hint;
int roop_count;
TABLE_SHARE *table_share = spider_share->table_share;
- DBUG_ENTER("spider_mysql_share::convert_key_hint_str");
+ DBUG_ENTER("spider_mbase_share::convert_key_hint_str");
if (spider_share->access_charset->cset != system_charset_info->cset)
{
- /* need convertion */
+ /* need conversion */
for (roop_count = 0, tmp_key_hint = key_hint;
roop_count < (int) table_share->keys; roop_count++, tmp_key_hint++)
{
@@ -4880,11 +6432,10 @@ int spider_mysql_share::convert_key_hint_str()
DBUG_RETURN(0);
}
-int spider_mysql_share::append_show_table_status()
+int spider_mbase_share::append_show_table_status()
{
int roop_count;
spider_string *str;
- uint dbton_id = spider_dbton_mysql.dbton_id;
DBUG_ENTER("spider_mysql_append_show_table_status");
if (!(show_table_status =
new spider_string[2 * spider_share->all_link_count]))
@@ -4952,7 +6503,7 @@ error:
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
-void spider_mysql_share::free_show_table_status()
+void spider_mbase_share::free_show_table_status()
{
DBUG_ENTER("spider_mysql_free_show_table_status");
if (show_table_status)
@@ -4963,12 +6514,11 @@ void spider_mysql_share::free_show_table_status()
DBUG_VOID_RETURN;
}
-int spider_mysql_share::append_show_records()
+int spider_mbase_share::append_show_records()
{
int roop_count;
spider_string *str;
- uint dbton_id = spider_dbton_mysql.dbton_id;
- DBUG_ENTER("spider_mysql_share::append_show_records");
+ DBUG_ENTER("spider_mbase_share::append_show_records");
if (!(show_records = new spider_string[spider_share->all_link_count]))
goto error;
@@ -5003,9 +6553,9 @@ error:
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
-void spider_mysql_share::free_show_records()
+void spider_mbase_share::free_show_records()
{
- DBUG_ENTER("spider_mysql_share::free_show_records");
+ DBUG_ENTER("spider_mbase_share::free_show_records");
if (show_records)
{
delete [] show_records;
@@ -5014,12 +6564,11 @@ void spider_mysql_share::free_show_records()
DBUG_VOID_RETURN;
}
-int spider_mysql_share::append_show_index()
+int spider_mbase_share::append_show_index()
{
int roop_count;
spider_string *str;
- uint dbton_id = spider_dbton_mysql.dbton_id;
- DBUG_ENTER("spider_mysql_share::append_show_index");
+ DBUG_ENTER("spider_mbase_share::append_show_index");
if (!(show_index = new spider_string[2 * spider_share->all_link_count]))
goto error;
@@ -5078,9 +6627,9 @@ error:
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
-void spider_mysql_share::free_show_index()
+void spider_mbase_share::free_show_index()
{
- DBUG_ENTER("spider_mysql_share::free_show_index");
+ DBUG_ENTER("spider_mbase_share::free_show_index");
if (show_index)
{
delete [] show_index;
@@ -5089,13 +6638,17 @@ void spider_mysql_share::free_show_index()
DBUG_VOID_RETURN;
}
-int spider_mysql_share::append_table_select()
+int spider_mbase_share::append_table_select()
{
Field **field;
uint field_length;
spider_string *str = table_select;
TABLE_SHARE *table_share = spider_share->table_share;
- DBUG_ENTER("spider_mysql_share::append_table_select");
+ DBUG_ENTER("spider_mbase_share::append_table_select");
+
+ if (!*table_share->field)
+ DBUG_RETURN(0);
+
for (field = table_share->field; *field; field++)
{
field_length = column_name_str[(*field)->field_index].length();
@@ -5109,7 +6662,7 @@ int spider_mysql_share::append_table_select()
DBUG_RETURN(append_from_with_adjusted_table_name(str, &table_select_pos));
}
-int spider_mysql_share::append_key_select(
+int spider_mbase_share::append_key_select(
uint idx
) {
KEY_PART_INFO *key_part;
@@ -5119,7 +6672,11 @@ int spider_mysql_share::append_key_select(
spider_string *str = &key_select[idx];
TABLE_SHARE *table_share = spider_share->table_share;
const KEY *key_info = &table_share->key_info[idx];
- DBUG_ENTER("spider_mysql_share::append_key_select");
+ DBUG_ENTER("spider_mbase_share::append_key_select");
+
+ if (!spider_user_defined_key_parts(key_info))
+ DBUG_RETURN(0);
+
for (key_part = key_info->key_part, part_num = 0;
part_num < spider_user_defined_key_parts(key_info); key_part++, part_num++)
{
@@ -5135,14 +6692,14 @@ int spider_mysql_share::append_key_select(
DBUG_RETURN(append_from_with_adjusted_table_name(str, &key_select_pos[idx]));
}
-bool spider_mysql_share::need_change_db_table_name()
+bool spider_mbase_share::need_change_db_table_name()
{
- DBUG_ENTER("spider_mysql_share::need_change_db_table_name");
+ DBUG_ENTER("spider_mbase_share::need_change_db_table_name");
DBUG_RETURN(!same_db_table_name);
}
#ifdef SPIDER_HAS_DISCOVER_TABLE_STRUCTURE
-int spider_mysql_share::discover_table_structure(
+int spider_mbase_share::discover_table_structure(
SPIDER_TRX *trx,
SPIDER_SHARE *spider_share,
spider_string *str
@@ -5150,9 +6707,8 @@ int spider_mysql_share::discover_table_structure(
int roop_count, error_num = HA_ERR_WRONG_COMMAND;
char sql_buf[MAX_FIELD_WIDTH];
spider_string sql_str(sql_buf, sizeof(sql_buf), system_charset_info);
- uint dbton_id = spider_dbton_mysql.dbton_id;
uint strlen = str->length();
- DBUG_ENTER("spider_mysql_share::discover_table_structure");
+ DBUG_ENTER("spider_mbase_share::discover_table_structure");
DBUG_PRINT("info",("spider this=%p", this));
sql_str.init_calc_mem(228);
for (roop_count = 0; roop_count < (int) spider_share->all_link_count;
@@ -5446,13 +7002,15 @@ int spider_mysql_share::discover_table_structure(
}
#endif
-spider_mysql_handler::spider_mysql_handler(
+spider_mbase_handler::spider_mbase_handler(
ha_spider *spider,
- spider_mysql_share *db_share
+ spider_mbase_share *db_share,
+ spider_db_mbase_util *spider_db_mbase_utility
) : spider_db_handler(
spider,
db_share
),
+ spider_db_mbase_utility(spider_db_mbase_utility),
where_pos(0),
order_pos(0),
limit_pos(0),
@@ -5476,16 +7034,42 @@ spider_mysql_handler::spider_mysql_handler(
mysql_share(db_share),
link_for_hash(NULL)
{
- DBUG_ENTER("spider_mysql_handler::spider_mysql_handler");
+ DBUG_ENTER("spider_mbase_handler::spider_mbase_handler");
DBUG_PRINT("info",("spider this=%p", this));
spider_alloc_calc_mem_init(mem_calc, 183);
spider_alloc_calc_mem(spider_current_trx, mem_calc, sizeof(*this));
DBUG_VOID_RETURN;
}
-spider_mysql_handler::~spider_mysql_handler()
+spider_mysql_handler::spider_mysql_handler(
+ ha_spider *spider,
+ spider_mbase_share *db_share
+) : spider_mbase_handler(
+ spider,
+ db_share,
+ &spider_db_mysql_utility
+) {
+ DBUG_ENTER("spider_mysql_handler::spider_mysql_handler");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_VOID_RETURN;
+}
+
+spider_mariadb_handler::spider_mariadb_handler(
+ ha_spider *spider,
+ spider_mbase_share *db_share
+) : spider_mbase_handler(
+ spider,
+ db_share,
+ &spider_db_mariadb_utility
+) {
+ DBUG_ENTER("spider_mariadb_handler::spider_mariadb_handler");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_VOID_RETURN;
+}
+
+spider_mbase_handler::~spider_mbase_handler()
{
- DBUG_ENTER("spider_mysql_handler::~spider_mysql_handler");
+ DBUG_ENTER("spider_mbase_handler::~spider_mbase_handler");
DBUG_PRINT("info",("spider this=%p", this));
while (union_table_name_pos_first)
{
@@ -5501,7 +7085,21 @@ spider_mysql_handler::~spider_mysql_handler()
DBUG_VOID_RETURN;
}
-int spider_mysql_handler::init()
+spider_mysql_handler::~spider_mysql_handler()
+{
+ DBUG_ENTER("spider_mysql_handler::~spider_mysql_handler");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_VOID_RETURN;
+}
+
+spider_mariadb_handler::~spider_mariadb_handler()
+{
+ DBUG_ENTER("spider_mariadb_handler::~spider_mariadb_handler");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_VOID_RETURN;
+}
+
+int spider_mbase_handler::init()
{
uint roop_count;
THD *thd = spider->trx->thd;
@@ -5509,7 +7107,7 @@ int spider_mysql_handler::init()
int init_sql_alloc_size =
spider_param_init_sql_alloc_size(thd, share->init_sql_alloc_size);
TABLE *table = spider->get_table();
- DBUG_ENTER("spider_mysql_handler::init");
+ DBUG_ENTER("spider_mbase_handler::init");
DBUG_PRINT("info",("spider this=%p", this));
sql.init_calc_mem(59);
sql_part.init_calc_mem(60);
@@ -5563,13 +7161,68 @@ int spider_mysql_handler::init()
DBUG_RETURN(0);
}
-int spider_mysql_handler::append_table_name_with_adjusting(
+
+int spider_mbase_handler::append_index_hint(
+ spider_string *str,
+ int link_idx,
+ ulong sql_type
+ )
+{
+ List<Index_hint> *index_hints = spider_get_index_hints(spider);
+ List_iterator <Index_hint> iter(*index_hints);
+ Index_hint *hint;
+// THD *thd = current_thd;
+ int error_num = 0;
+ DBUG_ENTER("spider_mbase_handler::append_index_hint");
+ DBUG_PRINT("info",("spider this=%p", this));
+
+ while(index_hints && (hint = iter++))
+ {
+// hint->print(thd, str);
+ if (sql_type != SPIDER_SQL_TYPE_HANDLER)
+ {
+ switch(hint->type)
+ {
+ case INDEX_HINT_IGNORE:
+ if (str->reserve(hint->key_name.length+ SPIDER_SQL_INDEX_IGNORE_LEN + SPIDER_SQL_OPEN_PAREN_LEN + SPIDER_SQL_CLOSE_PAREN_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_INDEX_IGNORE_STR,SPIDER_SQL_INDEX_IGNORE_LEN);
+ str->q_append(SPIDER_SQL_OPEN_PAREN_STR,SPIDER_SQL_OPEN_PAREN_LEN);
+ str->q_append(hint->key_name.str, hint->key_name.length);
+ str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,SPIDER_SQL_CLOSE_PAREN_LEN);
+ break;
+ case INDEX_HINT_USE:
+ if (str->reserve(hint->key_name.length+ SPIDER_SQL_INDEX_USE_LEN + SPIDER_SQL_OPEN_PAREN_LEN + SPIDER_SQL_CLOSE_PAREN_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_INDEX_USE_STR,SPIDER_SQL_INDEX_USE_LEN);
+ str->q_append(SPIDER_SQL_OPEN_PAREN_STR,SPIDER_SQL_OPEN_PAREN_LEN);
+ str->q_append(hint->key_name.str, hint->key_name.length);
+ str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,SPIDER_SQL_CLOSE_PAREN_LEN);
+ break;
+ case INDEX_HINT_FORCE:
+ if (str->reserve(hint->key_name.length+ SPIDER_SQL_INDEX_FORCE_LEN + SPIDER_SQL_OPEN_PAREN_LEN + SPIDER_SQL_CLOSE_PAREN_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_INDEX_FORCE_STR,SPIDER_SQL_INDEX_FORCE_LEN);
+ str->q_append(SPIDER_SQL_OPEN_PAREN_STR,SPIDER_SQL_OPEN_PAREN_LEN);
+ str->q_append(hint->key_name.str, hint->key_name.length);
+ str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,SPIDER_SQL_CLOSE_PAREN_LEN);
+ break;
+ default:
+ // SPIDER_SQL_COMMA_STR
+ break;
+ }
+ }
+ }
+ DBUG_RETURN(error_num);
+}
+
+int spider_mbase_handler::append_table_name_with_adjusting(
spider_string *str,
int link_idx,
ulong sql_type
) {
int error_num = 0;
- DBUG_ENTER("spider_mysql_handler::append_table_name_with_adjusting");
+ DBUG_ENTER("spider_mbase_handler::append_table_name_with_adjusting");
DBUG_PRINT("info",("spider this=%p", this));
if (sql_type == SPIDER_SQL_TYPE_HANDLER)
{
@@ -5581,7 +7234,7 @@ int spider_mysql_handler::append_table_name_with_adjusting(
DBUG_RETURN(error_num);
}
-int spider_mysql_handler::append_key_column_types(
+int spider_mbase_handler::append_key_column_types(
const key_range *start_key,
spider_string *str
) {
@@ -5595,7 +7248,7 @@ int spider_mysql_handler::append_key_column_types(
Field *field;
char tmp_buf[MAX_FIELD_WIDTH];
spider_string tmp_str(tmp_buf, sizeof(tmp_buf), system_charset_info);
- DBUG_ENTER("spider_mysql_handler::append_key_column_types");
+ DBUG_ENTER("spider_mbase_handler::append_key_column_types");
DBUG_PRINT("info",("spider this=%p", this));
tmp_str.init_calc_mem(115);
@@ -5649,7 +7302,7 @@ int spider_mysql_handler::append_key_column_types(
DBUG_RETURN(0);
}
-int spider_mysql_handler::append_key_join_columns_for_bka(
+int spider_mbase_handler::append_key_join_columns_for_bka(
const key_range *start_key,
spider_string *str,
const char **table_aliases,
@@ -5664,7 +7317,7 @@ int spider_mysql_handler::append_key_join_columns_for_bka(
Field *field;
char tmp_buf[MAX_FIELD_WIDTH];
bool start_where = ((int) str->length() == where_pos);
- DBUG_ENTER("spider_mysql_handler::append_key_join_columns_for_bka");
+ DBUG_ENTER("spider_mbase_handler::append_key_join_columns_for_bka");
DBUG_PRINT("info",("spider this=%p", this));
start_key_part_map = start_key->keypart_map & full_key_part_map;
DBUG_PRINT("info", ("spider spider_user_defined_key_parts=%u",
@@ -5713,11 +7366,11 @@ int spider_mysql_handler::append_key_join_columns_for_bka(
DBUG_RETURN(0);
}
-int spider_mysql_handler::append_tmp_table_and_sql_for_bka(
+int spider_mbase_handler::append_tmp_table_and_sql_for_bka(
const key_range *start_key
) {
int error_num;
- DBUG_ENTER("spider_mysql_handler::append_tmp_table_and_sql_for_bka");
+ DBUG_ENTER("spider_mbase_handler::append_tmp_table_and_sql_for_bka");
DBUG_PRINT("info",("spider this=%p", this));
char tmp_table_name[MAX_FIELD_WIDTH * 2],
tgt_table_name[MAX_FIELD_WIDTH * 2];
@@ -5775,7 +7428,7 @@ int spider_mysql_handler::append_tmp_table_and_sql_for_bka(
if (
(error_num = append_select_columns_with_alias(&sql,
SPIDER_SQL_B_DOT_STR, SPIDER_SQL_B_DOT_LEN)) ||
- (error_num = spider_db_mysql_utility.append_from_with_alias(&sql,
+ (error_num = spider_db_mbase_utility->append_from_with_alias(&sql,
table_names, table_name_lengths,
table_aliases, table_alias_lengths, 2,
&table_name_pos, FALSE))
@@ -5815,9 +7468,9 @@ int spider_mysql_handler::append_tmp_table_and_sql_for_bka(
DBUG_RETURN(0);
}
-int spider_mysql_handler::reuse_tmp_table_and_sql_for_bka()
+int spider_mbase_handler::reuse_tmp_table_and_sql_for_bka()
{
- DBUG_ENTER("spider_mysql_handler::reuse_tmp_table_and_sql_for_bka");
+ DBUG_ENTER("spider_mbase_handler::reuse_tmp_table_and_sql_for_bka");
DBUG_PRINT("info",("spider this=%p", this));
tmp_sql.length(tmp_sql_pos4);
sql.length(limit_pos);
@@ -5825,13 +7478,13 @@ int spider_mysql_handler::reuse_tmp_table_and_sql_for_bka()
DBUG_RETURN(0);
}
-void spider_mysql_handler::create_tmp_bka_table_name(
+void spider_mbase_handler::create_tmp_bka_table_name(
char *tmp_table_name,
int *tmp_table_name_length,
int link_idx
) {
uint adjust_length, length;
- DBUG_ENTER("spider_mysql_handler::create_tmp_bka_table_name");
+ DBUG_ENTER("spider_mbase_handler::create_tmp_bka_table_name");
if (spider_param_bka_table_name_type(current_thd,
mysql_share->spider_share->
bka_table_name_types[spider->conn_link_idx[link_idx]]) == 1)
@@ -5873,7 +7526,7 @@ void spider_mysql_handler::create_tmp_bka_table_name(
DBUG_VOID_RETURN;
}
-int spider_mysql_handler::append_create_tmp_bka_table(
+int spider_mbase_handler::append_create_tmp_bka_table(
const key_range *start_key,
spider_string *str,
char *tmp_table_name,
@@ -5888,7 +7541,7 @@ int spider_mysql_handler::append_create_tmp_bka_table(
uint bka_engine_length = strlen(bka_engine),
cset_length = strlen(table_charset->csname),
coll_length = strlen(table_charset->name);
- DBUG_ENTER("spider_mysql_handler::append_create_tmp_bka_table");
+ DBUG_ENTER("spider_mbase_handler::append_create_tmp_bka_table");
if (str->reserve(SPIDER_SQL_CREATE_TMP_LEN + tmp_table_name_length +
SPIDER_SQL_OPEN_PAREN_LEN + SPIDER_SQL_ID_LEN + SPIDER_SQL_ID_TYPE_LEN +
SPIDER_SQL_COMMA_LEN))
@@ -5916,7 +7569,7 @@ int spider_mysql_handler::append_create_tmp_bka_table(
DBUG_RETURN(0);
}
-int spider_mysql_handler::append_drop_tmp_bka_table(
+int spider_mbase_handler::append_drop_tmp_bka_table(
spider_string *str,
char *tmp_table_name,
int tmp_table_name_length,
@@ -5924,7 +7577,7 @@ int spider_mysql_handler::append_drop_tmp_bka_table(
int *drop_table_end_pos,
bool with_semicolon
) {
- DBUG_ENTER("spider_mysql_handler::append_drop_tmp_bka_table");
+ DBUG_ENTER("spider_mbase_handler::append_drop_tmp_bka_table");
if (str->reserve(SPIDER_SQL_DROP_TMP_LEN + tmp_table_name_length +
(with_semicolon ? SPIDER_SQL_SEMICOLON_LEN : 0)))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
@@ -5937,7 +7590,7 @@ int spider_mysql_handler::append_drop_tmp_bka_table(
DBUG_RETURN(0);
}
-int spider_mysql_handler::append_insert_tmp_bka_table(
+int spider_mbase_handler::append_insert_tmp_bka_table(
const key_range *start_key,
spider_string *str,
char *tmp_table_name,
@@ -5945,7 +7598,7 @@ int spider_mysql_handler::append_insert_tmp_bka_table(
int *db_name_pos
) {
int error_num;
- DBUG_ENTER("spider_mysql_handler::append_insert_tmp_bka_table");
+ DBUG_ENTER("spider_mbase_handler::append_insert_tmp_bka_table");
if (str->reserve(SPIDER_SQL_INSERT_LEN + SPIDER_SQL_INTO_LEN +
tmp_table_name_length + SPIDER_SQL_OPEN_PAREN_LEN + SPIDER_SQL_ID_LEN +
SPIDER_SQL_COMMA_LEN))
@@ -5968,11 +7621,11 @@ int spider_mysql_handler::append_insert_tmp_bka_table(
DBUG_RETURN(0);
}
-int spider_mysql_handler::append_union_table_and_sql_for_bka(
+int spider_mbase_handler::append_union_table_and_sql_for_bka(
const key_range *start_key
) {
int error_num;
- DBUG_ENTER("spider_mysql_handler::append_union_table_and_sql_for_bka");
+ DBUG_ENTER("spider_mbase_handler::append_union_table_and_sql_for_bka");
DBUG_PRINT("info",("spider this=%p", this));
char tgt_table_name[MAX_FIELD_WIDTH * 2];
spider_string tgt_table_name_str(tgt_table_name, MAX_FIELD_WIDTH * 2,
@@ -6019,7 +7672,7 @@ int spider_mysql_handler::append_union_table_and_sql_for_bka(
tmp_sql_pos1 = sql.length();
if (
- (error_num = spider_db_mysql_utility.append_from_with_alias(&tmp_sql,
+ (error_num = spider_db_mbase_utility->append_from_with_alias(&tmp_sql,
table_names, table_name_lengths,
table_aliases, table_alias_lengths, 2,
&table_name_pos, FALSE))
@@ -6061,15 +7714,15 @@ int spider_mysql_handler::append_union_table_and_sql_for_bka(
DBUG_RETURN(0);
}
-int spider_mysql_handler::reuse_union_table_and_sql_for_bka()
+int spider_mbase_handler::reuse_union_table_and_sql_for_bka()
{
- DBUG_ENTER("spider_mysql_handler::reuse_union_table_and_sql_for_bka");
+ DBUG_ENTER("spider_mbase_handler::reuse_union_table_and_sql_for_bka");
DBUG_PRINT("info",("spider this=%p", this));
sql.length(tmp_sql_pos1);
DBUG_RETURN(0);
}
-int spider_mysql_handler::append_insert_for_recovery(
+int spider_mbase_handler::append_insert_for_recovery(
ulong sql_type,
int link_idx
) {
@@ -6079,7 +7732,7 @@ int spider_mysql_handler::append_insert_for_recovery(
uint field_name_length = 0;
bool add_value = FALSE;
spider_string *insert_sql;
- DBUG_ENTER("spider_mysql_handler::append_insert_for_recovery");
+ DBUG_ENTER("spider_mbase_handler::append_insert_for_recovery");
DBUG_PRINT("info",("spider this=%p", this));
if (sql_type == SPIDER_SQL_TYPE_INSERT_SQL)
{
@@ -6127,7 +7780,7 @@ int spider_mysql_handler::append_insert_for_recovery(
insert_sql->q_append(SPIDER_SQL_NULL_STR, SPIDER_SQL_NULL_LEN);
} else {
if (
- spider_db_mysql_utility.
+ spider_db_mbase_utility->
append_column_value(spider, insert_sql, *field, NULL,
share->access_charset) ||
insert_sql->reserve(SPIDER_SQL_COMMA_LEN)
@@ -6148,13 +7801,13 @@ int spider_mysql_handler::append_insert_for_recovery(
DBUG_RETURN(0);
}
-int spider_mysql_handler::append_update(
+int spider_mbase_handler::append_update(
const TABLE *table,
my_ptrdiff_t ptr_diff
) {
int error_num;
spider_string *str = &update_sql;
- DBUG_ENTER("spider_mysql_handler::append_update");
+ DBUG_ENTER("spider_mbase_handler::append_update");
DBUG_PRINT("info",("spider this=%p", this));
if (str->length() > 0)
{
@@ -6173,7 +7826,7 @@ int spider_mysql_handler::append_update(
DBUG_RETURN(0);
}
-int spider_mysql_handler::append_update(
+int spider_mbase_handler::append_update(
const TABLE *table,
my_ptrdiff_t ptr_diff,
int link_idx
@@ -6181,7 +7834,7 @@ int spider_mysql_handler::append_update(
int error_num;
SPIDER_SHARE *share = spider->share;
spider_string *str = &spider->result_list.update_sqls[link_idx];
- DBUG_ENTER("spider_mysql_handler::append_update");
+ DBUG_ENTER("spider_mbase_handler::append_update");
DBUG_PRINT("info",("spider this=%p", this));
if (str->length() > 0)
{
@@ -6214,13 +7867,13 @@ int spider_mysql_handler::append_update(
DBUG_RETURN(0);
}
-int spider_mysql_handler::append_delete(
+int spider_mbase_handler::append_delete(
const TABLE *table,
my_ptrdiff_t ptr_diff
) {
int error_num;
spider_string *str = &update_sql;
- DBUG_ENTER("spider_mysql_handler::append_delete");
+ DBUG_ENTER("spider_mbase_handler::append_delete");
DBUG_PRINT("info",("spider this=%p", this));
if (str->length() > 0)
{
@@ -6240,14 +7893,14 @@ int spider_mysql_handler::append_delete(
DBUG_RETURN(0);
}
-int spider_mysql_handler::append_delete(
+int spider_mbase_handler::append_delete(
const TABLE *table,
my_ptrdiff_t ptr_diff,
int link_idx
) {
int error_num;
spider_string *str = &spider->result_list.update_sqls[link_idx];
- DBUG_ENTER("spider_mysql_handler::append_delete");
+ DBUG_ENTER("spider_mbase_handler::append_delete");
DBUG_PRINT("info",("spider this=%p", this));
if (str->length() > 0)
{
@@ -6267,21 +7920,21 @@ int spider_mysql_handler::append_delete(
DBUG_RETURN(0);
}
-int spider_mysql_handler::append_insert_part()
+int spider_mbase_handler::append_insert_part()
{
int error_num;
- DBUG_ENTER("spider_mysql_handler::append_insert_part");
+ DBUG_ENTER("spider_mbase_handler::append_insert_part");
DBUG_PRINT("info",("spider this=%p", this));
error_num = append_insert(&insert_sql, 0);
DBUG_RETURN(error_num);
}
-int spider_mysql_handler::append_insert(
+int spider_mbase_handler::append_insert(
spider_string *str,
int link_idx
) {
SPIDER_SHARE *share = spider->share;
- DBUG_ENTER("spider_mysql_handler::append_insert");
+ DBUG_ENTER("spider_mbase_handler::append_insert");
if (
(
spider->write_can_replace ||
@@ -6345,20 +7998,20 @@ int spider_mysql_handler::append_insert(
DBUG_RETURN(0);
}
-int spider_mysql_handler::append_update_part()
+int spider_mbase_handler::append_update_part()
{
int error_num;
- DBUG_ENTER("spider_mysql_handler::append_update_part");
+ DBUG_ENTER("spider_mbase_handler::append_update_part");
DBUG_PRINT("info",("spider this=%p", this));
error_num = append_update(&update_sql, 0);
DBUG_RETURN(error_num);
}
-int spider_mysql_handler::append_update(
+int spider_mbase_handler::append_update(
spider_string *str,
int link_idx
) {
- DBUG_ENTER("spider_mysql_handler::append_update");
+ DBUG_ENTER("spider_mbase_handler::append_update");
if (str->reserve(SPIDER_SQL_UPDATE_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_UPDATE_STR, SPIDER_SQL_UPDATE_LEN);
@@ -6385,19 +8038,19 @@ int spider_mysql_handler::append_update(
DBUG_RETURN(0);
}
-int spider_mysql_handler::append_delete_part()
+int spider_mbase_handler::append_delete_part()
{
int error_num;
- DBUG_ENTER("spider_mysql_handler::append_delete_part");
+ DBUG_ENTER("spider_mbase_handler::append_delete_part");
DBUG_PRINT("info",("spider this=%p", this));
error_num = append_delete(&update_sql);
DBUG_RETURN(error_num);
}
-int spider_mysql_handler::append_delete(
+int spider_mbase_handler::append_delete(
spider_string *str
) {
- DBUG_ENTER("spider_mysql_handler::append_delete");
+ DBUG_ENTER("spider_mbase_handler::append_delete");
if (str->reserve(SPIDER_SQL_DELETE_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_DELETE_STR, SPIDER_SQL_DELETE_LEN);
@@ -6426,22 +8079,22 @@ int spider_mysql_handler::append_delete(
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
-int spider_mysql_handler::append_increment_update_set_part()
+int spider_mbase_handler::append_increment_update_set_part()
{
int error_num;
- DBUG_ENTER("spider_mysql_handler::append_increment_update_set_part");
+ DBUG_ENTER("spider_mbase_handler::append_increment_update_set_part");
DBUG_PRINT("info",("spider this=%p", this));
error_num = append_increment_update_set(&update_sql);
DBUG_RETURN(error_num);
}
-int spider_mysql_handler::append_increment_update_set(
+int spider_mbase_handler::append_increment_update_set(
spider_string *str
) {
uint field_name_length;
uint roop_count;
Field *field;
- DBUG_ENTER("spider_mysql_handler::append_increment_update_set");
+ DBUG_ENTER("spider_mbase_handler::append_increment_update_set");
if (str->reserve(SPIDER_SQL_SET_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_SET_STR, SPIDER_SQL_SET_LEN);
@@ -6485,24 +8138,24 @@ int spider_mysql_handler::append_increment_update_set(
#endif
#endif
-int spider_mysql_handler::append_update_set_part()
+int spider_mbase_handler::append_update_set_part()
{
int error_num;
- DBUG_ENTER("spider_mysql_handler::append_update_set_part");
+ DBUG_ENTER("spider_mbase_handler::append_update_set_part");
DBUG_PRINT("info",("spider this=%p", this));
error_num = append_update_set(&update_sql);
where_pos = update_sql.length();
DBUG_RETURN(error_num);
}
-int spider_mysql_handler::append_update_set(
+int spider_mbase_handler::append_update_set(
spider_string *str
) {
uint field_name_length;
SPIDER_SHARE *share = spider->share;
TABLE *table = spider->get_table();
Field **fields;
- DBUG_ENTER("spider_mysql_handler::append_update_set");
+ DBUG_ENTER("spider_mbase_handler::append_update_set");
if (str->reserve(SPIDER_SQL_SET_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_SET_STR, SPIDER_SQL_SET_LEN);
@@ -6531,7 +8184,7 @@ int spider_mysql_handler::append_update_set(
MY_BITMAP *tmp_map = dbug_tmp_use_all_columns(table, &table->read_set);
#endif
if (
- spider_db_mysql_utility.
+ spider_db_mbase_utility->
append_column_value(spider, str, *fields, NULL,
share->access_charset) ||
str->reserve(SPIDER_SQL_COMMA_LEN)
@@ -6553,17 +8206,17 @@ int spider_mysql_handler::append_update_set(
}
#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
-int spider_mysql_handler::append_direct_update_set_part()
+int spider_mbase_handler::append_direct_update_set_part()
{
int error_num;
- DBUG_ENTER("spider_mysql_handler::append_direct_update_set_part");
+ DBUG_ENTER("spider_mbase_handler::append_direct_update_set_part");
DBUG_PRINT("info",("spider this=%p", this));
error_num = append_direct_update_set(&update_sql);
where_pos = update_sql.length();
DBUG_RETURN(error_num);
}
-int spider_mysql_handler::append_direct_update_set(
+int spider_mbase_handler::append_direct_update_set(
spider_string *str
) {
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
@@ -6573,7 +8226,7 @@ int spider_mysql_handler::append_direct_update_set(
TABLE *table = spider->get_table();
#endif
#endif
- DBUG_ENTER("spider_mysql_handler::append_direct_update_set");
+ DBUG_ENTER("spider_mbase_handler::append_direct_update_set");
if (
spider->direct_update_kinds == SPIDER_SQL_KIND_SQL &&
spider->direct_update_fields
@@ -6582,7 +8235,7 @@ int spider_mysql_handler::append_direct_update_set(
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_SET_STR, SPIDER_SQL_SET_LEN);
DBUG_RETURN(spider_db_append_update_columns(spider, str, NULL, 0,
- spider_dbton_mysql.dbton_id));
+ dbton_id, FALSE, NULL));
}
if (
@@ -6623,7 +8276,7 @@ int spider_mysql_handler::append_direct_update_set(
table->read_set);
#endif
if (
- spider_db_mysql_utility.
+ spider_db_mbase_utility->
append_column_value(spider, str, top_table_field, NULL,
share->access_charset) ||
str->reserve(SPIDER_SQL_COMMA_LEN)
@@ -6647,57 +8300,57 @@ int spider_mysql_handler::append_direct_update_set(
DBUG_RETURN(0);
}
-int spider_mysql_handler::append_dup_update_pushdown_part(
+int spider_mbase_handler::append_dup_update_pushdown_part(
const char *alias,
uint alias_length
) {
int error_num;
- DBUG_ENTER("spider_mysql_handler::append_dup_update_pushdown_part");
+ DBUG_ENTER("spider_mbase_handler::append_dup_update_pushdown_part");
DBUG_PRINT("info",("spider this=%p", this));
dup_update_sql.length(0);
error_num = append_update_columns(&dup_update_sql, alias, alias_length);
DBUG_RETURN(error_num);
}
-int spider_mysql_handler::append_update_columns_part(
+int spider_mbase_handler::append_update_columns_part(
const char *alias,
uint alias_length
) {
int error_num;
- DBUG_ENTER("spider_mysql_handler::append_update_columns_part");
+ DBUG_ENTER("spider_mbase_handler::append_update_columns_part");
DBUG_PRINT("info",("spider this=%p", this));
error_num = append_update_columns(&update_sql, alias, alias_length);
DBUG_RETURN(error_num);
}
-int spider_mysql_handler::check_update_columns_part()
+int spider_mbase_handler::check_update_columns_part()
{
int error_num;
- DBUG_ENTER("spider_mysql_handler::check_update_columns_part");
+ DBUG_ENTER("spider_mbase_handler::check_update_columns_part");
DBUG_PRINT("info",("spider this=%p", this));
error_num = append_update_columns(NULL, NULL, 0);
DBUG_RETURN(error_num);
}
-int spider_mysql_handler::append_update_columns(
+int spider_mbase_handler::append_update_columns(
spider_string *str,
const char *alias,
uint alias_length
) {
int error_num;
- DBUG_ENTER("spider_mysql_handler::append_update_columns");
+ DBUG_ENTER("spider_mbase_handler::append_update_columns");
error_num = spider_db_append_update_columns(spider, str,
- alias, alias_length, spider_dbton_mysql.dbton_id);
+ alias, alias_length, dbton_id, FALSE, NULL);
DBUG_RETURN(error_num);
}
#endif
-int spider_mysql_handler::append_select_part(
+int spider_mbase_handler::append_select_part(
ulong sql_type
) {
int error_num;
spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_select_part");
+ DBUG_ENTER("spider_mbase_handler::append_select_part");
DBUG_PRINT("info",("spider this=%p", this));
switch (sql_type)
{
@@ -6714,12 +8367,12 @@ int spider_mysql_handler::append_select_part(
DBUG_RETURN(error_num);
}
-int spider_mysql_handler::append_select(
+int spider_mbase_handler::append_select(
spider_string *str,
ulong sql_type
) {
SPIDER_RESULT_LIST *result_list = &spider->result_list;
- DBUG_ENTER("spider_mysql_handler::append_select");
+ DBUG_ENTER("spider_mbase_handler::append_select");
if (sql_type == SPIDER_SQL_TYPE_HANDLER)
{
if (str->reserve(SPIDER_SQL_HANDLER_LEN))
@@ -6738,16 +8391,28 @@ int spider_mysql_handler::append_select(
if (result_list->lock_type != F_WRLCK && spider->lock_mode < 1)
{
/* no lock */
+#ifdef SPIDER_SQL_CACHE_IS_IN_LEX
+ LEX *lex = spider->trx->thd->lex;
+#else
st_select_lex *select_lex = &spider->trx->thd->lex->select_lex;
+#endif
if (
+#ifdef SPIDER_SQL_CACHE_IS_IN_LEX
+ lex->sql_cache == LEX::SQL_CACHE &&
+#else
select_lex->sql_cache == SELECT_LEX::SQL_CACHE &&
+#endif
(spider->share->query_cache_sync & 1)
) {
if (str->reserve(SPIDER_SQL_SQL_CACHE_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_SQL_CACHE_STR, SPIDER_SQL_SQL_CACHE_LEN);
} else if (
+#ifdef SPIDER_SQL_CACHE_IS_IN_LEX
+ lex->sql_cache == LEX::SQL_NO_CACHE &&
+#else
select_lex->sql_cache == SELECT_LEX::SQL_NO_CACHE &&
+#endif
(spider->share->query_cache_sync & 2)
) {
if (str->reserve(SPIDER_SQL_SQL_NO_CACHE_LEN))
@@ -6778,12 +8443,12 @@ int spider_mysql_handler::append_select(
DBUG_RETURN(0);
}
-int spider_mysql_handler::append_table_select_part(
+int spider_mbase_handler::append_table_select_part(
ulong sql_type
) {
int error_num;
spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_table_select_part");
+ DBUG_ENTER("spider_mbase_handler::append_table_select_part");
DBUG_PRINT("info",("spider this=%p", this));
switch (sql_type)
{
@@ -6797,23 +8462,23 @@ int spider_mysql_handler::append_table_select_part(
DBUG_RETURN(error_num);
}
-int spider_mysql_handler::append_table_select(
+int spider_mbase_handler::append_table_select(
spider_string *str
) {
- DBUG_ENTER("spider_mysql_handler::append_table_select");
+ DBUG_ENTER("spider_mbase_handler::append_table_select");
table_name_pos = str->length() + mysql_share->table_select_pos;
if (str->append(*(mysql_share->table_select)))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
DBUG_RETURN(0);
}
-int spider_mysql_handler::append_key_select_part(
+int spider_mbase_handler::append_key_select_part(
ulong sql_type,
uint idx
) {
int error_num;
spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_key_select_part");
+ DBUG_ENTER("spider_mbase_handler::append_key_select_part");
DBUG_PRINT("info",("spider this=%p", this));
switch (sql_type)
{
@@ -6827,23 +8492,23 @@ int spider_mysql_handler::append_key_select_part(
DBUG_RETURN(error_num);
}
-int spider_mysql_handler::append_key_select(
+int spider_mbase_handler::append_key_select(
spider_string *str,
uint idx
) {
- DBUG_ENTER("spider_mysql_handler::append_key_select");
+ DBUG_ENTER("spider_mbase_handler::append_key_select");
table_name_pos = str->length() + mysql_share->key_select_pos[idx];
if (str->append(mysql_share->key_select[idx]))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
DBUG_RETURN(0);
}
-int spider_mysql_handler::append_minimum_select_part(
+int spider_mbase_handler::append_minimum_select_part(
ulong sql_type
) {
int error_num;
spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_minimum_select_part");
+ DBUG_ENTER("spider_mbase_handler::append_minimum_select_part");
DBUG_PRINT("info",("spider this=%p", this));
switch (sql_type)
{
@@ -6857,7 +8522,7 @@ int spider_mysql_handler::append_minimum_select_part(
DBUG_RETURN(error_num);
}
-int spider_mysql_handler::append_minimum_select(
+int spider_mbase_handler::append_minimum_select(
spider_string *str,
ulong sql_type
) {
@@ -6865,7 +8530,7 @@ int spider_mysql_handler::append_minimum_select(
Field **field;
int field_length;
bool appended = FALSE;
- DBUG_ENTER("spider_mysql_handler::append_minimum_select");
+ DBUG_ENTER("spider_mbase_handler::append_minimum_select");
minimum_select_bitmap_create();
for (field = table->field; *field; field++)
{
@@ -6894,7 +8559,7 @@ int spider_mysql_handler::append_minimum_select(
DBUG_RETURN(append_from(str, sql_type, first_link_idx));
}
-int spider_mysql_handler::append_table_select_with_alias(
+int spider_mbase_handler::append_table_select_with_alias(
spider_string *str,
const char *alias,
uint alias_length
@@ -6902,7 +8567,7 @@ int spider_mysql_handler::append_table_select_with_alias(
TABLE *table = spider->get_table();
Field **field;
int field_length;
- DBUG_ENTER("spider_mysql_handler::append_table_select_with_alias");
+ DBUG_ENTER("spider_mbase_handler::append_table_select_with_alias");
for (field = table->field; *field; field++)
{
field_length =
@@ -6918,7 +8583,7 @@ int spider_mysql_handler::append_table_select_with_alias(
DBUG_RETURN(0);
}
-int spider_mysql_handler::append_key_select_with_alias(
+int spider_mbase_handler::append_key_select_with_alias(
spider_string *str,
const KEY *key_info,
const char *alias,
@@ -6928,7 +8593,7 @@ int spider_mysql_handler::append_key_select_with_alias(
Field *field;
uint part_num;
int field_length;
- DBUG_ENTER("spider_mysql_handler::append_key_select_with_alias");
+ DBUG_ENTER("spider_mbase_handler::append_key_select_with_alias");
for (key_part = key_info->key_part, part_num = 0;
part_num < spider_user_defined_key_parts(key_info); key_part++, part_num++)
{
@@ -6945,7 +8610,7 @@ int spider_mysql_handler::append_key_select_with_alias(
DBUG_RETURN(0);
}
-int spider_mysql_handler::append_minimum_select_with_alias(
+int spider_mbase_handler::append_minimum_select_with_alias(
spider_string *str,
const char *alias,
uint alias_length
@@ -6954,7 +8619,7 @@ int spider_mysql_handler::append_minimum_select_with_alias(
Field **field;
int field_length;
bool appended = FALSE;
- DBUG_ENTER("spider_mysql_handler::append_minimum_select_with_alias");
+ DBUG_ENTER("spider_mbase_handler::append_minimum_select_with_alias");
minimum_select_bitmap_create();
for (field = table->field; *field; field++)
{
@@ -6984,14 +8649,14 @@ int spider_mysql_handler::append_minimum_select_with_alias(
DBUG_RETURN(0);
}
-int spider_mysql_handler::append_select_columns_with_alias(
+int spider_mbase_handler::append_select_columns_with_alias(
spider_string *str,
const char *alias,
uint alias_length
) {
int error_num;
SPIDER_RESULT_LIST *result_list = &spider->result_list;
- DBUG_ENTER("spider_mysql_handler::append_select_columns_with_alias");
+ DBUG_ENTER("spider_mbase_handler::append_select_columns_with_alias");
#ifdef HANDLER_HAS_DIRECT_AGGREGATE
if (
result_list->direct_aggregate &&
@@ -7013,12 +8678,12 @@ int spider_mysql_handler::append_select_columns_with_alias(
DBUG_RETURN(append_minimum_select_with_alias(str, alias, alias_length));
}
-int spider_mysql_handler::append_hint_after_table_part(
+int spider_mbase_handler::append_hint_after_table_part(
ulong sql_type
) {
int error_num;
spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_hint_after_table_part");
+ DBUG_ENTER("spider_mbase_handler::append_hint_after_table_part");
DBUG_PRINT("info",("spider this=%p", this));
switch (sql_type)
{
@@ -7042,11 +8707,11 @@ int spider_mysql_handler::append_hint_after_table_part(
DBUG_RETURN(error_num);
}
-int spider_mysql_handler::append_hint_after_table(
+int spider_mbase_handler::append_hint_after_table(
spider_string *str
) {
int error_num;
- DBUG_ENTER("spider_mysql_handler::append_hint_after_table");
+ DBUG_ENTER("spider_mbase_handler::append_hint_after_table");
DBUG_PRINT("info",("spider this=%p", this));
if (
mysql_share->key_hint &&
@@ -7057,10 +8722,10 @@ int spider_mysql_handler::append_hint_after_table(
DBUG_RETURN(0);
}
-void spider_mysql_handler::set_where_pos(
+void spider_mbase_handler::set_where_pos(
ulong sql_type
) {
- DBUG_ENTER("spider_mysql_handler::set_where_pos");
+ DBUG_ENTER("spider_mbase_handler::set_where_pos");
switch (sql_type)
{
case SPIDER_SQL_TYPE_SELECT_SQL:
@@ -7082,10 +8747,10 @@ void spider_mysql_handler::set_where_pos(
DBUG_VOID_RETURN;
}
-void spider_mysql_handler::set_where_to_pos(
+void spider_mbase_handler::set_where_to_pos(
ulong sql_type
) {
- DBUG_ENTER("spider_mysql_handler::set_where_to_pos");
+ DBUG_ENTER("spider_mbase_handler::set_where_to_pos");
switch (sql_type)
{
case SPIDER_SQL_TYPE_SELECT_SQL:
@@ -7107,23 +8772,23 @@ void spider_mysql_handler::set_where_to_pos(
DBUG_VOID_RETURN;
}
-int spider_mysql_handler::check_item_type(
+int spider_mbase_handler::check_item_type(
Item *item
) {
int error_num;
- DBUG_ENTER("spider_mysql_handler::check_item_type");
+ DBUG_ENTER("spider_mbase_handler::check_item_type");
DBUG_PRINT("info",("spider this=%p", this));
- error_num = spider_db_print_item_type(item, spider, NULL, NULL, 0,
- spider_dbton_mysql.dbton_id);
+ error_num = spider_db_print_item_type(item, NULL, spider, NULL, NULL, 0,
+ dbton_id, FALSE, NULL);
DBUG_RETURN(error_num);
}
-int spider_mysql_handler::append_values_connector_part(
+int spider_mbase_handler::append_values_connector_part(
ulong sql_type
) {
int error_num;
spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_values_connector_part");
+ DBUG_ENTER("spider_mbase_handler::append_values_connector_part");
DBUG_PRINT("info",("spider this=%p", this));
switch (sql_type)
{
@@ -7140,10 +8805,10 @@ int spider_mysql_handler::append_values_connector_part(
DBUG_RETURN(error_num);
}
-int spider_mysql_handler::append_values_connector(
+int spider_mbase_handler::append_values_connector(
spider_string *str
) {
- DBUG_ENTER("spider_mysql_handler::append_values_connector");
+ DBUG_ENTER("spider_mbase_handler::append_values_connector");
DBUG_PRINT("info",("spider this=%p", this));
if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN +
SPIDER_SQL_COMMA_LEN + SPIDER_SQL_OPEN_PAREN_LEN))
@@ -7154,12 +8819,12 @@ int spider_mysql_handler::append_values_connector(
DBUG_RETURN(0);
}
-int spider_mysql_handler::append_values_terminator_part(
+int spider_mbase_handler::append_values_terminator_part(
ulong sql_type
) {
int error_num;
spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_values_terminator_part");
+ DBUG_ENTER("spider_mbase_handler::append_values_terminator_part");
DBUG_PRINT("info",("spider this=%p", this));
switch (sql_type)
{
@@ -7176,22 +8841,22 @@ int spider_mysql_handler::append_values_terminator_part(
DBUG_RETURN(error_num);
}
-int spider_mysql_handler::append_values_terminator(
+int spider_mbase_handler::append_values_terminator(
spider_string *str
) {
- DBUG_ENTER("spider_mysql_handler::append_values_terminator");
+ DBUG_ENTER("spider_mbase_handler::append_values_terminator");
DBUG_PRINT("info",("spider this=%p", this));
str->length(str->length() -
SPIDER_SQL_COMMA_LEN - SPIDER_SQL_OPEN_PAREN_LEN);
DBUG_RETURN(0);
}
-int spider_mysql_handler::append_union_table_connector_part(
+int spider_mbase_handler::append_union_table_connector_part(
ulong sql_type
) {
int error_num;
spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_union_table_connector_part");
+ DBUG_ENTER("spider_mbase_handler::append_union_table_connector_part");
DBUG_PRINT("info",("spider this=%p", this));
switch (sql_type)
{
@@ -7208,10 +8873,10 @@ int spider_mysql_handler::append_union_table_connector_part(
DBUG_RETURN(error_num);
}
-int spider_mysql_handler::append_union_table_connector(
+int spider_mbase_handler::append_union_table_connector(
spider_string *str
) {
- DBUG_ENTER("spider_mysql_handler::append_union_table_connector");
+ DBUG_ENTER("spider_mbase_handler::append_union_table_connector");
DBUG_PRINT("info",("spider this=%p", this));
if (str->reserve((SPIDER_SQL_SPACE_LEN * 2) + SPIDER_SQL_UNION_ALL_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
@@ -7221,12 +8886,12 @@ int spider_mysql_handler::append_union_table_connector(
DBUG_RETURN(0);
}
-int spider_mysql_handler::append_union_table_terminator_part(
+int spider_mbase_handler::append_union_table_terminator_part(
ulong sql_type
) {
int error_num;
spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_union_table_terminator_part");
+ DBUG_ENTER("spider_mbase_handler::append_union_table_terminator_part");
DBUG_PRINT("info",("spider this=%p", this));
switch (sql_type)
{
@@ -7240,10 +8905,10 @@ int spider_mysql_handler::append_union_table_terminator_part(
DBUG_RETURN(error_num);
}
-int spider_mysql_handler::append_union_table_terminator(
+int spider_mbase_handler::append_union_table_terminator(
spider_string *str
) {
- DBUG_ENTER("spider_mysql_handler::append_union_table_terminator");
+ DBUG_ENTER("spider_mbase_handler::append_union_table_terminator");
DBUG_PRINT("info",("spider this=%p", this));
str->length(str->length() -
((SPIDER_SQL_SPACE_LEN * 2) + SPIDER_SQL_UNION_ALL_LEN));
@@ -7258,13 +8923,13 @@ int spider_mysql_handler::append_union_table_terminator(
DBUG_RETURN(0);
}
-int spider_mysql_handler::append_key_column_values_part(
+int spider_mbase_handler::append_key_column_values_part(
const key_range *start_key,
ulong sql_type
) {
int error_num;
spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_key_column_values_part");
+ DBUG_ENTER("spider_mbase_handler::append_key_column_values_part");
switch (sql_type)
{
case SPIDER_SQL_TYPE_SELECT_SQL:
@@ -7280,7 +8945,7 @@ int spider_mysql_handler::append_key_column_values_part(
DBUG_RETURN(error_num);
}
-int spider_mysql_handler::append_key_column_values(
+int spider_mbase_handler::append_key_column_values(
spider_string *str,
const key_range *start_key
) {
@@ -7296,7 +8961,7 @@ int spider_mysql_handler::append_key_column_values(
key_part_map start_key_part_map;
KEY_PART_INFO *key_part;
Field *field;
- DBUG_ENTER("spider_mysql_handler::append_key_column_values");
+ DBUG_ENTER("spider_mbase_handler::append_key_column_values");
start_key_part_map = start_key->keypart_map & full_key_part_map;
DBUG_PRINT("info", ("spider spider_user_defined_key_parts=%u",
spider_user_defined_key_parts(key_info)));
@@ -7322,7 +8987,7 @@ int spider_mysql_handler::append_key_column_values(
if (error_num > 0)
DBUG_RETURN(error_num);
} else {
- if (spider_db_mysql_utility.append_column_value(spider, str, field, ptr,
+ if (spider_db_mbase_utility->append_column_value(spider, str, field, ptr,
share->access_charset))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
@@ -7335,13 +9000,13 @@ int spider_mysql_handler::append_key_column_values(
DBUG_RETURN(0);
}
-int spider_mysql_handler::append_key_column_values_with_name_part(
+int spider_mbase_handler::append_key_column_values_with_name_part(
const key_range *start_key,
ulong sql_type
) {
int error_num;
spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_key_column_values_with_name_part");
+ DBUG_ENTER("spider_mbase_handler::append_key_column_values_with_name_part");
switch (sql_type)
{
case SPIDER_SQL_TYPE_SELECT_SQL:
@@ -7357,7 +9022,7 @@ int spider_mysql_handler::append_key_column_values_with_name_part(
DBUG_RETURN(error_num);
}
-int spider_mysql_handler::append_key_column_values_with_name(
+int spider_mbase_handler::append_key_column_values_with_name(
spider_string *str,
const key_range *start_key
) {
@@ -7375,7 +9040,7 @@ int spider_mysql_handler::append_key_column_values_with_name(
KEY_PART_INFO *key_part;
Field *field;
char tmp_buf[MAX_FIELD_WIDTH];
- DBUG_ENTER("spider_mysql_handler::append_key_column_values_with_name");
+ DBUG_ENTER("spider_mbase_handler::append_key_column_values_with_name");
start_key_part_map = start_key->keypart_map & full_key_part_map;
DBUG_PRINT("info", ("spider spider_user_defined_key_parts=%u",
spider_user_defined_key_parts(key_info)));
@@ -7403,7 +9068,7 @@ int spider_mysql_handler::append_key_column_values_with_name(
if (error_num > 0)
DBUG_RETURN(error_num);
} else {
- if (spider_db_mysql_utility.append_column_value(spider, str, field, ptr,
+ if (spider_db_mbase_utility->append_column_value(spider, str, field, ptr,
share->access_charset))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
@@ -7420,7 +9085,7 @@ int spider_mysql_handler::append_key_column_values_with_name(
DBUG_RETURN(0);
}
-int spider_mysql_handler::append_key_where_part(
+int spider_mbase_handler::append_key_where_part(
const key_range *start_key,
const key_range *end_key,
ulong sql_type
@@ -7428,7 +9093,7 @@ int spider_mysql_handler::append_key_where_part(
int error_num;
spider_string *str, *str_part = NULL, *str_part2 = NULL;
bool set_order;
- DBUG_ENTER("spider_mysql_handler::append_key_where_part");
+ DBUG_ENTER("spider_mbase_handler::append_key_where_part");
switch (sql_type)
{
case SPIDER_SQL_TYPE_SELECT_SQL:
@@ -7463,7 +9128,7 @@ int spider_mysql_handler::append_key_where_part(
DBUG_RETURN(error_num);
}
-int spider_mysql_handler::append_key_where(
+int spider_mbase_handler::append_key_where(
spider_string *str,
spider_string *str_part,
spider_string *str_part2,
@@ -7473,14 +9138,14 @@ int spider_mysql_handler::append_key_where(
bool set_order
) {
int error_num;
- DBUG_ENTER("spider_mysql_handler::append_key_where");
+ DBUG_ENTER("spider_mbase_handler::append_key_where");
error_num = spider_db_append_key_where_internal(str, str_part, str_part2,
start_key, end_key, spider, set_order, sql_type,
- spider_dbton_mysql.dbton_id);
+ dbton_id);
DBUG_RETURN(error_num);
}
-int spider_mysql_handler::append_is_null_part(
+int spider_mbase_handler::append_is_null_part(
ulong sql_type,
KEY_PART_INFO *key_part,
const key_range *key,
@@ -7490,7 +9155,7 @@ int spider_mysql_handler::append_is_null_part(
) {
int error_num;
spider_string *str, *str_part = NULL, *str_part2 = NULL;
- DBUG_ENTER("spider_mysql_handler::append_is_null_part");
+ DBUG_ENTER("spider_mbase_handler::append_is_null_part");
DBUG_PRINT("info",("spider this=%p", this));
switch (sql_type)
{
@@ -7517,7 +9182,7 @@ int spider_mysql_handler::append_is_null_part(
DBUG_RETURN(error_num);
}
-int spider_mysql_handler::append_is_null(
+int spider_mbase_handler::append_is_null(
ulong sql_type,
spider_string *str,
spider_string *str_part,
@@ -7528,7 +9193,7 @@ int spider_mysql_handler::append_is_null(
bool key_eq,
bool tgt_final
) {
- DBUG_ENTER("spider_mysql_handler::append_is_null");
+ DBUG_ENTER("spider_mbase_handler::append_is_null");
DBUG_PRINT("info",("spider this=%p", this));
DBUG_PRINT("info",("spider key_eq=%s", key_eq ? "TRUE" : "FALSE"));
if (key_part->null_bit)
@@ -7601,14 +9266,14 @@ int spider_mysql_handler::append_is_null(
DBUG_RETURN(0);
}
-int spider_mysql_handler::append_where_terminator_part(
+int spider_mbase_handler::append_where_terminator_part(
ulong sql_type,
bool set_order,
int key_count
) {
int error_num;
spider_string *str, *str_part = NULL, *str_part2 = NULL;
- DBUG_ENTER("spider_mysql_handler::append_where_terminator_part");
+ DBUG_ENTER("spider_mbase_handler::append_where_terminator_part");
DBUG_PRINT("info",("spider this=%p", this));
switch (sql_type)
{
@@ -7635,7 +9300,7 @@ int spider_mysql_handler::append_where_terminator_part(
DBUG_RETURN(error_num);
}
-int spider_mysql_handler::append_where_terminator(
+int spider_mbase_handler::append_where_terminator(
ulong sql_type,
spider_string *str,
spider_string *str_part,
@@ -7644,7 +9309,7 @@ int spider_mysql_handler::append_where_terminator(
int key_count
) {
SPIDER_RESULT_LIST *result_list = &spider->result_list;
- DBUG_ENTER("spider_mysql_handler::append_where_terminator");
+ DBUG_ENTER("spider_mbase_handler::append_where_terminator");
DBUG_PRINT("info",("spider this=%p", this));
if (sql_type != SPIDER_SQL_TYPE_HANDLER)
{
@@ -7674,12 +9339,12 @@ int spider_mysql_handler::append_where_terminator(
DBUG_RETURN(0);
}
-int spider_mysql_handler::append_match_where_part(
+int spider_mbase_handler::append_match_where_part(
ulong sql_type
) {
int error_num;
spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_match_where_part");
+ DBUG_ENTER("spider_mbase_handler::append_match_where_part");
switch (sql_type)
{
case SPIDER_SQL_TYPE_SELECT_SQL:
@@ -7693,13 +9358,13 @@ int spider_mysql_handler::append_match_where_part(
DBUG_RETURN(error_num);
}
-int spider_mysql_handler::append_match_where(
+int spider_mbase_handler::append_match_where(
spider_string *str
) {
int error_num;
bool first = TRUE;
st_spider_ft_info *ft_info = spider->ft_first;
- DBUG_ENTER("spider_mysql_handler::append_match_where");
+ DBUG_ENTER("spider_mbase_handler::append_match_where");
if (spider->ft_current)
{
while (TRUE)
@@ -7730,29 +9395,74 @@ int spider_mysql_handler::append_match_where(
DBUG_RETURN(0);
}
-int spider_mysql_handler::append_update_where(
+int spider_mbase_handler::append_update_where(
spider_string *str,
const TABLE *table,
my_ptrdiff_t ptr_diff
) {
uint field_name_length;
Field **field;
+ THD *thd = spider->trx->thd;
SPIDER_SHARE *share = spider->share;
- DBUG_ENTER("spider_mysql_handler::append_update_where");
+ bool no_pk = (table->s->primary_key == MAX_KEY);
+ DBUG_ENTER("spider_mbase_handler::append_update_where");
DBUG_PRINT("info", ("spider table->s->primary_key=%s",
table->s->primary_key != MAX_KEY ? "TRUE" : "FALSE"));
+ uint str_len_bakup = str->length();
if (str->reserve(SPIDER_SQL_WHERE_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_WHERE_STR, SPIDER_SQL_WHERE_LEN);
- for (field = table->field; *field; field++)
- {
- DBUG_PRINT("info", ("spider bitmap=%s",
- bitmap_is_set(table->read_set, (*field)->field_index) ?
- "TRUE" : "FALSE"));
- if (
- table->s->primary_key == MAX_KEY ||
- bitmap_is_set(table->read_set, (*field)->field_index)
+
+ if (
+ no_pk ||
+ spider_param_use_cond_other_than_pk_for_update(thd)
+ ) {
+ for (field = table->field; *field; field++)
+ {
+ if (
+ no_pk ||
+ bitmap_is_set(table->read_set, (*field)->field_index)
+ ) {
+ field_name_length =
+ mysql_share->column_name_str[(*field)->field_index].length();
+ if ((*field)->is_null(ptr_diff))
+ {
+ if (str->reserve(field_name_length +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
+ SPIDER_SQL_IS_NULL_LEN + SPIDER_SQL_AND_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ mysql_share->append_column_name(str, (*field)->field_index);
+ str->q_append(SPIDER_SQL_IS_NULL_STR, SPIDER_SQL_IS_NULL_LEN);
+ } else {
+ if (str->reserve(field_name_length +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
+ SPIDER_SQL_EQUAL_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ mysql_share->append_column_name(str, (*field)->field_index);
+ str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
+ (*field)->move_field_offset(ptr_diff);
+ if (
+ spider_db_mbase_utility->
+ append_column_value(spider, str, *field, NULL,
+ share->access_charset) ||
+ str->reserve(SPIDER_SQL_AND_LEN)
+ )
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ (*field)->move_field_offset(-ptr_diff);
+ }
+ str->q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN);
+ }
+ }
+ } else {
+ KEY *key_info = &table->key_info[table->s->primary_key];
+ KEY_PART_INFO *key_part;
+ uint part_num;
+ for (
+ key_part = key_info->key_part, part_num = 0;
+ part_num < spider_user_defined_key_parts(key_info);
+ key_part++, part_num++
) {
+ field = &key_part->field;
field_name_length =
mysql_share->column_name_str[(*field)->field_index].length();
if ((*field)->is_null(ptr_diff))
@@ -7772,7 +9482,7 @@ int spider_mysql_handler::append_update_where(
str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
(*field)->move_field_offset(ptr_diff);
if (
- spider_db_mysql_utility.
+ spider_db_mbase_utility->
append_column_value(spider, str, *field, NULL,
share->access_charset) ||
str->reserve(SPIDER_SQL_AND_LEN)
@@ -7783,14 +9493,20 @@ int spider_mysql_handler::append_update_where(
str->q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN);
}
}
- str->length(str->length() - SPIDER_SQL_AND_LEN);
+ if (str->length() == str_len_bakup + SPIDER_SQL_WHERE_LEN)
+ {
+ /* no condition */
+ str->length(str_len_bakup);
+ } else {
+ str->length(str->length() - SPIDER_SQL_AND_LEN);
+ }
if (str->reserve(SPIDER_SQL_LIMIT1_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_LIMIT1_STR, SPIDER_SQL_LIMIT1_LEN);
DBUG_RETURN(0);
}
-int spider_mysql_handler::append_condition_part(
+int spider_mbase_handler::append_condition_part(
const char *alias,
uint alias_length,
ulong sql_type,
@@ -7799,7 +9515,7 @@ int spider_mysql_handler::append_condition_part(
int error_num;
spider_string *str;
bool start_where = FALSE;
- DBUG_ENTER("spider_mysql_handler::append_condition_part");
+ DBUG_ENTER("spider_mbase_handler::append_condition_part");
switch (sql_type)
{
case SPIDER_SQL_TYPE_SELECT_SQL:
@@ -7873,7 +9589,7 @@ int spider_mysql_handler::append_condition_part(
DBUG_RETURN(error_num);
}
-int spider_mysql_handler::append_condition(
+int spider_mbase_handler::append_condition(
spider_string *str,
const char *alias,
uint alias_length,
@@ -7882,7 +9598,7 @@ int spider_mysql_handler::append_condition(
) {
int error_num, restart_pos = 0, start_where_pos;
SPIDER_CONDITION *tmp_cond = spider->condition;
- DBUG_ENTER("spider_mysql_handler::append_condition");
+ DBUG_ENTER("spider_mbase_handler::append_condition");
if (str && start_where)
{
start_where_pos = str->length();
@@ -7913,8 +9629,8 @@ int spider_mysql_handler::append_condition(
}
}
if ((error_num = spider_db_print_item_type(
- (Item *) tmp_cond->cond, spider, str, alias, alias_length,
- spider_dbton_mysql.dbton_id)))
+ (Item *) tmp_cond->cond, NULL, spider, str, alias, alias_length,
+ dbton_id, FALSE, NULL)))
{
if (str && error_num == ER_SPIDER_COND_SKIP_NUM)
{
@@ -7929,7 +9645,7 @@ int spider_mysql_handler::append_condition(
DBUG_RETURN(0);
}
-int spider_mysql_handler::append_match_against_part(
+int spider_mbase_handler::append_match_against_part(
ulong sql_type,
st_spider_ft_info *ft_info,
const char *alias,
@@ -7937,7 +9653,7 @@ int spider_mysql_handler::append_match_against_part(
) {
int error_num;
spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_match_against_part");
+ DBUG_ENTER("spider_mbase_handler::append_match_against_part");
DBUG_PRINT("info",("spider this=%p", this));
switch (sql_type)
{
@@ -7951,7 +9667,7 @@ int spider_mysql_handler::append_match_against_part(
DBUG_RETURN(error_num);
}
-int spider_mysql_handler::append_match_against(
+int spider_mbase_handler::append_match_against(
spider_string *str,
st_spider_ft_info *ft_info,
const char *alias,
@@ -7965,7 +9681,7 @@ int spider_mysql_handler::append_match_against(
int key_count;
KEY_PART_INFO *key_part;
Field *field;
- DBUG_ENTER("spider_mysql_handler::append_match_against");
+ DBUG_ENTER("spider_mbase_handler::append_match_against");
DBUG_PRINT("info",("spider this=%p", this));
if (str->reserve(SPIDER_SQL_MATCH_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
@@ -8014,7 +9730,7 @@ int spider_mysql_handler::append_match_against(
tmp_str.append(ft_init_key->ptr(), ft_init_key->length(),
ft_init_key->charset()) ||
str->reserve(tmp_str.length() * 2) ||
- spider_db_mysql_utility.append_escaped_util(str, tmp_str.get_str())
+ spider_db_mbase_utility->append_escaped_util(str, tmp_str.get_str())
)
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->mem_calc();
@@ -8037,14 +9753,14 @@ int spider_mysql_handler::append_match_against(
DBUG_RETURN(0);
}
-int spider_mysql_handler::append_match_select_part(
+int spider_mbase_handler::append_match_select_part(
ulong sql_type,
const char *alias,
uint alias_length
) {
int error_num;
spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_match_select_part");
+ DBUG_ENTER("spider_mbase_handler::append_match_select_part");
DBUG_PRINT("info",("spider this=%p", this));
switch (sql_type)
{
@@ -8058,13 +9774,13 @@ int spider_mysql_handler::append_match_select_part(
DBUG_RETURN(error_num);
}
-int spider_mysql_handler::append_match_select(
+int spider_mbase_handler::append_match_select(
spider_string *str,
const char *alias,
uint alias_length
) {
int error_num;
- DBUG_ENTER("spider_mysql_handler::append_match_select");
+ DBUG_ENTER("spider_mbase_handler::append_match_select");
DBUG_PRINT("info",("spider this=%p", this));
if (spider->ft_current)
{
@@ -8086,14 +9802,14 @@ int spider_mysql_handler::append_match_select(
}
#ifdef HANDLER_HAS_DIRECT_AGGREGATE
-int spider_mysql_handler::append_sum_select_part(
+int spider_mbase_handler::append_sum_select_part(
ulong sql_type,
const char *alias,
uint alias_length
) {
int error_num;
spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_sum_select_part");
+ DBUG_ENTER("spider_mbase_handler::append_sum_select_part");
DBUG_PRINT("info",("spider this=%p", this));
switch (sql_type)
{
@@ -8107,22 +9823,22 @@ int spider_mysql_handler::append_sum_select_part(
DBUG_RETURN(error_num);
}
-int spider_mysql_handler::append_sum_select(
+int spider_mbase_handler::append_sum_select(
spider_string *str,
const char *alias,
uint alias_length
) {
int error_num;
st_select_lex *select_lex;
- DBUG_ENTER("spider_mysql_handler::append_sum_select");
+ DBUG_ENTER("spider_mbase_handler::append_sum_select");
DBUG_PRINT("info",("spider this=%p", this));
select_lex = spider_get_select_lex(spider);
JOIN *join = select_lex->join;
Item_sum **item_sum_ptr;
for (item_sum_ptr = join->sum_funcs; *item_sum_ptr; ++item_sum_ptr)
{
- if ((error_num = spider_db_mysql_utility.open_item_sum_func(*item_sum_ptr,
- spider, str, alias, alias_length)))
+ if ((error_num = spider_db_mbase_utility->open_item_sum_func(*item_sum_ptr,
+ spider, str, alias, alias_length, FALSE, NULL)))
{
DBUG_RETURN(error_num);
}
@@ -8134,10 +9850,10 @@ int spider_mysql_handler::append_sum_select(
}
#endif
-void spider_mysql_handler::set_order_pos(
+void spider_mbase_handler::set_order_pos(
ulong sql_type
) {
- DBUG_ENTER("spider_mysql_handler::set_order_pos");
+ DBUG_ENTER("spider_mbase_handler::set_order_pos");
switch (sql_type)
{
case SPIDER_SQL_TYPE_SELECT_SQL:
@@ -8160,10 +9876,10 @@ void spider_mysql_handler::set_order_pos(
DBUG_VOID_RETURN;
}
-void spider_mysql_handler::set_order_to_pos(
+void spider_mbase_handler::set_order_to_pos(
ulong sql_type
) {
- DBUG_ENTER("spider_mysql_handler::set_order_to_pos");
+ DBUG_ENTER("spider_mbase_handler::set_order_to_pos");
switch (sql_type)
{
case SPIDER_SQL_TYPE_SELECT_SQL:
@@ -8187,14 +9903,14 @@ void spider_mysql_handler::set_order_to_pos(
}
#ifdef HANDLER_HAS_DIRECT_AGGREGATE
-int spider_mysql_handler::append_group_by_part(
+int spider_mbase_handler::append_group_by_part(
const char *alias,
uint alias_length,
ulong sql_type
) {
int error_num;
spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_group_by_part");
+ DBUG_ENTER("spider_mbase_handler::append_group_by_part");
DBUG_PRINT("info",("spider this=%p", this));
switch (sql_type)
{
@@ -8218,14 +9934,14 @@ int spider_mysql_handler::append_group_by_part(
DBUG_RETURN(error_num);
}
-int spider_mysql_handler::append_group_by(
+int spider_mbase_handler::append_group_by(
spider_string *str,
const char *alias,
uint alias_length
) {
int error_num;
st_select_lex *select_lex;
- DBUG_ENTER("spider_mysql_handler::append_group_by");
+ DBUG_ENTER("spider_mbase_handler::append_group_by");
DBUG_PRINT("info",("spider this=%p", this));
select_lex = spider_get_select_lex(spider);
ORDER *group = (ORDER *) select_lex->group_list.first;
@@ -8236,8 +9952,8 @@ int spider_mysql_handler::append_group_by(
str->q_append(SPIDER_SQL_GROUP_STR, SPIDER_SQL_GROUP_LEN);
for (; group; group = group->next)
{
- if ((error_num = spider_db_print_item_type((*group->item), spider, str,
- alias, alias_length, spider_dbton_mysql.dbton_id)))
+ if ((error_num = spider_db_print_item_type((*group->item), NULL, spider,
+ str, alias, alias_length, dbton_id, FALSE, NULL)))
{
DBUG_RETURN(error_num);
}
@@ -8251,14 +9967,14 @@ int spider_mysql_handler::append_group_by(
}
#endif
-int spider_mysql_handler::append_key_order_for_merge_with_alias_part(
+int spider_mbase_handler::append_key_order_for_merge_with_alias_part(
const char *alias,
uint alias_length,
ulong sql_type
) {
int error_num;
spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_key_order_for_merge_with_alias_part");
+ DBUG_ENTER("spider_mbase_handler::append_key_order_for_merge_with_alias_part");
DBUG_PRINT("info",("spider this=%p", this));
switch (sql_type)
{
@@ -8283,7 +9999,7 @@ int spider_mysql_handler::append_key_order_for_merge_with_alias_part(
DBUG_RETURN(error_num);
}
-int spider_mysql_handler::append_key_order_for_merge_with_alias(
+int spider_mbase_handler::append_key_order_for_merge_with_alias(
spider_string *str,
const char *alias,
uint alias_length
@@ -8293,7 +10009,7 @@ int spider_mysql_handler::append_key_order_for_merge_with_alias(
int length;
Field *field;
uint key_name_length;
- DBUG_ENTER("spider_mysql_handler::append_key_order_for_merge_with_alias");
+ DBUG_ENTER("spider_mbase_handler::append_key_order_for_merge_with_alias");
DBUG_PRINT("info",("spider this=%p", this));
#ifdef HANDLER_HAS_DIRECT_AGGREGATE
if (spider->result_list.direct_aggregate)
@@ -8367,14 +10083,14 @@ int spider_mysql_handler::append_key_order_for_merge_with_alias(
DBUG_RETURN(0);
}
-int spider_mysql_handler::append_key_order_for_direct_order_limit_with_alias_part(
+int spider_mbase_handler::append_key_order_for_direct_order_limit_with_alias_part(
const char *alias,
uint alias_length,
ulong sql_type
) {
int error_num;
spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_key_order_for_direct_order_limit_with_alias_part");
+ DBUG_ENTER("spider_mbase_handler::append_key_order_for_direct_order_limit_with_alias_part");
DBUG_PRINT("info",("spider this=%p", this));
switch (sql_type)
{
@@ -8399,7 +10115,7 @@ int spider_mysql_handler::append_key_order_for_direct_order_limit_with_alias_par
DBUG_RETURN(error_num);
}
-int spider_mysql_handler::append_key_order_for_direct_order_limit_with_alias(
+int spider_mbase_handler::append_key_order_for_direct_order_limit_with_alias(
spider_string *str,
const char *alias,
uint alias_length
@@ -8409,7 +10125,7 @@ int spider_mysql_handler::append_key_order_for_direct_order_limit_with_alias(
st_select_lex *select_lex;
longlong select_limit;
longlong offset_limit;
- DBUG_ENTER("spider_mysql_handler::append_key_order_for_direct_order_limit_with_alias");
+ DBUG_ENTER("spider_mbase_handler::append_key_order_for_direct_order_limit_with_alias");
DBUG_PRINT("info",("spider this=%p", this));
#ifdef HANDLER_HAS_DIRECT_AGGREGATE
if (spider->result_list.direct_aggregate)
@@ -8429,13 +10145,13 @@ int spider_mysql_handler::append_key_order_for_direct_order_limit_with_alias(
order = order->next)
{
if ((error_num =
- spider_db_print_item_type((*order->item), spider, str, alias,
- alias_length, spider_dbton_mysql.dbton_id)))
+ spider_db_print_item_type((*order->item), NULL, spider, str, alias,
+ alias_length, dbton_id, FALSE, NULL)))
{
DBUG_PRINT("info",("spider error=%d", error_num));
DBUG_RETURN(error_num);
}
- if (order->direction == ORDER::ORDER_ASC)
+ if (SPIDER_order_direction_is_asc(order))
{
if (str->reserve(SPIDER_SQL_COMMA_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
@@ -8453,14 +10169,14 @@ int spider_mysql_handler::append_key_order_for_direct_order_limit_with_alias(
DBUG_RETURN(0);
}
-int spider_mysql_handler::append_key_order_with_alias_part(
+int spider_mbase_handler::append_key_order_with_alias_part(
const char *alias,
uint alias_length,
ulong sql_type
) {
int error_num;
spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_key_order_with_alias_part");
+ DBUG_ENTER("spider_mbase_handler::append_key_order_with_alias_part");
DBUG_PRINT("info",("spider this=%p", this));
switch (sql_type)
{
@@ -8485,12 +10201,12 @@ int spider_mysql_handler::append_key_order_with_alias_part(
DBUG_RETURN(error_num);
}
-int spider_mysql_handler::append_key_order_for_handler(
+int spider_mbase_handler::append_key_order_for_handler(
spider_string *str,
const char *alias,
uint alias_length
) {
- DBUG_ENTER("spider_mysql_handler::append_key_order_for_handler");
+ DBUG_ENTER("spider_mbase_handler::append_key_order_for_handler");
DBUG_PRINT("info",("spider this=%p", this));
DBUG_PRINT("info",("spider ha_next_pos=%d", ha_next_pos));
DBUG_PRINT("info",("spider ha_where_pos=%d", ha_where_pos));
@@ -8500,7 +10216,7 @@ int spider_mysql_handler::append_key_order_for_handler(
DBUG_RETURN(0);
}
-int spider_mysql_handler::append_key_order_with_alias(
+int spider_mbase_handler::append_key_order_with_alias(
spider_string *str,
const char *alias,
uint alias_length
@@ -8511,7 +10227,7 @@ int spider_mysql_handler::append_key_order_with_alias(
KEY_PART_INFO *key_part;
Field *field;
uint key_name_length;
- DBUG_ENTER("spider_mysql_handler::append_key_order_with_alias");
+ DBUG_ENTER("spider_mbase_handler::append_key_order_with_alias");
DBUG_PRINT("info",("spider this=%p", this));
#ifdef HANDLER_HAS_DIRECT_AGGREGATE
if (spider->result_list.direct_aggregate)
@@ -8666,14 +10382,14 @@ int spider_mysql_handler::append_key_order_with_alias(
DBUG_RETURN(0);
}
-int spider_mysql_handler::append_limit_part(
+int spider_mbase_handler::append_limit_part(
longlong offset,
longlong limit,
ulong sql_type
) {
int error_num;
spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_limit_part");
+ DBUG_ENTER("spider_mbase_handler::append_limit_part");
DBUG_PRINT("info",("spider this=%p", this));
switch (sql_type)
{
@@ -8703,14 +10419,14 @@ int spider_mysql_handler::append_limit_part(
DBUG_RETURN(error_num);
}
-int spider_mysql_handler::reappend_limit_part(
+int spider_mbase_handler::reappend_limit_part(
longlong offset,
longlong limit,
ulong sql_type
) {
int error_num;
spider_string *str;
- DBUG_ENTER("spider_mysql_handler::reappend_limit_part");
+ DBUG_ENTER("spider_mbase_handler::reappend_limit_part");
DBUG_PRINT("info",("spider this=%p", this));
switch (sql_type)
{
@@ -8740,14 +10456,14 @@ int spider_mysql_handler::reappend_limit_part(
DBUG_RETURN(error_num);
}
-int spider_mysql_handler::append_limit(
+int spider_mbase_handler::append_limit(
spider_string *str,
longlong offset,
longlong limit
) {
char buf[SPIDER_LONGLONG_LEN + 1];
uint32 length;
- DBUG_ENTER("spider_mysql_handler::append_limit");
+ DBUG_ENTER("spider_mbase_handler::append_limit");
DBUG_PRINT("info",("spider this=%p", this));
DBUG_PRINT("info", ("spider offset=%lld", offset));
DBUG_PRINT("info", ("spider limit=%lld", limit));
@@ -8771,12 +10487,12 @@ int spider_mysql_handler::append_limit(
DBUG_RETURN(0);
}
-int spider_mysql_handler::append_select_lock_part(
+int spider_mbase_handler::append_select_lock_part(
ulong sql_type
) {
int error_num;
spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_select_lock_part");
+ DBUG_ENTER("spider_mbase_handler::append_select_lock_part");
DBUG_PRINT("info",("spider this=%p", this));
switch (sql_type)
{
@@ -8790,11 +10506,11 @@ int spider_mysql_handler::append_select_lock_part(
DBUG_RETURN(error_num);
}
-int spider_mysql_handler::append_select_lock(
+int spider_mbase_handler::append_select_lock(
spider_string *str
) {
int lock_mode = spider_conn_lock_mode(spider);
- DBUG_ENTER("spider_mysql_handler::append_select_lock");
+ DBUG_ENTER("spider_mbase_handler::append_select_lock");
DBUG_PRINT("info",("spider this=%p", this));
if (lock_mode == SPIDER_LOCK_MODE_EXCLUSIVE)
{
@@ -8810,12 +10526,12 @@ int spider_mysql_handler::append_select_lock(
DBUG_RETURN(0);
}
-int spider_mysql_handler::append_union_all_start_part(
+int spider_mbase_handler::append_union_all_start_part(
ulong sql_type
) {
int error_num;
spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_union_all_start_part");
+ DBUG_ENTER("spider_mbase_handler::append_union_all_start_part");
DBUG_PRINT("info",("spider this=%p", this));
switch (sql_type)
{
@@ -8829,10 +10545,10 @@ int spider_mysql_handler::append_union_all_start_part(
DBUG_RETURN(error_num);
}
-int spider_mysql_handler::append_union_all_start(
+int spider_mbase_handler::append_union_all_start(
spider_string *str
) {
- DBUG_ENTER("spider_mysql_handler::append_union_all_start");
+ DBUG_ENTER("spider_mbase_handler::append_union_all_start");
DBUG_PRINT("info",("spider this=%p", this));
if (str->reserve(SPIDER_SQL_OPEN_PAREN_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
@@ -8840,12 +10556,12 @@ int spider_mysql_handler::append_union_all_start(
DBUG_RETURN(0);
}
-int spider_mysql_handler::append_union_all_part(
+int spider_mbase_handler::append_union_all_part(
ulong sql_type
) {
int error_num;
spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_union_all_part");
+ DBUG_ENTER("spider_mbase_handler::append_union_all_part");
DBUG_PRINT("info",("spider this=%p", this));
switch (sql_type)
{
@@ -8859,10 +10575,10 @@ int spider_mysql_handler::append_union_all_part(
DBUG_RETURN(error_num);
}
-int spider_mysql_handler::append_union_all(
+int spider_mbase_handler::append_union_all(
spider_string *str
) {
- DBUG_ENTER("spider_mysql_handler::append_union_all");
+ DBUG_ENTER("spider_mbase_handler::append_union_all");
DBUG_PRINT("info",("spider this=%p", this));
if (str->reserve(SPIDER_SQL_UNION_ALL_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
@@ -8870,12 +10586,12 @@ int spider_mysql_handler::append_union_all(
DBUG_RETURN(0);
}
-int spider_mysql_handler::append_union_all_end_part(
+int spider_mbase_handler::append_union_all_end_part(
ulong sql_type
) {
int error_num;
spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_union_all_end_part");
+ DBUG_ENTER("spider_mbase_handler::append_union_all_end_part");
DBUG_PRINT("info",("spider this=%p", this));
switch (sql_type)
{
@@ -8889,24 +10605,24 @@ int spider_mysql_handler::append_union_all_end_part(
DBUG_RETURN(error_num);
}
-int spider_mysql_handler::append_union_all_end(
+int spider_mbase_handler::append_union_all_end(
spider_string *str
) {
- DBUG_ENTER("spider_mysql_handler::append_union_all_end");
+ DBUG_ENTER("spider_mbase_handler::append_union_all_end");
DBUG_PRINT("info",("spider this=%p", this));
str->length(str->length() -
SPIDER_SQL_UNION_ALL_LEN + SPIDER_SQL_CLOSE_PAREN_LEN);
DBUG_RETURN(0);
}
-int spider_mysql_handler::append_multi_range_cnt_part(
+int spider_mbase_handler::append_multi_range_cnt_part(
ulong sql_type,
uint multi_range_cnt,
bool with_comma
) {
int error_num;
spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_multi_range_cnt_part");
+ DBUG_ENTER("spider_mbase_handler::append_multi_range_cnt_part");
DBUG_PRINT("info",("spider this=%p", this));
switch (sql_type)
{
@@ -8923,14 +10639,14 @@ int spider_mysql_handler::append_multi_range_cnt_part(
DBUG_RETURN(error_num);
}
-int spider_mysql_handler::append_multi_range_cnt(
+int spider_mbase_handler::append_multi_range_cnt(
spider_string *str,
uint multi_range_cnt,
bool with_comma
) {
int range_cnt_length;
char range_cnt_str[SPIDER_SQL_INT_LEN];
- DBUG_ENTER("spider_mysql_handler::append_multi_range_cnt");
+ DBUG_ENTER("spider_mbase_handler::append_multi_range_cnt");
DBUG_PRINT("info",("spider this=%p", this));
range_cnt_length = my_sprintf(range_cnt_str, (range_cnt_str, "%u",
multi_range_cnt));
@@ -8948,13 +10664,13 @@ int spider_mysql_handler::append_multi_range_cnt(
DBUG_RETURN(0);
}
-int spider_mysql_handler::append_multi_range_cnt_with_name_part(
+int spider_mbase_handler::append_multi_range_cnt_with_name_part(
ulong sql_type,
uint multi_range_cnt
) {
int error_num;
spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_multi_range_cnt_with_name_part");
+ DBUG_ENTER("spider_mbase_handler::append_multi_range_cnt_with_name_part");
DBUG_PRINT("info",("spider this=%p", this));
switch (sql_type)
{
@@ -8971,13 +10687,13 @@ int spider_mysql_handler::append_multi_range_cnt_with_name_part(
DBUG_RETURN(error_num);
}
-int spider_mysql_handler::append_multi_range_cnt_with_name(
+int spider_mbase_handler::append_multi_range_cnt_with_name(
spider_string *str,
uint multi_range_cnt
) {
int range_cnt_length;
char range_cnt_str[SPIDER_SQL_INT_LEN];
- DBUG_ENTER("spider_mysql_handler::append_multi_range_cnt_with_name");
+ DBUG_ENTER("spider_mbase_handler::append_multi_range_cnt_with_name");
DBUG_PRINT("info",("spider this=%p", this));
range_cnt_length = my_sprintf(range_cnt_str, (range_cnt_str, "%u",
multi_range_cnt));
@@ -8991,7 +10707,7 @@ int spider_mysql_handler::append_multi_range_cnt_with_name(
DBUG_RETURN(0);
}
-int spider_mysql_handler::append_open_handler_part(
+int spider_mbase_handler::append_open_handler_part(
ulong sql_type,
uint handler_id,
SPIDER_CONN *conn,
@@ -8999,7 +10715,7 @@ int spider_mysql_handler::append_open_handler_part(
) {
int error_num;
spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_open_handler_part");
+ DBUG_ENTER("spider_mbase_handler::append_open_handler_part");
DBUG_PRINT("info",("spider this=%p", this));
switch (sql_type)
{
@@ -9014,14 +10730,14 @@ int spider_mysql_handler::append_open_handler_part(
DBUG_RETURN(error_num);
}
-int spider_mysql_handler::append_open_handler(
+int spider_mbase_handler::append_open_handler(
spider_string *str,
uint handler_id,
SPIDER_CONN *conn,
int link_idx
) {
int error_num;
- DBUG_ENTER("spider_mysql_handler::append_open_handler");
+ DBUG_ENTER("spider_mbase_handler::append_open_handler");
DBUG_PRINT("info",("spider this=%p", this));
DBUG_PRINT("info",("spider link_idx=%d", link_idx));
DBUG_PRINT("info",("spider m_handler_cid=%s",
@@ -9045,13 +10761,13 @@ int spider_mysql_handler::append_open_handler(
DBUG_RETURN(0);
}
-int spider_mysql_handler::append_close_handler_part(
+int spider_mbase_handler::append_close_handler_part(
ulong sql_type,
int link_idx
) {
int error_num;
spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_close_handler_part");
+ DBUG_ENTER("spider_mbase_handler::append_close_handler_part");
DBUG_PRINT("info",("spider this=%p", this));
switch (sql_type)
{
@@ -9066,11 +10782,11 @@ int spider_mysql_handler::append_close_handler_part(
DBUG_RETURN(error_num);
}
-int spider_mysql_handler::append_close_handler(
+int spider_mbase_handler::append_close_handler(
spider_string *str,
int link_idx
) {
- DBUG_ENTER("spider_mysql_handler::append_close_handler");
+ DBUG_ENTER("spider_mbase_handler::append_close_handler");
DBUG_PRINT("info",("spider this=%p", this));
if (str->reserve(SPIDER_SQL_HANDLER_LEN + SPIDER_SQL_CLOSE_LEN +
SPIDER_SQL_HANDLER_CID_LEN))
@@ -9082,12 +10798,12 @@ int spider_mysql_handler::append_close_handler(
DBUG_RETURN(0);
}
-int spider_mysql_handler::append_insert_terminator_part(
+int spider_mbase_handler::append_insert_terminator_part(
ulong sql_type
) {
int error_num;
spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_insert_terminator_part");
+ DBUG_ENTER("spider_mbase_handler::append_insert_terminator_part");
DBUG_PRINT("info",("spider this=%p", this));
switch (sql_type)
{
@@ -9101,10 +10817,10 @@ int spider_mysql_handler::append_insert_terminator_part(
DBUG_RETURN(error_num);
}
-int spider_mysql_handler::append_insert_terminator(
+int spider_mbase_handler::append_insert_terminator(
spider_string *str
) {
- DBUG_ENTER("spider_mysql_handler::append_insert_terminator");
+ DBUG_ENTER("spider_mbase_handler::append_insert_terminator");
DBUG_PRINT("info",("spider this=%p", this));
DBUG_PRINT("info",("spider dup_update_sql.length=%u", dup_update_sql.length()));
if (
@@ -9129,12 +10845,12 @@ int spider_mysql_handler::append_insert_terminator(
DBUG_RETURN(0);
}
-int spider_mysql_handler::append_insert_values_part(
+int spider_mbase_handler::append_insert_values_part(
ulong sql_type
) {
int error_num;
spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_insert_values_part");
+ DBUG_ENTER("spider_mbase_handler::append_insert_values_part");
DBUG_PRINT("info",("spider this=%p", this));
switch (sql_type)
{
@@ -9148,14 +10864,14 @@ int spider_mysql_handler::append_insert_values_part(
DBUG_RETURN(error_num);
}
-int spider_mysql_handler::append_insert_values(
+int spider_mbase_handler::append_insert_values(
spider_string *str
) {
SPIDER_SHARE *share = spider->share;
TABLE *table = spider->get_table();
Field **field;
bool add_value = FALSE;
- DBUG_ENTER("spider_mysql_handler::append_insert_values");
+ DBUG_ENTER("spider_mbase_handler::append_insert_values");
DBUG_PRINT("info",("spider this=%p", this));
if (str->reserve(SPIDER_SQL_OPEN_PAREN_LEN))
{
@@ -9202,7 +10918,7 @@ int spider_mysql_handler::append_insert_values(
str->q_append(SPIDER_SQL_NULL_STR, SPIDER_SQL_NULL_LEN);
} else {
if (
- spider_db_mysql_utility.
+ spider_db_mbase_utility->
append_column_value(spider, str, *field, NULL,
share->access_charset) ||
str->reserve(SPIDER_SQL_COMMA_LEN)
@@ -9232,12 +10948,12 @@ int spider_mysql_handler::append_insert_values(
DBUG_RETURN(0);
}
-int spider_mysql_handler::append_into_part(
+int spider_mbase_handler::append_into_part(
ulong sql_type
) {
int error_num;
spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_into_part");
+ DBUG_ENTER("spider_mbase_handler::append_into_part");
DBUG_PRINT("info",("spider this=%p", this));
switch (sql_type)
{
@@ -9251,13 +10967,13 @@ int spider_mysql_handler::append_into_part(
DBUG_RETURN(error_num);
}
-int spider_mysql_handler::append_into(
+int spider_mbase_handler::append_into(
spider_string *str
) {
const TABLE *table = spider->get_table();
Field **field;
uint field_name_length = 0;
- DBUG_ENTER("spider_mysql_handler::append_into");
+ DBUG_ENTER("spider_mbase_handler::append_into");
DBUG_PRINT("info",("spider this=%p", this));
if (str->reserve(SPIDER_SQL_INTO_LEN + mysql_share->db_nm_max_length +
SPIDER_SQL_DOT_LEN + mysql_share->table_nm_max_length +
@@ -9293,10 +11009,10 @@ int spider_mysql_handler::append_into(
DBUG_RETURN(0);
}
-void spider_mysql_handler::set_insert_to_pos(
+void spider_mbase_handler::set_insert_to_pos(
ulong sql_type
) {
- DBUG_ENTER("spider_mysql_handler::set_insert_to_pos");
+ DBUG_ENTER("spider_mbase_handler::set_insert_to_pos");
switch (sql_type)
{
case SPIDER_SQL_TYPE_INSERT_SQL:
@@ -9309,13 +11025,13 @@ void spider_mysql_handler::set_insert_to_pos(
DBUG_VOID_RETURN;
}
-int spider_mysql_handler::append_from_part(
+int spider_mbase_handler::append_from_part(
ulong sql_type,
int link_idx
) {
int error_num;
spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_from_part");
+ DBUG_ENTER("spider_mbase_handler::append_from_part");
DBUG_PRINT("info",("spider this=%p", this));
switch (sql_type)
{
@@ -9335,14 +11051,15 @@ int spider_mysql_handler::append_from_part(
DBUG_RETURN(error_num);
}
-int spider_mysql_handler::append_from(
+int spider_mbase_handler::append_from(
spider_string *str,
ulong sql_type,
int link_idx
) {
- DBUG_ENTER("spider_mysql_handler::append_from");
+ DBUG_ENTER("spider_mbase_handler::append_from");
DBUG_PRINT("info",("spider this=%p", this));
DBUG_PRINT("info",("spider link_idx=%d", link_idx));
+ int error_num = 0;
if (sql_type == SPIDER_SQL_TYPE_HANDLER)
{
ha_table_name_pos = str->length();
@@ -9362,18 +11079,25 @@ int spider_mysql_handler::append_from(
str->q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN);
table_name_pos = str->length();
append_table_name_with_adjusting(str, link_idx, sql_type);
+ if(spider_param_index_hint_pushdown(spider->trx->thd))
+ {
+ if((error_num = append_index_hint(str, link_idx, sql_type)))
+ {
+ DBUG_RETURN(error_num);
+ }
+ }
}
DBUG_RETURN(0);
}
-int spider_mysql_handler::append_flush_tables_part(
+int spider_mbase_handler::append_flush_tables_part(
ulong sql_type,
int link_idx,
bool lock
) {
int error_num;
spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_flush_tables_part");
+ DBUG_ENTER("spider_mbase_handler::append_flush_tables_part");
DBUG_PRINT("info",("spider this=%p", this));
switch (sql_type)
{
@@ -9387,12 +11111,12 @@ int spider_mysql_handler::append_flush_tables_part(
DBUG_RETURN(error_num);
}
-int spider_mysql_handler::append_flush_tables(
+int spider_mbase_handler::append_flush_tables(
spider_string *str,
int link_idx,
bool lock
) {
- DBUG_ENTER("spider_mysql_handler::append_flush_tables");
+ DBUG_ENTER("spider_mbase_handler::append_flush_tables");
DBUG_PRINT("info",("spider this=%p", this));
if (lock)
{
@@ -9410,13 +11134,13 @@ int spider_mysql_handler::append_flush_tables(
DBUG_RETURN(0);
}
-int spider_mysql_handler::append_optimize_table_part(
+int spider_mbase_handler::append_optimize_table_part(
ulong sql_type,
int link_idx
) {
int error_num;
spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_optimize_table_part");
+ DBUG_ENTER("spider_mbase_handler::append_optimize_table_part");
DBUG_PRINT("info",("spider this=%p", this));
switch (sql_type)
{
@@ -9430,7 +11154,7 @@ int spider_mysql_handler::append_optimize_table_part(
DBUG_RETURN(error_num);
}
-int spider_mysql_handler::append_optimize_table(
+int spider_mbase_handler::append_optimize_table(
spider_string *str,
int link_idx
) {
@@ -9438,7 +11162,7 @@ int spider_mysql_handler::append_optimize_table(
int conn_link_idx = spider->conn_link_idx[link_idx];
int local_length = spider_param_internal_optimize_local(spider->trx->thd,
share->internal_optimize_local) * SPIDER_SQL_SQL_LOCAL_LEN;
- DBUG_ENTER("spider_mysql_handler::append_optimize_table");
+ DBUG_ENTER("spider_mbase_handler::append_optimize_table");
DBUG_PRINT("info",("spider this=%p", this));
if (str->reserve(SPIDER_SQL_SQL_OPTIMIZE_LEN + SPIDER_SQL_SQL_TABLE_LEN +
local_length +
@@ -9455,13 +11179,13 @@ int spider_mysql_handler::append_optimize_table(
DBUG_RETURN(0);
}
-int spider_mysql_handler::append_analyze_table_part(
+int spider_mbase_handler::append_analyze_table_part(
ulong sql_type,
int link_idx
) {
int error_num;
spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_analyze_table_part");
+ DBUG_ENTER("spider_mbase_handler::append_analyze_table_part");
DBUG_PRINT("info",("spider this=%p", this));
switch (sql_type)
{
@@ -9475,7 +11199,7 @@ int spider_mysql_handler::append_analyze_table_part(
DBUG_RETURN(error_num);
}
-int spider_mysql_handler::append_analyze_table(
+int spider_mbase_handler::append_analyze_table(
spider_string *str,
int link_idx
) {
@@ -9483,7 +11207,7 @@ int spider_mysql_handler::append_analyze_table(
int conn_link_idx = spider->conn_link_idx[link_idx];
int local_length = spider_param_internal_optimize_local(spider->trx->thd,
share->internal_optimize_local) * SPIDER_SQL_SQL_LOCAL_LEN;
- DBUG_ENTER("spider_mysql_handler::append_analyze_table");
+ DBUG_ENTER("spider_mbase_handler::append_analyze_table");
DBUG_PRINT("info",("spider this=%p", this));
if (str->reserve(SPIDER_SQL_SQL_ANALYZE_LEN + SPIDER_SQL_SQL_TABLE_LEN +
local_length +
@@ -9500,14 +11224,14 @@ int spider_mysql_handler::append_analyze_table(
DBUG_RETURN(0);
}
-int spider_mysql_handler::append_repair_table_part(
+int spider_mbase_handler::append_repair_table_part(
ulong sql_type,
int link_idx,
HA_CHECK_OPT* check_opt
) {
int error_num;
spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_repair_table_part");
+ DBUG_ENTER("spider_mbase_handler::append_repair_table_part");
DBUG_PRINT("info",("spider this=%p", this));
switch (sql_type)
{
@@ -9521,7 +11245,7 @@ int spider_mysql_handler::append_repair_table_part(
DBUG_RETURN(error_num);
}
-int spider_mysql_handler::append_repair_table(
+int spider_mbase_handler::append_repair_table(
spider_string *str,
int link_idx,
HA_CHECK_OPT* check_opt
@@ -9530,7 +11254,7 @@ int spider_mysql_handler::append_repair_table(
int conn_link_idx = spider->conn_link_idx[link_idx];
int local_length = spider_param_internal_optimize_local(spider->trx->thd,
share->internal_optimize_local) * SPIDER_SQL_SQL_LOCAL_LEN;
- DBUG_ENTER("spider_mysql_handler::append_repair_table");
+ DBUG_ENTER("spider_mbase_handler::append_repair_table");
DBUG_PRINT("info",("spider this=%p", this));
if (str->reserve(SPIDER_SQL_SQL_REPAIR_LEN + SPIDER_SQL_SQL_TABLE_LEN +
local_length +
@@ -9565,14 +11289,14 @@ int spider_mysql_handler::append_repair_table(
DBUG_RETURN(0);
}
-int spider_mysql_handler::append_check_table_part(
+int spider_mbase_handler::append_check_table_part(
ulong sql_type,
int link_idx,
HA_CHECK_OPT* check_opt
) {
int error_num;
spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_check_table_part");
+ DBUG_ENTER("spider_mbase_handler::append_check_table_part");
DBUG_PRINT("info",("spider this=%p", this));
switch (sql_type)
{
@@ -9586,13 +11310,13 @@ int spider_mysql_handler::append_check_table_part(
DBUG_RETURN(error_num);
}
-int spider_mysql_handler::append_check_table(
+int spider_mbase_handler::append_check_table(
spider_string *str,
int link_idx,
HA_CHECK_OPT* check_opt
) {
int conn_link_idx = spider->conn_link_idx[link_idx];
- DBUG_ENTER("spider_mysql_handler::append_check_table");
+ DBUG_ENTER("spider_mbase_handler::append_check_table");
DBUG_PRINT("info",("spider this=%p", this));
if (str->reserve(SPIDER_SQL_SQL_CHECK_TABLE_LEN +
mysql_share->db_names_str[conn_link_idx].length() +
@@ -9630,13 +11354,13 @@ int spider_mysql_handler::append_check_table(
DBUG_RETURN(0);
}
-int spider_mysql_handler::append_enable_keys_part(
+int spider_mbase_handler::append_enable_keys_part(
ulong sql_type,
int link_idx
) {
int error_num;
spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_enable_keys_part");
+ DBUG_ENTER("spider_mbase_handler::append_enable_keys_part");
DBUG_PRINT("info",("spider this=%p", this));
switch (sql_type)
{
@@ -9650,12 +11374,12 @@ int spider_mysql_handler::append_enable_keys_part(
DBUG_RETURN(error_num);
}
-int spider_mysql_handler::append_enable_keys(
+int spider_mbase_handler::append_enable_keys(
spider_string *str,
int link_idx
) {
int conn_link_idx = spider->conn_link_idx[link_idx];
- DBUG_ENTER("spider_mysql_handler::append_enable_keys");
+ DBUG_ENTER("spider_mbase_handler::append_enable_keys");
DBUG_PRINT("info",("spider this=%p", this));
if (str->reserve(SPIDER_SQL_SQL_ALTER_TABLE_LEN +
mysql_share->db_names_str[conn_link_idx].length() +
@@ -9671,13 +11395,13 @@ int spider_mysql_handler::append_enable_keys(
DBUG_RETURN(0);
}
-int spider_mysql_handler::append_disable_keys_part(
+int spider_mbase_handler::append_disable_keys_part(
ulong sql_type,
int link_idx
) {
int error_num;
spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_disable_keys_part");
+ DBUG_ENTER("spider_mbase_handler::append_disable_keys_part");
DBUG_PRINT("info",("spider this=%p", this));
switch (sql_type)
{
@@ -9691,12 +11415,12 @@ int spider_mysql_handler::append_disable_keys_part(
DBUG_RETURN(error_num);
}
-int spider_mysql_handler::append_disable_keys(
+int spider_mbase_handler::append_disable_keys(
spider_string *str,
int link_idx
) {
int conn_link_idx = spider->conn_link_idx[link_idx];
- DBUG_ENTER("spider_mysql_handler::append_disable_keys");
+ DBUG_ENTER("spider_mbase_handler::append_disable_keys");
DBUG_PRINT("info",("spider this=%p", this));
if (str->reserve(SPIDER_SQL_SQL_ALTER_TABLE_LEN +
mysql_share->db_names_str[conn_link_idx].length() +
@@ -9712,12 +11436,12 @@ int spider_mysql_handler::append_disable_keys(
DBUG_RETURN(0);
}
-int spider_mysql_handler::append_delete_all_rows_part(
+int spider_mbase_handler::append_delete_all_rows_part(
ulong sql_type
) {
int error_num;
spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_delete_all_rows_part");
+ DBUG_ENTER("spider_mbase_handler::append_delete_all_rows_part");
DBUG_PRINT("info",("spider this=%p", this));
switch (sql_type)
{
@@ -9731,12 +11455,12 @@ int spider_mysql_handler::append_delete_all_rows_part(
DBUG_RETURN(error_num);
}
-int spider_mysql_handler::append_delete_all_rows(
+int spider_mbase_handler::append_delete_all_rows(
spider_string *str,
ulong sql_type
) {
int error_num;
- DBUG_ENTER("spider_mysql_handler::append_delete_all_rows");
+ DBUG_ENTER("spider_mbase_handler::append_delete_all_rows");
DBUG_PRINT("info",("spider this=%p", this));
if (spider->sql_command == SQLCOM_TRUNCATE)
{
@@ -9752,12 +11476,12 @@ int spider_mysql_handler::append_delete_all_rows(
DBUG_RETURN(0);
}
-int spider_mysql_handler::append_truncate(
+int spider_mbase_handler::append_truncate(
spider_string *str,
ulong sql_type,
int link_idx
) {
- DBUG_ENTER("spider_mysql_handler::append_truncate");
+ DBUG_ENTER("spider_mbase_handler::append_truncate");
if (str->reserve(SPIDER_SQL_TRUNCATE_TABLE_LEN +
mysql_share->db_nm_max_length +
SPIDER_SQL_DOT_LEN + mysql_share->table_nm_max_length +
@@ -9769,7 +11493,7 @@ int spider_mysql_handler::append_truncate(
DBUG_RETURN(0);
}
-int spider_mysql_handler::append_explain_select_part(
+int spider_mbase_handler::append_explain_select_part(
key_range *start_key,
key_range *end_key,
ulong sql_type,
@@ -9777,7 +11501,7 @@ int spider_mysql_handler::append_explain_select_part(
) {
int error_num;
spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_explain_select_part");
+ DBUG_ENTER("spider_mbase_handler::append_explain_select_part");
DBUG_PRINT("info",("spider this=%p", this));
switch (sql_type)
{
@@ -9792,7 +11516,7 @@ int spider_mysql_handler::append_explain_select_part(
DBUG_RETURN(error_num);
}
-int spider_mysql_handler::append_explain_select(
+int spider_mbase_handler::append_explain_select(
spider_string *str,
key_range *start_key,
key_range *end_key,
@@ -9800,7 +11524,7 @@ int spider_mysql_handler::append_explain_select(
int link_idx
) {
int error_num;
- DBUG_ENTER("spider_mysql_handler::append_explain_select");
+ DBUG_ENTER("spider_mbase_handler::append_explain_select");
DBUG_PRINT("info",("spider this=%p", this));
if (str->reserve(SPIDER_SQL_EXPLAIN_SELECT_LEN))
{
@@ -9829,57 +11553,58 @@ int spider_mysql_handler::append_explain_select(
* solely of the specified column.
* FALSE - otherwise.
********************************************************************/
-bool spider_mysql_handler::is_sole_projection_field( uint16 field_index )
-{
- // Determine whether the projection list consists solely of the field of interest
- bool is_field_in_projection_list = FALSE;
- TABLE* table = spider->get_table();
- uint16 projection_field_count = 0;
- uint16 projection_field_index;
- Field** field;
- DBUG_ENTER( "spider_mysql_handler::is_sole_projection_field" );
+bool spider_mbase_handler::is_sole_projection_field(
+ uint16 field_index
+) {
+ // Determine whether the projection list consists solely of the field of interest
+ bool is_field_in_projection_list = FALSE;
+ TABLE* table = spider->get_table();
+ uint16 projection_field_count = 0;
+ uint16 projection_field_index;
+ Field** field;
+ DBUG_ENTER( "spider_mbase_handler::is_sole_projection_field" );
- for ( field = table->field; *field ; field++ )
- {
- projection_field_index = ( *field )->field_index;
+ for ( field = table->field; *field ; field++ )
+ {
+ projection_field_index = ( *field )->field_index;
- if ( !( minimum_select_bit_is_set( projection_field_index ) ) )
- {
- // Current field is not in the projection list
- continue;
- }
+ if ( !( minimum_select_bit_is_set( projection_field_index ) ) )
+ {
+ // Current field is not in the projection list
+ continue;
+ }
- projection_field_count++;
+ projection_field_count++;
- if ( !is_field_in_projection_list )
- {
- if ( field_index == projection_field_index )
- {
- // Field of interest is in the projection list
- is_field_in_projection_list = TRUE;
- }
- }
-
- if ( is_field_in_projection_list && ( projection_field_count != 1 ) )
- {
- // Field of interest is not the sole column in the projection list
- DBUG_RETURN( FALSE );
- }
+ if ( !is_field_in_projection_list )
+ {
+ if ( field_index == projection_field_index )
+ {
+ // Field of interest is in the projection list
+ is_field_in_projection_list = TRUE;
+ }
}
- if ( is_field_in_projection_list && ( projection_field_count == 1 ) )
+ if ( is_field_in_projection_list && ( projection_field_count != 1 ) )
{
- // Field of interest is the only column in the projection list
- DBUG_RETURN( TRUE );
+ // Field of interest is not the sole column in the projection list
+ DBUG_RETURN( FALSE );
}
+ }
+
+ if ( is_field_in_projection_list && ( projection_field_count == 1 ) )
+ {
+ // Field of interest is the only column in the projection list
+ DBUG_RETURN( TRUE );
+ }
- DBUG_RETURN( FALSE );
+ DBUG_RETURN( FALSE );
}
-bool spider_mysql_handler::is_bulk_insert_exec_period(
+bool spider_mbase_handler::is_bulk_insert_exec_period(
bool bulk_end
) {
- DBUG_ENTER("spider_mysql_handler::is_bulk_insert_exec_period");
+ DBUG_ENTER("spider_mbase_handler::is_bulk_insert_exec_period");
DBUG_PRINT("info",("spider this=%p", this));
DBUG_PRINT("info",("spider insert_sql.length=%u", insert_sql.length()));
DBUG_PRINT("info",("spider insert_pos=%d", insert_pos));
@@ -9893,19 +11618,19 @@ bool spider_mysql_handler::is_bulk_insert_exec_period(
DBUG_RETURN(FALSE);
}
-bool spider_mysql_handler::sql_is_filled_up(
+bool spider_mbase_handler::sql_is_filled_up(
ulong sql_type
) {
- DBUG_ENTER("spider_mysql_handler::sql_is_filled_up");
+ DBUG_ENTER("spider_mbase_handler::sql_is_filled_up");
DBUG_PRINT("info",("spider this=%p", this));
DBUG_RETURN(filled_up);
}
-bool spider_mysql_handler::sql_is_empty(
+bool spider_mbase_handler::sql_is_empty(
ulong sql_type
) {
bool is_empty;
- DBUG_ENTER("spider_mysql_handler::sql_is_empty");
+ DBUG_ENTER("spider_mbase_handler::sql_is_empty");
DBUG_PRINT("info",("spider this=%p", this));
switch (sql_type)
{
@@ -9933,34 +11658,34 @@ bool spider_mysql_handler::sql_is_empty(
DBUG_RETURN(is_empty);
}
-bool spider_mysql_handler::support_multi_split_read()
+bool spider_mbase_handler::support_multi_split_read()
{
- DBUG_ENTER("spider_mysql_handler::support_multi_split_read");
+ DBUG_ENTER("spider_mbase_handler::support_multi_split_read");
DBUG_PRINT("info",("spider this=%p", this));
DBUG_RETURN(TRUE);
}
-bool spider_mysql_handler::support_bulk_update()
+bool spider_mbase_handler::support_bulk_update()
{
- DBUG_ENTER("spider_mysql_handler::support_bulk_update");
+ DBUG_ENTER("spider_mbase_handler::support_bulk_update");
DBUG_PRINT("info",("spider this=%p", this));
DBUG_RETURN(TRUE);
}
-int spider_mysql_handler::bulk_tmp_table_insert()
+int spider_mbase_handler::bulk_tmp_table_insert()
{
int error_num;
- DBUG_ENTER("spider_mysql_handler::bulk_tmp_table_insert");
+ DBUG_ENTER("spider_mbase_handler::bulk_tmp_table_insert");
DBUG_PRINT("info",("spider this=%p", this));
error_num = store_sql_to_bulk_tmp_table(&update_sql, upd_tmp_tbl);
DBUG_RETURN(error_num);
}
-int spider_mysql_handler::bulk_tmp_table_insert(
+int spider_mbase_handler::bulk_tmp_table_insert(
int link_idx
) {
int error_num;
- DBUG_ENTER("spider_mysql_handler::bulk_tmp_table_insert");
+ DBUG_ENTER("spider_mbase_handler::bulk_tmp_table_insert");
DBUG_PRINT("info",("spider this=%p", this));
error_num = store_sql_to_bulk_tmp_table(
&spider->result_list.update_sqls[link_idx],
@@ -9968,10 +11693,10 @@ int spider_mysql_handler::bulk_tmp_table_insert(
DBUG_RETURN(error_num);
}
-int spider_mysql_handler::bulk_tmp_table_end_bulk_insert()
+int spider_mbase_handler::bulk_tmp_table_end_bulk_insert()
{
int error_num;
- DBUG_ENTER("spider_mysql_handler::bulk_tmp_table_end_bulk_insert");
+ DBUG_ENTER("spider_mbase_handler::bulk_tmp_table_end_bulk_insert");
DBUG_PRINT("info",("spider this=%p", this));
if ((error_num = upd_tmp_tbl->file->ha_end_bulk_insert()))
{
@@ -9980,10 +11705,10 @@ int spider_mysql_handler::bulk_tmp_table_end_bulk_insert()
DBUG_RETURN(0);
}
-int spider_mysql_handler::bulk_tmp_table_rnd_init()
+int spider_mbase_handler::bulk_tmp_table_rnd_init()
{
int error_num;
- DBUG_ENTER("spider_mysql_handler::bulk_tmp_table_rnd_init");
+ DBUG_ENTER("spider_mbase_handler::bulk_tmp_table_rnd_init");
DBUG_PRINT("info",("spider this=%p", this));
upd_tmp_tbl->file->extra(HA_EXTRA_CACHE);
if ((error_num = upd_tmp_tbl->file->ha_rnd_init(TRUE)))
@@ -9994,10 +11719,10 @@ int spider_mysql_handler::bulk_tmp_table_rnd_init()
DBUG_RETURN(0);
}
-int spider_mysql_handler::bulk_tmp_table_rnd_next()
+int spider_mbase_handler::bulk_tmp_table_rnd_next()
{
int error_num;
- DBUG_ENTER("spider_mysql_handler::bulk_tmp_table_rnd_next");
+ DBUG_ENTER("spider_mbase_handler::bulk_tmp_table_rnd_next");
DBUG_PRINT("info",("spider this=%p", this));
#if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 50200
error_num = upd_tmp_tbl->file->ha_rnd_next(upd_tmp_tbl->record[0]);
@@ -10011,10 +11736,10 @@ int spider_mysql_handler::bulk_tmp_table_rnd_next()
DBUG_RETURN(error_num);
}
-int spider_mysql_handler::bulk_tmp_table_rnd_end()
+int spider_mbase_handler::bulk_tmp_table_rnd_end()
{
int error_num;
- DBUG_ENTER("spider_mysql_handler::bulk_tmp_table_rnd_end");
+ DBUG_ENTER("spider_mbase_handler::bulk_tmp_table_rnd_end");
DBUG_PRINT("info",("spider this=%p", this));
reading_from_bulk_tmp_table = FALSE;
if ((error_num = upd_tmp_tbl->file->ha_rnd_end()))
@@ -10024,33 +11749,39 @@ int spider_mysql_handler::bulk_tmp_table_rnd_end()
DBUG_RETURN(0);
}
-bool spider_mysql_handler::need_copy_for_update(
+bool spider_mbase_handler::need_copy_for_update(
int link_idx
) {
int all_link_idx = spider->conn_link_idx[link_idx];
- DBUG_ENTER("spider_mysql_handler::need_copy_for_update");
+ DBUG_ENTER("spider_mbase_handler::need_copy_for_update");
DBUG_PRINT("info",("spider this=%p", this));
DBUG_RETURN(!mysql_share->same_db_table_name ||
spider->share->link_statuses[all_link_idx] == SPIDER_LINK_STATUS_RECOVERY);
}
-bool spider_mysql_handler::bulk_tmp_table_created()
+bool spider_mbase_handler::bulk_tmp_table_created()
{
- DBUG_ENTER("spider_mysql_handler::bulk_tmp_table_created");
+ DBUG_ENTER("spider_mbase_handler::bulk_tmp_table_created");
DBUG_PRINT("info",("spider this=%p", this));
DBUG_RETURN(upd_tmp_tbl);
}
-int spider_mysql_handler::mk_bulk_tmp_table_and_bulk_start()
+int spider_mbase_handler::mk_bulk_tmp_table_and_bulk_start()
{
THD *thd = spider->trx->thd;
TABLE *table = spider->get_table();
- DBUG_ENTER("spider_mysql_handler::mk_bulk_tmp_table_and_bulk_start");
+ DBUG_ENTER("spider_mbase_handler::mk_bulk_tmp_table_and_bulk_start");
DBUG_PRINT("info",("spider this=%p", this));
if (!upd_tmp_tbl)
{
+#ifdef SPIDER_use_LEX_CSTRING_for_Field_blob_constructor
+ LEX_CSTRING field_name = {STRING_WITH_LEN("a")};
+ if (!(upd_tmp_tbl = spider_mk_sys_tmp_table(
+ thd, table, &upd_tmp_tbl_prm, &field_name, update_sql.charset())))
+#else
if (!(upd_tmp_tbl = spider_mk_sys_tmp_table(
thd, table, &upd_tmp_tbl_prm, "a", update_sql.charset())))
+#endif
{
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
@@ -10060,9 +11791,9 @@ int spider_mysql_handler::mk_bulk_tmp_table_and_bulk_start()
DBUG_RETURN(0);
}
-void spider_mysql_handler::rm_bulk_tmp_table()
+void spider_mbase_handler::rm_bulk_tmp_table()
{
- DBUG_ENTER("spider_mysql_handler::rm_bulk_tmp_table");
+ DBUG_ENTER("spider_mbase_handler::rm_bulk_tmp_table");
DBUG_PRINT("info",("spider this=%p", this));
if (upd_tmp_tbl)
{
@@ -10072,12 +11803,12 @@ void spider_mysql_handler::rm_bulk_tmp_table()
DBUG_VOID_RETURN;
}
-int spider_mysql_handler::store_sql_to_bulk_tmp_table(
+int spider_mbase_handler::store_sql_to_bulk_tmp_table(
spider_string *str,
TABLE *tmp_table
) {
int error_num;
- DBUG_ENTER("spider_mysql_handler::store_sql_to_bulk_tmp_table");
+ DBUG_ENTER("spider_mbase_handler::store_sql_to_bulk_tmp_table");
DBUG_PRINT("info",("spider this=%p", this));
tmp_table->field[0]->set_notnull();
tmp_table->field[0]->store(str->ptr(), str->length(), str->charset());
@@ -10086,24 +11817,24 @@ int spider_mysql_handler::store_sql_to_bulk_tmp_table(
DBUG_RETURN(0);
}
-int spider_mysql_handler::restore_sql_from_bulk_tmp_table(
+int spider_mbase_handler::restore_sql_from_bulk_tmp_table(
spider_string *str,
TABLE *tmp_table
) {
- DBUG_ENTER("spider_mysql_handler::restore_sql_from_bulk_tmp_table");
+ DBUG_ENTER("spider_mbase_handler::restore_sql_from_bulk_tmp_table");
DBUG_PRINT("info",("spider this=%p", this));
tmp_table->field[0]->val_str(str->get_str());
str->mem_calc();
DBUG_RETURN(0);
}
-int spider_mysql_handler::insert_lock_tables_list(
+int spider_mbase_handler::insert_lock_tables_list(
SPIDER_CONN *conn,
int link_idx
) {
- spider_db_mysql *db_conn = (spider_db_mysql *) conn->db_conn;
+ spider_db_mbase *db_conn = (spider_db_mbase *) conn->db_conn;
SPIDER_LINK_FOR_HASH *tmp_link_for_hash2 = &link_for_hash[link_idx];
- DBUG_ENTER("spider_mysql_handler::insert_lock_tables_list");
+ DBUG_ENTER("spider_mbase_handler::insert_lock_tables_list");
DBUG_PRINT("info",("spider this=%p", this));
uint old_elements =
db_conn->lock_table_hash.array.max_element;
@@ -10129,7 +11860,7 @@ int spider_mysql_handler::insert_lock_tables_list(
DBUG_RETURN(0);
}
-int spider_mysql_handler::append_lock_tables_list(
+int spider_mbase_handler::append_lock_tables_list(
SPIDER_CONN *conn,
int link_idx,
int *appended
@@ -10137,8 +11868,8 @@ int spider_mysql_handler::append_lock_tables_list(
int error_num;
SPIDER_LINK_FOR_HASH *tmp_link_for_hash, *tmp_link_for_hash2;
int conn_link_idx = spider->conn_link_idx[link_idx];
- spider_db_mysql *db_conn = (spider_db_mysql *) conn->db_conn;
- DBUG_ENTER("spider_mysql_handler::append_lock_tables_list");
+ spider_db_mbase *db_conn = (spider_db_mbase *) conn->db_conn;
+ DBUG_ENTER("spider_mbase_handler::append_lock_tables_list");
DBUG_PRINT("info",("spider this=%p", this));
tmp_link_for_hash2 = &link_for_hash[link_idx];
tmp_link_for_hash2->db_table_str =
@@ -10200,14 +11931,14 @@ int spider_mysql_handler::append_lock_tables_list(
DBUG_RETURN(0);
}
-int spider_mysql_handler::realloc_sql(
+int spider_mbase_handler::realloc_sql(
ulong *realloced
) {
THD *thd = spider->trx->thd;
st_spider_share *share = spider->share;
int init_sql_alloc_size =
spider_param_init_sql_alloc_size(thd, share->init_sql_alloc_size);
- DBUG_ENTER("spider_mysql_handler::realloc_sql");
+ DBUG_ENTER("spider_mbase_handler::realloc_sql");
DBUG_PRINT("info",("spider this=%p", this));
if ((int) sql.alloced_length() > init_sql_alloc_size * 2)
{
@@ -10254,10 +11985,10 @@ int spider_mysql_handler::realloc_sql(
DBUG_RETURN(0);
}
-int spider_mysql_handler::reset_sql(
+int spider_mbase_handler::reset_sql(
ulong sql_type
) {
- DBUG_ENTER("spider_mysql_handler::reset_sql");
+ DBUG_ENTER("spider_mbase_handler::reset_sql");
DBUG_PRINT("info",("spider this=%p", this));
if (sql_type & SPIDER_SQL_TYPE_SELECT_SQL)
{
@@ -10284,62 +12015,82 @@ int spider_mysql_handler::reset_sql(
}
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
-int spider_mysql_handler::reset_keys(
+int spider_mbase_handler::reset_keys(
ulong sql_type
) {
- DBUG_ENTER("spider_mysql_handler::reset_keys");
+ DBUG_ENTER("spider_mbase_handler::reset_keys");
DBUG_PRINT("info",("spider this=%p", this));
DBUG_ASSERT(0);
DBUG_RETURN(0);
}
-int spider_mysql_handler::reset_upds(
+int spider_mbase_handler::reset_upds(
ulong sql_type
) {
- DBUG_ENTER("spider_mysql_handler::reset_upds");
+ DBUG_ENTER("spider_mbase_handler::reset_upds");
DBUG_PRINT("info",("spider this=%p", this));
hs_upds.clear();
DBUG_RETURN(0);
}
-int spider_mysql_handler::reset_strs(
+int spider_mbase_handler::reset_strs(
ulong sql_type
) {
- DBUG_ENTER("spider_mysql_handler::reset_strs");
+ DBUG_ENTER("spider_mbase_handler::reset_strs");
DBUG_PRINT("info",("spider this=%p", this));
DBUG_ASSERT(0);
DBUG_RETURN(0);
}
-int spider_mysql_handler::reset_strs_pos(
+int spider_mbase_handler::reset_strs_pos(
ulong sql_type
) {
- DBUG_ENTER("spider_mysql_handler::reset_strs_pos");
+ DBUG_ENTER("spider_mbase_handler::reset_strs_pos");
DBUG_PRINT("info",("spider this=%p", this));
DBUG_ASSERT(0);
DBUG_RETURN(0);
}
-int spider_mysql_handler::push_back_upds(
+int spider_mbase_handler::push_back_upds(
SPIDER_HS_STRING_REF &info
) {
int error_num;
- DBUG_ENTER("spider_mysql_handler::push_back_upds");
+ DBUG_ENTER("spider_mbase_handler::push_back_upds");
DBUG_PRINT("info",("spider this=%p", this));
error_num = hs_upds.push_back(info);
DBUG_RETURN(error_num);
}
#endif
-bool spider_mysql_handler::need_lock_before_set_sql_for_exec(
+bool spider_mbase_handler::need_lock_before_set_sql_for_exec(
ulong sql_type
) {
- DBUG_ENTER("spider_mysql_handler::need_lock_before_set_sql_for_exec");
+ DBUG_ENTER("spider_mbase_handler::need_lock_before_set_sql_for_exec");
DBUG_PRINT("info",("spider this=%p", this));
DBUG_RETURN(FALSE);
}
-int spider_mysql_handler::set_sql_for_exec(
+#ifdef SPIDER_HAS_GROUP_BY_HANDLER
+int spider_mbase_handler::set_sql_for_exec(
+ ulong sql_type,
+ int link_idx,
+ SPIDER_LINK_IDX_CHAIN *link_idx_chain
+) {
+ int error_num;
+ DBUG_ENTER("spider_mbase_handler::set_sql_for_exec");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (sql_type & SPIDER_SQL_TYPE_SELECT_SQL)
+ {
+ if ((error_num = spider_db_mbase_utility->reappend_tables(
+ spider->fields, link_idx_chain, &sql)))
+ DBUG_RETURN(error_num);
+ exec_sql = &sql;
+ }
+ DBUG_RETURN(0);
+}
+#endif
+
+int spider_mbase_handler::set_sql_for_exec(
ulong sql_type,
int link_idx
) {
@@ -10348,7 +12099,7 @@ int spider_mysql_handler::set_sql_for_exec(
SPIDER_SHARE *share = spider->share;
SPIDER_RESULT_LIST *result_list = &spider->result_list;
int all_link_idx = spider->conn_link_idx[link_idx];
- DBUG_ENTER("spider_mysql_handler::set_sql_for_exec");
+ DBUG_ENTER("spider_mbase_handler::set_sql_for_exec");
DBUG_PRINT("info",("spider this=%p", this));
if (sql_type & (SPIDER_SQL_TYPE_SELECT_SQL | SPIDER_SQL_TYPE_TMP_SQL))
{
@@ -10399,7 +12150,7 @@ int spider_mysql_handler::set_sql_for_exec(
exec_sql->length(table_name_pos);
if (result_list->tmp_table_join && spider->bka_mode != 2)
{
- if ((error_num = spider_db_mysql_utility.append_from_with_alias(
+ if ((error_num = spider_db_mbase_utility->append_from_with_alias(
exec_sql, table_names, table_name_lengths,
table_aliases, table_alias_lengths, 2,
&table_name_pos, TRUE))
@@ -10521,12 +12272,12 @@ int spider_mysql_handler::set_sql_for_exec(
DBUG_RETURN(0);
}
-int spider_mysql_handler::set_sql_for_exec(
+int spider_mbase_handler::set_sql_for_exec(
spider_db_copy_table *tgt_ct,
ulong sql_type
) {
- spider_mysql_copy_table *mysql_ct = (spider_mysql_copy_table *) tgt_ct;
- DBUG_ENTER("spider_mysql_handler::set_sql_for_exec");
+ spider_mbase_copy_table *mysql_ct = (spider_mbase_copy_table *) tgt_ct;
+ DBUG_ENTER("spider_mbase_handler::set_sql_for_exec");
DBUG_PRINT("info",("spider this=%p", this));
switch (sql_type)
{
@@ -10540,7 +12291,7 @@ int spider_mysql_handler::set_sql_for_exec(
DBUG_RETURN(0);
}
-int spider_mysql_handler::execute_sql(
+int spider_mbase_handler::execute_sql(
ulong sql_type,
SPIDER_CONN *conn,
int quick_mode,
@@ -10548,7 +12299,7 @@ int spider_mysql_handler::execute_sql(
) {
spider_string *tgt_sql;
uint tgt_length;
- DBUG_ENTER("spider_mysql_handler::execute_sql");
+ DBUG_ENTER("spider_mbase_handler::execute_sql");
DBUG_PRINT("info",("spider this=%p", this));
switch (sql_type)
{
@@ -10602,23 +12353,23 @@ int spider_mysql_handler::execute_sql(
));
}
-int spider_mysql_handler::reset()
+int spider_mbase_handler::reset()
{
- DBUG_ENTER("spider_mysql_handler::reset");
+ DBUG_ENTER("spider_mbase_handler::reset");
DBUG_PRINT("info",("spider this=%p", this));
update_sql.length(0);
DBUG_RETURN(0);
}
-int spider_mysql_handler::sts_mode_exchange(
+int spider_mbase_handler::sts_mode_exchange(
int sts_mode
) {
- DBUG_ENTER("spider_mysql_handler::sts_mode_exchange");
+ DBUG_ENTER("spider_mbase_handler::sts_mode_exchange");
DBUG_PRINT("info",("spider sts_mode=%d", sts_mode));
DBUG_RETURN(sts_mode);
}
-int spider_mysql_handler::show_table_status(
+int spider_mbase_handler::show_table_status(
int link_idx,
int sts_mode,
uint flag
@@ -10629,7 +12380,7 @@ int spider_mysql_handler::show_table_status(
SPIDER_SHARE *share = spider->share;
uint pos = (2 * spider->conn_link_idx[link_idx]);
ulonglong auto_increment_value = 0;
- DBUG_ENTER("spider_mysql_handler::show_table_status");
+ DBUG_ENTER("spider_mbase_handler::show_table_status");
DBUG_PRINT("info",("spider sts_mode=%d", sts_mode));
if (sts_mode == 1)
@@ -10743,8 +12494,7 @@ int spider_mysql_handler::show_table_status(
}
else if ((error_num = spider_db_errorno(conn)))
DBUG_RETURN(error_num);
- else
- {
+ else {
my_printf_error(ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM,
ER_SPIDER_REMOTE_TABLE_NOT_FOUND_STR, MYF(0),
mysql_share->db_names_str[spider->conn_link_idx[link_idx]].ptr(),
@@ -10963,19 +12713,18 @@ int spider_mysql_handler::show_table_status(
DBUG_PRINT("info",("spider auto_increment_value=%llu",
share->lgtm_tblhnd_share->auto_increment_value));
}
-
DBUG_RETURN(0);
}
-int spider_mysql_handler::crd_mode_exchange(
+int spider_mbase_handler::crd_mode_exchange(
int crd_mode
) {
- DBUG_ENTER("spider_mysql_handler::crd_mode_exchange");
+ DBUG_ENTER("spider_mbase_handler::crd_mode_exchange");
DBUG_PRINT("info",("spider crd_mode=%d", crd_mode));
DBUG_RETURN(crd_mode);
}
-int spider_mysql_handler::show_index(
+int spider_mbase_handler::show_index(
int link_idx,
int crd_mode
) {
@@ -10987,7 +12736,7 @@ int spider_mysql_handler::show_index(
int roop_count;
longlong *tmp_cardinality;
uint pos = (2 * spider->conn_link_idx[link_idx]);
- DBUG_ENTER("spider_mysql_handler::show_index");
+ DBUG_ENTER("spider_mbase_handler::show_index");
DBUG_PRINT("info",("spider crd_mode=%d", crd_mode));
if (crd_mode == 1)
{
@@ -11290,7 +13039,7 @@ int spider_mysql_handler::show_index(
DBUG_RETURN(0);
}
-int spider_mysql_handler::show_records(
+int spider_mbase_handler::show_records(
int link_idx
) {
int error_num;
@@ -11298,7 +13047,7 @@ int spider_mysql_handler::show_records(
SPIDER_DB_RESULT *res;
SPIDER_SHARE *share = spider->share;
uint pos = spider->conn_link_idx[link_idx];
- DBUG_ENTER("spider_mysql_handler::show_records");
+ DBUG_ENTER("spider_mbase_handler::show_records");
pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
pthread_mutex_lock(&conn->mta_conn_mutex);
SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
@@ -11425,17 +13174,17 @@ int spider_mysql_handler::show_records(
DBUG_RETURN(0);
}
-int spider_mysql_handler::show_last_insert_id(
+int spider_mbase_handler::show_last_insert_id(
int link_idx,
ulonglong &last_insert_id
) {
SPIDER_CONN *conn = spider->conns[link_idx];
- DBUG_ENTER("spider_mysql_handler::show_last_insert_id");
+ DBUG_ENTER("spider_mbase_handler::show_last_insert_id");
last_insert_id = conn->db_conn->last_insert_id();
DBUG_RETURN(0);
}
-ha_rows spider_mysql_handler::explain_select(
+ha_rows spider_mbase_handler::explain_select(
key_range *start_key,
key_range *end_key,
int link_idx
@@ -11447,7 +13196,7 @@ ha_rows spider_mysql_handler::explain_select(
SPIDER_DB_RESULT *res;
ha_rows rows;
spider_db_handler *dbton_hdl = spider->dbton_handler[conn->dbton_id];
- DBUG_ENTER("spider_mysql_handler::explain_select");
+ DBUG_ENTER("spider_mbase_handler::explain_select");
if ((error_num = dbton_hdl->append_explain_select_part(
start_key, end_key, SPIDER_SQL_TYPE_OTHER_SQL, link_idx)))
{
@@ -11588,13 +13337,13 @@ ha_rows spider_mysql_handler::explain_select(
DBUG_RETURN(rows);
}
-int spider_mysql_handler::lock_tables(
+int spider_mbase_handler::lock_tables(
int link_idx
) {
int error_num;
SPIDER_CONN *conn = spider->conns[link_idx];
spider_string *str = &sql;
- DBUG_ENTER("spider_mysql_handler::lock_tables");
+ DBUG_ENTER("spider_mbase_handler::lock_tables");
str->length(0);
if ((error_num = conn->db_conn->append_lock_tables(str)))
{
@@ -11650,12 +13399,12 @@ int spider_mysql_handler::lock_tables(
DBUG_RETURN(0);
}
-int spider_mysql_handler::unlock_tables(
+int spider_mbase_handler::unlock_tables(
int link_idx
) {
int error_num;
SPIDER_CONN *conn = spider->conns[link_idx];
- DBUG_ENTER("spider_mysql_handler::unlock_tables");
+ DBUG_ENTER("spider_mbase_handler::unlock_tables");
if (conn->table_locked)
{
spider_string *str = &sql;
@@ -11703,14 +13452,14 @@ int spider_mysql_handler::unlock_tables(
DBUG_RETURN(0);
}
-int spider_mysql_handler::disable_keys(
+int spider_mbase_handler::disable_keys(
SPIDER_CONN *conn,
int link_idx
) {
int error_num;
SPIDER_SHARE *share = spider->share;
spider_string *str = &spider->result_list.sqls[link_idx];
- DBUG_ENTER("spider_mysql_handler::disable_keys");
+ DBUG_ENTER("spider_mbase_handler::disable_keys");
DBUG_PRINT("info",("spider this=%p", this));
str->length(0);
if ((error_num = append_disable_keys_part(SPIDER_SQL_TYPE_OTHER_HS,
@@ -11761,14 +13510,14 @@ int spider_mysql_handler::disable_keys(
DBUG_RETURN(0);
}
-int spider_mysql_handler::enable_keys(
+int spider_mbase_handler::enable_keys(
SPIDER_CONN *conn,
int link_idx
) {
int error_num;
SPIDER_SHARE *share = spider->share;
spider_string *str = &spider->result_list.sqls[link_idx];
- DBUG_ENTER("spider_mysql_handler::enable_keys");
+ DBUG_ENTER("spider_mbase_handler::enable_keys");
DBUG_PRINT("info",("spider this=%p", this));
str->length(0);
if ((error_num = append_enable_keys_part(SPIDER_SQL_TYPE_OTHER_HS,
@@ -11819,7 +13568,7 @@ int spider_mysql_handler::enable_keys(
DBUG_RETURN(0);
}
-int spider_mysql_handler::check_table(
+int spider_mbase_handler::check_table(
SPIDER_CONN *conn,
int link_idx,
HA_CHECK_OPT* check_opt
@@ -11827,7 +13576,7 @@ int spider_mysql_handler::check_table(
int error_num;
SPIDER_SHARE *share = spider->share;
spider_string *str = &spider->result_list.sqls[link_idx];
- DBUG_ENTER("spider_mysql_handler::check_table");
+ DBUG_ENTER("spider_mbase_handler::check_table");
DBUG_PRINT("info",("spider this=%p", this));
str->length(0);
if ((error_num = append_check_table_part(SPIDER_SQL_TYPE_OTHER_HS,
@@ -11878,7 +13627,7 @@ int spider_mysql_handler::check_table(
DBUG_RETURN(0);
}
-int spider_mysql_handler::repair_table(
+int spider_mbase_handler::repair_table(
SPIDER_CONN *conn,
int link_idx,
HA_CHECK_OPT* check_opt
@@ -11886,7 +13635,7 @@ int spider_mysql_handler::repair_table(
int error_num;
SPIDER_SHARE *share = spider->share;
spider_string *str = &spider->result_list.sqls[link_idx];
- DBUG_ENTER("spider_mysql_handler::repair_table");
+ DBUG_ENTER("spider_mbase_handler::repair_table");
DBUG_PRINT("info",("spider this=%p", this));
str->length(0);
if ((error_num = append_repair_table_part(SPIDER_SQL_TYPE_OTHER_HS,
@@ -11937,14 +13686,14 @@ int spider_mysql_handler::repair_table(
DBUG_RETURN(0);
}
-int spider_mysql_handler::analyze_table(
+int spider_mbase_handler::analyze_table(
SPIDER_CONN *conn,
int link_idx
) {
int error_num;
SPIDER_SHARE *share = spider->share;
spider_string *str = &spider->result_list.sqls[link_idx];
- DBUG_ENTER("spider_mysql_handler::analyze_table");
+ DBUG_ENTER("spider_mbase_handler::analyze_table");
DBUG_PRINT("info",("spider this=%p", this));
str->length(0);
if ((error_num = append_analyze_table_part(SPIDER_SQL_TYPE_OTHER_HS,
@@ -11995,14 +13744,14 @@ int spider_mysql_handler::analyze_table(
DBUG_RETURN(0);
}
-int spider_mysql_handler::optimize_table(
+int spider_mbase_handler::optimize_table(
SPIDER_CONN *conn,
int link_idx
) {
int error_num;
SPIDER_SHARE *share = spider->share;
spider_string *str = &spider->result_list.sqls[link_idx];
- DBUG_ENTER("spider_mysql_handler::optimize_table");
+ DBUG_ENTER("spider_mbase_handler::optimize_table");
DBUG_PRINT("info",("spider this=%p", this));
str->length(0);
if ((error_num = append_optimize_table_part(SPIDER_SQL_TYPE_OTHER_HS,
@@ -12053,7 +13802,7 @@ int spider_mysql_handler::optimize_table(
DBUG_RETURN(0);
}
-int spider_mysql_handler::flush_tables(
+int spider_mbase_handler::flush_tables(
SPIDER_CONN *conn,
int link_idx,
bool lock
@@ -12061,7 +13810,7 @@ int spider_mysql_handler::flush_tables(
int error_num;
SPIDER_SHARE *share = spider->share;
spider_string *str = &spider->result_list.sqls[link_idx];
- DBUG_ENTER("spider_mysql_handler::flush_tables");
+ DBUG_ENTER("spider_mbase_handler::flush_tables");
DBUG_PRINT("info",("spider this=%p", this));
str->length(0);
if ((error_num = append_flush_tables_part(SPIDER_SQL_TYPE_OTHER_HS,
@@ -12102,13 +13851,13 @@ int spider_mysql_handler::flush_tables(
DBUG_RETURN(0);
}
-int spider_mysql_handler::flush_logs(
+int spider_mbase_handler::flush_logs(
SPIDER_CONN *conn,
int link_idx
) {
int error_num;
SPIDER_SHARE *share = spider->share;
- DBUG_ENTER("spider_mysql_handler::flush_logs");
+ DBUG_ENTER("spider_mbase_handler::flush_logs");
DBUG_PRINT("info",("spider this=%p", this));
spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
share);
@@ -12143,16 +13892,16 @@ int spider_mysql_handler::flush_logs(
DBUG_RETURN(0);
}
-int spider_mysql_handler::insert_opened_handler(
+int spider_mbase_handler::insert_opened_handler(
SPIDER_CONN *conn,
int link_idx
) {
- spider_db_mysql *db_conn = (spider_db_mysql *) conn->db_conn;
+ spider_db_mbase *db_conn = (spider_db_mbase *) conn->db_conn;
SPIDER_LINK_FOR_HASH *tmp_link_for_hash = &link_for_hash[link_idx];
DBUG_ASSERT(tmp_link_for_hash->spider == spider);
DBUG_ASSERT(tmp_link_for_hash->link_idx == link_idx);
uint old_elements = db_conn->handler_open_array.max_element;
- DBUG_ENTER("spider_mysql_handler::insert_opened_handler");
+ DBUG_ENTER("spider_mbase_handler::insert_opened_handler");
DBUG_PRINT("info",("spider this=%p", this));
if (insert_dynamic(&db_conn->handler_open_array,
(uchar*) &tmp_link_for_hash))
@@ -12169,14 +13918,14 @@ int spider_mysql_handler::insert_opened_handler(
DBUG_RETURN(0);
}
-int spider_mysql_handler::delete_opened_handler(
+int spider_mbase_handler::delete_opened_handler(
SPIDER_CONN *conn,
int link_idx
) {
- spider_db_mysql *db_conn = (spider_db_mysql *) conn->db_conn;
+ spider_db_mbase *db_conn = (spider_db_mbase *) conn->db_conn;
uint roop_count, elements = db_conn->handler_open_array.elements;
SPIDER_LINK_FOR_HASH *tmp_link_for_hash;
- DBUG_ENTER("spider_mysql_handler::delete_opened_handler");
+ DBUG_ENTER("spider_mbase_handler::delete_opened_handler");
DBUG_PRINT("info",("spider this=%p", this));
for (roop_count = 0; roop_count < elements; roop_count++)
{
@@ -12192,27 +13941,27 @@ int spider_mysql_handler::delete_opened_handler(
DBUG_RETURN(0);
}
-int spider_mysql_handler::sync_from_clone_source(
+int spider_mbase_handler::sync_from_clone_source(
spider_db_handler *dbton_hdl
) {
- DBUG_ENTER("spider_mysql_handler::sync_from_clone_source");
+ DBUG_ENTER("spider_mbase_handler::sync_from_clone_source");
DBUG_PRINT("info",("spider this=%p", this));
DBUG_RETURN(0);
}
-bool spider_mysql_handler::support_use_handler(
+bool spider_mbase_handler::support_use_handler(
int use_handler
) {
- DBUG_ENTER("spider_mysql_handler::support_use_handler");
+ DBUG_ENTER("spider_mbase_handler::support_use_handler");
DBUG_PRINT("info",("spider this=%p", this));
DBUG_RETURN(TRUE);
}
-void spider_mysql_handler::minimum_select_bitmap_create()
+void spider_mbase_handler::minimum_select_bitmap_create()
{
TABLE *table = spider->get_table();
Field **field_p;
- DBUG_ENTER("spider_mysql_handler::minimum_select_bitmap_create");
+ DBUG_ENTER("spider_mbase_handler::minimum_select_bitmap_create");
DBUG_PRINT("info",("spider this=%p", this));
memset(minimum_select_bitmap, 0, no_bytes_in_map(table->read_set));
if (
@@ -12279,10 +14028,10 @@ void spider_mysql_handler::minimum_select_bitmap_create()
DBUG_VOID_RETURN;
}
-bool spider_mysql_handler::minimum_select_bit_is_set(
+bool spider_mbase_handler::minimum_select_bit_is_set(
uint field_index
) {
- DBUG_ENTER("spider_mysql_handler::minimum_select_bit_is_set");
+ DBUG_ENTER("spider_mbase_handler::minimum_select_bit_is_set");
DBUG_PRINT("info",("spider this=%p", this));
DBUG_PRINT("info",("spider field_index=%u", field_index));
DBUG_PRINT("info",("spider minimum_select_bitmap=%s",
@@ -12291,12 +14040,12 @@ bool spider_mysql_handler::minimum_select_bit_is_set(
DBUG_RETURN(spider_bit_is_set(minimum_select_bitmap, field_index));
}
-void spider_mysql_handler::copy_minimum_select_bitmap(
+void spider_mbase_handler::copy_minimum_select_bitmap(
uchar *bitmap
) {
int roop_count;
TABLE *table = spider->get_table();
- DBUG_ENTER("spider_mysql_handler::copy_minimum_select_bitmap");
+ DBUG_ENTER("spider_mbase_handler::copy_minimum_select_bitmap");
for (roop_count = 0;
roop_count < (int) ((table->s->fields + 7) / 8);
roop_count++)
@@ -12310,9 +14059,9 @@ void spider_mysql_handler::copy_minimum_select_bitmap(
DBUG_VOID_RETURN;
}
-int spider_mysql_handler::init_union_table_name_pos()
+int spider_mbase_handler::init_union_table_name_pos()
{
- DBUG_ENTER("spider_mysql_handler::init_union_table_name_pos");
+ DBUG_ENTER("spider_mbase_handler::init_union_table_name_pos");
DBUG_PRINT("info",("spider this=%p", this));
if (!union_table_name_pos_first)
{
@@ -12329,9 +14078,9 @@ int spider_mysql_handler::init_union_table_name_pos()
DBUG_RETURN(0);
}
-int spider_mysql_handler::set_union_table_name_pos()
+int spider_mbase_handler::set_union_table_name_pos()
{
- DBUG_ENTER("spider_mysql_handler::set_union_table_name_pos");
+ DBUG_ENTER("spider_mbase_handler::set_union_table_name_pos");
DBUG_PRINT("info",("spider this=%p", this));
if (union_table_name_pos_current->tgt_num >= SPIDER_INT_HLD_TGT_SIZE)
{
@@ -12354,12 +14103,12 @@ int spider_mysql_handler::set_union_table_name_pos()
DBUG_RETURN(0);
}
-int spider_mysql_handler::reset_union_table_name(
+int spider_mbase_handler::reset_union_table_name(
spider_string *str,
int link_idx,
ulong sql_type
) {
- DBUG_ENTER("spider_mysql_handler::reset_union_table_name");
+ DBUG_ENTER("spider_mbase_handler::reset_union_table_name");
DBUG_PRINT("info",("spider this=%p", this));
if (!union_table_name_pos_current)
DBUG_RETURN(0);
@@ -12381,18 +14130,370 @@ int spider_mysql_handler::reset_union_table_name(
DBUG_RETURN(0);
}
-spider_mysql_copy_table::spider_mysql_copy_table(
- spider_mysql_share *db_share
+#ifdef SPIDER_HAS_GROUP_BY_HANDLER
+int spider_mbase_handler::append_from_and_tables_part(
+ spider_fields *fields,
+ ulong sql_type
+) {
+ int error_num;
+ spider_string *str;
+ SPIDER_TABLE_HOLDER *table_holder;
+ TABLE_LIST *table_list;
+ DBUG_ENTER("spider_mbase_handler::append_from_and_tables_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ str = &sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ fields->set_pos_to_first_table_holder();
+ table_holder = fields->get_next_table_holder();
+ table_list = table_holder->table->pos_in_table_list;
+ error_num = spider_db_mbase_utility->append_from_and_tables(
+ table_holder->spider, fields, str,
+ table_list, fields->get_table_count());
+ DBUG_RETURN(error_num);
+}
+
+int spider_mbase_handler::reappend_tables_part(
+ spider_fields *fields,
+ ulong sql_type
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_mbase_handler::reappend_tables_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ str = &sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = spider_db_mbase_utility->reappend_tables(fields,
+ link_idx_chain, str);
+ DBUG_RETURN(error_num);
+}
+
+int spider_mbase_handler::append_where_part(
+ ulong sql_type
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_mbase_handler::append_where_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ str = &sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = spider_db_mbase_utility->append_where(str);
+ DBUG_RETURN(error_num);
+}
+
+int spider_mbase_handler::append_having_part(
+ ulong sql_type
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_mbase_handler::append_having_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ str = &sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = spider_db_mbase_utility->append_having(str);
+ DBUG_RETURN(error_num);
+}
+
+int spider_mbase_handler::append_item_type_part(
+ Item *item,
+ const char *alias,
+ uint alias_length,
+ bool use_fields,
+ spider_fields *fields,
+ ulong sql_type
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_mbase_handler::append_item_type_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ str = &sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = spider_db_print_item_type(item, NULL, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields);
+ DBUG_RETURN(error_num);
+}
+
+int spider_mbase_handler::append_list_item_select_part(
+ List<Item> *select,
+ const char *alias,
+ uint alias_length,
+ bool use_fields,
+ spider_fields *fields,
+ ulong sql_type
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_mbase_handler::append_list_item_select_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ str = &sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_list_item_select(select, str, alias, alias_length,
+ use_fields, fields);
+ DBUG_RETURN(error_num);
+}
+
+int spider_mbase_handler::append_list_item_select(
+ List<Item> *select,
+ spider_string *str,
+ const char *alias,
+ uint alias_length,
+ bool use_fields,
+ spider_fields *fields
+) {
+ int error_num;
+ uint32 length, begin;
+ List_iterator_fast<Item> it(*select);
+ Item *item;
+ Field *field;
+ const char *item_name;
+ DBUG_ENTER("spider_mbase_handler::append_list_item_select");
+ DBUG_PRINT("info",("spider this=%p", this));
+ begin = str->length();
+ while ((item = it++))
+ {
+ if (item->const_item())
+ {
+ DBUG_PRINT("info",("spider const item"));
+ continue;
+ }
+ if ((error_num = spider_db_print_item_type(item, NULL, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields)))
+ {
+ DBUG_RETURN(error_num);
+ }
+ field = *(fields->get_next_field_ptr());
+ if (field)
+ {
+ item_name = SPIDER_field_name_str(field);
+ length = SPIDER_field_name_length(field);
+ } else {
+ item_name = SPIDER_item_name_str(item);
+ length = SPIDER_item_name_length(item);
+ }
+ if (str->reserve(
+ SPIDER_SQL_COMMA_LEN + /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
+ SPIDER_SQL_SPACE_LEN + length
+ ))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
+ if ((error_num = spider_db_mbase_utility->append_name(str,
+ item_name, length)))
+ {
+ DBUG_RETURN(error_num);
+ }
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ if (begin == str->length())
+ {
+ /* no columns */
+ if (str->reserve(SPIDER_SQL_ONE_LEN))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ str->q_append(SPIDER_SQL_ONE_STR, SPIDER_SQL_ONE_LEN);
+ } else {
+ str->length(str->length() - SPIDER_SQL_COMMA_LEN);
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_mbase_handler::append_group_by_part(
+ ORDER *order,
+ const char *alias,
+ uint alias_length,
+ bool use_fields,
+ spider_fields *fields,
+ ulong sql_type
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_mbase_handler::append_group_by_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ str = &sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_group_by(order, str, alias, alias_length,
+ use_fields, fields);
+ DBUG_RETURN(error_num);
+}
+
+int spider_mbase_handler::append_group_by(
+ ORDER *order,
+ spider_string *str,
+ const char *alias,
+ uint alias_length,
+ bool use_fields,
+ spider_fields *fields
+) {
+ int error_num;
+ DBUG_ENTER("spider_mbase_handler::append_group_by");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (order)
+ {
+ if (str->reserve(SPIDER_SQL_GROUP_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_GROUP_STR, SPIDER_SQL_GROUP_LEN);
+ for (; order; order = order->next)
+ {
+ if ((error_num = spider_db_print_item_type((*order->item), NULL, spider,
+ str, alias, alias_length, dbton_id, use_fields, fields)))
+ {
+ DBUG_RETURN(error_num);
+ }
+ if (str->reserve(SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ str->length(str->length() - SPIDER_SQL_COMMA_LEN);
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_mbase_handler::append_order_by_part(
+ ORDER *order,
+ const char *alias,
+ uint alias_length,
+ bool use_fields,
+ spider_fields *fields,
+ ulong sql_type
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_mbase_handler::append_order_by_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ str = &sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_order_by(order, str, alias, alias_length,
+ use_fields, fields);
+ DBUG_RETURN(error_num);
+}
+
+int spider_mbase_handler::append_order_by(
+ ORDER *order,
+ spider_string *str,
+ const char *alias,
+ uint alias_length,
+ bool use_fields,
+ spider_fields *fields
+) {
+ int error_num;
+ DBUG_ENTER("spider_mbase_handler::append_order_by");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (order)
+ {
+ if (str->reserve(SPIDER_SQL_ORDER_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_ORDER_STR, SPIDER_SQL_ORDER_LEN);
+ for (; order; order = order->next)
+ {
+ if ((error_num = spider_db_print_item_type((*order->item), NULL, spider,
+ str, alias, alias_length, dbton_id, use_fields, fields)))
+ {
+ DBUG_RETURN(error_num);
+ }
+ if (SPIDER_order_direction_is_asc(order))
+ {
+ if (str->reserve(SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ } else {
+ if (str->reserve(SPIDER_SQL_COMMA_LEN + SPIDER_SQL_DESC_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_DESC_STR, SPIDER_SQL_DESC_LEN);
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ }
+ str->length(str->length() - SPIDER_SQL_COMMA_LEN);
+ }
+ DBUG_RETURN(0);
+}
+#endif
+
+spider_mbase_copy_table::spider_mbase_copy_table(
+ spider_mbase_share *db_share
) : spider_db_copy_table(
db_share
),
mysql_share(db_share)
{
+ DBUG_ENTER("spider_mbase_copy_table::spider_mbase_copy_table");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_VOID_RETURN;
+}
+
+spider_mysql_copy_table::spider_mysql_copy_table(
+ spider_mbase_share *db_share
+) : spider_mbase_copy_table(
+ db_share
+) {
DBUG_ENTER("spider_mysql_copy_table::spider_mysql_copy_table");
DBUG_PRINT("info",("spider this=%p", this));
DBUG_VOID_RETURN;
}
+spider_mariadb_copy_table::spider_mariadb_copy_table(
+ spider_mbase_share *db_share
+) : spider_mbase_copy_table(
+ db_share
+) {
+ DBUG_ENTER("spider_mariadb_copy_table::spider_mariadb_copy_table");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_VOID_RETURN;
+}
+
+spider_mbase_copy_table::~spider_mbase_copy_table()
+{
+ DBUG_ENTER("spider_mbase_copy_table::~spider_mbase_copy_table");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_VOID_RETURN;
+}
+
spider_mysql_copy_table::~spider_mysql_copy_table()
{
DBUG_ENTER("spider_mysql_copy_table::~spider_mysql_copy_table");
@@ -12400,26 +14501,33 @@ spider_mysql_copy_table::~spider_mysql_copy_table()
DBUG_VOID_RETURN;
}
-int spider_mysql_copy_table::init()
+spider_mariadb_copy_table::~spider_mariadb_copy_table()
+{
+ DBUG_ENTER("spider_mariadb_copy_table::~spider_mariadb_copy_table");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_VOID_RETURN;
+}
+
+int spider_mbase_copy_table::init()
{
- DBUG_ENTER("spider_mysql_copy_table::init");
+ DBUG_ENTER("spider_mbase_copy_table::init");
DBUG_PRINT("info",("spider this=%p", this));
sql.init_calc_mem(78);
DBUG_RETURN(0);
}
-void spider_mysql_copy_table::set_sql_charset(
+void spider_mbase_copy_table::set_sql_charset(
CHARSET_INFO *cs
) {
- DBUG_ENTER("spider_mysql_copy_table::set_sql_charset");
+ DBUG_ENTER("spider_mbase_copy_table::set_sql_charset");
DBUG_PRINT("info",("spider this=%p", this));
sql.set_charset(cs);
DBUG_VOID_RETURN;
}
-int spider_mysql_copy_table::append_select_str()
+int spider_mbase_copy_table::append_select_str()
{
- DBUG_ENTER("spider_mysql_copy_table::append_select_str");
+ DBUG_ENTER("spider_mbase_copy_table::append_select_str");
DBUG_PRINT("info",("spider this=%p", this));
if (sql.reserve(SPIDER_SQL_SELECT_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
@@ -12427,10 +14535,10 @@ int spider_mysql_copy_table::append_select_str()
DBUG_RETURN(0);
}
-int spider_mysql_copy_table::append_insert_str(
+int spider_mbase_copy_table::append_insert_str(
int insert_flg
) {
- DBUG_ENTER("spider_mysql_copy_table::append_insert_str");
+ DBUG_ENTER("spider_mbase_copy_table::append_insert_str");
DBUG_PRINT("info",("spider this=%p", this));
if (insert_flg & SPIDER_DB_INSERT_REPLACE)
{
@@ -12469,12 +14577,12 @@ int spider_mysql_copy_table::append_insert_str(
DBUG_RETURN(0);
}
-int spider_mysql_copy_table::append_table_columns(
+int spider_mbase_copy_table::append_table_columns(
TABLE_SHARE *table_share
) {
int error_num;
Field **field;
- DBUG_ENTER("spider_mysql_copy_table::append_table_columns");
+ DBUG_ENTER("spider_mbase_copy_table::append_table_columns");
DBUG_PRINT("info",("spider this=%p", this));
for (field = table_share->field; *field; field++)
{
@@ -12482,7 +14590,7 @@ int spider_mysql_copy_table::append_table_columns(
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
sql.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
if ((error_num = spider_db_append_name_with_quote_str(&sql,
- (char *) (*field)->field_name, spider_dbton_mysql.dbton_id)))
+ (*field)->field_name, dbton_id)))
DBUG_RETURN(error_num);
if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN + SPIDER_SQL_COMMA_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
@@ -12493,9 +14601,9 @@ int spider_mysql_copy_table::append_table_columns(
DBUG_RETURN(0);
}
-int spider_mysql_copy_table::append_from_str()
+int spider_mbase_copy_table::append_from_str()
{
- DBUG_ENTER("spider_mysql_copy_table::append_from_str");
+ DBUG_ENTER("spider_mbase_copy_table::append_from_str");
DBUG_PRINT("info",("spider this=%p", this));
if (sql.reserve(SPIDER_SQL_FROM_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
@@ -12503,40 +14611,40 @@ int spider_mysql_copy_table::append_from_str()
DBUG_RETURN(0);
}
-int spider_mysql_copy_table::append_table_name(
+int spider_mbase_copy_table::append_table_name(
int link_idx
) {
int error_num;
- DBUG_ENTER("spider_mysql_copy_table::append_table_name");
+ DBUG_ENTER("spider_mbase_copy_table::append_table_name");
DBUG_PRINT("info",("spider this=%p", this));
error_num = mysql_share->append_table_name(&sql, link_idx);
DBUG_RETURN(error_num);
}
-void spider_mysql_copy_table::set_sql_pos()
+void spider_mbase_copy_table::set_sql_pos()
{
- DBUG_ENTER("spider_mysql_copy_table::set_sql_pos");
+ DBUG_ENTER("spider_mbase_copy_table::set_sql_pos");
DBUG_PRINT("info",("spider this=%p", this));
pos = sql.length();
DBUG_VOID_RETURN;
}
-void spider_mysql_copy_table::set_sql_to_pos()
+void spider_mbase_copy_table::set_sql_to_pos()
{
- DBUG_ENTER("spider_mysql_copy_table::set_sql_to_pos");
+ DBUG_ENTER("spider_mbase_copy_table::set_sql_to_pos");
DBUG_PRINT("info",("spider this=%p", this));
sql.length(pos);
DBUG_VOID_RETURN;
}
-int spider_mysql_copy_table::append_copy_where(
+int spider_mbase_copy_table::append_copy_where(
spider_db_copy_table *source_ct,
KEY *key_info,
ulong *last_row_pos,
ulong *last_lengths
) {
int error_num, roop_count, roop_count2;
- DBUG_ENTER("spider_mysql_copy_table::append_copy_where");
+ DBUG_ENTER("spider_mbase_copy_table::append_copy_where");
DBUG_PRINT("info",("spider this=%p", this));
if (sql.reserve(SPIDER_SQL_WHERE_LEN + SPIDER_SQL_OPEN_PAREN_LEN))
{
@@ -12582,7 +14690,7 @@ int spider_mysql_copy_table::append_copy_where(
DBUG_RETURN(0);
}
-int spider_mysql_copy_table::append_key_order_str(
+int spider_mbase_copy_table::append_key_order_str(
KEY *key_info,
int start_pos,
bool desc_flg
@@ -12590,7 +14698,7 @@ int spider_mysql_copy_table::append_key_order_str(
int length, error_num;
KEY_PART_INFO *key_part;
Field *field;
- DBUG_ENTER("spider_mysql_copy_table::append_key_order_str");
+ DBUG_ENTER("spider_mbase_copy_table::append_key_order_str");
DBUG_PRINT("info",("spider this=%p", this));
if ((int) spider_user_defined_key_parts(key_info) > start_pos)
{
@@ -12611,7 +14719,7 @@ int spider_mysql_copy_table::append_key_order_str(
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
sql.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
if ((error_num = spider_db_append_name_with_quote_str(&sql,
- (char *) field->field_name, spider_dbton_mysql.dbton_id)))
+ field->field_name, dbton_id)))
DBUG_RETURN(error_num);
if (key_part->key_part_flag & HA_REVERSE_SORT)
{
@@ -12641,7 +14749,7 @@ int spider_mysql_copy_table::append_key_order_str(
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
sql.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
if ((error_num = spider_db_append_name_with_quote_str(&sql,
- (char *) field->field_name, spider_dbton_mysql.dbton_id)))
+ field->field_name, dbton_id)))
DBUG_RETURN(error_num);
if (key_part->key_part_flag & HA_REVERSE_SORT)
{
@@ -12664,13 +14772,13 @@ int spider_mysql_copy_table::append_key_order_str(
DBUG_RETURN(0);
}
-int spider_mysql_copy_table::append_limit(
+int spider_mbase_copy_table::append_limit(
longlong offset,
longlong limit
) {
char buf[SPIDER_LONGLONG_LEN + 1];
uint32 length;
- DBUG_ENTER("spider_mysql_copy_table::append_limit");
+ DBUG_ENTER("spider_mbase_copy_table::append_limit");
DBUG_PRINT("info",("spider this=%p", this));
if (offset || limit < 9223372036854775807LL)
{
@@ -12692,9 +14800,9 @@ int spider_mysql_copy_table::append_limit(
DBUG_RETURN(0);
}
-int spider_mysql_copy_table::append_into_str()
+int spider_mbase_copy_table::append_into_str()
{
- DBUG_ENTER("spider_mysql_copy_table::append_into_str");
+ DBUG_ENTER("spider_mbase_copy_table::append_into_str");
DBUG_PRINT("info",("spider this=%p", this));
if (sql.reserve(SPIDER_SQL_INTO_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
@@ -12702,9 +14810,9 @@ int spider_mysql_copy_table::append_into_str()
DBUG_RETURN(0);
}
-int spider_mysql_copy_table::append_open_paren_str()
+int spider_mbase_copy_table::append_open_paren_str()
{
- DBUG_ENTER("spider_mysql_copy_table::append_open_paren_str");
+ DBUG_ENTER("spider_mbase_copy_table::append_open_paren_str");
DBUG_PRINT("info",("spider this=%p", this));
if (sql.reserve(SPIDER_SQL_OPEN_PAREN_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
@@ -12712,9 +14820,9 @@ int spider_mysql_copy_table::append_open_paren_str()
DBUG_RETURN(0);
}
-int spider_mysql_copy_table::append_values_str()
+int spider_mbase_copy_table::append_values_str()
{
- DBUG_ENTER("spider_mysql_copy_table::append_values_str");
+ DBUG_ENTER("spider_mbase_copy_table::append_values_str");
DBUG_PRINT("info",("spider this=%p", this));
if (sql.reserve(SPIDER_SQL_CLOSE_PAREN_LEN + SPIDER_SQL_VALUES_LEN +
SPIDER_SQL_OPEN_PAREN_LEN))
@@ -12725,10 +14833,10 @@ int spider_mysql_copy_table::append_values_str()
DBUG_RETURN(0);
}
-int spider_mysql_copy_table::append_select_lock_str(
+int spider_mbase_copy_table::append_select_lock_str(
int lock_mode
) {
- DBUG_ENTER("spider_mysql_copy_table::append_select_lock_str");
+ DBUG_ENTER("spider_mbase_copy_table::append_select_lock_str");
DBUG_PRINT("info",("spider this=%p", this));
if (lock_mode == SPIDER_LOCK_MODE_EXCLUSIVE)
{
@@ -12744,20 +14852,20 @@ int spider_mysql_copy_table::append_select_lock_str(
DBUG_RETURN(0);
}
-int spider_mysql_copy_table::exec_query(
+int spider_mbase_copy_table::exec_query(
SPIDER_CONN *conn,
int quick_mode,
int *need_mon
) {
int error_num;
- DBUG_ENTER("spider_mysql_copy_table::exec_query");
+ DBUG_ENTER("spider_mbase_copy_table::exec_query");
DBUG_PRINT("info",("spider this=%p", this));
error_num = spider_db_query(conn, sql.ptr(), sql.length(), quick_mode,
need_mon);
DBUG_RETURN(error_num);
}
-int spider_mysql_copy_table::copy_key_row(
+int spider_mbase_copy_table::copy_key_row(
spider_db_copy_table *source_ct,
Field *field,
ulong *row_pos,
@@ -12766,14 +14874,14 @@ int spider_mysql_copy_table::copy_key_row(
const int joint_length
) {
int error_num;
- spider_string *source_str = &((spider_mysql_copy_table *) source_ct)->sql;
- DBUG_ENTER("spider_mysql_copy_table::copy_key_row");
+ spider_string *source_str = &((spider_mbase_copy_table *) source_ct)->sql;
+ DBUG_ENTER("spider_mbase_copy_table::copy_key_row");
DBUG_PRINT("info",("spider this=%p", this));
if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
sql.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
if ((error_num = spider_db_append_name_with_quote_str(&sql,
- (char *) field->field_name, spider_dbton_mysql.dbton_id)))
+ field->field_name, dbton_id)))
DBUG_RETURN(error_num);
if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN + joint_length + *length +
SPIDER_SQL_AND_LEN))
@@ -12785,12 +14893,12 @@ int spider_mysql_copy_table::copy_key_row(
DBUG_RETURN(0);
}
-int spider_mysql_copy_table::copy_row(
+int spider_mbase_copy_table::copy_row(
Field *field,
SPIDER_DB_ROW *row
) {
int error_num;
- DBUG_ENTER("spider_mysql_copy_table::copy_row");
+ DBUG_ENTER("spider_mbase_copy_table::copy_row");
DBUG_PRINT("info",("spider this=%p", this));
if (row->is_null())
{
@@ -12803,7 +14911,7 @@ int spider_mysql_copy_table::copy_row(
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
sql.q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
if ((error_num = row->append_escaped_to_str(&sql,
- spider_dbton_mysql.dbton_id)))
+ dbton_id)))
DBUG_RETURN(error_num);
if (sql.reserve(SPIDER_SQL_VALUE_QUOTE_LEN + SPIDER_SQL_COMMA_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
@@ -12818,7 +14926,7 @@ int spider_mysql_copy_table::copy_row(
DBUG_RETURN(0);
}
-int spider_mysql_copy_table::copy_rows(
+int spider_mbase_copy_table::copy_rows(
TABLE *table,
SPIDER_DB_ROW *row,
ulong **last_row_pos,
@@ -12827,7 +14935,7 @@ int spider_mysql_copy_table::copy_rows(
int error_num;
Field **field;
ulong *lengths2, *row_pos2;
- DBUG_ENTER("spider_mysql_copy_table::copy_rows");
+ DBUG_ENTER("spider_mbase_copy_table::copy_rows");
DBUG_PRINT("info",("spider this=%p", this));
row_pos2 = *last_row_pos;
lengths2 = *last_lengths;
@@ -12858,13 +14966,13 @@ int spider_mysql_copy_table::copy_rows(
DBUG_RETURN(0);
}
-int spider_mysql_copy_table::copy_rows(
+int spider_mbase_copy_table::copy_rows(
TABLE *table,
SPIDER_DB_ROW *row
) {
int error_num;
Field **field;
- DBUG_ENTER("spider_mysql_copy_table::copy_rows");
+ DBUG_ENTER("spider_mbase_copy_table::copy_rows");
DBUG_PRINT("info",("spider this=%p", this));
for (
field = table->field;
@@ -12888,22 +14996,22 @@ int spider_mysql_copy_table::copy_rows(
DBUG_RETURN(0);
}
-int spider_mysql_copy_table::append_insert_terminator()
+int spider_mbase_copy_table::append_insert_terminator()
{
- DBUG_ENTER("spider_mysql_copy_table::append_insert_terminator");
+ DBUG_ENTER("spider_mbase_copy_table::append_insert_terminator");
DBUG_PRINT("info",("spider this=%p", this));
sql.length(sql.length() - SPIDER_SQL_COMMA_LEN - SPIDER_SQL_OPEN_PAREN_LEN);
DBUG_RETURN(0);
}
-int spider_mysql_copy_table::copy_insert_values(
+int spider_mbase_copy_table::copy_insert_values(
spider_db_copy_table *source_ct
) {
- spider_mysql_copy_table *tmp_ct = (spider_mysql_copy_table *) source_ct;
+ spider_mbase_copy_table *tmp_ct = (spider_mbase_copy_table *) source_ct;
spider_string *source_str = &tmp_ct->sql;
int values_length = source_str->length() - tmp_ct->pos;
const char *values_ptr = source_str->ptr() + tmp_ct->pos;
- DBUG_ENTER("spider_mysql_copy_table::copy_insert_values");
+ DBUG_ENTER("spider_mbase_copy_table::copy_insert_values");
DBUG_PRINT("info",("spider this=%p", this));
if (sql.reserve(values_length))
{
diff --git a/storage/spider/spd_db_mysql.h b/storage/spider/spd_db_mysql.h
index ecd2e8d6b3d..d50bb0d1f9d 100644
--- a/storage/spider/spd_db_mysql.h
+++ b/storage/spider/spd_db_mysql.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2012-2014 Kentoku Shiba
+/* Copyright (C) 2012-2018 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
@@ -13,11 +13,11 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */
-class spider_db_mysql_util: public spider_db_util
+class spider_db_mbase_util: public spider_db_util
{
public:
- spider_db_mysql_util();
- ~spider_db_mysql_util();
+ spider_db_mbase_util();
+ virtual ~spider_db_mbase_util();
int append_name(
spider_string *str,
const char *name,
@@ -99,7 +99,9 @@ public:
ha_spider *spider,
spider_string *str,
const char *alias,
- uint alias_length
+ uint alias_length,
+ bool use_fields,
+ spider_fields *fields
);
#ifdef HANDLER_HAS_DIRECT_AGGREGATE
int open_item_sum_func(
@@ -107,16 +109,86 @@ public:
ha_spider *spider,
spider_string *str,
const char *alias,
- uint alias_length
+ uint alias_length,
+ bool use_fields,
+ spider_fields *fields
);
#endif
int append_escaped_util(
spider_string *to,
String *from
);
+#ifdef SPIDER_HAS_GROUP_BY_HANDLER
+ int append_table(
+ ha_spider *spider,
+ spider_fields *fields,
+ spider_string *str,
+ TABLE_LIST *table_list,
+ TABLE_LIST **used_table_list,
+ uint *current_pos,
+ TABLE_LIST **cond_table_list_ptr,
+ bool top_down,
+ bool first
+ );
+ int append_tables_top_down(
+ ha_spider *spider,
+ spider_fields *fields,
+ spider_string *str,
+ TABLE_LIST *table_list,
+ TABLE_LIST **used_table_list,
+ uint *current_pos,
+ TABLE_LIST **cond_table_list_ptr
+ );
+ int append_tables_top_down_check(
+ TABLE_LIST *table_list,
+ TABLE_LIST **used_table_list,
+ uint *current_pos
+ );
+ int append_embedding_tables(
+ ha_spider *spider,
+ spider_fields *fields,
+ spider_string *str,
+ TABLE_LIST *table_list,
+ TABLE_LIST **used_table_list,
+ uint *current_pos,
+ TABLE_LIST **cond_table_list_ptr
+ );
+ int append_from_and_tables(
+ ha_spider *spider,
+ spider_fields *fields,
+ spider_string *str,
+ TABLE_LIST *table_list,
+ uint table_count
+ );
+ int reappend_tables(
+ spider_fields *fields,
+ SPIDER_LINK_IDX_CHAIN *link_idx_chain,
+ spider_string *str
+ );
+ int append_where(
+ spider_string *str
+ );
+ int append_having(
+ spider_string *str
+ );
+#endif
+};
+
+class spider_db_mysql_util: public spider_db_mbase_util
+{
+public:
+ spider_db_mysql_util();
+ ~spider_db_mysql_util();
+};
+
+class spider_db_mariadb_util: public spider_db_mbase_util
+{
+public:
+ spider_db_mariadb_util();
+ ~spider_db_mariadb_util();
};
-class spider_db_mysql_row: public spider_db_row
+class spider_db_mbase_row: public spider_db_row
{
public:
MYSQL_ROW row;
@@ -124,9 +196,12 @@ public:
ulong *lengths;
ulong *lengths_first;
uint field_count;
+ uint record_size;
bool cloned;
- spider_db_mysql_row();
- ~spider_db_mysql_row();
+ spider_db_mbase_row(
+ uint dbton_id
+ );
+ virtual ~spider_db_mbase_row();
int store_to_field(
Field *field,
CHARSET_INFO *access_charset
@@ -152,17 +227,34 @@ public:
TABLE *tmp_table,
spider_string *str
);
+ uint get_byte_size();
+};
+
+class spider_db_mysql_row: public spider_db_mbase_row
+{
+public:
+ spider_db_mysql_row();
+ ~spider_db_mysql_row();
+};
+
+class spider_db_mariadb_row: public spider_db_mbase_row
+{
+public:
+ spider_db_mariadb_row();
+ ~spider_db_mariadb_row();
};
-class spider_db_mysql_result: public spider_db_result
+class spider_db_mbase_result: public spider_db_result
{
public:
MYSQL_RES *db_result;
- spider_db_mysql_row row;
+ spider_db_mbase_row row;
MYSQL_ROW_OFFSET first_row;
int store_error_num;
- spider_db_mysql_result();
- ~spider_db_mysql_result();
+ spider_db_mbase_result(
+ SPIDER_DB_CONN *in_db_conn
+ );
+ virtual ~spider_db_mbase_result();
bool has_result();
void free_result();
SPIDER_DB_ROW *current_row();
@@ -199,6 +291,13 @@ public:
int fetch_table_mon_status(
int &status
);
+ int fetch_show_master_status(
+ const char **binlog_file_name,
+ const char **binlog_pos
+ );
+ int fetch_select_binlog_gtid_pos(
+ const char **gtid_pos
+ );
longlong num_rows();
uint num_fields();
void move_to_pos(
@@ -222,11 +321,31 @@ public:
#endif
};
-class spider_db_mysql: public spider_db_conn
+class spider_db_mysql_result: public spider_db_mbase_result
{
- MYSQL *db_conn;
- int stored_error;
public:
+ spider_db_mysql_result(
+ SPIDER_DB_CONN *in_db_conn
+ );
+ ~spider_db_mysql_result();
+};
+
+class spider_db_mariadb_result: public spider_db_mbase_result
+{
+public:
+ spider_db_mariadb_result(
+ SPIDER_DB_CONN *in_db_conn
+ );
+ ~spider_db_mariadb_result();
+};
+
+class spider_db_mbase: public spider_db_conn
+{
+protected:
+ int stored_error;
+ spider_db_mbase_util *spider_db_mbase_utility;
+public:
+ MYSQL *db_conn;
HASH lock_table_hash;
bool lock_table_hash_inited;
uint lock_table_hash_id;
@@ -239,10 +358,11 @@ public:
const char *handler_open_array_func_name;
const char *handler_open_array_file_name;
ulong handler_open_array_line_no;
- spider_db_mysql(
- SPIDER_CONN *conn
+ spider_db_mbase(
+ SPIDER_CONN *conn,
+ spider_db_mbase_util *spider_db_mbase_utility
);
- ~spider_db_mysql();
+ virtual ~spider_db_mbase();
int init();
bool is_connected();
void bg_connect();
@@ -351,6 +471,39 @@ public:
Time_zone *time_zone,
int *need_mon
);
+ int exec_simple_sql_with_result(
+ SPIDER_TRX *trx,
+ SPIDER_SHARE *share,
+ const char *sql,
+ uint sql_length,
+ int all_link_idx,
+ int *need_mon,
+ SPIDER_DB_RESULT **res
+ );
+ int show_master_status(
+ SPIDER_TRX *trx,
+ SPIDER_SHARE *share,
+ int all_link_idx,
+ int *need_mon,
+ TABLE *table,
+ spider_string *str,
+ int mode,
+ SPIDER_DB_RESULT **res1,
+ SPIDER_DB_RESULT **res2
+ );
+ int select_binlog_gtid_pos(
+ SPIDER_TRX *trx,
+ SPIDER_SHARE *share,
+ int all_link_idx,
+ int *need_mon,
+ TABLE *table,
+ spider_string *str,
+ const char *binlog_file_name,
+ uint binlog_file_name_length,
+ const char *binlog_pos,
+ uint binlog_pos_length,
+ SPIDER_DB_RESULT **res
+ );
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
int append_sql(
char *sql,
@@ -424,8 +577,28 @@ public:
);
};
-class spider_mysql_share: public spider_db_share
+class spider_db_mysql: public spider_db_mbase
+{
+public:
+ spider_db_mysql(
+ SPIDER_CONN *conn
+ );
+ ~spider_db_mysql();
+};
+
+class spider_db_mariadb: public spider_db_mbase
+{
+public:
+ spider_db_mariadb(
+ SPIDER_CONN *conn
+ );
+ ~spider_db_mariadb();
+};
+
+class spider_mbase_share: public spider_db_share
{
+protected:
+ spider_db_mbase_util *spider_db_mbase_utility;
public:
spider_string *table_select;
int table_select_pos;
@@ -447,10 +620,12 @@ public:
bool same_db_table_name;
int first_all_link_idx;
- spider_mysql_share(
- st_spider_share *share
+ spider_mbase_share(
+ st_spider_share *share,
+ uint dbton_id,
+ spider_db_mbase_util *spider_db_mbase_utility
);
- ~spider_mysql_share();
+ virtual ~spider_mbase_share();
int init();
uint get_column_name_length(
uint field_index
@@ -485,7 +660,7 @@ public:
spider_string *str
);
#endif
-private:
+protected:
int create_table_names_str();
void free_table_names_str();
int create_column_name_str();
@@ -503,8 +678,28 @@ private:
);
};
-class spider_mysql_handler: public spider_db_handler
+class spider_mysql_share: public spider_mbase_share
+{
+public:
+ spider_mysql_share(
+ st_spider_share *share
+ );
+ ~spider_mysql_share();
+};
+
+class spider_mariadb_share: public spider_mbase_share
+{
+public:
+ spider_mariadb_share(
+ st_spider_share *share
+ );
+ ~spider_mariadb_share();
+};
+
+class spider_mbase_handler: public spider_db_handler
{
+protected:
+ spider_db_mbase_util *spider_db_mbase_utility;
spider_string sql;
spider_string sql_part;
spider_string sql_part2;
@@ -512,7 +707,9 @@ class spider_mysql_handler: public spider_db_handler
int where_pos;
int order_pos;
int limit_pos;
+public:
int table_name_pos;
+protected:
int ha_read_pos;
int ha_next_pos;
int ha_where_pos;
@@ -545,15 +742,21 @@ class spider_mysql_handler: public spider_db_handler
SPIDER_INT_HLD *union_table_name_pos_first;
SPIDER_INT_HLD *union_table_name_pos_current;
public:
- spider_mysql_share *mysql_share;
+ spider_mbase_share *mysql_share;
SPIDER_LINK_FOR_HASH *link_for_hash;
uchar *minimum_select_bitmap;
- spider_mysql_handler(
+ spider_mbase_handler(
ha_spider *spider,
- spider_mysql_share *share
+ spider_mbase_share *share,
+ spider_db_mbase_util *spider_db_mbase_utility
);
- ~spider_mysql_handler();
+ virtual ~spider_mbase_handler();
int init();
+ int append_index_hint(
+ spider_string *str,
+ int link_idx,
+ ulong sql_type
+ );
int append_table_name_with_adjusting(
spider_string *str,
int link_idx,
@@ -1129,7 +1332,7 @@ public:
int link_idx
);
bool is_sole_projection_field(
- uint16 field_index
+ uint16 field_index
);
bool is_bulk_insert_exec_period(
bool bulk_end
@@ -1199,6 +1402,13 @@ public:
bool need_lock_before_set_sql_for_exec(
ulong sql_type
);
+#ifdef SPIDER_HAS_GROUP_BY_HANDLER
+ int set_sql_for_exec(
+ ulong sql_type,
+ int link_idx,
+ SPIDER_LINK_IDX_CHAIN *link_idx_chain
+ );
+#endif
int set_sql_for_exec(
ulong sql_type,
int link_idx
@@ -1310,18 +1520,110 @@ public:
int link_idx,
ulong sql_type
);
+#ifdef SPIDER_HAS_GROUP_BY_HANDLER
+ int append_from_and_tables_part(
+ spider_fields *fields,
+ ulong sql_type
+ );
+ int reappend_tables_part(
+ spider_fields *fields,
+ ulong sql_type
+ );
+ int append_where_part(
+ ulong sql_type
+ );
+ int append_having_part(
+ ulong sql_type
+ );
+ int append_item_type_part(
+ Item *item,
+ const char *alias,
+ uint alias_length,
+ bool use_fields,
+ spider_fields *fields,
+ ulong sql_type
+ );
+ int append_list_item_select_part(
+ List<Item> *select,
+ const char *alias,
+ uint alias_length,
+ bool use_fields,
+ spider_fields *fields,
+ ulong sql_type
+ );
+ int append_list_item_select(
+ List<Item> *select,
+ spider_string *str,
+ const char *alias,
+ uint alias_length,
+ bool use_fields,
+ spider_fields *fields
+ );
+ int append_group_by_part(
+ ORDER *order,
+ const char *alias,
+ uint alias_length,
+ bool use_fields,
+ spider_fields *fields,
+ ulong sql_type
+ );
+ int append_group_by(
+ ORDER *order,
+ spider_string *str,
+ const char *alias,
+ uint alias_length,
+ bool use_fields,
+ spider_fields *fields
+ );
+ int append_order_by_part(
+ ORDER *order,
+ const char *alias,
+ uint alias_length,
+ bool use_fields,
+ spider_fields *fields,
+ ulong sql_type
+ );
+ int append_order_by(
+ ORDER *order,
+ spider_string *str,
+ const char *alias,
+ uint alias_length,
+ bool use_fields,
+ spider_fields *fields
+ );
+#endif
+};
+
+class spider_mysql_handler: public spider_mbase_handler
+{
+public:
+ spider_mysql_handler(
+ ha_spider *spider,
+ spider_mbase_share *share
+ );
+ ~spider_mysql_handler();
+};
+
+class spider_mariadb_handler: public spider_mbase_handler
+{
+public:
+ spider_mariadb_handler(
+ ha_spider *spider,
+ spider_mbase_share *share
+ );
+ ~spider_mariadb_handler();
};
-class spider_mysql_copy_table: public spider_db_copy_table
+class spider_mbase_copy_table: public spider_db_copy_table
{
public:
- spider_mysql_share *mysql_share;
+ spider_mbase_share *mysql_share;
spider_string sql;
uint pos;
- spider_mysql_copy_table(
- spider_mysql_share *db_share
+ spider_mbase_copy_table(
+ spider_mbase_share *db_share
);
- ~spider_mysql_copy_table();
+ virtual ~spider_mbase_copy_table();
int init();
void set_sql_charset(
CHARSET_INFO *cs
@@ -1392,3 +1694,21 @@ public:
spider_db_copy_table *source_ct
);
};
+
+class spider_mysql_copy_table: public spider_mbase_copy_table
+{
+public:
+ spider_mysql_copy_table(
+ spider_mbase_share *db_share
+ );
+ ~spider_mysql_copy_table();
+};
+
+class spider_mariadb_copy_table: public spider_mbase_copy_table
+{
+public:
+ spider_mariadb_copy_table(
+ spider_mbase_share *db_share
+ );
+ ~spider_mariadb_copy_table();
+};
diff --git a/storage/spider/spd_db_oracle.cc b/storage/spider/spd_db_oracle.cc
index d5d41f4a994..b7e8100e480 100644
--- a/storage/spider/spd_db_oracle.cc
+++ b/storage/spider/spd_db_oracle.cc
@@ -1,4 +1,4 @@
-/* Copyright (C) 2012-2015 Kentoku Shiba
+/* Copyright (C) 2012-2018 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
@@ -14,7 +14,9 @@
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */
#define MYSQL_SERVER 1
+#include <my_global.h>
#include "mysql_version.h"
+#include "spd_environ.h"
#if MYSQL_VERSION_ID < 50500
#include "mysql_priv.h"
#include <mysql/plugin.h>
@@ -51,6 +53,7 @@ extern struct charset_info_st *spd_charset_utf8_bin;
extern handlerton *spider_hton_ptr;
extern pthread_mutex_t spider_open_conn_mutex;
extern HASH spider_open_connections;
+extern HASH spider_ipport_conns;
extern SPIDER_DBTON spider_dbton[SPIDER_DBTON_SIZE];
extern const char spider_dig_upper[];
@@ -149,6 +152,9 @@ static const int spider_db_table_lock_len[] =
sizeof(" in exclusive mode") - 1
};
+/* UTC time zone for timestamp columns */
+extern Time_zone *UTC;
+
int spider_db_oracle_get_error(
sword res,
dvoid *hndlp,
@@ -310,6 +316,12 @@ SPIDER_DB_CONN *spider_oracle_create_conn(
DBUG_RETURN(new spider_db_oracle(conn));
}
+bool spider_oracle_support_direct_join(
+) {
+ DBUG_ENTER("spider_oracle_support_direct_join");
+ DBUG_RETURN(FALSE);
+}
+
spider_db_oracle_util spider_db_oracle_utility;
SPIDER_DBTON spider_dbton_oracle = {
@@ -322,6 +334,7 @@ SPIDER_DBTON spider_dbton_oracle = {
spider_oracle_create_handler,
spider_oracle_create_copy_table,
spider_oracle_create_conn,
+ spider_oracle_support_direct_join,
&spider_db_oracle_utility
};
@@ -499,13 +512,14 @@ SPIDER_DB_ROW *spider_db_oracle_row::clone()
spider_db_oracle_row *clone_row;
DBUG_ENTER("spider_db_oracle_row::clone");
DBUG_PRINT("info",("spider this=%p", this));
- if (!(clone_row = new spider_db_oracle_row()))
+ if (!(clone_row = new spider_db_oracle_row(dbton_id)))
{
DBUG_RETURN(NULL);
}
clone_row->db_conn = db_conn;
clone_row->result = result;
clone_row->field_count = field_count;
+ clone_row->record_size = record_size;
clone_row->access_charset = access_charset;
clone_row->cloned = TRUE;
if (clone_row->init())
@@ -558,6 +572,13 @@ int spider_db_oracle_row::store_to_tmp_table(
DBUG_RETURN(tmp_table->file->ha_write_row(tmp_table->record[0]));
}
+uint spider_db_oracle_row::get_byte_size()
+{
+ DBUG_ENTER("spider_db_oracle_row::get_byte_size");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(record_size);
+}
+
int spider_db_oracle_row::init()
{
char *tmp_val;
@@ -683,6 +704,7 @@ int spider_db_oracle_row::fetch()
uint i;
DBUG_ENTER("spider_db_oracle_row::fetch");
DBUG_PRINT("info",("spider this=%p", this));
+ record_size = 0;
for (i = 0; i < field_count; i++)
{
if (ind[i] == -1)
@@ -744,14 +766,15 @@ int spider_db_oracle_row::fetch()
}
}
row_size[i] = val_str[i].length();
+ record_size += row_size[i];
}
DBUG_RETURN(0);
}
-spider_db_oracle_result::spider_db_oracle_result() :
- spider_db_result(spider_dbton_oracle.dbton_id),
+spider_db_oracle_result::spider_db_oracle_result(SPIDER_DB_CONN *in_db_conn) :
+ spider_db_result(in_db_conn),
db_conn(NULL), stmtp(NULL), field_count(0), access_charset(NULL),
- fetched(FALSE)
+ fetched(FALSE), row(in_db_conn->dbton_id)
{
DBUG_ENTER("spider_db_oracle_result::spider_db_oracle_result");
DBUG_PRINT("info",("spider this=%p", this));
@@ -898,6 +921,7 @@ SPIDER_DB_ROW *spider_db_oracle_result::fetch_row_from_tmp_table(
str += row.row_size[i];
}
}
+ row.record_size = tmp_str2.length();
DBUG_RETURN((SPIDER_DB_ROW *) &row);
}
@@ -1566,7 +1590,7 @@ int spider_db_oracle::exec_query(
DBUG_RETURN(error_num);
}
- if ((result = new spider_db_oracle_result()))
+ if ((result = new spider_db_oracle_result(this)))
{
result->db_conn = this;
result->stmtp = stmtp;
@@ -2167,6 +2191,22 @@ int spider_db_oracle::set_time_zone(
DBUG_RETURN(0);
}
+int spider_db_oracle::show_master_status(
+ SPIDER_TRX *trx,
+ SPIDER_SHARE *share,
+ int all_link_idx,
+ int *need_mon,
+ TABLE *table,
+ spider_string *str,
+ int mode,
+ SPIDER_DB_RESULT **res1,
+ SPIDER_DB_RESULT **res2
+) {
+ DBUG_ENTER("spider_db_oracle::show_master_status");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(0);
+}
+
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
int spider_db_oracle::append_sql(
char *sql,
@@ -2454,8 +2494,13 @@ void spider_db_oracle::set_dup_key_idx(
key_name = spider->share->tgt_pk_names[all_link_idx];
key_name_length = spider->share->tgt_pk_names_lengths[all_link_idx];
} else {
+#ifdef SPIDER_use_LEX_CSTRING_for_KEY_Field_name
+ key_name = (char *) table->s->key_info[roop_count].name.str;
+ key_name_length = table->s->key_info[roop_count].name.length;
+#else
key_name = table->s->key_info[roop_count].name;
key_name_length = strlen(key_name);
+#endif
}
memcpy(tmp_pos, key_name, key_name_length + 1);
DBUG_PRINT("info",("spider key_name=%s", key_name));
@@ -2573,9 +2618,12 @@ int spider_db_oracle_util::append_column_value(
spider_string tmp_str(buf, MAX_FIELD_WIDTH, &my_charset_bin);
String *ptr;
uint length;
+ Time_zone *saved_time_zone = thd->variables.time_zone;
DBUG_ENTER("spider_db_oracle_util::append_column_value");
tmp_str.init_calc_mem(181);
+ thd->variables.time_zone = UTC;
+
if (new_ptr)
{
if (
@@ -2669,6 +2717,9 @@ int spider_db_oracle_util::append_column_value(
ptr = field->val_str(tmp_str.get_str());
tmp_str.mem_calc();
}
+
+ thd->variables.time_zone = saved_time_zone;
+
DBUG_PRINT("info", ("spider field->type() is %d", field->type()));
DBUG_PRINT("info", ("spider ptr->length() is %d", ptr->length()));
/*
@@ -2946,19 +2997,23 @@ int spider_db_oracle_util::open_item_func(
ha_spider *spider,
spider_string *str,
const char *alias,
- uint alias_length
+ uint alias_length,
+ bool use_fields,
+ spider_fields *fields
) {
uint dbton_id = spider_dbton_oracle.dbton_id;
int error_num;
Item *item, **item_list = item_func->arguments();
+ Field *field;
uint roop_count, item_count = item_func->argument_count(), start_item = 0;
const char *func_name = SPIDER_SQL_NULL_CHAR_STR,
- *separete_str = SPIDER_SQL_NULL_CHAR_STR,
+ *separator_str = SPIDER_SQL_NULL_CHAR_STR,
*last_str = SPIDER_SQL_NULL_CHAR_STR;
int func_name_length = SPIDER_SQL_NULL_CHAR_LEN,
- separete_str_length = SPIDER_SQL_NULL_CHAR_LEN,
+ separator_str_length = SPIDER_SQL_NULL_CHAR_LEN,
last_str_length = SPIDER_SQL_NULL_CHAR_LEN;
int use_pushdown_udf;
+ bool merge_func = FALSE;
DBUG_ENTER("spider_db_oracle_util::open_item_func");
if (str)
{
@@ -3021,8 +3076,8 @@ int spider_db_oracle_util::open_item_func(
) {
if (str)
str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- DBUG_RETURN(spider_db_open_item_int(item_func, spider, str,
- alias, alias_length, dbton_id));
+ DBUG_RETURN(spider_db_open_item_int(item_func, NULL, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields));
} else if (
!strncasecmp("case", func_name, func_name_length)
) {
@@ -3037,8 +3092,8 @@ int spider_db_oracle_util::open_item_func(
if (item_func_case->first_expr_num != -1)
{
if ((error_num = spider_db_print_item_type(
- item_list[item_func_case->first_expr_num], spider, str,
- alias, alias_length, dbton_id)))
+ item_list[item_func_case->first_expr_num], NULL, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields)))
DBUG_RETURN(error_num);
}
for (roop_count = 0; roop_count < item_func_case->ncases;
@@ -3051,8 +3106,8 @@ int spider_db_oracle_util::open_item_func(
str->q_append(SPIDER_SQL_WHEN_STR, SPIDER_SQL_WHEN_LEN);
}
if ((error_num = spider_db_print_item_type(
- item_list[roop_count], spider, str,
- alias, alias_length, dbton_id)))
+ item_list[roop_count], NULL, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields)))
DBUG_RETURN(error_num);
if (str)
{
@@ -3061,8 +3116,8 @@ int spider_db_oracle_util::open_item_func(
str->q_append(SPIDER_SQL_THEN_STR, SPIDER_SQL_THEN_LEN);
}
if ((error_num = spider_db_print_item_type(
- item_list[roop_count + 1], spider, str,
- alias, alias_length, dbton_id)))
+ item_list[roop_count + 1], NULL, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields)))
DBUG_RETURN(error_num);
}
if (item_func_case->else_expr_num != -1)
@@ -3074,8 +3129,8 @@ int spider_db_oracle_util::open_item_func(
str->q_append(SPIDER_SQL_ELSE_STR, SPIDER_SQL_ELSE_LEN);
}
if ((error_num = spider_db_print_item_type(
- item_list[item_func_case->else_expr_num], spider, str,
- alias, alias_length, dbton_id)))
+ item_list[item_func_case->else_expr_num], NULL, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields)))
DBUG_RETURN(error_num);
}
if (str)
@@ -3111,8 +3166,8 @@ int spider_db_oracle_util::open_item_func(
) {
if (str)
str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- DBUG_RETURN(spider_db_open_item_string(item_func, spider, str,
- alias, alias_length, dbton_id));
+ DBUG_RETURN(spider_db_open_item_string(item_func, NULL, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields));
} else if (
!strncasecmp("convert", func_name, func_name_length)
) {
@@ -3136,42 +3191,111 @@ int spider_db_oracle_util::open_item_func(
) {
if (str)
str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- DBUG_RETURN(spider_db_open_item_string(item_func, spider, str,
- alias, alias_length, dbton_id));
+ DBUG_RETURN(spider_db_open_item_string(item_func, NULL, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields));
} else if (func_name_length == 9 &&
!strncasecmp("isnottrue", func_name, func_name_length)
) {
last_str = SPIDER_SQL_IS_NOT_TRUE_STR;
last_str_length = SPIDER_SQL_IS_NOT_TRUE_LEN;
break;
- } else if (func_name_length == 10 &&
- !strncasecmp("isnotfalse", func_name, func_name_length)
- ) {
- last_str = SPIDER_SQL_IS_NOT_FALSE_STR;
- last_str_length = SPIDER_SQL_IS_NOT_FALSE_LEN;
- break;
+ } else if (func_name_length == 10)
+ {
+ if (!strncasecmp("isnotfalse", func_name, func_name_length))
+ {
+ last_str = SPIDER_SQL_IS_NOT_FALSE_STR;
+ last_str_length = SPIDER_SQL_IS_NOT_FALSE_LEN;
+ break;
+ } else if (!strncasecmp("column_get", func_name, func_name_length))
+ {
+ if (str)
+ {
+ str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
+ if (str->reserve(func_name_length + SPIDER_SQL_OPEN_PAREN_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(func_name, func_name_length);
+ str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
+ }
+ func_name = SPIDER_SQL_COMMA_STR;
+ func_name_length = SPIDER_SQL_COMMA_LEN;
+ separator_str = SPIDER_SQL_COMMA_STR;
+ separator_str_length = SPIDER_SQL_COMMA_LEN;
+ break;
+ }
} else if (func_name_length == 12)
{
if (!strncasecmp("cast_as_date", func_name, func_name_length))
{
+ item = item_list[0];
+ if (item->type() == Item::FUNC_ITEM)
+ {
+ DBUG_PRINT("info",("spider child is FUNC_ITEM"));
+ Item_func *ifunc = (Item_func *) item;
+ if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
+ {
+ const char *child_func_name;
+ int child_func_name_length;
+ DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
+ child_func_name = (char*) ifunc->func_name();
+ child_func_name_length = strlen(child_func_name);
+ DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
+ if (
+ child_func_name_length == 10 &&
+ !strncasecmp("column_get", child_func_name, child_func_name_length)
+ ) {
+ DBUG_PRINT("info",("spider this is merge func"));
+ merge_func = TRUE;
+ }
+ }
+ }
+
if (str)
{
str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- if (str->reserve(SPIDER_SQL_CAST_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
+ if (!merge_func)
+ {
+ if (str->reserve(SPIDER_SQL_CAST_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
+ }
}
last_str = SPIDER_SQL_AS_DATE_STR;
last_str_length = SPIDER_SQL_AS_DATE_LEN;
break;
} else if (!strncasecmp("cast_as_time", func_name, func_name_length))
{
+ item = item_list[0];
+ if (item->type() == Item::FUNC_ITEM)
+ {
+ DBUG_PRINT("info",("spider child is FUNC_ITEM"));
+ Item_func *ifunc = (Item_func *) item;
+ if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
+ {
+ const char *child_func_name;
+ int child_func_name_length;
+ DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
+ child_func_name = (char*) ifunc->func_name();
+ child_func_name_length = strlen(child_func_name);
+ DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
+ if (
+ child_func_name_length == 10 &&
+ !strncasecmp("column_get", child_func_name, child_func_name_length)
+ ) {
+ DBUG_PRINT("info",("spider this is merge func"));
+ merge_func = TRUE;
+ }
+ }
+ }
+
if (str)
{
str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- if (str->reserve(SPIDER_SQL_CAST_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
+ if (!merge_func)
+ {
+ if (str->reserve(SPIDER_SQL_CAST_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
+ }
}
last_str = SPIDER_SQL_AS_TIME_STR;
last_str_length = SPIDER_SQL_AS_TIME_LEN;
@@ -3183,8 +3307,8 @@ int spider_db_oracle_util::open_item_func(
{
if (str)
str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- DBUG_RETURN(spider_db_open_item_string(item_func, spider, str,
- alias, alias_length, dbton_id));
+ DBUG_RETURN(spider_db_open_item_string(item_func, NULL, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields));
} else if (!strncasecmp("timestampdiff", func_name, func_name_length))
{
#ifdef ITEM_FUNC_TIMESTAMPDIFF_ARE_PUBLIC
@@ -3246,8 +3370,8 @@ int spider_db_oracle_util::open_item_func(
str->q_append(interval_str, interval_len);
str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
}
- if ((error_num = spider_db_print_item_type(item_list[0], spider,
- str, alias, alias_length, dbton_id)))
+ if ((error_num = spider_db_print_item_type(item_list[0], NULL, spider,
+ str, alias, alias_length, dbton_id, use_fields, fields)))
DBUG_RETURN(error_num);
if (str)
{
@@ -3255,8 +3379,8 @@ int spider_db_oracle_util::open_item_func(
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
}
- if ((error_num = spider_db_print_item_type(item_list[1], spider,
- str, alias, alias_length, dbton_id)))
+ if ((error_num = spider_db_print_item_type(item_list[1], NULL, spider,
+ str, alias, alias_length, dbton_id, use_fields, fields)))
DBUG_RETURN(error_num);
if (str)
{
@@ -3274,6 +3398,29 @@ int spider_db_oracle_util::open_item_func(
{
if (!strncasecmp("cast_as_binary", func_name, func_name_length))
{
+ item = item_list[0];
+ if (item->type() == Item::FUNC_ITEM)
+ {
+ DBUG_PRINT("info",("spider child is FUNC_ITEM"));
+ Item_func *ifunc = (Item_func *) item;
+ if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
+ {
+ const char *child_func_name;
+ int child_func_name_length;
+ DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
+ child_func_name = (char*) ifunc->func_name();
+ child_func_name_length = strlen(child_func_name);
+ DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
+ if (
+ child_func_name_length == 10 &&
+ !strncasecmp("column_get", child_func_name, child_func_name_length)
+ ) {
+ DBUG_PRINT("info",("spider this is merge func"));
+ merge_func = TRUE;
+ }
+ }
+ }
+
if (str)
{
char tmp_buf[MAX_FIELD_WIDTH], *tmp_ptr, *tmp_ptr2;
@@ -3281,9 +3428,12 @@ int spider_db_oracle_util::open_item_func(
tmp_str.init_calc_mem(123);
tmp_str.length(0);
str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- if (str->reserve(SPIDER_SQL_CAST_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
+ if (!merge_func)
+ {
+ if (str->reserve(SPIDER_SQL_CAST_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
+ }
#if MYSQL_VERSION_ID < 50500
item_func->print(tmp_str.get_str(), QT_IS);
#else
@@ -3302,12 +3452,38 @@ int spider_db_oracle_util::open_item_func(
break;
} else if (!strncasecmp("cast_as_signed", func_name, func_name_length))
{
+ item = item_list[0];
+ if (item->type() == Item::FUNC_ITEM)
+ {
+ DBUG_PRINT("info",("spider child is FUNC_ITEM"));
+ Item_func *ifunc = (Item_func *) item;
+ if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
+ {
+ const char *child_func_name;
+ int child_func_name_length;
+ DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
+ child_func_name = (char*) ifunc->func_name();
+ child_func_name_length = strlen(child_func_name);
+ DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
+ if (
+ child_func_name_length == 10 &&
+ !strncasecmp("column_get", child_func_name, child_func_name_length)
+ ) {
+ DBUG_PRINT("info",("spider this is merge func"));
+ merge_func = TRUE;
+ }
+ }
+ }
+
if (str)
{
str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- if (str->reserve(SPIDER_SQL_CAST_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
+ if (!merge_func)
+ {
+ if (str->reserve(SPIDER_SQL_CAST_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
+ }
}
last_str = SPIDER_SQL_AS_SIGNED_STR;
last_str_length = SPIDER_SQL_AS_SIGNED_LEN;
@@ -3317,12 +3493,38 @@ int spider_db_oracle_util::open_item_func(
{
if (!strncasecmp("cast_as_unsigned", func_name, func_name_length))
{
+ item = item_list[0];
+ if (item->type() == Item::FUNC_ITEM)
+ {
+ DBUG_PRINT("info",("spider child is FUNC_ITEM"));
+ Item_func *ifunc = (Item_func *) item;
+ if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
+ {
+ const char *child_func_name;
+ int child_func_name_length;
+ DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
+ child_func_name = (char*) ifunc->func_name();
+ child_func_name_length = strlen(child_func_name);
+ DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
+ if (
+ child_func_name_length == 10 &&
+ !strncasecmp("column_get", child_func_name, child_func_name_length)
+ ) {
+ DBUG_PRINT("info",("spider this is merge func"));
+ merge_func = TRUE;
+ }
+ }
+ }
+
if (str)
{
str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- if (str->reserve(SPIDER_SQL_CAST_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
+ if (!merge_func)
+ {
+ if (str->reserve(SPIDER_SQL_CAST_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
+ }
}
last_str = SPIDER_SQL_AS_UNSIGNED_STR;
last_str_length = SPIDER_SQL_AS_UNSIGNED_LEN;
@@ -3330,6 +3532,29 @@ int spider_db_oracle_util::open_item_func(
} else if (!strncasecmp("decimal_typecast", func_name,
func_name_length))
{
+ item = item_list[0];
+ if (item->type() == Item::FUNC_ITEM)
+ {
+ DBUG_PRINT("info",("spider child is FUNC_ITEM"));
+ Item_func *ifunc = (Item_func *) item;
+ if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
+ {
+ const char *child_func_name;
+ int child_func_name_length;
+ DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
+ child_func_name = (char*) ifunc->func_name();
+ child_func_name_length = strlen(child_func_name);
+ DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
+ if (
+ child_func_name_length == 10 &&
+ !strncasecmp("column_get", child_func_name, child_func_name_length)
+ ) {
+ DBUG_PRINT("info",("spider this is merge func"));
+ merge_func = TRUE;
+ }
+ }
+ }
+
if (str)
{
char tmp_buf[MAX_FIELD_WIDTH], *tmp_ptr, *tmp_ptr2;
@@ -3337,9 +3562,12 @@ int spider_db_oracle_util::open_item_func(
tmp_str.init_calc_mem(124);
tmp_str.length(0);
str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- if (str->reserve(SPIDER_SQL_CAST_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
+ if (!merge_func)
+ {
+ if (str->reserve(SPIDER_SQL_CAST_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
+ }
#if MYSQL_VERSION_ID < 50500
item_func->print(tmp_str.get_str(), QT_IS);
#else
@@ -3359,12 +3587,38 @@ int spider_db_oracle_util::open_item_func(
} else if (!strncasecmp("cast_as_datetime", func_name,
func_name_length))
{
+ item = item_list[0];
+ if (item->type() == Item::FUNC_ITEM)
+ {
+ DBUG_PRINT("info",("spider child is FUNC_ITEM"));
+ Item_func *ifunc = (Item_func *) item;
+ if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
+ {
+ const char *child_func_name;
+ int child_func_name_length;
+ DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
+ child_func_name = (char*) ifunc->func_name();
+ child_func_name_length = strlen(child_func_name);
+ DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
+ if (
+ child_func_name_length == 10 &&
+ !strncasecmp("column_get", child_func_name, child_func_name_length)
+ ) {
+ DBUG_PRINT("info",("spider this is merge func"));
+ merge_func = TRUE;
+ }
+ }
+ }
+
if (str)
{
str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- if (str->reserve(SPIDER_SQL_CAST_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
+ if (!merge_func)
+ {
+ if (str->reserve(SPIDER_SQL_CAST_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
+ }
}
last_str = SPIDER_SQL_AS_DATETIME_STR;
last_str_length = SPIDER_SQL_AS_DATETIME_LEN;
@@ -3391,8 +3645,9 @@ int spider_db_oracle_util::open_item_func(
str->q_append(SPIDER_SQL_OPEN_PAREN_STR,
SPIDER_SQL_OPEN_PAREN_LEN);
}
- if ((error_num = spider_db_print_item_type(item_list[0], spider,
- str, alias, alias_length, dbton_id)))
+ if ((error_num = spider_db_print_item_type(item_list[0], NULL,
+ spider, str, alias, alias_length, dbton_id, use_fields,
+ fields)))
DBUG_RETURN(error_num);
if (str)
{
@@ -3409,8 +3664,9 @@ int spider_db_oracle_util::open_item_func(
str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
}
}
- if ((error_num = spider_db_print_item_type(item_list[1], spider,
- str, alias, alias_length, dbton_id)))
+ if ((error_num = spider_db_print_item_type(item_list[1], NULL,
+ spider, str, alias, alias_length, dbton_id, use_fields,
+ fields)))
DBUG_RETURN(error_num);
if (str)
{
@@ -3455,8 +3711,9 @@ int spider_db_oracle_util::open_item_func(
case INTERVAL_MINUTE:
case INTERVAL_SECOND:
case INTERVAL_MICROSECOND:
- if ((error_num = spider_db_print_item_type(item_list[0], spider,
- str, alias, alias_length, dbton_id)))
+ if ((error_num = spider_db_print_item_type(item_list[0], NULL,
+ spider, str, alias, alias_length, dbton_id, use_fields,
+ fields)))
DBUG_RETURN(error_num);
if (str)
{
@@ -3471,8 +3728,9 @@ int spider_db_oracle_util::open_item_func(
str->q_append(SPIDER_SQL_PLUS_STR, SPIDER_SQL_PLUS_LEN);
}
}
- if ((error_num = spider_db_print_item_type(item_list[1], spider,
- str, alias, alias_length, dbton_id)))
+ if ((error_num = spider_db_print_item_type(item_list[1], NULL,
+ spider, str, alias, alias_length, dbton_id, use_fields,
+ fields)))
DBUG_RETURN(error_num);
if (str)
{
@@ -3551,18 +3809,42 @@ int spider_db_oracle_util::open_item_func(
}
func_name = SPIDER_SQL_COMMA_STR;
func_name_length = SPIDER_SQL_COMMA_LEN;
- separete_str = SPIDER_SQL_COMMA_STR;
- separete_str_length = SPIDER_SQL_COMMA_LEN;
+ separator_str = SPIDER_SQL_COMMA_STR;
+ separator_str_length = SPIDER_SQL_COMMA_LEN;
last_str = SPIDER_SQL_CLOSE_PAREN_STR;
last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
break;
case Item_func::NOW_FUNC:
if (str)
str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- DBUG_RETURN(spider_db_open_item_string(item_func, spider, str,
- alias, alias_length, dbton_id));
+ DBUG_RETURN(spider_db_open_item_string(item_func, NULL, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields));
case Item_func::CHAR_TYPECAST_FUNC:
+ DBUG_PRINT("info",("spider CHAR_TYPECAST_FUNC"));
{
+ item = item_list[0];
+ if (item->type() == Item::FUNC_ITEM)
+ {
+ DBUG_PRINT("info",("spider child is FUNC_ITEM"));
+ Item_func *ifunc = (Item_func *) item;
+ if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
+ {
+ const char *child_func_name;
+ int child_func_name_length;
+ DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
+ child_func_name = (char*) ifunc->func_name();
+ child_func_name_length = strlen(child_func_name);
+ DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
+ if (
+ child_func_name_length == 10 &&
+ !strncasecmp("column_get", child_func_name, child_func_name_length)
+ ) {
+ DBUG_PRINT("info",("spider this is merge func"));
+ merge_func = TRUE;
+ }
+ }
+ }
+
if (str)
{
char tmp_buf[MAX_FIELD_WIDTH], *tmp_ptr, *tmp_ptr2;
@@ -3570,9 +3852,12 @@ int spider_db_oracle_util::open_item_func(
tmp_str.init_calc_mem(125);
tmp_str.length(0);
str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- if (str->reserve(SPIDER_SQL_CAST_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
+ if (!merge_func)
+ {
+ if (str->reserve(SPIDER_SQL_CAST_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
+ }
#if MYSQL_VERSION_ID < 50500
item_func->print(tmp_str.get_str(), QT_IS);
#else
@@ -3605,12 +3890,15 @@ int spider_db_oracle_util::open_item_func(
bool has_other_item = FALSE;
while((item = lif++))
{
+#ifdef SPIDER_HAS_EXPR_CACHE_ITEM
if (
item->type() == Item::EXPR_CACHE_ITEM
) {
DBUG_PRINT("info",("spider EXPR_CACHE_ITEM"));
has_expr_cache_item = TRUE;
- } else if (
+ } else
+#endif
+ if (
item->type() == Item::FUNC_ITEM &&
((Item_func *) item)->functype() == Item_func::ISNOTNULL_FUNC
) {
@@ -3655,15 +3943,15 @@ int spider_db_oracle_util::open_item_func(
{
func_name = SPIDER_SQL_NOT_IN_STR;
func_name_length = SPIDER_SQL_NOT_IN_LEN;
- separete_str = SPIDER_SQL_COMMA_STR;
- separete_str_length = SPIDER_SQL_COMMA_LEN;
+ separator_str = SPIDER_SQL_COMMA_STR;
+ separator_str_length = SPIDER_SQL_COMMA_LEN;
last_str = SPIDER_SQL_CLOSE_PAREN_STR;
last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
} else {
func_name = SPIDER_SQL_IN_STR;
func_name_length = SPIDER_SQL_IN_LEN;
- separete_str = SPIDER_SQL_COMMA_STR;
- separete_str_length = SPIDER_SQL_COMMA_LEN;
+ separator_str = SPIDER_SQL_COMMA_STR;
+ separator_str_length = SPIDER_SQL_COMMA_LEN;
last_str = SPIDER_SQL_CLOSE_PAREN_STR;
last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
}
@@ -3673,13 +3961,13 @@ int spider_db_oracle_util::open_item_func(
{
func_name = SPIDER_SQL_NOT_BETWEEN_STR;
func_name_length = SPIDER_SQL_NOT_BETWEEN_LEN;
- separete_str = SPIDER_SQL_AND_STR;
- separete_str_length = SPIDER_SQL_AND_LEN;
+ separator_str = SPIDER_SQL_AND_STR;
+ separator_str_length = SPIDER_SQL_AND_LEN;
} else {
func_name = (char*) item_func->func_name();
func_name_length = strlen(func_name);
- separete_str = SPIDER_SQL_AND_STR;
- separete_str_length = SPIDER_SQL_AND_LEN;
+ separator_str = SPIDER_SQL_AND_STR;
+ separator_str_length = SPIDER_SQL_AND_LEN;
}
break;
case Item_func::UDF_FUNC:
@@ -3700,8 +3988,8 @@ int spider_db_oracle_util::open_item_func(
}
func_name = SPIDER_SQL_COMMA_STR;
func_name_length = SPIDER_SQL_COMMA_LEN;
- separete_str = SPIDER_SQL_COMMA_STR;
- separete_str_length = SPIDER_SQL_COMMA_LEN;
+ separator_str = SPIDER_SQL_COMMA_STR;
+ separator_str_length = SPIDER_SQL_COMMA_LEN;
last_str = SPIDER_SQL_CLOSE_PAREN_STR;
last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
break;
@@ -3714,18 +4002,18 @@ int spider_db_oracle_util::open_item_func(
str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
DBUG_RETURN(
spider_db_open_item_cond((Item_cond *) item_func, spider, str,
- alias, alias_length, dbton_id));
+ alias, alias_length, dbton_id, use_fields, fields));
case Item_func::TRIG_COND_FUNC:
DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
case Item_func::GUSERVAR_FUNC:
if (str)
str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
if (item_func->result_type() == STRING_RESULT)
- DBUG_RETURN(spider_db_open_item_string(item_func, spider, str,
- alias, alias_length, dbton_id));
+ DBUG_RETURN(spider_db_open_item_string(item_func, NULL, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields));
else
- DBUG_RETURN(spider_db_open_item_int(item_func, spider, str,
- alias, alias_length, dbton_id));
+ DBUG_RETURN(spider_db_open_item_int(item_func, NULL, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields));
case Item_func::FT_FUNC:
if (spider_db_check_ft_idx(item_func, spider) == MAX_KEY)
DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
@@ -3736,8 +4024,8 @@ int spider_db_oracle_util::open_item_func(
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_MATCH_STR, SPIDER_SQL_MATCH_LEN);
}
- separete_str = SPIDER_SQL_COMMA_STR;
- separete_str_length = SPIDER_SQL_COMMA_LEN;
+ separator_str = SPIDER_SQL_COMMA_STR;
+ separator_str_length = SPIDER_SQL_COMMA_LEN;
last_str = SPIDER_SQL_CLOSE_PAREN_STR;
last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
break;
@@ -3754,8 +4042,8 @@ int spider_db_oracle_util::open_item_func(
}
func_name = SPIDER_SQL_COMMA_STR;
func_name_length = SPIDER_SQL_COMMA_LEN;
- separete_str = SPIDER_SQL_COMMA_STR;
- separete_str_length = SPIDER_SQL_COMMA_LEN;
+ separator_str = SPIDER_SQL_COMMA_STR;
+ separator_str_length = SPIDER_SQL_COMMA_LEN;
last_str = SPIDER_SQL_CLOSE_PAREN_STR;
last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
break;
@@ -3786,8 +4074,8 @@ int spider_db_oracle_util::open_item_func(
}
func_name = SPIDER_SQL_COMMA_STR;
func_name_length = SPIDER_SQL_COMMA_LEN;
- separete_str = SPIDER_SQL_COMMA_STR;
- separete_str_length = SPIDER_SQL_COMMA_LEN;
+ separator_str = SPIDER_SQL_COMMA_STR;
+ separator_str_length = SPIDER_SQL_COMMA_LEN;
last_str = SPIDER_SQL_CLOSE_PAREN_STR;
last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
break;
@@ -3820,23 +4108,28 @@ int spider_db_oracle_util::open_item_func(
}
DBUG_PRINT("info",("spider func_name = %s", func_name));
DBUG_PRINT("info",("spider func_name_length = %d", func_name_length));
- DBUG_PRINT("info",("spider separete_str = %s", separete_str));
- DBUG_PRINT("info",("spider separete_str_length = %d", separete_str_length));
+ DBUG_PRINT("info",("spider separator_str = %s", separator_str));
+ DBUG_PRINT("info",("spider separator_str_length = %d", separator_str_length));
DBUG_PRINT("info",("spider last_str = %s", last_str));
DBUG_PRINT("info",("spider last_str_length = %d", last_str_length));
if (item_count)
{
+ /* Find the field in the list of items of the expression tree */
+ field = spider_db_find_field_in_item_list(item_list,
+ item_count, start_item,
+ str,
+ func_name, func_name_length);
item_count--;
for (roop_count = start_item; roop_count < item_count; roop_count++)
{
item = item_list[roop_count];
- if ((error_num = spider_db_print_item_type(item, spider, str,
- alias, alias_length, dbton_id)))
+ if ((error_num = spider_db_print_item_type(item, field, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields)))
DBUG_RETURN(error_num);
if (roop_count == 1)
{
- func_name = separete_str;
- func_name_length = separete_str_length;
+ func_name = separator_str;
+ func_name_length = separator_str_length;
}
if (str)
{
@@ -3848,8 +4141,8 @@ int spider_db_oracle_util::open_item_func(
}
}
item = item_list[roop_count];
- if ((error_num = spider_db_print_item_type(item, spider, str,
- alias, alias_length, dbton_id)))
+ if ((error_num = spider_db_print_item_type(item, field, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields)))
DBUG_RETURN(error_num);
}
if (item_func->functype() == Item_func::FT_FUNC)
@@ -3862,8 +4155,8 @@ int spider_db_oracle_util::open_item_func(
str->q_append(SPIDER_SQL_AGAINST_STR, SPIDER_SQL_AGAINST_LEN);
}
item = item_list[0];
- if ((error_num = spider_db_print_item_type(item, spider, str,
- alias, alias_length, dbton_id)))
+ if ((error_num = spider_db_print_item_type(item, NULL, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields)))
DBUG_RETURN(error_num);
if (str)
{
@@ -3891,7 +4184,8 @@ int spider_db_oracle_util::open_item_func(
{
Item_func_conv_charset *item_func_conv_charset =
(Item_func_conv_charset *)item_func;
- CHARSET_INFO *conv_charset = item_func_conv_charset->collation.collation;
+ CHARSET_INFO *conv_charset =
+ item_func_conv_charset->SPIDER_Item_func_conv_charset_conv_charset;
uint cset_length = strlen(conv_charset->csname);
if (str->reserve(SPIDER_SQL_USING_LEN + cset_length))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
@@ -3902,6 +4196,8 @@ int spider_db_oracle_util::open_item_func(
}
if (str)
{
+ if (merge_func)
+ str->length(str->length() - SPIDER_SQL_CLOSE_PAREN_LEN);
if (str->reserve(last_str_length + SPIDER_SQL_CLOSE_PAREN_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(last_str, last_str_length);
@@ -3916,7 +4212,9 @@ int spider_db_oracle_util::open_item_sum_func(
ha_spider *spider,
spider_string *str,
const char *alias,
- uint alias_length
+ uint alias_length,
+ bool use_fields,
+ spider_fields *fields
) {
uint dbton_id = spider_dbton_oracle.dbton_id;
uint roop_count, item_count = item_sum->get_arg_count();
@@ -3945,8 +4243,8 @@ int spider_db_oracle_util::open_item_sum_func(
for (roop_count = 0; roop_count < item_count; roop_count++)
{
item = args[roop_count];
- if ((error_num = spider_db_print_item_type(item, spider, str,
- alias, alias_length, dbton_id)))
+ if ((error_num = spider_db_print_item_type(item, NULL, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields)))
DBUG_RETURN(error_num);
if (str)
{
@@ -3956,8 +4254,8 @@ int spider_db_oracle_util::open_item_sum_func(
}
}
item = args[roop_count];
- if ((error_num = spider_db_print_item_type(item, spider, str,
- alias, alias_length, dbton_id)))
+ if ((error_num = spider_db_print_item_type(item, NULL, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields)))
DBUG_RETURN(error_num);
}
if (str)
@@ -4014,10 +4312,131 @@ int spider_db_oracle_util::append_escaped_util(
DBUG_RETURN(0);
}
+#ifdef SPIDER_HAS_GROUP_BY_HANDLER
+int spider_db_oracle_util::append_from_and_tables(
+ ha_spider *spider,
+ spider_fields *fields,
+ spider_string *str,
+ TABLE_LIST *table_list,
+ uint table_count
+) {
+ SPIDER_TABLE_HOLDER *table_holder;
+ int error_num;
+ uint dbton_id = spider_dbton_oracle.dbton_id, from_length;
+ spider_oracle_share *db_share;
+ spider_oracle_handler *dbton_hdl;
+ ha_spider *spider;
+ DBUG_ENTER("spider_db_oracle_util::append_from_and_tables");
+ DBUG_PRINT("info",("spider this=%p", this));
+
+ /* calculate from size */
+ from_length = SPIDER_SQL_FROM_LEN;
+ fields->set_pos_to_first_table_holder();
+ while ((table_holder = fields->get_next_table_holder()))
+ {
+ spider = table_holder->spider;
+ db_share = (spider_oracle_share *)
+ spider->share->dbton_share[dbton_id];
+ from_length +=
+ db_share->db_nm_max_length +
+ SPIDER_SQL_DOT_LEN + /* SPIDER_SQL_NAME_QUOTE_LEN */ 4 +
+ db_share->table_nm_max_length +
+ SPIDER_SQL_SPACE_LEN + SPIDER_SQL_COMMA_LEN +
+ table_holder->alias->length() - SPIDER_SQL_DOT_LEN;
+ }
+
+ if (str->reserve(from_length))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN);
+
+ fields->set_pos_to_first_table_holder();
+ while ((table_holder = fields->get_next_table_holder()))
+ {
+ spider = table_holder->spider;
+ db_share = (spider_oracle_share *)
+ spider->share->dbton_share[dbton_id];
+ dbton_hdl = (spider_oracle_handler *) spider->dbton_handler[dbton_id];
+ dbton_hdl->table_name_pos = str->length();
+ if ((error_num = db_share->append_table_name_with_adjusting(str,
+ spider->conn_link_idx[dbton_hdl->first_link_idx])))
+ {
+ DBUG_RETURN(error_num);
+ }
+ str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
+ str->q_append(table_holder->alias->ptr(),
+ table_holder->alias->length() - SPIDER_SQL_DOT_LEN);
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ str->length(str->length() - SPIDER_SQL_COMMA_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_db_oracle_util::reappend_tables(
+ spider_fields *fields,
+ SPIDER_LINK_IDX_CHAIN *link_idx_chain,
+ spider_string *str
+) {
+ int error_num;
+ uint dbton_id = spider_dbton_oracle.dbton_id, length;
+ ha_spider *spider;
+ spider_oracle_share *db_share;
+ spider_oracle_handler *dbton_hdl;
+ SPIDER_TABLE_HOLDER *table_holder;
+ SPIDER_LINK_IDX_HOLDER *link_idx_holder;
+ DBUG_ENTER("spider_db_oracle_util::reappend_tables");
+ DBUG_PRINT("info",("spider this=%p", this));
+ length = str->length();
+ fields->set_pos_to_first_table_on_link_idx_chain(link_idx_chain);
+ fields->set_pos_to_first_table_holder();
+ while ((table_holder = fields->get_next_table_holder()))
+ {
+ link_idx_holder = fields->get_next_table_on_link_idx_chain(link_idx_chain);
+ spider = table_holder->spider;
+ db_share = (spider_oracle_share *)
+ spider->share->dbton_share[dbton_id];
+ if (!db_share->same_db_table_name)
+ {
+ dbton_hdl = (spider_oracle_handler *) spider->dbton_handler[dbton_id];
+ str->length(dbton_hdl->table_name_pos);
+ if ((error_num = db_share->append_table_name_with_adjusting(str,
+ spider->conn_link_idx[link_idx_holder->link_idx])))
+ {
+ DBUG_RETURN(error_num);
+ }
+ }
+ }
+ str->length(length);
+ DBUG_RETURN(0);
+}
+
+int spider_db_oracle_util::append_where(
+ spider_string *str
+) {
+ DBUG_ENTER("spider_db_oracle_util::append_where");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (str->reserve(SPIDER_SQL_WHERE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_WHERE_STR, SPIDER_SQL_WHERE_LEN);
+ DBUG_RETURN(0);
+}
+
+int spider_db_oracle_util::append_having(
+ spider_string *str
+) {
+ DBUG_ENTER("spider_db_oracle_util::append_having");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (str->reserve(SPIDER_SQL_HAVING_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_HAVING_STR, SPIDER_SQL_HAVING_LEN);
+ DBUG_RETURN(0);
+}
+#endif
+
spider_oracle_share::spider_oracle_share(
st_spider_share *share
) : spider_db_share(
- share
+ share,
+ spider_dbton_oracle.dbton_id
),
table_select(NULL),
table_select_pos(0),
@@ -4435,7 +4854,7 @@ int spider_oracle_share::create_column_name_str()
str->init_calc_mem(196);
str->set_charset(spider_share->access_charset);
if ((error_num = spider_db_append_name_with_quote_str(str,
- (char *) (*field)->field_name, dbton_id)))
+ (*field)->field_name, dbton_id)))
goto error;
}
DBUG_RETURN(0);
@@ -4468,7 +4887,7 @@ int spider_oracle_share::convert_key_hint_str()
DBUG_ENTER("spider_oracle_share::convert_key_hint_str");
if (spider_share->access_charset->cset != system_charset_info->cset)
{
- /* need convertion */
+ /* need conversion */
for (roop_count = 0, tmp_key_hint = key_hint;
roop_count < (int) table_share->keys; roop_count++, tmp_key_hint++)
{
@@ -4878,6 +5297,10 @@ int spider_oracle_share::append_table_select()
spider_string *str = table_select;
TABLE_SHARE *table_share = spider_share->table_share;
DBUG_ENTER("spider_oracle_share::append_table_select");
+
+ if (!*table_share->field)
+ DBUG_RETURN(0);
+
for (field = table_share->field; *field; field++)
{
field_length = column_name_str[(*field)->field_index].length();
@@ -4902,6 +5325,10 @@ int spider_oracle_share::append_key_select(
TABLE_SHARE *table_share = spider_share->table_share;
const KEY *key_info = &table_share->key_info[idx];
DBUG_ENTER("spider_oracle_share::append_key_select");
+
+ if (!spider_user_defined_key_parts(key_info))
+ DBUG_RETURN(0);
+
for (key_part = key_info->key_part, part_num = 0;
part_num < spider_user_defined_key_parts(key_info); key_part++, part_num++)
{
@@ -5057,6 +5484,16 @@ int spider_oracle_handler::init()
DBUG_RETURN(0);
}
+int spider_oracle_handler::append_index_hint(
+ spider_string *str,
+ int link_idx,
+ ulong sql_type
+ )
+{
+ DBUG_ENTER("spider_oracle_handler::append_index_hint");
+ DBUG_RETURN(0);
+}
+
int spider_oracle_handler::append_table_name_with_adjusting(
spider_string *str,
int link_idx,
@@ -6094,8 +6531,8 @@ int spider_oracle_handler::append_update_columns(
{
value = vi++;
if ((error_num = spider_db_print_item_type(
- (Item *) field, spider, str, alias, alias_length,
- spider_dbton_oracle.dbton_id)))
+ (Item *) field, NULL, spider, str, alias, alias_length,
+ spider_dbton_oracle.dbton_id, FALSE, NULL)))
{
if (
error_num == ER_SPIDER_COND_SKIP_NUM &&
@@ -6112,8 +6549,8 @@ int spider_oracle_handler::append_update_columns(
str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
}
if ((error_num = spider_db_print_item_type(
- (Item *) value, spider, str, alias, alias_length,
- spider_dbton_oracle.dbton_id)))
+ (Item *) value, ((Item_field *) field)->field, spider, str,
+ alias, alias_length, spider_dbton_oracle.dbton_id, FALSE, NULL)))
DBUG_RETURN(error_num);
if (str)
{
@@ -6514,8 +6951,8 @@ int spider_oracle_handler::check_item_type(
int error_num;
DBUG_ENTER("spider_oracle_handler::check_item_type");
DBUG_PRINT("info",("spider this=%p", this));
- error_num = spider_db_print_item_type(item, spider, NULL, NULL, 0,
- spider_dbton_oracle.dbton_id);
+ error_num = spider_db_print_item_type(item, NULL, spider, NULL, NULL, 0,
+ spider_dbton_oracle.dbton_id, FALSE, NULL);
DBUG_RETURN(error_num);
}
@@ -7117,17 +7554,64 @@ int spider_oracle_handler::append_update_where(
) {
uint field_name_length;
Field **field;
+ THD *thd = spider->trx->thd;
SPIDER_SHARE *share = spider->share;
+ bool no_pk = (table->s->primary_key == MAX_KEY);
DBUG_ENTER("spider_oracle_handler::append_update_where");
+ uint str_len_bakup = str->length();
if (str->reserve(SPIDER_SQL_WHERE_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_WHERE_STR, SPIDER_SQL_WHERE_LEN);
- for (field = table->field; *field; field++)
- {
- if (
- table->s->primary_key == MAX_KEY ||
- bitmap_is_set(table->read_set, (*field)->field_index)
+ if (
+ no_pk ||
+ spider_param_use_cond_other_than_pk_for_update(thd)
+ ) {
+ for (field = table->field; *field; field++)
+ {
+ if (
+ no_pk ||
+ bitmap_is_set(table->read_set, (*field)->field_index)
+ ) {
+ field_name_length =
+ oracle_share->column_name_str[(*field)->field_index].length();
+ if ((*field)->is_null(ptr_diff))
+ {
+ if (str->reserve(field_name_length +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
+ SPIDER_SQL_IS_NULL_LEN + SPIDER_SQL_AND_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ oracle_share->append_column_name(str, (*field)->field_index);
+ str->q_append(SPIDER_SQL_IS_NULL_STR, SPIDER_SQL_IS_NULL_LEN);
+ } else {
+ if (str->reserve(field_name_length +
+ /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
+ SPIDER_SQL_EQUAL_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ oracle_share->append_column_name(str, (*field)->field_index);
+ str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
+ (*field)->move_field_offset(ptr_diff);
+ if (
+ spider_db_oracle_utility.
+ append_column_value(spider, str, *field, NULL,
+ share->access_charset) ||
+ str->reserve(SPIDER_SQL_AND_LEN)
+ )
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ (*field)->move_field_offset(-ptr_diff);
+ }
+ str->q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN);
+ }
+ }
+ } else {
+ KEY *key_info = &table->key_info[table->s->primary_key];
+ KEY_PART_INFO *key_part;
+ uint part_num;
+ for (
+ key_part = key_info->key_part, part_num = 0;
+ part_num < spider_user_defined_key_parts(key_info);
+ key_part++, part_num++
) {
+ field = &key_part->field;
field_name_length =
oracle_share->column_name_str[(*field)->field_index].length();
if ((*field)->is_null(ptr_diff))
@@ -7158,9 +7642,13 @@ int spider_oracle_handler::append_update_where(
str->q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN);
}
}
-/*
- str->length(str->length() - SPIDER_SQL_AND_LEN);
-*/
+ if (str->length() == str_len_bakup + SPIDER_SQL_WHERE_LEN)
+ {
+ /* no condition */
+ str->length(str_len_bakup);
+ } else {
+ str->length(str->length() - SPIDER_SQL_AND_LEN);
+ }
if (str->reserve(SPIDER_SQL_LIMIT1_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
str->q_append(SPIDER_SQL_LIMIT1_STR, SPIDER_SQL_LIMIT1_LEN);
@@ -7295,8 +7783,8 @@ int spider_oracle_handler::append_condition(
}
}
if ((error_num = spider_db_print_item_type(
- (Item *) tmp_cond->cond, spider, str, alias, alias_length,
- spider_dbton_oracle.dbton_id)))
+ (Item *) tmp_cond->cond, NULL, spider, str, alias, alias_length,
+ spider_dbton_oracle.dbton_id, FALSE, NULL)))
{
if (str && error_num == ER_SPIDER_COND_SKIP_NUM)
{
@@ -7503,7 +7991,7 @@ int spider_oracle_handler::append_sum_select(
for (item_sum_ptr = join->sum_funcs; *item_sum_ptr; ++item_sum_ptr)
{
if ((error_num = spider_db_oracle_utility.open_item_sum_func(*item_sum_ptr,
- spider, str, alias, alias_length)))
+ spider, str, alias, alias_length, FALSE, NULL)))
{
DBUG_RETURN(error_num);
}
@@ -7617,8 +8105,8 @@ int spider_oracle_handler::append_group_by(
str->q_append(SPIDER_SQL_GROUP_STR, SPIDER_SQL_GROUP_LEN);
for (; group; group = group->next)
{
- if ((error_num = spider_db_print_item_type((*group->item), spider, str,
- alias, alias_length, spider_dbton_oracle.dbton_id)))
+ if ((error_num = spider_db_print_item_type((*group->item), NULL, spider,
+ str, alias, alias_length, spider_dbton_oracle.dbton_id, FALSE, NULL)))
{
DBUG_RETURN(error_num);
}
@@ -7956,13 +8444,13 @@ int spider_oracle_handler::append_key_order_for_direct_order_limit_with_alias(
order = order->next)
{
if ((error_num =
- spider_db_print_item_type((*order->item), spider, &sql_part, alias,
- alias_length, spider_dbton_oracle.dbton_id)))
+ spider_db_print_item_type((*order->item), NULL, spider, &sql_part,
+ alias, alias_length, spider_dbton_oracle.dbton_id, FALSE, NULL)))
{
DBUG_PRINT("info",("spider error=%d", error_num));
DBUG_RETURN(error_num);
}
- if (order->asc)
+ if (SPIDER_order_direction_is_asc(order))
{
if (sql_part.reserve(SPIDER_SQL_COMMA_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
@@ -8047,13 +8535,13 @@ int spider_oracle_handler::append_key_order_for_direct_order_limit_with_alias(
order = order->next)
{
if ((error_num =
- spider_db_print_item_type((*order->item), spider, str, alias,
- alias_length, spider_dbton_oracle.dbton_id)))
+ spider_db_print_item_type((*order->item), NULL, spider, str, alias,
+ alias_length, spider_dbton_oracle.dbton_id, FALSE, NULL)))
{
DBUG_PRINT("info",("spider error=%d", error_num));
DBUG_RETURN(error_num);
}
- if (order->asc)
+ if (SPIDER_order_direction_is_asc(order))
{
if (str->reserve(SPIDER_SQL_COMMA_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
@@ -9659,49 +10147,49 @@ int spider_oracle_handler::append_explain_select(
********************************************************************/
bool spider_oracle_handler::is_sole_projection_field( uint16 field_index )
{
- // Determine whether the projection list consists solely of the field of interest
- bool is_field_in_projection_list = FALSE;
- TABLE* table = spider->get_table();
- uint16 projection_field_count = 0;
- uint16 projection_field_index;
- Field** field;
- DBUG_ENTER( "spider_oracle_handler::is_sole_projection_field" );
-
- for ( field = table->field; *field; field++ )
- {
- projection_field_index = ( *field )->field_index;
+ // Determine whether the projection list consists solely of the field of interest
+ bool is_field_in_projection_list = FALSE;
+ TABLE* table = spider->get_table();
+ uint16 projection_field_count = 0;
+ uint16 projection_field_index;
+ Field** field;
+ DBUG_ENTER( "spider_oracle_handler::is_sole_projection_field" );
- if ( !( minimum_select_bit_is_set( projection_field_index ) ) )
- {
- // Current field is not in the projection list
- continue;
- }
+ for ( field = table->field; *field; field++ )
+ {
+ projection_field_index = ( *field )->field_index;
- projection_field_count++;
+ if ( !( minimum_select_bit_is_set( projection_field_index ) ) )
+ {
+ // Current field is not in the projection list
+ continue;
+ }
- if ( !is_field_in_projection_list )
- {
- if (field_index == projection_field_index)
- {
- // Field of interest is in the projection list
- is_field_in_projection_list = TRUE;
- }
- }
+ projection_field_count++;
- if ( is_field_in_projection_list && ( projection_field_count != 1 ) )
- {
- // Field of interest is not the sole column in the projection list
- DBUG_RETURN( FALSE );
- }
+ if ( !is_field_in_projection_list )
+ {
+ if (field_index == projection_field_index)
+ {
+ // Field of interest is in the projection list
+ is_field_in_projection_list = TRUE;
+ }
}
- if ( is_field_in_projection_list && ( projection_field_count == 1 ) )
+ if ( is_field_in_projection_list && ( projection_field_count != 1 ) )
{
- // Field of interest is the only column in the projection list
- DBUG_RETURN( TRUE );
+ // Field of interest is not the sole column in the projection list
+ DBUG_RETURN( FALSE );
}
+ }
- DBUG_RETURN( FALSE );
+ if ( is_field_in_projection_list && ( projection_field_count == 1 ) )
+ {
+ // Field of interest is the only column in the projection list
+ DBUG_RETURN( TRUE );
+ }
+
+ DBUG_RETURN( FALSE );
}
bool spider_oracle_handler::is_bulk_insert_exec_period(
@@ -9879,8 +10367,14 @@ int spider_oracle_handler::mk_bulk_tmp_table_and_bulk_start()
DBUG_PRINT("info",("spider this=%p", this));
if (!upd_tmp_tbl)
{
+#ifdef SPIDER_use_LEX_CSTRING_for_Field_blob_constructor
+ LEX_CSTRING field_name = {STRING_WITH_LEN("a")};
+ if (!(upd_tmp_tbl = spider_mk_sys_tmp_table(
+ thd, table, &upd_tmp_tbl_prm, &field_name, update_sql.charset())))
+#else
if (!(upd_tmp_tbl = spider_mk_sys_tmp_table(
thd, table, &upd_tmp_tbl_prm, "a", update_sql.charset())))
+#endif
{
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
@@ -10173,6 +10667,53 @@ bool spider_oracle_handler::need_lock_before_set_sql_for_exec(
DBUG_RETURN(FALSE);
}
+#ifdef SPIDER_HAS_GROUP_BY_HANDLER
+int spider_oracle_handler::set_sql_for_exec(
+ ulong sql_type,
+ int link_idx,
+ SPIDER_LINK_IDX_CHAIN *link_idx_chain
+) {
+ int error_num;
+ SPIDER_RESULT_LIST *result_list = &spider->result_list;
+ int all_link_idx = spider->conn_link_idx[link_idx];
+ DBUG_ENTER("spider_oracle_handler::set_sql_for_exec");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (sql_type & SPIDER_SQL_TYPE_SELECT_SQL)
+ {
+ if (table_lock_mode)
+ {
+ spider_string *str = &result_list->insert_sqls[link_idx];
+ str->length(0);
+ if (str->reserve(SPIDER_SQL_LOCK_TABLE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_LOCK_TABLE_STR, SPIDER_SQL_LOCK_TABLE_LEN);
+ if ((error_num = oracle_share->append_table_name(str, all_link_idx)))
+ DBUG_RETURN(error_num);
+ if (table_lock_mode == SPIDER_LOCK_MODE_EXCLUSIVE)
+ {
+ if (str->reserve(SPIDER_SQL_LOCK_TABLE_EXCLUSIVE_MODE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_LOCK_TABLE_EXCLUSIVE_MODE_STR,
+ SPIDER_SQL_LOCK_TABLE_EXCLUSIVE_MODE_LEN);
+ } else if (table_lock_mode == SPIDER_LOCK_MODE_SHARED)
+ {
+ if (str->reserve(SPIDER_SQL_LOCK_TABLE_SHARE_MODE_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_LOCK_TABLE_SHARE_MODE_STR,
+ SPIDER_SQL_LOCK_TABLE_SHARE_MODE_LEN);
+ }
+ exec_lock_sql = str;
+ }
+
+ if ((error_num = spider_db_oracle_utility.reappend_tables(
+ spider->fields, link_idx_chain, &sql)))
+ DBUG_RETURN(error_num);
+ exec_sql = &sql;
+ }
+ DBUG_RETURN(0);
+}
+#endif
+
int spider_oracle_handler::set_sql_for_exec(
ulong sql_type,
int link_idx
@@ -12052,6 +12593,337 @@ int spider_oracle_handler::reset_union_table_name(
DBUG_RETURN(0);
}
+#ifdef SPIDER_HAS_GROUP_BY_HANDLER
+int spider_oracle_handler::append_from_and_tables_part(
+ spider_fields *fields,
+ ulong sql_type
+) {
+ int error_num;
+ spider_string *str;
+ SPIDER_TABLE_HOLDER *table_holder;
+ TABLE_LIST *table_list;
+ DBUG_ENTER("spider_oracle_handler::append_from_and_tables_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ str = &sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ fields->set_pos_to_first_table_holder();
+ table_holder = fields->get_next_table_holder();
+ table_list = table_holder->table->pos_in_table_list;
+ error_num = spider_db_oracle_utility.append_from_and_tables(fields, str,
+ table_list);
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_handler::reappend_tables_part(
+ spider_fields *fields,
+ ulong sql_type
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_oracle_handler::reappend_tables_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ str = &sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = spider_db_oracle_utility.reappend_tables(fields,
+ link_idx_chain, str);
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_handler::append_where_part(
+ ulong sql_type
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_oracle_handler::append_where_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ str = &sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = spider_db_oracle_utility.append_where(str);
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_handler::append_having_part(
+ ulong sql_type
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_oracle_handler::append_having_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ str = &sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = spider_db_oracle_utility.append_having(str);
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_handler::append_item_type_part(
+ Item *item,
+ const char *alias,
+ uint alias_length,
+ bool use_fields,
+ spider_fields *fields,
+ ulong sql_type
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_oracle_handler::append_item_type_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ str = &sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = spider_db_print_item_type(item, NULL, spider, str,
+ alias, alias_length, spider_dbton_oracle.dbton_id, use_fields, fields);
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_handler::append_list_item_select_part(
+ List<Item> *select,
+ const char *alias,
+ uint alias_length,
+ bool use_fields,
+ spider_fields *fields,
+ ulong sql_type
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_oracle_handler::append_list_item_select_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ str = &sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_list_item_select(select, str, alias, alias_length,
+ use_fields, fields);
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_handler::append_list_item_select(
+ List<Item> *select,
+ spider_string *str,
+ const char *alias,
+ uint alias_length,
+ bool use_fields,
+ spider_fields *fields
+) {
+ int error_num;
+ uint dbton_id = spider_dbton_oracle.dbton_id, length;
+ uint32 begin;
+ List_iterator_fast<Item> it(*select);
+ Item *item;
+ Field *field;
+ const char *item_name;
+ DBUG_ENTER("spider_oracle_handler::append_list_item_select");
+ DBUG_PRINT("info",("spider this=%p", this));
+ begin = str->length();
+ while ((item = it++))
+ {
+ if (item->const_item())
+ {
+ DBUG_PRINT("info",("spider const item"));
+ continue;
+ }
+ if ((error_num = spider_db_print_item_type(item, NULL, spider, str,
+ alias, alias_length, dbton_id, use_fields, fields)))
+ {
+ DBUG_RETURN(error_num);
+ }
+ field = *(fields->get_next_field_ptr());
+ if (field)
+ {
+ item_name = SPIDER_field_name_str(field);
+ length = SPIDER_field_name_length(field);
+ } else {
+ item_name = SPIDER_item_name_str(item);
+ length = SPIDER_item_name_length(item);
+ }
+ if (str->reserve(
+ SPIDER_SQL_COMMA_LEN + /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
+ SPIDER_SQL_SPACE_LEN + length
+ ))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
+ if ((error_num = spider_db_oracle_utility.append_name(str,
+ item_name, length)))
+ {
+ DBUG_RETURN(error_num);
+ }
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ if (begin == str->length())
+ {
+ /* no columns */
+ if (str->reserve(SPIDER_SQL_ONE_LEN))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ str->q_append(SPIDER_SQL_ONE_STR, SPIDER_SQL_ONE_LEN);
+ } else {
+ str->length(str->length() - SPIDER_SQL_COMMA_LEN);
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::append_group_by_part(
+ ORDER *order,
+ const char *alias,
+ uint alias_length,
+ bool use_fields,
+ spider_fields *fields,
+ ulong sql_type
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_oracle_handler::append_group_by_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ str = &sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_group_by(order, str, alias, alias_length,
+ use_fields, fields);
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_handler::append_group_by(
+ ORDER *order,
+ spider_string *str,
+ const char *alias,
+ uint alias_length,
+ bool use_fields,
+ spider_fields *fields
+) {
+ int error_num;
+ uint dbton_id = spider_dbton_oracle.dbton_id;
+ DBUG_ENTER("spider_oracle_handler::append_group_by");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (order)
+ {
+ if (str->reserve(SPIDER_SQL_GROUP_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_GROUP_STR, SPIDER_SQL_GROUP_LEN);
+ for (; order; order = order->next)
+ {
+ if ((error_num = spider_db_print_item_type((*order->item), NULL, spider,
+ str, alias, alias_length, dbton_id, use_fields, fields)))
+ {
+ DBUG_RETURN(error_num);
+ }
+ if (str->reserve(SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ str->length(str->length() - SPIDER_SQL_COMMA_LEN);
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_oracle_handler::append_order_by_part(
+ ORDER *order,
+ const char *alias,
+ uint alias_length,
+ bool use_fields,
+ spider_fields *fields,
+ ulong sql_type
+) {
+ int error_num;
+ spider_string *str;
+ DBUG_ENTER("spider_oracle_handler::append_order_by_part");
+ DBUG_PRINT("info",("spider this=%p", this));
+ switch (sql_type)
+ {
+ case SPIDER_SQL_TYPE_SELECT_SQL:
+ str = &sql;
+ break;
+ default:
+ DBUG_RETURN(0);
+ }
+ error_num = append_order_by(order, str, alias, alias_length,
+ use_fields, fields);
+ DBUG_RETURN(error_num);
+}
+
+int spider_oracle_handler::append_order_by(
+ ORDER *order,
+ spider_string *str,
+ const char *alias,
+ uint alias_length,
+ bool use_fields,
+ spider_fields *fields
+) {
+ int error_num;
+ uint dbton_id = spider_dbton_oracle.dbton_id;
+ DBUG_ENTER("spider_oracle_handler::append_order_by");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (order)
+ {
+ if (str->reserve(SPIDER_SQL_ORDER_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_ORDER_STR, SPIDER_SQL_ORDER_LEN);
+ for (; order; order = order->next)
+ {
+ if ((error_num = spider_db_print_item_type((*order->item), NULL, spider,
+ str, alias, alias_length, dbton_id, use_fields, fields)))
+ {
+ DBUG_RETURN(error_num);
+ }
+#ifdef SPIDER_ORDER_HAS_ENUM_ORDER
+ if (order->direction == ORDER::ORDER_DESC)
+#else
+ if (!order->asc)
+#endif
+ {
+ if (str->reserve(SPIDER_SQL_COMMA_LEN + SPIDER_SQL_DESC_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_DESC_STR, SPIDER_SQL_DESC_LEN);
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ } else {
+ if (str->reserve(SPIDER_SQL_COMMA_LEN))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
+ }
+ }
+ str->length(str->length() - SPIDER_SQL_COMMA_LEN);
+ }
+ DBUG_RETURN(0);
+}
+#endif
+
spider_oracle_copy_table::spider_oracle_copy_table(
spider_oracle_share *db_share
) : spider_db_copy_table(
@@ -12136,7 +13008,7 @@ int spider_oracle_copy_table::append_table_columns(
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
sql.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
if ((error_num = spider_db_append_name_with_quote_str(&sql,
- (char *) (*field)->field_name, spider_dbton_oracle.dbton_id)))
+ (*field)->field_name, spider_dbton_oracle.dbton_id)))
DBUG_RETURN(error_num);
if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN + SPIDER_SQL_COMMA_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
@@ -12282,7 +13154,7 @@ int spider_oracle_copy_table::append_key_order_str(
sql_part.q_append(SPIDER_SQL_NAME_QUOTE_STR,
SPIDER_SQL_NAME_QUOTE_LEN);
if ((error_num = spider_db_append_name_with_quote_str(&sql_part,
- (char *) field->field_name, spider_dbton_oracle.dbton_id)))
+ field->field_name, spider_dbton_oracle.dbton_id)))
DBUG_RETURN(error_num);
if (key_part->key_part_flag & HA_REVERSE_SORT)
{
@@ -12316,7 +13188,7 @@ int spider_oracle_copy_table::append_key_order_str(
sql_part.q_append(SPIDER_SQL_NAME_QUOTE_STR,
SPIDER_SQL_NAME_QUOTE_LEN);
if ((error_num = spider_db_append_name_with_quote_str(&sql_part,
- (char *) field->field_name, spider_dbton_oracle.dbton_id)))
+ field->field_name, spider_dbton_oracle.dbton_id)))
DBUG_RETURN(error_num);
if (key_part->key_part_flag & HA_REVERSE_SORT)
{
@@ -12380,7 +13252,7 @@ int spider_oracle_copy_table::append_key_order_str(
sql.q_append(SPIDER_SQL_NAME_QUOTE_STR,
SPIDER_SQL_NAME_QUOTE_LEN);
if ((error_num = spider_db_append_name_with_quote_str(&sql,
- (char *) field->field_name, spider_dbton_oracle.dbton_id)))
+ field->field_name, spider_dbton_oracle.dbton_id)))
DBUG_RETURN(error_num);
if (key_part->key_part_flag & HA_REVERSE_SORT)
{
@@ -12413,7 +13285,7 @@ int spider_oracle_copy_table::append_key_order_str(
sql.q_append(SPIDER_SQL_NAME_QUOTE_STR,
SPIDER_SQL_NAME_QUOTE_LEN);
if ((error_num = spider_db_append_name_with_quote_str(&sql,
- (char *) field->field_name, spider_dbton_oracle.dbton_id)))
+ field->field_name, spider_dbton_oracle.dbton_id)))
DBUG_RETURN(error_num);
if (key_part->key_part_flag & HA_REVERSE_SORT)
{
@@ -12621,7 +13493,7 @@ int spider_oracle_copy_table::copy_key_row(
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
sql.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
if ((error_num = spider_db_append_name_with_quote_str(&sql,
- (char *) field->field_name, spider_dbton_oracle.dbton_id)))
+ field->field_name, spider_dbton_oracle.dbton_id)))
DBUG_RETURN(error_num);
if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN + joint_length + *length +
SPIDER_SQL_AND_LEN))
diff --git a/storage/spider/spd_db_oracle.h b/storage/spider/spd_db_oracle.h
index f10a8cf8839..28836f9e340 100644
--- a/storage/spider/spd_db_oracle.h
+++ b/storage/spider/spd_db_oracle.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2012-2014 Kentoku Shiba
+/* Copyright (C) 2012-2018 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
@@ -102,7 +102,9 @@ public:
ha_spider *spider,
spider_string *str,
const char *alias,
- uint alias_length
+ uint alias_length,
+ bool use_fields,
+ spider_fields *fields
);
#ifdef HANDLER_HAS_DIRECT_AGGREGATE
int open_item_sum_func(
@@ -110,7 +112,9 @@ public:
ha_spider *spider,
spider_string *str,
const char *alias,
- uint alias_length
+ uint alias_length,
+ bool use_fields,
+ spider_fields *fields
);
#endif
size_t escape_string(
@@ -123,6 +127,26 @@ public:
spider_string *to,
String *from
);
+#ifdef SPIDER_HAS_GROUP_BY_HANDLER
+ int append_from_and_tables(
+ ha_spider *spider,
+ spider_fields *fields,
+ spider_string *str,
+ TABLE_LIST *table_list,
+ uint table_count
+ );
+ int reappend_tables(
+ spider_fields *fields,
+ SPIDER_LINK_IDX_CHAIN *link_idx_chain,
+ spider_string *str
+ );
+ int append_where(
+ spider_string *str
+ );
+ int append_having(
+ spider_string *str
+ );
+#endif
};
class spider_db_oracle_row: public spider_db_row
@@ -144,6 +168,7 @@ public:
ub2 *coltp;
ub2 *colsz;
uint field_count;
+ uint record_size;
ulong *row_size;
ulong *row_size_first;
CHARSET_INFO *access_charset;
@@ -177,6 +202,7 @@ public:
TABLE *tmp_table,
spider_string *str
);
+ uint get_byte_size();
/* for oracle */
int init();
void deinit();
@@ -195,7 +221,7 @@ public:
spider_db_oracle_row row;
int store_error_num;
- spider_db_oracle_result();
+ spider_db_oracle_result(SPIDER_DB_CONN *in_db_conn);
~spider_db_oracle_result();
bool has_result();
void free_result();
@@ -409,6 +435,17 @@ public:
Time_zone *time_zone,
int *need_mon
);
+ int show_master_status(
+ SPIDER_TRX *trx,
+ SPIDER_SHARE *share,
+ int all_link_idx,
+ int *need_mon,
+ TABLE *table,
+ spider_string *str,
+ int mode,
+ SPIDER_DB_RESULT **res1,
+ SPIDER_DB_RESULT **res2
+ );
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
int append_sql(
char *sql,
@@ -586,7 +623,9 @@ class spider_oracle_handler: public spider_db_handler
int where_pos;
int order_pos;
int limit_pos;
+public:
int table_name_pos;
+private:
int update_set_pos;
int ha_read_pos;
int ha_next_pos;
@@ -634,6 +673,11 @@ public:
);
~spider_oracle_handler();
int init();
+ int spider_oracle_handler::append_index_hint(
+ spider_string *str,
+ int link_idx,
+ ulong sql_type
+ );
int append_table_name_with_adjusting(
spider_string *str,
int link_idx,
@@ -1209,7 +1253,7 @@ public:
int link_idx
);
bool is_sole_projection_field(
- uint16 field_index
+ uint16 field_index
);
bool is_bulk_insert_exec_period(
bool bulk_end
@@ -1279,6 +1323,13 @@ public:
bool need_lock_before_set_sql_for_exec(
ulong sql_type
);
+#ifdef SPIDER_HAS_GROUP_BY_HANDLER
+ int set_sql_for_exec(
+ ulong sql_type,
+ int link_idx,
+ SPIDER_LINK_IDX_CHAIN *link_idx_chain
+ );
+#endif
int set_sql_for_exec(
ulong sql_type,
int link_idx
@@ -1393,6 +1444,78 @@ public:
int link_idx,
ulong sql_type
);
+#ifdef SPIDER_HAS_GROUP_BY_HANDLER
+ int append_from_and_tables_part(
+ spider_fields *fields,
+ ulong sql_type
+ );
+ int reappend_tables_part(
+ spider_fields *fields,
+ ulong sql_type
+ );
+ int append_where_part(
+ ulong sql_type
+ );
+ int append_having_part(
+ ulong sql_type
+ );
+ int append_item_type_part(
+ Item *item,
+ const char *alias,
+ uint alias_length,
+ bool use_fields,
+ spider_fields *fields,
+ ulong sql_type
+ );
+ int append_list_item_select_part(
+ List<Item> *select,
+ const char *alias,
+ uint alias_length,
+ bool use_fields,
+ spider_fields *fields,
+ ulong sql_type
+ );
+ int append_list_item_select(
+ List<Item> *select,
+ spider_string *str,
+ const char *alias,
+ uint alias_length,
+ bool use_fields,
+ spider_fields *fields
+ );
+ int append_group_by_part(
+ ORDER *order,
+ const char *alias,
+ uint alias_length,
+ bool use_fields,
+ spider_fields *fields,
+ ulong sql_type
+ );
+ int append_group_by(
+ ORDER *order,
+ spider_string *str,
+ const char *alias,
+ uint alias_length,
+ bool use_fields,
+ spider_fields *fields
+ );
+ int append_order_by_part(
+ ORDER *order,
+ const char *alias,
+ uint alias_length,
+ bool use_fields,
+ spider_fields *fields,
+ ulong sql_type
+ );
+ int append_order_by(
+ ORDER *order,
+ spider_string *str,
+ const char *alias,
+ uint alias_length,
+ bool use_fields,
+ spider_fields *fields
+ );
+#endif
};
class spider_oracle_copy_table: public spider_db_copy_table
diff --git a/storage/spider/spd_direct_sql.cc b/storage/spider/spd_direct_sql.cc
index 3b6d167d14b..7237d0877a7 100644
--- a/storage/spider/spd_direct_sql.cc
+++ b/storage/spider/spd_direct_sql.cc
@@ -1,4 +1,4 @@
-/* Copyright (C) 2009-2015 Kentoku Shiba
+/* Copyright (C) 2009-2018 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
@@ -14,7 +14,9 @@
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */
#define MYSQL_SERVER 1
+#include <my_global.h>
#include "mysql_version.h"
+#include "spd_environ.h"
#if MYSQL_VERSION_ID < 50500
#include "mysql_priv.h"
#include <mysql/plugin.h>
@@ -25,6 +27,7 @@
#include "sql_partition.h"
#include "sql_base.h"
#include "sql_servers.h"
+#include "tztime.h"
#endif
#include "spd_err.h"
#include "spd_param.h"
@@ -57,7 +60,14 @@ extern PSI_cond_key spd_key_cond_bg_direct_sql;
#endif
extern HASH spider_open_connections;
+extern HASH spider_ipport_conns;
extern pthread_mutex_t spider_conn_mutex;
+extern pthread_mutex_t spider_conn_id_mutex;
+extern pthread_mutex_t spider_ipport_conn_mutex;
+extern ulonglong spider_conn_id;
+
+/* UTC time zone for timestamp columns */
+extern Time_zone *UTC;
uint spider_udf_calc_hash(
char *key,
@@ -126,7 +136,7 @@ int spider_udf_direct_sql_create_table_list(
&direct_sql->tables, sizeof(TABLE*) * table_count,
&tmp_name_ptr, sizeof(char) * (
table_name_list_length +
- thd->db_length * table_count +
+ SPIDER_THD_db_length(thd) * table_count +
2 * table_count
),
&direct_sql->iop, sizeof(int) * table_count,
@@ -157,11 +167,11 @@ int spider_udf_direct_sql_create_table_list(
tmp_name_ptr += length + 1;
tmp_ptr = tmp_ptr3 + 1;
} else {
- if (thd->db)
+ if (SPIDER_THD_db_str(thd))
{
- memcpy(tmp_name_ptr, thd->db,
- thd->db_length + 1);
- tmp_name_ptr += thd->db_length + 1;
+ memcpy(tmp_name_ptr, SPIDER_THD_db_str(thd),
+ SPIDER_THD_db_length(thd) + 1);
+ tmp_name_ptr += SPIDER_THD_db_length(thd) + 1;
} else {
direct_sql->db_names[roop_count] = (char *) "";
}
@@ -349,6 +359,27 @@ int spider_udf_direct_sql_create_conn_key(
#endif
}
}
+ if (direct_sql->dbton_id == SPIDER_DBTON_SIZE)
+ {
+#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
+ if (direct_sql->access_mode == 0)
+ {
+#endif
+ my_printf_error(
+ ER_SPIDER_SQL_WRAPPER_IS_INVALID_NUM,
+ ER_SPIDER_SQL_WRAPPER_IS_INVALID_STR,
+ MYF(0), direct_sql->tgt_wrapper);
+ DBUG_RETURN(ER_SPIDER_SQL_WRAPPER_IS_INVALID_NUM);
+#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
+ } else {
+ my_printf_error(
+ ER_SPIDER_NOSQL_WRAPPER_IS_INVALID_NUM,
+ ER_SPIDER_NOSQL_WRAPPER_IS_INVALID_STR,
+ MYF(0), direct_sql->tgt_wrapper);
+ DBUG_RETURN(ER_SPIDER_NOSQL_WRAPPER_IS_INVALID_NUM);
+ }
+#endif
+ }
#ifdef SPIDER_HAS_HASH_VALUE_TYPE
direct_sql->conn_key_hash_value = my_calc_hash(&spider_open_connections,
(uchar*) direct_sql->conn_key, direct_sql->conn_key_length);
@@ -361,24 +392,24 @@ SPIDER_CONN *spider_udf_direct_sql_create_conn(
int *error_num
) {
SPIDER_CONN *conn;
+ SPIDER_IP_PORT_CONN *ip_port_conn;
char *tmp_name, *tmp_host, *tmp_username, *tmp_password, *tmp_socket;
char *tmp_wrapper, *tmp_ssl_ca, *tmp_ssl_capath, *tmp_ssl_cert;
char *tmp_ssl_cipher, *tmp_ssl_key, *tmp_default_file, *tmp_default_group;
int *need_mon;
DBUG_ENTER("spider_udf_direct_sql_create_conn");
+ if (unlikely(!UTC))
+ {
+ /* UTC time zone for timestamp columns */
+ String tz_00_name(STRING_WITH_LEN("+00:00"), &my_charset_bin);
+ UTC = my_tz_find(current_thd, &tz_00_name);
+ }
+
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
if (direct_sql->access_mode == 0)
{
#endif
- if (direct_sql->dbton_id == SPIDER_DBTON_SIZE)
- {
- /* Invalid target wrapper */
- *error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM;
- my_printf_error(*error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR,
- MYF(0), direct_sql->tgt_wrapper);
- goto error_alloc_conn;
- }
if (!(conn = (SPIDER_CONN *)
spider_bulk_malloc(spider_current_trx, 32, MYF(MY_WME | MY_ZEROFILL),
&conn, sizeof(*conn),
@@ -406,14 +437,6 @@ SPIDER_CONN *spider_udf_direct_sql_create_conn(
conn->default_database.init_calc_mem(138);
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
} else {
- if (direct_sql->dbton_id == SPIDER_DBTON_SIZE)
- {
- /* Invalid target wrapper */
- *error_num = ER_SPIDER_NOSQL_WRAPPER_IS_INVALID_NUM;
- my_printf_error(*error_num, ER_SPIDER_NOSQL_WRAPPER_IS_INVALID_STR,
- MYF(0), direct_sql->tgt_wrapper);
- goto error_alloc_conn;
- }
if (!(conn = (SPIDER_CONN *)
spider_bulk_malloc(spider_current_trx, 33, MYF(MY_WME | MY_ZEROFILL),
&conn, sizeof(*conn),
@@ -574,12 +597,57 @@ SPIDER_CONN *spider_udf_direct_sql_create_conn(
goto error;
conn->ping_time = (time_t) time((time_t*) 0);
conn->connect_error_time = conn->ping_time;
+ pthread_mutex_lock(&spider_conn_id_mutex);
+ conn->conn_id = spider_conn_id;
+ ++spider_conn_id;
+ pthread_mutex_unlock(&spider_conn_id_mutex);
+
+ pthread_mutex_lock(&spider_ipport_conn_mutex);
+#ifdef SPIDER_HAS_HASH_VALUE_TYPE
+ if ((ip_port_conn = (SPIDER_IP_PORT_CONN*) my_hash_search_using_hash_value(
+ &spider_ipport_conns, conn->conn_key_hash_value,
+ (uchar*)conn->conn_key, conn->conn_key_length)))
+#else
+ if ((ip_port_conn = (SPIDER_IP_PORT_CONN*) my_hash_search(
+ &spider_ipport_conns, (uchar*)conn->conn_key, conn->conn_key_length)))
+#endif
+ { /* exists, +1 */
+ pthread_mutex_unlock(&spider_ipport_conn_mutex);
+ pthread_mutex_lock(&ip_port_conn->mutex);
+ if (spider_param_max_connections())
+ { /* enable conncetion pool */
+ if (ip_port_conn->ip_port_count >= spider_param_max_connections())
+ { /* bigger than the max num of connections, free conn and return NULL */
+ pthread_mutex_unlock(&ip_port_conn->mutex);
+ goto error_too_many_ipport_count;
+ }
+ }
+ ip_port_conn->ip_port_count++;
+ pthread_mutex_unlock(&ip_port_conn->mutex);
+ }
+ else
+ {// do not exist
+ ip_port_conn = spider_create_ipport_conn(conn);
+ if (!ip_port_conn) {
+ /* failed, always do not effect 'create conn' */
+ pthread_mutex_unlock(&spider_ipport_conn_mutex);
+ DBUG_RETURN(conn);
+ }
+ if (my_hash_insert(&spider_ipport_conns, (uchar *)ip_port_conn)) {
+ /* insert failed, always do not effect 'create conn' */
+ pthread_mutex_unlock(&spider_ipport_conn_mutex);
+ DBUG_RETURN(conn);
+ }
+ pthread_mutex_unlock(&spider_ipport_conn_mutex);
+ }
+ conn->ip_port_conn = ip_port_conn;
DBUG_RETURN(conn);
error:
DBUG_ASSERT(!conn->mta_conn_mutex_file_pos.file_name);
pthread_mutex_destroy(&conn->mta_conn_mutex);
+error_too_many_ipport_count:
error_mta_conn_mutex_init:
error_db_conn_init:
delete conn->db_conn;
@@ -919,8 +987,7 @@ error:
start_ptr, TRUE, &param_string_parse))) \
direct_sql->SPIDER_PARAM_STR_LEN(param_name) = \
strlen(direct_sql->param_name); \
- else \
- { \
+ else { \
error_num = param_string_parse.print_param_error(); \
goto error; \
} \
@@ -1273,10 +1340,10 @@ int spider_udf_set_direct_sql_param_default(
if (!direct_sql->tgt_default_db_name)
{
DBUG_PRINT("info",("spider create default tgt_default_db_name"));
- direct_sql->tgt_default_db_name_length = trx->thd->db_length;
+ direct_sql->tgt_default_db_name_length = SPIDER_THD_db_length(trx->thd);
if (
!(direct_sql->tgt_default_db_name = spider_create_string(
- trx->thd->db,
+ SPIDER_THD_db_str(trx->thd),
direct_sql->tgt_default_db_name_length))
) {
my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
@@ -1612,6 +1679,15 @@ long long spider_direct_sql_body(
goto error;
}
}
+#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
+ if (trx->trx_start && direct_sql->access_mode != 1)
+ {
+#endif
+ trx->updated_in_this_trx = TRUE;
+ DBUG_PRINT("info",("spider trx->updated_in_this_trx=TRUE"));
+#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
+ }
+#endif
#if MYSQL_VERSION_ID < 50500
#else
use_real_table = spider_param_udf_ds_use_real_table(thd,
@@ -1620,17 +1696,32 @@ long long spider_direct_sql_body(
for (roop_count = 0; roop_count < direct_sql->table_count; roop_count++)
{
#ifdef SPIDER_NEED_INIT_ONE_TABLE_FOR_FIND_TEMPORARY_TABLE
+#ifdef SPIDER_use_LEX_CSTRING_for_database_tablename_alias
+ LEX_CSTRING db_name =
+ {
+ direct_sql->db_names[roop_count],
+ strlen(direct_sql->db_names[roop_count])
+ };
+ LEX_CSTRING tbl_name =
+ {
+ direct_sql->table_names[roop_count],
+ strlen(direct_sql->table_names[roop_count])
+ };
+ table_list.init_one_table(&db_name, &tbl_name, 0, TL_WRITE);
+#else
table_list.init_one_table(direct_sql->db_names[roop_count],
strlen(direct_sql->db_names[roop_count]),
direct_sql->table_names[roop_count],
strlen(direct_sql->table_names[roop_count]),
direct_sql->table_names[roop_count], TL_WRITE);
+#endif
#else
- table_list.db = direct_sql->db_names[roop_count];
- table_list.table_name = direct_sql->table_names[roop_count];
+ SPIDER_TABLE_LIST_db_str(&table_list) = direct_sql->db_names[roop_count];
+ SPIDER_TABLE_LIST_table_name_str(&table_list) =
+ direct_sql->table_names[roop_count];
#endif
if (!(direct_sql->tables[roop_count] =
- thd->find_temporary_table(&table_list)))
+ spider_find_temporary_table(thd, &table_list)))
{
#if MYSQL_VERSION_ID < 50500
#else
@@ -1640,17 +1731,28 @@ long long spider_direct_sql_body(
error_num = ER_SPIDER_UDF_TMP_TABLE_NOT_FOUND_NUM;
my_printf_error(ER_SPIDER_UDF_TMP_TABLE_NOT_FOUND_NUM,
ER_SPIDER_UDF_TMP_TABLE_NOT_FOUND_STR,
- MYF(0), table_list.db, table_list.table_name);
+ MYF(0), SPIDER_TABLE_LIST_db_str(&table_list),
+ SPIDER_TABLE_LIST_table_name_str(&table_list));
goto error;
#if MYSQL_VERSION_ID < 50500
#else
}
TABLE_LIST *tables = &direct_sql->table_list[roop_count];
- tables->init_one_table(table_list.db, strlen(table_list.db),
- table_list.table_name, strlen(table_list.table_name),
- table_list.table_name, TL_WRITE);
- tables->mdl_request.init(MDL_key::TABLE, table_list.db,
- table_list.table_name, MDL_SHARED_WRITE, MDL_TRANSACTION);
+#ifdef SPIDER_use_LEX_CSTRING_for_database_tablename_alias
+ table_list.init_one_table(
+ &table_list.db, &table_list.table_name, 0, TL_WRITE);
+#else
+ tables->init_one_table(
+ SPIDER_TABLE_LIST_db_str(&table_list),
+ SPIDER_TABLE_LIST_db_length(&table_list),
+ SPIDER_TABLE_LIST_table_name_str(&table_list),
+ SPIDER_TABLE_LIST_table_name_length(&table_list),
+ SPIDER_TABLE_LIST_table_name_str(&table_list), TL_WRITE);
+#endif
+ tables->mdl_request.init(MDL_key::TABLE,
+ SPIDER_TABLE_LIST_db_str(&table_list),
+ SPIDER_TABLE_LIST_table_name_str(&table_list),
+ MDL_SHARED_WRITE, MDL_TRANSACTION);
if (!direct_sql->table_list_first)
{
direct_sql->table_list_first = tables;
diff --git a/storage/spider/spd_environ.h b/storage/spider/spd_environ.h
new file mode 100644
index 00000000000..ded2927482b
--- /dev/null
+++ b/storage/spider/spd_environ.h
@@ -0,0 +1,54 @@
+/* Copyright (C) 2008-2018 Kentoku Shiba & 2017 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 functionality offered by MySQL or MariaDB
+*/
+
+#ifndef SPD_ENVIRON_INCLUDED
+
+#if (defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100000)
+#define SPIDER_HANDLER_START_BULK_INSERT_HAS_FLAGS
+#endif
+
+#if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100100
+#define SPIDER_SUPPORT_CREATE_OR_REPLACE_TABLE
+#define SPIDER_NET_HAS_THD
+#endif
+
+#if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100211
+#define HANDLER_HAS_TOP_TABLE_FIELDS
+#define HANDLER_HAS_DIRECT_UPDATE_ROWS
+#define HANDLER_HAS_DIRECT_AGGREGATE
+#define PARTITION_HAS_GET_CHILD_HANDLERS
+#define PARTITION_HAS_GET_PART_SPEC
+#define HA_EXTRA_HAS_STARTING_ORDERED_INDEX_SCAN
+#define HANDLER_HAS_NEED_INFO_FOR_AUTO_INC
+#define HANDLER_HAS_CAN_USE_FOR_AUTO_INC_INIT
+#endif
+
+#if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100300
+#define SPIDER_UPDATE_ROW_HAS_CONST_NEW_DATA
+#endif
+
+#if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100309
+#define SPIDER_MDEV_16246
+#endif
+
+#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
+#endif
+#endif /* SPD_ENVIRON_INCLUDED */
diff --git a/storage/spider/spd_err.h b/storage/spider/spd_err.h
index 4a2fb6b1af5..a80d903bd6e 100644
--- a/storage/spider/spd_err.h
+++ b/storage/spider/spd_err.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2008-2014 Kentoku Shiba
+/* Copyright (C) 2008-2017 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
@@ -21,10 +21,10 @@
#define ER_SPIDER_INVALID_UDF_PARAM_STR "The UDF parameter '%-.64s' is invalid"
#define ER_SPIDER_DIFFERENT_LINK_COUNT_NUM 12504
#define ER_SPIDER_DIFFERENT_LINK_COUNT_STR "Different multiple table link parameter's count"
-#define ER_SPIDER_UDF_PING_TABLE_PARAM_TOO_LONG_NUM 12505
-#define ER_SPIDER_UDF_PING_TABLE_PARAM_TOO_LONG_STR "Server name or table name are too long"
-#define ER_SPIDER_UDF_PING_TABLE_PARAM_REQIRED_NUM 12506
-#define ER_SPIDER_UDF_PING_TABLE_PARAM_REQIRED_STR "Server name or table name are required"
+#define ER_SPIDER_UDF_PARAM_TOO_LONG_NUM 12505
+#define ER_SPIDER_UDF_PARAM_TOO_LONG_STR "The UDF parameter '%-.64s' is too long"
+#define ER_SPIDER_UDF_PARAM_REQIRED_NUM 12506
+#define ER_SPIDER_UDF_PARAM_REQIRED_STR "The UDF parameter '%-.64s' is required"
#define ER_SPIDER_UDF_CANT_USE_IF_OPEN_TABLE_NUM 12507
#define ER_SPIDER_UDF_CANT_USE_IF_OPEN_TABLE_STR "This UDF can't execute if other tables are opened"
#define ER_SPIDER_UDF_CANT_USE_IF_OPEN_TABLE_STR_WITH_NUM "This UDF can't execute if other tables are opened '%s'=%lld"
@@ -65,6 +65,10 @@
#define ER_SPIDER_CANT_OPEN_SYS_TABLE_STR "Can't open system table %s.%s"
#define ER_SPIDER_LINK_MON_JUST_NG_NUM 12525
#define ER_SPIDER_LINK_MON_JUST_NG_STR "Table '%s.%s' just got a problem"
+#define ER_SPIDER_INVALID_CONNECT_INFO_START_WITH_NUM_NUM 12526
+#define ER_SPIDER_INVALID_CONNECT_INFO_START_WITH_NUM_STR "The connect info '%-.64s' for %s cannot start with number"
+#define ER_SPIDER_INVALID_CONNECT_INFO_SAME_NUM 12527
+#define ER_SPIDER_INVALID_CONNECT_INFO_SAME_STR "The connect info '%-.64s' for %s cannot use same name in same table"
#define ER_SPIDER_CANT_USE_BOTH_INNER_XA_AND_SNAPSHOT_NUM 12601
#define ER_SPIDER_CANT_USE_BOTH_INNER_XA_AND_SNAPSHOT_STR "Can't use both spider_use_consistent_snapshot = 1 and spider_internal_xa = 1"
@@ -116,6 +120,10 @@
#define ER_SPIDER_ORACLE_STR "Error from Oracle %d %d %s"
#define ER_SPIDER_ORACLE_NUM 12712
#define ER_SPIDER_ORACLE_ERR "Oracle error"
+#define ER_SPIDER_CON_COUNT_ERROR 12713
+#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_COND_SKIP_NUM 12801
#define ER_SPIDER_UNKNOWN_NUM 12500
diff --git a/storage/spider/spd_group_by_handler.cc b/storage/spider/spd_group_by_handler.cc
new file mode 100644
index 00000000000..8bd0eca507f
--- /dev/null
+++ b/storage/spider/spd_group_by_handler.cc
@@ -0,0 +1,2129 @@
+/* Copyright (C) 2008-2018 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
+ 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
+#include <my_global.h>
+#include "mysql_version.h"
+#include "spd_environ.h"
+#if MYSQL_VERSION_ID < 50500
+#include "mysql_priv.h"
+#include <mysql/plugin.h>
+#else
+#include "sql_priv.h"
+#include "probes_mysql.h"
+#include "sql_class.h"
+#include "sql_partition.h"
+#include "ha_partition.h"
+#endif
+#include "sql_common.h"
+#include <errmsg.h>
+#include "spd_err.h"
+#include "spd_param.h"
+#include "spd_db_include.h"
+#include "spd_include.h"
+#include "ha_spider.h"
+#include "spd_conn.h"
+#include "spd_db_conn.h"
+#include "spd_malloc.h"
+#include "spd_table.h"
+#include "spd_ping_table.h"
+#include "spd_group_by_handler.h"
+
+extern handlerton *spider_hton_ptr;
+extern SPIDER_DBTON spider_dbton[SPIDER_DBTON_SIZE];
+
+spider_fields::spider_fields() :
+ dbton_count(0), current_dbton_num(0),
+ table_count(0), current_table_num(0), table_holder(NULL),
+ first_link_idx_chain(NULL), last_link_idx_chain(NULL), current_link_idx_chain(NULL),
+ first_conn_holder(NULL), last_conn_holder(NULL), current_conn_holder(NULL),
+ first_field_holder(NULL), last_field_holder(NULL), current_field_holder(NULL),
+ first_field_chain(NULL), last_field_chain(NULL), current_field_chain(NULL)
+{
+ DBUG_ENTER("spider_fields::spider_fields");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_VOID_RETURN;
+}
+
+spider_fields::~spider_fields()
+{
+ DBUG_ENTER("spider_fields::~spider_fields");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (first_link_idx_chain)
+ {
+ while ((current_link_idx_chain = first_link_idx_chain))
+ {
+ first_link_idx_chain = current_link_idx_chain->next;
+ spider_free(spider_current_trx, current_link_idx_chain, MYF(0));
+ }
+ }
+ if (first_field_chain)
+ {
+ while ((current_field_chain = first_field_chain))
+ {
+ first_field_chain = current_field_chain->next;
+ spider_free(spider_current_trx, current_field_chain, MYF(0));
+ }
+ }
+ if (first_field_holder)
+ {
+ while ((current_field_holder = first_field_holder))
+ {
+ first_field_holder = current_field_holder->next;
+ spider_free(spider_current_trx, current_field_holder, MYF(0));
+ }
+ }
+ if (table_holder)
+ spider_free(spider_current_trx, table_holder, MYF(0));
+ if (first_conn_holder)
+ {
+ while ((current_conn_holder = first_conn_holder))
+ {
+ first_conn_holder = current_conn_holder->next;
+ free_conn_holder(current_conn_holder);
+ }
+ }
+ DBUG_VOID_RETURN;
+}
+
+void spider_fields::add_dbton_id(
+ uint dbton_id_arg
+) {
+ uint roop_count;
+ DBUG_ENTER("spider_fields::add_dbton_id");
+ DBUG_PRINT("info",("spider this=%p", this));
+ for (roop_count = 0; roop_count < dbton_count; ++roop_count)
+ {
+ if (dbton_ids[roop_count] == dbton_id_arg)
+ {
+ DBUG_VOID_RETURN;
+ }
+ }
+ dbton_ids[roop_count] = dbton_id_arg;
+ ++dbton_count;
+ DBUG_VOID_RETURN;
+}
+
+void spider_fields::set_pos_to_first_dbton_id(
+) {
+ DBUG_ENTER("spider_fields::set_pos_to_first_dbton_id");
+ DBUG_PRINT("info",("spider this=%p", this));
+ current_dbton_num = 0;
+ DBUG_VOID_RETURN;
+}
+
+uint spider_fields::get_next_dbton_id(
+) {
+ uint return_dbton_id;
+ DBUG_ENTER("spider_fields::get_next_dbton_id");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (current_dbton_num >= dbton_count)
+ DBUG_RETURN(SPIDER_DBTON_SIZE);
+ return_dbton_id = dbton_ids[current_dbton_num];
+ ++current_dbton_num;
+ DBUG_RETURN(return_dbton_id);
+}
+
+int spider_fields::make_link_idx_chain(
+ int link_status
+) {
+ uint roop_count, roop_count2;
+ SPIDER_CONN *conn;
+ SPIDER_CONN_HOLDER *conn_holder;
+ SPIDER_TABLE_LINK_IDX_HOLDER *table_link_idx_holder;
+ SPIDER_LINK_IDX_HOLDER *link_idx_holder, *add_link_idx_holder,
+ *dup_link_idx_holder, *current_link_idx_holder;
+ ha_spider *spider;
+ SPIDER_LINK_IDX_CHAIN *link_idx_chain;
+ SPIDER_SHARE *share;
+ DBUG_ENTER("spider_fields::make_link_idx_chain");
+ DBUG_PRINT("info",("spider this=%p", this));
+ conn_holder = first_conn_holder;
+ bool has_remain, skip;
+ do {
+ for (roop_count2 = 0; roop_count2 < table_count; ++roop_count2)
+ {
+ table_link_idx_holder = &conn_holder->table_link_idx_holder[roop_count2];
+ link_idx_holder = table_link_idx_holder->first_link_idx_holder;
+ dup_link_idx_holder = NULL;
+ for (roop_count = 0;
+ roop_count < conn_holder->link_idx_holder_count_max - 1; ++roop_count)
+ {
+ if (!link_idx_holder->next)
+ {
+ DBUG_PRINT("info",("spider fill link_idx_holder for %u",
+ roop_count2));
+ if (!(add_link_idx_holder = create_link_idx_holder()))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ dup_link_idx_holder = get_dup_link_idx_holder(
+ table_link_idx_holder, dup_link_idx_holder);
+ add_link_idx_holder->table_link_idx_holder =
+ dup_link_idx_holder->table_link_idx_holder;
+ add_link_idx_holder->link_idx = dup_link_idx_holder->link_idx;
+ add_link_idx_holder->link_status = dup_link_idx_holder->link_status;
+ link_idx_holder->next = add_link_idx_holder;
+ }
+ link_idx_holder = link_idx_holder->next;
+ }
+ }
+
+ for (roop_count2 = 0; roop_count2 < table_count; ++roop_count2)
+ {
+ table_link_idx_holder = &conn_holder->table_link_idx_holder[roop_count2];
+ table_link_idx_holder->current_link_idx_holder =
+ table_link_idx_holder->first_link_idx_holder;
+ }
+ for (roop_count = 0;
+ roop_count < conn_holder->link_idx_holder_count_max; ++roop_count)
+ {
+ link_idx_holder = NULL;
+ for (roop_count2 = 0; roop_count2 < table_count; ++roop_count2)
+ {
+ table_link_idx_holder =
+ &conn_holder->table_link_idx_holder[roop_count2];
+ if (link_idx_holder)
+ {
+ link_idx_holder->next_table =
+ table_link_idx_holder->current_link_idx_holder;
+ }
+ link_idx_holder = table_link_idx_holder->current_link_idx_holder;
+ table_link_idx_holder->current_link_idx_holder = link_idx_holder->next;
+ }
+ }
+ } while ((conn_holder = conn_holder->next));
+
+ current_conn_holder = first_conn_holder;
+ do {
+ table_link_idx_holder =
+ &current_conn_holder->table_link_idx_holder[0];
+ table_link_idx_holder->current_link_idx_holder =
+ table_link_idx_holder->first_link_idx_holder;
+ } while ((current_conn_holder = current_conn_holder->next));
+
+ spider = table_holder[0].spider;
+ share = spider->share;
+ DBUG_PRINT("info",("spider create link_idx_chain sorted by 0"));
+ for (
+ roop_count = spider_conn_link_idx_next(share->link_statuses,
+ spider->conn_link_idx, -1, share->link_count,
+ link_status);
+ roop_count < share->link_count;
+ roop_count = spider_conn_link_idx_next(share->link_statuses,
+ spider->conn_link_idx, roop_count, share->link_count,
+ link_status)
+ ) {
+ conn = spider->conns[roop_count];
+ if (!conn->conn_holder_for_direct_join)
+ {
+ continue;
+ }
+ table_link_idx_holder =
+ &conn->conn_holder_for_direct_join->table_link_idx_holder[0];
+ link_idx_holder = table_link_idx_holder->current_link_idx_holder;
+ table_link_idx_holder->current_link_idx_holder = link_idx_holder->next;
+ DBUG_ASSERT(link_idx_holder->link_idx == (int) roop_count);
+ if (!(link_idx_chain = create_link_idx_chain()))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ if (!first_link_idx_chain)
+ {
+ first_link_idx_chain = link_idx_chain;
+ } else {
+ last_link_idx_chain->next = link_idx_chain;
+ }
+ last_link_idx_chain = link_idx_chain;
+ link_idx_chain->conn = conn;
+ link_idx_chain->link_idx_holder = link_idx_holder;
+ do {
+ if (link_idx_chain->link_status < link_idx_holder->link_status)
+ {
+ link_idx_chain->link_status = link_idx_holder->link_status;
+ }
+ } while ((link_idx_holder = link_idx_holder->next_table));
+ }
+
+ do {
+ has_remain = FALSE;
+ current_conn_holder = first_conn_holder;
+ do {
+ table_link_idx_holder =
+ &current_conn_holder->table_link_idx_holder[0];
+ link_idx_holder = table_link_idx_holder->current_link_idx_holder;
+ if (link_idx_holder)
+ {
+ has_remain = TRUE;
+ for (roop_count2 = 1; roop_count2 < table_count; ++roop_count2)
+ {
+ if (table_link_idx_holder[roop_count2].link_idx_holder_count ==
+ current_conn_holder->link_idx_holder_count_max)
+ {
+ break;
+ }
+ }
+ break;
+ }
+ } while ((current_conn_holder = current_conn_holder->next));
+
+ if (has_remain)
+ {
+ current_conn_holder = first_conn_holder;
+ do {
+ table_link_idx_holder =
+ &current_conn_holder->table_link_idx_holder[0];
+ link_idx_holder = table_link_idx_holder->current_link_idx_holder;
+ if (link_idx_holder)
+ {
+ for (roop_count = 1; roop_count <= roop_count2; ++roop_count)
+ {
+ link_idx_holder = link_idx_holder->next_table;
+ }
+ table_link_idx_holder[roop_count2].current_link_idx_holder =
+ link_idx_holder;
+ } else {
+ table_link_idx_holder[roop_count2].current_link_idx_holder = NULL;
+ }
+ } while ((current_conn_holder = current_conn_holder->next));
+
+ spider = table_holder[roop_count2].spider;
+ share = spider->share;
+ DBUG_PRINT("info",("spider create link_idx_chain sorted by %d",
+ roop_count2));
+ for (
+ roop_count = spider_conn_link_idx_next(share->link_statuses,
+ spider->conn_link_idx, -1, share->link_count,
+ link_status);
+ roop_count < share->link_count;
+ roop_count = spider_conn_link_idx_next(share->link_statuses,
+ spider->conn_link_idx, roop_count, share->link_count,
+ link_status)
+ ) {
+ conn = spider->conns[roop_count];
+ if (!conn->conn_holder_for_direct_join)
+ {
+ continue;
+ }
+ table_link_idx_holder =
+ &conn->conn_holder_for_direct_join->table_link_idx_holder[0];
+ link_idx_holder =
+ table_link_idx_holder[roop_count2].current_link_idx_holder;
+ skip = FALSE;
+ if (link_idx_holder)
+ {
+ current_link_idx_holder = table_link_idx_holder->first_link_idx_holder;
+ while (current_link_idx_holder != link_idx_holder)
+ {
+ if (current_link_idx_holder->link_idx ==
+ link_idx_holder->link_idx)
+ {
+ skip = TRUE;
+ break;
+ }
+ current_link_idx_holder = current_link_idx_holder->next;
+ }
+ }
+ if (skip)
+ {
+ continue;
+ }
+ DBUG_PRINT("info",("spider create link_idx_chain for %d",
+ roop_count2));
+ table_link_idx_holder[roop_count2].current_link_idx_holder =
+ link_idx_holder->next;
+ link_idx_holder =
+ table_link_idx_holder->current_link_idx_holder;
+ table_link_idx_holder->current_link_idx_holder =
+ link_idx_holder->next;
+ if (!(link_idx_chain = create_link_idx_chain()))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ DBUG_ASSERT(first_link_idx_chain);
+ last_link_idx_chain->next = link_idx_chain;
+ last_link_idx_chain = link_idx_chain;
+ link_idx_chain->conn = conn;
+ link_idx_chain->link_idx_holder = link_idx_holder;
+ do {
+ if (link_idx_chain->link_status < link_idx_holder->link_status)
+ {
+ link_idx_chain->link_status = link_idx_holder->link_status;
+ }
+ } while ((link_idx_holder = link_idx_holder->next_table));
+ }
+ }
+ } while (has_remain);
+ DBUG_RETURN(0);
+}
+
+SPIDER_LINK_IDX_CHAIN *spider_fields::create_link_idx_chain(
+) {
+ DBUG_ENTER("spider_fields::create_link_idx_chain");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN((SPIDER_LINK_IDX_CHAIN *)
+ spider_malloc(spider_current_trx, 254, sizeof(SPIDER_LINK_IDX_CHAIN),
+ MYF(MY_WME | MY_ZEROFILL)));
+}
+
+void spider_fields::set_pos_to_first_link_idx_chain(
+) {
+ DBUG_ENTER("spider_fields::set_pos_to_first_link_idx_chain");
+ DBUG_PRINT("info",("spider this=%p", this));
+ current_link_idx_chain = first_link_idx_chain;
+ DBUG_VOID_RETURN;
+}
+
+SPIDER_LINK_IDX_CHAIN *spider_fields::get_next_link_idx_chain(
+) {
+ SPIDER_LINK_IDX_CHAIN *return_link_idx_chain = current_link_idx_chain;
+ DBUG_ENTER("spider_fields::get_next_link_idx_chain");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (current_link_idx_chain)
+ current_link_idx_chain = current_link_idx_chain->next;
+ DBUG_RETURN(return_link_idx_chain);
+}
+
+SPIDER_LINK_IDX_HOLDER *spider_fields::get_dup_link_idx_holder(
+ SPIDER_TABLE_LINK_IDX_HOLDER *table_link_idx_holder,
+ SPIDER_LINK_IDX_HOLDER *current
+) {
+ SPIDER_LINK_IDX_HOLDER *return_link_idx_holder;
+ DBUG_ENTER("spider_fields::get_dup_link_idx_holder");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (!current)
+ {
+ return_link_idx_holder = table_link_idx_holder->first_link_idx_holder;
+ do {
+ if (return_link_idx_holder->link_status == SPIDER_LINK_STATUS_OK)
+ break;
+ } while ((return_link_idx_holder = return_link_idx_holder->next));
+ if (!return_link_idx_holder)
+ {
+ return_link_idx_holder = table_link_idx_holder->first_link_idx_holder;
+ }
+ } else {
+ if (current->link_status == SPIDER_LINK_STATUS_OK)
+ {
+ return_link_idx_holder = current;
+ while ((return_link_idx_holder = return_link_idx_holder->next))
+ {
+ if (return_link_idx_holder->link_status == SPIDER_LINK_STATUS_OK)
+ break;
+ }
+ if (!return_link_idx_holder)
+ {
+ return_link_idx_holder = table_link_idx_holder->first_link_idx_holder;
+ do {
+ if (
+ return_link_idx_holder->link_status == SPIDER_LINK_STATUS_OK
+ )
+ break;
+ DBUG_ASSERT(return_link_idx_holder != current);
+ } while ((return_link_idx_holder = return_link_idx_holder->next));
+ }
+ } else {
+ if (!current->next)
+ {
+ return_link_idx_holder = table_link_idx_holder->first_link_idx_holder;
+ } else {
+ return_link_idx_holder = current->next;
+ }
+ }
+ }
+ DBUG_RETURN(return_link_idx_holder);
+}
+
+bool spider_fields::check_link_ok_chain(
+) {
+ DBUG_ENTER("spider_fields::check_link_ok_chain");
+ DBUG_PRINT("info",("spider this=%p", this));
+ for (current_link_idx_chain = first_link_idx_chain; current_link_idx_chain;
+ current_link_idx_chain = current_link_idx_chain->next)
+ {
+ DBUG_PRINT("info",("spider current_link_idx_chain=%p", current_link_idx_chain));
+ DBUG_PRINT("info",("spider current_link_idx_chain->link_status=%d", current_link_idx_chain->link_status));
+ if (current_link_idx_chain->link_status == SPIDER_LINK_STATUS_OK)
+ {
+ first_ok_link_idx_chain = current_link_idx_chain;
+ DBUG_RETURN(FALSE);
+ }
+ }
+ DBUG_RETURN(TRUE);
+}
+
+bool spider_fields::is_first_link_ok_chain(
+ SPIDER_LINK_IDX_CHAIN *link_idx_chain_arg
+) {
+ DBUG_ENTER("spider_fields::is_first_link_ok_chain");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(first_ok_link_idx_chain == link_idx_chain_arg);
+}
+
+int spider_fields::get_ok_link_idx(
+) {
+ DBUG_ENTER("spider_fields::get_ok_link_idx");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(first_ok_link_idx_chain->link_idx_holder->link_idx);
+}
+
+void spider_fields::set_first_link_idx(
+) {
+ SPIDER_TABLE_HOLDER *table_holder;
+ SPIDER_LINK_IDX_HOLDER *link_idx_holder;
+ SPIDER_LINK_IDX_CHAIN *link_idx_chain;
+ uint dbton_id;
+ ha_spider *spider;
+ spider_db_handler *dbton_hdl;
+ DBUG_ENTER("spider_fields::set_first_link_idx");
+ DBUG_PRINT("info",("spider this=%p", this));
+ set_pos_to_first_dbton_id();
+ while ((dbton_id = get_next_dbton_id()) < SPIDER_DBTON_SIZE)
+ {
+ set_pos_to_first_link_idx_chain();
+ while ((link_idx_chain = get_next_link_idx_chain()))
+ {
+ if (link_idx_chain->conn->dbton_id == dbton_id)
+ {
+ break;
+ }
+ }
+ DBUG_ASSERT(link_idx_chain);
+ set_pos_to_first_table_on_link_idx_chain(link_idx_chain);
+
+ set_pos_to_first_table_holder();
+ while ((table_holder = get_next_table_holder()))
+ {
+ link_idx_holder = get_next_table_on_link_idx_chain(link_idx_chain);
+ spider = table_holder->spider;
+ dbton_hdl = spider->dbton_handler[dbton_id];
+ dbton_hdl->first_link_idx = link_idx_holder->link_idx;
+ }
+ }
+ DBUG_VOID_RETURN;
+}
+
+int spider_fields::add_link_idx(
+ SPIDER_CONN_HOLDER *conn_holder_arg,
+ ha_spider *spider_arg,
+ int link_idx
+) {
+ SPIDER_TABLE_LINK_IDX_HOLDER *table_link_idx_holder;
+ SPIDER_LINK_IDX_HOLDER *link_idx_holder;
+ DBUG_ENTER("spider_fields::add_link_idx");
+ DBUG_PRINT("info",("spider this=%p", this));
+ table_link_idx_holder =
+ &conn_holder_arg->table_link_idx_holder[spider_arg->idx_for_direct_join];
+ if (!table_link_idx_holder->first_link_idx_holder)
+ {
+ link_idx_holder = create_link_idx_holder();
+ DBUG_PRINT("info",("spider link_idx_holder=%p", link_idx_holder));
+ if (!link_idx_holder)
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ table_link_idx_holder->first_link_idx_holder = link_idx_holder;
+ table_link_idx_holder->last_link_idx_holder = link_idx_holder;
+ table_link_idx_holder->table_holder =
+ &table_holder[spider_arg->idx_for_direct_join];
+ } else {
+ link_idx_holder = create_link_idx_holder();
+ DBUG_PRINT("info",("spider link_idx_holder=%p", link_idx_holder));
+ if (!link_idx_holder)
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ table_link_idx_holder->last_link_idx_holder->next = link_idx_holder;
+ table_link_idx_holder->last_link_idx_holder = link_idx_holder;
+ }
+ link_idx_holder->table_link_idx_holder = table_link_idx_holder;
+ link_idx_holder->link_idx = link_idx;
+ link_idx_holder->link_status = spider_conn_get_link_status(
+ spider_arg->share->link_statuses, spider_arg->conn_link_idx,
+ link_idx);
+ ++table_link_idx_holder->link_idx_holder_count;
+ if (conn_holder_arg->link_idx_holder_count_max <
+ table_link_idx_holder->link_idx_holder_count)
+ {
+ conn_holder_arg->link_idx_holder_count_max =
+ table_link_idx_holder->link_idx_holder_count;
+ }
+ DBUG_RETURN(0);
+}
+
+SPIDER_LINK_IDX_HOLDER *spider_fields::create_link_idx_holder(
+) {
+ DBUG_ENTER("spider_fields::create_link_idx_holder");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN((SPIDER_LINK_IDX_HOLDER *)
+ spider_malloc(spider_current_trx, 253, sizeof(SPIDER_LINK_IDX_HOLDER),
+ MYF(MY_WME | MY_ZEROFILL)));
+}
+
+void spider_fields::set_pos_to_first_table_on_link_idx_chain(
+ SPIDER_LINK_IDX_CHAIN *link_idx_chain_arg
+) {
+ DBUG_ENTER("spider_fields::set_pos_to_first_table_on_link_idx_chain");
+ DBUG_PRINT("info",("spider this=%p", this));
+ link_idx_chain_arg->current_link_idx_holder =
+ link_idx_chain_arg->link_idx_holder;
+ DBUG_VOID_RETURN;
+}
+
+SPIDER_LINK_IDX_HOLDER *spider_fields::get_next_table_on_link_idx_chain(
+ SPIDER_LINK_IDX_CHAIN *link_idx_chain_arg
+) {
+ SPIDER_LINK_IDX_HOLDER *return_link_idx_holder;
+ DBUG_ENTER("spider_fields::get_next_table_on_link_idx_chain");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (!link_idx_chain_arg->current_link_idx_holder)
+ DBUG_RETURN(NULL);
+ return_link_idx_holder = link_idx_chain_arg->current_link_idx_holder;
+ link_idx_chain_arg->current_link_idx_holder =
+ link_idx_chain_arg->current_link_idx_holder->next_table;
+ DBUG_RETURN(return_link_idx_holder);
+}
+
+SPIDER_CONN_HOLDER *spider_fields::add_conn(
+ SPIDER_CONN *conn_arg,
+ long access_balance
+) {
+ SPIDER_CONN_HOLDER *conn_holder;
+ DBUG_ENTER("spider_fields::add_conn");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (!first_conn_holder)
+ {
+ conn_holder = create_conn_holder();
+ DBUG_PRINT("info",("spider conn_holder=%p", conn_holder));
+ if (!conn_holder)
+ DBUG_RETURN(NULL);
+ conn_holder->conn = conn_arg;
+ conn_holder->access_balance = access_balance;
+ first_conn_holder = conn_holder;
+ last_conn_holder = conn_holder;
+ conn_arg->conn_holder_for_direct_join = conn_holder;
+ add_dbton_id(conn_arg->dbton_id);
+ } else {
+ conn_holder = first_conn_holder;
+ do {
+ if (conn_holder->conn == conn_arg)
+ break;
+ } while ((conn_holder = conn_holder->next));
+ if (!conn_holder)
+ {
+ conn_holder = create_conn_holder();
+ DBUG_PRINT("info",("spider conn_holder=%p", conn_holder));
+ if (!conn_holder)
+ DBUG_RETURN(NULL);
+ conn_holder->conn = conn_arg;
+ conn_holder->access_balance = access_balance;
+ conn_holder->prev = last_conn_holder;
+ last_conn_holder->next = conn_holder;
+ last_conn_holder = conn_holder;
+ conn_arg->conn_holder_for_direct_join = conn_holder;
+ add_dbton_id(conn_arg->dbton_id);
+ }
+ }
+ DBUG_RETURN(conn_holder);
+}
+
+SPIDER_CONN_HOLDER *spider_fields::create_conn_holder(
+) {
+ SPIDER_CONN_HOLDER *return_conn_holder;
+ SPIDER_TABLE_LINK_IDX_HOLDER *table_link_idx_holder;
+ DBUG_ENTER("spider_fields::create_conn_holder");
+ DBUG_PRINT("info",("spider this=%p", this));
+ return_conn_holder = (SPIDER_CONN_HOLDER *)
+ spider_bulk_malloc(spider_current_trx, 252, MYF(MY_WME | MY_ZEROFILL),
+ &return_conn_holder, sizeof(SPIDER_CONN_HOLDER),
+ &table_link_idx_holder,
+ table_count * sizeof(SPIDER_TABLE_LINK_IDX_HOLDER),
+ NullS
+ );
+ if (!return_conn_holder)
+ DBUG_RETURN(NULL);
+ DBUG_PRINT("info",("spider table_count=%u", table_count));
+ DBUG_PRINT("info",("spider table_link_idx_holder=%p", table_link_idx_holder));
+ return_conn_holder->table_link_idx_holder = table_link_idx_holder;
+ DBUG_RETURN(return_conn_holder);
+}
+
+void spider_fields::set_pos_to_first_conn_holder(
+) {
+ DBUG_ENTER("spider_fields::set_pos_to_first_conn_holder");
+ DBUG_PRINT("info",("spider this=%p", this));
+ current_conn_holder = first_conn_holder;
+ DBUG_VOID_RETURN;
+}
+
+SPIDER_CONN_HOLDER *spider_fields::get_next_conn_holder(
+) {
+ SPIDER_CONN_HOLDER *return_conn_holder = current_conn_holder;
+ DBUG_ENTER("spider_fields::get_next_conn_holder");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (current_conn_holder)
+ current_conn_holder = current_conn_holder->next;
+ DBUG_RETURN(return_conn_holder);
+}
+
+bool spider_fields::has_conn_holder(
+) {
+ DBUG_ENTER("spider_fields::has_conn_holder");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN(first_conn_holder);
+}
+
+void spider_fields::clear_conn_holder_from_conn(
+) {
+ DBUG_ENTER("spider_fields::clear_conn_checked_for_same_conn");
+ DBUG_PRINT("info",("spider this=%p", this));
+ for (current_conn_holder = first_conn_holder; current_conn_holder;
+ current_conn_holder = current_conn_holder->next)
+ {
+ current_conn_holder->checked_for_same_conn = FALSE;
+ }
+ DBUG_VOID_RETURN;
+}
+
+bool spider_fields::check_conn_same_conn(
+ SPIDER_CONN *conn_arg
+) {
+ DBUG_ENTER("spider_fields::check_conn_same_conn");
+ DBUG_PRINT("info",("spider this=%p", this));
+ for (current_conn_holder = first_conn_holder; current_conn_holder;
+ current_conn_holder = current_conn_holder->next)
+ {
+ if (current_conn_holder->conn == conn_arg)
+ {
+ current_conn_holder->checked_for_same_conn = TRUE;
+ DBUG_RETURN(TRUE);
+ }
+ }
+ DBUG_RETURN(FALSE);
+}
+
+bool spider_fields::remove_conn_if_not_checked(
+) {
+ SPIDER_CONN_HOLDER *conn_holder;
+ bool removed = FALSE;
+ DBUG_ENTER("spider_fields::remove_conn_if_not_checked");
+ DBUG_PRINT("info",("spider this=%p", this));
+ current_conn_holder = first_conn_holder;
+ while (current_conn_holder)
+ {
+ if (!current_conn_holder->checked_for_same_conn)
+ {
+ removed = TRUE;
+ DBUG_PRINT("info",("spider remove connection %p",
+ current_conn_holder->conn));
+ if (!current_conn_holder->prev)
+ {
+ first_conn_holder = current_conn_holder->next;
+ if (current_conn_holder->next)
+ {
+ current_conn_holder->next->prev = NULL;
+ } else {
+ last_conn_holder = NULL;
+ }
+ } else {
+ current_conn_holder->prev->next = current_conn_holder->next;
+ if (current_conn_holder->next)
+ {
+ current_conn_holder->next->prev = current_conn_holder->prev;
+ } else {
+ last_conn_holder = current_conn_holder->prev;
+ last_conn_holder->next = NULL;
+ }
+ }
+ conn_holder = current_conn_holder->next;
+ free_conn_holder(current_conn_holder);
+ current_conn_holder = conn_holder;
+ } else {
+ current_conn_holder = current_conn_holder->next;
+ }
+ }
+ DBUG_RETURN(removed);
+}
+
+void spider_fields::check_support_dbton(
+ uchar *dbton_bitmap
+) {
+ SPIDER_CONN_HOLDER *conn_holder;
+ DBUG_ENTER("spider_fields::check_support_dbton");
+ DBUG_PRINT("info",("spider this=%p", this));
+ current_conn_holder = first_conn_holder;
+ while (current_conn_holder)
+ {
+ if (!spider_bit_is_set(dbton_bitmap, current_conn_holder->conn->dbton_id))
+ {
+ DBUG_PRINT("info",("spider remove connection %p",
+ current_conn_holder->conn));
+ if (!current_conn_holder->prev)
+ {
+ first_conn_holder = current_conn_holder->next;
+ if (current_conn_holder->next)
+ {
+ current_conn_holder->next->prev = NULL;
+ } else {
+ last_conn_holder = NULL;
+ }
+ } else {
+ current_conn_holder->prev->next = current_conn_holder->next;
+ if (current_conn_holder->next)
+ {
+ current_conn_holder->next->prev = current_conn_holder->prev;
+ } else {
+ last_conn_holder = current_conn_holder->prev;
+ last_conn_holder->next = NULL;
+ }
+ }
+ conn_holder = current_conn_holder->next;
+ free_conn_holder(current_conn_holder);
+ current_conn_holder = conn_holder;
+ } else {
+ current_conn_holder = current_conn_holder->next;
+ }
+ }
+ DBUG_VOID_RETURN;
+}
+
+void spider_fields::choose_a_conn(
+) {
+ SPIDER_CONN_HOLDER *conn_holder;
+ longlong balance_total = 0, balance_val;
+ double rand_val;
+ THD *thd = table_holder[0].spider->trx->thd;
+ DBUG_ENTER("spider_fields::choose_a_conn");
+ DBUG_PRINT("info",("spider this=%p", this));
+ for (current_conn_holder = first_conn_holder; current_conn_holder;
+ current_conn_holder = current_conn_holder->next)
+ {
+ balance_total += current_conn_holder->access_balance;
+ }
+
+ rand_val = spider_rand(thd->variables.server_id + thd_get_thread_id(thd));
+ balance_val = (longlong) (rand_val * balance_total);
+
+ current_conn_holder = first_conn_holder;
+ while (current_conn_holder)
+ {
+ if (balance_val < current_conn_holder->access_balance)
+ break;
+ balance_val -= current_conn_holder->access_balance;
+
+ DBUG_PRINT("info",("spider remove connection %p",
+ current_conn_holder->conn));
+ first_conn_holder = current_conn_holder->next;
+ DBUG_ASSERT(current_conn_holder->next);
+ first_conn_holder->prev = NULL;
+ free_conn_holder(current_conn_holder);
+ current_conn_holder = first_conn_holder;
+ }
+
+ DBUG_PRINT("info",("spider chosen connection is %p",
+ current_conn_holder->conn));
+ last_conn_holder = current_conn_holder;
+ current_conn_holder = current_conn_holder->next;
+ last_conn_holder->next = NULL;
+
+ while (current_conn_holder)
+ {
+ DBUG_PRINT("info",("spider remove connection %p",
+ current_conn_holder->conn));
+ conn_holder = current_conn_holder->next;
+ free_conn_holder(current_conn_holder);
+ current_conn_holder = conn_holder;
+ }
+ DBUG_VOID_RETURN;
+}
+
+void spider_fields::free_conn_holder(
+ SPIDER_CONN_HOLDER *conn_holder_arg
+) {
+ uint roop_count;
+ DBUG_ENTER("spider_fields::free_conn_holder");
+ DBUG_PRINT("info",("spider this=%p", this));
+ for (roop_count = 0; roop_count < table_count; ++roop_count)
+ {
+ if (conn_holder_arg->table_link_idx_holder[roop_count].first_link_idx_holder)
+ {
+ SPIDER_LINK_IDX_HOLDER *first_link_idx_holder, *current_link_idx_holder;
+ first_link_idx_holder =
+ conn_holder_arg->table_link_idx_holder[roop_count].first_link_idx_holder;
+ while ((current_link_idx_holder = first_link_idx_holder))
+ {
+ first_link_idx_holder = current_link_idx_holder->next;
+ spider_free(spider_current_trx, current_link_idx_holder, MYF(0));
+ }
+ }
+ }
+ conn_holder_arg->conn->conn_holder_for_direct_join = NULL;
+ DBUG_PRINT("info",("spider free conn_holder=%p", conn_holder_arg));
+ spider_free(spider_current_trx, conn_holder_arg, MYF(0));
+ DBUG_VOID_RETURN;
+}
+
+SPIDER_TABLE_HOLDER *spider_fields::add_table(
+ ha_spider *spider_arg
+) {
+ spider_string *str;
+ uint length;
+ char tmp_buf[SPIDER_SQL_INT_LEN + 2];
+ SPIDER_TABLE_HOLDER *return_table_holder;
+ SPIDER_FIELD_HOLDER *field_holder;
+ TABLE *table = spider_arg->get_table();
+ Field *field;
+ DBUG_ENTER("spider_fields::add_table");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_PRINT("info",("spider table_count=%u", table_count));
+ DBUG_PRINT("info",("spider idx_for_direct_join=%u",
+ spider_arg->idx_for_direct_join));
+ length = my_sprintf(tmp_buf, (tmp_buf, "t%u",
+ spider_arg->idx_for_direct_join));
+ str = &spider_arg->result_list.tmp_sqls[0];
+ str->length(0);
+ if (str->reserve(length + SPIDER_SQL_DOT_LEN))
+ {
+ DBUG_RETURN(NULL);
+ }
+ str->q_append(tmp_buf, length);
+ str->q_append(SPIDER_SQL_DOT_STR, SPIDER_SQL_DOT_LEN);
+
+ return_table_holder = &table_holder[spider_arg->idx_for_direct_join];
+ return_table_holder->table = spider_arg->get_table();
+ return_table_holder->spider = spider_arg;
+ return_table_holder->alias = str;
+
+ set_pos_to_first_field_holder();
+ while ((field_holder = get_next_field_holder()))
+ {
+ if (!field_holder->spider)
+ {
+ field = field_holder->field;
+ if (
+ field->field_index < table->s->fields &&
+ field == table->field[field->field_index]
+ ) {
+ field_holder->spider = spider_arg;
+ field_holder->alias = str;
+ }
+ }
+ }
+ DBUG_RETURN(return_table_holder);
+}
+
+/**
+ Verify that all fields in the query are members of tables that are in the
+ query.
+
+ @return TRUE All fields in the query are members of tables
+ that are in the query.
+ FALSE At least one field in the query is not a
+ member of a table that is in the query.
+*/
+
+bool spider_fields::all_query_fields_are_query_table_members()
+{
+ SPIDER_FIELD_HOLDER *field_holder;
+ DBUG_ENTER("spider_fields::all_query_fields_are_query_table_members");
+ DBUG_PRINT("info",("spider this=%p", this));
+
+ set_pos_to_first_field_holder();
+ while ((field_holder = get_next_field_holder()))
+ {
+ if (!field_holder->spider)
+ {
+ DBUG_PRINT("info", ("spider field is not a member of a query table"));
+ DBUG_RETURN(FALSE);
+ }
+ }
+
+ DBUG_RETURN(TRUE);
+}
+
+int spider_fields::create_table_holder(
+ uint table_count_arg
+) {
+ DBUG_ENTER("spider_fields::create_table_holder");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_ASSERT(!table_holder);
+ table_holder = (SPIDER_TABLE_HOLDER *)
+ spider_malloc(spider_current_trx, 249,
+ table_count_arg * sizeof(SPIDER_TABLE_HOLDER),
+ MYF(MY_WME | MY_ZEROFILL));
+ if (!table_holder)
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ table_count = table_count_arg;
+ current_table_num = 0;
+ DBUG_RETURN(0);
+}
+
+void spider_fields::set_pos_to_first_table_holder(
+) {
+ DBUG_ENTER("spider_fields::set_pos_to_first_table_holder");
+ DBUG_PRINT("info",("spider this=%p", this));
+ current_table_num = 0;
+ DBUG_VOID_RETURN;
+}
+
+SPIDER_TABLE_HOLDER *spider_fields::get_next_table_holder(
+) {
+ SPIDER_TABLE_HOLDER *return_table_holder;
+ DBUG_ENTER("spider_fields::get_next_table_holder");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (current_table_num >= table_count)
+ DBUG_RETURN(NULL);
+ return_table_holder = &table_holder[current_table_num];
+ ++current_table_num;
+ DBUG_RETURN(return_table_holder);
+}
+
+SPIDER_TABLE_HOLDER *spider_fields::get_table_holder(TABLE *table)
+{
+ uint table_num;
+ DBUG_ENTER("spider_fields::get_table_holder");
+ DBUG_PRINT("info",("spider this=%p", this));
+ for (table_num = 0; table_num < table_count; ++table_num)
+ {
+ if (table_holder[table_num].table == table)
+ DBUG_RETURN(&table_holder[table_num]);
+ }
+ DBUG_RETURN(NULL);
+}
+
+uint spider_fields::get_table_count()
+{
+ DBUG_ENTER("spider_fields::get_table_count");
+ DBUG_RETURN(table_count);
+}
+
+int spider_fields::add_field(
+ Field *field_arg
+) {
+ SPIDER_FIELD_HOLDER *field_holder;
+ SPIDER_FIELD_CHAIN *field_chain;
+ DBUG_ENTER("spider_fields::add_field");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_PRINT("info",("spider field=%p", field_arg));
+ if (!first_field_holder)
+ {
+ field_holder = create_field_holder();
+ DBUG_PRINT("info",("spider field_holder=%p", field_holder));
+ if (!field_holder)
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ field_holder->field = field_arg;
+ first_field_holder = field_holder;
+ last_field_holder = field_holder;
+ } else {
+ field_holder = first_field_holder;
+ do {
+ if (field_holder->field == field_arg)
+ break;
+ } while ((field_holder = field_holder->next));
+ if (!field_holder)
+ {
+ field_holder = create_field_holder();
+ DBUG_PRINT("info",("spider field_holder=%p", field_holder));
+ if (!field_holder)
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ field_holder->field = field_arg;
+ last_field_holder->next = field_holder;
+ last_field_holder = field_holder;
+ }
+ }
+ field_chain = create_field_chain();
+ DBUG_PRINT("info",("spider field_chain=%p", field_chain));
+ if (!field_chain)
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ field_chain->field_holder = field_holder;
+ if (!first_field_chain)
+ {
+ first_field_chain = field_chain;
+ last_field_chain = field_chain;
+ } else {
+ last_field_chain->next = field_chain;
+ last_field_chain = field_chain;
+ }
+ DBUG_RETURN(0);
+}
+
+SPIDER_FIELD_HOLDER *spider_fields::create_field_holder(
+) {
+ DBUG_ENTER("spider_fields::create_field_holder");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN((SPIDER_FIELD_HOLDER *)
+ spider_malloc(spider_current_trx, 250, sizeof(SPIDER_FIELD_HOLDER),
+ MYF(MY_WME | MY_ZEROFILL)));
+}
+
+void spider_fields::set_pos_to_first_field_holder(
+) {
+ DBUG_ENTER("spider_fields::set_pos_to_first_field_holder");
+ DBUG_PRINT("info",("spider this=%p", this));
+ current_field_holder = first_field_holder;
+ DBUG_VOID_RETURN;
+}
+
+SPIDER_FIELD_HOLDER *spider_fields::get_next_field_holder(
+) {
+ SPIDER_FIELD_HOLDER *return_field_holder = current_field_holder;
+ DBUG_ENTER("spider_fields::get_next_field_holder");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (current_field_holder)
+ current_field_holder = current_field_holder->next;
+ DBUG_RETURN(return_field_holder);
+}
+
+SPIDER_FIELD_CHAIN *spider_fields::create_field_chain(
+) {
+ DBUG_ENTER("spider_fields::create_field_chain");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_RETURN((SPIDER_FIELD_CHAIN *)
+ spider_malloc(spider_current_trx, 251, sizeof(SPIDER_FIELD_CHAIN),
+ MYF(MY_WME | MY_ZEROFILL)));
+}
+
+void spider_fields::set_pos_to_first_field_chain(
+) {
+ DBUG_ENTER("spider_fields::set_pos_to_first_field_chain");
+ DBUG_PRINT("info",("spider this=%p", this));
+ current_field_chain = first_field_chain;
+ DBUG_VOID_RETURN;
+}
+
+SPIDER_FIELD_CHAIN *spider_fields::get_next_field_chain(
+) {
+ SPIDER_FIELD_CHAIN *return_field_chain = current_field_chain;
+ DBUG_ENTER("spider_fields::get_next_field_chain");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (current_field_chain)
+ current_field_chain = current_field_chain->next;
+ DBUG_RETURN(return_field_chain);
+}
+
+void spider_fields::set_field_ptr(
+ Field **field_arg
+) {
+ DBUG_ENTER("spider_fields::set_field_ptr");
+ DBUG_PRINT("info",("spider this=%p", this));
+ DBUG_PRINT("info",("spider field_ptr=%p", field_arg));
+ first_field_ptr = field_arg;
+ current_field_ptr = field_arg;
+ DBUG_VOID_RETURN;
+}
+
+Field **spider_fields::get_next_field_ptr(
+) {
+ Field **return_field_ptr = current_field_ptr;
+ DBUG_ENTER("spider_fields::get_next_field_ptr");
+ DBUG_PRINT("info",("spider this=%p", this));
+ if (*current_field_ptr)
+ current_field_ptr++;
+ DBUG_PRINT("info",("spider field_ptr=%p", return_field_ptr));
+ DBUG_RETURN(return_field_ptr);
+}
+
+int spider_fields::ping_table_mon_from_table(
+ SPIDER_LINK_IDX_CHAIN *link_idx_chain
+) {
+ int error_num = 0, error_num_buf;
+ ha_spider *tmp_spider;
+ SPIDER_SHARE *tmp_share;
+ int tmp_link_idx;
+ SPIDER_TABLE_HOLDER *table_holder;
+ SPIDER_LINK_IDX_HOLDER *link_idx_holder;
+ DBUG_ENTER("spider_fields::ping_table_mon_from_table");
+ set_pos_to_first_table_on_link_idx_chain(link_idx_chain);
+ set_pos_to_first_table_holder();
+ while ((table_holder = get_next_table_holder()))
+ {
+ link_idx_holder = get_next_table_on_link_idx_chain(link_idx_chain);
+ tmp_spider = table_holder->spider;
+ tmp_link_idx = link_idx_holder->link_idx;
+ tmp_share = tmp_spider->share;
+ if (tmp_share->monitoring_kind[tmp_link_idx])
+ {
+ error_num_buf = spider_ping_table_mon_from_table(
+ tmp_spider->trx,
+ tmp_spider->trx->thd,
+ tmp_share,
+ tmp_link_idx,
+ (uint32) tmp_share->monitoring_sid[tmp_link_idx],
+ tmp_share->table_name,
+ tmp_share->table_name_length,
+ tmp_spider->conn_link_idx[tmp_link_idx],
+ NULL,
+ 0,
+ tmp_share->monitoring_kind[tmp_link_idx],
+ tmp_share->monitoring_limit[tmp_link_idx],
+ tmp_share->monitoring_flag[tmp_link_idx],
+ TRUE
+ );
+ if (!error_num)
+ error_num = error_num_buf;
+ }
+ }
+ DBUG_RETURN(error_num);
+}
+
+#ifdef SPIDER_HAS_GROUP_BY_HANDLER
+spider_group_by_handler::spider_group_by_handler(
+ THD *thd_arg,
+ Query *query_arg,
+ spider_fields *fields_arg
+) : group_by_handler(thd_arg, spider_hton_ptr),
+ query(*query_arg), fields(fields_arg)
+{
+ DBUG_ENTER("spider_group_by_handler::spider_group_by_handler");
+ fields->set_pos_to_first_table_holder();
+ SPIDER_TABLE_HOLDER *table_holder = fields->get_next_table_holder();
+ spider = table_holder->spider;
+ trx = spider->trx;
+ DBUG_VOID_RETURN;
+}
+
+spider_group_by_handler::~spider_group_by_handler()
+{
+ DBUG_ENTER("spider_group_by_handler::~spider_group_by_handler");
+ delete fields;
+ DBUG_VOID_RETURN;
+}
+
+int spider_group_by_handler::init_scan()
+{
+ int error_num, link_idx;
+ uint dbton_id;
+ spider_db_handler *dbton_hdl;
+ st_select_lex *select_lex;
+ longlong select_limit;
+ longlong direct_order_limit;
+ SPIDER_SHARE *share = spider->share;
+ SPIDER_CONN *conn;
+ SPIDER_RESULT_LIST *result_list = &spider->result_list;
+ SPIDER_LINK_IDX_CHAIN *link_idx_chain;
+ SPIDER_LINK_IDX_HOLDER *link_idx_holder;
+ DBUG_ENTER("spider_group_by_handler::init_scan");
+ store_error = 0;
+#ifndef DBUG_OFF
+ Field **field;
+ for (
+ field = table->field;
+ *field;
+ field++
+ ) {
+ DBUG_PRINT("info",("spider field_name=%s",
+ SPIDER_field_name_str(*field)));
+ }
+#endif
+
+ if (trx->thd->killed)
+ {
+ my_error(ER_QUERY_INTERRUPTED, MYF(0));
+ DBUG_RETURN(ER_QUERY_INTERRUPTED);
+ }
+
+ spider->use_fields = TRUE;
+ spider->fields = fields;
+
+ spider->check_pre_call(TRUE);
+
+ spider->pushed_pos = NULL;
+ result_list->sorted = (query.group_by || query.order_by);
+ spider_set_result_list_param(spider);
+ spider->mrr_with_cnt = FALSE;
+ spider->init_index_handler = FALSE;
+ spider->use_spatial_index = FALSE;
+ result_list->check_direct_order_limit = FALSE;
+ spider->select_column_mode = 0;
+ spider->search_link_idx = fields->get_ok_link_idx();
+ spider->result_link_idx = spider->search_link_idx;
+
+ spider_db_free_one_result_for_start_next(spider);
+
+ spider->sql_kinds = SPIDER_SQL_KIND_SQL;
+ for (link_idx = 0; link_idx < (int) share->link_count; ++link_idx)
+ spider->sql_kind[link_idx] = SPIDER_SQL_KIND_SQL;
+
+#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
+ spider->do_direct_update = FALSE;
+ spider->direct_update_kinds = 0;
+#endif
+ spider_get_select_limit(spider, &select_lex, &select_limit, &offset_limit);
+ direct_order_limit = spider_param_direct_order_limit(thd,
+ share->direct_order_limit);
+ if (
+ direct_order_limit &&
+ select_lex->explicit_limit &&
+ !(select_lex->options & OPTION_FOUND_ROWS) &&
+ select_limit < direct_order_limit /* - offset_limit */
+ ) {
+ result_list->internal_limit = select_limit /* + offset_limit */;
+ result_list->split_read = select_limit /* + offset_limit */;
+#ifndef WITHOUT_SPIDER_BG_SEARCH
+ result_list->bgs_split_read = select_limit /* + offset_limit */;
+#endif
+
+ result_list->split_read_base = 9223372036854775807LL;
+ result_list->semi_split_read = 0;
+ result_list->semi_split_read_limit = 9223372036854775807LL;
+ result_list->first_read = 9223372036854775807LL;
+ result_list->second_read = 9223372036854775807LL;
+ trx->direct_order_limit_count++;
+ }
+ result_list->semi_split_read_base = 0;
+ result_list->set_split_read = TRUE;
+#ifndef WITHOUT_SPIDER_BG_SEARCH
+ if ((error_num = spider_set_conn_bg_param(spider)))
+ DBUG_RETURN(error_num);
+#endif
+ DBUG_PRINT("info",("spider result_list.finish_flg = FALSE"));
+ result_list->finish_flg = FALSE;
+ result_list->record_num = 0;
+ result_list->keyread = FALSE;
+ result_list->desc_flg = FALSE;
+ result_list->sorted = FALSE;
+ result_list->key_info = NULL;
+ result_list->key_order = 0;
+ result_list->limit_num =
+ result_list->internal_limit >= result_list->split_read ?
+ result_list->split_read : result_list->internal_limit;
+
+ if (select_lex->explicit_limit)
+ {
+ result_list->internal_offset += offset_limit;
+ } else {
+ offset_limit = 0;
+ }
+
+ /* making a query */
+ fields->set_pos_to_first_dbton_id();
+ while ((dbton_id = fields->get_next_dbton_id()) < SPIDER_DBTON_SIZE)
+ {
+ dbton_hdl = spider->dbton_handler[dbton_id];
+ result_list->direct_distinct = query.distinct;
+ fields->set_pos_to_first_field_chain();
+ if ((error_num = dbton_hdl->reset_sql(SPIDER_SQL_TYPE_SELECT_SQL)))
+ {
+ DBUG_RETURN(error_num);
+ }
+ if ((error_num = dbton_hdl->append_select_part(SPIDER_SQL_TYPE_SELECT_SQL)))
+ {
+ DBUG_RETURN(error_num);
+ }
+ fields->set_field_ptr(table->field);
+ if ((error_num = dbton_hdl->append_list_item_select_part(
+ query.select, NULL, 0, TRUE, fields, SPIDER_SQL_TYPE_SELECT_SQL)))
+ {
+ DBUG_RETURN(error_num);
+ }
+ if ((error_num = dbton_hdl->append_from_and_tables_part(
+ fields, SPIDER_SQL_TYPE_SELECT_SQL)))
+ {
+ DBUG_RETURN(error_num);
+ }
+ if (query.where)
+ {
+ if ((error_num =
+ dbton_hdl->append_where_part(SPIDER_SQL_TYPE_SELECT_SQL)))
+ {
+ DBUG_RETURN(error_num);
+ }
+ if ((error_num = dbton_hdl->append_item_type_part(
+ query.where, NULL, 0, TRUE, fields, SPIDER_SQL_TYPE_SELECT_SQL)))
+ {
+ DBUG_RETURN(error_num);
+ }
+ }
+ if (query.group_by)
+ {
+ if ((error_num = dbton_hdl->append_group_by_part(
+ query.group_by, NULL, 0, TRUE, fields, SPIDER_SQL_TYPE_SELECT_SQL)))
+ {
+ DBUG_RETURN(error_num);
+ }
+ }
+ if (query.having)
+ {
+ if ((error_num =
+ dbton_hdl->append_having_part(SPIDER_SQL_TYPE_SELECT_SQL)))
+ {
+ DBUG_RETURN(error_num);
+ }
+ if ((error_num = dbton_hdl->append_item_type_part(
+ query.having, NULL, 0, TRUE, fields, SPIDER_SQL_TYPE_SELECT_SQL)))
+ {
+ DBUG_RETURN(error_num);
+ }
+ }
+ if (query.order_by)
+ {
+ if ((error_num = dbton_hdl->append_order_by_part(
+ query.order_by, NULL, 0, TRUE, fields, SPIDER_SQL_TYPE_SELECT_SQL)))
+ {
+ DBUG_RETURN(error_num);
+ }
+ }
+ if ((error_num = dbton_hdl->append_limit_part(result_list->internal_offset,
+ result_list->limit_num, SPIDER_SQL_TYPE_SELECT_SQL)))
+ {
+ DBUG_RETURN(error_num);
+ }
+ if ((error_num = dbton_hdl->append_select_lock_part(
+ SPIDER_SQL_TYPE_SELECT_SQL)))
+ {
+ DBUG_RETURN(error_num);
+ }
+ }
+
+ fields->set_pos_to_first_link_idx_chain();
+ while ((link_idx_chain = fields->get_next_link_idx_chain()))
+ {
+ conn = link_idx_chain->conn;
+ link_idx_holder = link_idx_chain->link_idx_holder;
+ link_idx = link_idx_holder->link_idx;
+ dbton_hdl = spider->dbton_handler[conn->dbton_id];
+ spider->link_idx_chain = link_idx_chain;
+#ifndef WITHOUT_SPIDER_BG_SEARCH
+ if (result_list->bgs_phase > 0)
+ {
+ if ((error_num = spider_check_and_init_casual_read(trx->thd, spider,
+ link_idx)))
+ DBUG_RETURN(error_num);
+ if ((error_num = spider_bg_conn_search(spider, link_idx,
+ dbton_hdl->first_link_idx, TRUE, FALSE,
+ !fields->is_first_link_ok_chain(link_idx_chain))))
+ {
+ if (
+ error_num != HA_ERR_END_OF_FILE &&
+ spider->need_mons[link_idx]
+ ) {
+ error_num = fields->ping_table_mon_from_table(link_idx_chain);
+ }
+ if ((error_num = spider->check_error_mode_eof(error_num)) == HA_ERR_END_OF_FILE)
+ {
+ store_error = HA_ERR_END_OF_FILE;
+ error_num = 0;
+ }
+ DBUG_RETURN(error_num);
+ }
+ } else {
+#endif
+ pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
+ if (dbton_hdl->need_lock_before_set_sql_for_exec(
+ SPIDER_SQL_TYPE_SELECT_SQL))
+ {
+ pthread_mutex_lock(&conn->mta_conn_mutex);
+ SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ }
+ if ((error_num =
+ dbton_hdl->set_sql_for_exec(SPIDER_SQL_TYPE_SELECT_SQL, link_idx,
+ link_idx_chain)))
+ {
+ if (dbton_hdl->need_lock_before_set_sql_for_exec(
+ SPIDER_SQL_TYPE_SELECT_SQL))
+ {
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ }
+ DBUG_RETURN(error_num);
+ }
+ if (!dbton_hdl->need_lock_before_set_sql_for_exec(
+ SPIDER_SQL_TYPE_SELECT_SQL))
+ {
+ 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];
+ DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
+ DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
+ 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)))
+ {
+ DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
+ DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
+ 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 (
+ spider->need_mons[link_idx]
+ ) {
+ error_num = fields->ping_table_mon_from_table(link_idx_chain);
+ }
+ if ((error_num = spider->check_error_mode_eof(error_num)) == HA_ERR_END_OF_FILE)
+ {
+ store_error = HA_ERR_END_OF_FILE;
+ error_num = 0;
+ }
+ DBUG_RETURN(error_num);
+ }
+ spider_conn_set_timeout_from_share(conn, link_idx,
+ trx->thd, share);
+ if (dbton_hdl->execute_sql(
+ SPIDER_SQL_TYPE_SELECT_SQL,
+ conn,
+ spider->result_list.quick_mode,
+ &spider->need_mons[link_idx])
+ ) {
+ DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
+ DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ error_num = spider_db_errorno(conn);
+ if (
+ spider->need_mons[link_idx]
+ ) {
+ error_num = fields->ping_table_mon_from_table(link_idx_chain);
+ }
+ if ((error_num = spider->check_error_mode_eof(error_num)) == HA_ERR_END_OF_FILE)
+ {
+ store_error = HA_ERR_END_OF_FILE;
+ error_num = 0;
+ }
+ DBUG_RETURN(error_num);
+ }
+ spider->connection_ids[link_idx] = conn->connection_id;
+ DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
+ DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
+ conn->mta_conn_mutex_lock_already = FALSE;
+ conn->mta_conn_mutex_unlock_later = FALSE;
+ if (fields->is_first_link_ok_chain(link_idx_chain))
+ {
+ if ((error_num = spider_db_store_result(spider, link_idx, table)))
+ {
+ if (
+ error_num != HA_ERR_END_OF_FILE &&
+ spider->need_mons[link_idx]
+ ) {
+ error_num = fields->ping_table_mon_from_table(link_idx_chain);
+ }
+ if ((error_num = spider->check_error_mode_eof(error_num)) == HA_ERR_END_OF_FILE)
+ {
+ store_error = HA_ERR_END_OF_FILE;
+ error_num = 0;
+ }
+ DBUG_RETURN(error_num);
+ }
+ spider->result_link_idx = link_idx;
+ spider->result_link_idx_chain = link_idx_chain;
+ } else {
+ spider_db_discard_result(spider, link_idx, conn);
+ SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
+ pthread_mutex_unlock(&conn->mta_conn_mutex);
+ }
+#ifndef WITHOUT_SPIDER_BG_SEARCH
+ }
+#endif
+ }
+
+ first = TRUE;
+ DBUG_RETURN(0);
+}
+
+int spider_group_by_handler::next_row()
+{
+ int error_num, link_idx;
+ spider_db_handler *dbton_hdl;
+ SPIDER_CONN *conn;
+ SPIDER_LINK_IDX_CHAIN *link_idx_chain;
+ SPIDER_LINK_IDX_HOLDER *link_idx_holder;
+ DBUG_ENTER("spider_group_by_handler::next_row");
+ if (trx->thd->killed)
+ {
+ my_error(ER_QUERY_INTERRUPTED, MYF(0));
+ DBUG_RETURN(ER_QUERY_INTERRUPTED);
+ }
+ if (store_error)
+ {
+ if (store_error == HA_ERR_END_OF_FILE)
+ {
+ table->status = STATUS_NOT_FOUND;
+ }
+ DBUG_RETURN(store_error);
+ }
+ if (first)
+ {
+ first = FALSE;
+ if (spider->use_pre_call)
+ {
+ if (spider->store_error_num)
+ {
+ if (spider->store_error_num == HA_ERR_END_OF_FILE)
+ table->status = STATUS_NOT_FOUND;
+ DBUG_RETURN(spider->store_error_num);
+ }
+#ifndef WITHOUT_SPIDER_BG_SEARCH
+ if (spider->result_list.bgs_phase > 0)
+ {
+ fields->set_pos_to_first_link_idx_chain();
+ while ((link_idx_chain = fields->get_next_link_idx_chain()))
+ {
+ conn = link_idx_chain->conn;
+ link_idx_holder = link_idx_chain->link_idx_holder;
+ link_idx = link_idx_holder->link_idx;
+ dbton_hdl = spider->dbton_handler[conn->dbton_id];
+ spider->link_idx_chain = link_idx_chain;
+ if ((error_num = spider_bg_conn_search(spider, link_idx,
+ dbton_hdl->first_link_idx, TRUE, TRUE,
+ !fields->is_first_link_ok_chain(link_idx_chain))))
+ {
+ if (
+ error_num != HA_ERR_END_OF_FILE &&
+ spider->need_mons[link_idx]
+ ) {
+ error_num = fields->ping_table_mon_from_table(link_idx_chain);
+ }
+ if ((error_num = spider->check_error_mode_eof(error_num)) == HA_ERR_END_OF_FILE)
+ {
+ table->status = STATUS_NOT_FOUND;
+ }
+ DBUG_RETURN(error_num);
+ }
+ }
+ }
+#endif
+ spider->use_pre_call = FALSE;
+ }
+ } else if (offset_limit)
+ {
+ --offset_limit;
+ DBUG_RETURN(0);
+ }
+ if ((error_num = spider_db_seek_next(table->record[0], spider,
+ spider->search_link_idx, table)))
+ {
+ if ((error_num = spider->check_error_mode_eof(error_num)) == HA_ERR_END_OF_FILE)
+ {
+ table->status = STATUS_NOT_FOUND;
+ }
+ DBUG_RETURN(error_num);
+ }
+ DBUG_RETURN(0);
+}
+
+int spider_group_by_handler::end_scan()
+{
+ DBUG_ENTER("spider_group_by_handler::end_scan");
+ DBUG_RETURN(0);
+}
+
+group_by_handler *spider_create_group_by_handler(
+ THD *thd,
+ Query *query
+) {
+ spider_group_by_handler *group_by_handler;
+ Item *item;
+ TABLE_LIST *from;
+ SPIDER_CONN *conn;
+ ha_spider *spider;
+ SPIDER_SHARE *share;
+ int roop_count, lock_mode;
+ List_iterator_fast<Item> it(*query->select);
+ uchar dbton_bitmap[spider_bitmap_size(SPIDER_DBTON_SIZE)];
+ uchar dbton_bitmap_tmp[spider_bitmap_size(SPIDER_DBTON_SIZE)];
+ ORDER *order;
+ bool keep_going;
+ bool find_dbton = FALSE;
+ spider_fields *fields = NULL, *fields_arg = NULL;
+ uint table_idx, dbton_id;
+ long tgt_link_status;
+ DBUG_ENTER("spider_create_group_by_handler");
+
+ switch (thd_sql_command(thd))
+ {
+ case SQLCOM_UPDATE:
+ case SQLCOM_UPDATE_MULTI:
+ case SQLCOM_DELETE:
+ case SQLCOM_DELETE_MULTI:
+ DBUG_PRINT("info",("spider update and delete does not support this feature"));
+ DBUG_RETURN(NULL);
+ default:
+ break;
+ }
+
+#ifdef WITH_PARTITION_STORAGE_ENGINE
+ from = query->from;
+ do {
+ DBUG_PRINT("info",("spider from=%p", from));
+ if (from->table->const_table)
+ continue;
+ if (from->table->part_info)
+ {
+ DBUG_PRINT("info",("spider partition handler"));
+#if defined(PARTITION_HAS_GET_CHILD_HANDLERS) && defined(PARTITION_HAS_GET_PART_SPEC)
+ ha_partition *partition = (ha_partition *) from->table->file;
+ part_id_range *part_spec = partition->get_part_spec();
+ DBUG_PRINT("info",("spider part_spec->start_part=%u", part_spec->start_part));
+ DBUG_PRINT("info",("spider part_spec->end_part=%u", part_spec->end_part));
+ if (
+ part_spec->start_part == partition->get_no_current_part_id() ||
+ part_spec->start_part != part_spec->end_part
+ ) {
+ DBUG_PRINT("info",("spider using multiple partitions is not supported by this feature yet"));
+#else
+ DBUG_PRINT("info",("spider partition is not supported by this feature yet"));
+#endif
+ DBUG_RETURN(NULL);
+#if defined(PARTITION_HAS_GET_CHILD_HANDLERS) && defined(PARTITION_HAS_GET_PART_SPEC)
+ }
+#endif
+ }
+ } while ((from = from->next_local));
+#endif
+
+ table_idx = 0;
+ from = query->from;
+ while (from && from->table->const_table)
+ {
+ from = from->next_local;
+ }
+ if (!from)
+ {
+ /* all tables are const_table */
+ DBUG_RETURN(NULL);
+ }
+#if defined(PARTITION_HAS_GET_CHILD_HANDLERS) && defined(PARTITION_HAS_GET_PART_SPEC)
+ if (from->table->part_info)
+ {
+ ha_partition *partition = (ha_partition *) from->table->file;
+ part_id_range *part_spec = partition->get_part_spec();
+ handler **handlers = partition->get_child_handlers();
+ spider = (ha_spider *) handlers[part_spec->start_part];
+ } else {
+#endif
+ spider = (ha_spider *) from->table->file;
+#if defined(PARTITION_HAS_GET_CHILD_HANDLERS) && defined(PARTITION_HAS_GET_PART_SPEC)
+ }
+#endif
+ share = spider->share;
+ spider->idx_for_direct_join = table_idx;
+ ++table_idx;
+ memset(dbton_bitmap, 0, spider_bitmap_size(SPIDER_DBTON_SIZE));
+ for (roop_count = 0; roop_count < (int) share->use_dbton_count; ++roop_count)
+ {
+ dbton_id = share->use_sql_dbton_ids[roop_count];
+ if (
+ spider_dbton[dbton_id].support_direct_join &&
+ spider_dbton[dbton_id].support_direct_join()
+ ) {
+ spider_set_bit(dbton_bitmap, dbton_id);
+ }
+ }
+ while ((from = from->next_local))
+ {
+ if (from->table->const_table)
+ continue;
+#if defined(PARTITION_HAS_GET_CHILD_HANDLERS) && defined(PARTITION_HAS_GET_PART_SPEC)
+ if (from->table->part_info)
+ {
+ ha_partition *partition = (ha_partition *) from->table->file;
+ part_id_range *part_spec = partition->get_part_spec();
+ handler **handlers = partition->get_child_handlers();
+ spider = (ha_spider *) handlers[part_spec->start_part];
+ } else {
+#endif
+ spider = (ha_spider *) from->table->file;
+#if defined(PARTITION_HAS_GET_CHILD_HANDLERS) && defined(PARTITION_HAS_GET_PART_SPEC)
+ }
+#endif
+ share = spider->share;
+ spider->idx_for_direct_join = table_idx;
+ ++table_idx;
+ memset(dbton_bitmap_tmp, 0, spider_bitmap_size(SPIDER_DBTON_SIZE));
+ for (roop_count = 0; roop_count < (int) share->use_dbton_count; ++roop_count)
+ {
+ dbton_id = share->use_sql_dbton_ids[roop_count];
+ if (
+ spider_dbton[dbton_id].support_direct_join &&
+ spider_dbton[dbton_id].support_direct_join()
+ ) {
+ spider_set_bit(dbton_bitmap_tmp, dbton_id);
+ }
+ }
+ for (roop_count = 0;
+ roop_count < spider_bitmap_size(SPIDER_DBTON_SIZE); ++roop_count)
+ {
+ dbton_bitmap[roop_count] &= dbton_bitmap_tmp[roop_count];
+ }
+ }
+
+ from = query->from;
+ do {
+ if (from->table->const_table)
+ continue;
+#if defined(PARTITION_HAS_GET_CHILD_HANDLERS) && defined(PARTITION_HAS_GET_PART_SPEC)
+ if (from->table->part_info)
+ {
+ ha_partition *partition = (ha_partition *) from->table->file;
+ part_id_range *part_spec = partition->get_part_spec();
+ handler **handlers = partition->get_child_handlers();
+ spider = (ha_spider *) handlers[part_spec->start_part];
+ } else {
+#endif
+ spider = (ha_spider *) from->table->file;
+#if defined(PARTITION_HAS_GET_CHILD_HANDLERS) && defined(PARTITION_HAS_GET_PART_SPEC)
+ }
+#endif
+ share = spider->share;
+ if (spider_param_skip_default_condition(thd,
+ share->skip_default_condition))
+ {
+ /* find skip_default_condition = 1 */
+ break;
+ }
+ } while ((from = from->next_local));
+
+ for (roop_count = 0; roop_count < SPIDER_DBTON_SIZE; ++roop_count)
+ {
+ if (spider_bit_is_set(dbton_bitmap, roop_count))
+ {
+ if (!fields)
+ {
+ fields_arg = new spider_fields();
+ if (!fields_arg)
+ {
+ DBUG_RETURN(NULL);
+ }
+ }
+ keep_going = TRUE;
+ it.init(*query->select);
+ while ((item = it++))
+ {
+ DBUG_PRINT("info",("spider select item=%p", item));
+ if (item->const_item())
+ {
+ DBUG_PRINT("info",("spider const item"));
+ continue;
+ }
+ if (spider_db_print_item_type(item, NULL, spider, NULL, NULL, 0,
+ roop_count, TRUE, fields_arg))
+ {
+ DBUG_PRINT("info",("spider dbton_id=%d can't create select", roop_count));
+ spider_clear_bit(dbton_bitmap, roop_count);
+ keep_going = FALSE;
+ break;
+ }
+ }
+ if (keep_going)
+ {
+ if (spider_dbton[roop_count].db_util->append_from_and_tables(
+ spider, fields_arg, NULL, query->from, table_idx))
+ {
+ DBUG_PRINT("info",("spider dbton_id=%d can't create from", roop_count));
+ spider_clear_bit(dbton_bitmap, roop_count);
+ keep_going = FALSE;
+ }
+ }
+ if (keep_going)
+ {
+ DBUG_PRINT("info",("spider query->where=%p", query->where));
+ if (query->where)
+ {
+ if (spider_db_print_item_type(query->where, NULL, spider, NULL, NULL, 0,
+ roop_count, TRUE, fields_arg))
+ {
+ DBUG_PRINT("info",("spider dbton_id=%d can't create where", roop_count));
+ spider_clear_bit(dbton_bitmap, roop_count);
+ keep_going = FALSE;
+ }
+ }
+ }
+ if (keep_going)
+ {
+ DBUG_PRINT("info",("spider query->group_by=%p", query->group_by));
+ if (query->group_by)
+ {
+ for (order = query->group_by; order; order = order->next)
+ {
+ if (spider_db_print_item_type((*order->item), NULL, spider, NULL, NULL, 0,
+ roop_count, TRUE, fields_arg))
+ {
+ DBUG_PRINT("info",("spider dbton_id=%d can't create group by", roop_count));
+ spider_clear_bit(dbton_bitmap, roop_count);
+ keep_going = FALSE;
+ break;
+ }
+ }
+ }
+ }
+ if (keep_going)
+ {
+ DBUG_PRINT("info",("spider query->order_by=%p", query->order_by));
+ if (query->order_by)
+ {
+ for (order = query->order_by; order; order = order->next)
+ {
+ if (spider_db_print_item_type((*order->item), NULL, spider, NULL, NULL, 0,
+ roop_count, TRUE, fields_arg))
+ {
+ DBUG_PRINT("info",("spider dbton_id=%d can't create order by", roop_count));
+ spider_clear_bit(dbton_bitmap, roop_count);
+ keep_going = FALSE;
+ break;
+ }
+ }
+ }
+ }
+ if (keep_going)
+ {
+ DBUG_PRINT("info",("spider query->having=%p", query->having));
+ if (query->having)
+ {
+ if (spider_db_print_item_type(query->having, NULL, spider, NULL, NULL, 0,
+ roop_count, TRUE, fields_arg))
+ {
+ DBUG_PRINT("info",("spider dbton_id=%d can't create having", roop_count));
+ spider_clear_bit(dbton_bitmap, roop_count);
+ keep_going = FALSE;
+ }
+ }
+ }
+ if (keep_going)
+ {
+ find_dbton = TRUE;
+ fields = fields_arg;
+ fields_arg = NULL;
+ } else {
+ delete fields_arg;
+ }
+ }
+ }
+ if (!find_dbton)
+ {
+ DBUG_RETURN(NULL);
+ }
+
+ if (fields->create_table_holder(table_idx))
+ {
+ delete fields;
+ DBUG_RETURN(NULL);
+ }
+
+ from = query->from;
+ while (from->table->const_table)
+ {
+ from = from->next_local;
+ }
+#if defined(PARTITION_HAS_GET_CHILD_HANDLERS) && defined(PARTITION_HAS_GET_PART_SPEC)
+ if (from->table->part_info)
+ {
+ ha_partition *partition = (ha_partition *) from->table->file;
+ part_id_range *part_spec = partition->get_part_spec();
+ handler **handlers = partition->get_child_handlers();
+ spider = (ha_spider *) handlers[part_spec->start_part];
+ } else {
+#endif
+ spider = (ha_spider *) from->table->file;
+#if defined(PARTITION_HAS_GET_CHILD_HANDLERS) && defined(PARTITION_HAS_GET_PART_SPEC)
+ }
+#endif
+ share = spider->share;
+ lock_mode = spider_conn_lock_mode(spider);
+ if (lock_mode)
+ {
+ tgt_link_status = SPIDER_LINK_STATUS_RECOVERY;
+ } else {
+ tgt_link_status = SPIDER_LINK_STATUS_OK;
+ }
+ DBUG_PRINT("info",("spider s->db=%s", from->table->s->db.str));
+ DBUG_PRINT("info",("spider s->table_name=%s", from->table->s->table_name.str));
+ if (!fields->add_table(spider))
+ {
+ DBUG_PRINT("info",("spider can not add a table"));
+ delete fields;
+ DBUG_RETURN(NULL);
+ }
+ for (
+ roop_count = spider_conn_link_idx_next(share->link_statuses,
+ spider->conn_link_idx, -1, share->link_count,
+ tgt_link_status);
+ roop_count < (int) share->link_count;
+ roop_count = spider_conn_link_idx_next(share->link_statuses,
+ spider->conn_link_idx, roop_count, share->link_count,
+ tgt_link_status)
+ ) {
+ if (spider_param_use_handler(thd, share->use_handlers[roop_count]))
+ {
+ DBUG_PRINT("info",("spider direct_join does not support use_handler"));
+ if (lock_mode)
+ {
+ delete fields;
+ DBUG_RETURN(NULL);
+ }
+ continue;
+ }
+ conn = spider->conns[roop_count];
+ DBUG_PRINT("info",("spider roop_count=%d", roop_count));
+ DBUG_PRINT("info",("spider conn=%p", conn));
+ DBUG_ASSERT(conn);
+ if (conn->table_lock)
+ {
+ DBUG_PRINT("info",("spider direct_join does not support with lock tables yet"));
+ if (lock_mode)
+ {
+ delete fields;
+ DBUG_RETURN(NULL);
+ }
+ continue;
+ }
+ if (!fields->add_conn(conn,
+ share->access_balances[spider->conn_link_idx[roop_count]]))
+ {
+ DBUG_PRINT("info",("spider can not create conn_holder"));
+ delete fields;
+ DBUG_RETURN(NULL);
+ }
+ if (fields->add_link_idx(conn->conn_holder_for_direct_join, spider, roop_count))
+ {
+ DBUG_PRINT("info",("spider can not create link_idx_holder"));
+ delete fields;
+ DBUG_RETURN(NULL);
+ }
+ }
+ if (!fields->has_conn_holder())
+ {
+ delete fields;
+ DBUG_RETURN(NULL);
+ }
+
+ while ((from = from->next_local))
+ {
+ if (from->table->const_table)
+ continue;
+ fields->clear_conn_holder_from_conn();
+
+#if defined(PARTITION_HAS_GET_CHILD_HANDLERS) && defined(PARTITION_HAS_GET_PART_SPEC)
+ if (from->table->part_info)
+ {
+ ha_partition *partition = (ha_partition *) from->table->file;
+ part_id_range *part_spec = partition->get_part_spec();
+ handler **handlers = partition->get_child_handlers();
+ spider = (ha_spider *) handlers[part_spec->start_part];
+ } else {
+#endif
+ spider = (ha_spider *) from->table->file;
+#if defined(PARTITION_HAS_GET_CHILD_HANDLERS) && defined(PARTITION_HAS_GET_PART_SPEC)
+ }
+#endif
+ share = spider->share;
+ if (!fields->add_table(spider))
+ {
+ DBUG_PRINT("info",("spider can not add a table"));
+ delete fields;
+ DBUG_RETURN(NULL);
+ }
+ DBUG_PRINT("info",("spider s->db=%s", from->table->s->db.str));
+ DBUG_PRINT("info",("spider s->table_name=%s", from->table->s->table_name.str));
+ for (
+ roop_count = spider_conn_link_idx_next(share->link_statuses,
+ spider->conn_link_idx, -1, share->link_count,
+ tgt_link_status);
+ roop_count < (int) share->link_count;
+ roop_count = spider_conn_link_idx_next(share->link_statuses,
+ spider->conn_link_idx, roop_count, share->link_count,
+ tgt_link_status)
+ ) {
+ DBUG_PRINT("info",("spider roop_count=%d", roop_count));
+ if (spider_param_use_handler(thd, share->use_handlers[roop_count]))
+ {
+ DBUG_PRINT("info",("spider direct_join does not support use_handler"));
+ if (lock_mode)
+ {
+ delete fields;
+ DBUG_RETURN(NULL);
+ }
+ continue;
+ }
+ conn = spider->conns[roop_count];
+ DBUG_PRINT("info",("spider conn=%p", conn));
+ if (!fields->check_conn_same_conn(conn))
+ {
+ DBUG_PRINT("info",("spider connection %p can not be used for this query with locking",
+ conn));
+ if (lock_mode)
+ {
+ delete fields;
+ DBUG_RETURN(NULL);
+ }
+ continue;
+ }
+ if (fields->add_link_idx(conn->conn_holder_for_direct_join, spider, roop_count))
+ {
+ DBUG_PRINT("info",("spider can not create link_idx_holder"));
+ delete fields;
+ DBUG_RETURN(NULL);
+ }
+ }
+
+ if (fields->remove_conn_if_not_checked())
+ {
+ if (lock_mode)
+ {
+ DBUG_PRINT("info",("spider some connections can not be used for this query with locking"));
+ delete fields;
+ DBUG_RETURN(NULL);
+ }
+ }
+ if (!fields->has_conn_holder())
+ {
+ delete fields;
+ DBUG_RETURN(NULL);
+ }
+ }
+
+ if (!fields->all_query_fields_are_query_table_members())
+ {
+ DBUG_PRINT("info", ("spider found a query field that is not a query table member"));
+ delete fields;
+ DBUG_RETURN(NULL);
+ }
+
+ fields->check_support_dbton(dbton_bitmap);
+ if (!fields->has_conn_holder())
+ {
+ DBUG_PRINT("info",("spider all chosen connections can't match dbton_id"));
+ delete fields;
+ DBUG_RETURN(NULL);
+ }
+
+ /* choose a connection */
+ if (!lock_mode)
+ {
+ fields->choose_a_conn();
+ }
+
+ if (fields->make_link_idx_chain(tgt_link_status))
+ {
+ DBUG_PRINT("info",("spider can not create link_idx_chain"));
+ delete fields;
+ DBUG_RETURN(NULL);
+ }
+
+ /* choose link_id */
+ if (fields->check_link_ok_chain())
+ {
+ DBUG_PRINT("info",("spider do not have link ok status"));
+ delete fields;
+ DBUG_RETURN(NULL);
+ }
+
+ fields->set_first_link_idx();
+
+ if (!(group_by_handler = new spider_group_by_handler(thd, query, fields)))
+ {
+ DBUG_PRINT("info",("spider can't create group_by_handler"));
+ delete fields;
+ DBUG_RETURN(NULL);
+ }
+ query->distinct = FALSE;
+ query->where = NULL;
+ query->group_by = NULL;
+ query->having = NULL;
+ query->order_by = NULL;
+ DBUG_RETURN(group_by_handler);
+}
+#endif
diff --git a/storage/spider/spd_group_by_handler.h b/storage/spider/spd_group_by_handler.h
new file mode 100644
index 00000000000..09f82168708
--- /dev/null
+++ b/storage/spider/spd_group_by_handler.h
@@ -0,0 +1,44 @@
+/* Copyright (C) 2016 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
+ 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 */
+
+#ifdef SPIDER_HAS_GROUP_BY_HANDLER
+class spider_group_by_handler: public group_by_handler
+{
+ Query query;
+ spider_fields *fields;
+ ha_spider *spider;
+ SPIDER_TRX *trx;
+ spider_db_result *result;
+ bool first;
+ longlong offset_limit;
+ int store_error;
+
+public:
+ spider_group_by_handler(
+ THD *thd_arg,
+ Query *query_arg,
+ spider_fields *fields_arg
+ );
+ ~spider_group_by_handler();
+ int init_scan();
+ int next_row();
+ int end_scan();
+};
+
+group_by_handler *spider_create_group_by_handler(
+ THD *thd,
+ Query *query
+);
+#endif
diff --git a/storage/spider/spd_i_s.cc b/storage/spider/spd_i_s.cc
index 1a4ef510ac7..c43c666601f 100644
--- a/storage/spider/spd_i_s.cc
+++ b/storage/spider/spd_i_s.cc
@@ -1,4 +1,4 @@
-/* Copyright (C) 2012-2014 Kentoku Shiba
+/* Copyright (C) 2012-2018 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
@@ -14,7 +14,9 @@
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */
#define MYSQL_SERVER 1
+#include <my_global.h>
#include "mysql_version.h"
+#include "spd_environ.h"
#if MYSQL_VERSION_ID < 50500
#include "mysql_priv.h"
#include <mysql/plugin.h>
@@ -162,6 +164,6 @@ struct st_maria_plugin spider_i_s_alloc_mem_maria =
NULL,
NULL,
"1.0",
- MariaDB_PLUGIN_MATURITY_GAMMA,
+ MariaDB_PLUGIN_MATURITY_STABLE,
};
#endif
diff --git a/storage/spider/spd_include.h b/storage/spider/spd_include.h
index a871e186d96..b0a3dae72ba 100644
--- a/storage/spider/spd_include.h
+++ b/storage/spider/spd_include.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2008-2015 Kentoku Shiba
+/* Copyright (C) 2008-2018 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
@@ -13,14 +13,15 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */
-#define SPIDER_DETAIL_VERSION "3.2.37"
-#define SPIDER_HEX_VERSION 0x0302
+#define SPIDER_DETAIL_VERSION "3.3.14"
+#define SPIDER_HEX_VERSION 0x0303
#if MYSQL_VERSION_ID < 50500
+#define spider_my_free(A,B) my_free(A,B)
#define pthread_mutex_assert_owner(A)
#define pthread_mutex_assert_not_owner(A)
#else
-#define my_free(A,B) my_free(A)
+#define spider_my_free(A,B) my_free(A)
#ifdef pthread_mutex_t
#undef pthread_mutex_t
#endif
@@ -70,18 +71,28 @@
#define my_sprintf(A,B) sprintf B
#endif
+
#if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100004
#define spider_stmt_da_message(A) thd_get_error_message(A)
#define spider_stmt_da_sql_errno(A) thd_get_error_number(A)
#define spider_user_defined_key_parts(A) (A)->user_defined_key_parts
#define spider_join_table_count(A) (A)->table_count
#define SPIDER_CAN_BG_UPDATE (1LL << 39)
-#define SPIDER_ALTER_ADD_PARTITION Alter_info::ALTER_ADD_PARTITION
-#define SPIDER_ALTER_DROP_PARTITION Alter_info::ALTER_DROP_PARTITION
-#define SPIDER_ALTER_COALESCE_PARTITION Alter_info::ALTER_COALESCE_PARTITION
-#define SPIDER_ALTER_REORGANIZE_PARTITION Alter_info::ALTER_REORGANIZE_PARTITION
-#define SPIDER_ALTER_TABLE_REORG Alter_info::ALTER_TABLE_REORG
-#define SPIDER_ALTER_REBUILD_PARTITION Alter_info::ALTER_REBUILD_PARTITION
+#if MYSQL_VERSION_ID >= 100304
+#define SPIDER_ALTER_PARTITION_ADD ALTER_PARTITION_ADD
+#define SPIDER_ALTER_PARTITION_DROP ALTER_PARTITION_DROP
+#define SPIDER_ALTER_PARTITION_COALESCE ALTER_PARTITION_COALESCE
+#define SPIDER_ALTER_PARTITION_REORGANIZE ALTER_PARTITION_REORGANIZE
+#define SPIDER_ALTER_PARTITION_TABLE_REORG ALTER_PARTITION_TABLE_REORG
+#define SPIDER_ALTER_PARTITION_REBUILD ALTER_PARTITION_REBUILD
+#else
+#define SPIDER_ALTER_PARTITION_ADD Alter_info::ALTER_ADD_PARTITION
+#define SPIDER_ALTER_PARTITION_DROP Alter_info::ALTER_DROP_PARTITION
+#define SPIDER_ALTER_PARTITION_COALESCE Alter_info::ALTER_COALESCE_PARTITION
+#define SPIDER_ALTER_PARTITION_REORGANIZE Alter_info::ALTER_REORGANIZE_PARTITION
+#define SPIDER_ALTER_PARTITION_TABLE_REORG Alter_info::ALTER_TABLE_REORG
+#define SPIDER_ALTER_PARTITION_REBUILD Alter_info::ALTER_REBUILD_PARTITION
+#endif
#define SPIDER_WARN_LEVEL_WARN Sql_condition::WARN_LEVEL_WARN
#define SPIDER_WARN_LEVEL_NOTE Sql_condition::WARN_LEVEL_NOTE
#define SPIDER_THD_KILL_CONNECTION KILL_CONNECTION
@@ -100,12 +111,12 @@
#endif
#define spider_user_defined_key_parts(A) (A)->key_parts
#define spider_join_table_count(A) (A)->tables
-#define SPIDER_ALTER_ADD_PARTITION ALTER_ADD_PARTITION
-#define SPIDER_ALTER_DROP_PARTITION ALTER_DROP_PARTITION
-#define SPIDER_ALTER_COALESCE_PARTITION ALTER_COALESCE_PARTITION
-#define SPIDER_ALTER_REORGANIZE_PARTITION ALTER_REORGANIZE_PARTITION
-#define SPIDER_ALTER_TABLE_REORG ALTER_TABLE_REORG
-#define SPIDER_ALTER_REBUILD_PARTITION ALTER_REBUILD_PARTITION
+#define SPIDER_ALTER_PARTITION_ADD ALTER_ADD_PARTITION
+#define SPIDER_ALTER_PARTITION_DROP ALTER_DROP_PARTITION
+#define SPIDER_ALTER_PARTITION_COALESCE ALTER_COALESCE_PARTITION
+#define SPIDER_ALTER_PARTITION_REORGANIZE ALTER_REORGANIZE_PARTITION
+#define SPIDER_ALTER_PARTITION_TABLE_REORG ALTER_TABLE_REORG
+#define SPIDER_ALTER_PARTITION_REBUILD ALTER_REBUILD_PARTITION
#define SPIDER_WARN_LEVEL_WARN MYSQL_ERROR::WARN_LEVEL_WARN
#define SPIDER_WARN_LEVEL_NOTE MYSQL_ERROR::WARN_LEVEL_NOTE
#define SPIDER_THD_KILL_CONNECTION THD::KILL_CONNECTION
@@ -133,10 +144,103 @@
#define SPIDER_Item_args_arg_count_IS_PROTECTED
#endif
+#if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100112
+#define SPIDER_Item_func_conv_charset_conv_charset collation.collation
+#else
+#define SPIDER_Item_func_conv_charset_conv_charset conv_charset
+#endif
+
+#if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100200
+#define SPIDER_WITHOUT_HA_STATISTIC_INCREMENT
+#define SPIDER_init_read_record(A,B,C,D,E,F,G,H) init_read_record(A,B,C,D,E,F,G,H)
+#define SPIDER_HAS_NEXT_THREAD_ID
+#define SPIDER_new_THD(A) (new THD(A))
+#define SPIDER_order_direction_is_asc(A) (A->direction == ORDER::ORDER_ASC)
+#else
+#define SPIDER_init_read_record(A,B,C,D,E,F,G,H) init_read_record(A,B,C,D,F,G,H)
+#define SPIDER_new_THD(A) (new THD())
+#define SPIDER_order_direction_is_asc(A) (A->asc)
+#endif
+
+#if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100201
+#define SPIDER_HAS_MY_CHARLEN
+#define SPIDER_open_temporary_table
+#endif
+
+#if defined(MARIADB_BASE_VERSION)
+#if MYSQL_VERSION_ID >= 100209
+#define SPIDER_generate_partition_syntax(A,B,C,D,E,F,G,H) generate_partition_syntax(A,B,C,E,F,G)
+#elif MYSQL_VERSION_ID >= 100200
+#define SPIDER_generate_partition_syntax(A,B,C,D,E,F,G,H) generate_partition_syntax(A,B,C,D,E,F,G,H)
+#elif MYSQL_VERSION_ID >= 100007
+#define SPIDER_generate_partition_syntax(A,B,C,D,E,F,G,H) generate_partition_syntax(B,C,D,E,F,G,H)
+#else
+#define SPIDER_generate_partition_syntax(A,B,C,D,E,F,G,H) generate_partition_syntax(B,C,D,E,F,G)
+#endif
+#else
+#define SPIDER_generate_partition_syntax(A,B,C,D,E,F,G,H)
+#endif
+
+#if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100209
+#define SPIDER_create_partition_name(A,B,C,D,E,F) create_partition_name(A,B,C,D,E,F)
+#define SPIDER_create_subpartition_name(A,B,C,D,E,F) create_subpartition_name(A,B,C,D,E,F)
+#define SPIDER_free_part_syntax(A,B)
+#else
+#define SPIDER_create_partition_name(A,B,C,D,E,F) create_partition_name(A,C,D,E,F)
+#define SPIDER_create_subpartition_name(A,B,C,D,E,F) create_subpartition_name(A,C,D,E,F)
+#define SPIDER_free_part_syntax(A,B) spider_my_free(A,B)
+#endif
+
+#if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100306
+#define SPIDER_read_record_read_record(A) read_record()
+#define SPIDER_has_Item_with_subquery
+#define SPIDER_use_LEX_CSTRING_for_KEY_Field_name
+#define SPIDER_use_LEX_CSTRING_for_Field_blob_constructor
+#define SPIDER_use_LEX_CSTRING_for_database_tablename_alias
+#define SPIDER_THD_db_str(A) (A)->db.str
+#define SPIDER_THD_db_length(A) (A)->db.length
+#define SPIDER_TABLE_LIST_db_str(A) (A)->db.str
+#define SPIDER_TABLE_LIST_db_length(A) (A)->db.length
+#define SPIDER_TABLE_LIST_table_name_str(A) (A)->table_name.str
+#define SPIDER_TABLE_LIST_table_name_length(A) (A)->table_name.length
+#define SPIDER_TABLE_LIST_alias_str(A) (A)->alias.str
+#define SPIDER_TABLE_LIST_alias_length(A) (A)->alias.length
+#define SPIDER_field_name_str(A) (A)->field_name.str
+#define SPIDER_field_name_length(A) (A)->field_name.length
+#define SPIDER_item_name_str(A) (A)->name.str
+#define SPIDER_item_name_length(A) (A)->name.length
+const LEX_CSTRING SPIDER_empty_string = {"", 0};
+#else
+#define SPIDER_read_record_read_record(A) read_record(A)
+#define SPIDER_THD_db_str(A) (A)->db
+#define SPIDER_THD_db_length(A) (A)->db_length
+#define SPIDER_TABLE_LIST_db_str(A) (A)->db
+#define SPIDER_TABLE_LIST_db_length(A) (A)->db_length
+#define SPIDER_TABLE_LIST_table_name_str(A) (A)->table_name
+#define SPIDER_TABLE_LIST_table_name_length(A) (A)->table_name_length
+#define SPIDER_TABLE_LIST_alias_str(A) (A)->alias
+#define SPIDER_TABLE_LIST_alias_length(A) strlen((A)->alias)
+#define SPIDER_field_name_str(A) (A)->field_name
+#define SPIDER_field_name_length(A) strlen((A)->field_name)
+#define SPIDER_item_name_str(A) (A)->name
+#define SPIDER_item_name_length(A) strlen((A)->name)
+const char SPIDER_empty_string = "";
+#endif
+
#if MYSQL_VERSION_ID >= 50500
#define SPIDER_HAS_HASH_VALUE_TYPE
#endif
+#if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100400
+#define SPIDER_date_mode_t(A) date_mode_t(A)
+#define SPIDER_str_to_datetime(A,B,C,D,E) str_to_datetime_or_date(A,B,C,D,E)
+#define SPIDER_get_linkage(A) A->get_linkage()
+#else
+#define SPIDER_date_mode_t(A) A
+#define SPIDER_str_to_datetime(A,B,C,D,E) str_to_datetime(A,B,C,D,E)
+#define SPIDER_get_linkage(A) A->linkage
+#endif
+
#define spider_bitmap_size(A) ((A + 7) / 8)
#define spider_set_bit(BITMAP, BIT) \
((BITMAP)[(BIT) / 8] |= (1 << ((BIT) & 7)))
@@ -155,12 +259,13 @@
#define SPIDER_LINK_MON_DRAW_FEW_MON 1
#define SPIDER_LINK_MON_DRAW 2
-#define SPIDER_TMP_SHARE_CHAR_PTR_COUNT 19
+#define SPIDER_TMP_SHARE_CHAR_PTR_COUNT 20
#define SPIDER_TMP_SHARE_UINT_COUNT 17
-#define SPIDER_TMP_SHARE_LONG_COUNT 18
+#define SPIDER_TMP_SHARE_LONG_COUNT 19
#define SPIDER_TMP_SHARE_LONGLONG_COUNT 3
-#define SPIDER_MEM_CALC_LIST_NUM 247
+#define SPIDER_MEM_CALC_LIST_NUM 257
+#define SPIDER_CONN_META_BUF_LEN 64
#define SPIDER_BACKUP_DASTATUS \
bool da_status; if (thd) da_status = thd->is_error(); else da_status = FALSE;
@@ -180,6 +285,25 @@
class ha_spider;
typedef struct st_spider_share SPIDER_SHARE;
+typedef struct st_spider_table_mon_list SPIDER_TABLE_MON_LIST;
+typedef struct st_spider_ip_port_conn SPIDER_IP_PORT_CONN;
+
+#ifndef WITHOUT_SPIDER_BG_SEARCH
+typedef struct st_spider_thread
+{
+ uint thread_idx;
+ THD *thd;
+ volatile bool killed;
+ volatile bool thd_wait;
+ volatile bool first_free_wait;
+ pthread_t thread;
+ pthread_cond_t cond;
+ pthread_mutex_t mutex;
+ pthread_cond_t sync_cond;
+ volatile SPIDER_SHARE *queue_first;
+ volatile SPIDER_SHARE *queue_last;
+} SPIDER_THREAD;
+#endif
typedef struct st_spider_file_pos
{
@@ -228,8 +352,10 @@ typedef struct st_spider_alter_table
char **tmp_tgt_ssl_keys;
char **tmp_tgt_default_files;
char **tmp_tgt_default_groups;
+ char **tmp_static_link_ids;
long *tmp_tgt_ports;
long *tmp_tgt_ssl_vscs;
+ long *tmp_monitoring_binlog_pos_at_failing;
long *tmp_link_statuses;
uint *tmp_server_names_lengths;
@@ -247,6 +373,7 @@ typedef struct st_spider_alter_table
uint *tmp_tgt_ssl_keys_lengths;
uint *tmp_tgt_default_files_lengths;
uint *tmp_tgt_default_groups_lengths;
+ uint *tmp_static_link_ids_lengths;
uint tmp_server_names_charlen;
uint tmp_tgt_table_names_charlen;
@@ -263,6 +390,7 @@ typedef struct st_spider_alter_table
uint tmp_tgt_ssl_keys_charlen;
uint tmp_tgt_default_files_charlen;
uint tmp_tgt_default_groups_charlen;
+ uint tmp_static_link_ids_charlen;
uint tmp_server_names_length;
uint tmp_tgt_table_names_length;
@@ -279,8 +407,10 @@ typedef struct st_spider_alter_table
uint tmp_tgt_ssl_keys_length;
uint tmp_tgt_default_files_length;
uint tmp_tgt_default_groups_length;
+ uint tmp_static_link_ids_length;
uint tmp_tgt_ports_length;
uint tmp_tgt_ssl_vscs_length;
+ uint tmp_monitoring_binlog_pos_at_failing_length;
uint tmp_link_statuses_length;
} SPIDER_ALTER_TABLE;
@@ -462,6 +592,12 @@ typedef struct st_spider_conn
THD *connect_error_thd;
query_id_t connect_error_query_id;
time_t connect_error_time;
+
+#ifdef SPIDER_HAS_GROUP_BY_HANDLER
+ SPIDER_CONN_HOLDER *conn_holder_for_direct_join;
+ SPIDER_LINK_IDX_CHAIN *link_idx_chain;
+#endif
+ SPIDER_IP_PORT_CONN *ip_port_conn;
} SPIDER_CONN;
typedef struct st_spider_lgtm_tblhnd_share
@@ -496,6 +632,7 @@ typedef struct st_spider_patition_handler_share
bool between_flg;
bool idx_bitmap_is_set;
bool rnd_bitmap_is_set;
+ query_id_t parallel_search_query_id;
} SPIDER_PARTITION_HANDLER_SHARE;
typedef struct st_spider_patition_share
@@ -551,6 +688,8 @@ typedef struct st_spider_transaction
bool tmp_flg;
bool registed_allocated_thds;
+ bool updated_in_this_trx;
+
THD *thd;
#ifdef SPIDER_HAS_HASH_VALUE_TYPE
my_hash_value_type thd_hash_value;
@@ -615,6 +754,7 @@ typedef struct st_spider_transaction
ulonglong direct_delete_count;
ulonglong direct_order_limit_count;
ulonglong direct_aggregate_count;
+ ulonglong parallel_search_count;
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
ulonglong hs_result_free_count;
#endif
@@ -726,6 +866,27 @@ typedef struct st_spider_share
pthread_cond_t *bg_mon_conds;
pthread_cond_t *bg_mon_sleep_conds;
#endif
+#ifndef WITHOUT_SPIDER_BG_SEARCH
+ /* static bg thread for sts and crd */
+ TABLE table;
+ ha_spider *sts_spider;
+ ha_spider *crd_spider;
+ SPIDER_THREAD *sts_thread;
+ SPIDER_THREAD *crd_thread;
+ volatile bool sts_spider_init;
+ volatile bool sts_working;
+ volatile bool sts_wait;
+ volatile bool crd_spider_init;
+ volatile bool crd_working;
+ volatile bool crd_wait;
+ volatile SPIDER_SHARE *sts_prev;
+ volatile SPIDER_SHARE *sts_next;
+ volatile SPIDER_SHARE *crd_prev;
+ volatile SPIDER_SHARE *crd_next;
+#endif
+
+ MEM_ROOT mem_root;
+
/*
volatile bool auto_increment_init;
volatile ulonglong auto_increment_lclval;
@@ -762,6 +923,8 @@ typedef struct st_spider_share
#ifdef WITH_PARTITION_STORAGE_ENGINE
int sts_sync;
#endif
+ int store_last_sts;
+ int load_sts_at_startup;
#ifndef WITHOUT_SPIDER_BG_SEARCH
int crd_bg_mode;
#endif
@@ -770,6 +933,8 @@ typedef struct st_spider_share
#ifdef WITH_PARTITION_STORAGE_ENGINE
int crd_sync;
#endif
+ int store_last_crd;
+ int load_crd_at_startup;
int crd_type;
double crd_weight;
longlong internal_offset;
@@ -797,6 +962,7 @@ typedef struct st_spider_share
longlong priority;
int quick_mode;
longlong quick_page_size;
+ longlong quick_page_byte;
int low_mem_read;
int table_count_mode;
int select_column_mode;
@@ -811,6 +977,7 @@ typedef struct st_spider_share
int use_table_charset;
int use_pushdown_udf;
int skip_default_condition;
+ int skip_parallel_search;
int direct_dup_insert;
longlong direct_order_limit;
int read_only_mode;
@@ -858,6 +1025,7 @@ typedef struct st_spider_share
char **tgt_ssl_keys;
char **tgt_default_files;
char **tgt_default_groups;
+ char **static_link_ids;
char **tgt_pk_names;
char **tgt_sequence_names;
char **conn_keys;
@@ -874,6 +1042,7 @@ typedef struct st_spider_share
long *monitoring_bg_flag;
long *monitoring_bg_kind;
#endif
+ long *monitoring_binlog_pos_at_failing;
long *monitoring_flag;
long *monitoring_kind;
#ifndef WITHOUT_SPIDER_BG_SEARCH
@@ -910,6 +1079,7 @@ typedef struct st_spider_share
uint *tgt_ssl_keys_lengths;
uint *tgt_default_files_lengths;
uint *tgt_default_groups_lengths;
+ uint *static_link_ids_lengths;
uint *tgt_pk_names_lengths;
uint *tgt_sequence_names_lengths;
uint *conn_keys_lengths;
@@ -939,6 +1109,7 @@ typedef struct st_spider_share
uint tgt_ssl_keys_charlen;
uint tgt_default_files_charlen;
uint tgt_default_groups_charlen;
+ uint static_link_ids_charlen;
uint tgt_pk_names_charlen;
uint tgt_sequence_names_charlen;
uint conn_keys_charlen;
@@ -964,6 +1135,7 @@ typedef struct st_spider_share
uint tgt_ssl_keys_length;
uint tgt_default_files_length;
uint tgt_default_groups_length;
+ uint static_link_ids_length;
uint tgt_pk_names_length;
uint tgt_sequence_names_length;
uint conn_keys_length;
@@ -980,6 +1152,7 @@ typedef struct st_spider_share
uint monitoring_bg_flag_length;
uint monitoring_bg_kind_length;
#endif
+ uint monitoring_binlog_pos_at_failing_length;
uint monitoring_flag_length;
uint monitoring_kind_length;
#ifndef WITHOUT_SPIDER_BG_SEARCH
@@ -1150,6 +1323,7 @@ typedef struct st_spider_table_mon
{
SPIDER_SHARE *share;
uint32 server_id;
+ st_spider_table_mon_list *parent;
st_spider_table_mon *next;
} SPIDER_TABLE_MON;
@@ -1283,3 +1457,19 @@ char *spider_create_string(
const char *str,
uint length
);
+
+
+typedef struct st_spider_ip_port_conn {
+ char *key;
+ size_t key_len;
+#ifdef SPIDER_HAS_HASH_VALUE_TYPE
+ my_hash_value_type key_hash_value;
+#endif
+ char remote_ip_str[SPIDER_CONN_META_BUF_LEN];
+ long remote_port;
+ ulong ip_port_count;
+ volatile ulong waiting_count;
+ pthread_mutex_t mutex;
+ pthread_cond_t cond;
+ ulonglong conn_id; /* each conn has it's own conn_id */
+} SPIDER_IP_PORT_CONN;
diff --git a/storage/spider/spd_malloc.cc b/storage/spider/spd_malloc.cc
index 511c21e1a5c..2b5a5002c23 100644
--- a/storage/spider/spd_malloc.cc
+++ b/storage/spider/spd_malloc.cc
@@ -1,4 +1,4 @@
-/* Copyright (C) 2012-2014 Kentoku Shiba
+/* Copyright (C) 2012-2017 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
@@ -14,7 +14,9 @@
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */
#define MYSQL_SERVER 1
+#include <my_global.h>
#include "mysql_version.h"
+#include "spd_environ.h"
#if MYSQL_VERSION_ID < 50500
#include "mysql_priv.h"
#include <mysql/plugin.h>
@@ -182,7 +184,7 @@ void spider_free_mem(
size = *((uint *) tmp_ptr);
tmp_ptr -= ALIGN_SIZE(sizeof(uint));
id = *((uint *) tmp_ptr);
- my_free(tmp_ptr, my_flags);
+ spider_my_free(tmp_ptr, my_flags);
spider_free_mem_calc(trx, id, size);
DBUG_VOID_RETURN;
diff --git a/storage/spider/spd_param.cc b/storage/spider/spd_param.cc
index c4aaef3a404..61fd4339ca5 100644
--- a/storage/spider/spd_param.cc
+++ b/storage/spider/spd_param.cc
@@ -1,4 +1,4 @@
-/* Copyright (C) 2008-2015 Kentoku Shiba
+/* Copyright (C) 2008-2018 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
@@ -14,7 +14,9 @@
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */
#define MYSQL_SERVER 1
+#include <my_global.h>
#include "mysql_version.h"
+#include "spd_environ.h"
#if MYSQL_VERSION_ID < 50500
#include "mysql_priv.h"
#include <mysql/plugin.h>
@@ -86,6 +88,17 @@ static int spider_direct_aggregate(THD *thd, SHOW_VAR *var, char *buff)
DBUG_RETURN(error_num);
}
+static int spider_parallel_search(THD *thd, SHOW_VAR *var, char *buff)
+{
+ int error_num = 0;
+ SPIDER_TRX *trx;
+ DBUG_ENTER("spider_parallel_search");
+ var->type = SHOW_LONGLONG;
+ if ((trx = spider_get_trx(thd, TRUE, &error_num)))
+ var->value = (char *) &trx->parallel_search_count;
+ DBUG_RETURN(error_num);
+}
+
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
static int spider_hs_result_free(THD *thd, SHOW_VAR *var, char *buff)
{
@@ -119,11 +132,15 @@ struct st_mysql_show_var spider_status_variables[] =
(char *) &spider_direct_order_limit, SHOW_SIMPLE_FUNC},
{"Spider_direct_aggregate",
(char *) &spider_direct_aggregate, SHOW_SIMPLE_FUNC},
+ {"Spider_parallel_search",
+ (char *) &spider_parallel_search, SHOW_SIMPLE_FUNC},
#else
{"Spider_direct_order_limit",
(char *) &spider_direct_order_limit, SHOW_FUNC},
{"Spider_direct_aggregate",
(char *) &spider_direct_aggregate, SHOW_FUNC},
+ {"Spider_parallel_search",
+ (char *) &spider_parallel_search, SHOW_FUNC},
#endif
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
#ifdef SPIDER_HAS_SHOW_SIMPLE_FUNC
@@ -408,6 +425,29 @@ uint spider_param_force_commit(
}
/*
+ 0: register all XA transaction
+ 1: register only write XA transaction
+ */
+static MYSQL_THDVAR_UINT(
+ xa_register_mode, /* name */
+ PLUGIN_VAR_RQCMDARG, /* opt */
+ "Mode of XA transaction register into system table", /* comment */
+ NULL, /* check */
+ NULL, /* update */
+ 1, /* def */
+ 0, /* min */
+ 1, /* max */
+ 0 /* blk */
+);
+
+uint spider_param_xa_register_mode(
+ THD *thd
+) {
+ DBUG_ENTER("spider_param_xa_register_mode");
+ DBUG_RETURN(THDVAR(thd, xa_register_mode));
+}
+
+/*
-1 :use table parameter
0-:offset
*/
@@ -889,26 +929,6 @@ bool spider_param_sync_autocommit(
}
/*
- FALSE: no sync
- TRUE: sync
- */
-static MYSQL_THDVAR_BOOL(
- sync_time_zone, /* name */
- PLUGIN_VAR_OPCMDARG, /* opt */
- "Sync time_zone", /* comment */
- NULL, /* check */
- NULL, /* update */
- FALSE /* def */
-);
-
-bool spider_param_sync_time_zone(
- THD *thd
-) {
- DBUG_ENTER("spider_param_sync_time_zone");
- DBUG_RETURN(THDVAR(thd, sync_time_zone));
-}
-
-/*
FALSE: not use
TRUE: use
*/
@@ -1344,6 +1364,31 @@ longlong spider_param_quick_page_size(
/*
-1 :use table parameter
+ 0-:the limitation of memory size
+ */
+static MYSQL_THDVAR_LONGLONG(
+ quick_page_byte, /* name */
+ PLUGIN_VAR_RQCMDARG, /* opt */
+ "The limitation of memory size in a page when acquisition one by one", /* comment */
+ NULL, /* check */
+ NULL, /* update */
+ -1, /* def */
+ -1, /* min */
+ 9223372036854775807LL, /* max */
+ 0 /* blk */
+);
+
+longlong spider_param_quick_page_byte(
+ THD *thd,
+ longlong quick_page_byte
+) {
+ DBUG_ENTER("spider_param_quick_page_byte");
+ DBUG_RETURN(THDVAR(thd, quick_page_byte) < 0 ?
+ quick_page_byte : THDVAR(thd, quick_page_byte));
+}
+
+/*
+ -1 :use table parameter
0 :It doesn't use low memory mode.
1 :It uses low memory mode.
*/
@@ -1669,7 +1714,8 @@ double spider_param_crd_weight(
/*
-1 :use table parameter
0 :Background confirmation is disabled
- 1 :Background confirmation is enabled
+ 1 :Background confirmation is enabled (create thread per table/partition)
+ 2 :Background confirmation is enabled (use static threads)
*/
static MYSQL_THDVAR_INT(
crd_bg_mode, /* name */
@@ -1679,7 +1725,7 @@ static MYSQL_THDVAR_INT(
NULL, /* update */
-1, /* def */
-1, /* min */
- 1, /* max */
+ 2, /* max */
0 /* blk */
);
@@ -1780,7 +1826,8 @@ int spider_param_sts_sync(
/*
-1 :use table parameter
0 :Background confirmation is disabled
- 1 :Background confirmation is enabled
+ 1 :Background confirmation is enabled (create thread per table/partition)
+ 2 :Background confirmation is enabled (use static threads)
*/
static MYSQL_THDVAR_INT(
sts_bg_mode, /* name */
@@ -1790,7 +1837,7 @@ static MYSQL_THDVAR_INT(
NULL, /* update */
-1, /* def */
-1, /* min */
- 1, /* max */
+ 2, /* max */
0 /* blk */
);
@@ -2705,6 +2752,34 @@ int spider_param_skip_default_condition(
/*
-1 :use table parameter
+ 0 :not skip
+ 1 :skip parallel search if query is not SELECT statement
+ 2 :skip parallel search if query has SQL_NO_CACHE
+ 3 :1+2
+ */
+static MYSQL_THDVAR_INT(
+ skip_parallel_search, /* name */
+ PLUGIN_VAR_RQCMDARG, /* opt */
+ "Skip parallel search by specific conditions", /* comment */
+ NULL, /* check */
+ NULL, /* update */
+ -1, /* def */
+ -1, /* min */
+ 3, /* max */
+ 0 /* blk */
+);
+
+int spider_param_skip_parallel_search(
+ THD *thd,
+ int skip_parallel_search
+) {
+ DBUG_ENTER("spider_param_skip_parallel_search");
+ DBUG_RETURN(THDVAR(thd, skip_parallel_search) == -1 ?
+ skip_parallel_search : THDVAR(thd, skip_parallel_search));
+}
+
+/*
+ -1 :use table parameter
0 :not send directly
1-:send directly
*/
@@ -2830,6 +2905,66 @@ my_bool spider_param_general_log()
DBUG_RETURN(spider_general_log);
}
+/*
+ FALSE: no pushdown hints
+ TRUE: pushdown hints
+ */
+static MYSQL_THDVAR_BOOL(
+ index_hint_pushdown, /* name */
+ PLUGIN_VAR_OPCMDARG, /* opt */
+ "switch to control if push down index hint, like force_index", /* comment */
+ NULL, /* check */
+ NULL, /* update */
+ FALSE /* def */
+);
+
+my_bool spider_param_index_hint_pushdown(
+ THD *thd
+) {
+ DBUG_ENTER("spider_param_index_hint_pushdown");
+ DBUG_RETURN(THDVAR(thd, index_hint_pushdown));
+}
+
+static uint spider_max_connections;
+static MYSQL_SYSVAR_UINT(
+ max_connections,
+ spider_max_connections,
+ PLUGIN_VAR_RQCMDARG,
+ "the values, as the max conncetion from spider to remote mysql. Default 0, mean unlimit the connections",
+ NULL,
+ NULL,
+ 0, /* def */
+ 0, /* min */
+ 99999, /* max */
+ 0 /* blk */
+);
+
+uint spider_param_max_connections()
+{
+ DBUG_ENTER("spider_param_max_connections");
+ DBUG_RETURN(spider_max_connections);
+}
+
+static uint spider_conn_wait_timeout;
+static MYSQL_SYSVAR_UINT(
+ conn_wait_timeout,
+ spider_conn_wait_timeout,
+ PLUGIN_VAR_RQCMDARG,
+ "the values, as the max waiting time when spider get a remote conn",
+ NULL,
+ NULL,
+ 10, /* def */
+ 0, /* min */
+ 1000, /* max */
+ 0 /* blk */
+);
+
+uint spider_param_conn_wait_timeout()
+{
+ DBUG_ENTER("spider_param_conn_wait_timeout");
+ DBUG_RETURN(spider_conn_wait_timeout);
+}
+
static uint spider_log_result_errors;
/*
0: no log
@@ -3013,6 +3148,213 @@ int spider_param_bka_table_name_type(
bka_table_name_type : THDVAR(thd, bka_table_name_type));
}
+/*
+ -1 :use table parameter
+ 0 :off
+ 1 :on
+ */
+static MYSQL_THDVAR_INT(
+ use_cond_other_than_pk_for_update, /* name */
+ PLUGIN_VAR_RQCMDARG, /* opt */
+ "Use all conditions even if condition has pk", /* comment */
+ NULL, /* check */
+ NULL, /* update */
+ 1, /* def */
+ 0, /* min */
+ 1, /* max */
+ 0 /* blk */
+);
+
+int spider_param_use_cond_other_than_pk_for_update(
+ THD *thd
+) {
+ DBUG_ENTER("spider_param_reset_sql_alloc");
+ DBUG_RETURN(THDVAR(thd, use_cond_other_than_pk_for_update));
+}
+
+static int spider_store_last_sts;
+/*
+ -1 : use table parameter
+ 0 : do not store
+ 1 : do store
+ */
+static MYSQL_SYSVAR_INT(
+ store_last_sts,
+ spider_store_last_sts,
+ PLUGIN_VAR_RQCMDARG,
+ "Store last sts result into system table",
+ NULL,
+ NULL,
+ -1,
+ -1,
+ 1,
+ 0
+);
+
+int spider_param_store_last_sts(
+ int store_last_sts
+) {
+ DBUG_ENTER("spider_param_store_last_sts");
+ DBUG_RETURN(spider_store_last_sts == -1 ?
+ store_last_sts : spider_store_last_sts);
+}
+
+static int spider_store_last_crd;
+/*
+ -1 : use table parameter
+ 0 : do not store
+ 1 : do store
+ */
+static MYSQL_SYSVAR_INT(
+ store_last_crd,
+ spider_store_last_crd,
+ PLUGIN_VAR_RQCMDARG,
+ "Store last crd result into system table",
+ NULL,
+ NULL,
+ -1,
+ -1,
+ 1,
+ 0
+);
+
+int spider_param_store_last_crd(
+ int store_last_crd
+) {
+ DBUG_ENTER("spider_param_store_last_crd");
+ DBUG_RETURN(spider_store_last_crd == -1 ?
+ store_last_crd : spider_store_last_crd);
+}
+
+static int spider_load_sts_at_startup;
+/*
+ -1 : use table parameter
+ 0 : do not load
+ 1 : do load
+ */
+static MYSQL_SYSVAR_INT(
+ load_sts_at_startup,
+ spider_load_sts_at_startup,
+ PLUGIN_VAR_RQCMDARG,
+ "Load sts from system table at startup",
+ NULL,
+ NULL,
+ -1,
+ -1,
+ 1,
+ 0
+);
+
+int spider_param_load_sts_at_startup(
+ int load_sts_at_startup
+) {
+ DBUG_ENTER("spider_param_load_sts_at_startup");
+ DBUG_RETURN(spider_load_sts_at_startup == -1 ?
+ load_sts_at_startup : spider_load_sts_at_startup);
+}
+
+static int spider_load_crd_at_startup;
+/*
+ -1 : use table parameter
+ 0 : do not load
+ 1 : do load
+ */
+static MYSQL_SYSVAR_INT(
+ load_crd_at_startup,
+ spider_load_crd_at_startup,
+ PLUGIN_VAR_RQCMDARG,
+ "Load crd from system table at startup",
+ NULL,
+ NULL,
+ -1,
+ -1,
+ 1,
+ 0
+);
+
+int spider_param_load_crd_at_startup(
+ int load_crd_at_startup
+) {
+ DBUG_ENTER("spider_param_load_crd_at_startup");
+ DBUG_RETURN(spider_load_crd_at_startup == -1 ?
+ load_crd_at_startup : spider_load_crd_at_startup);
+}
+
+#ifndef WITHOUT_SPIDER_BG_SEARCH
+static uint spider_table_sts_thread_count;
+/*
+ 1-: thread count
+ */
+static MYSQL_SYSVAR_UINT(
+ table_sts_thread_count,
+ spider_table_sts_thread_count,
+ PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY,
+ "Static thread count of table sts",
+ NULL,
+ NULL,
+ 10,
+ 1,
+ 4294967295U,
+ 0
+);
+
+uint spider_param_table_sts_thread_count()
+{
+ DBUG_ENTER("spider_param_table_sts_thread_count");
+ DBUG_RETURN(spider_table_sts_thread_count);
+}
+
+static uint spider_table_crd_thread_count;
+/*
+ 1-: thread count
+ */
+static MYSQL_SYSVAR_UINT(
+ table_crd_thread_count,
+ spider_table_crd_thread_count,
+ PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY,
+ "Static thread count of table crd",
+ NULL,
+ NULL,
+ 10,
+ 1,
+ 4294967295U,
+ 0
+);
+
+uint spider_param_table_crd_thread_count()
+{
+ DBUG_ENTER("spider_param_table_crd_thread_count");
+ DBUG_RETURN(spider_table_crd_thread_count);
+}
+#endif
+
+static int spider_slave_trx_isolation;
+/*
+ -1 :off
+ 0 :read uncommitted
+ 1 :read committed
+ 2 :repeatable read
+ 3 :serializable
+ */
+static MYSQL_SYSVAR_INT(
+ slave_trx_isolation,
+ spider_slave_trx_isolation,
+ PLUGIN_VAR_RQCMDARG,
+ "Transaction isolation level when Spider table is used by slave SQL thread",
+ NULL, /* check */
+ NULL, /* update */
+ -1, /* def */
+ -1, /* min */
+ 3, /* max */
+ 0 /* blk */
+);
+
+int spider_param_slave_trx_isolation()
+{
+ DBUG_ENTER("spider_param_slave_trx_isolation");
+ DBUG_RETURN(spider_slave_trx_isolation);
+}
+
static struct st_mysql_storage_engine spider_storage_engine =
{ MYSQL_HANDLERTON_INTERFACE_VERSION };
@@ -3027,6 +3369,7 @@ static struct st_mysql_sys_var* spider_system_variables[] = {
MYSQL_SYSVAR(internal_xa),
MYSQL_SYSVAR(internal_xa_snapshot),
MYSQL_SYSVAR(force_commit),
+ MYSQL_SYSVAR(xa_register_mode),
MYSQL_SYSVAR(internal_offset),
MYSQL_SYSVAR(internal_limit),
MYSQL_SYSVAR(split_read),
@@ -3045,7 +3388,6 @@ static struct st_mysql_sys_var* spider_system_variables[] = {
MYSQL_SYSVAR(block_size),
MYSQL_SYSVAR(selupd_lock_mode),
MYSQL_SYSVAR(sync_autocommit),
- MYSQL_SYSVAR(sync_time_zone),
MYSQL_SYSVAR(use_default_database),
MYSQL_SYSVAR(internal_sql_log_off),
MYSQL_SYSVAR(bulk_size),
@@ -3064,6 +3406,7 @@ static struct st_mysql_sys_var* spider_system_variables[] = {
MYSQL_SYSVAR(net_write_timeout),
MYSQL_SYSVAR(quick_mode),
MYSQL_SYSVAR(quick_page_size),
+ MYSQL_SYSVAR(quick_page_byte),
MYSQL_SYSVAR(low_mem_read),
MYSQL_SYSVAR(select_column_mode),
#ifndef WITHOUT_SPIDER_BG_SEARCH
@@ -3078,6 +3421,8 @@ static struct st_mysql_sys_var* spider_system_variables[] = {
#ifdef WITH_PARTITION_STORAGE_ENGINE
MYSQL_SYSVAR(crd_sync),
#endif
+ MYSQL_SYSVAR(store_last_crd),
+ MYSQL_SYSVAR(load_crd_at_startup),
MYSQL_SYSVAR(crd_type),
MYSQL_SYSVAR(crd_weight),
#ifndef WITHOUT_SPIDER_BG_SEARCH
@@ -3088,6 +3433,8 @@ static struct st_mysql_sys_var* spider_system_variables[] = {
#ifdef WITH_PARTITION_STORAGE_ENGINE
MYSQL_SYSVAR(sts_sync),
#endif
+ MYSQL_SYSVAR(store_last_sts),
+ MYSQL_SYSVAR(load_sts_at_startup),
#ifndef WITHOUT_SPIDER_BG_SEARCH
MYSQL_SYSVAR(sts_bg_mode),
#endif
@@ -3129,6 +3476,7 @@ static struct st_mysql_sys_var* spider_system_variables[] = {
MYSQL_SYSVAR(error_read_mode),
MYSQL_SYSVAR(error_write_mode),
MYSQL_SYSVAR(skip_default_condition),
+ MYSQL_SYSVAR(skip_parallel_search),
MYSQL_SYSVAR(direct_order_limit),
MYSQL_SYSVAR(read_only_mode),
#ifdef HA_CAN_BULK_ACCESS
@@ -3139,6 +3487,9 @@ static struct st_mysql_sys_var* spider_system_variables[] = {
MYSQL_SYSVAR(udf_ds_use_real_table),
#endif
MYSQL_SYSVAR(general_log),
+ MYSQL_SYSVAR(index_hint_pushdown),
+ MYSQL_SYSVAR(max_connections),
+ MYSQL_SYSVAR(conn_wait_timeout),
MYSQL_SYSVAR(log_result_errors),
MYSQL_SYSVAR(log_result_error_with_sql),
MYSQL_SYSVAR(version),
@@ -3147,7 +3498,13 @@ static struct st_mysql_sys_var* spider_system_variables[] = {
MYSQL_SYSVAR(dry_access),
MYSQL_SYSVAR(delete_all_rows_type),
MYSQL_SYSVAR(bka_table_name_type),
+ MYSQL_SYSVAR(use_cond_other_than_pk_for_update),
MYSQL_SYSVAR(connect_error_interval),
+#ifndef WITHOUT_SPIDER_BG_SEARCH
+ MYSQL_SYSVAR(table_sts_thread_count),
+ MYSQL_SYSVAR(table_crd_thread_count),
+#endif
+ MYSQL_SYSVAR(slave_trx_isolation),
NULL
};
@@ -3187,7 +3544,7 @@ maria_declare_plugin(spider)
spider_status_variables,
spider_system_variables,
SPIDER_DETAIL_VERSION,
- MariaDB_PLUGIN_MATURITY_GAMMA
+ MariaDB_PLUGIN_MATURITY_STABLE
},
spider_i_s_alloc_mem_maria
maria_declare_plugin_end;
diff --git a/storage/spider/spd_param.h b/storage/spider/spd_param.h
index 53ea03f9f7f..4318515dd72 100644
--- a/storage/spider/spd_param.h
+++ b/storage/spider/spd_param.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2008-2015 Kentoku Shiba
+/* Copyright (C) 2008-2018 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
@@ -41,6 +41,9 @@ uint spider_param_internal_xa_snapshot(
uint spider_param_force_commit(
THD *thd
);
+uint spider_param_xa_register_mode(
+ THD *thd
+);
longlong spider_param_internal_offset(
THD *thd,
longlong internal_offset
@@ -104,9 +107,6 @@ int spider_param_selupd_lock_mode(
bool spider_param_sync_autocommit(
THD *thd
);
-bool spider_param_sync_time_zone(
- THD *thd
-);
bool spider_param_use_default_database(
THD *thd
);
@@ -171,6 +171,10 @@ longlong spider_param_quick_page_size(
THD *thd,
longlong quick_page_size
);
+longlong spider_param_quick_page_byte(
+ THD *thd,
+ longlong quick_page_byte
+);
int spider_param_low_mem_read(
THD *thd,
int low_mem_read
@@ -349,6 +353,10 @@ int spider_param_skip_default_condition(
THD *thd,
int skip_default_condition
);
+int spider_param_skip_parallel_search(
+ THD *thd,
+ int skip_parallel_search
+);
longlong spider_param_direct_order_limit(
THD *thd,
longlong direct_order_limit
@@ -370,6 +378,11 @@ int spider_param_udf_ds_use_real_table(
);
#endif
my_bool spider_param_general_log();
+my_bool spider_param_index_hint_pushdown(
+ THD *thd
+);
+uint spider_param_max_connections();
+uint spider_param_conn_wait_timeout();
uint spider_param_log_result_errors();
uint spider_param_log_result_error_with_sql();
uint spider_param_internal_xa_id_type(
@@ -388,3 +401,23 @@ int spider_param_bka_table_name_type(
THD *thd,
int bka_table_name_type
);
+int spider_param_use_cond_other_than_pk_for_update(
+ THD *thd
+);
+int spider_param_store_last_sts(
+ int store_last_sts
+);
+int spider_param_store_last_crd(
+ int store_last_crd
+);
+int spider_param_load_sts_at_startup(
+ int load_sts_at_startup
+);
+int spider_param_load_crd_at_startup(
+ int load_crd_at_startup
+);
+#ifndef WITHOUT_SPIDER_BG_SEARCH
+uint spider_param_table_sts_thread_count();
+uint spider_param_table_crd_thread_count();
+#endif
+int spider_param_slave_trx_isolation();
diff --git a/storage/spider/spd_ping_table.cc b/storage/spider/spd_ping_table.cc
index 89c097bddcc..431d46063c3 100644
--- a/storage/spider/spd_ping_table.cc
+++ b/storage/spider/spd_ping_table.cc
@@ -1,4 +1,4 @@
-/* Copyright (C) 2009-2015 Kentoku Shiba
+/* Copyright (C) 2009-2018 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
@@ -14,7 +14,9 @@
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */
#define MYSQL_SERVER 1
+#include <my_global.h>
#include "mysql_version.h"
+#include "spd_environ.h"
#if MYSQL_VERSION_ID < 50500
#include "mysql_priv.h"
#include <mysql/plugin.h>
@@ -75,6 +77,8 @@ SPIDER_TABLE_MON_LIST *spider_get_ping_table_mon_list(
spider_string *str,
uint conv_name_length,
int link_idx,
+ char *static_link_id,
+ uint static_link_id_length,
uint32 server_id,
bool need_lock,
int *error_num
@@ -132,7 +136,8 @@ SPIDER_TABLE_MON_LIST *spider_get_ping_table_mon_list(
spider_release_ping_table_mon_list_loop(mutex_hash, table_mon_list);
if (!(table_mon_list = spider_get_ping_table_tgt(thd, str->c_ptr(),
- conv_name_length, link_idx, server_id, str, need_lock, error_num)))
+ conv_name_length, link_idx, static_link_id, static_link_id_length,
+ server_id, str, need_lock, error_num)))
{
pthread_mutex_unlock(&spider_udf_table_mon_mutexes[mutex_hash]);
goto error;
@@ -220,14 +225,14 @@ void spider_release_ping_table_mon_list_loop(
DBUG_VOID_RETURN;
}
-void spider_release_ping_table_mon_list(
+int spider_release_ping_table_mon_list(
const char *conv_name,
uint conv_name_length,
int link_idx
) {
uint mutex_hash;
SPIDER_TABLE_MON_LIST *table_mon_list;
- char link_idx_str[SPIDER_SQL_INT_LEN];
+ char link_idx_str[SPIDER_CONNECT_INFO_MAX_LEN + 1];
int link_idx_str_length;
DBUG_ENTER("spider_release_ping_table_mon_list");
DBUG_PRINT("info", ("spider conv_name=%s", conv_name));
@@ -235,14 +240,14 @@ void spider_release_ping_table_mon_list(
DBUG_PRINT("info", ("spider link_idx=%d", link_idx));
link_idx_str_length = my_sprintf(link_idx_str, (link_idx_str, "%010d",
link_idx));
-#if defined(_MSC_VER) || defined(__SUNPRO_CC)
- spider_string conv_name_str(conv_name_length + link_idx_str_length + 1);
- conv_name_str.set_charset(system_charset_info);
-#else
- char buf[conv_name_length + link_idx_str_length + 1];
+ char *buf = (char *) my_alloca(conv_name_length + link_idx_str_length + 1);
+ if (!buf)
+ {
+ my_error(HA_ERR_OUT_OF_MEM, MYF(0));
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
spider_string conv_name_str(buf, conv_name_length + link_idx_str_length + 1,
system_charset_info);
-#endif
conv_name_str.init_calc_mem(134);
conv_name_str.length(0);
conv_name_str.q_append(conv_name, conv_name_length);
@@ -268,7 +273,8 @@ void spider_release_ping_table_mon_list(
#endif
spider_release_ping_table_mon_list_loop(mutex_hash, table_mon_list);
pthread_mutex_unlock(&spider_udf_table_mon_mutexes[mutex_hash]);
- DBUG_VOID_RETURN;
+ my_afree(buf);
+ DBUG_RETURN(0);
}
int spider_get_ping_table_mon(
@@ -307,6 +313,28 @@ int spider_get_ping_table_mon(
my_error(error_num, MYF(0));
goto error;
}
+ if (table_mon_list->share->static_link_ids[0])
+ {
+ spider_store_tables_name(table_link_mon, name, name_length);
+ spider_store_tables_link_idx_str(table_link_mon,
+ table_mon_list->share->static_link_ids[0],
+ table_mon_list->share->static_link_ids_lengths[0]);
+ if (!(error_num = spider_ping_table_cache_compare(table_link_mon, mem_root)))
+ goto create_table_mon;
+ if (error_num == HA_ERR_OUT_OF_MEM)
+ goto error;
+ if ((tmp_ptr = strstr(name, "#P#")))
+ {
+ *tmp_ptr = '\0';
+ spider_store_tables_name(table_link_mon, name, strlen(name));
+ *tmp_ptr = '#';
+ if (!(error_num = spider_ping_table_cache_compare(table_link_mon,
+ mem_root)))
+ goto create_table_mon;
+ if (error_num == HA_ERR_OUT_OF_MEM)
+ goto error;
+ }
+ }
spider_store_tables_name(table_link_mon, name, name_length);
spider_store_tables_link_idx(table_link_mon, link_idx);
if (!(error_num = spider_ping_table_cache_compare(table_link_mon, mem_root)))
@@ -356,6 +384,7 @@ create_table_mon:
tmp_connect_info_length, tmp_long, tmp_longlong);
tmp_share->link_statuses[0] = -1;
table_mon->share = tmp_share;
+ table_mon->parent = table_mon_list;
if (table_mon_prev)
table_mon_prev->next = table_mon;
else
@@ -434,6 +463,8 @@ SPIDER_TABLE_MON_LIST *spider_get_ping_table_tgt(
char *name,
uint name_length,
int link_idx,
+ char *static_link_id,
+ uint static_link_id_length,
uint32 server_id,
spider_string *str,
bool need_lock,
@@ -490,9 +521,29 @@ SPIDER_TABLE_MON_LIST *spider_get_ping_table_tgt(
goto error;
}
spider_store_tables_name(table_tables, name, name_length);
- spider_store_tables_link_idx(table_tables, link_idx);
+ if (static_link_id)
+ {
+ spider_store_tables_static_link_id(table_tables,
+ static_link_id, static_link_id_length);
+ if (
+ (*error_num = spider_get_sys_table_by_idx(table_tables, table_key, 2,
+ SPIDER_SYS_TABLES_UIDX1_COL_CNT)) ||
+ (*error_num = spider_get_sys_tables_link_idx(
+ table_tables, &link_idx, &mem_root))
+ ) {
+ table_tables->file->print_error(*error_num, MYF(0));
+ goto error;
+ }
+ } else {
+ spider_store_tables_link_idx(table_tables, link_idx);
+ if (
+ (*error_num = spider_check_sys_table(table_tables, table_key))
+ ) {
+ table_tables->file->print_error(*error_num, MYF(0));
+ goto error;
+ }
+ }
if (
- (*error_num = spider_check_sys_table(table_tables, table_key)) ||
(*error_num = spider_get_sys_tables_connect_info(
table_tables, tmp_share, 0, &mem_root)) ||
(*error_num = spider_get_sys_tables_link_status(
@@ -626,6 +677,165 @@ error:
DBUG_RETURN(NULL);
}
+int spider_get_ping_table_gtid_pos(
+ SPIDER_TRX *trx,
+ THD *thd,
+ spider_string *str,
+ uint conv_name_length,
+ int failed_link_idx,
+ uint32 server_id,
+ bool need_lock,
+ spider_string *tmp_str
+) {
+ int error_num, source_link_idx, need_mon;
+ char table_key[MAX_KEY_LENGTH];
+ TABLE *table_tables, *table_gtid_pos;
+#if MYSQL_VERSION_ID < 50500
+ Open_tables_state open_tables_backup_tables;
+ Open_tables_state open_tables_backup_gtid_pos;
+#else
+ Open_tables_backup open_tables_backup_tables;
+ Open_tables_backup open_tables_backup_gtid_pos;
+#endif
+ MEM_ROOT mem_root;
+ long link_status;
+ long monitoring_binlog_pos_at_failing;
+ SPIDER_TABLE_MON_LIST *table_mon_list;
+ SPIDER_CONN *ping_conn = NULL;
+ char *static_link_id;
+ uint static_link_id_length;
+ DBUG_ENTER("spider_get_ping_table_gtid_pos");
+
+ /*
+ select * from
+ mysql.spider_tables
+ where
+ db_name = setted db_name and
+ table_name = setted table_name
+ */
+ if (
+ !(table_tables = spider_open_sys_table(
+ thd, SPIDER_SYS_TABLES_TABLE_NAME_STR,
+ SPIDER_SYS_TABLES_TABLE_NAME_LEN, FALSE, &open_tables_backup_tables,
+ need_lock, &error_num))
+ )
+ goto error_open_table_tables;
+
+ if (
+ !(table_gtid_pos = spider_open_sys_table(
+ thd, SPIDER_SYS_POS_FOR_RECOVERY_TABLE_NAME_STR,
+ SPIDER_SYS_POS_FOR_RECOVERY_TABLE_NAME_LEN, TRUE,
+ &open_tables_backup_gtid_pos, need_lock, &error_num))
+ )
+ goto error_open_table_gtid_pos;
+
+ table_tables->use_all_columns();
+ table_gtid_pos->use_all_columns();
+ spider_store_tables_name(table_tables, str->ptr(), conv_name_length);
+ spider_store_tables_name(table_gtid_pos, str->ptr(), conv_name_length);
+ spider_store_binlog_pos_failed_link_idx(table_gtid_pos, failed_link_idx);
+ if ((error_num = spider_get_sys_table_by_idx(table_tables, table_key, 0,
+ SPIDER_SYS_TABLES_PK_COL_CNT - 1)))
+ {
+ if (error_num == HA_ERR_KEY_NOT_FOUND || error_num == HA_ERR_END_OF_FILE)
+ {
+ error_num = 0;
+ }
+ goto error_get_sys_table_by_idx;
+ }
+
+ SPD_INIT_ALLOC_ROOT(&mem_root, 4096, 0, MYF(MY_WME));
+ do {
+ if (
+ (error_num = spider_get_sys_tables_link_status(table_tables,
+ &link_status, &mem_root)) ||
+ (error_num = spider_get_sys_tables_static_link_id(table_tables,
+ &static_link_id, &static_link_id_length, &mem_root)) ||
+ (error_num = spider_get_sys_tables_monitoring_binlog_pos_at_failing(
+ table_tables, &monitoring_binlog_pos_at_failing, &mem_root))
+ ) {
+ goto error_get_sys_tables_link_status;
+ }
+
+ if (link_status == 1 && monitoring_binlog_pos_at_failing > 0)
+ {
+ if ((error_num = spider_get_sys_tables_link_idx(table_tables,
+ &source_link_idx, &mem_root)))
+ {
+ goto error_get_sys_tables_link_idx;
+ }
+ if (
+ (table_mon_list = spider_get_ping_table_mon_list(
+ trx,
+ thd,
+ str,
+ conv_name_length,
+ source_link_idx,
+ static_link_id,
+ static_link_id_length,
+ server_id,
+ need_lock,
+ &error_num
+ ))
+ ) {
+ SPIDER_DB_RESULT *res1 = NULL;
+ SPIDER_DB_RESULT *res2 = NULL;
+ if (
+ (ping_conn = spider_get_ping_table_tgt_conn(trx,
+ table_mon_list->share, &error_num
+ )) &&
+ !(error_num = ping_conn->db_conn->show_master_status(
+ trx, table_mon_list->share, 0, &need_mon, table_gtid_pos, tmp_str,
+ monitoring_binlog_pos_at_failing == 1 ? 0 : 1, &res1, &res2))
+ ) {
+ spider_store_binlog_pos_source_link_idx(
+ table_gtid_pos, source_link_idx);
+ spider_insert_sys_table(table_gtid_pos);
+ }
+ if (res1)
+ {
+ res1->free_result();
+ delete res1;
+ }
+ if (res2)
+ {
+ res2->free_result();
+ delete res2;
+ }
+ spider_free_ping_table_mon_list(table_mon_list);
+ }
+ }
+
+ error_num = spider_sys_index_next_same(table_tables, table_key);
+ } while (error_num == 0);
+ free_root(&mem_root, MYF(0));
+
+ if ((error_num = spider_sys_index_end(table_tables)))
+ {
+ goto error_sys_index_end;
+ }
+ spider_close_sys_table(thd, table_gtid_pos, &open_tables_backup_gtid_pos,
+ need_lock);
+ spider_close_sys_table(thd, table_tables, &open_tables_backup_tables,
+ need_lock);
+
+ DBUG_RETURN(0);
+
+error_get_sys_tables_link_idx:
+error_get_sys_tables_link_status:
+ free_root(&mem_root, MYF(0));
+ spider_sys_index_end(table_tables);
+error_sys_index_end:
+error_get_sys_table_by_idx:
+ spider_close_sys_table(thd, table_gtid_pos, &open_tables_backup_gtid_pos,
+ need_lock);
+error_open_table_gtid_pos:
+ spider_close_sys_table(thd, table_tables, &open_tables_backup_tables,
+ need_lock);
+error_open_table_tables:
+ DBUG_RETURN(error_num);
+}
+
int spider_init_ping_table_mon_cache(
THD *thd,
MEM_ROOT *mem_root,
@@ -796,7 +1006,7 @@ long long spider_ping_table_body(
) {
int error_num = 0, link_idx, flags, full_mon_count, current_mon_count,
success_count, fault_count, tmp_error_num = 0;
- uint32 first_sid;
+ uint32 first_sid, server_id;
longlong limit, tmp_sid = -1;
SPIDER_MON_TABLE_RESULT *mon_table_result =
(SPIDER_MON_TABLE_RESULT *) initid->ptr;
@@ -807,15 +1017,24 @@ long long spider_ping_table_body(
SPIDER_TABLE_MON_LIST *table_mon_list;
SPIDER_TABLE_MON *table_mon;
- char buf[MAX_FIELD_WIDTH];
+ char buf[MAX_FIELD_WIDTH], buf2[MAX_FIELD_WIDTH];
spider_string conv_name(buf, sizeof(buf), system_charset_info);
+ spider_string tmp_str(buf2, sizeof(buf2), system_charset_info);
int conv_name_length;
- char link_idx_str[SPIDER_SQL_INT_LEN];
+ char link_idx_str[SPIDER_CONNECT_INFO_MAX_LEN + 1];
int link_idx_str_length;
- bool get_lock = FALSE;
+ char *static_link_id = NULL;
+ int static_link_id_length = 0;
+ bool get_lock = FALSE, status_changed_to_ng = FALSE;
DBUG_ENTER("spider_ping_table_body");
conv_name.init_calc_mem(135);
+ tmp_str.init_calc_mem(247);
conv_name.length(0);
+#if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100002
+ server_id = global_system_variables.server_id;
+#else
+ server_id = thd->server_id;
+#endif
if (
thd->open_tables != 0 ||
thd->handler_tables_hash.records != 0 ||
@@ -881,26 +1100,52 @@ long long spider_ping_table_body(
if (
args->lengths[0] > SPIDER_CONNECT_INFO_MAX_LEN
) {
- my_printf_error(ER_SPIDER_UDF_PING_TABLE_PARAM_TOO_LONG_NUM,
- ER_SPIDER_UDF_PING_TABLE_PARAM_TOO_LONG_STR, MYF(0));
+ my_printf_error(ER_SPIDER_UDF_PARAM_TOO_LONG_NUM,
+ ER_SPIDER_UDF_PARAM_TOO_LONG_STR, MYF(0), "table name");
goto error;
}
if (
args->lengths[0] == 0
) {
- my_printf_error(ER_SPIDER_UDF_PING_TABLE_PARAM_REQIRED_NUM,
- ER_SPIDER_UDF_PING_TABLE_PARAM_REQIRED_STR, MYF(0));
+ my_printf_error(ER_SPIDER_UDF_PARAM_REQIRED_NUM,
+ ER_SPIDER_UDF_PARAM_REQIRED_STR, MYF(0), "table name");
goto error;
}
-
- link_idx = (int) (args->args[1] ? *((longlong *) args->args[1]) : 0);
+ if (args->arg_type[1] == STRING_RESULT)
+ {
+ if (
+ !args->args[1]
+ ) {
+ my_printf_error(ER_SPIDER_UDF_PARAM_REQIRED_NUM,
+ ER_SPIDER_UDF_PARAM_REQIRED_STR, MYF(0), "link id");
+ goto error;
+ }
+ if (
+ args->lengths[1] > SPIDER_CONNECT_INFO_MAX_LEN
+ ) {
+ my_printf_error(ER_SPIDER_UDF_PARAM_TOO_LONG_NUM,
+ ER_SPIDER_UDF_PARAM_TOO_LONG_STR, MYF(0), "link id");
+ goto error;
+ }
+ link_idx_str_length = args->lengths[1];
+ memcpy(link_idx_str, args->args[1], link_idx_str_length + 1);
+ if (link_idx_str[0] >= '0' && link_idx_str[0] <= '9')
+ {
+ link_idx = atoi(link_idx_str);
+ } else {
+ link_idx = -1;
+ static_link_id = link_idx_str;
+ static_link_id_length = link_idx_str_length;
+ }
+ } else {
+ link_idx = (int) (args->args[1] ? *((longlong *) args->args[1]) : 0);
+ link_idx_str_length = my_sprintf(link_idx_str, (link_idx_str, "%010d",
+ link_idx));
+ }
flags = (int) (args->args[2] ? *((longlong *) args->args[2]) : 0);
limit = args->args[3] ? *((longlong *) args->args[3]) : 0;
where_clause = args->args[4] ? args->args[4] : (char *) "";
- link_idx_str_length = my_sprintf(link_idx_str, (link_idx_str, "%010d",
- link_idx));
-
if (conv_name.append(args->args[0], args->lengths[0],
trx->thd->variables.character_set_client))
{
@@ -916,14 +1161,10 @@ long long spider_ping_table_body(
conv_name.q_append(link_idx_str, link_idx_str_length + 1);
conv_name.length(conv_name.length() - 1);
-#if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100002
if (!(table_mon_list = spider_get_ping_table_mon_list(trx, trx->thd,
- &conv_name, conv_name_length, link_idx, global_system_variables.server_id,
- TRUE, &error_num)))
-#else
- if (!(table_mon_list = spider_get_ping_table_mon_list(trx, trx->thd,
- &conv_name, conv_name_length, link_idx, thd->server_id, TRUE, &error_num)))
-#endif
+ &conv_name, conv_name_length, link_idx,
+ static_link_id, static_link_id_length,
+ server_id, TRUE, &error_num)))
goto error;
if (table_mon_list->mon_status == SPIDER_LINK_MON_NG)
@@ -950,11 +1191,7 @@ long long spider_ping_table_body(
goto error_with_free_table_mon_list;
}
} else {
-#if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100002
- first_sid = global_system_variables.server_id;
-#else
- first_sid = thd->server_id;
-#endif
+ first_sid = server_id;
full_mon_count = table_mon_list->list_size;
current_mon_count = 1;
}
@@ -1016,11 +1253,21 @@ long long spider_ping_table_body(
SPIDER_LINK_STATUS_NG, TRUE);
spider_sys_log_tables_link_failed(trx->thd,
conv_name.c_ptr(), conv_name_length, link_idx, TRUE);
+ status_changed_to_ng = TRUE;
}
/*
pthread_mutex_unlock(&table_mon_list->update_status_mutex);
*/
pthread_mutex_unlock(&spider_udf_table_mon_mutexes[table_mon_list->mutex_hash]);
+ if (status_changed_to_ng)
+ {
+ bool is_error = trx->thd->is_error();
+ spider_get_ping_table_gtid_pos(trx, trx->thd,
+ &conv_name, conv_name_length, link_idx, server_id, TRUE,
+ &tmp_str);
+ if (!is_error && trx->thd->is_error())
+ trx->thd->clear_error();
+ }
}
goto end;
}
@@ -1079,11 +1326,21 @@ long long spider_ping_table_body(
SPIDER_LINK_STATUS_NG, TRUE);
spider_sys_log_tables_link_failed(trx->thd,
conv_name.c_ptr(), conv_name_length, link_idx, TRUE);
+ status_changed_to_ng = TRUE;
}
/*
pthread_mutex_unlock(&table_mon_list->update_status_mutex);
*/
pthread_mutex_unlock(&spider_udf_table_mon_mutexes[table_mon_list->mutex_hash]);
+ if (status_changed_to_ng)
+ {
+ bool is_error = trx->thd->is_error();
+ spider_get_ping_table_gtid_pos(trx, trx->thd,
+ &conv_name, conv_name_length, link_idx, server_id, TRUE,
+ &tmp_str);
+ if (!is_error && trx->thd->is_error())
+ trx->thd->clear_error();
+ }
}
} else if (
(flags & SPIDER_UDF_PING_TABLE_USE_ALL_MONITORING_NODES) &&
@@ -1132,11 +1389,21 @@ long long spider_ping_table_body(
SPIDER_LINK_STATUS_NG, TRUE);
spider_sys_log_tables_link_failed(trx->thd,
conv_name.c_ptr(), conv_name_length, link_idx, TRUE);
+ status_changed_to_ng = TRUE;
}
/*
pthread_mutex_unlock(&table_mon_list->update_status_mutex);
*/
pthread_mutex_unlock(&spider_udf_table_mon_mutexes[table_mon_list->mutex_hash]);
+ if (status_changed_to_ng)
+ {
+ bool is_error = trx->thd->is_error();
+ spider_get_ping_table_gtid_pos(trx, trx->thd,
+ &conv_name, conv_name_length, link_idx, server_id, TRUE,
+ &tmp_str);
+ if (!is_error && trx->thd->is_error())
+ trx->thd->clear_error();
+ }
}
table_mon_list->last_receptor_result =
mon_table_result->result_status;
@@ -1192,7 +1459,6 @@ my_bool spider_ping_table_init_body(
goto error;
}
if (
- args->arg_type[1] != INT_RESULT ||
args->arg_type[2] != INT_RESULT ||
args->arg_type[3] != INT_RESULT ||
args->arg_type[5] != INT_RESULT ||
@@ -1201,10 +1467,18 @@ my_bool spider_ping_table_init_body(
args->arg_type[8] != INT_RESULT ||
args->arg_type[9] != INT_RESULT
) {
- strcpy(message, "spider_ping_table() requires integer 2nd, 3rd, 4,6,7,8,"
+ strcpy(message, "spider_ping_table() requires integer 3rd, 4,6,7,8,"
"9th and 10th argument");
goto error;
}
+ if (
+ args->arg_type[1] != INT_RESULT &&
+ args->arg_type[1] != STRING_RESULT
+ ) {
+ strcpy(message, "spider_ping_table() requires string or integer for "
+ "2nd argument");
+ goto error;
+ }
if (!(trx = spider_get_trx(thd, TRUE, &error_num)))
{
@@ -1288,6 +1562,7 @@ int spider_ping_table_mon_from_table(
SPIDER_TRX *trx,
THD *thd,
SPIDER_SHARE *share,
+ int base_link_idx,
uint32 server_id,
char *conv_name,
uint conv_name_length,
@@ -1309,7 +1584,7 @@ int spider_ping_table_mon_from_table(
SPIDER_MON_TABLE_RESULT mon_table_result;
SPIDER_CONN *mon_conn;
TABLE_SHARE *table_share = share->table_share;
- char link_idx_str[SPIDER_SQL_INT_LEN];
+ char link_idx_str[SPIDER_CONNECT_INFO_MAX_LEN + 1];
int link_idx_str_length;
uint sql_command = thd_sql_command(thd);
DBUG_ENTER("spider_ping_table_mon_from_table");
@@ -1338,19 +1613,24 @@ int spider_ping_table_mon_from_table(
DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
}
- link_idx_str_length = my_sprintf(link_idx_str, (link_idx_str, "%010d",
- link_idx));
-#if defined(_MSC_VER) || defined(__SUNPRO_CC)
- spider_string conv_name_str(conv_name_length + link_idx_str_length + 1);
- conv_name_str.set_charset(system_charset_info);
- *((char *)(conv_name_str.ptr() + conv_name_length + link_idx_str_length)) =
- '\0';
-#else
- char buf[conv_name_length + link_idx_str_length + 1];
+ if (share->static_link_ids[link_idx])
+ {
+ memcpy(link_idx_str, share->static_link_ids[link_idx],
+ share->static_link_ids_lengths[link_idx] + 1);
+ link_idx_str_length = share->static_link_ids_lengths[link_idx];
+ } else {
+ link_idx_str_length = my_sprintf(link_idx_str, (link_idx_str, "%010d",
+ link_idx));
+ }
+ char *buf = (char *) my_alloca(conv_name_length + link_idx_str_length + 1);
+ if (!buf)
+ {
+ my_error(HA_ERR_OUT_OF_MEM, MYF(0));
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
buf[conv_name_length + link_idx_str_length] = '\0';
spider_string conv_name_str(buf, conv_name_length + link_idx_str_length + 1,
system_charset_info);
-#endif
conv_name_str.init_calc_mem(136);
conv_name_str.length(0);
conv_name_str.q_append(conv_name, conv_name_length);
@@ -1368,9 +1648,14 @@ int spider_ping_table_mon_from_table(
flags |= SPIDER_UDF_PING_TABLE_USE_ALL_MONITORING_NODES;
if (!(table_mon_list = spider_get_ping_table_mon_list(trx, thd,
- &conv_name_str, conv_name_length, link_idx, server_id, need_lock,
- &error_num)))
+ &conv_name_str, conv_name_length, link_idx,
+ share->static_link_ids[link_idx],
+ share->static_link_ids_lengths[link_idx],
+ server_id, need_lock, &error_num)))
+ {
+ my_afree(buf);
goto end;
+ }
if (table_mon_list->mon_status == SPIDER_LINK_MON_NG)
{
@@ -1384,6 +1669,7 @@ int spider_ping_table_mon_from_table(
ER_SPIDER_LINK_MON_NG_STR, MYF(0),
table_mon_list->share->tgt_dbs[0],
table_mon_list->share->tgt_table_names[0]);
+ my_afree(buf);
goto end_with_free_table_mon_list;
}
@@ -1556,6 +1842,7 @@ int spider_ping_table_mon_from_table(
pthread_mutex_unlock(&table_mon_list->caller_mutex);
}
+ my_afree(buf);
end_with_free_table_mon_list:
spider_free_ping_table_mon_list(table_mon_list);
end:
diff --git a/storage/spider/spd_ping_table.h b/storage/spider/spd_ping_table.h
index f9e0c00dab1..586ee7afde2 100644
--- a/storage/spider/spd_ping_table.h
+++ b/storage/spider/spd_ping_table.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2009-2014 Kentoku Shiba
+/* Copyright (C) 2009-2017 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
@@ -19,6 +19,8 @@ SPIDER_TABLE_MON_LIST *spider_get_ping_table_mon_list(
spider_string *str,
uint conv_name_length,
int link_idx,
+ char *static_link_id,
+ uint static_link_id_length,
uint32 server_id,
bool need_lock,
int *error_num
@@ -33,7 +35,7 @@ void spider_release_ping_table_mon_list_loop(
SPIDER_TABLE_MON_LIST *table_mon_list
);
-void spider_release_ping_table_mon_list(
+int spider_release_ping_table_mon_list(
const char *conv_name,
uint conv_name_length,
int link_idx
@@ -55,6 +57,8 @@ SPIDER_TABLE_MON_LIST *spider_get_ping_table_tgt(
char *name,
uint name_length,
int link_idx,
+ char *static_link_id,
+ uint static_link_id_length,
uint32 server_id,
spider_string *str,
bool need_lock,
@@ -67,6 +71,17 @@ SPIDER_CONN *spider_get_ping_table_tgt_conn(
int *error_num
);
+int spider_get_ping_table_gtid_pos(
+ SPIDER_TRX *trx,
+ THD *thd,
+ spider_string *str,
+ uint conv_name_length,
+ int failed_link_idx,
+ uint32 server_id,
+ bool need_lock,
+ spider_string *tmp_str
+);
+
int spider_init_ping_table_mon_cache(
THD *thd,
MEM_ROOT *mem_root,
@@ -90,6 +105,7 @@ int spider_ping_table_mon_from_table(
SPIDER_TRX *trx,
THD *thd,
SPIDER_SHARE *share,
+ int base_link_idx,
uint32 server_id,
char *conv_name,
uint conv_name_length,
diff --git a/storage/spider/spd_sys_table.cc b/storage/spider/spd_sys_table.cc
index 8924629b48d..9c97050d41c 100644
--- a/storage/spider/spd_sys_table.cc
+++ b/storage/spider/spd_sys_table.cc
@@ -1,4 +1,4 @@
-/* Copyright (C) 2008-2015 Kentoku Shiba
+/* Copyright (C) 2008-2018 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
@@ -14,7 +14,9 @@
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */
#define MYSQL_SERVER 1
+#include <my_global.h>
#include "mysql_version.h"
+#include "spd_environ.h"
#if MYSQL_VERSION_ID < 50500
#include "mysql_priv.h"
#include <mysql/plugin.h>
@@ -24,6 +26,7 @@
#include "sql_class.h"
#include "key.h"
#include "sql_base.h"
+#include "tztime.h"
#endif
#include "sql_select.h"
#include "spd_err.h"
@@ -34,6 +37,7 @@
#include "spd_malloc.h"
extern handlerton *spider_hton_ptr;
+extern Time_zone *spd_tz_system;
/**
Insert a Spider system table row.
@@ -64,11 +68,13 @@ inline int spider_write_sys_table_row(TABLE *table, bool do_handle_error = TRUE)
Update a Spider system table row.
@param table The spider system table.
+ @param do_handle_error TRUE if an error message should be printed
+ before returning.
@return Error code returned by the update.
*/
-inline int spider_update_sys_table_row(TABLE *table)
+inline int spider_update_sys_table_row(TABLE *table, bool do_handle_error = TRUE)
{
int error_num;
THD *thd = table->in_use;
@@ -77,7 +83,7 @@ inline int spider_update_sys_table_row(TABLE *table)
error_num = table->file->ha_update_row(table->record[1], table->record[0]);
reenable_binlog(thd);
- if (error_num)
+ if (error_num && do_handle_error)
{
if (error_num == HA_ERR_RECORD_IS_THE_SAME)
error_num = 0;
@@ -96,7 +102,7 @@ inline int spider_update_sys_table_row(TABLE *table)
@param do_handle_error TRUE if an error message should be printed
before returning.
- @return Error code returned by the update.
+ @return Error code returned by the delete.
*/
inline int spider_delete_sys_table_row(TABLE *table, int record_number = 0,
@@ -148,16 +154,31 @@ TABLE *spider_open_sys_table(
#if MYSQL_VERSION_ID < 50500
memset(&tables, 0, sizeof(TABLE_LIST));
- tables.db = (char*)"mysql";
- tables.db_length = sizeof("mysql") - 1;
- tables.alias = tables.table_name = (char *) table_name;
- tables.table_name_length = table_name_length;
+ SPIDER_TABLE_LIST_db_str(&tables) = (char*)"mysql";
+ SPIDER_TABLE_LIST_db_length(&tables) = sizeof("mysql") - 1;
+ SPIDER_TABLE_LIST_alias_str(&tables) =
+ SPIDER_TABLE_LIST_table_name_str(&tables) = (char *) table_name;
+ SPIDER_TABLE_LIST_table_name_length(&tables) = table_name_length;
tables.lock_type = (write ? TL_WRITE : TL_READ);
#else
+#ifdef SPIDER_use_LEX_CSTRING_for_database_tablename_alias
+ LEX_CSTRING db_name =
+ {
+ "mysql",
+ sizeof("mysql") - 1
+ };
+ LEX_CSTRING tbl_name =
+ {
+ table_name,
+ (size_t) table_name_length
+ };
+ tables.init_one_table(&db_name, &tbl_name, 0, (write ? TL_WRITE : TL_READ));
+#else
tables.init_one_table(
"mysql", sizeof("mysql") - 1, table_name, table_name_length, table_name,
(write ? TL_WRITE : TL_READ));
#endif
+#endif
#if MYSQL_VERSION_ID < 50500
if (need_lock)
@@ -271,6 +292,22 @@ TABLE *spider_open_sys_table(
*error_num = ER_SPIDER_SYS_TABLE_VERSION_NUM;
goto error_col_num_chk;
}
+ } else if (table_name_length == SPIDER_SYS_POS_FOR_RECOVERY_TABLE_NAME_LEN)
+ {
+ if (
+ !memcmp(table_name,
+ SPIDER_SYS_POS_FOR_RECOVERY_TABLE_NAME_STR,
+ SPIDER_SYS_POS_FOR_RECOVERY_TABLE_NAME_LEN) &&
+ table->s->fields != SPIDER_SYS_POS_FOR_RECOVERY_TABLE_COL_CNT
+ ) {
+ spider_close_sys_table(thd, table, open_tables_backup, need_lock);
+ table = NULL;
+ my_printf_error(ER_SPIDER_SYS_TABLE_VERSION_NUM,
+ ER_SPIDER_SYS_TABLE_VERSION_STR, MYF(0),
+ SPIDER_SYS_POS_FOR_RECOVERY_TABLE_NAME_STR);
+ *error_num = ER_SPIDER_SYS_TABLE_VERSION_NUM;
+ goto error_col_num_chk;
+ }
}
DBUG_RETURN(table);
@@ -307,8 +344,7 @@ void spider_close_sys_table(
close_performance_schema_table(thd, open_tables_backup);
} else {
table->file->ha_reset();
- closefrm(table);
- tdc_release_share(table->s);
+ closefrm(table, TRUE);
spider_free(spider_current_trx, table, MYF(0));
thd->restore_backup_open_tables_state(open_tables_backup);
}
@@ -349,14 +385,15 @@ TABLE *spider_sys_open_table(
TABLE *table;
ulonglong utime_after_lock_backup = thd->utime_after_lock;
DBUG_ENTER("spider_sys_open_table");
- thd->reset_n_backup_open_tables_state(open_tables_backup);
+ if (open_tables_backup)
+ thd->reset_n_backup_open_tables_state(open_tables_backup);
if ((table = open_ltable(thd, tables, tables->lock_type,
MYSQL_OPEN_IGNORE_GLOBAL_READ_LOCK | MYSQL_LOCK_IGNORE_GLOBAL_READ_ONLY |
MYSQL_OPEN_IGNORE_FLUSH | MYSQL_LOCK_IGNORE_TIMEOUT | MYSQL_LOCK_LOG_TABLE
))) {
table->use_all_columns();
- table->no_replicate = 1;
- } else
+ table->s->no_replicate = 1;
+ } else if (open_tables_backup)
thd->restore_backup_open_tables_state(open_tables_backup);
thd->utime_after_lock = utime_after_lock_backup;
DBUG_RETURN(table);
@@ -451,6 +488,29 @@ int spider_check_sys_table_with_find_flag(
#endif
}
+int spider_check_sys_table_for_update_all_columns(
+ TABLE *table,
+ char *table_key
+) {
+ DBUG_ENTER("spider_check_sys_table_for_update_all_columns");
+
+ key_copy(
+ (uchar *) table_key,
+ table->record[0],
+ table->key_info,
+ table->key_info->key_length);
+
+#if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 50200
+ DBUG_RETURN(table->file->ha_index_read_idx_map(
+ table->record[1], 0, (uchar *) table_key,
+ HA_WHOLE_KEY, HA_READ_KEY_EXACT));
+#else
+ DBUG_RETURN(table->file->index_read_idx_map(
+ table->record[1], 0, (uchar *) table_key,
+ HA_WHOLE_KEY, HA_READ_KEY_EXACT));
+#endif
+}
+
int spider_get_sys_table_by_idx(
TABLE *table,
char *table_key,
@@ -459,7 +519,7 @@ int spider_get_sys_table_by_idx(
) {
int error_num;
uint key_length;
- KEY *key_info = table->key_info;
+ KEY *key_info = table->key_info + idx;
DBUG_ENTER("spider_get_sys_table_by_idx");
if ((error_num = spider_sys_index_init(table, idx, FALSE)))
DBUG_RETURN(error_num);
@@ -550,6 +610,28 @@ int spider_sys_index_first(
DBUG_RETURN(0);
}
+int spider_sys_index_last(
+ TABLE *table,
+ const int idx
+) {
+ int error_num;
+ DBUG_ENTER("spider_sys_index_last");
+ if ((error_num = spider_sys_index_init(table, idx, FALSE)))
+ DBUG_RETURN(error_num);
+
+ if (
+#if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 50200
+ (error_num = table->file->ha_index_last(table->record[0]))
+#else
+ (error_num = table->file->index_last(table->record[0]))
+#endif
+ ) {
+ spider_sys_index_end(table);
+ DBUG_RETURN(error_num);
+ }
+ DBUG_RETURN(0);
+}
+
int spider_sys_index_next(
TABLE *table
) {
@@ -763,7 +845,7 @@ void spider_store_tables_name(
table->field[0]->null_bit));
table->field[1]->store(
ptr_table,
- (uint)(name_length - ptr_diff_db - ptr_diff_table),
+ (uint) ((my_ptrdiff_t) name_length - ptr_diff_db - ptr_diff_table),
system_charset_info);
DBUG_PRINT("info",("spider field[1]->null_bit = %d",
table->field[1]->null_bit));
@@ -818,6 +900,26 @@ void spider_store_tables_link_idx_str(
DBUG_VOID_RETURN;
}
+void spider_store_tables_static_link_id(
+ TABLE *table,
+ const char *static_link_id,
+ const uint static_link_id_length
+) {
+ DBUG_ENTER("spider_store_tables_static_link_id");
+ if (static_link_id)
+ {
+ table->field[24]->set_notnull();
+ table->field[24]->store(
+ static_link_id,
+ static_link_id_length,
+ system_charset_info);
+ } else {
+ table->field[24]->set_null();
+ table->field[24]->reset();
+ }
+ DBUG_VOID_RETURN;
+}
+
void spider_store_tables_priority(
TABLE *table,
longlong priority
@@ -973,50 +1075,73 @@ void spider_store_tables_connect_info(
table->field[16]->set_null();
table->field[16]->reset();
}
- if (alter_table->tmp_tgt_default_files[link_idx])
+ table->field[17]->set_notnull();
+ if (alter_table->tmp_monitoring_binlog_pos_at_failing[link_idx] >= 0)
{
- table->field[17]->set_notnull();
table->field[17]->store(
- alter_table->tmp_tgt_default_files[link_idx],
- (uint) alter_table->tmp_tgt_default_files_lengths[link_idx],
- system_charset_info);
+ alter_table->tmp_monitoring_binlog_pos_at_failing[link_idx]);
} else {
- table->field[17]->set_null();
- table->field[17]->reset();
+ table->field[17]->store(0);
}
- if (alter_table->tmp_tgt_default_groups[link_idx])
+ if (alter_table->tmp_tgt_default_files[link_idx])
{
table->field[18]->set_notnull();
table->field[18]->store(
- alter_table->tmp_tgt_default_groups[link_idx],
- (uint) alter_table->tmp_tgt_default_groups_lengths[link_idx],
+ alter_table->tmp_tgt_default_files[link_idx],
+ (uint) alter_table->tmp_tgt_default_files_lengths[link_idx],
system_charset_info);
} else {
table->field[18]->set_null();
table->field[18]->reset();
}
- if (alter_table->tmp_tgt_dbs[link_idx])
+ if (alter_table->tmp_tgt_default_groups[link_idx])
{
table->field[19]->set_notnull();
table->field[19]->store(
- alter_table->tmp_tgt_dbs[link_idx],
- (uint) alter_table->tmp_tgt_dbs_lengths[link_idx],
+ alter_table->tmp_tgt_default_groups[link_idx],
+ (uint) alter_table->tmp_tgt_default_groups_lengths[link_idx],
system_charset_info);
} else {
table->field[19]->set_null();
table->field[19]->reset();
}
- if (alter_table->tmp_tgt_table_names[link_idx])
+ if (alter_table->tmp_tgt_dbs[link_idx])
{
table->field[20]->set_notnull();
table->field[20]->store(
- alter_table->tmp_tgt_table_names[link_idx],
- (uint) alter_table->tmp_tgt_table_names_lengths[link_idx],
+ alter_table->tmp_tgt_dbs[link_idx],
+ (uint) alter_table->tmp_tgt_dbs_lengths[link_idx],
system_charset_info);
} else {
table->field[20]->set_null();
table->field[20]->reset();
}
+ if (alter_table->tmp_tgt_table_names[link_idx])
+ {
+ table->field[21]->set_notnull();
+ table->field[21]->store(
+ alter_table->tmp_tgt_table_names[link_idx],
+ (uint) alter_table->tmp_tgt_table_names_lengths[link_idx],
+ system_charset_info);
+ } else {
+ table->field[21]->set_null();
+ table->field[21]->reset();
+ }
+ table->field[23]->store((longlong) 0, FALSE);
+ if (alter_table->tmp_static_link_ids[link_idx])
+ {
+ DBUG_PRINT("info",("spider static_link_id[%d] = %s",
+ link_idx, alter_table->tmp_static_link_ids[link_idx]));
+ table->field[24]->set_notnull();
+ table->field[24]->store(
+ alter_table->tmp_static_link_ids[link_idx],
+ (uint) alter_table->tmp_static_link_ids_lengths[link_idx],
+ system_charset_info);
+ } else {
+ DBUG_PRINT("info",("spider static_link_id[%d] = NULL", link_idx));
+ table->field[24]->set_null();
+ table->field[24]->reset();
+ }
DBUG_VOID_RETURN;
}
@@ -1027,7 +1152,7 @@ void spider_store_tables_link_status(
DBUG_ENTER("spider_store_tables_link_status");
DBUG_PRINT("info",("spider link_status = %ld", link_status));
if (link_status > SPIDER_LINK_STATUS_NO_CHANGE)
- table->field[21]->store(link_status, FALSE);
+ table->field[22]->store(link_status, FALSE);
DBUG_VOID_RETURN;
}
@@ -1041,6 +1166,116 @@ void spider_store_link_chk_server_id(
DBUG_VOID_RETURN;
}
+void spider_store_binlog_pos_failed_link_idx(
+ TABLE *table,
+ int failed_link_idx
+) {
+ DBUG_ENTER("spider_store_binlog_pos_failed_link_idx");
+ table->field[2]->set_notnull();
+ table->field[2]->store(failed_link_idx);
+ DBUG_VOID_RETURN;
+}
+
+void spider_store_binlog_pos_source_link_idx(
+ TABLE *table,
+ int source_link_idx
+) {
+ DBUG_ENTER("spider_store_binlog_pos_source_link_idx");
+ table->field[3]->set_notnull();
+ table->field[3]->store(source_link_idx);
+ DBUG_VOID_RETURN;
+}
+
+void spider_store_binlog_pos_binlog_file(
+ TABLE *table,
+ const char *file_name,
+ int file_name_length,
+ const char *position,
+ int position_length,
+ CHARSET_INFO *binlog_pos_cs
+) {
+ DBUG_ENTER("spider_store_binlog_pos_binlog_file");
+ if (!file_name)
+ {
+ DBUG_PRINT("info",("spider file_name is NULL"));
+ table->field[4]->set_null();
+ table->field[4]->reset();
+ } else {
+ DBUG_PRINT("info",("spider file_name = %s", file_name));
+ table->field[4]->set_notnull();
+ table->field[4]->store(file_name, file_name_length, binlog_pos_cs);
+ }
+ if (!position)
+ {
+ DBUG_PRINT("info",("spider position is NULL"));
+ table->field[5]->set_null();
+ table->field[5]->reset();
+ } else {
+ DBUG_PRINT("info",("spider position = %s", position));
+ table->field[5]->set_notnull();
+ table->field[5]->store(position, position_length, binlog_pos_cs);
+ }
+ DBUG_VOID_RETURN;
+}
+
+void spider_store_binlog_pos_gtid(
+ TABLE *table,
+ const char *gtid,
+ int gtid_length,
+ CHARSET_INFO *binlog_pos_cs
+) {
+ DBUG_ENTER("spider_store_binlog_pos_gtid");
+ if (!gtid)
+ {
+ DBUG_PRINT("info",("spider gtid is NULL"));
+ table->field[6]->set_null();
+ table->field[6]->reset();
+ } else {
+ DBUG_PRINT("info",("spider gtid = %s", gtid));
+ table->field[6]->set_notnull();
+ table->field[6]->store(gtid, gtid_length, binlog_pos_cs);
+ }
+ DBUG_VOID_RETURN;
+}
+
+void spider_store_table_sts_info(
+ TABLE *table,
+ ulonglong *data_file_length,
+ ulonglong *max_data_file_length,
+ ulonglong *index_file_length,
+ ha_rows *records,
+ ulong *mean_rec_length,
+ time_t *check_time,
+ time_t *create_time,
+ time_t *update_time
+) {
+ MYSQL_TIME mysql_time;
+ DBUG_ENTER("spider_store_table_sts_info");
+ table->field[2]->store((longlong) *data_file_length, TRUE);
+ table->field[3]->store((longlong) *max_data_file_length, TRUE);
+ table->field[4]->store((longlong) *index_file_length, TRUE);
+ table->field[5]->store((longlong) *records, TRUE);
+ table->field[6]->store((longlong) *mean_rec_length, TRUE);
+ spd_tz_system->gmt_sec_to_TIME(&mysql_time, (my_time_t) *check_time);
+ table->field[7]->store_time(&mysql_time);
+ spd_tz_system->gmt_sec_to_TIME(&mysql_time, (my_time_t) *create_time);
+ table->field[8]->store_time(&mysql_time);
+ spd_tz_system->gmt_sec_to_TIME(&mysql_time, (my_time_t) *update_time);
+ table->field[9]->store_time(&mysql_time);
+ DBUG_VOID_RETURN;
+}
+
+void spider_store_table_crd_info(
+ TABLE *table,
+ uint *seq,
+ longlong *cardinality
+) {
+ DBUG_ENTER("spider_store_table_crd_info");
+ table->field[2]->store((longlong) *seq, TRUE);
+ table->field[3]->store((longlong) *cardinality, FALSE);
+ DBUG_VOID_RETURN;
+}
+
int spider_insert_xa(
TABLE *table,
XID *xid,
@@ -1064,7 +1299,9 @@ int spider_insert_xa(
spider_store_xa_bqual_length(table, xid);
spider_store_xa_status(table, status);
if ((error_num = spider_write_sys_table_row(table)))
+ {
DBUG_RETURN(error_num);
+ }
} else {
my_message(ER_SPIDER_XA_EXISTS_NUM, ER_SPIDER_XA_EXISTS_STR, MYF(0));
DBUG_RETURN(ER_SPIDER_XA_EXISTS_NUM);
@@ -1095,7 +1332,9 @@ int spider_insert_xa_member(
table->use_all_columns();
spider_store_xa_member_info(table, xid, conn);
if ((error_num = spider_write_sys_table_row(table)))
+ {
DBUG_RETURN(error_num);
+ }
} else {
my_message(ER_SPIDER_XA_MEMBER_EXISTS_NUM, ER_SPIDER_XA_MEMBER_EXISTS_STR,
MYF(0));
@@ -1126,12 +1365,114 @@ int spider_insert_tables(
share->alter_table.tmp_link_statuses[roop_count] :
SPIDER_LINK_STATUS_OK);
if ((error_num = spider_write_sys_table_row(table)))
+ {
DBUG_RETURN(error_num);
+ }
}
DBUG_RETURN(0);
}
+int spider_insert_sys_table(
+ TABLE *table
+) {
+ int error_num;
+ DBUG_ENTER("spider_insert_sys_table");
+ error_num = spider_write_sys_table_row(table);
+ DBUG_RETURN(error_num);
+}
+
+int spider_insert_or_update_table_sts(
+ TABLE *table,
+ const char *name,
+ uint name_length,
+ ulonglong *data_file_length,
+ ulonglong *max_data_file_length,
+ ulonglong *index_file_length,
+ ha_rows *records,
+ ulong *mean_rec_length,
+ time_t *check_time,
+ time_t *create_time,
+ time_t *update_time
+) {
+ int error_num;
+ char table_key[MAX_KEY_LENGTH];
+ DBUG_ENTER("spider_insert_or_update_table_sts");
+ table->use_all_columns();
+ spider_store_tables_name(table, name, name_length);
+ spider_store_table_sts_info(
+ table,
+ data_file_length,
+ max_data_file_length,
+ index_file_length,
+ records,
+ mean_rec_length,
+ check_time,
+ create_time,
+ update_time
+ );
+
+ if ((error_num = spider_check_sys_table_for_update_all_columns(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);
+ }
+ } else {
+ if ((error_num = spider_update_sys_table_row(table, FALSE)))
+ {
+ table->file->print_error(error_num, MYF(0));
+ DBUG_RETURN(error_num);
+ }
+ }
+
+ DBUG_RETURN(0);
+}
+
+int spider_insert_or_update_table_crd(
+ TABLE *table,
+ const char *name,
+ uint name_length,
+ longlong *cardinality,
+ uint number_of_keys
+) {
+ int error_num;
+ uint roop_count;
+ char table_key[MAX_KEY_LENGTH];
+ DBUG_ENTER("spider_insert_or_update_table_crd");
+ table->use_all_columns();
+ spider_store_tables_name(table, name, name_length);
+
+ for (roop_count = 0; roop_count < number_of_keys; ++roop_count)
+ {
+ spider_store_table_crd_info(table, &roop_count, &cardinality[roop_count]);
+ if ((error_num = spider_check_sys_table_for_update_all_columns(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);
+ }
+ } else {
+ if ((error_num = spider_update_sys_table_row(table, FALSE)))
+ {
+ table->file->print_error(error_num, MYF(0));
+ DBUG_RETURN(error_num);
+ }
+ }
+ }
+ DBUG_RETURN(0);
+}
+
int spider_log_tables_link_failed(
TABLE *table,
char *name,
@@ -1149,7 +1490,9 @@ int spider_log_tables_link_failed(
table->timestamp_field->set_time();
#endif
if ((error_num = spider_write_sys_table_row(table)))
+ {
DBUG_RETURN(error_num);
+ }
DBUG_RETURN(0);
}
@@ -1184,7 +1527,9 @@ int spider_log_xa_failed(
table->timestamp_field->set_time();
#endif
if ((error_num = spider_write_sys_table_row(table)))
+ {
DBUG_RETURN(error_num);
+ }
DBUG_RETURN(0);
}
@@ -1214,7 +1559,9 @@ int spider_update_xa(
table->use_all_columns();
spider_store_xa_status(table, status);
if ((error_num = spider_update_sys_table_row(table)))
+ {
DBUG_RETURN(error_num);
+ }
}
DBUG_RETURN(0);
@@ -1248,7 +1595,9 @@ int spider_update_tables_name(
table->use_all_columns();
spider_store_tables_name(table, to, strlen(to));
if ((error_num = spider_update_sys_table_row(table)))
+ {
DBUG_RETURN(error_num);
+ }
}
roop_count++;
}
@@ -1293,7 +1642,9 @@ int spider_update_tables_priority(
alter_table->tmp_link_statuses[roop_count] :
SPIDER_LINK_STATUS_OK);
if ((error_num = spider_write_sys_table_row(table)))
+ {
DBUG_RETURN(error_num);
+ }
roop_count++;
} while (roop_count < (int) alter_table->all_link_count);
DBUG_RETURN(0);
@@ -1310,7 +1661,9 @@ int spider_update_tables_priority(
spider_store_tables_link_status(table,
alter_table->tmp_link_statuses[roop_count]);
if ((error_num = spider_update_sys_table_row(table)))
+ {
DBUG_RETURN(error_num);
+ }
}
}
while (TRUE)
@@ -1329,7 +1682,9 @@ int spider_update_tables_priority(
DBUG_RETURN(error_num);
}
if ((error_num = spider_delete_sys_table_row(table)))
+ {
DBUG_RETURN(error_num);
+ }
}
roop_count++;
}
@@ -1366,12 +1721,23 @@ int spider_update_tables_link_status(
table->use_all_columns();
spider_store_tables_link_status(table, link_status);
if ((error_num = spider_update_sys_table_row(table)))
+ {
DBUG_RETURN(error_num);
+ }
}
DBUG_RETURN(0);
}
+int spider_update_sys_table(
+ TABLE *table
+) {
+ int error_num;
+ DBUG_ENTER("spider_update_sys_table");
+ error_num = spider_update_sys_table_row(table);
+ DBUG_RETURN(error_num);
+}
+
int spider_delete_xa(
TABLE *table,
XID *xid
@@ -1394,7 +1760,9 @@ int spider_delete_xa(
DBUG_RETURN(ER_SPIDER_XA_NOT_EXISTS_NUM);
} else {
if ((error_num = spider_delete_sys_table_row(table)))
+ {
DBUG_RETURN(error_num);
+ }
}
DBUG_RETURN(0);
@@ -1457,7 +1825,9 @@ int spider_delete_tables(
break;
else {
if ((error_num = spider_delete_sys_table_row(table)))
+ {
DBUG_RETURN(error_num);
+ }
}
roop_count++;
}
@@ -1466,6 +1836,76 @@ int spider_delete_tables(
DBUG_RETURN(0);
}
+int spider_delete_table_sts(
+ TABLE *table,
+ const char *name,
+ uint name_length
+) {
+ int error_num;
+ char table_key[MAX_KEY_LENGTH];
+ DBUG_ENTER("spider_delete_table_sts");
+ table->use_all_columns();
+ spider_store_tables_name(table, name, name_length);
+
+ 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);
+ }
+ /* no record is ok */
+ DBUG_RETURN(0);
+ } else {
+ if ((error_num = spider_delete_sys_table_row(table)))
+ {
+ DBUG_RETURN(error_num);
+ }
+ }
+
+ DBUG_RETURN(0);
+}
+
+int spider_delete_table_crd(
+ TABLE *table,
+ const char *name,
+ uint name_length
+) {
+ int error_num;
+ char table_key[MAX_KEY_LENGTH];
+ DBUG_ENTER("spider_delete_table_crd");
+ table->use_all_columns();
+ spider_store_tables_name(table, name, name_length);
+
+ if ((error_num = spider_get_sys_table_by_idx(table, table_key, 0,
+ SPIDER_SYS_TABLE_CRD_PK_COL_CNT - 1)))
+ {
+ 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);
+ }
+ /* no record is ok */
+ DBUG_RETURN(0);
+ } else {
+ do {
+ if ((error_num = spider_delete_sys_table_row(table)))
+ {
+ spider_sys_index_end(table);
+ DBUG_RETURN(error_num);
+ }
+ error_num = spider_sys_index_next_same(table, table_key);
+ } while (error_num == 0);
+ }
+ if ((error_num = spider_sys_index_end(table)))
+ {
+ table->file->print_error(error_num, MYF(0));
+ DBUG_RETURN(error_num);
+ }
+
+ DBUG_RETURN(0);
+}
+
int spider_get_sys_xid(
TABLE *table,
XID *xid,
@@ -1848,6 +2288,13 @@ int spider_get_sys_tables_connect_info(
!table->field[17]->is_null() &&
(ptr = get_field(mem_root, table->field[17]))
) {
+ share->monitoring_binlog_pos_at_failing[link_idx] = atol(ptr);
+ } else
+ share->monitoring_binlog_pos_at_failing[link_idx] = 0;
+ if (
+ !table->field[18]->is_null() &&
+ (ptr = get_field(mem_root, table->field[18]))
+ ) {
share->tgt_default_files_lengths[link_idx] = strlen(ptr);
share->tgt_default_files[link_idx] =
spider_create_string(ptr, share->tgt_default_files_lengths[link_idx]);
@@ -1856,8 +2303,8 @@ int spider_get_sys_tables_connect_info(
share->tgt_default_files[link_idx] = NULL;
}
if (
- !table->field[18]->is_null() &&
- (ptr = get_field(mem_root, table->field[18]))
+ !table->field[19]->is_null() &&
+ (ptr = get_field(mem_root, table->field[19]))
) {
share->tgt_default_groups_lengths[link_idx] = strlen(ptr);
share->tgt_default_groups[link_idx] =
@@ -1867,8 +2314,8 @@ int spider_get_sys_tables_connect_info(
share->tgt_default_groups[link_idx] = NULL;
}
if (
- !table->field[19]->is_null() &&
- (ptr = get_field(mem_root, table->field[19]))
+ !table->field[20]->is_null() &&
+ (ptr = get_field(mem_root, table->field[20]))
) {
share->tgt_dbs_lengths[link_idx] = strlen(ptr);
share->tgt_dbs[link_idx] =
@@ -1878,8 +2325,8 @@ int spider_get_sys_tables_connect_info(
share->tgt_dbs[link_idx] = NULL;
}
if (
- !table->field[20]->is_null() &&
- (ptr = get_field(mem_root, table->field[20]))
+ !table->field[21]->is_null() &&
+ (ptr = get_field(mem_root, table->field[21]))
) {
share->tgt_table_names_lengths[link_idx] = strlen(ptr);
share->tgt_table_names[link_idx] =
@@ -1888,6 +2335,35 @@ int spider_get_sys_tables_connect_info(
share->tgt_table_names_lengths[link_idx] = 0;
share->tgt_table_names[link_idx] = NULL;
}
+ if (
+ !table->field[24]->is_null() &&
+ (ptr = get_field(mem_root, table->field[24]))
+ ) {
+ share->static_link_ids_lengths[link_idx] = strlen(ptr);
+ share->static_link_ids[link_idx] =
+ spider_create_string(ptr, share->static_link_ids_lengths[link_idx]);
+ } else {
+ share->static_link_ids_lengths[link_idx] = 0;
+ share->static_link_ids[link_idx] = NULL;
+ }
+ DBUG_RETURN(error_num);
+}
+
+int spider_get_sys_tables_monitoring_binlog_pos_at_failing(
+ TABLE *table,
+ long *monitoring_binlog_pos_at_failing,
+ MEM_ROOT *mem_root
+) {
+ char *ptr;
+ int error_num = 0;
+ DBUG_ENTER("spider_get_sys_tables_monitoring_binlog_pos_at_failing");
+ if ((ptr = get_field(mem_root, table->field[17])))
+ *monitoring_binlog_pos_at_failing = (long) my_strtoll10(ptr, (char**) NULL,
+ &error_num);
+ else
+ *monitoring_binlog_pos_at_failing = 1;
+ DBUG_PRINT("info",("spider monitoring_binlog_pos_at_failing=%ld",
+ *monitoring_binlog_pos_at_failing));
DBUG_RETURN(error_num);
}
@@ -1900,7 +2376,7 @@ int spider_get_sys_tables_link_status(
char *ptr;
int error_num = 0;
DBUG_ENTER("spider_get_sys_tables_link_status");
- if ((ptr = get_field(mem_root, table->field[21])))
+ if ((ptr = get_field(mem_root, table->field[22])))
{
share->link_statuses[link_idx] =
(long) my_strtoll10(ptr, (char**) NULL, &error_num);
@@ -1911,6 +2387,22 @@ int spider_get_sys_tables_link_status(
DBUG_RETURN(error_num);
}
+int spider_get_sys_tables_link_status(
+ TABLE *table,
+ long *link_status,
+ MEM_ROOT *mem_root
+) {
+ char *ptr;
+ int error_num = 0;
+ DBUG_ENTER("spider_get_sys_tables_link_status");
+ if ((ptr = get_field(mem_root, table->field[22])))
+ *link_status = (long) my_strtoll10(ptr, (char**) NULL, &error_num);
+ else
+ *link_status = 1;
+ DBUG_PRINT("info",("spider link_statuses=%ld", *link_status));
+ DBUG_RETURN(error_num);
+}
+
int spider_get_sys_tables_link_idx(
TABLE *table,
int *link_idx,
@@ -1918,7 +2410,7 @@ int spider_get_sys_tables_link_idx(
) {
char *ptr;
int error_num = 0;
- DBUG_ENTER("spider_get_sys_tables_link_status");
+ DBUG_ENTER("spider_get_sys_tables_link_idx");
if ((ptr = get_field(mem_root, table->field[2])))
*link_idx = (int) my_strtoll10(ptr, (char**) NULL, &error_num);
else
@@ -1927,6 +2419,92 @@ int spider_get_sys_tables_link_idx(
DBUG_RETURN(error_num);
}
+int spider_get_sys_tables_static_link_id(
+ TABLE *table,
+ char **static_link_id,
+ uint *static_link_id_length,
+ MEM_ROOT *mem_root
+) {
+ int error_num = 0;
+ DBUG_ENTER("spider_get_sys_tables_static_link_id");
+ if (
+ !table->field[24]->is_null() &&
+ (*static_link_id = get_field(mem_root, table->field[24]))
+ ) {
+ *static_link_id_length = strlen(*static_link_id);
+ } else {
+ *static_link_id_length = 0;
+ }
+ DBUG_PRINT("info",("spider static_link_id=%s", *static_link_id ? *static_link_id : "NULL"));
+ DBUG_RETURN(error_num);
+}
+
+void spider_get_sys_table_sts_info(
+ TABLE *table,
+ ulonglong *data_file_length,
+ ulonglong *max_data_file_length,
+ ulonglong *index_file_length,
+ ha_rows *records,
+ ulong *mean_rec_length,
+ time_t *check_time,
+ time_t *create_time,
+ time_t *update_time
+) {
+ MYSQL_TIME mysql_time;
+#ifdef MARIADB_BASE_VERSION
+ uint not_used_uint;
+#else
+ my_bool not_used_my_bool;
+#endif
+ long not_used_long;
+ DBUG_ENTER("spider_get_sys_table_sts_info");
+ *data_file_length = (ulonglong) table->field[2]->val_int();
+ *max_data_file_length = (ulonglong) table->field[3]->val_int();
+ *index_file_length = (ulonglong) table->field[4]->val_int();
+ *records = (ha_rows) table->field[5]->val_int();
+ *mean_rec_length = (ulong) table->field[6]->val_int();
+ table->field[7]->get_date(&mysql_time, SPIDER_date_mode_t(0));
+#ifdef MARIADB_BASE_VERSION
+ *check_time = (time_t) my_system_gmt_sec(&mysql_time,
+ &not_used_long, &not_used_uint);
+#else
+ *check_time = (time_t) my_system_gmt_sec(&mysql_time,
+ &not_used_long, &not_used_my_bool);
+#endif
+ table->field[8]->get_date(&mysql_time, SPIDER_date_mode_t(0));
+#ifdef MARIADB_BASE_VERSION
+ *create_time = (time_t) my_system_gmt_sec(&mysql_time,
+ &not_used_long, &not_used_uint);
+#else
+ *create_time = (time_t) my_system_gmt_sec(&mysql_time,
+ &not_used_long, &not_used_my_bool);
+#endif
+ table->field[9]->get_date(&mysql_time, SPIDER_date_mode_t(0));
+#ifdef MARIADB_BASE_VERSION
+ *update_time = (time_t) my_system_gmt_sec(&mysql_time,
+ &not_used_long, &not_used_uint);
+#else
+ *update_time = (time_t) my_system_gmt_sec(&mysql_time,
+ &not_used_long, &not_used_my_bool);
+#endif
+ DBUG_VOID_RETURN;
+}
+
+void spider_get_sys_table_crd_info(
+ TABLE *table,
+ longlong *cardinality,
+ uint number_of_keys
+) {
+ uint seq;
+ DBUG_ENTER("spider_get_sys_table_crd_info");
+ seq = (uint) table->field[2]->val_int();
+ if (seq < number_of_keys)
+ {
+ cardinality[seq] = (longlong) table->field[3]->val_int();
+ }
+ DBUG_VOID_RETURN;
+}
+
int spider_sys_update_tables_link_status(
THD *thd,
char *name,
@@ -2325,6 +2903,310 @@ int spider_get_link_statuses(
DBUG_RETURN(0);
}
+int spider_sys_insert_or_update_table_sts(
+ THD *thd,
+ const char *name,
+ uint name_length,
+ ulonglong *data_file_length,
+ ulonglong *max_data_file_length,
+ ulonglong *index_file_length,
+ ha_rows *records,
+ ulong *mean_rec_length,
+ time_t *check_time,
+ time_t *create_time,
+ time_t *update_time,
+ bool need_lock
+) {
+ int error_num;
+ TABLE *table_sts = NULL;
+#if MYSQL_VERSION_ID < 50500
+ Open_tables_state open_tables_backup;
+#else
+ Open_tables_backup open_tables_backup;
+#endif
+ DBUG_ENTER("spider_sys_insert_or_update_table_sts");
+ if (
+ !(table_sts = spider_open_sys_table(
+ thd, SPIDER_SYS_TABLE_STS_TABLE_NAME_STR,
+ SPIDER_SYS_TABLE_STS_TABLE_NAME_LEN, TRUE,
+ &open_tables_backup, need_lock, &error_num))
+ ) {
+ goto error;
+ }
+ if ((error_num = spider_insert_or_update_table_sts(
+ table_sts,
+ name,
+ name_length,
+ data_file_length,
+ max_data_file_length,
+ index_file_length,
+ records,
+ mean_rec_length,
+ check_time,
+ create_time,
+ update_time
+ )))
+ goto error;
+ spider_close_sys_table(thd, table_sts, &open_tables_backup, need_lock);
+ table_sts = NULL;
+ DBUG_RETURN(0);
+
+error:
+ if (table_sts)
+ spider_close_sys_table(thd, table_sts, &open_tables_backup, need_lock);
+ DBUG_RETURN(error_num);
+}
+
+int spider_sys_insert_or_update_table_crd(
+ THD *thd,
+ const char *name,
+ uint name_length,
+ longlong *cardinality,
+ uint number_of_keys,
+ bool need_lock
+) {
+ int error_num;
+ TABLE *table_crd = NULL;
+#if MYSQL_VERSION_ID < 50500
+ Open_tables_state open_tables_backup;
+#else
+ Open_tables_backup open_tables_backup;
+#endif
+ DBUG_ENTER("spider_sys_insert_or_update_table_crd");
+ if (
+ !(table_crd = spider_open_sys_table(
+ thd, SPIDER_SYS_TABLE_CRD_TABLE_NAME_STR,
+ SPIDER_SYS_TABLE_CRD_TABLE_NAME_LEN, TRUE,
+ &open_tables_backup, need_lock, &error_num))
+ ) {
+ goto error;
+ }
+ if ((error_num = spider_insert_or_update_table_crd(
+ table_crd,
+ name,
+ name_length,
+ cardinality,
+ number_of_keys
+ )))
+ goto error;
+ spider_close_sys_table(thd, table_crd, &open_tables_backup, need_lock);
+ table_crd = NULL;
+ DBUG_RETURN(0);
+
+error:
+ if (table_crd)
+ spider_close_sys_table(thd, table_crd, &open_tables_backup, need_lock);
+ DBUG_RETURN(error_num);
+}
+
+int spider_sys_delete_table_sts(
+ THD *thd,
+ const char *name,
+ uint name_length,
+ bool need_lock
+) {
+ int error_num;
+ TABLE *table_sts = NULL;
+#if MYSQL_VERSION_ID < 50500
+ Open_tables_state open_tables_backup;
+#else
+ Open_tables_backup open_tables_backup;
+#endif
+ DBUG_ENTER("spider_sys_delete_table_sts");
+ if (
+ !(table_sts = spider_open_sys_table(
+ thd, SPIDER_SYS_TABLE_STS_TABLE_NAME_STR,
+ SPIDER_SYS_TABLE_STS_TABLE_NAME_LEN, TRUE,
+ &open_tables_backup, need_lock, &error_num))
+ ) {
+ goto error;
+ }
+ if ((error_num = spider_delete_table_sts(
+ table_sts,
+ name,
+ name_length
+ )))
+ goto error;
+ spider_close_sys_table(thd, table_sts, &open_tables_backup, need_lock);
+ table_sts = NULL;
+ DBUG_RETURN(0);
+
+error:
+ if (table_sts)
+ spider_close_sys_table(thd, table_sts, &open_tables_backup, need_lock);
+ DBUG_RETURN(error_num);
+}
+
+int spider_sys_delete_table_crd(
+ THD *thd,
+ const char *name,
+ uint name_length,
+ bool need_lock
+) {
+ int error_num;
+ TABLE *table_crd = NULL;
+#if MYSQL_VERSION_ID < 50500
+ Open_tables_state open_tables_backup;
+#else
+ Open_tables_backup open_tables_backup;
+#endif
+ DBUG_ENTER("spider_sys_delete_table_crd");
+ if (
+ !(table_crd = spider_open_sys_table(
+ thd, SPIDER_SYS_TABLE_CRD_TABLE_NAME_STR,
+ SPIDER_SYS_TABLE_CRD_TABLE_NAME_LEN, TRUE,
+ &open_tables_backup, need_lock, &error_num))
+ ) {
+ goto error;
+ }
+ if ((error_num = spider_delete_table_crd(
+ table_crd,
+ name,
+ name_length
+ )))
+ goto error;
+ spider_close_sys_table(thd, table_crd, &open_tables_backup, need_lock);
+ table_crd = NULL;
+ DBUG_RETURN(0);
+
+error:
+ if (table_crd)
+ spider_close_sys_table(thd, table_crd, &open_tables_backup, need_lock);
+ DBUG_RETURN(error_num);
+}
+
+int spider_sys_get_table_sts(
+ THD *thd,
+ const char *name,
+ uint name_length,
+ ulonglong *data_file_length,
+ ulonglong *max_data_file_length,
+ ulonglong *index_file_length,
+ ha_rows *records,
+ ulong *mean_rec_length,
+ time_t *check_time,
+ time_t *create_time,
+ time_t *update_time,
+ bool need_lock
+) {
+ int error_num;
+ char table_key[MAX_KEY_LENGTH];
+ TABLE *table_sts = NULL;
+#if MYSQL_VERSION_ID < 50500
+ Open_tables_state open_tables_backup;
+#else
+ Open_tables_backup open_tables_backup;
+#endif
+ DBUG_ENTER("spider_sys_get_table_sts");
+ if (
+ !(table_sts = spider_open_sys_table(
+ thd, SPIDER_SYS_TABLE_STS_TABLE_NAME_STR,
+ SPIDER_SYS_TABLE_STS_TABLE_NAME_LEN, TRUE,
+ &open_tables_backup, need_lock, &error_num))
+ ) {
+ goto error;
+ }
+
+ table_sts->use_all_columns();
+ spider_store_tables_name(table_sts, name, name_length);
+ if ((error_num = spider_check_sys_table(table_sts, table_key)))
+ {
+ if (error_num != HA_ERR_KEY_NOT_FOUND && error_num != HA_ERR_END_OF_FILE)
+ {
+ table_sts->file->print_error(error_num, MYF(0));
+ }
+ goto error;
+ } else {
+ spider_get_sys_table_sts_info(
+ table_sts,
+ data_file_length,
+ max_data_file_length,
+ index_file_length,
+ records,
+ mean_rec_length,
+ check_time,
+ create_time,
+ update_time
+ );
+ }
+
+ spider_close_sys_table(thd, table_sts, &open_tables_backup, need_lock);
+ table_sts = NULL;
+ DBUG_RETURN(0);
+
+error:
+ if (table_sts)
+ spider_close_sys_table(thd, table_sts, &open_tables_backup, need_lock);
+ DBUG_RETURN(error_num);
+}
+
+int spider_sys_get_table_crd(
+ THD *thd,
+ const char *name,
+ uint name_length,
+ longlong *cardinality,
+ uint number_of_keys,
+ bool need_lock
+) {
+ int error_num;
+ char table_key[MAX_KEY_LENGTH];
+ bool index_inited = FALSE;
+ TABLE *table_crd = NULL;
+#if MYSQL_VERSION_ID < 50500
+ Open_tables_state open_tables_backup;
+#else
+ Open_tables_backup open_tables_backup;
+#endif
+ DBUG_ENTER("spider_sys_get_table_crd");
+ if (
+ !(table_crd = spider_open_sys_table(
+ thd, SPIDER_SYS_TABLE_CRD_TABLE_NAME_STR,
+ SPIDER_SYS_TABLE_CRD_TABLE_NAME_LEN, TRUE,
+ &open_tables_backup, need_lock, &error_num))
+ ) {
+ goto error;
+ }
+
+ table_crd->use_all_columns();
+ spider_store_tables_name(table_crd, name, name_length);
+ if ((error_num = spider_get_sys_table_by_idx(table_crd, table_key, 0,
+ SPIDER_SYS_TABLE_CRD_PK_COL_CNT - 1)))
+ {
+ if (error_num != HA_ERR_KEY_NOT_FOUND && error_num != HA_ERR_END_OF_FILE)
+ {
+ table_crd->file->print_error(error_num, MYF(0));
+ }
+ goto error;
+ } else {
+ index_inited = TRUE;
+ do {
+ spider_get_sys_table_crd_info(
+ table_crd,
+ cardinality,
+ number_of_keys
+ );
+ error_num = spider_sys_index_next_same(table_crd, table_key);
+ } while (error_num == 0);
+ }
+ index_inited = FALSE;
+ if ((error_num = spider_sys_index_end(table_crd)))
+ {
+ table_crd->file->print_error(error_num, MYF(0));
+ goto error;
+ }
+
+ spider_close_sys_table(thd, table_crd, &open_tables_backup, need_lock);
+ table_crd = NULL;
+ DBUG_RETURN(0);
+
+error:
+ if (index_inited)
+ spider_sys_index_end(table_crd);
+ if (table_crd)
+ spider_close_sys_table(thd, table_crd, &open_tables_backup, need_lock);
+ DBUG_RETURN(error_num);
+}
+
int spider_sys_replace(
TABLE *table,
bool *modified_non_trans_table
@@ -2402,22 +3284,39 @@ error:
DBUG_RETURN(error_num);
}
+#ifdef SPIDER_use_LEX_CSTRING_for_Field_blob_constructor
+TABLE *spider_mk_sys_tmp_table(
+ THD *thd,
+ TABLE *table,
+ TMP_TABLE_PARAM *tmp_tbl_prm,
+ const LEX_CSTRING *field_name,
+ CHARSET_INFO *cs
+)
+#else
TABLE *spider_mk_sys_tmp_table(
THD *thd,
TABLE *table,
TMP_TABLE_PARAM *tmp_tbl_prm,
const char *field_name,
CHARSET_INFO *cs
-) {
+)
+#endif
+{
Field_blob *field;
Item_field *i_field;
List<Item> i_list;
TABLE *tmp_table;
DBUG_ENTER("spider_mk_sys_tmp_table");
+#ifdef SPIDER_FIELD_FIELDPTR_REQUIRES_THDPTR
+ if (!(field = new (thd->mem_root) Field_blob(
+ 4294967295U, FALSE, field_name, cs, TRUE)))
+ goto error_alloc_field;
+#else
if (!(field = new Field_blob(
4294967295U, FALSE, field_name, cs, TRUE)))
goto error_alloc_field;
+#endif
field->init(table);
#ifdef SPIDER_FIELD_FIELDPTR_REQUIRES_THDPTR
@@ -2432,8 +3331,9 @@ TABLE *spider_mk_sys_tmp_table(
goto error_push_item;
if (!(tmp_table = create_tmp_table(thd, tmp_tbl_prm,
- i_list, (ORDER*) NULL, FALSE, FALSE, TMP_TABLE_FORCE_MYISAM,
- HA_POS_ERROR, (char *) "")))
+ i_list, (ORDER*) NULL, FALSE, FALSE,
+ (TMP_TABLE_FORCE_MYISAM | TMP_TABLE_ALL_COLUMNS),
+ HA_POS_ERROR, &SPIDER_empty_string)))
goto error_create_tmp_table;
DBUG_RETURN(tmp_table);
@@ -2458,6 +3358,17 @@ void spider_rm_sys_tmp_table(
DBUG_VOID_RETURN;
}
+#ifdef SPIDER_use_LEX_CSTRING_for_Field_blob_constructor
+TABLE *spider_mk_sys_tmp_table_for_result(
+ THD *thd,
+ TABLE *table,
+ TMP_TABLE_PARAM *tmp_tbl_prm,
+ const LEX_CSTRING *field_name1,
+ const LEX_CSTRING *field_name2,
+ const LEX_CSTRING *field_name3,
+ CHARSET_INFO *cs
+)
+#else
TABLE *spider_mk_sys_tmp_table_for_result(
THD *thd,
TABLE *table,
@@ -2466,16 +3377,24 @@ TABLE *spider_mk_sys_tmp_table_for_result(
const char *field_name2,
const char *field_name3,
CHARSET_INFO *cs
-) {
+)
+#endif
+{
Field_blob *field1, *field2, *field3;
Item_field *i_field1, *i_field2, *i_field3;
List<Item> i_list;
TABLE *tmp_table;
DBUG_ENTER("spider_mk_sys_tmp_table_for_result");
+#ifdef SPIDER_FIELD_FIELDPTR_REQUIRES_THDPTR
+ if (!(field1 = new (thd->mem_root) Field_blob(
+ 4294967295U, FALSE, field_name1, cs, TRUE)))
+ goto error_alloc_field1;
+#else
if (!(field1 = new Field_blob(
4294967295U, FALSE, field_name1, cs, TRUE)))
goto error_alloc_field1;
+#endif
field1->init(table);
#ifdef SPIDER_FIELD_FIELDPTR_REQUIRES_THDPTR
@@ -2489,9 +3408,15 @@ TABLE *spider_mk_sys_tmp_table_for_result(
if (i_list.push_back(i_field1))
goto error_push_item1;
+#ifdef SPIDER_FIELD_FIELDPTR_REQUIRES_THDPTR
if (!(field2 = new (thd->mem_root) Field_blob(
4294967295U, FALSE, field_name2, cs, TRUE)))
goto error_alloc_field2;
+#else
+ if (!(field2 = new Field_blob(
+ 4294967295U, FALSE, field_name2, cs, TRUE)))
+ goto error_alloc_field2;
+#endif
field2->init(table);
#ifdef SPIDER_FIELD_FIELDPTR_REQUIRES_THDPTR
@@ -2505,9 +3430,15 @@ TABLE *spider_mk_sys_tmp_table_for_result(
if (i_list.push_back(i_field2))
goto error_push_item2;
+#ifdef SPIDER_FIELD_FIELDPTR_REQUIRES_THDPTR
if (!(field3 = new (thd->mem_root) Field_blob(
4294967295U, FALSE, field_name3, cs, TRUE)))
goto error_alloc_field3;
+#else
+ if (!(field3 = new Field_blob(
+ 4294967295U, FALSE, field_name3, cs, TRUE)))
+ goto error_alloc_field3;
+#endif
field3->init(table);
#ifdef SPIDER_FIELD_FIELDPTR_REQUIRES_THDPTR
@@ -2522,8 +3453,9 @@ TABLE *spider_mk_sys_tmp_table_for_result(
goto error_push_item3;
if (!(tmp_table = create_tmp_table(thd, tmp_tbl_prm,
- i_list, (ORDER*) NULL, FALSE, FALSE, TMP_TABLE_FORCE_MYISAM,
- HA_POS_ERROR, (char *) "")))
+ i_list, (ORDER*) NULL, FALSE, FALSE,
+ (TMP_TABLE_FORCE_MYISAM | TMP_TABLE_ALL_COLUMNS),
+ HA_POS_ERROR, &SPIDER_empty_string)))
goto error_create_tmp_table;
DBUG_RETURN(tmp_table);
@@ -2557,3 +3489,20 @@ void spider_rm_sys_tmp_table_for_result(
tmp_tbl_prm->field_count = 3;
DBUG_VOID_RETURN;
}
+
+TABLE *spider_find_temporary_table(
+ THD *thd,
+ TABLE_LIST *table_list
+) {
+ DBUG_ENTER("spider_find_temporary_table");
+#ifdef SPIDER_open_temporary_table
+ if (thd->open_temporary_table(table_list))
+ {
+ DBUG_RETURN(NULL);
+ } else {
+ DBUG_RETURN(table_list->table);
+ }
+#else
+ DBUG_RETURN(find_temporary_table(A,B));
+#endif
+}
diff --git a/storage/spider/spd_sys_table.h b/storage/spider/spd_sys_table.h
index feb88d4afde..9e2d54c3e28 100644
--- a/storage/spider/spd_sys_table.h
+++ b/storage/spider/spd_sys_table.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2008-2014 Kentoku Shiba
+/* Copyright (C) 2008-2018 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
@@ -25,6 +25,12 @@
#define SPIDER_SYS_LINK_FAILED_TABLE_NAME_LEN (sizeof(SPIDER_SYS_LINK_FAILED_TABLE_NAME_STR) - 1)
#define SPIDER_SYS_XA_FAILED_TABLE_NAME_STR "spider_xa_failed_log"
#define SPIDER_SYS_XA_FAILED_TABLE_NAME_LEN (sizeof(SPIDER_SYS_XA_FAILED_TABLE_NAME_STR) - 1)
+#define SPIDER_SYS_POS_FOR_RECOVERY_TABLE_NAME_STR "spider_table_position_for_recovery"
+#define SPIDER_SYS_POS_FOR_RECOVERY_TABLE_NAME_LEN (sizeof(SPIDER_SYS_POS_FOR_RECOVERY_TABLE_NAME_STR) - 1)
+#define SPIDER_SYS_TABLE_STS_TABLE_NAME_STR "spider_table_sts"
+#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_XA_PREPARED_STR "PREPARED"
#define SPIDER_SYS_XA_NOT_YET_STR "NOT YET"
@@ -36,14 +42,20 @@
#define SPIDER_SYS_XA_IDX1_COL_CNT 1
#define SPIDER_SYS_XA_MEMBER_COL_CNT 18
#define SPIDER_SYS_XA_MEMBER_PK_COL_CNT 6
-#define SPIDER_SYS_TABLES_COL_CNT 22
-#define SPIDER_SYS_TABLES_PK_COL_CNT 2
+#define SPIDER_SYS_TABLES_COL_CNT 25
+#define SPIDER_SYS_TABLES_PK_COL_CNT 3
#define SPIDER_SYS_TABLES_IDX1_COL_CNT 1
+#define SPIDER_SYS_TABLES_UIDX1_COL_CNT 3
#define SPIDER_SYS_LINK_MON_TABLE_COL_CNT 19
+#define SPIDER_SYS_POS_FOR_RECOVERY_TABLE_COL_CNT 7
+#define SPIDER_SYS_TABLE_STS_COL_CNT 10
+#define SPIDER_SYS_TABLE_STS_PK_COL_CNT 2
+#define SPIDER_SYS_TABLE_CRD_COL_CNT 4
+#define SPIDER_SYS_TABLE_CRD_PK_COL_CNT 3
#define SPIDER_SYS_LINK_MON_TABLE_DB_NAME_SIZE 64
#define SPIDER_SYS_LINK_MON_TABLE_TABLE_NAME_SIZE 64
-#define SPIDER_SYS_LINK_MON_TABLE_LINK_ID_SIZE 10
+#define SPIDER_SYS_LINK_MON_TABLE_LINK_ID_SIZE 64
class SPIDER_MON_KEY: public SPIDER_SORT
{
@@ -139,6 +151,11 @@ int spider_check_sys_table_with_find_flag(
enum ha_rkey_function find_flag
);
+int spider_check_sys_table_for_update_all_columns(
+ TABLE *table,
+ char *table_key
+);
+
int spider_get_sys_table_by_idx(
TABLE *table,
char *table_key,
@@ -156,6 +173,11 @@ int spider_sys_index_first(
const int idx
);
+int spider_sys_index_last(
+ TABLE *table,
+ const int idx
+);
+
int spider_sys_index_next(
TABLE *table
);
@@ -212,6 +234,12 @@ void spider_store_tables_link_idx_str(
const uint link_idx_length
);
+void spider_store_tables_static_link_id(
+ TABLE *table,
+ const char *static_link_id,
+ const uint static_link_id_length
+);
+
void spider_store_tables_priority(
TABLE *table,
longlong priority
@@ -233,6 +261,50 @@ void spider_store_link_chk_server_id(
uint32 server_id
);
+void spider_store_binlog_pos_failed_link_idx(
+ TABLE *table,
+ int failed_link_idx
+);
+
+void spider_store_binlog_pos_source_link_idx(
+ TABLE *table,
+ int source_link_idx
+);
+
+void spider_store_binlog_pos_binlog_file(
+ TABLE *table,
+ const char *file_name,
+ int file_name_length,
+ const char *position,
+ int position_length,
+ CHARSET_INFO *binlog_pos_cs
+);
+
+void spider_store_binlog_pos_gtid(
+ TABLE *table,
+ const char *gtid,
+ int gtid_length,
+ CHARSET_INFO *binlog_pos_cs
+);
+
+void spider_store_table_sts_info(
+ TABLE *table,
+ ulonglong *data_file_length,
+ ulonglong *max_data_file_length,
+ ulonglong *index_file_length,
+ ha_rows *records,
+ ulong *mean_rec_length,
+ time_t *check_time,
+ time_t *create_time,
+ time_t *update_time
+);
+
+void spider_store_table_crd_info(
+ TABLE *table,
+ uint *seq,
+ longlong *cardinality
+);
+
int spider_insert_xa(
TABLE *table,
XID *xid,
@@ -250,6 +322,32 @@ int spider_insert_tables(
SPIDER_SHARE *share
);
+int spider_insert_sys_table(
+ TABLE *table
+);
+
+int spider_insert_or_update_table_sts(
+ TABLE *table,
+ const char *name,
+ uint name_length,
+ ulonglong *data_file_length,
+ ulonglong *max_data_file_length,
+ ulonglong *index_file_length,
+ ha_rows *records,
+ ulong *mean_rec_length,
+ time_t *check_time,
+ time_t *create_time,
+ time_t *update_time
+);
+
+int spider_insert_or_update_table_crd(
+ TABLE *table,
+ const char *name,
+ uint name_length,
+ longlong *cardinality,
+ uint number_of_keys
+);
+
int spider_log_tables_link_failed(
TABLE *table,
char *name,
@@ -293,6 +391,10 @@ int spider_update_tables_link_status(
long link_status
);
+int spider_update_sys_table(
+ TABLE *table
+);
+
int spider_delete_xa(
TABLE *table,
XID *xid
@@ -309,6 +411,18 @@ int spider_delete_tables(
int *old_link_count
);
+int spider_delete_table_sts(
+ TABLE *table,
+ const char *name,
+ uint name_length
+);
+
+int spider_delete_table_crd(
+ TABLE *table,
+ const char *name,
+ uint name_length
+);
+
int spider_get_sys_xid(
TABLE *table,
XID *xid,
@@ -345,6 +459,12 @@ int spider_get_sys_tables_connect_info(
MEM_ROOT *mem_root
);
+int spider_get_sys_tables_monitoring_binlog_pos_at_failing(
+ TABLE *table,
+ long *monitoring_binlog_pos_at_failing,
+ MEM_ROOT *mem_root
+);
+
int spider_get_sys_tables_link_status(
TABLE *table,
SPIDER_SHARE *share,
@@ -352,12 +472,43 @@ int spider_get_sys_tables_link_status(
MEM_ROOT *mem_root
);
+int spider_get_sys_tables_link_status(
+ TABLE *table,
+ long *link_status,
+ MEM_ROOT *mem_root
+);
+
int spider_get_sys_tables_link_idx(
TABLE *table,
int *link_idx,
MEM_ROOT *mem_root
);
+int spider_get_sys_tables_static_link_id(
+ TABLE *table,
+ char **static_link_id,
+ uint *static_link_id_length,
+ MEM_ROOT *mem_root
+);
+
+void spider_get_sys_table_sts_info(
+ TABLE *table,
+ ulonglong *data_file_length,
+ ulonglong *max_data_file_length,
+ ulonglong *index_file_length,
+ ha_rows *records,
+ ulong *mean_rec_length,
+ time_t *check_time,
+ time_t *create_time,
+ time_t *update_time
+);
+
+void spider_get_sys_table_crd_info(
+ TABLE *table,
+ longlong *cardinality,
+ uint number_of_keys
+);
+
int spider_sys_update_tables_link_status(
THD *thd,
char *name,
@@ -409,11 +560,82 @@ int spider_get_link_statuses(
MEM_ROOT *mem_root
);
+int spider_sys_insert_or_update_table_sts(
+ THD *thd,
+ const char *name,
+ uint name_length,
+ ulonglong *data_file_length,
+ ulonglong *max_data_file_length,
+ ulonglong *index_file_length,
+ ha_rows *records,
+ ulong *mean_rec_length,
+ time_t *check_time,
+ time_t *create_time,
+ time_t *update_time,
+ bool need_lock
+);
+
+int spider_sys_insert_or_update_table_crd(
+ THD *thd,
+ const char *name,
+ uint name_length,
+ longlong *cardinality,
+ uint number_of_keys,
+ bool need_lock
+);
+
+int spider_sys_delete_table_sts(
+ THD *thd,
+ const char *name,
+ uint name_length,
+ bool need_lock
+);
+
+int spider_sys_delete_table_crd(
+ THD *thd,
+ const char *name,
+ uint name_length,
+ bool need_lock
+);
+
+int spider_sys_get_table_sts(
+ THD *thd,
+ const char *name,
+ uint name_length,
+ ulonglong *data_file_length,
+ ulonglong *max_data_file_length,
+ ulonglong *index_file_length,
+ ha_rows *records,
+ ulong *mean_rec_length,
+ time_t *check_time,
+ time_t *create_time,
+ time_t *update_time,
+ bool need_lock
+);
+
+int spider_sys_get_table_crd(
+ THD *thd,
+ const char *name,
+ uint name_length,
+ longlong *cardinality,
+ uint number_of_keys,
+ bool need_lock
+);
+
int spider_sys_replace(
TABLE *table,
bool *modified_non_trans_table
);
+#ifdef SPIDER_use_LEX_CSTRING_for_Field_blob_constructor
+TABLE *spider_mk_sys_tmp_table(
+ THD *thd,
+ TABLE *table,
+ TMP_TABLE_PARAM *tmp_tbl_prm,
+ const LEX_CSTRING *field_name,
+ CHARSET_INFO *cs
+);
+#else
TABLE *spider_mk_sys_tmp_table(
THD *thd,
TABLE *table,
@@ -421,6 +643,7 @@ TABLE *spider_mk_sys_tmp_table(
const char *field_name,
CHARSET_INFO *cs
);
+#endif
void spider_rm_sys_tmp_table(
THD *thd,
@@ -428,6 +651,17 @@ void spider_rm_sys_tmp_table(
TMP_TABLE_PARAM *tmp_tbl_prm
);
+#ifdef SPIDER_use_LEX_CSTRING_for_Field_blob_constructor
+TABLE *spider_mk_sys_tmp_table_for_result(
+ THD *thd,
+ TABLE *table,
+ TMP_TABLE_PARAM *tmp_tbl_prm,
+ const LEX_CSTRING *field_name1,
+ const LEX_CSTRING *field_name2,
+ const LEX_CSTRING *field_name3,
+ CHARSET_INFO *cs
+);
+#else
TABLE *spider_mk_sys_tmp_table_for_result(
THD *thd,
TABLE *table,
@@ -437,9 +671,15 @@ TABLE *spider_mk_sys_tmp_table_for_result(
const char *field_name3,
CHARSET_INFO *cs
);
+#endif
void spider_rm_sys_tmp_table_for_result(
THD *thd,
TABLE *tmp_table,
TMP_TABLE_PARAM *tmp_tbl_prm
);
+
+TABLE *spider_find_temporary_table(
+ THD *thd,
+ TABLE_LIST *table_list
+);
diff --git a/storage/spider/spd_table.cc b/storage/spider/spd_table.cc
index 39f51fa1b59..ca3b7fa08ed 100644
--- a/storage/spider/spd_table.cc
+++ b/storage/spider/spd_table.cc
@@ -1,4 +1,4 @@
-/* Copyright (C) 2008-2015 Kentoku Shiba
+/* Copyright (C) 2008-2018 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
@@ -14,7 +14,9 @@
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */
#define MYSQL_SERVER 1
+#include <my_global.h>
#include "mysql_version.h"
+#include "spd_environ.h"
#if MYSQL_VERSION_ID < 50500
#include "mysql_priv.h"
#include <mysql/plugin.h>
@@ -26,6 +28,7 @@
#include "sql_partition.h"
#include "sql_servers.h"
#include "sql_select.h"
+#include "tztime.h"
#endif
#include "spd_err.h"
#include "spd_param.h"
@@ -40,7 +43,53 @@
#include "spd_ping_table.h"
#include "spd_direct_sql.h"
#include "spd_malloc.h"
+#include "spd_group_by_handler.h"
+/* Background thread management */
+#ifdef SPIDER_HAS_NEXT_THREAD_ID
+#define SPIDER_set_next_thread_id(A)
+MYSQL_THD create_thd();
+void destroy_thd(MYSQL_THD thd);
+#else
+ulong *spd_db_att_thread_id;
+inline void SPIDER_set_next_thread_id(THD *A)
+{
+ pthread_mutex_lock(&LOCK_thread_count);
+ A->thread_id = (*spd_db_att_thread_id)++;
+ pthread_mutex_unlock(&LOCK_thread_count);
+}
+MYSQL_THD create_thd()
+{
+ THD *thd = SPIDER_new_THD(next_thread_id());
+ if (thd)
+ {
+ thd->thread_stack = (char*) &thd;
+ thd->store_globals();
+ thd->set_command(COM_DAEMON);
+ thd->security_ctx->host_or_ip = "";
+ }
+ return thd;
+}
+void destroy_thd(MYSQL_THD thd)
+{
+ delete thd;
+}
+#endif
+inline MYSQL_THD spider_create_sys_thd(SPIDER_THREAD *thread)
+{
+ THD *thd = create_thd();
+ if (thd)
+ {
+ SPIDER_set_next_thread_id(thd);
+ thd->mysys_var->current_cond = &thread->cond;
+ thd->mysys_var->current_mutex = &thread->mutex;
+ }
+ return thd;
+}
+inline void spider_destroy_sys_thd(MYSQL_THD thd)
+{
+ destroy_thd(thd);
+}
inline MYSQL_THD spider_create_thd()
{
THD *thd;
@@ -74,16 +123,22 @@ struct charset_info_st *spd_charset_utf8_bin;
const char **spd_defaults_extra_file;
const char **spd_defaults_file;
bool volatile *spd_abort_loop;
-
+Time_zone *spd_tz_system;
+extern long spider_conn_mutex_id;
handlerton *spider_hton_ptr;
SPIDER_DBTON spider_dbton[SPIDER_DBTON_SIZE];
extern SPIDER_DBTON spider_dbton_mysql;
+extern SPIDER_DBTON spider_dbton_mariadb;
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
extern SPIDER_DBTON spider_dbton_handlersocket;
#endif
#ifdef HAVE_ORACLE_OCI
extern SPIDER_DBTON spider_dbton_oracle;
#endif
+#ifndef WITHOUT_SPIDER_BG_SEARCH
+SPIDER_THREAD *spider_table_sts_threads;
+SPIDER_THREAD *spider_table_crd_threads;
+#endif
#ifdef HAVE_PSI_INTERFACE
PSI_mutex_key spd_key_mutex_tbl;
@@ -127,6 +182,12 @@ PSI_mutex_key spd_key_mutex_udf_table;
PSI_mutex_key spd_key_mutex_mem_calc;
PSI_mutex_key spd_key_thread_id;
PSI_mutex_key spd_key_conn_id;
+PSI_mutex_key spd_key_mutex_ipport_count;
+PSI_mutex_key spd_key_mutex_conn_i;
+#ifndef WITHOUT_SPIDER_BG_SEARCH
+PSI_mutex_key spd_key_mutex_bg_stss;
+PSI_mutex_key spd_key_mutex_bg_crds;
+#endif
static PSI_mutex_info all_spider_mutexes[]=
{
@@ -148,6 +209,12 @@ static PSI_mutex_info all_spider_mutexes[]=
{ &spd_key_mutex_mem_calc, "mem_calc", PSI_FLAG_GLOBAL},
{ &spd_key_thread_id, "thread_id", PSI_FLAG_GLOBAL},
{ &spd_key_conn_id, "conn_id", PSI_FLAG_GLOBAL},
+ { &spd_key_mutex_ipport_count, "ipport_count", PSI_FLAG_GLOBAL},
+#ifndef WITHOUT_SPIDER_BG_SEARCH
+ { &spd_key_mutex_bg_stss, "bg_stss", PSI_FLAG_GLOBAL},
+ { &spd_key_mutex_bg_crds, "bg_crds", PSI_FLAG_GLOBAL},
+#endif
+ { &spd_key_mutex_conn_i, "conn_i", 0},
{ &spd_key_mutex_mta_conn, "mta_conn", 0},
#ifndef WITHOUT_SPIDER_BG_SEARCH
{ &spd_key_mutex_bg_conn_chain, "bg_conn_chain", 0},
@@ -185,6 +252,13 @@ PSI_cond_key spd_key_cond_bg_mon_sleep;
PSI_cond_key spd_key_cond_bg_direct_sql;
#endif
PSI_cond_key spd_key_cond_udf_table_mon;
+PSI_cond_key spd_key_cond_conn_i;
+#ifndef WITHOUT_SPIDER_BG_SEARCH
+PSI_cond_key spd_key_cond_bg_stss;
+PSI_cond_key spd_key_cond_bg_sts_syncs;
+PSI_cond_key spd_key_cond_bg_crds;
+PSI_cond_key spd_key_cond_bg_crd_syncs;
+#endif
static PSI_cond_info all_spider_conds[] = {
#ifndef WITHOUT_SPIDER_BG_SEARCH
@@ -199,6 +273,13 @@ static PSI_cond_info all_spider_conds[] = {
{&spd_key_cond_bg_direct_sql, "bg_direct_sql", 0},
#endif
{&spd_key_cond_udf_table_mon, "udf_table_mon", 0},
+ {&spd_key_cond_conn_i, "conn_i", 0},
+#ifndef WITHOUT_SPIDER_BG_SEARCH
+ {&spd_key_cond_bg_stss, "bg_stss", 0},
+ {&spd_key_cond_bg_sts_syncs, "bg_sts_syncs", 0},
+ {&spd_key_cond_bg_crds, "bg_crds", 0},
+ {&spd_key_cond_bg_crd_syncs, "bg_crd_syncs", 0},
+#endif
};
#ifndef WITHOUT_SPIDER_BG_SEARCH
@@ -206,6 +287,8 @@ PSI_thread_key spd_key_thd_bg;
PSI_thread_key spd_key_thd_bg_sts;
PSI_thread_key spd_key_thd_bg_crd;
PSI_thread_key spd_key_thd_bg_mon;
+PSI_thread_key spd_key_thd_bg_stss;
+PSI_thread_key spd_key_thd_bg_crds;
#endif
static PSI_thread_info all_spider_threads[] = {
@@ -214,11 +297,14 @@ static PSI_thread_info all_spider_threads[] = {
{&spd_key_thd_bg_sts, "bg_sts", 0},
{&spd_key_thd_bg_crd, "bg_crd", 0},
{&spd_key_thd_bg_mon, "bg_mon", 0},
+ {&spd_key_thd_bg_stss, "bg_stss", 0},
+ {&spd_key_thd_bg_crds, "bg_crds", 0},
#endif
};
#endif
extern HASH spider_open_connections;
+extern HASH spider_ipport_conns;
extern uint spider_open_connections_id;
extern const char *spider_open_connections_func_name;
extern const char *spider_open_connections_file_name;
@@ -268,6 +354,7 @@ pthread_mutex_t spider_init_error_tbl_mutex;
extern pthread_mutex_t spider_thread_id_mutex;
extern pthread_mutex_t spider_conn_id_mutex;
+extern pthread_mutex_t spider_ipport_conn_mutex;
#ifdef WITH_PARTITION_STORAGE_ENGINE
HASH spider_open_pt_share;
@@ -528,14 +615,12 @@ int spider_free_share_alloc(
) {
int roop_count;
DBUG_ENTER("spider_free_share_alloc");
+ for (roop_count = SPIDER_DBTON_SIZE - 1; roop_count >= 0; roop_count--)
{
- for (roop_count = SPIDER_DBTON_SIZE - 1; roop_count >= 0; roop_count--)
+ if (share->dbton_share[roop_count])
{
- if (share->dbton_share[roop_count])
- {
- delete share->dbton_share[roop_count];
- share->dbton_share[roop_count] = NULL;
- }
+ delete share->dbton_share[roop_count];
+ share->dbton_share[roop_count] = NULL;
}
}
if (share->server_names)
@@ -723,6 +808,17 @@ int spider_free_share_alloc(
}
spider_free(spider_current_trx, share->tgt_sequence_names, MYF(0));
}
+ if (share->static_link_ids)
+ {
+ for (roop_count = 0; roop_count < (int) share->static_link_ids_length;
+ roop_count++)
+ {
+ if (share->static_link_ids[roop_count])
+ spider_free(spider_current_trx, share->static_link_ids[roop_count],
+ MYF(0));
+ }
+ spider_free(spider_current_trx, share->static_link_ids, MYF(0));
+ }
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
if (share->hs_read_socks)
{
@@ -763,6 +859,8 @@ int spider_free_share_alloc(
if (share->monitoring_bg_kind)
spider_free(spider_current_trx, share->monitoring_bg_kind, MYF(0));
#endif
+ if (share->monitoring_binlog_pos_at_failing)
+ spider_free(spider_current_trx, share->monitoring_binlog_pos_at_failing, MYF(0));
if (share->monitoring_flag)
spider_free(spider_current_trx, share->monitoring_flag, MYF(0));
if (share->monitoring_kind)
@@ -903,6 +1001,11 @@ void spider_free_tmp_share_alloc(
spider_free(spider_current_trx, share->tgt_sequence_names[0], MYF(0));
share->tgt_sequence_names[0] = NULL;
}
+ if (share->static_link_ids && share->static_link_ids[0])
+ {
+ spider_free(spider_current_trx, share->static_link_ids[0], MYF(0));
+ share->static_link_ids[0] = NULL;
+ }
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
if (share->hs_read_socks && share->hs_read_socks[0])
{
@@ -1427,6 +1530,56 @@ error:
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
+int spider_increase_null_string_list(
+ char ***string_list,
+ uint **string_length_list,
+ uint *list_length,
+ uint *list_charlen,
+ uint link_count
+) {
+ int roop_count;
+ char **tmp_str_list;
+ uint *tmp_length_list;
+ DBUG_ENTER("spider_increase_null_string_list");
+ if (*list_length == link_count)
+ DBUG_RETURN(0);
+
+ if (!(tmp_str_list = (char**)
+ spider_bulk_malloc(spider_current_trx, 247, MYF(MY_WME | MY_ZEROFILL),
+ &tmp_str_list, sizeof(char*) * link_count,
+ &tmp_length_list, sizeof(uint) * link_count,
+ NullS))
+ ) {
+ my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+
+ for (roop_count = 0; roop_count < (int) *list_length; roop_count++)
+ {
+ tmp_str_list[roop_count] = (*string_list)[roop_count];
+ tmp_length_list[roop_count] = (*string_length_list)[roop_count];
+ }
+ if (*string_list)
+ {
+ spider_free(spider_current_trx, *string_list, MYF(0));
+ }
+ *list_length = link_count;
+ *string_list = tmp_str_list;
+ *string_length_list = tmp_length_list;
+#ifndef DBUG_OFF
+ DBUG_PRINT("info",("spider list_length=%u", *list_length));
+ for (roop_count = 0; roop_count < (int) *list_length; roop_count++)
+ {
+ DBUG_PRINT("info",("spider string_list[%d]=%s", roop_count,
+ (*string_list)[roop_count] ? (*string_list)[roop_count] : "NULL"));
+ DBUG_PRINT("info",("spider string_length_list[%d]=%u", roop_count,
+ (*string_length_list)[roop_count]));
+ }
+#endif
+
+ DBUG_RETURN(0);
+}
+
int spider_increase_long_list(
long **long_list,
uint *list_length,
@@ -1569,8 +1722,7 @@ int st_spider_param_string_parse::print_param_error()
if ((share->param_name = spider_get_string_between_quote( \
start_ptr, TRUE, &connect_string_parse))) \
share->SPIDER_PARAM_STR_LEN(param_name) = strlen(share->param_name); \
- else \
- { \
+ else { \
error_num = connect_string_parse.print_param_error(); \
goto error; \
} \
@@ -1855,6 +2007,8 @@ int spider_parse_connect_info(
#ifdef WITH_PARTITION_STORAGE_ENGINE
share->sts_sync = -1;
#endif
+ share->store_last_sts = -1;
+ share->load_sts_at_startup = -1;
#ifndef WITHOUT_SPIDER_BG_SEARCH
share->crd_bg_mode = -1;
#endif
@@ -1863,6 +2017,8 @@ int spider_parse_connect_info(
#ifdef WITH_PARTITION_STORAGE_ENGINE
share->crd_sync = -1;
#endif
+ share->store_last_crd = -1;
+ share->load_crd_at_startup = -1;
share->crd_type = -1;
share->crd_weight = -1;
share->internal_offset = -1;
@@ -1890,6 +2046,7 @@ int spider_parse_connect_info(
share->priority = -1;
share->quick_mode = -1;
share->quick_page_size = -1;
+ share->quick_page_byte = -1;
share->low_mem_read = -1;
share->table_count_mode = -1;
share->select_column_mode = -1;
@@ -1904,6 +2061,7 @@ int spider_parse_connect_info(
share->use_table_charset = -1;
share->use_pushdown_udf = -1;
share->skip_default_condition = -1;
+ share->skip_parallel_search = -1;
share->direct_dup_insert = -1;
share->direct_order_limit = -1;
share->bka_mode = -1;
@@ -2063,7 +2221,7 @@ int spider_parse_connect_info(
SPIDER_PARAM_INT_WITH_MAX("bum", bulk_update_mode, 0, 2);
SPIDER_PARAM_INT("bus", bulk_update_size, 0);
#ifndef WITHOUT_SPIDER_BG_SEARCH
- SPIDER_PARAM_INT_WITH_MAX("cbm", crd_bg_mode, 0, 1);
+ SPIDER_PARAM_INT_WITH_MAX("cbm", crd_bg_mode, 0, 2);
#endif
SPIDER_PARAM_DOUBLE("civ", crd_interval, 0);
SPIDER_PARAM_INT_WITH_MAX("cmd", crd_mode, 0, 3);
@@ -2107,6 +2265,8 @@ int spider_parse_connect_info(
SPIDER_PARAM_INT_WITH_MAX("iom", internal_optimize, 0, 1);
SPIDER_PARAM_INT_WITH_MAX("iol", internal_optimize_local, 0, 1);
SPIDER_PARAM_INT_WITH_MAX("lmr", low_mem_read, 0, 1);
+ SPIDER_PARAM_INT_WITH_MAX("lcs", load_crd_at_startup, 0, 1);
+ SPIDER_PARAM_INT_WITH_MAX("lss", load_sts_at_startup, 0, 1);
SPIDER_PARAM_LONG_LIST_WITH_MAX("lst", link_statuses, 0, 3);
#ifndef WITHOUT_SPIDER_BG_SEARCH
SPIDER_PARAM_LONG_LIST_WITH_MAX("mbf", monitoring_bg_flag, 0, 1);
@@ -2114,6 +2274,7 @@ int spider_parse_connect_info(
"mbi", monitoring_bg_interval, 0, 4294967295LL);
SPIDER_PARAM_LONG_LIST_WITH_MAX("mbk", monitoring_bg_kind, 0, 3);
#endif
+ SPIDER_PARAM_LONG_LIST_WITH_MAX("mbp", monitoring_binlog_pos_at_failing, 0, 2);
SPIDER_PARAM_LONG_LIST_WITH_MAX("mfg", monitoring_flag, 0, 1);
SPIDER_PARAM_LONG_LIST_WITH_MAX("mkd", monitoring_kind, 0, 3);
SPIDER_PARAM_LONGLONG_LIST_WITH_MAX(
@@ -2131,12 +2292,13 @@ int spider_parse_connect_info(
SPIDER_PARAM_INT_WITH_MAX("qch", query_cache, 0, 2);
SPIDER_PARAM_INT_WITH_MAX("qcs", query_cache_sync, 0, 3);
SPIDER_PARAM_INT_WITH_MAX("qmd", quick_mode, 0, 3);
+ SPIDER_PARAM_LONGLONG("qpb", quick_page_byte, 0);
SPIDER_PARAM_LONGLONG("qps", quick_page_size, 0);
SPIDER_PARAM_INT_WITH_MAX("rom", read_only_mode, 0, 1);
SPIDER_PARAM_DOUBLE("rrt", read_rate, 0);
SPIDER_PARAM_INT_WITH_MAX("rsa", reset_sql_alloc, 0, 1);
#ifndef WITHOUT_SPIDER_BG_SEARCH
- SPIDER_PARAM_INT_WITH_MAX("sbm", sts_bg_mode, 0, 1);
+ SPIDER_PARAM_INT_WITH_MAX("sbm", sts_bg_mode, 0, 2);
#endif
SPIDER_PARAM_STR_LIST("sca", tgt_ssl_cas);
SPIDER_PARAM_STR_LIST("sch", tgt_ssl_ciphers);
@@ -2146,10 +2308,14 @@ int spider_parse_connect_info(
SPIDER_PARAM_INT_WITH_MAX("sdc", skip_default_condition, 0, 1);
SPIDER_PARAM_DOUBLE("siv", sts_interval, 0);
SPIDER_PARAM_STR_LIST("sky", tgt_ssl_keys);
+ SPIDER_PARAM_STR_LIST("sli", static_link_ids);
+ SPIDER_PARAM_INT_WITH_MAX("slc", store_last_crd, 0, 1);
SPIDER_PARAM_INT_WITH_MAX("slm", selupd_lock_mode, 0, 2);
+ SPIDER_PARAM_INT_WITH_MAX("sls", store_last_sts, 0, 1);
SPIDER_PARAM_INT_WITH_MAX("smd", sts_mode, 1, 2);
SPIDER_PARAM_LONGLONG("smr", static_mean_rec_length, 0);
SPIDER_PARAM_LONGLONG("spr", split_read, 0);
+ SPIDER_PARAM_INT_WITH_MAX("sps", skip_parallel_search, 0, 3);
SPIDER_PARAM_STR_LIST("sqn", tgt_sequence_names);
SPIDER_PARAM_LONGLONG("srd", second_read, 0);
SPIDER_PARAM_DOUBLE("srt", scan_rate, 0);
@@ -2242,8 +2408,8 @@ int spider_parse_connect_info(
case 11:
SPIDER_PARAM_INT_WITH_MAX("query_cache", query_cache, 0, 2);
#ifndef WITHOUT_SPIDER_BG_SEARCH
- SPIDER_PARAM_INT_WITH_MAX("crd_bg_mode", crd_bg_mode, 0, 1);
- SPIDER_PARAM_INT_WITH_MAX("sts_bg_mode", sts_bg_mode, 0, 1);
+ SPIDER_PARAM_INT_WITH_MAX("crd_bg_mode", crd_bg_mode, 0, 2);
+ SPIDER_PARAM_INT_WITH_MAX("sts_bg_mode", sts_bg_mode, 0, 2);
#endif
SPIDER_PARAM_LONG_LIST_WITH_MAX("link_status", link_statuses, 0, 3);
SPIDER_PARAM_LONG_LIST_WITH_MAX("use_handler", use_handlers, 0, 3);
@@ -2287,12 +2453,16 @@ int spider_parse_connect_info(
SPIDER_PARAM_INT_WITH_MAX("read_only_mode", read_only_mode, 0, 1);
SPIDER_PARAM_LONG_LIST_WITH_MAX("access_balance", access_balances, 0,
2147483647);
+ SPIDER_PARAM_STR_LIST("static_link_id", static_link_ids);
+ SPIDER_PARAM_INT_WITH_MAX("store_last_crd", store_last_crd, 0, 1);
+ SPIDER_PARAM_INT_WITH_MAX("store_last_sts", store_last_sts, 0, 1);
error_num = connect_string_parse.print_param_error();
goto error;
case 15:
SPIDER_PARAM_LONGLONG("internal_offset", internal_offset, 0);
SPIDER_PARAM_INT_WITH_MAX("reset_sql_alloc", reset_sql_alloc, 0, 1);
SPIDER_PARAM_INT_WITH_MAX("semi_table_lock", semi_table_lock, 0, 1);
+ SPIDER_PARAM_LONGLONG("quick_page_byte", quick_page_byte, 0);
SPIDER_PARAM_LONGLONG("quick_page_size", quick_page_size, 0);
#ifndef WITHOUT_SPIDER_BG_SEARCH
SPIDER_PARAM_LONGLONG("bgs_second_read", bgs_second_read, 0);
@@ -2383,6 +2553,10 @@ int spider_parse_connect_info(
#endif
SPIDER_PARAM_LONG_LIST_WITH_MAX("bka_table_name_type",
bka_table_name_types, 0, 1);
+ SPIDER_PARAM_INT_WITH_MAX(
+ "load_crd_at_startup", load_crd_at_startup, 0, 1);
+ SPIDER_PARAM_INT_WITH_MAX(
+ "load_sts_at_startup", load_sts_at_startup, 0, 1);
error_num = connect_string_parse.print_param_error();
goto error;
case 20:
@@ -2390,6 +2564,8 @@ int spider_parse_connect_info(
"monitoring_server_id", monitoring_sid, 0, 4294967295LL);
SPIDER_PARAM_INT_WITH_MAX(
"delete_all_rows_type", delete_all_rows_type, 0, 1);
+ SPIDER_PARAM_INT_WITH_MAX(
+ "skip_parallel_search", skip_parallel_search, 0, 3);
error_num = connect_string_parse.print_param_error();
goto error;
case 21:
@@ -2427,6 +2603,11 @@ int spider_parse_connect_info(
"semi_table_lock_connection", semi_table_lock_conn, 0, 1);
error_num = connect_string_parse.print_param_error();
goto error;
+ case 32:
+ SPIDER_PARAM_LONG_LIST_WITH_MAX("monitoring_binlog_pos_at_failing",
+ monitoring_binlog_pos_at_failing, 0, 2);
+ error_num = connect_string_parse.print_param_error();
+ goto error;
default:
error_num = connect_string_parse.print_param_error();
goto error;
@@ -2474,12 +2655,16 @@ int spider_parse_connect_info(
share->all_link_count = share->tgt_pk_names_length;
if (share->all_link_count < share->tgt_sequence_names_length)
share->all_link_count = share->tgt_sequence_names_length;
+ if (share->all_link_count < share->static_link_ids_length)
+ share->all_link_count = share->static_link_ids_length;
if (share->all_link_count < share->tgt_ports_length)
share->all_link_count = share->tgt_ports_length;
if (share->all_link_count < share->tgt_ssl_vscs_length)
share->all_link_count = share->tgt_ssl_vscs_length;
if (share->all_link_count < share->link_statuses_length)
share->all_link_count = share->link_statuses_length;
+ if (share->all_link_count < share->monitoring_binlog_pos_at_failing_length)
+ share->all_link_count = share->monitoring_binlog_pos_at_failing_length;
if (share->all_link_count < share->monitoring_flag_length)
share->all_link_count = share->monitoring_flag_length;
if (share->all_link_count < share->monitoring_kind_length)
@@ -2643,6 +2828,13 @@ int spider_parse_connect_info(
&share->tgt_sequence_names_charlen,
share->all_link_count)))
goto error;
+ if ((error_num = spider_increase_null_string_list(
+ &share->static_link_ids,
+ &share->static_link_ids_lengths,
+ &share->static_link_ids_length,
+ &share->static_link_ids_charlen,
+ share->all_link_count)))
+ goto error;
if ((error_num = spider_increase_long_list(
&share->tgt_ports,
&share->tgt_ports_length,
@@ -2671,6 +2863,11 @@ int spider_parse_connect_info(
goto error;
#endif
if ((error_num = spider_increase_long_list(
+ &share->monitoring_binlog_pos_at_failing,
+ &share->monitoring_binlog_pos_at_failing_length,
+ share->all_link_count)))
+ goto error;
+ if ((error_num = spider_increase_long_list(
&share->monitoring_flag,
&share->monitoring_flag_length,
share->all_link_count)))
@@ -2775,13 +2972,15 @@ int spider_parse_connect_info(
if (!(share_alter->tmp_server_names = (char **)
spider_bulk_malloc(spider_current_trx, 43, MYF(MY_WME | MY_ZEROFILL),
&share_alter->tmp_server_names,
- sizeof(char *) * 15 * share->all_link_count,
+ sizeof(char *) * 16 * share->all_link_count,
&share_alter->tmp_server_names_lengths,
- sizeof(uint *) * 15 * share->all_link_count,
+ sizeof(uint *) * 16 * share->all_link_count,
&share_alter->tmp_tgt_ports,
sizeof(long) * share->all_link_count,
&share_alter->tmp_tgt_ssl_vscs,
sizeof(long) * share->all_link_count,
+ &share_alter->tmp_monitoring_binlog_pos_at_failing,
+ sizeof(long) * share->all_link_count,
&share_alter->tmp_link_statuses,
sizeof(long) * share->all_link_count,
NullS))
@@ -2849,11 +3048,18 @@ int spider_parse_connect_info(
share_alter->tmp_tgt_default_files + share->all_link_count;
memcpy(share_alter->tmp_tgt_default_groups, share->tgt_default_groups,
sizeof(char *) * share->all_link_count);
+ share_alter->tmp_static_link_ids =
+ share_alter->tmp_tgt_default_groups + share->all_link_count;
+ memcpy(share_alter->tmp_static_link_ids, share->static_link_ids,
+ sizeof(char *) * share->all_link_count);
memcpy(share_alter->tmp_tgt_ports, share->tgt_ports,
sizeof(long) * share->all_link_count);
memcpy(share_alter->tmp_tgt_ssl_vscs, share->tgt_ssl_vscs,
sizeof(long) * share->all_link_count);
+ memcpy(share_alter->tmp_monitoring_binlog_pos_at_failing,
+ share->monitoring_binlog_pos_at_failing,
+ sizeof(long) * share->all_link_count);
memcpy(share_alter->tmp_link_statuses, share->link_statuses,
sizeof(long) * share->all_link_count);
@@ -2927,6 +3133,11 @@ int spider_parse_connect_info(
memcpy(share_alter->tmp_tgt_default_groups_lengths,
share->tgt_default_groups_lengths,
sizeof(uint) * share->all_link_count);
+ share_alter->tmp_static_link_ids_lengths =
+ share_alter->tmp_tgt_default_groups_lengths + share->all_link_count;
+ memcpy(share_alter->tmp_static_link_ids_lengths,
+ share->static_link_ids_lengths,
+ sizeof(uint) * share->all_link_count);
share_alter->tmp_server_names_charlen = share->server_names_charlen;
share_alter->tmp_tgt_table_names_charlen = share->tgt_table_names_charlen;
@@ -2945,6 +3156,8 @@ int spider_parse_connect_info(
share->tgt_default_files_charlen;
share_alter->tmp_tgt_default_groups_charlen =
share->tgt_default_groups_charlen;
+ share_alter->tmp_static_link_ids_charlen =
+ share->static_link_ids_charlen;
share_alter->tmp_server_names_length = share->server_names_length;
share_alter->tmp_tgt_table_names_length = share->tgt_table_names_length;
@@ -2962,8 +3175,12 @@ int spider_parse_connect_info(
share_alter->tmp_tgt_default_files_length = share->tgt_default_files_length;
share_alter->tmp_tgt_default_groups_length =
share->tgt_default_groups_length;
+ share_alter->tmp_static_link_ids_length =
+ share->static_link_ids_length;
share_alter->tmp_tgt_ports_length = share->tgt_ports_length;
share_alter->tmp_tgt_ssl_vscs_length = share->tgt_ssl_vscs_length;
+ share_alter->tmp_monitoring_binlog_pos_at_failing_length =
+ share->monitoring_binlog_pos_at_failing_length;
share_alter->tmp_link_statuses_length = share->link_statuses_length;
/* copy for tables end */
@@ -3203,6 +3420,51 @@ int spider_parse_connect_info(
MYF(0), share->tgt_sequence_names[roop_count], "sequence_name");
goto error;
}
+
+ DBUG_PRINT("info",
+ ("spider static_link_ids_lengths[%d] = %u", roop_count,
+ share->static_link_ids_lengths[roop_count]));
+ if (share->static_link_ids_lengths[roop_count] >
+ SPIDER_CONNECT_INFO_MAX_LEN)
+ {
+ error_num = ER_SPIDER_INVALID_CONNECT_INFO_TOO_LONG_NUM;
+ my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_TOO_LONG_STR,
+ MYF(0), share->static_link_ids[roop_count], "static_link_id");
+ goto error;
+ }
+ if (share->static_link_ids[roop_count])
+ {
+ if (
+ share->static_link_ids_lengths[roop_count] > 0 &&
+ share->static_link_ids[roop_count][0] >= '0' &&
+ share->static_link_ids[roop_count][0] <= '9'
+ ) {
+ error_num = ER_SPIDER_INVALID_CONNECT_INFO_START_WITH_NUM_NUM;
+ my_printf_error(error_num,
+ ER_SPIDER_INVALID_CONNECT_INFO_START_WITH_NUM_STR,
+ MYF(0), share->static_link_ids[roop_count], "static_link_id");
+ goto error;
+ }
+ for (roop_count2 = roop_count + 1;
+ roop_count2 < (int) share->all_link_count;
+ roop_count2++)
+ {
+ if (
+ share->static_link_ids_lengths[roop_count] ==
+ share->static_link_ids_lengths[roop_count2] &&
+ !memcmp(share->static_link_ids[roop_count],
+ share->static_link_ids[roop_count2],
+ share->static_link_ids_lengths[roop_count])
+ ) {
+ error_num = ER_SPIDER_INVALID_CONNECT_INFO_SAME_NUM;
+ my_printf_error(error_num,
+ ER_SPIDER_INVALID_CONNECT_INFO_SAME_STR,
+ MYF(0), share->static_link_ids[roop_count],
+ "static_link_id");
+ goto error;
+ }
+ }
+ }
}
}
@@ -3359,6 +3621,22 @@ int spider_set_connect_info_default(
}
}
+/*
+ if (!share->static_link_ids[roop_count])
+ {
+ DBUG_PRINT("info",("spider create default static_link_ids"));
+ share->static_link_ids_lengths[roop_count] =
+ SPIDER_DB_STATIC_LINK_ID_LEN;
+ if (
+ !(share->static_link_ids[roop_count] = spider_create_string(
+ SPIDER_DB_STATIC_LINK_ID_STR,
+ share->static_link_ids_lengths[roop_count]))
+ ) {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ }
+*/
+
if (share->tgt_ports[roop_count] == -1)
{
share->tgt_ports[roop_count] = MYSQL_PORT;
@@ -3398,6 +3676,8 @@ int spider_set_connect_info_default(
if (share->monitoring_bg_kind[roop_count] == -1)
share->monitoring_bg_kind[roop_count] = 0;
#endif
+ if (share->monitoring_binlog_pos_at_failing[roop_count] == -1)
+ share->monitoring_binlog_pos_at_failing[roop_count] = 0;
if (share->monitoring_flag[roop_count] == -1)
share->monitoring_flag[roop_count] = 0;
if (share->monitoring_kind[roop_count] == -1)
@@ -3467,7 +3747,7 @@ int spider_set_connect_info_default(
#ifndef WITHOUT_SPIDER_BG_SEARCH
if (share->sts_bg_mode == -1)
- share->sts_bg_mode = 1;
+ share->sts_bg_mode = 2;
#endif
if (share->sts_interval == -1)
share->sts_interval = 10;
@@ -3477,9 +3757,13 @@ int spider_set_connect_info_default(
if (share->sts_sync == -1)
share->sts_sync = 0;
#endif
+ if (share->store_last_sts == -1)
+ share->store_last_sts = 1;
+ if (share->load_sts_at_startup == -1)
+ share->load_sts_at_startup = 1;
#ifndef WITHOUT_SPIDER_BG_SEARCH
if (share->crd_bg_mode == -1)
- share->crd_bg_mode = 1;
+ share->crd_bg_mode = 2;
#endif
if (share->crd_interval == -1)
share->crd_interval = 51;
@@ -3489,6 +3773,10 @@ int spider_set_connect_info_default(
if (share->crd_sync == -1)
share->crd_sync = 0;
#endif
+ if (share->store_last_crd == -1)
+ share->store_last_crd = 1;
+ if (share->load_crd_at_startup == -1)
+ share->load_crd_at_startup = 1;
if (share->crd_type == -1)
share->crd_type = 2;
if (share->crd_weight == -1)
@@ -3540,9 +3828,11 @@ int spider_set_connect_info_default(
if (share->priority == -1)
share->priority = 1000000;
if (share->quick_mode == -1)
- share->quick_mode = 0;
+ share->quick_mode = 3;
if (share->quick_page_size == -1)
- share->quick_page_size = 100;
+ share->quick_page_size = 1024;
+ if (share->quick_page_byte == -1)
+ share->quick_page_byte = 10485760;
if (share->low_mem_read == -1)
share->low_mem_read = 1;
if (share->table_count_mode == -1)
@@ -3569,6 +3859,8 @@ int spider_set_connect_info_default(
share->use_pushdown_udf = 1;
if (share->skip_default_condition == -1)
share->skip_default_condition = 0;
+ if (share->skip_parallel_search == -1)
+ share->skip_parallel_search = 0;
if (share->direct_dup_insert == -1)
share->direct_dup_insert = 0;
if (share->direct_order_limit == -1)
@@ -3720,31 +4012,28 @@ int spider_create_conn_keys(
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
char *tmp_hs_r_name, *tmp_hs_w_name;
#endif
-#if defined(_MSC_VER) || defined(__SUNPRO_CC)
uint *conn_keys_lengths;
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
uint *hs_r_conn_keys_lengths;
uint *hs_w_conn_keys_lengths;
#endif
-#else
- uint conn_keys_lengths[share->all_link_count];
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- uint hs_r_conn_keys_lengths[share->all_link_count];
- uint hs_w_conn_keys_lengths[share->all_link_count];
-#endif
-#endif
DBUG_ENTER("spider_create_conn_keys");
-#if defined(_MSC_VER) || defined(__SUNPRO_CC)
- if (!(conn_keys_lengths =
- (uint *) spider_bulk_alloc_mem(spider_current_trx, 44,
- __func__, __FILE__, __LINE__, MYF(MY_WME),
- &conn_keys_lengths, sizeof(uint) * share->all_link_count,
+ char *ptr;
+ uint length = sizeof(uint) * share->all_link_count;
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- &hs_r_conn_keys_lengths, sizeof(uint) * share->all_link_count,
- &hs_w_conn_keys_lengths, sizeof(uint) * share->all_link_count,
+ length += (sizeof(uint) * share->all_link_count) * 2;
#endif
- NullS)))
+ ptr = (char *) my_alloca(length);
+ if (!ptr)
+ {
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ conn_keys_lengths = (uint *) ptr;
+ ptr += (sizeof(uint) * share->all_link_count);
+#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
+ hs_r_conn_keys_lengths = (uint *) ptr;
+ ptr += (sizeof(uint) * share->all_link_count);
+ hs_w_conn_keys_lengths = (uint *) ptr;
#endif
share->conn_keys_charlen = 0;
@@ -3823,9 +4112,7 @@ int spider_create_conn_keys(
#endif
NullS))
) {
-#if defined(_MSC_VER) || defined(__SUNPRO_CC)
- spider_free(spider_current_trx, conn_keys_lengths, MYF(MY_WME));
-#endif
+ my_afree(conn_keys_lengths);
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
share->conn_keys_length = share->all_link_count;
@@ -3840,9 +4127,7 @@ int spider_create_conn_keys(
sizeof(uint) * share->all_link_count);
#endif
-#if defined(_MSC_VER) || defined(__SUNPRO_CC)
- spider_free(spider_current_trx, conn_keys_lengths, MYF(MY_WME));
-#endif
+ my_afree(conn_keys_lengths);
for (roop_count = 0; roop_count < (int) share->all_link_count; roop_count++)
{
@@ -4111,6 +4396,7 @@ SPIDER_SHARE *spider_create_share(
goto error_alloc_share;
}
+ SPD_INIT_ALLOC_ROOT(&share->mem_root, 4096, 0, MYF(MY_WME));
share->use_count = 0;
share->use_dbton_count = 0;
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
@@ -4132,6 +4418,12 @@ SPIDER_SHARE *spider_create_share(
(uchar*) table_share->path.str, table_share->path.length);
#endif
#endif
+#ifndef WITHOUT_SPIDER_BG_SEARCH
+ share->table.s = table_share;
+ share->table.field = table_share->field;
+ share->table.key_info = table_share->key_info;
+ share->table.read_set = &table_share->all_set;
+#endif
if (table_share->keys > 0 &&
!(share->key_hint = new spider_string[table_share->keys])
@@ -4323,6 +4615,9 @@ SPIDER_SHARE *spider_get_share(
MEM_ROOT mem_root;
TABLE *table_tables = NULL;
bool init_mem_root = FALSE;
+ bool same_server_link;
+ int load_sts_at_startup;
+ int load_crd_at_startup;
DBUG_ENTER("spider_get_share");
length = (uint) strlen(table_name);
@@ -4389,15 +4684,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 (
@@ -4414,6 +4714,9 @@ SPIDER_SHARE *spider_get_share(
pthread_mutex_unlock(&spider_udf_table_mon_mutexes[roop_count]);
}
pthread_mutex_unlock(&share->mutex);
+ share->init_error = TRUE;
+ share->init_error_time = (time_t) time((time_t*) 0);
+ share->init = TRUE;
spider_free_share(share);
goto error_open_sys_table;
}
@@ -4433,6 +4736,9 @@ SPIDER_SHARE *spider_get_share(
pthread_mutex_unlock(&spider_udf_table_mon_mutexes[roop_count]);
}
pthread_mutex_unlock(&share->mutex);
+ share->init_error = TRUE;
+ share->init_error_time = (time_t) time((time_t*) 0);
+ share->init = TRUE;
spider_free_share(share);
goto error_get_link_statuses;
}
@@ -4484,6 +4790,64 @@ SPIDER_SHARE *spider_get_share(
spider->set_error_mode();
#ifndef WITHOUT_SPIDER_BG_SEARCH
+ if (!share->sts_spider_init)
+ {
+ pthread_mutex_lock(&share->mutex);
+ if (!share->sts_spider_init)
+ {
+ if ((*error_num = spider_create_spider_object_for_share(
+ spider->trx, share, &share->sts_spider)))
+ {
+ pthread_mutex_unlock(&share->mutex);
+ share->init_error = TRUE;
+ share->init_error_time = (time_t) time((time_t*) 0);
+ share->init = TRUE;
+ spider_free_share(share);
+ goto error_sts_spider_init;
+ }
+#ifdef HASH_UPDATE_WITH_HASH_VALUE
+ share->sts_thread = &spider_table_sts_threads[
+ hash_value % spider_param_table_sts_thread_count()];
+#else
+ share->sts_thread = &spider_table_sts_threads[
+ my_calc_hash(&spider_open_tables, (uchar*) table_name, length) %
+ spider_param_table_sts_thread_count()];
+#endif
+ share->sts_spider_init = TRUE;
+ }
+ pthread_mutex_unlock(&share->mutex);
+ }
+
+ if (!share->crd_spider_init)
+ {
+ pthread_mutex_lock(&share->mutex);
+ if (!share->crd_spider_init)
+ {
+ if ((*error_num = spider_create_spider_object_for_share(
+ spider->trx, share, &share->crd_spider)))
+ {
+ pthread_mutex_unlock(&share->mutex);
+ share->init_error = TRUE;
+ share->init_error_time = (time_t) time((time_t*) 0);
+ share->init = TRUE;
+ spider_free_share(share);
+ goto error_crd_spider_init;
+ }
+#ifdef HASH_UPDATE_WITH_HASH_VALUE
+ share->crd_thread = &spider_table_crd_threads[
+ hash_value % spider_param_table_crd_thread_count()];
+#else
+ share->crd_thread = &spider_table_crd_threads[
+ my_calc_hash(&spider_open_tables, (uchar*) table_name, length) %
+ spider_param_table_crd_thread_count()];
+#endif
+ share->crd_spider_init = TRUE;
+ }
+ pthread_mutex_unlock(&share->mutex);
+ }
+#endif
+
+#ifndef WITHOUT_SPIDER_BG_SEARCH
if (
sql_command != SQLCOM_DROP_TABLE &&
sql_command != SQLCOM_ALTER_TABLE &&
@@ -4636,6 +5000,10 @@ SPIDER_SHARE *spider_get_share(
spider->dbton_handler[dbton_id] = NULL;
}
}
+ share->init_error = TRUE;
+ share->init_error_time = (time_t) time((time_t*) 0);
+ share->init = TRUE;
+ spider_free_share(share);
goto error_but_no_delete;
}
@@ -4667,6 +5035,7 @@ SPIDER_SHARE *spider_get_share(
spider->trx,
spider->trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -4693,14 +5062,10 @@ SPIDER_SHARE *spider_get_share(
share->link_count, SPIDER_LINK_STATUS_OK);
if (search_link_idx == -1)
{
-#if defined(_MSC_VER) || defined(__SUNPRO_CC)
- char *db, *table_name;
- if (!(db = (char *)
- spider_bulk_malloc(spider_current_trx, 48, MYF(MY_WME),
- &db, table_share->db.length + 1,
- &table_name, table_share->table_name.length + 1,
- NullS))
- ) {
+ char *db = (char *) my_alloca(
+ table_share->db.length + 1 + table_share->table_name.length + 1);
+ if (!db)
+ {
*error_num = HA_ERR_OUT_OF_MEM;
share->init_error = TRUE;
share->init_error_time = (time_t) time((time_t*) 0);
@@ -4708,10 +5073,7 @@ SPIDER_SHARE *spider_get_share(
spider_free_share(share);
goto error_but_no_delete;
}
-#else
- char db[table_share->db.length + 1],
- table_name[table_share->table_name.length + 1];
-#endif
+ char *table_name = db + table_share->db.length + 1;
memcpy(db, table_share->db.str, table_share->db.length);
db[table_share->db.length] = '\0';
memcpy(table_name, table_share->table_name.str,
@@ -4719,24 +5081,39 @@ SPIDER_SHARE *spider_get_share(
table_name[table_share->table_name.length] = '\0';
my_printf_error(ER_SPIDER_ALL_LINKS_FAILED_NUM,
ER_SPIDER_ALL_LINKS_FAILED_STR, MYF(0), db, table_name);
-#if defined(_MSC_VER) || defined(__SUNPRO_CC)
- spider_free(spider->trx, db, MYF(MY_WME));
-#endif
+ my_afree(db);
*error_num = ER_SPIDER_ALL_LINKS_FAILED_NUM;
share->init_error = TRUE;
share->init_error_time = (time_t) time((time_t*) 0);
share->init = TRUE;
spider_free_share(share);
goto error_but_no_delete;
+ } else if (search_link_idx == -2)
+ {
+ *error_num = HA_ERR_OUT_OF_MEM;
+ share->init_error = TRUE;
+ share->init_error_time = (time_t) time((time_t*) 0);
+ share->init = TRUE;
+ spider_free_share(share);
+ goto error_but_no_delete;
}
spider->search_link_idx = search_link_idx;
+ same_server_link = spider_param_same_server_link(thd);
+ load_sts_at_startup =
+ spider_param_load_sts_at_startup(share->load_sts_at_startup);
+ load_crd_at_startup =
+ spider_param_load_crd_at_startup(share->load_crd_at_startup);
if (
sql_command != SQLCOM_DROP_TABLE &&
sql_command != SQLCOM_ALTER_TABLE &&
sql_command != SQLCOM_SHOW_CREATE &&
!spider->error_mode &&
- !spider_param_same_server_link(thd)
+ (
+ !same_server_link ||
+ load_sts_at_startup ||
+ load_crd_at_startup
+ )
) {
SPIDER_INIT_ERROR_TABLE *spider_init_error_table;
sts_interval = spider_param_sts_interval(thd, share->sts_interval);
@@ -4780,22 +5157,32 @@ SPIDER_SHARE *spider_get_share(
}
}
- if (spider_get_sts(share, spider->search_link_idx, tmp_time,
- spider, sts_interval, sts_mode,
+ if (
+ (
+ !same_server_link ||
+ load_sts_at_startup
+ ) &&
+ spider_get_sts(share, spider->search_link_idx, tmp_time,
+ spider, sts_interval, sts_mode,
#ifdef WITH_PARTITION_STORAGE_ENGINE
- sts_sync,
+ sts_sync,
#endif
- 1, HA_STATUS_VARIABLE | HA_STATUS_CONST | HA_STATUS_AUTO))
- {
+ 1, HA_STATUS_VARIABLE | HA_STATUS_CONST | HA_STATUS_AUTO)
+ ) {
thd->clear_error();
}
- if (spider_get_crd(share, spider->search_link_idx, tmp_time,
- spider, table, crd_interval, crd_mode,
+ if (
+ (
+ !same_server_link ||
+ load_crd_at_startup
+ ) &&
+ spider_get_crd(share, spider->search_link_idx, tmp_time,
+ spider, table, crd_interval, crd_mode,
#ifdef WITH_PARTITION_STORAGE_ENGINE
- crd_sync,
+ crd_sync,
#endif
- 1))
- {
+ 1)
+ ) {
thd->clear_error();
}
pthread_mutex_unlock(&share->crd_mutex);
@@ -4807,9 +5194,22 @@ SPIDER_SHARE *spider_get_share(
share->use_count++;
pthread_mutex_unlock(&spider_tbl_mutex);
+ int sleep_cnt = 0;
while (!share->init)
{
- my_sleep(10);
+ // avoid for dead loop
+ if (sleep_cnt++ > 1000)
+ {
+ fprintf(stderr, " [WARN SPIDER RESULT] "
+ "Wait share->init too long, table_name %s %s %ld\n",
+ share->table_name, share->tgt_hosts[0], share->tgt_ports[0]);
+ *error_num = ER_SPIDER_TABLE_OPEN_TIMEOUT_NUM;
+ my_printf_error(ER_SPIDER_TABLE_OPEN_TIMEOUT_NUM,
+ ER_SPIDER_TABLE_OPEN_TIMEOUT_STR, MYF(0),
+ table_share->db.str, table_share->table_name.str);
+ goto error_but_no_delete;
+ }
+ my_sleep(10000); // wait 10 ms
}
if (!share->link_status_init)
@@ -4824,15 +5224,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 (
@@ -4917,6 +5322,58 @@ SPIDER_SHARE *spider_get_share(
spider->set_error_mode();
#ifndef WITHOUT_SPIDER_BG_SEARCH
+ if (!share->sts_spider_init)
+ {
+ pthread_mutex_lock(&share->mutex);
+ if (!share->sts_spider_init)
+ {
+ if ((*error_num = spider_create_spider_object_for_share(
+ spider->trx, share, &share->sts_spider)))
+ {
+ pthread_mutex_unlock(&share->mutex);
+ spider_free_share(share);
+ goto error_sts_spider_init;
+ }
+#ifdef HASH_UPDATE_WITH_HASH_VALUE
+ share->sts_thread = &spider_table_sts_threads[
+ hash_value % spider_param_table_sts_thread_count()];
+#else
+ share->sts_thread = &spider_table_sts_threads[
+ my_calc_hash(&spider_open_tables, (uchar*) table_name, length) %
+ spider_param_table_sts_thread_count()];
+#endif
+ share->sts_spider_init = TRUE;
+ }
+ pthread_mutex_unlock(&share->mutex);
+ }
+
+ if (!share->crd_spider_init)
+ {
+ pthread_mutex_lock(&share->mutex);
+ if (!share->crd_spider_init)
+ {
+ if ((*error_num = spider_create_spider_object_for_share(
+ spider->trx, share, &share->crd_spider)))
+ {
+ pthread_mutex_unlock(&share->mutex);
+ spider_free_share(share);
+ goto error_crd_spider_init;
+ }
+#ifdef HASH_UPDATE_WITH_HASH_VALUE
+ share->crd_thread = &spider_table_crd_threads[
+ hash_value % spider_param_table_crd_thread_count()];
+#else
+ share->crd_thread = &spider_table_crd_threads[
+ my_calc_hash(&spider_open_tables, (uchar*) table_name, length) %
+ spider_param_table_crd_thread_count()];
+#endif
+ share->crd_spider_init = TRUE;
+ }
+ pthread_mutex_unlock(&share->mutex);
+ }
+#endif
+
+#ifndef WITHOUT_SPIDER_BG_SEARCH
if (
sql_command != SQLCOM_DROP_TABLE &&
sql_command != SQLCOM_ALTER_TABLE &&
@@ -5094,6 +5551,7 @@ SPIDER_SHARE *spider_get_share(
spider->trx,
spider->trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -5117,22 +5575,15 @@ SPIDER_SHARE *spider_get_share(
share->link_count, SPIDER_LINK_STATUS_OK);
if (search_link_idx == -1)
{
-#if defined(_MSC_VER) || defined(__SUNPRO_CC)
- char *db, *table_name;
- if (!(db = (char *)
- spider_bulk_malloc(spider_current_trx, 50, MYF(MY_WME),
- &db, table_share->db.length + 1,
- &table_name, table_share->table_name.length + 1,
- NullS))
- ) {
+ char *db = (char *) my_alloca(
+ table_share->db.length + 1 + table_share->table_name.length + 1);
+ if (!db)
+ {
*error_num = HA_ERR_OUT_OF_MEM;
spider_free_share(share);
goto error_but_no_delete;
}
-#else
- char db[table_share->db.length + 1],
- table_name[table_share->table_name.length + 1];
-#endif
+ char *table_name = db + table_share->db.length + 1;
memcpy(db, table_share->db.str, table_share->db.length);
db[table_share->db.length] = '\0';
memcpy(table_name, table_share->table_name.str,
@@ -5140,12 +5591,15 @@ SPIDER_SHARE *spider_get_share(
table_name[table_share->table_name.length] = '\0';
my_printf_error(ER_SPIDER_ALL_LINKS_FAILED_NUM,
ER_SPIDER_ALL_LINKS_FAILED_STR, MYF(0), db, table_name);
-#if defined(_MSC_VER) || defined(__SUNPRO_CC)
- spider_free(spider->trx, db, MYF(MY_WME));
-#endif
+ my_afree(db);
*error_num = ER_SPIDER_ALL_LINKS_FAILED_NUM;
spider_free_share(share);
goto error_but_no_delete;
+ } else if (search_link_idx == -2)
+ {
+ *error_num = HA_ERR_OUT_OF_MEM;
+ spider_free_share(share);
+ goto error_but_no_delete;
}
spider->search_link_idx = search_link_idx;
@@ -5155,12 +5609,21 @@ SPIDER_SHARE *spider_get_share(
pthread_mutex_lock(&share->crd_mutex);
if (share->init_error)
{
+ same_server_link = spider_param_same_server_link(thd);
+ load_sts_at_startup =
+ spider_param_load_sts_at_startup(share->load_sts_at_startup);
+ load_crd_at_startup =
+ spider_param_load_crd_at_startup(share->load_crd_at_startup);
if (
sql_command != SQLCOM_DROP_TABLE &&
sql_command != SQLCOM_ALTER_TABLE &&
sql_command != SQLCOM_SHOW_CREATE &&
!spider->error_mode &&
- !spider_param_same_server_link(thd)
+ (
+ !same_server_link ||
+ load_sts_at_startup ||
+ load_crd_at_startup
+ )
) {
SPIDER_INIT_ERROR_TABLE *spider_init_error_table;
sts_interval = spider_param_sts_interval(thd, share->sts_interval);
@@ -5200,22 +5663,32 @@ SPIDER_SHARE *spider_get_share(
}
}
- if (spider_get_sts(share, spider->search_link_idx,
- tmp_time, spider, sts_interval, sts_mode,
+ if (
+ (
+ !same_server_link ||
+ load_sts_at_startup
+ ) &&
+ spider_get_sts(share, spider->search_link_idx,
+ tmp_time, spider, sts_interval, sts_mode,
#ifdef WITH_PARTITION_STORAGE_ENGINE
- sts_sync,
+ sts_sync,
#endif
- 1, HA_STATUS_VARIABLE | HA_STATUS_CONST | HA_STATUS_AUTO))
- {
+ 1, HA_STATUS_VARIABLE | HA_STATUS_CONST | HA_STATUS_AUTO)
+ ) {
thd->clear_error();
}
- if (spider_get_crd(share, spider->search_link_idx,
- tmp_time, spider, table, crd_interval, crd_mode,
+ if (
+ (
+ !same_server_link ||
+ load_crd_at_startup
+ ) &&
+ spider_get_crd(share, spider->search_link_idx,
+ tmp_time, spider, table, crd_interval, crd_mode,
#ifdef WITH_PARTITION_STORAGE_ENGINE
- crd_sync,
+ crd_sync,
#endif
- 1))
- {
+ 1)
+ ) {
thd->clear_error();
}
}
@@ -5241,6 +5714,10 @@ error_get_link_statuses:
table_tables = NULL;
}
error_open_sys_table:
+#ifndef WITHOUT_SPIDER_BG_SEARCH
+error_crd_spider_init:
+error_sts_spider_init:
+#endif
if (init_mem_root)
{
free_root(&mem_root, MYF(0));
@@ -5268,13 +5745,73 @@ int spider_free_share(
) {
DBUG_ENTER("spider_free_share");
pthread_mutex_lock(&spider_tbl_mutex);
+ bool do_delete_thd = false;
+ THD *thd = current_thd;
if (!--share->use_count)
{
#ifndef WITHOUT_SPIDER_BG_SEARCH
spider_free_sts_thread(share);
spider_free_crd_thread(share);
spider_free_mon_threads(share);
+ if (share->sts_spider_init)
+ {
+ spider_table_remove_share_from_sts_thread(share);
+ spider_free_spider_object_for_share(&share->sts_spider);
+ }
+ if (share->crd_spider_init)
+ {
+ spider_table_remove_share_from_crd_thread(share);
+ spider_free_spider_object_for_share(&share->crd_spider);
+ }
#endif
+ if (
+ share->sts_init &&
+ spider_param_store_last_sts(share->store_last_sts)
+ ) {
+ if (!thd)
+ {
+ /* Create a thread for Spider system table update */
+ thd = spider_create_thd();
+ if (!thd)
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ do_delete_thd = TRUE;
+ }
+ spider_sys_insert_or_update_table_sts(
+ thd,
+ share->lgtm_tblhnd_share->table_name,
+ share->lgtm_tblhnd_share->table_name_length,
+ &share->data_file_length,
+ &share->max_data_file_length,
+ &share->index_file_length,
+ &share->records,
+ &share->mean_rec_length,
+ &share->check_time,
+ &share->create_time,
+ &share->update_time,
+ FALSE
+ );
+ }
+ if (
+ share->crd_init &&
+ spider_param_store_last_crd(share->store_last_crd)
+ ) {
+ if (!thd)
+ {
+ /* Create a thread for Spider system table update */
+ thd = spider_create_thd();
+ if (!thd)
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ do_delete_thd = TRUE;
+ }
+ spider_sys_insert_or_update_table_crd(
+ thd,
+ share->lgtm_tblhnd_share->table_name,
+ share->lgtm_tblhnd_share->table_name_length,
+ share->cardinality,
+ share->table_share->fields,
+ FALSE
+ );
+ }
spider_free_share_alloc(share);
#ifdef HASH_UPDATE_WITH_HASH_VALUE
my_hash_delete_with_hash_value(&spider_open_tables,
@@ -5286,8 +5823,11 @@ int spider_free_share(
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));
}
+ if (do_delete_thd)
+ spider_destroy_thd(thd);
pthread_mutex_unlock(&spider_tbl_mutex);
DBUG_RETURN(0);
}
@@ -5741,7 +6281,7 @@ int spider_open_all_tables(
}
SPD_INIT_ALLOC_ROOT(&mem_root, 4096, 0, MYF(MY_WME));
- memset(&tmp_share, 0, sizeof(SPIDER_SHARE));
+ memset((void*)&tmp_share, 0, sizeof(SPIDER_SHARE));
memset(&tmp_connect_info, 0,
sizeof(char *) * SPIDER_TMP_SHARE_CHAR_PTR_COUNT);
memset(tmp_connect_info_length, 0,
@@ -5882,7 +6422,7 @@ int spider_open_all_tables(
free_root(&mem_root, MYF(0));
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
- memcpy(share, &tmp_share, sizeof(*share));
+ memcpy((void*)share, &tmp_share, sizeof(*share));
spider_set_tmp_share_pointer(share, connect_info,
connect_info_length, long_info, longlong_info);
memcpy(connect_info, &tmp_connect_info, sizeof(char *) *
@@ -6102,6 +6642,20 @@ int spider_db_done(
}
}
+#ifndef WITHOUT_SPIDER_BG_SEARCH
+ for (roop_count = spider_param_table_crd_thread_count() - 1;
+ roop_count >= 0; roop_count--)
+ {
+ spider_free_crd_threads(&spider_table_crd_threads[roop_count]);
+ }
+ for (roop_count = spider_param_table_sts_thread_count() - 1;
+ roop_count >= 0; roop_count--)
+ {
+ spider_free_sts_threads(&spider_table_sts_threads[roop_count]);
+ }
+ spider_free(NULL, spider_table_sts_threads, MYF(0));
+#endif
+
for (roop_count = spider_param_udf_table_mon_mutex_count() - 1;
roop_count >= 0; roop_count--)
{
@@ -6220,6 +6774,7 @@ int spider_db_done(
spider_open_connections.array.max_element *
spider_open_connections.array.size_of_element);
my_hash_free(&spider_open_connections);
+ my_hash_free(&spider_ipport_conns);
spider_free_mem_calc(spider_current_trx,
spider_lgtm_tblhnd_share_hash_id,
spider_lgtm_tblhnd_share_hash.array.max_element *
@@ -6272,6 +6827,7 @@ int spider_db_done(
#endif
pthread_mutex_destroy(&spider_init_error_tbl_mutex);
pthread_mutex_destroy(&spider_conn_id_mutex);
+ pthread_mutex_destroy(&spider_ipport_conn_mutex);
pthread_mutex_destroy(&spider_thread_id_mutex);
pthread_mutex_destroy(&spider_tbl_mutex);
#ifndef WITHOUT_SPIDER_BG_SEARCH
@@ -6315,7 +6871,7 @@ int spider_panic(
int spider_db_init(
void *p
) {
- int error_num = 0, roop_count;
+ int error_num = HA_ERR_OUT_OF_MEM, roop_count;
uint dbton_id = 0;
handlerton *spider_hton = (handlerton *)p;
DBUG_ENTER("spider_db_init");
@@ -6323,6 +6879,9 @@ int spider_db_init(
spider_hton->state = SHOW_OPTION_YES;
spider_hton->flags = HTON_NO_FLAGS;
+#ifdef HTON_CAN_READ_CONNECT_STRING_IN_PARTITION
+ spider_hton->flags |= HTON_CAN_READ_CONNECT_STRING_IN_PARTITION;
+#endif
/* spider_hton->db_type = DB_TYPE_SPIDER; */
/*
spider_hton->savepoint_offset;
@@ -6352,6 +6911,9 @@ int spider_db_init(
spider_hton->create = spider_create_handler;
spider_hton->drop_database = spider_drop_database;
spider_hton->show_status = spider_show_status;
+#ifdef SPIDER_HAS_GROUP_BY_HANDLER
+ spider_hton->create_group_by = spider_create_group_by_handler;
+#endif
memset(&spider_alloc_func_name, 0, sizeof(spider_alloc_func_name));
memset(&spider_alloc_file_name, 0, sizeof(spider_alloc_file_name));
@@ -6363,6 +6925,10 @@ int spider_db_init(
#ifdef _WIN32
HMODULE current_module = GetModuleHandle(NULL);
+#ifndef SPIDER_HAS_NEXT_THREAD_ID
+ spd_db_att_thread_id = (ulong *)
+ GetProcAddress(current_module, "?thread_id@@3KA");
+#endif
#ifdef SPIDER_XID_USES_xid_cache_iterate
#else
#ifdef XID_CACHE_IS_SPLITTED
@@ -6374,7 +6940,7 @@ int spider_db_init(
"?LOCK_xid_cache@@3PAUst_mysql_mutex@@A"));
spd_db_att_xid_cache = *((HASH **)
GetProcAddress(current_module, "?xid_cache@@3PAUst_hash@@A"));
-#elif MYSQL_VERSION_ID < 100103
+#else
spd_db_att_LOCK_xid_cache = (pthread_mutex_t *)
#if MYSQL_VERSION_ID < 50500
GetProcAddress(current_module,
@@ -6395,14 +6961,23 @@ int spider_db_init(
GetProcAddress(current_module, "my_defaults_file");
spd_abort_loop = (bool volatile *)
GetProcAddress(current_module, "?abort_loop@@3_NC");
+ spd_tz_system = *(Time_zone **)
+#ifdef _WIN64
+ GetProcAddress(current_module, "?my_tz_SYSTEM@@3PEAVTime_zone@@EA");
#else
+ GetProcAddress(current_module, "?my_tz_SYSTEM@@3PAVTime_zone@@A");
+#endif
+#else
+#ifndef SPIDER_HAS_NEXT_THREAD_ID
+ spd_db_att_thread_id = &thread_id;
+#endif
#ifdef SPIDER_XID_USES_xid_cache_iterate
#else
#ifdef XID_CACHE_IS_SPLITTED
spd_db_att_xid_cache_split_num = &opt_xid_cache_split_num;
spd_db_att_LOCK_xid_cache = LOCK_xid_cache;
spd_db_att_xid_cache = xid_cache;
-#elif MYSQL_VERSION_ID < 100103
+#else
spd_db_att_LOCK_xid_cache = &LOCK_xid_cache;
spd_db_att_xid_cache = &xid_cache;
#endif
@@ -6411,6 +6986,7 @@ int spider_db_init(
spd_defaults_extra_file = &my_defaults_extra_file;
spd_defaults_file = &my_defaults_file;
spd_abort_loop = &abort_loop;
+ spd_tz_system = my_tz_SYSTEM;
#endif
#ifdef HAVE_PSI_INTERFACE
@@ -6419,16 +6995,10 @@ int spider_db_init(
#ifndef WITHOUT_SPIDER_BG_SEARCH
if (pthread_attr_init(&spider_pt_attr))
- {
- error_num = HA_ERR_OUT_OF_MEM;
goto error_pt_attr_init;
- }
/*
if (pthread_attr_setdetachstate(&spider_pt_attr, PTHREAD_CREATE_DETACHED))
- {
- error_num = HA_ERR_OUT_OF_MEM;
goto error_pt_attr_setstate;
- }
*/
#endif
@@ -6438,40 +7008,37 @@ int spider_db_init(
if (mysql_mutex_init(spd_key_mutex_tbl,
&spider_tbl_mutex, MY_MUTEX_INIT_FAST))
#endif
- {
- error_num = HA_ERR_OUT_OF_MEM;
goto error_tbl_mutex_init;
- }
#if MYSQL_VERSION_ID < 50500
if (pthread_mutex_init(&spider_thread_id_mutex, MY_MUTEX_INIT_FAST))
#else
if (mysql_mutex_init(spd_key_thread_id,
&spider_thread_id_mutex, MY_MUTEX_INIT_FAST))
#endif
- {
- error_num = HA_ERR_OUT_OF_MEM;
goto error_thread_id_mutex_init;
- }
#if MYSQL_VERSION_ID < 50500
if (pthread_mutex_init(&spider_conn_id_mutex, MY_MUTEX_INIT_FAST))
#else
if (mysql_mutex_init(spd_key_conn_id,
&spider_conn_id_mutex, MY_MUTEX_INIT_FAST))
#endif
- {
- error_num = HA_ERR_OUT_OF_MEM;
goto error_conn_id_mutex_init;
- }
+#if MYSQL_VERSION_ID < 50500
+ if (pthread_mutex_init(&spider_ipport_conn_mutex, MY_MUTEX_INIT_FAST))
+#else
+ if (mysql_mutex_init(spd_key_mutex_ipport_count,
+ &spider_ipport_conn_mutex, MY_MUTEX_INIT_FAST))
+#endif
+ goto error_ipport_count_mutex_init;
+
#if MYSQL_VERSION_ID < 50500
if (pthread_mutex_init(&spider_init_error_tbl_mutex, MY_MUTEX_INIT_FAST))
#else
if (mysql_mutex_init(spd_key_mutex_init_error_tbl,
&spider_init_error_tbl_mutex, MY_MUTEX_INIT_FAST))
#endif
- {
- error_num = HA_ERR_OUT_OF_MEM;
goto error_init_error_tbl_mutex_init;
- }
+
#ifdef WITH_PARTITION_STORAGE_ENGINE
#if MYSQL_VERSION_ID < 50500
if (pthread_mutex_init(&spider_pt_share_mutex, MY_MUTEX_INIT_FAST))
@@ -6479,10 +7046,8 @@ int spider_db_init(
if (mysql_mutex_init(spd_key_mutex_pt_share,
&spider_pt_share_mutex, MY_MUTEX_INIT_FAST))
#endif
- {
- error_num = HA_ERR_OUT_OF_MEM;
goto error_pt_share_mutex_init;
- }
+
#endif
#if MYSQL_VERSION_ID < 50500
if (pthread_mutex_init(&spider_lgtm_tblhnd_share_mutex, MY_MUTEX_INIT_FAST))
@@ -6490,30 +7055,24 @@ int spider_db_init(
if (mysql_mutex_init(spd_key_mutex_lgtm_tblhnd_share,
&spider_lgtm_tblhnd_share_mutex, MY_MUTEX_INIT_FAST))
#endif
- {
- error_num = HA_ERR_OUT_OF_MEM;
goto error_lgtm_tblhnd_share_mutex_init;
- }
+
#if MYSQL_VERSION_ID < 50500
if (pthread_mutex_init(&spider_conn_mutex, MY_MUTEX_INIT_FAST))
#else
if (mysql_mutex_init(spd_key_mutex_conn,
&spider_conn_mutex, MY_MUTEX_INIT_FAST))
#endif
- {
- error_num = HA_ERR_OUT_OF_MEM;
goto error_conn_mutex_init;
- }
+
#if MYSQL_VERSION_ID < 50500
if (pthread_mutex_init(&spider_open_conn_mutex, MY_MUTEX_INIT_FAST))
#else
if (mysql_mutex_init(spd_key_mutex_open_conn,
&spider_open_conn_mutex, MY_MUTEX_INIT_FAST))
#endif
- {
- error_num = HA_ERR_OUT_OF_MEM;
goto error_open_conn_mutex_init;
- }
+
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
#if MYSQL_VERSION_ID < 50500
if (pthread_mutex_init(&spider_hs_r_conn_mutex, MY_MUTEX_INIT_FAST))
@@ -6521,20 +7080,16 @@ int spider_db_init(
if (mysql_mutex_init(spd_key_mutex_hs_r_conn,
&spider_hs_r_conn_mutex, MY_MUTEX_INIT_FAST))
#endif
- {
- error_num = HA_ERR_OUT_OF_MEM;
goto error_hs_r_conn_mutex_init;
- }
+
#if MYSQL_VERSION_ID < 50500
if (pthread_mutex_init(&spider_hs_w_conn_mutex, MY_MUTEX_INIT_FAST))
#else
if (mysql_mutex_init(spd_key_mutex_hs_w_conn,
&spider_hs_w_conn_mutex, MY_MUTEX_INIT_FAST))
#endif
- {
- error_num = HA_ERR_OUT_OF_MEM;
goto error_hs_w_conn_mutex_init;
- }
+
#endif
#if MYSQL_VERSION_ID < 50500
if (pthread_mutex_init(&spider_allocated_thds_mutex, MY_MUTEX_INIT_FAST))
@@ -6542,20 +7097,15 @@ int spider_db_init(
if (mysql_mutex_init(spd_key_mutex_allocated_thds,
&spider_allocated_thds_mutex, MY_MUTEX_INIT_FAST))
#endif
- {
- error_num = HA_ERR_OUT_OF_MEM;
goto error_allocated_thds_mutex_init;
- }
+
#if MYSQL_VERSION_ID < 50500
if (pthread_mutex_init(&spider_mon_table_cache_mutex, MY_MUTEX_INIT_FAST))
#else
if (mysql_mutex_init(spd_key_mutex_mon_table_cache,
&spider_mon_table_cache_mutex, MY_MUTEX_INIT_FAST))
#endif
- {
- error_num = HA_ERR_OUT_OF_MEM;
goto error_mon_table_cache_mutex_init;
- }
#if MYSQL_VERSION_ID < 50500
if (pthread_mutex_init(&spider_mem_calc_mutex, MY_MUTEX_INIT_FAST))
@@ -6563,120 +7113,96 @@ int spider_db_init(
if (mysql_mutex_init(spd_key_mutex_mem_calc,
&spider_mem_calc_mutex, MY_MUTEX_INIT_FAST))
#endif
- {
- error_num = HA_ERR_OUT_OF_MEM;
goto error_mem_calc_mutex_init;
- }
- if(
- my_hash_init(&spider_open_tables, spd_charset_utf8_bin, 32, 0, 0,
- (my_hash_get_key) spider_tbl_get_key, 0, 0)
- ) {
- error_num = HA_ERR_OUT_OF_MEM;
+ if (my_hash_init(&spider_open_tables, spd_charset_utf8_bin, 32, 0, 0,
+ (my_hash_get_key) spider_tbl_get_key, 0, 0))
goto error_open_tables_hash_init;
- }
+
spider_alloc_calc_mem_init(spider_open_tables, 143);
spider_alloc_calc_mem(NULL,
spider_open_tables,
spider_open_tables.array.max_element *
spider_open_tables.array.size_of_element);
- if(
- my_hash_init(&spider_init_error_tables, spd_charset_utf8_bin, 32, 0, 0,
- (my_hash_get_key) spider_tbl_get_key, 0, 0)
- ) {
- error_num = HA_ERR_OUT_OF_MEM;
+ if (my_hash_init(&spider_init_error_tables, spd_charset_utf8_bin, 32, 0, 0,
+ (my_hash_get_key) spider_tbl_get_key, 0, 0))
goto error_init_error_tables_hash_init;
- }
+
spider_alloc_calc_mem_init(spider_init_error_tables, 144);
spider_alloc_calc_mem(NULL,
spider_init_error_tables,
spider_init_error_tables.array.max_element *
spider_init_error_tables.array.size_of_element);
#ifdef WITH_PARTITION_STORAGE_ENGINE
- if(
- my_hash_init(&spider_open_pt_share, spd_charset_utf8_bin, 32, 0, 0,
- (my_hash_get_key) spider_pt_share_get_key, 0, 0)
- ) {
- error_num = HA_ERR_OUT_OF_MEM;
+ if (my_hash_init(&spider_open_pt_share, spd_charset_utf8_bin, 32, 0, 0,
+ (my_hash_get_key) spider_pt_share_get_key, 0, 0))
goto error_open_pt_share_hash_init;
- }
+
spider_alloc_calc_mem_init(spider_open_pt_share, 145);
spider_alloc_calc_mem(NULL,
spider_open_pt_share,
spider_open_pt_share.array.max_element *
spider_open_pt_share.array.size_of_element);
#endif
- if(
- my_hash_init(&spider_lgtm_tblhnd_share_hash, spd_charset_utf8_bin,
- 32, 0, 0,
- (my_hash_get_key) spider_lgtm_tblhnd_share_hash_get_key, 0, 0)
- ) {
- error_num = HA_ERR_OUT_OF_MEM;
+ if (my_hash_init(&spider_lgtm_tblhnd_share_hash, spd_charset_utf8_bin,
+ 32, 0, 0,
+ (my_hash_get_key) spider_lgtm_tblhnd_share_hash_get_key,
+ 0, 0))
goto error_lgtm_tblhnd_share_hash_init;
- }
+
spider_alloc_calc_mem_init(spider_lgtm_tblhnd_share_hash, 245);
spider_alloc_calc_mem(NULL,
spider_lgtm_tblhnd_share_hash,
spider_lgtm_tblhnd_share_hash.array.max_element *
spider_lgtm_tblhnd_share_hash.array.size_of_element);
- if(
- my_hash_init(&spider_open_connections, spd_charset_utf8_bin, 32, 0, 0,
- (my_hash_get_key) spider_conn_get_key, 0, 0)
- ) {
- error_num = HA_ERR_OUT_OF_MEM;
+ if (my_hash_init(&spider_open_connections, spd_charset_utf8_bin, 32, 0, 0,
+ (my_hash_get_key) spider_conn_get_key, 0, 0))
goto error_open_connections_hash_init;
- }
+
+ if (my_hash_init(&spider_ipport_conns, spd_charset_utf8_bin, 32, 0, 0,
+ (my_hash_get_key) spider_ipport_conn_get_key,
+ spider_free_ipport_conn, 0))
+ goto error_ipport_conn__hash_init;
+
spider_alloc_calc_mem_init(spider_open_connections, 146);
spider_alloc_calc_mem(NULL,
spider_open_connections,
spider_open_connections.array.max_element *
spider_open_connections.array.size_of_element);
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if(
- my_hash_init(&spider_hs_r_conn_hash, spd_charset_utf8_bin, 32, 0, 0,
- (my_hash_get_key) spider_conn_get_key, 0, 0)
- ) {
- error_num = HA_ERR_OUT_OF_MEM;
+ if (my_hash_init(&spider_hs_r_conn_hash, spd_charset_utf8_bin, 32, 0, 0,
+ (my_hash_get_key) spider_conn_get_key, 0, 0))
goto error_hs_r_conn_hash_init;
- }
+
spider_alloc_calc_mem_init(spider_hs_r_conn_hash, 147);
spider_alloc_calc_mem(NULL,
spider_hs_r_conn_hash,
spider_hs_r_conn_hash.array.max_element *
spider_hs_r_conn_hash.array.size_of_element);
- if(
- my_hash_init(&spider_hs_w_conn_hash, spd_charset_utf8_bin, 32, 0, 0,
- (my_hash_get_key) spider_conn_get_key, 0, 0)
- ) {
- error_num = HA_ERR_OUT_OF_MEM;
+ if (my_hash_init(&spider_hs_w_conn_hash, spd_charset_utf8_bin, 32, 0, 0,
+ (my_hash_get_key) spider_conn_get_key, 0, 0))
goto error_hs_w_conn_hash_init;
- }
+
spider_alloc_calc_mem_init(spider_hs_w_conn_hash, 148);
spider_alloc_calc_mem(NULL,
spider_hs_w_conn_hash,
spider_hs_w_conn_hash.array.max_element *
spider_hs_w_conn_hash.array.size_of_element);
#endif
- if(
- my_hash_init(&spider_allocated_thds, spd_charset_utf8_bin, 32, 0, 0,
- (my_hash_get_key) spider_allocated_thds_get_key, 0, 0)
- ) {
- error_num = HA_ERR_OUT_OF_MEM;
+ if (my_hash_init(&spider_allocated_thds, spd_charset_utf8_bin, 32, 0, 0,
+ (my_hash_get_key) spider_allocated_thds_get_key, 0, 0))
goto error_allocated_thds_hash_init;
- }
+
spider_alloc_calc_mem_init(spider_allocated_thds, 149);
spider_alloc_calc_mem(NULL,
spider_allocated_thds,
spider_allocated_thds.array.max_element *
spider_allocated_thds.array.size_of_element);
- if(
- SPD_INIT_DYNAMIC_ARRAY2(&spider_mon_table_cache, sizeof(SPIDER_MON_KEY),
- NULL, 64, 64, MYF(MY_WME))
- ) {
- error_num = HA_ERR_OUT_OF_MEM;
+ if (SPD_INIT_DYNAMIC_ARRAY2(&spider_mon_table_cache, sizeof(SPIDER_MON_KEY),
+ NULL, 64, 64, MYF(MY_WME)))
goto error_mon_table_cache_array_init;
- }
+
spider_alloc_calc_mem_init(spider_mon_table_cache, 165);
spider_alloc_calc_mem(NULL,
spider_mon_table_cache,
@@ -6706,10 +7232,7 @@ int spider_db_init(
if (mysql_mutex_init(spd_key_mutex_udf_table_mon,
&spider_udf_table_mon_mutexes[roop_count], MY_MUTEX_INIT_FAST))
#endif
- {
- error_num = HA_ERR_OUT_OF_MEM;
goto error_init_udf_table_mon_mutex;
- }
}
for (roop_count = 0;
roop_count < (int) spider_param_udf_table_mon_mutex_count();
@@ -6721,10 +7244,7 @@ int spider_db_init(
if (mysql_cond_init(spd_key_cond_udf_table_mon,
&spider_udf_table_mon_conds[roop_count], NULL))
#endif
- {
- error_num = HA_ERR_OUT_OF_MEM;
goto error_init_udf_table_mon_cond;
- }
}
for (roop_count = 0;
roop_count < (int) spider_param_udf_table_mon_mutex_count();
@@ -6733,10 +7253,8 @@ int spider_db_init(
if (my_hash_init(&spider_udf_table_mon_list_hash[roop_count],
spd_charset_utf8_bin, 32, 0, 0,
(my_hash_get_key) spider_udf_tbl_mon_list_key, 0, 0))
- {
- error_num = HA_ERR_OUT_OF_MEM;
goto error_init_udf_table_mon_list_hash;
- }
+
spider_alloc_calc_mem_init(spider_udf_table_mon_list_hash, 150);
spider_alloc_calc_mem(NULL,
spider_udf_table_mon_list_hash,
@@ -6744,16 +7262,54 @@ int spider_db_init(
spider_udf_table_mon_list_hash[roop_count].array.size_of_element);
}
+#ifndef WITHOUT_SPIDER_BG_SEARCH
+ if (!(spider_table_sts_threads = (SPIDER_THREAD *)
+ spider_bulk_malloc(NULL, 256, MYF(MY_WME | MY_ZEROFILL),
+ &spider_table_sts_threads, sizeof(SPIDER_THREAD) *
+ spider_param_table_sts_thread_count(),
+ &spider_table_crd_threads, sizeof(SPIDER_THREAD) *
+ spider_param_table_crd_thread_count(),
+ NullS))
+ )
+ goto error_alloc_mon_mutxes;
+
+ for (roop_count = 0;
+ roop_count < (int) spider_param_table_sts_thread_count();
+ roop_count++)
+ {
+ if ((error_num = spider_create_sts_threads(&spider_table_sts_threads[roop_count])))
+ {
+ goto error_init_table_sts_threads;
+ }
+ }
+ for (roop_count = 0;
+ roop_count < (int) spider_param_table_crd_thread_count();
+ roop_count++)
+ {
+ if ((error_num = spider_create_crd_threads(&spider_table_crd_threads[roop_count])))
+ {
+ goto error_init_table_crd_threads;
+ }
+ }
+#endif
+
spider_dbton_mysql.dbton_id = dbton_id;
+ spider_dbton_mysql.db_util->dbton_id = dbton_id;
spider_dbton[dbton_id] = spider_dbton_mysql;
++dbton_id;
+ spider_dbton_mariadb.dbton_id = dbton_id;
+ spider_dbton_mariadb.db_util->dbton_id = dbton_id;
+ spider_dbton[dbton_id] = spider_dbton_mariadb;
+ ++dbton_id;
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
spider_dbton_handlersocket.dbton_id = dbton_id;
+ spider_dbton_handlersocket.db_util->dbton_id = dbton_id;
spider_dbton[dbton_id] = spider_dbton_handlersocket;
++dbton_id;
#endif
#ifdef HAVE_ORACLE_OCI
spider_dbton_oracle.dbton_id = dbton_id;
+ spider_dbton_oracle.db_util->dbton_id = dbton_id;
spider_dbton[dbton_id] = spider_dbton_oracle;
++dbton_id;
#endif
@@ -6779,6 +7335,19 @@ error_init_dbton:
spider_dbton[roop_count].deinit();
}
}
+ roop_count = spider_param_table_crd_thread_count() - 1;
+error_init_table_crd_threads:
+ for (; roop_count >= 0; roop_count--)
+ {
+ spider_free_crd_threads(&spider_table_crd_threads[roop_count]);
+ }
+ roop_count = spider_param_table_sts_thread_count() - 1;
+error_init_table_sts_threads:
+ for (; roop_count >= 0; roop_count--)
+ {
+ spider_free_sts_threads(&spider_table_sts_threads[roop_count]);
+ }
+ spider_free(NULL, spider_table_sts_threads, MYF(0));
roop_count = spider_param_udf_table_mon_mutex_count() - 1;
#endif
error_init_udf_table_mon_list_hash:
@@ -6812,6 +7381,8 @@ error_mon_table_cache_array_init:
spider_allocated_thds.array.size_of_element);
my_hash_free(&spider_allocated_thds);
error_allocated_thds_hash_init:
+ my_hash_free(&spider_ipport_conns);
+error_ipport_conn__hash_init:
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
spider_free_mem_calc(NULL,
spider_hs_w_conn_hash_id,
@@ -6882,6 +7453,8 @@ error_pt_share_mutex_init:
#endif
pthread_mutex_destroy(&spider_init_error_tbl_mutex);
error_init_error_tbl_mutex_init:
+ pthread_mutex_destroy(&spider_ipport_conn_mutex);
+error_ipport_count_mutex_init:
pthread_mutex_destroy(&spider_conn_id_mutex);
error_conn_id_mutex_init:
pthread_mutex_destroy(&spider_thread_id_mutex);
@@ -6973,10 +7546,13 @@ void spider_get_partition_info(
List_iterator<partition_element> sub_it((*part_elem)->subpartitions);
while ((*sub_elem = sub_it++))
{
- if (create_subpartition_name(tmp_name, sizeof(tmp_name),
- table_share->path.str, (*part_elem)->partition_name,
- (*sub_elem)->partition_name, NORMAL_PART_NAME))
+ if (SPIDER_create_subpartition_name(
+ tmp_name, FN_REFLEN + 1, table_share->path.str,
+ (*part_elem)->partition_name, (*sub_elem)->partition_name,
+ NORMAL_PART_NAME))
+ {
DBUG_VOID_RETURN;
+ }
DBUG_PRINT("info",("spider tmp_name=%s", tmp_name));
if (!memcmp(table_name, tmp_name, table_name_length + 1))
DBUG_VOID_RETURN;
@@ -6992,10 +7568,12 @@ void spider_get_partition_info(
}
}
} else {
- if (create_partition_name(tmp_name, sizeof(tmp_name),
- table_share->path.str, (*part_elem)->partition_name,
- NORMAL_PART_NAME, TRUE))
+ if (SPIDER_create_partition_name(
+ tmp_name, FN_REFLEN + 1, table_share->path.str,
+ (*part_elem)->partition_name, NORMAL_PART_NAME, TRUE))
+ {
DBUG_VOID_RETURN;
+ }
DBUG_PRINT("info",("spider tmp_name=%s", tmp_name));
if (!memcmp(table_name, tmp_name, table_name_length + 1))
DBUG_VOID_RETURN;
@@ -7039,6 +7617,7 @@ int spider_get_sts(
) {
int get_type __attribute__ ((unused));
int error_num = 0;
+ bool need_to_get = TRUE;
DBUG_ENTER("spider_get_sts");
#ifdef WITH_PARTITION_STORAGE_ENGINE
@@ -7077,11 +7656,45 @@ int spider_get_sts(
/* copy */
get_type = 0;
}
- if (get_type == 0)
- spider_copy_sts_to_share(share, share->partition_share);
- else
#endif
- error_num = spider_db_show_table_status(spider, link_idx, sts_mode, flag);
+ if (
+ !share->sts_init &&
+ spider_param_load_sts_at_startup(share->load_sts_at_startup) &&
+ (!share->init || share->init_error)
+ ) {
+ error_num = spider_sys_get_table_sts(
+ current_thd,
+ share->lgtm_tblhnd_share->table_name,
+ share->lgtm_tblhnd_share->table_name_length,
+ &share->data_file_length,
+ &share->max_data_file_length,
+ &share->index_file_length,
+ &share->records,
+ &share->mean_rec_length,
+ &share->check_time,
+ &share->create_time,
+ &share->update_time,
+ FALSE
+ );
+ if (
+ !error_num ||
+ (error_num != HA_ERR_KEY_NOT_FOUND && error_num != HA_ERR_END_OF_FILE)
+ )
+ need_to_get = FALSE;
+ }
+
+ if (need_to_get)
+ {
+#ifdef WITH_PARTITION_STORAGE_ENGINE
+ if (get_type == 0)
+ spider_copy_sts_to_share(share, share->partition_share);
+ else {
+#endif
+ error_num = spider_db_show_table_status(spider, link_idx, sts_mode, flag);
+#ifdef WITH_PARTITION_STORAGE_ENGINE
+ }
+#endif
+ }
#ifdef WITH_PARTITION_STORAGE_ENGINE
if (get_type >= 2)
pthread_mutex_unlock(&share->partition_share->sts_mutex);
@@ -7161,6 +7774,7 @@ int spider_get_crd(
) {
int get_type __attribute__ ((unused));
int error_num = 0;
+ bool need_to_get = TRUE;
DBUG_ENTER("spider_get_crd");
#ifdef WITH_PARTITION_STORAGE_ENGINE
@@ -7199,12 +7813,39 @@ int spider_get_crd(
/* copy */
get_type = 0;
}
- if (get_type == 0)
- spider_copy_crd_to_share(share, share->partition_share,
- table->s->fields);
- else
#endif
- error_num = spider_db_show_index(spider, link_idx, table, crd_mode);
+ if (
+ !share->crd_init &&
+ spider_param_load_sts_at_startup(share->load_crd_at_startup)
+ ) {
+ error_num = spider_sys_get_table_crd(
+ current_thd,
+ share->lgtm_tblhnd_share->table_name,
+ share->lgtm_tblhnd_share->table_name_length,
+ share->cardinality,
+ table->s->fields,
+ FALSE
+ );
+ if (
+ !error_num ||
+ (error_num != HA_ERR_KEY_NOT_FOUND && error_num != HA_ERR_END_OF_FILE)
+ )
+ need_to_get = FALSE;
+ }
+
+ if (need_to_get)
+ {
+#ifdef WITH_PARTITION_STORAGE_ENGINE
+ if (get_type == 0)
+ spider_copy_crd_to_share(share, share->partition_share,
+ table->s->fields);
+ else {
+#endif
+ error_num = spider_db_show_index(spider, link_idx, table, crd_mode);
+#ifdef WITH_PARTITION_STORAGE_ENGINE
+ }
+#endif
+ }
#ifdef WITH_PARTITION_STORAGE_ENGINE
if (get_type >= 2)
pthread_mutex_unlock(&share->partition_share->crd_mutex);
@@ -7300,6 +7941,8 @@ void spider_set_result_list_param(
spider_param_quick_mode(thd, share->quick_mode);
result_list->quick_page_size =
spider_param_quick_page_size(thd, share->quick_page_size);
+ result_list->quick_page_byte =
+ spider_param_quick_page_byte(thd, share->quick_page_byte);
result_list->low_mem_read =
spider_param_low_mem_read(thd, share->low_mem_read);
DBUG_VOID_RETURN;
@@ -7562,35 +8205,37 @@ void spider_set_tmp_share_pointer(
tmp_share->tgt_default_groups = &tmp_connect_info[14];
tmp_share->tgt_pk_names = &tmp_connect_info[15];
tmp_share->tgt_sequence_names = &tmp_connect_info[16];
+ tmp_share->static_link_ids = &tmp_connect_info[17];
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- tmp_share->hs_read_socks = &tmp_connect_info[17];
- tmp_share->hs_write_socks = &tmp_connect_info[18];
+ tmp_share->hs_read_socks = &tmp_connect_info[18];
+ tmp_share->hs_write_socks = &tmp_connect_info[19];
#endif
tmp_share->tgt_ports = &tmp_long[0];
tmp_share->tgt_ssl_vscs = &tmp_long[1];
tmp_share->link_statuses = &tmp_long[2];
- tmp_share->monitoring_flag = &tmp_long[3];
- tmp_share->monitoring_kind = &tmp_long[4];
+ tmp_share->monitoring_binlog_pos_at_failing = &tmp_long[3];
+ tmp_share->monitoring_flag = &tmp_long[4];
+ tmp_share->monitoring_kind = &tmp_long[5];
#ifndef WITHOUT_SPIDER_BG_SEARCH
- tmp_share->monitoring_bg_flag = &tmp_long[5];
- tmp_share->monitoring_bg_kind = &tmp_long[6];
+ tmp_share->monitoring_bg_flag = &tmp_long[6];
+ tmp_share->monitoring_bg_kind = &tmp_long[7];
#endif
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- tmp_share->use_hs_reads = &tmp_long[7];
- tmp_share->use_hs_writes = &tmp_long[8];
- tmp_share->hs_read_ports = &tmp_long[9];
- tmp_share->hs_write_ports = &tmp_long[10];
- tmp_share->hs_write_to_reads = &tmp_long[11];
-#endif
- tmp_share->use_handlers = &tmp_long[12];
- tmp_share->connect_timeouts = &tmp_long[13];
+ tmp_share->use_hs_reads = &tmp_long[8];
+ tmp_share->use_hs_writes = &tmp_long[9];
+ tmp_share->hs_read_ports = &tmp_long[10];
+ tmp_share->hs_write_ports = &tmp_long[11];
+ tmp_share->hs_write_to_reads = &tmp_long[12];
+#endif
+ tmp_share->use_handlers = &tmp_long[13];
+ tmp_share->connect_timeouts = &tmp_long[14];
tmp_long[13] = -1;
- tmp_share->net_read_timeouts = &tmp_long[14];
+ tmp_share->net_read_timeouts = &tmp_long[15];
tmp_long[14] = -1;
- tmp_share->net_write_timeouts = &tmp_long[15];
+ tmp_share->net_write_timeouts = &tmp_long[16];
tmp_long[15] = -1;
- tmp_share->access_balances = &tmp_long[16];
- tmp_share->bka_table_name_types = &tmp_long[17];
+ tmp_share->access_balances = &tmp_long[17];
+ tmp_share->bka_table_name_types = &tmp_long[18];
tmp_share->monitoring_limit = &tmp_longlong[0];
tmp_share->monitoring_sid = &tmp_longlong[1];
#ifndef WITHOUT_SPIDER_BG_SEARCH
@@ -7613,9 +8258,10 @@ void spider_set_tmp_share_pointer(
tmp_share->tgt_default_groups_lengths = &tmp_connect_info_length[14];
tmp_share->tgt_pk_names_lengths = &tmp_connect_info_length[15];
tmp_share->tgt_sequence_names_lengths = &tmp_connect_info_length[16];
+ tmp_share->static_link_ids_lengths = &tmp_connect_info_length[17];
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- tmp_share->hs_read_socks_lengths = &tmp_connect_info_length[17];
- tmp_share->hs_write_socks_lengths = &tmp_connect_info_length[18];
+ tmp_share->hs_read_socks_lengths = &tmp_connect_info_length[18];
+ tmp_share->hs_write_socks_lengths = &tmp_connect_info_length[19];
#endif
tmp_share->server_names_length = 1;
tmp_share->tgt_table_names_length = 1;
@@ -7634,9 +8280,11 @@ void spider_set_tmp_share_pointer(
tmp_share->tgt_default_groups_length = 1;
tmp_share->tgt_pk_names_length = 1;
tmp_share->tgt_sequence_names_length = 1;
+ tmp_share->static_link_ids_length = 1;
tmp_share->tgt_ports_length = 1;
tmp_share->tgt_ssl_vscs_length = 1;
tmp_share->link_statuses_length = 1;
+ tmp_share->monitoring_binlog_pos_at_failing_length = 1;
tmp_share->monitoring_flag_length = 1;
tmp_share->monitoring_kind_length = 1;
#ifndef WITHOUT_SPIDER_BG_SEARCH
@@ -7668,6 +8316,7 @@ void spider_set_tmp_share_pointer(
tmp_share->monitoring_bg_flag[0] = -1;
tmp_share->monitoring_bg_kind[0] = -1;
#endif
+ tmp_share->monitoring_binlog_pos_at_failing[0] = -1;
tmp_share->monitoring_flag[0] = -1;
tmp_share->monitoring_kind[0] = -1;
#ifndef WITHOUT_SPIDER_BG_SEARCH
@@ -7767,6 +8416,19 @@ TABLE_LIST *spider_get_parent_table_list(
DBUG_RETURN(NULL);
}
+List<Index_hint> *spider_get_index_hints(
+ ha_spider *spider
+ ) {
+ TABLE_LIST *table_list = spider_get_parent_table_list(spider);
+ DBUG_ENTER("spider_get_index_hint");
+ if (table_list)
+ {
+ DBUG_RETURN(table_list->index_hints);
+ }
+ DBUG_RETURN(NULL);
+}
+
+
st_select_lex *spider_get_select_lex(
ha_spider *spider
) {
@@ -7779,6 +8441,24 @@ st_select_lex *spider_get_select_lex(
DBUG_RETURN(NULL);
}
+void spider_get_select_limit_from_select_lex(
+ st_select_lex *select_lex,
+ longlong *select_limit,
+ longlong *offset_limit
+) {
+ DBUG_ENTER("spider_get_select_limit_from_select_lex");
+ *select_limit = 9223372036854775807LL;
+ *offset_limit = 0;
+ if (select_lex && select_lex->explicit_limit)
+ {
+ *select_limit = select_lex->select_limit ?
+ select_lex->select_limit->val_int() : 0;
+ *offset_limit = select_lex->offset_limit ?
+ select_lex->offset_limit->val_int() : 0;
+ }
+ DBUG_VOID_RETURN;
+}
+
void spider_get_select_limit(
ha_spider *spider,
st_select_lex **select_lex,
@@ -7787,15 +8467,8 @@ void spider_get_select_limit(
) {
DBUG_ENTER("spider_get_select_limit");
*select_lex = spider_get_select_lex(spider);
- *select_limit = 9223372036854775807LL;
- *offset_limit = 0;
- if (*select_lex && (*select_lex)->explicit_limit)
- {
- *select_limit = (*select_lex)->select_limit ?
- (*select_lex)->select_limit->val_int() : 0;
- *offset_limit = (*select_lex)->offset_limit ?
- (*select_lex)->offset_limit->val_int() : 0;
- }
+ spider_get_select_limit_from_select_lex(
+ *select_lex, select_limit, offset_limit);
DBUG_VOID_RETURN;
}
@@ -7840,6 +8513,16 @@ longlong spider_split_read_param(
DBUG_PRINT("info",("spider bulk_update_mode=%d", bulk_update_mode));
DBUG_PRINT("info",("spider support_bulk_update_sql=%s",
spider->support_bulk_update_sql() ? "TRUE" : "FALSE"));
+#ifdef SPIDER_HAS_GROUP_BY_HANDLER
+ bool inserting =
+ (
+#ifdef HS_HAS_SQLCOM
+ spider->sql_command == SQLCOM_HS_INSERT ||
+#endif
+ spider->sql_command == SQLCOM_INSERT ||
+ spider->sql_command == SQLCOM_INSERT_SELECT
+ );
+#endif
bool updating =
(
#ifdef HS_HAS_SQLCOM
@@ -7866,6 +8549,12 @@ longlong spider_split_read_param(
DBUG_PRINT("info",("spider replacing=%s", replacing ? "TRUE" : "FALSE"));
TABLE *table = spider->get_table();
if (
+#ifdef SPIDER_HAS_GROUP_BY_HANDLER
+ (
+ inserting &&
+ spider->use_fields
+ ) ||
+#endif
replacing ||
(
(
@@ -8223,6 +8912,110 @@ bool spider_check_direct_order_limit(
DBUG_RETURN(FALSE);
}
+int spider_set_direct_limit_offset(
+ ha_spider *spider
+) {
+#ifndef SPIDER_ENGINE_CONDITION_PUSHDOWN_IS_ALWAYS_ON
+ THD *thd = spider->trx->thd;
+#endif
+ st_select_lex *select_lex;
+ longlong select_limit;
+ longlong offset_limit;
+ TABLE_LIST *table_list;
+ DBUG_ENTER("spider_set_direct_limit_offset");
+
+ if (spider->result_list.direct_limit_offset)
+ DBUG_RETURN(TRUE);
+
+ if (
+ spider->pt_handler_share_creator &&
+ spider->pt_handler_share_creator != spider
+ ) {
+ if (spider->pt_handler_share_creator->result_list.direct_limit_offset == TRUE)
+ {
+ spider->result_list.direct_limit_offset = TRUE;
+ DBUG_RETURN(TRUE);
+ } else {
+ DBUG_RETURN(FALSE);
+ }
+ }
+
+ if (
+ spider->sql_command != SQLCOM_SELECT ||
+#ifdef HANDLER_HAS_DIRECT_AGGREGATE
+ spider->result_list.direct_aggregate ||
+#endif
+ spider->result_list.direct_order_limit ||
+ spider->prev_index_rnd_init != SPD_RND // must be RND_INIT and not be INDEX_INIT
+ )
+ DBUG_RETURN(FALSE);
+
+ spider_get_select_limit(spider, &select_lex, &select_limit, &offset_limit);
+
+ // limit and offset is non-zero
+ if (!(select_limit && offset_limit))
+ DBUG_RETURN(FALSE);
+
+ // more than one table
+ if (
+ !select_lex ||
+ select_lex->table_list.elements != 1
+ )
+ DBUG_RETURN(FALSE);
+
+ table_list = (TABLE_LIST *) select_lex->table_list.first;
+ if (table_list->table->file->partition_ht() != spider_hton_ptr)
+ {
+ DBUG_PRINT("info",("spider ht1=%u ht2=%u",
+ table_list->table->file->partition_ht()->slot,
+ spider_hton_ptr->slot
+ ));
+ DBUG_RETURN(FALSE);
+ }
+
+ // contain where
+ if (
+#if MYSQL_VERSION_ID < 50500
+ !thd->variables.engine_condition_pushdown ||
+#else
+#ifdef SPIDER_ENGINE_CONDITION_PUSHDOWN_IS_ALWAYS_ON
+#else
+ !(thd->variables.optimizer_switch &
+ OPTIMIZER_SWITCH_ENGINE_CONDITION_PUSHDOWN) ||
+#endif
+#endif
+ spider->condition // conditions is null may be no where condition in rand_init
+ )
+ DBUG_RETURN(FALSE);
+
+ // ignore condition like 1=1
+#ifdef SPIDER_has_Item_with_subquery
+ if (select_lex->where && select_lex->where->with_subquery())
+#else
+ if (select_lex->where && select_lex->where->with_subselect)
+#endif
+ DBUG_RETURN(FALSE);
+
+ if (
+ select_lex->group_list.elements ||
+ select_lex->with_sum_func ||
+ select_lex->having ||
+ select_lex->order_list.elements
+ )
+ DBUG_RETURN(FALSE);
+
+ // must not be derived table
+ if (SPIDER_get_linkage(select_lex) == DERIVED_TABLE_TYPE)
+ DBUG_RETURN(FALSE);
+
+ spider->direct_select_offset = offset_limit;
+ spider->direct_current_offset = offset_limit;
+ spider->direct_select_limit = select_limit;
+ spider->result_list.direct_limit_offset = TRUE;
+ DBUG_RETURN(TRUE);
+}
+
+
bool spider_check_index_merge(
TABLE *table,
st_select_lex *select_lex
@@ -8381,7 +9174,7 @@ int spider_discover_table_structure(
TABLE_SHARE *share,
HA_CREATE_INFO *info
) {
- int error_num = HA_ERR_WRONG_COMMAND;
+ int error_num = HA_ERR_WRONG_COMMAND, dummy;
SPIDER_SHARE *spider_share;
const char *table_name = share->path.str;
uint table_name_length = (uint) strlen(table_name);
@@ -8389,6 +9182,8 @@ int spider_discover_table_structure(
#ifdef WITH_PARTITION_STORAGE_ENGINE
partition_info *part_info = thd->work_part_info;
#endif
+ Open_tables_backup open_tables_backup;
+ TABLE *table_tables;
uint str_len __attribute__ ((unused));
char buf[MAX_FIELD_WIDTH];
spider_string str(buf, sizeof(buf), system_charset_info);
@@ -8444,15 +9239,25 @@ int spider_discover_table_structure(
if (!error_num)
{
- Open_tables_backup open_tables_backup;
- TABLE *table_tables;
if (
(table_tables = spider_open_sys_table(
thd, SPIDER_SYS_TABLES_TABLE_NAME_STR,
SPIDER_SYS_TABLES_TABLE_NAME_LEN, TRUE, &open_tables_backup, FALSE,
&error_num))
) {
- error_num = spider_insert_tables(table_tables, spider_share);
+#ifdef SPIDER_SUPPORT_CREATE_OR_REPLACE_TABLE
+ if (thd->lex->create_info.or_replace())
+ {
+ error_num = spider_delete_tables(table_tables,
+ spider_share->table_name, &dummy);
+ }
+ if (!error_num)
+ {
+#endif
+ error_num = spider_insert_tables(table_tables, spider_share);
+#ifdef SPIDER_SUPPORT_CREATE_OR_REPLACE_TABLE
+ }
+#endif
spider_close_sys_table(thd, table_tables,
&open_tables_backup, FALSE);
}
@@ -8463,6 +9268,7 @@ int spider_discover_table_structure(
} else {
char tmp_name[FN_REFLEN + 1];
List_iterator<partition_element> part_it(part_info->partitions);
+ List_iterator<partition_element> part_it2(part_info->partitions);
partition_element *part_elem, *sub_elem;
while ((part_elem = part_it++))
{
@@ -8472,19 +9278,22 @@ int spider_discover_table_structure(
while ((sub_elem = sub_it++))
{
str.length(str_len);
- if (create_subpartition_name(tmp_name, sizeof(tmp_name), table_name,
- (part_elem)->partition_name, (sub_elem)->partition_name,
- NORMAL_PART_NAME))
- DBUG_RETURN(1);
+ if ((error_num = SPIDER_create_subpartition_name(
+ tmp_name, FN_REFLEN + 1, table_name,
+ (part_elem)->partition_name, (sub_elem)->partition_name,
+ NORMAL_PART_NAME)))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
DBUG_PRINT("info",("spider tmp_name=%s", tmp_name));
- if (!(spider_share = spider_create_share(table_name, share,
+ if (!(spider_share = spider_create_share(tmp_name, share,
part_info,
#ifdef SPIDER_HAS_HASH_VALUE_TYPE
hash_value,
#endif
&error_num
))) {
- continue;
+ DBUG_RETURN(error_num);
}
error_num = spider_discover_table_structure_internal(
@@ -8498,18 +9307,21 @@ int spider_discover_table_structure(
break;
} else {
str.length(str_len);
- if (create_partition_name(tmp_name, sizeof(tmp_name), table_name,
- (part_elem)->partition_name, NORMAL_PART_NAME, TRUE))
- DBUG_RETURN(1);
+ if ((error_num = SPIDER_create_partition_name(
+ tmp_name, FN_REFLEN + 1, table_name,
+ (part_elem)->partition_name, NORMAL_PART_NAME, TRUE)))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
DBUG_PRINT("info",("spider tmp_name=%s", tmp_name));
- if (!(spider_share = spider_create_share(table_name, share,
+ if (!(spider_share = spider_create_share(tmp_name, share,
part_info,
#ifdef SPIDER_HAS_HASH_VALUE_TYPE
hash_value,
#endif
&error_num
))) {
- continue;
+ DBUG_RETURN(error_num);
}
error_num = spider_discover_table_structure_internal(
@@ -8520,6 +9332,101 @@ int spider_discover_table_structure(
break;
}
}
+ if (!error_num)
+ {
+ if (
+ !(table_tables = spider_open_sys_table(
+ thd, SPIDER_SYS_TABLES_TABLE_NAME_STR,
+ SPIDER_SYS_TABLES_TABLE_NAME_LEN, TRUE, &open_tables_backup, FALSE,
+ &error_num))
+ ) {
+ DBUG_RETURN(error_num);
+ }
+ while ((part_elem = part_it2++))
+ {
+ if ((part_elem)->subpartitions.elements)
+ {
+ List_iterator<partition_element> sub_it((part_elem)->subpartitions);
+ while ((sub_elem = sub_it++))
+ {
+ if ((error_num = SPIDER_create_subpartition_name(
+ tmp_name, FN_REFLEN + 1, table_name,
+ (part_elem)->partition_name, (sub_elem)->partition_name,
+ NORMAL_PART_NAME)))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ DBUG_PRINT("info",("spider tmp_name=%s", tmp_name));
+ if (!(spider_share = spider_create_share(tmp_name, share,
+ part_info,
+#ifdef SPIDER_HAS_HASH_VALUE_TYPE
+ hash_value,
+#endif
+ &error_num
+ ))) {
+ DBUG_RETURN(error_num);
+ }
+
+#ifdef SPIDER_SUPPORT_CREATE_OR_REPLACE_TABLE
+ if (thd->lex->create_info.or_replace())
+ {
+ error_num = spider_delete_tables(table_tables,
+ spider_share->table_name, &dummy);
+ }
+ if (!error_num)
+ {
+#endif
+ error_num = spider_insert_tables(table_tables, spider_share);
+#ifdef SPIDER_SUPPORT_CREATE_OR_REPLACE_TABLE
+ }
+#endif
+
+ spider_free_share_resource_only(spider_share);
+ if (error_num)
+ break;
+ }
+ if (error_num)
+ break;
+ } else {
+ if ((error_num = SPIDER_create_partition_name(
+ tmp_name, FN_REFLEN + 1, table_name,
+ (part_elem)->partition_name, NORMAL_PART_NAME, TRUE)))
+ {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ DBUG_PRINT("info",("spider tmp_name=%s", tmp_name));
+ if (!(spider_share = spider_create_share(tmp_name, share,
+ part_info,
+#ifdef SPIDER_HAS_HASH_VALUE_TYPE
+ hash_value,
+#endif
+ &error_num
+ ))) {
+ DBUG_RETURN(error_num);
+ }
+
+#ifdef SPIDER_SUPPORT_CREATE_OR_REPLACE_TABLE
+ if (thd->lex->create_info.or_replace())
+ {
+ error_num = spider_delete_tables(table_tables,
+ spider_share->table_name, &dummy);
+ }
+ if (!error_num)
+ {
+#endif
+ error_num = spider_insert_tables(table_tables, spider_share);
+#ifdef SPIDER_SUPPORT_CREATE_OR_REPLACE_TABLE
+ }
+#endif
+
+ spider_free_share_resource_only(spider_share);
+ if (error_num)
+ break;
+ }
+ }
+ spider_close_sys_table(thd, table_tables,
+ &open_tables_backup, FALSE);
+ }
}
#endif
@@ -8540,7 +9447,8 @@ int spider_discover_table_structure(
uint collatelen = strlen(table_charset->name);
if (str.reserve(SPIDER_SQL_CLOSE_PAREN_LEN + SPIDER_SQL_DEFAULT_CHARSET_LEN +
csnamelen + SPIDER_SQL_COLLATE_LEN + collatelen +
- SPIDER_SQL_CONNECTION_LEN + SPIDER_SQL_VALUE_QUOTE_LEN
+ SPIDER_SQL_CONNECTION_LEN + SPIDER_SQL_VALUE_QUOTE_LEN +
+ (share->comment.length * 2)
)) {
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
@@ -8553,7 +9461,8 @@ int spider_discover_table_structure(
str.q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
str.append_escape_string(share->comment.str, share->comment.length);
if (str.reserve(SPIDER_SQL_CONNECTION_LEN +
- (SPIDER_SQL_VALUE_QUOTE_LEN * 2)))
+ (SPIDER_SQL_VALUE_QUOTE_LEN * 2) +
+ (share->connect_string.length * 2)))
{
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
@@ -8591,13 +9500,8 @@ int spider_discover_table_structure(
{
DBUG_RETURN(ER_SPIDER_UNKNOWN_NUM);
}
-#ifdef SPIDER_HAS_DISCOVER_TABLE_STRUCTURE_COMMENT
- if (!(part_syntax = generate_partition_syntax(thd, part_info, &part_syntax_len,
- TRUE, info, NULL)))
-#else
- if (!(part_syntax = generate_partition_syntax(part_info, &part_syntax_len,
- FALSE, TRUE, info, NULL)))
-#endif
+ if (!(part_syntax = SPIDER_generate_partition_syntax(thd, part_info,
+ &part_syntax_len, FALSE, TRUE, info, NULL, NULL)))
{
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
@@ -8606,6 +9510,7 @@ int spider_discover_table_structure(
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
str.q_append(part_syntax, part_syntax_len);
+ SPIDER_free_part_syntax(part_syntax, MYF(0));
}
#endif
DBUG_PRINT("info",("spider str=%s", str.c_ptr_safe()));
@@ -8615,3 +9520,784 @@ int spider_discover_table_structure(
DBUG_RETURN(error_num);
}
#endif
+
+#ifndef WITHOUT_SPIDER_BG_SEARCH
+int spider_create_spider_object_for_share(
+ SPIDER_TRX *trx,
+ SPIDER_SHARE *share,
+ ha_spider **spider
+) {
+ int error_num, roop_count, *need_mons;
+ SPIDER_CONN **conns;
+ uint *conn_link_idx;
+ uchar *conn_can_fo;
+ char **conn_keys;
+#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
+ char **hs_r_conn_keys;
+ char **hs_w_conn_keys;
+#endif
+ spider_db_handler **dbton_hdl;
+ DBUG_ENTER("spider_create_spider_object_for_share");
+ DBUG_PRINT("info",("spider trx=%p", trx));
+ DBUG_PRINT("info",("spider share=%p", share));
+ DBUG_PRINT("info",("spider spider_ptr=%p", spider));
+ DBUG_PRINT("info",("spider spider=%p", (*spider)));
+
+ if (*spider)
+ {
+ /* already exists */
+ DBUG_RETURN(0);
+ }
+ (*spider) = new (&share->mem_root) ha_spider();
+ if (!(*spider))
+ {
+ error_num = HA_ERR_OUT_OF_MEM;
+ goto error_spider_alloc;
+ }
+ DBUG_PRINT("info",("spider spider=%p", (*spider)));
+#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
+ if (!(need_mons = (int *)
+ spider_bulk_malloc(spider_current_trx, 255, MYF(MY_WME | MY_ZEROFILL),
+ &need_mons, (sizeof(int) * share->link_count),
+ &conns, (sizeof(SPIDER_CONN *) * share->link_count),
+ &conn_link_idx, (sizeof(uint) * share->link_count),
+ &conn_can_fo, (sizeof(uchar) * share->link_bitmap_size),
+ &conn_keys, (sizeof(char *) * share->link_count),
+ &hs_r_conn_keys, (sizeof(char *) * share->link_count),
+ &hs_w_conn_keys, (sizeof(char *) * share->link_count),
+ &dbton_hdl, (sizeof(spider_db_handler *) * SPIDER_DBTON_SIZE),
+ NullS))
+ )
+#else
+ if (!(need_mons = (int *)
+ spider_bulk_malloc(spider_current_trx, 255, MYF(MY_WME | MY_ZEROFILL),
+ &need_mons, (sizeof(int) * share->link_count),
+ &conns, (sizeof(SPIDER_CONN *) * share->link_count),
+ &conn_link_idx, (sizeof(uint) * share->link_count),
+ &conn_can_fo, (sizeof(uchar) * share->link_bitmap_size),
+ &conn_keys, (sizeof(char *) * share->link_count),
+ &dbton_hdl, (sizeof(spider_db_handler *) * SPIDER_DBTON_SIZE),
+ NullS))
+ )
+#endif
+ {
+ error_num = HA_ERR_OUT_OF_MEM;
+ goto error_need_mons_alloc;
+ }
+ DBUG_PRINT("info",("spider need_mons=%p", need_mons));
+ (*spider)->trx = trx;
+ (*spider)->change_table_ptr(&share->table, share->table_share);
+ (*spider)->share = share;
+ (*spider)->conns = conns;
+ (*spider)->conn_link_idx = conn_link_idx;
+ (*spider)->conn_can_fo = conn_can_fo;
+ (*spider)->need_mons = need_mons;
+ (*spider)->conn_keys_first_ptr = share->conn_keys[0];
+ (*spider)->conn_keys = conn_keys;
+#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
+ (*spider)->hs_r_conn_keys = hs_r_conn_keys;
+ (*spider)->hs_w_conn_keys = hs_w_conn_keys;
+#endif
+ (*spider)->dbton_handler = dbton_hdl;
+ (*spider)->search_link_idx = -1;
+ for (roop_count = 0; roop_count < SPIDER_DBTON_SIZE; roop_count++)
+ {
+ if (
+ spider_bit_is_set(share->dbton_bitmap, roop_count) &&
+ spider_dbton[roop_count].create_db_handler
+ ) {
+ if (!(dbton_hdl[roop_count] = spider_dbton[roop_count].create_db_handler(
+ *spider, share->dbton_share[roop_count])))
+ {
+ error_num = HA_ERR_OUT_OF_MEM;
+ goto error_init_db_handler;
+ }
+ if ((error_num = dbton_hdl[roop_count]->init()))
+ goto error_init_db_handler;
+ }
+ }
+ DBUG_PRINT("info",("spider share=%p", (*spider)->share));
+ DBUG_PRINT("info",("spider need_mons=%p", (*spider)->need_mons));
+ DBUG_RETURN(0);
+
+error_init_db_handler:
+ for (; roop_count >= 0; --roop_count)
+ {
+ if (
+ spider_bit_is_set(share->dbton_bitmap, roop_count) &&
+ dbton_hdl[roop_count]
+ ) {
+ delete dbton_hdl[roop_count];
+ dbton_hdl[roop_count] = NULL;
+ }
+ }
+ spider_free(spider_current_trx, (*spider)->need_mons, MYF(0));
+error_need_mons_alloc:
+ delete (*spider);
+ (*spider) = NULL;
+error_spider_alloc:
+ DBUG_RETURN(error_num);
+}
+
+void spider_free_spider_object_for_share(
+ ha_spider **spider
+) {
+ int roop_count;
+ SPIDER_SHARE *share = (*spider)->share;
+ spider_db_handler **dbton_hdl = (*spider)->dbton_handler;
+ DBUG_ENTER("spider_free_spider_object_for_share");
+ DBUG_PRINT("info",("spider share=%p", share));
+ DBUG_PRINT("info",("spider spider_ptr=%p", spider));
+ DBUG_PRINT("info",("spider spider=%p", (*spider)));
+ for (roop_count = SPIDER_DBTON_SIZE - 1; roop_count >= 0; --roop_count)
+ {
+ if (
+ spider_bit_is_set(share->dbton_bitmap, roop_count) &&
+ dbton_hdl[roop_count]
+ ) {
+ delete dbton_hdl[roop_count];
+ dbton_hdl[roop_count] = NULL;
+ }
+ }
+ spider_free(spider_current_trx, (*spider)->need_mons, MYF(0));
+ delete (*spider);
+ (*spider) = NULL;
+ DBUG_VOID_RETURN;
+}
+
+int spider_create_sts_threads(
+ SPIDER_THREAD *spider_thread
+) {
+ int error_num;
+ DBUG_ENTER("spider_create_sts_threads");
+#if MYSQL_VERSION_ID < 50500
+ if (pthread_mutex_init(&spider_thread->mutex,
+ MY_MUTEX_INIT_FAST))
+#else
+ if (mysql_mutex_init(spd_key_mutex_bg_stss,
+ &spider_thread->mutex, MY_MUTEX_INIT_FAST))
+#endif
+ {
+ error_num = HA_ERR_OUT_OF_MEM;
+ goto error_mutex_init;
+ }
+#if MYSQL_VERSION_ID < 50500
+ if (pthread_cond_init(&spider_thread->cond, NULL))
+#else
+ if (mysql_cond_init(spd_key_cond_bg_stss,
+ &spider_thread->cond, NULL))
+#endif
+ {
+ error_num = HA_ERR_OUT_OF_MEM;
+ goto error_cond_init;
+ }
+#if MYSQL_VERSION_ID < 50500
+ if (pthread_cond_init(&spider_thread->sync_cond, NULL))
+#else
+ if (mysql_cond_init(spd_key_cond_bg_sts_syncs,
+ &spider_thread->sync_cond, NULL))
+#endif
+ {
+ error_num = HA_ERR_OUT_OF_MEM;
+ goto error_sync_cond_init;
+ }
+#if MYSQL_VERSION_ID < 50500
+ if (pthread_create(&spider_thread->thread, &spider_pt_attr,
+ spider_table_bg_sts_action, (void *) spider_thread)
+ )
+#else
+ if (mysql_thread_create(spd_key_thd_bg_stss, &spider_thread->thread,
+ &spider_pt_attr, spider_table_bg_sts_action, (void *) spider_thread)
+ )
+#endif
+ {
+ error_num = HA_ERR_OUT_OF_MEM;
+ goto error_thread_create;
+ }
+ DBUG_RETURN(0);
+
+error_thread_create:
+ pthread_cond_destroy(&spider_thread->sync_cond);
+error_sync_cond_init:
+ pthread_cond_destroy(&spider_thread->cond);
+error_cond_init:
+ pthread_mutex_destroy(&spider_thread->mutex);
+error_mutex_init:
+ DBUG_RETURN(error_num);
+}
+
+void spider_free_sts_threads(
+ SPIDER_THREAD *spider_thread
+) {
+ bool thread_killed;
+ DBUG_ENTER("spider_free_sts_threads");
+ pthread_mutex_lock(&spider_thread->mutex);
+ thread_killed = spider_thread->killed;
+ spider_thread->killed = TRUE;
+ if (!thread_killed)
+ {
+ if (spider_thread->thd_wait)
+ {
+ pthread_cond_signal(&spider_thread->cond);
+ }
+ pthread_cond_wait(&spider_thread->sync_cond, &spider_thread->mutex);
+ }
+ pthread_mutex_unlock(&spider_thread->mutex);
+ pthread_join(spider_thread->thread, NULL);
+ pthread_cond_destroy(&spider_thread->sync_cond);
+ pthread_cond_destroy(&spider_thread->cond);
+ pthread_mutex_destroy(&spider_thread->mutex);
+ spider_thread->thd_wait = FALSE;
+ spider_thread->killed = FALSE;
+ DBUG_VOID_RETURN;
+}
+
+int spider_create_crd_threads(
+ SPIDER_THREAD *spider_thread
+) {
+ int error_num;
+ DBUG_ENTER("spider_create_crd_threads");
+#if MYSQL_VERSION_ID < 50500
+ if (pthread_mutex_init(&spider_thread->mutex,
+ MY_MUTEX_INIT_FAST))
+#else
+ if (mysql_mutex_init(spd_key_mutex_bg_crds,
+ &spider_thread->mutex, MY_MUTEX_INIT_FAST))
+#endif
+ {
+ error_num = HA_ERR_OUT_OF_MEM;
+ goto error_mutex_init;
+ }
+#if MYSQL_VERSION_ID < 50500
+ if (pthread_cond_init(&spider_thread->cond, NULL))
+#else
+ if (mysql_cond_init(spd_key_cond_bg_crds,
+ &spider_thread->cond, NULL))
+#endif
+ {
+ error_num = HA_ERR_OUT_OF_MEM;
+ goto error_cond_init;
+ }
+#if MYSQL_VERSION_ID < 50500
+ if (pthread_cond_init(&spider_thread->sync_cond, NULL))
+#else
+ if (mysql_cond_init(spd_key_cond_bg_crd_syncs,
+ &spider_thread->sync_cond, NULL))
+#endif
+ {
+ error_num = HA_ERR_OUT_OF_MEM;
+ goto error_sync_cond_init;
+ }
+#if MYSQL_VERSION_ID < 50500
+ if (pthread_create(&spider_thread->thread, &spider_pt_attr,
+ spider_table_bg_crd_action, (void *) spider_thread)
+ )
+#else
+ if (mysql_thread_create(spd_key_thd_bg_crds, &spider_thread->thread,
+ &spider_pt_attr, spider_table_bg_crd_action, (void *) spider_thread)
+ )
+#endif
+ {
+ error_num = HA_ERR_OUT_OF_MEM;
+ goto error_thread_create;
+ }
+ DBUG_RETURN(0);
+
+error_thread_create:
+ pthread_cond_destroy(&spider_thread->sync_cond);
+error_sync_cond_init:
+ pthread_cond_destroy(&spider_thread->cond);
+error_cond_init:
+ pthread_mutex_destroy(&spider_thread->mutex);
+error_mutex_init:
+ DBUG_RETURN(error_num);
+}
+
+void spider_free_crd_threads(
+ SPIDER_THREAD *spider_thread
+) {
+ bool thread_killed;
+ DBUG_ENTER("spider_free_crd_threads");
+ pthread_mutex_lock(&spider_thread->mutex);
+ thread_killed = spider_thread->killed;
+ spider_thread->killed = TRUE;
+ if (!thread_killed)
+ {
+ if (spider_thread->thd_wait)
+ {
+ pthread_cond_signal(&spider_thread->cond);
+ }
+ pthread_cond_wait(&spider_thread->sync_cond, &spider_thread->mutex);
+ }
+ pthread_mutex_unlock(&spider_thread->mutex);
+ pthread_join(spider_thread->thread, NULL);
+ pthread_cond_destroy(&spider_thread->sync_cond);
+ pthread_cond_destroy(&spider_thread->cond);
+ pthread_mutex_destroy(&spider_thread->mutex);
+ spider_thread->thd_wait = FALSE;
+ spider_thread->killed = FALSE;
+ DBUG_VOID_RETURN;
+}
+
+void *spider_table_bg_sts_action(
+ void *arg
+) {
+ SPIDER_THREAD *thread = (SPIDER_THREAD *) arg;
+ SPIDER_SHARE *share;
+ SPIDER_TRX *trx;
+ int error_num;
+ ha_spider *spider;
+ SPIDER_CONN **conns;
+ THD *thd;
+ my_thread_init();
+ DBUG_ENTER("spider_table_bg_sts_action");
+ /* init start */
+ pthread_mutex_lock(&thread->mutex);
+ if (!(thd = spider_create_sys_thd(thread)))
+ {
+ thread->thd_wait = FALSE;
+ thread->killed = FALSE;
+ pthread_mutex_unlock(&thread->mutex);
+ my_thread_end();
+ DBUG_RETURN(NULL);
+ }
+ SPIDER_set_next_thread_id(thd);
+#ifdef HAVE_PSI_INTERFACE
+ mysql_thread_set_psi_id(thd->thread_id);
+#endif
+ thd_proc_info(thd, "Spider table background statistics action handler");
+ if (!(trx = spider_get_trx(NULL, FALSE, &error_num)))
+ {
+ spider_destroy_sys_thd(thd);
+ thread->thd_wait = FALSE;
+ thread->killed = FALSE;
+ pthread_mutex_unlock(&thread->mutex);
+#if !defined(MYSQL_DYNAMIC_PLUGIN) || !defined(_WIN32)
+ my_pthread_setspecific_ptr(THR_THD, NULL);
+#endif
+ my_thread_end();
+ DBUG_RETURN(NULL);
+ }
+ trx->thd = thd;
+ /* init end */
+
+ while (TRUE)
+ {
+ DBUG_PRINT("info",("spider bg sts loop start"));
+ if (thread->killed)
+ {
+ DBUG_PRINT("info",("spider bg sts kill start"));
+ trx->thd = NULL;
+ spider_free_trx(trx, TRUE);
+ spider_destroy_sys_thd(thd);
+ pthread_cond_signal(&thread->sync_cond);
+ pthread_mutex_unlock(&thread->mutex);
+#if !defined(MYSQL_DYNAMIC_PLUGIN) || !defined(_WIN32)
+ my_pthread_setspecific_ptr(THR_THD, NULL);
+#endif
+ my_thread_end();
+ DBUG_RETURN(NULL);
+ }
+ if (!thread->queue_first)
+ {
+ DBUG_PRINT("info",("spider bg sts has no job"));
+ thread->thd_wait = TRUE;
+ pthread_cond_wait(&thread->cond, &thread->mutex);
+ thread->thd_wait = FALSE;
+ if (thd->killed)
+ thread->killed = TRUE;
+ continue;
+ }
+ share = (SPIDER_SHARE *) thread->queue_first;
+ share->sts_working = TRUE;
+ pthread_mutex_unlock(&thread->mutex);
+
+ spider = share->sts_spider;
+ conns = spider->conns;
+ if (spider->search_link_idx < 0)
+ {
+ spider->trx = trx;
+ spider_trx_set_link_idx_for_all(spider);
+ spider->search_link_idx = spider_conn_first_link_idx(thd,
+ share->link_statuses, share->access_balances, spider->conn_link_idx,
+ share->link_count, SPIDER_LINK_STATUS_OK);
+ }
+ if (spider->search_link_idx >= 0)
+ {
+ DBUG_PRINT("info",
+ ("spider difftime=%f",
+ difftime(share->bg_sts_try_time, share->sts_get_time)));
+ DBUG_PRINT("info",
+ ("spider bg_sts_interval=%f", share->bg_sts_interval));
+ if (difftime(share->bg_sts_try_time, share->sts_get_time) >=
+ share->bg_sts_interval)
+ {
+ if (!conns[spider->search_link_idx])
+ {
+ spider_get_conn(share, spider->search_link_idx,
+ share->conn_keys[spider->search_link_idx],
+ trx, spider, FALSE, FALSE, SPIDER_CONN_KIND_MYSQL,
+ &error_num);
+ if (conns[spider->search_link_idx])
+ {
+ conns[spider->search_link_idx]->error_mode = 0;
+ } else {
+ spider->search_link_idx = -1;
+ }
+ }
+ DBUG_PRINT("info",
+ ("spider search_link_idx=%d", spider->search_link_idx));
+ if (spider->search_link_idx >= 0 && conns[spider->search_link_idx])
+ {
+#ifdef WITH_PARTITION_STORAGE_ENGINE
+ if (spider_get_sts(share, spider->search_link_idx,
+ share->bg_sts_try_time, spider,
+ share->bg_sts_interval, share->bg_sts_mode,
+ share->bg_sts_sync,
+ 2, HA_STATUS_CONST | HA_STATUS_VARIABLE))
+#else
+ if (spider_get_sts(share, spider->search_link_idx,
+ share->bg_sts_try_time, spider,
+ share->bg_sts_interval, share->bg_sts_mode,
+ 2, HA_STATUS_CONST | HA_STATUS_VARIABLE))
+#endif
+ {
+ spider->search_link_idx = -1;
+ }
+ }
+ }
+ }
+ memset(spider->need_mons, 0, sizeof(int) * share->link_count);
+ pthread_mutex_lock(&thread->mutex);
+ if (thread->queue_first == thread->queue_last)
+ {
+ thread->queue_first = NULL;
+ thread->queue_last = NULL;
+ } else {
+ thread->queue_first = share->sts_next;
+ share->sts_next->sts_prev = NULL;
+ share->sts_next = NULL;
+ }
+ share->sts_working = FALSE;
+ share->sts_wait = FALSE;
+ if (thread->first_free_wait)
+ {
+ pthread_cond_signal(&thread->sync_cond);
+ pthread_cond_wait(&thread->cond, &thread->mutex);
+ if (thd->killed)
+ thread->killed = TRUE;
+ }
+ }
+}
+
+void *spider_table_bg_crd_action(
+ void *arg
+) {
+ SPIDER_THREAD *thread = (SPIDER_THREAD *) arg;
+ SPIDER_SHARE *share;
+ SPIDER_TRX *trx;
+ int error_num;
+ ha_spider *spider;
+ TABLE *table;
+ SPIDER_CONN **conns;
+ THD *thd;
+ my_thread_init();
+ DBUG_ENTER("spider_table_bg_crd_action");
+ /* init start */
+ pthread_mutex_lock(&thread->mutex);
+ if (!(thd = spider_create_sys_thd(thread)))
+ {
+ thread->thd_wait = FALSE;
+ thread->killed = FALSE;
+ pthread_mutex_unlock(&thread->mutex);
+ my_thread_end();
+ DBUG_RETURN(NULL);
+ }
+ SPIDER_set_next_thread_id(thd);
+#ifdef HAVE_PSI_INTERFACE
+ mysql_thread_set_psi_id(thd->thread_id);
+#endif
+ thd_proc_info(thd, "Spider table background cardinality action handler");
+ if (!(trx = spider_get_trx(NULL, FALSE, &error_num)))
+ {
+ spider_destroy_sys_thd(thd);
+ thread->thd_wait = FALSE;
+ thread->killed = FALSE;
+ pthread_mutex_unlock(&thread->mutex);
+#if !defined(MYSQL_DYNAMIC_PLUGIN) || !defined(_WIN32)
+ my_pthread_setspecific_ptr(THR_THD, NULL);
+#endif
+ my_thread_end();
+ DBUG_RETURN(NULL);
+ }
+ trx->thd = thd;
+ /* init end */
+
+ while (TRUE)
+ {
+ DBUG_PRINT("info",("spider bg crd loop start"));
+ if (thread->killed)
+ {
+ DBUG_PRINT("info",("spider bg crd kill start"));
+ trx->thd = NULL;
+ spider_free_trx(trx, TRUE);
+ spider_destroy_sys_thd(thd);
+ pthread_cond_signal(&thread->sync_cond);
+ pthread_mutex_unlock(&thread->mutex);
+#if !defined(MYSQL_DYNAMIC_PLUGIN) || !defined(_WIN32)
+ my_pthread_setspecific_ptr(THR_THD, NULL);
+#endif
+ my_thread_end();
+ DBUG_RETURN(NULL);
+ }
+ if (!thread->queue_first)
+ {
+ DBUG_PRINT("info",("spider bg crd has no job"));
+ thread->thd_wait = TRUE;
+ pthread_cond_wait(&thread->cond, &thread->mutex);
+ thread->thd_wait = FALSE;
+ if (thd->killed)
+ thread->killed = TRUE;
+ continue;
+ }
+ share = (SPIDER_SHARE *) thread->queue_first;
+ share->crd_working = TRUE;
+ pthread_mutex_unlock(&thread->mutex);
+
+ table = &share->table;
+ spider = share->crd_spider;
+ conns = spider->conns;
+ if (spider->search_link_idx < 0)
+ {
+ spider->trx = trx;
+ spider_trx_set_link_idx_for_all(spider);
+ spider->search_link_idx = spider_conn_first_link_idx(thd,
+ share->link_statuses, share->access_balances, spider->conn_link_idx,
+ share->link_count, SPIDER_LINK_STATUS_OK);
+ }
+ if (spider->search_link_idx >= 0)
+ {
+ DBUG_PRINT("info",
+ ("spider difftime=%f",
+ difftime(share->bg_crd_try_time, share->crd_get_time)));
+ DBUG_PRINT("info",
+ ("spider bg_crd_interval=%f", share->bg_crd_interval));
+ if (difftime(share->bg_crd_try_time, share->crd_get_time) >=
+ share->bg_crd_interval)
+ {
+ if (!conns[spider->search_link_idx])
+ {
+ spider_get_conn(share, spider->search_link_idx,
+ share->conn_keys[spider->search_link_idx],
+ trx, spider, FALSE, FALSE, SPIDER_CONN_KIND_MYSQL,
+ &error_num);
+ if (conns[spider->search_link_idx])
+ {
+ conns[spider->search_link_idx]->error_mode = 0;
+ } else {
+ spider->search_link_idx = -1;
+ }
+ }
+ DBUG_PRINT("info",
+ ("spider search_link_idx=%d", spider->search_link_idx));
+ if (spider->search_link_idx >= 0 && conns[spider->search_link_idx])
+ {
+#ifdef WITH_PARTITION_STORAGE_ENGINE
+ if (spider_get_crd(share, spider->search_link_idx,
+ share->bg_crd_try_time, spider, table,
+ share->bg_crd_interval, share->bg_crd_mode,
+ share->bg_crd_sync,
+ 2))
+#else
+ if (spider_get_crd(share, spider->search_link_idx,
+ share->bg_crd_try_time, spider, table,
+ share->bg_crd_interval, share->bg_crd_mode,
+ 2))
+#endif
+ {
+ spider->search_link_idx = -1;
+ }
+ }
+ }
+ }
+ memset(spider->need_mons, 0, sizeof(int) * share->link_count);
+ pthread_mutex_lock(&thread->mutex);
+ if (thread->queue_first == thread->queue_last)
+ {
+ thread->queue_first = NULL;
+ thread->queue_last = NULL;
+ } else {
+ thread->queue_first = share->crd_next;
+ share->crd_next->crd_prev = NULL;
+ share->crd_next = NULL;
+ }
+ share->crd_working = FALSE;
+ share->crd_wait = FALSE;
+ if (thread->first_free_wait)
+ {
+ pthread_cond_signal(&thread->sync_cond);
+ pthread_cond_wait(&thread->cond, &thread->mutex);
+ if (thd->killed)
+ thread->killed = TRUE;
+ }
+ }
+}
+
+void spider_table_add_share_to_sts_thread(
+ SPIDER_SHARE *share
+) {
+ SPIDER_THREAD *spider_thread = share->sts_thread;
+ DBUG_ENTER("spider_table_add_share_to_sts_thread");
+ if (
+ !share->sts_wait &&
+ !pthread_mutex_trylock(&spider_thread->mutex)
+ ) {
+ if (!share->sts_wait)
+ {
+ if (spider_thread->queue_last)
+ {
+ DBUG_PRINT("info",("spider add to last"));
+ share->sts_prev = spider_thread->queue_last;
+ spider_thread->queue_last->sts_next = share;
+ } else {
+ spider_thread->queue_first = share;
+ }
+ spider_thread->queue_last = share;
+ share->sts_wait = TRUE;
+
+ if (spider_thread->thd_wait)
+ {
+ pthread_cond_signal(&spider_thread->cond);
+ }
+ }
+ pthread_mutex_unlock(&spider_thread->mutex);
+ }
+ DBUG_VOID_RETURN;
+}
+
+void spider_table_add_share_to_crd_thread(
+ SPIDER_SHARE *share
+) {
+ SPIDER_THREAD *spider_thread = share->crd_thread;
+ DBUG_ENTER("spider_table_add_share_to_crd_thread");
+ if (
+ !share->crd_wait &&
+ !pthread_mutex_trylock(&spider_thread->mutex)
+ ) {
+ if (!share->crd_wait)
+ {
+ if (spider_thread->queue_last)
+ {
+ DBUG_PRINT("info",("spider add to last"));
+ share->crd_prev = spider_thread->queue_last;
+ spider_thread->queue_last->crd_next = share;
+ } else {
+ spider_thread->queue_first = share;
+ }
+ spider_thread->queue_last = share;
+ share->crd_wait = TRUE;
+
+ if (spider_thread->thd_wait)
+ {
+ pthread_cond_signal(&spider_thread->cond);
+ }
+ }
+ pthread_mutex_unlock(&spider_thread->mutex);
+ }
+ DBUG_VOID_RETURN;
+}
+
+void spider_table_remove_share_from_sts_thread(
+ SPIDER_SHARE *share
+) {
+ SPIDER_THREAD *spider_thread = share->sts_thread;
+ DBUG_ENTER("spider_table_remove_share_from_sts_thread");
+ if (share->sts_wait)
+ {
+ pthread_mutex_lock(&spider_thread->mutex);
+ if (share->sts_wait)
+ {
+ if (share->sts_working)
+ {
+ DBUG_PRINT("info",("spider waiting bg sts start"));
+ spider_thread->first_free_wait = TRUE;
+ pthread_cond_wait(&spider_thread->sync_cond, &spider_thread->mutex);
+ spider_thread->first_free_wait = FALSE;
+ pthread_cond_signal(&spider_thread->cond);
+ DBUG_PRINT("info",("spider waiting bg sts end"));
+ }
+
+ if (share->sts_prev)
+ {
+ if (share->sts_next)
+ {
+ DBUG_PRINT("info",("spider remove middle one"));
+ share->sts_prev->sts_next = share->sts_next;
+ share->sts_next->sts_prev = share->sts_prev;
+ } else {
+ DBUG_PRINT("info",("spider remove last one"));
+ share->sts_prev->sts_next = NULL;
+ spider_thread->queue_last = share->sts_prev;
+ }
+ } else if (share->sts_next) {
+ DBUG_PRINT("info",("spider remove first one"));
+ share->sts_next->sts_prev = NULL;
+ spider_thread->queue_first = share->sts_next;
+ } else {
+ DBUG_PRINT("info",("spider empty"));
+ spider_thread->queue_first = NULL;
+ spider_thread->queue_last = NULL;
+ }
+ }
+ pthread_mutex_unlock(&spider_thread->mutex);
+ }
+ DBUG_VOID_RETURN;
+}
+
+void spider_table_remove_share_from_crd_thread(
+ SPIDER_SHARE *share
+) {
+ SPIDER_THREAD *spider_thread = share->crd_thread;
+ DBUG_ENTER("spider_table_remove_share_from_crd_thread");
+ if (share->crd_wait)
+ {
+ pthread_mutex_lock(&spider_thread->mutex);
+ if (share->crd_wait)
+ {
+ if (share->crd_working)
+ {
+ DBUG_PRINT("info",("spider waiting bg crd start"));
+ spider_thread->first_free_wait = TRUE;
+ pthread_cond_wait(&spider_thread->sync_cond, &spider_thread->mutex);
+ spider_thread->first_free_wait = FALSE;
+ pthread_cond_signal(&spider_thread->cond);
+ DBUG_PRINT("info",("spider waiting bg crd end"));
+ }
+
+ if (share->crd_prev)
+ {
+ if (share->crd_next)
+ {
+ DBUG_PRINT("info",("spider remove middle one"));
+ share->crd_prev->crd_next = share->crd_next;
+ share->crd_next->crd_prev = share->crd_prev;
+ } else {
+ DBUG_PRINT("info",("spider remove last one"));
+ share->crd_prev->crd_next = NULL;
+ spider_thread->queue_last = share->crd_prev;
+ }
+ } else if (share->crd_next) {
+ DBUG_PRINT("info",("spider remove first one"));
+ share->crd_next->crd_prev = NULL;
+ spider_thread->queue_first = share->crd_next;
+ } else {
+ DBUG_PRINT("info",("spider empty"));
+ spider_thread->queue_first = NULL;
+ spider_thread->queue_last = NULL;
+ }
+ }
+ pthread_mutex_unlock(&spider_thread->mutex);
+ }
+ DBUG_VOID_RETURN;
+}
+#endif
diff --git a/storage/spider/spd_table.h b/storage/spider/spd_table.h
index 19e1fd04769..362ebf263ca 100644
--- a/storage/spider/spd_table.h
+++ b/storage/spider/spd_table.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2008-2014 Kentoku Shiba
+/* Copyright (C) 2008-2017 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
@@ -597,11 +597,20 @@ void spider_free_tmp_dbton_handler(
TABLE_LIST *spider_get_parent_table_list(
ha_spider *spider
);
+List<Index_hint> *spider_get_index_hints(
+ ha_spider *spider
+ );
st_select_lex *spider_get_select_lex(
ha_spider *spider
);
+void spider_get_select_limit_from_select_lex(
+ st_select_lex *select_lex,
+ longlong *select_limit,
+ longlong *offset_limit
+);
+
void spider_get_select_limit(
ha_spider *spider,
st_select_lex **select_lex,
@@ -629,6 +638,10 @@ bool spider_check_direct_order_limit(
ha_spider *spider
);
+int spider_set_direct_limit_offset(
+ ha_spider* spider
+ );
+
bool spider_check_index_merge(
TABLE *table,
st_select_lex *select_lex
@@ -662,3 +675,55 @@ int spider_discover_table_structure(
HA_CREATE_INFO *info
);
#endif
+
+#ifndef WITHOUT_SPIDER_BG_SEARCH
+int spider_create_spider_object_for_share(
+ SPIDER_TRX *trx,
+ SPIDER_SHARE *share,
+ ha_spider **spider
+);
+
+void spider_free_spider_object_for_share(
+ ha_spider **spider
+);
+
+int spider_create_sts_threads(
+ SPIDER_THREAD *spider_thread
+);
+
+void spider_free_sts_threads(
+ SPIDER_THREAD *spider_thread
+);
+
+int spider_create_crd_threads(
+ SPIDER_THREAD *spider_thread
+);
+
+void spider_free_crd_threads(
+ SPIDER_THREAD *spider_thread
+);
+
+void *spider_table_bg_sts_action(
+ void *arg
+);
+
+void *spider_table_bg_crd_action(
+ void *arg
+);
+
+void spider_table_add_share_to_sts_thread(
+ SPIDER_SHARE *share
+);
+
+void spider_table_add_share_to_crd_thread(
+ SPIDER_SHARE *share
+);
+
+void spider_table_remove_share_from_sts_thread(
+ SPIDER_SHARE *share
+);
+
+void spider_table_remove_share_from_crd_thread(
+ SPIDER_SHARE *share
+);
+#endif
diff --git a/storage/spider/spd_trx.cc b/storage/spider/spd_trx.cc
index fb999509b92..bb9f11793cb 100644
--- a/storage/spider/spd_trx.cc
+++ b/storage/spider/spd_trx.cc
@@ -1,4 +1,4 @@
-/* Copyright (C) 2008-2015 Kentoku Shiba
+/* Copyright (C) 2008-2018 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
@@ -14,7 +14,9 @@
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */
#define MYSQL_SERVER 1
+#include <my_global.h>
#include "mysql_version.h"
+#include "spd_environ.h"
#if MYSQL_VERSION_ID < 50500
#include "mysql_priv.h"
#include <mysql/plugin.h>
@@ -251,7 +253,7 @@ int spider_trx_another_lock_tables(
sql_str.init_calc_mem(188);
sql_str.length(0);
memset((void*)&tmp_spider, 0, sizeof(ha_spider));
- memset(&tmp_share, 0, sizeof(SPIDER_SHARE));
+ memset((void*)&tmp_share, 0, sizeof(SPIDER_SHARE));
tmp_spider.share = &tmp_share;
tmp_spider.trx = trx;
tmp_share.access_charset = system_charset_info;
@@ -502,6 +504,7 @@ int spider_create_trx_alter_table(
char **tmp_tgt_ssl_keys;
char **tmp_tgt_default_files;
char **tmp_tgt_default_groups;
+ char **tmp_static_link_ids;
uint *tmp_server_names_lengths;
uint *tmp_tgt_table_names_lengths;
uint *tmp_tgt_dbs_lengths;
@@ -517,8 +520,10 @@ int spider_create_trx_alter_table(
uint *tmp_tgt_ssl_keys_lengths;
uint *tmp_tgt_default_files_lengths;
uint *tmp_tgt_default_groups_lengths;
+ uint *tmp_static_link_ids_lengths;
long *tmp_tgt_ports;
long *tmp_tgt_ssl_vscs;
+ long *tmp_monitoring_binlog_pos_at_failing;
long *tmp_link_statuses;
char *tmp_server_names_char;
char *tmp_tgt_table_names_char;
@@ -535,6 +540,7 @@ int spider_create_trx_alter_table(
char *tmp_tgt_ssl_keys_char;
char *tmp_tgt_default_files_char;
char *tmp_tgt_default_groups_char;
+ char *tmp_static_link_ids_char;
uint old_elements;
DBUG_ENTER("spider_create_trx_alter_table");
@@ -560,6 +566,7 @@ int spider_create_trx_alter_table(
&tmp_tgt_ssl_keys, sizeof(char *) * share->all_link_count,
&tmp_tgt_default_files, sizeof(char *) * share->all_link_count,
&tmp_tgt_default_groups, sizeof(char *) * share->all_link_count,
+ &tmp_static_link_ids, sizeof(char *) * share->all_link_count,
&tmp_server_names_lengths, sizeof(uint) * share->all_link_count,
&tmp_tgt_table_names_lengths, sizeof(uint) * share->all_link_count,
@@ -576,9 +583,12 @@ int spider_create_trx_alter_table(
&tmp_tgt_ssl_keys_lengths, sizeof(uint) * share->all_link_count,
&tmp_tgt_default_files_lengths, sizeof(uint) * share->all_link_count,
&tmp_tgt_default_groups_lengths, sizeof(uint) * share->all_link_count,
+ &tmp_static_link_ids_lengths, sizeof(uint) * share->all_link_count,
&tmp_tgt_ports, sizeof(long) * share->all_link_count,
&tmp_tgt_ssl_vscs, sizeof(long) * share->all_link_count,
+ &tmp_monitoring_binlog_pos_at_failing,
+ sizeof(long) * share->all_link_count,
&tmp_link_statuses, sizeof(long) * share->all_link_count,
&tmp_server_names_char, sizeof(char) *
@@ -611,6 +621,8 @@ int spider_create_trx_alter_table(
(share_alter->tmp_tgt_default_files_charlen + 1),
&tmp_tgt_default_groups_char, sizeof(char) *
(share_alter->tmp_tgt_default_groups_charlen + 1),
+ &tmp_static_link_ids_char, sizeof(char) *
+ (share_alter->tmp_static_link_ids_charlen + 1),
NullS))
) {
error_num = HA_ERR_OUT_OF_MEM;
@@ -644,9 +656,12 @@ int spider_create_trx_alter_table(
alter_table->tmp_tgt_ssl_keys = tmp_tgt_ssl_keys;
alter_table->tmp_tgt_default_files = tmp_tgt_default_files;
alter_table->tmp_tgt_default_groups = tmp_tgt_default_groups;
+ alter_table->tmp_static_link_ids = tmp_static_link_ids;
alter_table->tmp_tgt_ports = tmp_tgt_ports;
alter_table->tmp_tgt_ssl_vscs = tmp_tgt_ssl_vscs;
+ alter_table->tmp_monitoring_binlog_pos_at_failing =
+ tmp_monitoring_binlog_pos_at_failing;
alter_table->tmp_link_statuses = tmp_link_statuses;
alter_table->tmp_server_names_lengths = tmp_server_names_lengths;
@@ -664,6 +679,7 @@ int spider_create_trx_alter_table(
alter_table->tmp_tgt_ssl_keys_lengths = tmp_tgt_ssl_keys_lengths;
alter_table->tmp_tgt_default_files_lengths = tmp_tgt_default_files_lengths;
alter_table->tmp_tgt_default_groups_lengths = tmp_tgt_default_groups_lengths;
+ alter_table->tmp_static_link_ids_lengths = tmp_static_link_ids_lengths;
for(roop_count = 0; roop_count < (int) share->all_link_count; roop_count++)
{
@@ -762,12 +778,25 @@ int spider_create_trx_alter_table(
sizeof(char) * share_alter->tmp_tgt_default_groups_lengths[roop_count]);
tmp_tgt_default_groups_char +=
share_alter->tmp_tgt_default_groups_lengths[roop_count] + 1;
+
+ if (share_alter->tmp_static_link_ids[roop_count])
+ {
+ tmp_static_link_ids[roop_count] = tmp_static_link_ids_char;
+ memcpy(tmp_static_link_ids_char,
+ share_alter->tmp_static_link_ids[roop_count],
+ sizeof(char) * share_alter->tmp_static_link_ids_lengths[roop_count]);
+ tmp_static_link_ids_char +=
+ share_alter->tmp_static_link_ids_lengths[roop_count] + 1;
+ }
}
memcpy(tmp_tgt_ports, share_alter->tmp_tgt_ports,
sizeof(long) * share->all_link_count);
memcpy(tmp_tgt_ssl_vscs, share_alter->tmp_tgt_ssl_vscs,
sizeof(long) * share->all_link_count);
+ memcpy(tmp_monitoring_binlog_pos_at_failing,
+ share_alter->tmp_monitoring_binlog_pos_at_failing,
+ sizeof(long) * share->all_link_count);
memcpy(tmp_link_statuses, share_alter->tmp_link_statuses,
sizeof(long) * share->all_link_count);
@@ -803,6 +832,9 @@ int spider_create_trx_alter_table(
memcpy(tmp_tgt_default_groups_lengths,
share_alter->tmp_tgt_default_groups_lengths,
sizeof(uint) * share->all_link_count);
+ memcpy(tmp_static_link_ids_lengths,
+ share_alter->tmp_static_link_ids_lengths,
+ sizeof(uint) * share->all_link_count);
alter_table->tmp_server_names_length =
share_alter->tmp_server_names_length;
@@ -834,10 +866,14 @@ int spider_create_trx_alter_table(
share_alter->tmp_tgt_default_files_length;
alter_table->tmp_tgt_default_groups_length =
share_alter->tmp_tgt_default_groups_length;
+ alter_table->tmp_static_link_ids_length =
+ share_alter->tmp_static_link_ids_length;
alter_table->tmp_tgt_ports_length =
share_alter->tmp_tgt_ports_length;
alter_table->tmp_tgt_ssl_vscs_length =
share_alter->tmp_tgt_ssl_vscs_length;
+ alter_table->tmp_monitoring_binlog_pos_at_failing_length =
+ share_alter->tmp_monitoring_binlog_pos_at_failing_length;
alter_table->tmp_link_statuses_length =
share_alter->tmp_link_statuses_length;
@@ -1033,9 +1069,21 @@ bool spider_cmp_trx_alter_table(
cmp2->tmp_tgt_default_groups[roop_count])
)
) ||
+ (
+ cmp1->tmp_static_link_ids[roop_count] !=
+ cmp2->tmp_static_link_ids[roop_count] &&
+ (
+ !cmp1->tmp_static_link_ids[roop_count] ||
+ !cmp2->tmp_static_link_ids[roop_count] ||
+ strcmp(cmp1->tmp_static_link_ids[roop_count],
+ cmp2->tmp_static_link_ids[roop_count])
+ )
+ ) ||
cmp1->tmp_tgt_ports[roop_count] != cmp2->tmp_tgt_ports[roop_count] ||
cmp1->tmp_tgt_ssl_vscs[roop_count] !=
cmp2->tmp_tgt_ssl_vscs[roop_count] ||
+ cmp1->tmp_monitoring_binlog_pos_at_failing[roop_count] !=
+ cmp2->tmp_monitoring_binlog_pos_at_failing[roop_count] ||
cmp1->tmp_link_statuses[roop_count] !=
cmp2->tmp_link_statuses[roop_count]
)
@@ -1538,21 +1586,23 @@ int spider_check_and_set_trx_isolation(
SPIDER_CONN *conn,
int *need_mon
) {
+ THD *thd = conn->thd;
int trx_isolation;
DBUG_ENTER("spider_check_and_set_trx_isolation");
-
- trx_isolation = thd_tx_isolation(conn->thd);
- DBUG_PRINT("info",("spider local trx_isolation=%d", trx_isolation));
-/*
- DBUG_PRINT("info",("spider conn->trx_isolation=%d", conn->trx_isolation));
- if (conn->trx_isolation != trx_isolation)
+ if (thd->system_thread == SYSTEM_THREAD_SLAVE_SQL)
{
-*/
- spider_conn_queue_trx_isolation(conn, trx_isolation);
-/*
- conn->trx_isolation = trx_isolation;
+ if ((trx_isolation = spider_param_slave_trx_isolation()) == -1)
+ {
+ trx_isolation = thd_tx_isolation(thd);
+ DBUG_PRINT("info",("spider local trx_isolation=%d", trx_isolation));
+ } else {
+ DBUG_PRINT("info",("spider slave trx_isolation=%d", trx_isolation));
+ }
+ } else {
+ trx_isolation = thd_tx_isolation(thd);
+ DBUG_PRINT("info",("spider local trx_isolation=%d", trx_isolation));
}
-*/
+ spider_conn_queue_trx_isolation(conn, trx_isolation);
DBUG_RETURN(0);
}
@@ -1599,9 +1649,7 @@ int spider_check_and_set_sql_log_off(
if (internal_sql_log_off)
{
spider_conn_queue_sql_log_off(conn, TRUE);
- }
- else
- {
+ } else {
spider_conn_queue_sql_log_off(conn, FALSE);
}
}
@@ -1663,7 +1711,8 @@ int spider_xa_lock(
#ifdef SPIDER_XID_USES_xid_cache_iterate
if (xid_cache_insert(thd, xid_state))
{
- error_num = my_errno;
+ error_num = (spider_stmt_da_sql_errno(thd) == ER_XAER_DUPID ?
+ ER_SPIDER_XA_LOCKED_NUM : HA_ERR_OUT_OF_MEM);
goto error;
}
#else
@@ -1791,7 +1840,6 @@ int spider_internal_start_trx(
SPIDER_TRX *trx = spider->trx;
THD *thd = trx->thd;
bool sync_autocommit = spider_param_sync_autocommit(thd);
- bool sync_time_zone = spider_param_sync_time_zone(thd);
double ping_interval_at_trx_start =
spider_param_ping_interval_at_trx_start(thd);
bool xa_lock = FALSE;
@@ -1818,9 +1866,6 @@ int spider_internal_start_trx(
if (
(error_num = spider_check_and_set_sql_log_off(thd, conn,
&spider->need_mons[link_idx])) ||
- (sync_time_zone &&
- (error_num = spider_check_and_set_time_zone(thd, conn,
- &spider->need_mons[link_idx]))) ||
(sync_autocommit &&
(error_num = spider_check_and_set_autocommit(thd, conn,
&spider->need_mons[link_idx])))
@@ -1909,6 +1954,8 @@ int spider_internal_start_trx(
}
trx->trx_start = TRUE;
trx->trx_xa_prepared = FALSE;
+ trx->updated_in_this_trx = FALSE;
+ DBUG_PRINT("info",("spider trx->updated_in_this_trx=FALSE"));
}
DBUG_PRINT("info",("spider sync_autocommit = %d", sync_autocommit));
@@ -1987,7 +2034,7 @@ int spider_internal_xa_commit(
TABLE *table_xa,
TABLE *table_xa_member
) {
- int error_num, tmp_error_num;
+ int error_num = 0, tmp_error_num;
char xa_key[MAX_KEY_LENGTH];
SPIDER_CONN *conn;
uint force_commit = spider_param_force_commit(thd);
@@ -2001,72 +2048,75 @@ int spider_internal_xa_commit(
bool table_xa_member_opened = FALSE;
DBUG_ENTER("spider_internal_xa_commit");
- /*
- select
- status
- from
- mysql.spider_xa
- where
- format_id = xid->format_id and
- gtrid_length = xid->gtrid_length and
- data = xid->data
- */
- if (
- !(table_xa = spider_open_sys_table(
- thd, SPIDER_SYS_XA_TABLE_NAME_STR, SPIDER_SYS_XA_TABLE_NAME_LEN,
- TRUE, &open_tables_backup, TRUE, &error_num))
- )
- goto error_open_table;
- table_xa_opened = TRUE;
- spider_store_xa_pk(table_xa, &trx->xid);
- if (
- (error_num = spider_check_sys_table(table_xa, xa_key))
- ) {
- if (error_num != HA_ERR_KEY_NOT_FOUND && error_num != HA_ERR_END_OF_FILE)
- {
- table_xa->file->print_error(error_num, MYF(0));
+ if (trx->updated_in_this_trx || spider_param_xa_register_mode(thd) == 0)
+ {
+ /*
+ select
+ status
+ from
+ mysql.spider_xa
+ where
+ format_id = xid->format_id and
+ gtrid_length = xid->gtrid_length and
+ data = xid->data
+ */
+ if (
+ !(table_xa = spider_open_sys_table(
+ thd, SPIDER_SYS_XA_TABLE_NAME_STR, SPIDER_SYS_XA_TABLE_NAME_LEN,
+ TRUE, &open_tables_backup, TRUE, &error_num))
+ )
+ goto error_open_table;
+ table_xa_opened = TRUE;
+ spider_store_xa_pk(table_xa, &trx->xid);
+ if (
+ (error_num = spider_check_sys_table(table_xa, xa_key))
+ ) {
+ if (error_num != HA_ERR_KEY_NOT_FOUND && error_num != HA_ERR_END_OF_FILE)
+ {
+ table_xa->file->print_error(error_num, MYF(0));
+ goto error;
+ }
+ my_message(ER_SPIDER_XA_NOT_EXISTS_NUM, ER_SPIDER_XA_NOT_EXISTS_STR,
+ MYF(0));
+ error_num = ER_SPIDER_XA_NOT_EXISTS_NUM;
+ goto error;
+ }
+ SPD_INIT_ALLOC_ROOT(&mem_root, 4096, 0, MYF(MY_WME));
+ if (
+ force_commit != 2 &&
+ (error_num = spider_check_sys_xa_status(
+ table_xa,
+ SPIDER_SYS_XA_PREPARED_STR,
+ SPIDER_SYS_XA_COMMIT_STR,
+ NULL,
+ ER_SPIDER_XA_NOT_PREPARED_NUM,
+ &mem_root))
+ ) {
+ free_root(&mem_root, MYF(0));
+ if (error_num == ER_SPIDER_XA_NOT_PREPARED_NUM)
+ my_message(error_num, ER_SPIDER_XA_NOT_PREPARED_STR, MYF(0));
goto error;
}
- my_message(ER_SPIDER_XA_NOT_EXISTS_NUM, ER_SPIDER_XA_NOT_EXISTS_STR,
- MYF(0));
- error_num = ER_SPIDER_XA_NOT_EXISTS_NUM;
- goto error;
- }
- SPD_INIT_ALLOC_ROOT(&mem_root, 4096, 0, MYF(MY_WME));
- if (
- force_commit != 2 &&
- (error_num = spider_check_sys_xa_status(
- table_xa,
- SPIDER_SYS_XA_PREPARED_STR,
- SPIDER_SYS_XA_COMMIT_STR,
- NULL,
- ER_SPIDER_XA_NOT_PREPARED_NUM,
- &mem_root))
- ) {
free_root(&mem_root, MYF(0));
- if (error_num == ER_SPIDER_XA_NOT_PREPARED_NUM)
- my_message(error_num, ER_SPIDER_XA_NOT_PREPARED_STR, MYF(0));
- goto error;
- }
- free_root(&mem_root, MYF(0));
- /*
- update
- mysql.spider_xa
- set
- status = 'COMMIT'
- where
- format_id = trx->xid.format_id and
- gtrid_length = trx->xid.gtrid_length and
- data = trx->xid.data
- */
- if (
- (error_num = spider_update_xa(
- table_xa, &trx->xid, SPIDER_SYS_XA_COMMIT_STR))
- )
- goto error;
- spider_close_sys_table(thd, table_xa, &open_tables_backup, TRUE);
- table_xa_opened = FALSE;
+ /*
+ update
+ mysql.spider_xa
+ set
+ status = 'COMMIT'
+ where
+ format_id = trx->xid.format_id and
+ gtrid_length = trx->xid.gtrid_length and
+ data = trx->xid.data
+ */
+ if (
+ (error_num = spider_update_xa(
+ table_xa, &trx->xid, SPIDER_SYS_XA_COMMIT_STR))
+ )
+ goto error;
+ spider_close_sys_table(thd, table_xa, &open_tables_backup, TRUE);
+ table_xa_opened = FALSE;
+ }
SPIDER_BACKUP_DASTATUS;
if ((conn = spider_tree_first(trx->join_trx_top)))
@@ -2104,46 +2154,49 @@ int spider_internal_xa_commit(
if (error_num)
goto error_in_commit;
- /*
- delete from
- mysql.spider_xa_member
- where
- format_id = xid->format_id and
- gtrid_length = xid->gtrid_length and
- data = xid->data
- */
- if (
- !(table_xa_member = spider_open_sys_table(
- thd, SPIDER_SYS_XA_MEMBER_TABLE_NAME_STR,
- SPIDER_SYS_XA_MEMBER_TABLE_NAME_LEN, TRUE, &open_tables_backup, TRUE,
- &error_num))
- )
- goto error_open_table;
- table_xa_member_opened = TRUE;
- if ((error_num = spider_delete_xa_member(table_xa_member, &trx->xid)))
- goto error;
- spider_close_sys_table(thd, table_xa_member, &open_tables_backup, TRUE);
- table_xa_member_opened = FALSE;
+ if (trx->updated_in_this_trx || spider_param_xa_register_mode(thd) == 0)
+ {
+ /*
+ delete from
+ mysql.spider_xa_member
+ where
+ format_id = xid->format_id and
+ gtrid_length = xid->gtrid_length and
+ data = xid->data
+ */
+ if (
+ !(table_xa_member = spider_open_sys_table(
+ thd, SPIDER_SYS_XA_MEMBER_TABLE_NAME_STR,
+ SPIDER_SYS_XA_MEMBER_TABLE_NAME_LEN, TRUE, &open_tables_backup, TRUE,
+ &error_num))
+ )
+ goto error_open_table;
+ table_xa_member_opened = TRUE;
+ if ((error_num = spider_delete_xa_member(table_xa_member, &trx->xid)))
+ goto error;
+ spider_close_sys_table(thd, table_xa_member, &open_tables_backup, TRUE);
+ table_xa_member_opened = FALSE;
- /*
- delete from
- mysql.spider_xa
- where
- format_id = xid->format_id and
- gtrid_length = xid->gtrid_length and
- data = xid->data
- */
- if (
- !(table_xa = spider_open_sys_table(
- thd, SPIDER_SYS_XA_TABLE_NAME_STR, SPIDER_SYS_XA_TABLE_NAME_LEN,
- TRUE, &open_tables_backup, TRUE, &error_num))
- )
- goto error_open_table;
- table_xa_opened = TRUE;
- if ((error_num = spider_delete_xa(table_xa, &trx->xid)))
- goto error;
- spider_close_sys_table(thd, table_xa, &open_tables_backup, TRUE);
- table_xa_opened = FALSE;
+ /*
+ delete from
+ mysql.spider_xa
+ where
+ format_id = xid->format_id and
+ gtrid_length = xid->gtrid_length and
+ data = xid->data
+ */
+ if (
+ !(table_xa = spider_open_sys_table(
+ thd, SPIDER_SYS_XA_TABLE_NAME_STR, SPIDER_SYS_XA_TABLE_NAME_LEN,
+ TRUE, &open_tables_backup, TRUE, &error_num))
+ )
+ goto error_open_table;
+ table_xa_opened = TRUE;
+ if ((error_num = spider_delete_xa(table_xa, &trx->xid)))
+ goto error;
+ spider_close_sys_table(thd, table_xa, &open_tables_backup, TRUE);
+ table_xa_opened = FALSE;
+ }
spider_xa_unlock(&trx->internal_xid_state);
trx->internal_xid_state.xa_state = XA_NOTR;
DBUG_RETURN(0);
@@ -2180,8 +2233,13 @@ int spider_internal_xa_rollback(
bool table_xa_member_opened = FALSE;
DBUG_ENTER("spider_internal_xa_rollback");
- if (trx->trx_xa_prepared)
- {
+ if (
+ trx->trx_xa_prepared &&
+ (
+ trx->updated_in_this_trx ||
+ spider_param_xa_register_mode(thd) == 0
+ )
+ ) {
/*
select
status
@@ -2330,7 +2388,11 @@ int spider_internal_xa_rollback(
if (
trx->trx_xa_prepared &&
- !server_lost
+ !server_lost &&
+ (
+ trx->updated_in_this_trx ||
+ spider_param_xa_register_mode(thd) == 0
+ )
) {
/*
delete from
@@ -2407,35 +2469,38 @@ int spider_internal_xa_prepare(
bool table_xa_opened = FALSE;
bool table_xa_member_opened = FALSE;
DBUG_ENTER("spider_internal_xa_prepare");
- /*
- insert into mysql.spider_xa
- (format_id, gtrid_length, bqual_length, data, status) values
- (trx->xid.format_id, trx->xid.gtrid_length, trx->xid.bqual_length,
- trx->xid.data, 'NOT YET')
- */
- if (
- !(table_xa = spider_open_sys_table(
- thd, SPIDER_SYS_XA_TABLE_NAME_STR, SPIDER_SYS_XA_TABLE_NAME_LEN,
- TRUE, &open_tables_backup, TRUE, &error_num))
- )
- goto error_open_table;
- table_xa_opened = TRUE;
- if (
- (error_num = spider_insert_xa(
- table_xa, &trx->xid, SPIDER_SYS_XA_NOT_YET_STR))
- )
- goto error;
- spider_close_sys_table(thd, table_xa, &open_tables_backup, TRUE);
- table_xa_opened = FALSE;
+ if (trx->updated_in_this_trx || spider_param_xa_register_mode(thd) == 0)
+ {
+ /*
+ insert into mysql.spider_xa
+ (format_id, gtrid_length, bqual_length, data, status) values
+ (trx->xid.format_id, trx->xid.gtrid_length, trx->xid.bqual_length,
+ trx->xid.data, 'NOT YET')
+ */
+ if (
+ !(table_xa = spider_open_sys_table(
+ thd, SPIDER_SYS_XA_TABLE_NAME_STR, SPIDER_SYS_XA_TABLE_NAME_LEN,
+ TRUE, &open_tables_backup, TRUE, &error_num))
+ )
+ goto error_open_table;
+ table_xa_opened = TRUE;
+ if (
+ (error_num = spider_insert_xa(
+ table_xa, &trx->xid, SPIDER_SYS_XA_NOT_YET_STR))
+ )
+ goto error;
+ spider_close_sys_table(thd, table_xa, &open_tables_backup, TRUE);
+ table_xa_opened = FALSE;
- if (
- !(table_xa_member = spider_open_sys_table(
- thd, SPIDER_SYS_XA_MEMBER_TABLE_NAME_STR,
- SPIDER_SYS_XA_MEMBER_TABLE_NAME_LEN, TRUE, &open_tables_backup, TRUE,
- &error_num))
- )
- goto error_open_table;
- table_xa_member_opened = TRUE;
+ if (
+ !(table_xa_member = spider_open_sys_table(
+ thd, SPIDER_SYS_XA_MEMBER_TABLE_NAME_STR,
+ SPIDER_SYS_XA_MEMBER_TABLE_NAME_LEN, TRUE, &open_tables_backup, TRUE,
+ &error_num))
+ )
+ goto error_open_table;
+ table_xa_member_opened = TRUE;
+ }
SPIDER_BACKUP_DASTATUS;
if ((conn = spider_tree_first(trx->join_trx_top)))
{
@@ -2461,26 +2526,29 @@ int spider_internal_xa_prepare(
}
conn->join_trx = 0;
} else {
- /*
- insert into mysql.spider_xa_member
- (format_id, gtrid_length, bqual_length, data,
- scheme, host, port, socket, username, password) values
- (trx->xid.format_id, trx->xid.gtrid_length,
- trx->xid.bqual_length, trx->xid.data,
- conn->tgt_wrapper,
- conn->tgt_host,
- conn->tgt_port,
- conn->tgt_socket,
- conn->tgt_username,
- conn->tgt_password)
- */
- if (
- (error_num = spider_insert_xa_member(
- table_xa_member, &trx->xid, conn))
- ) {
- SPIDER_CONN_RESTORE_DASTATUS_AND_RESET_ERROR_NUM;
- if (error_num)
- goto error;
+ if (trx->updated_in_this_trx || spider_param_xa_register_mode(thd) == 0)
+ {
+ /*
+ insert into mysql.spider_xa_member
+ (format_id, gtrid_length, bqual_length, data,
+ scheme, host, port, socket, username, password) values
+ (trx->xid.format_id, trx->xid.gtrid_length,
+ trx->xid.bqual_length, trx->xid.data,
+ conn->tgt_wrapper,
+ conn->tgt_host,
+ conn->tgt_port,
+ conn->tgt_socket,
+ conn->tgt_username,
+ conn->tgt_password)
+ */
+ if (
+ (error_num = spider_insert_xa_member(
+ table_xa_member, &trx->xid, conn))
+ ) {
+ SPIDER_CONN_RESTORE_DASTATUS_AND_RESET_ERROR_NUM;
+ if (error_num)
+ goto error;
+ }
}
if ((error_num = spider_db_xa_end(conn, &trx->xid)))
@@ -2518,33 +2586,36 @@ int spider_internal_xa_prepare(
trx->join_trx_top = NULL;
*/
}
- spider_close_sys_table(thd, table_xa_member, &open_tables_backup, TRUE);
- table_xa_member_opened = FALSE;
+ if (trx->updated_in_this_trx || spider_param_xa_register_mode(thd) == 0)
+ {
+ spider_close_sys_table(thd, table_xa_member, &open_tables_backup, TRUE);
+ table_xa_member_opened = FALSE;
- /*
- update
- mysql.spider_xa
- set
- status = 'PREPARED'
- where
- format_id = trx->xid.format_id and
- gtrid_length = trx->xid.gtrid_length and
- data = trx->xid.data
- */
- if (
- !(table_xa = spider_open_sys_table(
- thd, SPIDER_SYS_XA_TABLE_NAME_STR, SPIDER_SYS_XA_TABLE_NAME_LEN,
- TRUE, &open_tables_backup, TRUE, &error_num))
- )
- goto error_open_table;
- table_xa_opened = TRUE;
- if (
- (error_num = spider_update_xa(
- table_xa, &trx->xid, SPIDER_SYS_XA_PREPARED_STR))
- )
- goto error;
- spider_close_sys_table(thd, table_xa, &open_tables_backup, TRUE);
- table_xa_opened = FALSE;
+ /*
+ update
+ mysql.spider_xa
+ set
+ status = 'PREPARED'
+ where
+ format_id = trx->xid.format_id and
+ gtrid_length = trx->xid.gtrid_length and
+ data = trx->xid.data
+ */
+ if (
+ !(table_xa = spider_open_sys_table(
+ thd, SPIDER_SYS_XA_TABLE_NAME_STR, SPIDER_SYS_XA_TABLE_NAME_LEN,
+ TRUE, &open_tables_backup, TRUE, &error_num))
+ )
+ goto error_open_table;
+ table_xa_opened = TRUE;
+ if (
+ (error_num = spider_update_xa(
+ table_xa, &trx->xid, SPIDER_SYS_XA_PREPARED_STR))
+ )
+ goto error;
+ spider_close_sys_table(thd, table_xa, &open_tables_backup, TRUE);
+ table_xa_opened = FALSE;
+ }
if (internal_xa)
trx->internal_xid_state.xa_state = XA_PREPARED;
DBUG_RETURN(0);
@@ -2688,11 +2759,12 @@ int spider_initinal_xa_recover(
FALSE, open_tables_backup, TRUE, &error_num))
)
goto error_open_table;
- init_read_record(read_record, thd, table_xa, NULL, NULL, TRUE, FALSE,
- FALSE);
+ SPIDER_init_read_record(read_record, thd, table_xa, NULL, NULL, TRUE,
+ FALSE, FALSE);
}
SPD_INIT_ALLOC_ROOT(&mem_root, 4096, 0, MYF(MY_WME));
- while ((!(read_record->read_record(read_record))) && cnt < (int) len)
+ while ((!(read_record->SPIDER_read_record_read_record(read_record))) &&
+ cnt < (int) len)
{
spider_get_sys_xid(table_xa, &xid_list[cnt], &mem_root);
cnt++;
@@ -2741,7 +2813,7 @@ int spider_internal_xa_commit_by_xid(
SPIDER_TRX *trx,
XID* xid
) {
- TABLE *table_xa, *table_xa_member;
+ TABLE *table_xa, *table_xa_member = 0;
int error_num;
char xa_key[MAX_KEY_LENGTH];
char xa_member_key[MAX_KEY_LENGTH];
@@ -2872,7 +2944,7 @@ int spider_internal_xa_commit_by_xid(
}
}
- memset(&tmp_share, 0, sizeof(SPIDER_SHARE));
+ memset((void*)&tmp_share, 0, sizeof(SPIDER_SHARE));
memset(&tmp_connect_info, 0,
sizeof(char *) * SPIDER_TMP_SHARE_CHAR_PTR_COUNT);
spider_set_tmp_share_pointer(&tmp_share, tmp_connect_info,
@@ -2976,7 +3048,7 @@ int spider_internal_xa_rollback_by_xid(
SPIDER_TRX *trx,
XID* xid
) {
- TABLE *table_xa, *table_xa_member;
+ TABLE *table_xa, *table_xa_member = 0;
int error_num;
char xa_key[MAX_KEY_LENGTH];
char xa_member_key[MAX_KEY_LENGTH];
@@ -3105,7 +3177,7 @@ int spider_internal_xa_rollback_by_xid(
}
}
- memset(&tmp_share, 0, sizeof(SPIDER_SHARE));
+ memset((void*)&tmp_share, 0, sizeof(SPIDER_SHARE));
memset(&tmp_connect_info, 0,
sizeof(char *) * SPIDER_TMP_SHARE_CHAR_PTR_COUNT);
spider_set_tmp_share_pointer(&tmp_share, tmp_connect_info,
@@ -3374,7 +3446,9 @@ int spider_commit(
}
}
trx->trx_start = FALSE;
+ trx->updated_in_this_trx = FALSE;
DBUG_PRINT("info",("spider trx->trx_start=FALSE"));
+ DBUG_PRINT("info",("spider trx->updated_in_this_trx=FALSE"));
}
spider_reuse_trx_ha(trx);
spider_free_trx_conn(trx, FALSE);
@@ -3445,7 +3519,9 @@ int spider_rollback(
}
}
trx->trx_start = FALSE;
+ trx->updated_in_this_trx = FALSE;
DBUG_PRINT("info",("spider trx->trx_start=FALSE"));
+ DBUG_PRINT("info",("spider trx->updated_in_this_trx=FALSE"));
}
spider_reuse_trx_ha(trx);
spider_free_trx_conn(trx, FALSE);
@@ -3716,21 +3792,14 @@ int spider_check_trx_and_get_conn(
{
TABLE *table = spider->get_table();
TABLE_SHARE *table_share = table->s;
-#if defined(_MSC_VER) || defined(__SUNPRO_CC)
- char *db, *table_name;
- if (!(db = (char *)
- spider_bulk_malloc(spider_current_trx, 57, MYF(MY_WME),
- &db, table_share->db.length + 1,
- &table_name, table_share->table_name.length + 1,
- NullS))
- ) {
- my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
+ char *db = (char *) my_alloca(
+ table_share->db.length + 1 + table_share->table_name.length + 1);
+ if (!db)
+ {
+ my_error(HA_ERR_OUT_OF_MEM, MYF(0));
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
-#else
- char db[table_share->db.length + 1],
- table_name[table_share->table_name.length + 1];
-#endif
+ char *table_name = db + table_share->db.length + 1;
memcpy(db, table_share->db.str, table_share->db.length);
db[table_share->db.length] = '\0';
memcpy(table_name, table_share->table_name.str,
@@ -3738,10 +3807,12 @@ int spider_check_trx_and_get_conn(
table_name[table_share->table_name.length] = '\0';
my_printf_error(ER_SPIDER_ALL_LINKS_FAILED_NUM,
ER_SPIDER_ALL_LINKS_FAILED_STR, MYF(0), db, table_name);
-#if defined(_MSC_VER) || defined(__SUNPRO_CC)
- spider_free(trx, db, MYF(MY_WME));
-#endif
+ my_afree(db);
DBUG_RETURN(ER_SPIDER_ALL_LINKS_FAILED_NUM);
+ } else if (search_link_idx == -2)
+ {
+ my_error(HA_ERR_OUT_OF_MEM, MYF(0));
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
spider->search_link_idx = search_link_idx;
spider->search_link_query_id = thd->query_id;
@@ -3807,6 +3878,7 @@ int spider_check_trx_and_get_conn(
trx,
trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -3849,6 +3921,7 @@ int spider_check_trx_and_get_conn(
trx,
trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -3875,21 +3948,14 @@ int spider_check_trx_and_get_conn(
{
TABLE *table = spider->get_table();
TABLE_SHARE *table_share = table->s;
-#if defined(_MSC_VER) || defined(__SUNPRO_CC)
- char *db, *table_name;
- if (!(db = (char *)
- spider_bulk_malloc(spider_current_trx, 57, MYF(MY_WME),
- &db, table_share->db.length + 1,
- &table_name, table_share->table_name.length + 1,
- NullS))
- ) {
- my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
+ char *db = (char *) my_alloca(
+ table_share->db.length + 1 + table_share->table_name.length + 1);
+ if (!db)
+ {
+ my_error(HA_ERR_OUT_OF_MEM, MYF(0));
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
-#else
- char db[table_share->db.length + 1],
- table_name[table_share->table_name.length + 1];
-#endif
+ char *table_name = db + table_share->db.length + 1;
memcpy(db, table_share->db.str, table_share->db.length);
db[table_share->db.length] = '\0';
memcpy(table_name, table_share->table_name.str,
@@ -3897,9 +3963,7 @@ int spider_check_trx_and_get_conn(
table_name[table_share->table_name.length] = '\0';
my_printf_error(ER_SPIDER_LINK_MON_JUST_NG_NUM,
ER_SPIDER_LINK_MON_JUST_NG_STR, MYF(0), db, table_name);
-#if defined(_MSC_VER) || defined(__SUNPRO_CC)
- spider_free(trx, db, MYF(MY_WME));
-#endif
+ my_afree(db);
DBUG_RETURN(ER_SPIDER_LINK_MON_JUST_NG_NUM);
}
} else {
@@ -3953,6 +4017,7 @@ int spider_check_trx_and_get_conn(
trx,
trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -3996,6 +4061,7 @@ int spider_check_trx_and_get_conn(
trx,
trx->thd,
share,
+ roop_count,
(uint32) share->monitoring_sid[roop_count],
share->table_name,
share->table_name_length,
@@ -4021,21 +4087,14 @@ int spider_check_trx_and_get_conn(
{
TABLE *table = spider->get_table();
TABLE_SHARE *table_share = table->s;
-#if defined(_MSC_VER) || defined(__SUNPRO_CC)
- char *db, *table_name;
- if (!(db = (char *)
- spider_bulk_malloc(spider_current_trx, 57, MYF(MY_WME),
- &db, table_share->db.length + 1,
- &table_name, table_share->table_name.length + 1,
- NullS))
- ) {
- my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
+ char *db = (char *) my_alloca(
+ table_share->db.length + 1 + table_share->table_name.length + 1);
+ if (!db)
+ {
+ my_error(HA_ERR_OUT_OF_MEM, MYF(0));
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
-#else
- char db[table_share->db.length + 1],
- table_name[table_share->table_name.length + 1];
-#endif
+ char *table_name = db + table_share->db.length + 1;
memcpy(db, table_share->db.str, table_share->db.length);
db[table_share->db.length] = '\0';
memcpy(table_name, table_share->table_name.str,
@@ -4043,9 +4102,7 @@ int spider_check_trx_and_get_conn(
table_name[table_share->table_name.length] = '\0';
my_printf_error(ER_SPIDER_LINK_MON_JUST_NG_NUM,
ER_SPIDER_LINK_MON_JUST_NG_STR, MYF(0), db, table_name);
-#if defined(_MSC_VER) || defined(__SUNPRO_CC)
- spider_free(trx, db, MYF(MY_WME));
-#endif
+ my_afree(db);
DBUG_RETURN(ER_SPIDER_LINK_MON_JUST_NG_NUM);
}
}
@@ -4060,7 +4117,7 @@ THD *spider_create_tmp_thd()
{
THD *thd;
DBUG_ENTER("spider_create_tmp_thd");
- if (!(thd = new THD(0)))
+ if (!(thd = SPIDER_new_THD((my_thread_id) 0)))
DBUG_RETURN(NULL);
#if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100000
thd->killed = NOT_KILLED;
@@ -4071,6 +4128,10 @@ THD *spider_create_tmp_thd()
thd->locked_tables = FALSE;
#endif
thd->proc_info = "";
+#if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100200
+#else
+ thd->thread_id = thd->variables.pseudo_thread_id = 0;
+#endif
thd->thread_stack = (char*) &thd;
if (thd->store_globals())
DBUG_RETURN(NULL);
diff --git a/storage/spider/spd_udf.cc b/storage/spider/spd_udf.cc
index 023285cb4f1..3f7cc65477f 100644
--- a/storage/spider/spd_udf.cc
+++ b/storage/spider/spd_udf.cc
@@ -15,6 +15,7 @@
#define MYSQL_SERVER 1
#include <my_global.h>
+#include "spd_environ.h"
#include "mysql.h"
#include "spd_udf.h"