/* Copyright (C) 2012-2018 Kentoku Shiba Copyright (c) 2020, 2022, MariaDB Corporation. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */ #define MYSQL_SERVER 1 #include #include "mysql_version.h" #include "spd_environ.h" #include "sql_priv.h" #include "probes_mysql.h" #include "sql_class.h" #include "sql_partition.h" #include "sql_analyse.h" #include "sql_base.h" #include "tztime.h" #include "sql_select.h" #include "sql_common.h" #include #include #include "spd_err.h" #include "spd_param.h" #include "spd_db_include.h" #include "spd_include.h" #include "spd_db_mysql.h" #include "ha_spider.h" #include "spd_conn.h" #include "spd_db_conn.h" #include "spd_malloc.h" #include "spd_sys_table.h" #include "spd_table.h" extern struct charset_info_st *spd_charset_utf8mb3_bin; 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[]; extern const char **spd_mysqld_unix_port; extern uint *spd_mysqld_port; 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; #define SPIDER_SQL_ISO_READ_UNCOMMITTED_STR "set session transaction isolation level read uncommitted" #define SPIDER_SQL_ISO_READ_UNCOMMITTED_LEN sizeof(SPIDER_SQL_ISO_READ_UNCOMMITTED_STR) - 1 #define SPIDER_SQL_ISO_READ_COMMITTED_STR "set session transaction isolation level read committed" #define SPIDER_SQL_ISO_READ_COMMITTED_LEN sizeof(SPIDER_SQL_ISO_READ_COMMITTED_STR) - 1 #define SPIDER_SQL_ISO_REPEATABLE_READ_STR "set session transaction isolation level repeatable read" #define SPIDER_SQL_ISO_REPEATABLE_READ_LEN sizeof(SPIDER_SQL_ISO_REPEATABLE_READ_STR) - 1 #define SPIDER_SQL_ISO_SERIALIZABLE_STR "set session transaction isolation level serializable" #define SPIDER_SQL_ISO_SERIALIZABLE_LEN sizeof(SPIDER_SQL_ISO_SERIALIZABLE_STR) - 1 #define SPIDER_SQL_START_CONSISTENT_SNAPSHOT_STR "start transaction with consistent snapshot" #define SPIDER_SQL_START_CONSISTENT_SNAPSHOT_LEN sizeof(SPIDER_SQL_START_CONSISTENT_SNAPSHOT_STR) - 1 #define SPIDER_SQL_START_TRANSACTION_STR "start transaction" #define SPIDER_SQL_START_TRANSACTION_LEN sizeof(SPIDER_SQL_START_TRANSACTION_STR) - 1 #define SPIDER_SQL_AUTOCOMMIT_OFF_STR "set session autocommit = 0" #define SPIDER_SQL_AUTOCOMMIT_OFF_LEN sizeof(SPIDER_SQL_AUTOCOMMIT_OFF_STR) - 1 #define SPIDER_SQL_AUTOCOMMIT_ON_STR "set session autocommit = 1" #define SPIDER_SQL_AUTOCOMMIT_ON_LEN sizeof(SPIDER_SQL_AUTOCOMMIT_ON_STR) - 1 #define SPIDER_SQL_SQL_LOG_OFF_STR "set session sql_log_off = 0" #define SPIDER_SQL_SQL_LOG_OFF_LEN sizeof(SPIDER_SQL_SQL_LOG_OFF_STR) - 1 #define SPIDER_SQL_SQL_LOG_ON_STR "set session sql_log_off = 1" #define SPIDER_SQL_SQL_LOG_ON_LEN sizeof(SPIDER_SQL_SQL_LOG_ON_STR) - 1 #define SPIDER_SQL_WAIT_TIMEOUT_STR "set session wait_timeout = " #define SPIDER_SQL_WAIT_TIMEOUT_LEN sizeof(SPIDER_SQL_WAIT_TIMEOUT_STR) - 1 #define SPIDER_SQL_SQL_MODE_STR "set session sql_mode = '" #define SPIDER_SQL_SQL_MODE_LEN sizeof(SPIDER_SQL_SQL_MODE_STR) - 1 #define SPIDER_SQL_TIME_ZONE_STR "set session time_zone = '" #define SPIDER_SQL_TIME_ZONE_LEN sizeof(SPIDER_SQL_TIME_ZONE_STR) - 1 #define SPIDER_SQL_SET_USER_VAL_STR "set @`" #define SPIDER_SQL_SET_USER_VAL_LEN sizeof(SPIDER_SQL_SET_USER_VAL_STR) - 1 #define SPIDER_SQL_COMMIT_STR "commit" #define SPIDER_SQL_COMMIT_LEN sizeof(SPIDER_SQL_COMMIT_STR) - 1 #define SPIDER_SQL_ROLLBACK_STR "rollback" #define SPIDER_SQL_ROLLBACK_LEN sizeof(SPIDER_SQL_ROLLBACK_STR) - 1 #define SPIDER_SQL_XA_START_STR "xa start " #define SPIDER_SQL_XA_START_LEN sizeof(SPIDER_SQL_XA_START_STR) - 1 #define SPIDER_SQL_XA_END_STR "xa end " #define SPIDER_SQL_XA_END_LEN sizeof(SPIDER_SQL_XA_END_STR) - 1 #define SPIDER_SQL_XA_PREPARE_STR "xa prepare " #define SPIDER_SQL_XA_PREPARE_LEN sizeof(SPIDER_SQL_XA_PREPARE_STR) - 1 #define SPIDER_SQL_XA_COMMIT_STR "xa commit " #define SPIDER_SQL_XA_COMMIT_LEN sizeof(SPIDER_SQL_XA_COMMIT_STR) - 1 #define SPIDER_SQL_XA_ROLLBACK_STR "xa rollback " #define SPIDER_SQL_XA_ROLLBACK_LEN sizeof(SPIDER_SQL_XA_ROLLBACK_STR) - 1 #define SPIDER_SQL_LOCK_TABLE_STR "lock tables " #define SPIDER_SQL_LOCK_TABLE_LEN (sizeof(SPIDER_SQL_LOCK_TABLE_STR) - 1) #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`,`checksum` from `information_schema`.`tables` where `table_schema` = " #define SPIDER_SQL_SELECT_TABLES_STATUS_LEN sizeof(SPIDER_SQL_SELECT_TABLES_STATUS_STR) - 1 #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 #define SPIDER_SQL_SHOW_COLUMNS_STR "show columns from " #define SPIDER_SQL_SHOW_COLUMNS_LEN sizeof(SPIDER_SQL_SHOW_COLUMNS_STR) - 1 #define SPIDER_SQL_SELECT_COLUMNS_STR "select `column_name`,`column_default`,`is_nullable`,`character_set_name`,`collation_name`,`column_type`,`extra` from `information_schema`.`columns` where `table_schema` = " #define SPIDER_SQL_SELECT_COLUMNS_LEN sizeof(SPIDER_SQL_SELECT_COLUMNS_STR) - 1 #define SPIDER_SQL_AUTO_INCREMENT_STR " auto_increment" #define SPIDER_SQL_AUTO_INCREMENT_LEN sizeof(SPIDER_SQL_AUTO_INCREMENT_STR) - 1 #define SPIDER_SQL_ORDINAL_POSITION_STR "ordinal_position" #define SPIDER_SQL_ORDINAL_POSITION_LEN sizeof(SPIDER_SQL_ORDINAL_POSITION_STR) - 1 #define SPIDER_SQL_FULLTEXT_STR "fulltext" #define SPIDER_SQL_FULLTEXT_LEN sizeof(SPIDER_SQL_FULLTEXT_STR) - 1 #define SPIDER_SQL_SPATIAL_STR "spatial" #define SPIDER_SQL_SPATIAL_LEN sizeof(SPIDER_SQL_SPATIAL_STR) - 1 #define SPIDER_SQL_USING_HASH_STR " using hash" #define SPIDER_SQL_USING_HASH_LEN sizeof(SPIDER_SQL_USING_HASH_STR) - 1 #define SPIDER_SQL_SHOW_RECORDS_RECORDS_POS 0 #define SPIDER_SQL_EXPLAIN_SELECT_RECORDS_POS 8 #define SPIDER_SQL_CHECKSUM_CHECKSUM_POS 1 #define SPIDER_SQL_CHECKSUM_TABLE_STR "checksum table " #define SPIDER_SQL_CHECKSUM_TABLE_LEN (sizeof(SPIDER_SQL_CHECKSUM_TABLE_STR) - 1) #define SPIDER_SQL_LIKE_STR " like " #define SPIDER_SQL_LIKE_LEN (sizeof(SPIDER_SQL_LIKE_STR) - 1) #define SPIDER_SQL_LIMIT1_STR " limit 1" #define SPIDER_SQL_LIMIT1_LEN (sizeof(SPIDER_SQL_LIMIT1_STR) - 1) #define SPIDER_SQL_COLLATE_STR " collate " #define SPIDER_SQL_COLLATE_LEN (sizeof(SPIDER_SQL_COLLATE_STR) - 1) #define SPIDER_SQL_INTERVAL_STR " + interval " #define SPIDER_SQL_INTERVAL_LEN (sizeof(SPIDER_SQL_INTERVAL_STR) - 1) #define SPIDER_SQL_NEGINTERVAL_STR " - interval " #define SPIDER_SQL_NEGINTERVAL_LEN (sizeof(SPIDER_SQL_NEGINTERVAL_STR) - 1) static uchar SPIDER_SQL_LINESTRING_HEAD_STR[] = {0x00,0x00,0x00,0x00,0x01,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00}; #define SPIDER_SQL_LINESTRING_HEAD_LEN sizeof(SPIDER_SQL_LINESTRING_HEAD_STR) #define SPIDER_SQL_DIRECT_INSERT_KIND_INSERT 0 #define SPIDER_SQL_DIRECT_INSERT_KIND_REPLACE 1 #define SPIDER_SQL_DIRECT_INSERT_KIND_IGNORE 2 #define SPIDER_SQL_DIRECT_INSERT_KIND_DUP_UPDATE 3 static const char *spider_db_table_lock_str[] = { " read local,", " read,", " low_priority write,", " write," }; static const int spider_db_table_lock_len[] = { sizeof(" read local,") - 1, sizeof(" read,") - 1, sizeof(" low_priority write,") - 1, sizeof(" write,") - 1 }; static const char *spider_db_timefunc_interval_str[] = { " year", " quarter", " month", " week", " day", " hour", " minute", " second", " microsecond", " year_month", " day_hour", " day_minute", " day_second", " hour_minute", " hour_second", " minute_second", " day_microsecond", " hour_microsecond", " 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 ) { DBUG_ENTER("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_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( spider_db_share *db_share ) { DBUG_ENTER("spider_mysql_create_copy_table"); DBUG_RETURN(new spider_mysql_copy_table( (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( SPIDER_CONN *conn ) { DBUG_ENTER("spider_mysql_create_conn"); DBUG_RETURN(new spider_db_mysql(conn)); } 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, SPIDER_DB_WRAPPER_MYSQL, SPIDER_DB_ACCESS_TYPE_SQL, spider_mysql_init, spider_mysql_deinit, spider_mysql_create_share, spider_mysql_create_handler, spider_mysql_create_copy_table, spider_mysql_create_conn, spider_mysql_support_direct_join, &spider_db_mysql_utility, "For communicating to MySQL using native protocol", "3.4.0", SPIDER_MATURITY_STABLE }; 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, "For communicating to MariaDB using native protocol", "3.4.0", SPIDER_MATURITY_STABLE }; 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_mariadb_row::spider_db_mariadb_row() : spider_db_mbase_row(spider_db_mariadb_utility.dbton_id) { 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) { spider_free(spider_current_trx, row_first, MYF(0)); } DBUG_VOID_RETURN; } 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_mbase_row::store_to_field"); DBUG_PRINT("info",("spider this=%p", this)); if (!*row) { DBUG_PRINT("info", ("spider field is null")); field->set_null(); field->reset(); } else { field->set_notnull(); if (field->flags & BLOB_FLAG) { DBUG_PRINT("info", ("spider blob field")); if ( field->charset() == &my_charset_bin || field->charset()->cset == access_charset->cset ) ((Field_blob *)field)->set_ptr(*lengths, (uchar *) *row); else { DBUG_PRINT("info", ("spider blob convert")); if (field->table->file->ht == spider_hton_ptr) { ha_spider *spider = (ha_spider *) field->table->file; spider_string *str = &spider->blob_buff[field->field_index]; str->length(0); if (str->append(*row, *lengths, access_charset)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); ((Field_blob *)field)->set_ptr(str->length(), (uchar *) str->ptr()); } else { field->store(*row, *lengths, access_charset); } } } else field->store(*row, *lengths, access_charset); } DBUG_RETURN(0); } int spider_db_mbase_row::append_to_str( spider_string *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); str->q_append(*row, *lengths); DBUG_RETURN(0); } int spider_db_mbase_row::append_escaped_to_str( spider_string *str, uint dbton_id ) { 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); tmp_str.length(*lengths); if (str->reserve(*lengths * 2 + 2)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); spider_dbton[dbton_id].db_util->append_escaped_util(str, tmp_str.get_str()); DBUG_RETURN(0); } void spider_db_mbase_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_mbase_row::next() { DBUG_ENTER("spider_db_mbase_row::next"); DBUG_PRINT("info",("spider this=%p", this)); row++; lengths++; DBUG_VOID_RETURN; } bool spider_db_mbase_row::is_null() { DBUG_ENTER("spider_db_mbase_row::is_null"); DBUG_PRINT("info",("spider this=%p", this)); DBUG_RETURN(!(*row)); } int spider_db_mbase_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_mbase_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_mbase_row::val_decimal( my_decimal *decimal_value, CHARSET_INFO *access_charset ) { DBUG_ENTER("spider_db_mbase_row::val_decimal"); DBUG_PRINT("info",("spider this=%p", this)); if (!*row) DBUG_RETURN(NULL); #ifdef SPIDER_HAS_DECIMAL_OPERATION_RESULTS_VALUE_TYPE decimal_operation_results(str2my_decimal(0, *row, *lengths, access_charset, decimal_value), "", ""); #else decimal_operation_results(str2my_decimal(0, *row, *lengths, access_charset, decimal_value)); #endif DBUG_RETURN(decimal_value); } SPIDER_DB_ROW *spider_db_mbase_row::clone() { 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_mbase_row::clone"); DBUG_PRINT("info",("spider this=%p", this)); if (!(clone_row = new spider_db_mbase_row(dbton_id))) { DBUG_RETURN(NULL); } if (!record_size) { 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, (uint) (sizeof(char*) * (field_count + 1)), &tmp_char, (uint) (row_size), &clone_row->lengths, (uint) (sizeof(ulong) * field_count), NullS) ) { delete clone_row; DBUG_RETURN(NULL); } memcpy(clone_row->lengths, lengths_first, sizeof(ulong) * field_count); tmp_lengths = lengths_first; ctmp_row = clone_row->row; for (i = 0; i < field_count; i++) { DBUG_PRINT("info",("spider *lengths=%lu", *tmp_lengths)); if (*tmp_row == NULL) { *ctmp_row = NULL; *tmp_char = 0; tmp_char++; } else { *ctmp_row = tmp_char; memcpy(tmp_char, *tmp_row, *tmp_lengths + 1); tmp_char += *tmp_lengths + 1; } ctmp_row++; tmp_lengths++; tmp_row++; } clone_row->row[field_count] = NULL; 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_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_mbase_row::store_to_tmp_table"); DBUG_PRINT("info",("spider this=%p", this)); str->length(0); for (i = 0; i < field_count; i++) { if (*tmp_row) { if (str->reserve(*tmp_lengths + 1)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(*tmp_row, *tmp_lengths + 1); } tmp_lengths++; tmp_row++; } tmp_table->field[0]->set_notnull(); tmp_table->field[0]->store( (const char *) lengths, sizeof(ulong) * field_count, &my_charset_bin); tmp_table->field[1]->set_notnull(); tmp_table->field[1]->store( str->ptr(), str->length(), &my_charset_bin); tmp_table->field[2]->set_notnull(); tmp_table->field[2]->store( (char *) row, (uint) (sizeof(char *) * field_count), &my_charset_bin); DBUG_RETURN(tmp_table->file->ha_write_row(tmp_table->record[0])); } 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_mariadb_result::spider_db_mariadb_result( SPIDER_DB_CONN *in_db_conn ) : spider_db_mbase_result(in_db_conn) { 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) { free_result(); } DBUG_VOID_RETURN; } 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_mbase_result::has_result"); DBUG_PRINT("info",("spider this=%p", this)); DBUG_RETURN(db_result); } void spider_db_mbase_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) { mysql_free_result(db_result); db_result = NULL; } DBUG_VOID_RETURN; } SPIDER_DB_ROW *spider_db_mbase_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_mbase_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))) { 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[row.field_count] = NULL; 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_mbase_result::fetch_row_from_result_buffer( spider_db_result_buffer *spider_res_buf ) { 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))) { 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_mbase_result::fetch_row_from_tmp_table( TABLE *tmp_table ) { uint i; spider_string tmp_str1, tmp_str2, tmp_str3; const char *row_ptr; MYSQL_ROW tmp_row; ulong *tmp_lengths; uint field_count; 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); tmp_str3.init_calc_mem(170); tmp_table->field[0]->val_str(tmp_str1.get_str()); tmp_table->field[1]->val_str(tmp_str2.get_str()); tmp_table->field[2]->val_str(tmp_str3.get_str()); tmp_str1.mem_calc(); tmp_str2.mem_calc(); tmp_str3.mem_calc(); row_ptr = tmp_str2.ptr(); tmp_lengths = (ulong *) tmp_str1.ptr(); tmp_row = (MYSQL_ROW) tmp_str3.ptr(); field_count = tmp_str1.length() / sizeof(ulong); row.row = tmp_row; row.lengths = tmp_lengths; 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) { *tmp_row = (char *) row_ptr; row_ptr += *tmp_lengths + 1; } tmp_row++; tmp_lengths++; } DBUG_RETURN((SPIDER_DB_ROW *) &row); } int spider_db_mbase_result::fetch_table_status( int mode, ha_statistics &stat ) { int error_num; MYSQL_ROW mysql_row; MYSQL_TIME mysql_time; uint not_used_uint; #ifdef SPIDER_HAS_TIME_STATUS MYSQL_TIME_STATUS time_status; #else int time_status; #endif long not_used_long; 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) { /* 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_RETURN(ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM); } if (mysql_row[4]) stat.records = (ha_rows) my_strtoll10(mysql_row[4], (char**) NULL, &error_num); else stat.records = (ha_rows) 0; DBUG_PRINT("info", ("spider records=%lld", stat.records)); if (mysql_row[5]) stat.mean_rec_length = (ulong) my_strtoll10(mysql_row[5], (char**) NULL, &error_num); else stat.mean_rec_length = 0; DBUG_PRINT("info", ("spider mean_rec_length=%lu", stat.mean_rec_length)); if (mysql_row[6]) stat.data_file_length = (ulonglong) my_strtoll10(mysql_row[6], (char**) NULL, &error_num); else stat.data_file_length = 0; DBUG_PRINT("info", ("spider data_file_length=%lld", stat.data_file_length)); if (mysql_row[7]) stat.max_data_file_length = (ulonglong) my_strtoll10(mysql_row[7], (char**) NULL, &error_num); else stat.max_data_file_length = 0; DBUG_PRINT("info", ("spider max_data_file_length=%lld", stat.max_data_file_length)); if (mysql_row[8]) stat.index_file_length = (ulonglong) my_strtoll10(mysql_row[8], (char**) NULL, &error_num); else stat.index_file_length = 0; DBUG_PRINT("info", ("spider index_file_length=%lld", stat.index_file_length)); if (mysql_row[10]) stat.auto_increment_value = (ulonglong) my_strtoll10(mysql_row[10], (char**) NULL, &error_num); else stat.auto_increment_value = 1; DBUG_PRINT("info", ("spider auto_increment_value=%lld", stat.auto_increment_value)); if (mysql_row[11]) { #ifdef SPIDER_HAS_TIME_STATUS my_time_status_init(&time_status); #endif SPIDER_str_to_datetime(mysql_row[11], strlen(mysql_row[11]), &mysql_time, 0, &time_status); stat.create_time = (time_t) my_system_gmt_sec(&mysql_time, ¬_used_long, ¬_used_uint); } else stat.create_time = (time_t) 0; #ifdef DBUG_TRACE { struct tm *ts, tmp_ts; char buf[80]; ts = localtime_r(&stat.create_time, &tmp_ts); strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", ts); DBUG_PRINT("info",("spider create_time=%s", buf)); } #endif if (mysql_row[12]) { #ifdef SPIDER_HAS_TIME_STATUS my_time_status_init(&time_status); #endif SPIDER_str_to_datetime(mysql_row[12], strlen(mysql_row[12]), &mysql_time, 0, &time_status); stat.update_time = (time_t) my_system_gmt_sec(&mysql_time, ¬_used_long, ¬_used_uint); } else stat.update_time = (time_t) 0; #ifndef DBUG_OFF { struct tm *ts, tmp_ts; char buf[80]; ts = localtime_r(&stat.update_time, &tmp_ts); strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", ts); DBUG_PRINT("info",("spider update_time=%s", buf)); } #endif if (mysql_row[13]) { #ifdef SPIDER_HAS_TIME_STATUS my_time_status_init(&time_status); #endif SPIDER_str_to_datetime(mysql_row[13], strlen(mysql_row[13]), &mysql_time, 0, &time_status); stat.check_time = (time_t) my_system_gmt_sec(&mysql_time, ¬_used_long, ¬_used_uint); } else stat.check_time = (time_t) 0; #ifdef DBUG_TRACE { struct tm *ts, tmp_ts; char buf[80]; ts = localtime_r(&stat.check_time, &tmp_ts); strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", ts); DBUG_PRINT("info",("spider check_time=%s", buf)); } #endif if (mysql_row[15]) { stat.checksum_null = FALSE; stat.checksum = (ha_checksum) my_strtoll10(mysql_row[15], (char**) NULL, &error_num); DBUG_PRINT("info", ("spider checksum=%lu", (ulong) stat.checksum)); } else { stat.checksum_null = TRUE; stat.checksum = (ha_checksum) 0; DBUG_PRINT("info", ("spider checksum is null")); } } else { if (mysql_row[0]) stat.records = (ha_rows) my_strtoll10(mysql_row[0], (char**) NULL, &error_num); else stat.records = (ha_rows) 0; DBUG_PRINT("info", ("spider records=%lld", stat.records)); if (mysql_row[1]) stat.mean_rec_length = (ulong) my_strtoll10(mysql_row[1], (char**) NULL, &error_num); else stat.mean_rec_length = 0; DBUG_PRINT("info", ("spider mean_rec_length=%lu", stat.mean_rec_length)); if (mysql_row[2]) stat.data_file_length = (ulonglong) my_strtoll10(mysql_row[2], (char**) NULL, &error_num); else stat.data_file_length = 0; DBUG_PRINT("info", ("spider data_file_length=%lld", stat.data_file_length)); if (mysql_row[3]) stat.max_data_file_length = (ulonglong) my_strtoll10(mysql_row[3], (char**) NULL, &error_num); else stat.max_data_file_length = 0; DBUG_PRINT("info", ("spider max_data_file_length=%lld", stat.max_data_file_length)); if (mysql_row[4]) stat.index_file_length = (ulonglong) my_strtoll10(mysql_row[4], (char**) NULL, &error_num); else stat.index_file_length = 0; DBUG_PRINT("info", ("spider index_file_length=%lld", stat.index_file_length)); if (mysql_row[5]) stat.auto_increment_value = (ulonglong) my_strtoll10(mysql_row[5], (char**) NULL, &error_num); else stat.auto_increment_value = 1; DBUG_PRINT("info", ("spider auto_increment_value=%lld", stat.auto_increment_value)); if (mysql_row[6]) { #ifdef SPIDER_HAS_TIME_STATUS my_time_status_init(&time_status); #endif SPIDER_str_to_datetime(mysql_row[6], strlen(mysql_row[6]), &mysql_time, 0, &time_status); stat.create_time = (time_t) my_system_gmt_sec(&mysql_time, ¬_used_long, ¬_used_uint); } else stat.create_time = (time_t) 0; #ifdef DBUG_TRACE { struct tm *ts, tmp_ts; char buf[80]; ts = localtime_r(&stat.create_time, &tmp_ts); strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", ts); DBUG_PRINT("info",("spider create_time=%s", buf)); } #endif if (mysql_row[7]) { #ifdef SPIDER_HAS_TIME_STATUS my_time_status_init(&time_status); #endif SPIDER_str_to_datetime(mysql_row[7], strlen(mysql_row[7]), &mysql_time, 0, &time_status); stat.update_time = (time_t) my_system_gmt_sec(&mysql_time, ¬_used_long, ¬_used_uint); } else stat.update_time = (time_t) 0; #ifdef DBUG_TRACE { struct tm *ts, tmp_ts; char buf[80]; ts = localtime_r(&stat.update_time, &tmp_ts); strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", ts); DBUG_PRINT("info",("spider update_time=%s", buf)); } #endif if (mysql_row[8]) { #ifdef SPIDER_HAS_TIME_STATUS my_time_status_init(&time_status); #endif SPIDER_str_to_datetime(mysql_row[8], strlen(mysql_row[8]), &mysql_time, 0, &time_status); stat.check_time = (time_t) my_system_gmt_sec(&mysql_time, ¬_used_long, ¬_used_uint); } else stat.check_time = (time_t) 0; #ifdef DBUG_TRACE { struct tm *ts, tmp_ts; char buf[80]; ts = localtime_r(&stat.check_time, &tmp_ts); strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", ts); DBUG_PRINT("info",("spider check_time=%s", buf)); } #endif if (mysql_row[9]) { stat.checksum_null = FALSE; stat.checksum = (ha_checksum) my_strtoll10(mysql_row[9], (char**) NULL, &error_num); DBUG_PRINT("info", ("spider checksum=%lu", (ulong) stat.checksum)); } else { stat.checksum_null = TRUE; stat.checksum = (ha_checksum) 0; DBUG_PRINT("info", ("spider checksum is null")); } } DBUG_RETURN(0); } int spider_db_mbase_result::fetch_simple_action( uint simple_action, uint position, void *param ) { int error_num; MYSQL_ROW mysql_row; DBUG_ENTER("spider_db_mbase_result::fetch_simple_action"); 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() <= position) { DBUG_RETURN(ER_QUERY_ON_FOREIGN_DATA_SOURCE); } switch (simple_action) { case SPIDER_SIMPLE_RECORDS: { ha_rows *records = (ha_rows *) param; if (mysql_row[position]) { *records = (ha_rows) my_strtoll10(mysql_row[position], (char**) NULL, &error_num); } else { *records = (ha_rows) 0; } DBUG_PRINT("info", ("spider records=%lld", *records)); break; } case SPIDER_SIMPLE_CHECKSUM_TABLE: { ha_spider *spider = (ha_spider *) param; if (mysql_row[position]) { spider->checksum_val = (ha_checksum) my_strtoll10(mysql_row[position], (char**) NULL, &error_num); DBUG_PRINT("info", ("spider checksum=%llu", (ulonglong)spider->checksum_val)); spider->checksum_null = FALSE; } else { spider->checksum_null = TRUE; DBUG_PRINT("info", ("spider checksum is null")); } break; } default: DBUG_ASSERT(0); break; } DBUG_RETURN(0); } int spider_db_mbase_result::fetch_table_records( int mode, ha_rows &records ) { DBUG_ENTER("spider_db_mbase_result::fetch_table_records"); DBUG_PRINT("info",("spider this=%p", this)); if (mode == 1) { DBUG_RETURN(fetch_simple_action(SPIDER_SIMPLE_RECORDS, SPIDER_SQL_SHOW_RECORDS_RECORDS_POS, &records)); } else { DBUG_RETURN(fetch_simple_action(SPIDER_SIMPLE_RECORDS, SPIDER_SQL_EXPLAIN_SELECT_RECORDS_POS, &records)); } } int spider_db_mbase_result::fetch_table_checksum( ha_spider *spider ) { DBUG_ENTER("spider_db_mbase_result::fetch_table_checksum"); DBUG_PRINT("info",("spider this=%p", this)); DBUG_RETURN(fetch_simple_action(SPIDER_SIMPLE_CHECKSUM_TABLE, SPIDER_SQL_CHECKSUM_CHECKSUM_POS, spider)); } int spider_db_mbase_result::fetch_table_cardinality( int mode, TABLE *table, longlong *cardinality, uchar *cardinality_upd, int bitmap_size ) { int error_num; MYSQL_ROW mysql_row; Field *field; 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); } if (mode == 1) { uint num_fields = this->num_fields(); if (num_fields < 12 || num_fields > 14) { DBUG_PRINT("info",("spider num_fields < 12 || num_fields > 13")); DBUG_RETURN(ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM); } while (mysql_row) { if ( mysql_row[4] && mysql_row[6] && (field = find_field_in_table_sef(table, mysql_row[4])) ) { if ((cardinality[field->field_index] = (longlong) my_strtoll10(mysql_row[6], (char**) NULL, &error_num)) <= 0) cardinality[field->field_index] = 1; spider_set_bit(cardinality_upd, field->field_index); DBUG_PRINT("info", ("spider col_name=%s", mysql_row[4])); DBUG_PRINT("info", ("spider cardinality=%lld", cardinality[field->field_index])); } else if (mysql_row[4]) { DBUG_PRINT("info", ("spider skip col_name=%s", mysql_row[4])); } else { DBUG_RETURN(ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM); } mysql_row = mysql_fetch_row(db_result); } } else { while (mysql_row) { if ( mysql_row[0] && mysql_row[1] && (field = find_field_in_table_sef(table, mysql_row[0])) ) { if ((cardinality[field->field_index] = (longlong) my_strtoll10(mysql_row[1], (char**) NULL, &error_num)) <= 0) cardinality[field->field_index] = 1; spider_set_bit(cardinality_upd, field->field_index); DBUG_PRINT("info", ("spider col_name=%s", mysql_row[0])); DBUG_PRINT("info", ("spider cardinality=%lld", cardinality[field->field_index])); } else if (mysql_row[0]) { DBUG_PRINT("info", ("spider skip col_name=%s", mysql_row[0])); } else { DBUG_RETURN(ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM); } 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_mbase_result::fetch_table_mon_status( int &status ) { int error_num; MYSQL_ROW mysql_row; 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) { DBUG_PRINT("info",("spider num_fields != 1")); my_printf_error(ER_SPIDER_UNKNOWN_NUM, ER_SPIDER_UNKNOWN_STR, MYF(0)); DBUG_RETURN(ER_SPIDER_UNKNOWN_NUM); } if (mysql_row[0]) status = atoi(mysql_row[0]); else status = SPIDER_LINK_MON_OK; DBUG_PRINT("info", ("spider status=%d", status)); DBUG_RETURN(0); } 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_mbase_result::num_rows"); DBUG_PRINT("info",("spider this=%p", this)); DBUG_RETURN((longlong) mysql_num_rows(db_result)); } uint spider_db_mbase_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_mbase_result::move_to_pos( longlong pos ) { DBUG_ENTER("spider_db_mbase_result::move_to_pos"); DBUG_PRINT("info",("spider this=%p", this)); DBUG_PRINT("info",("spider pos=%lld", pos)); /* DBUG_ASSERT(first_row); */ db_result->data_cursor = first_row + pos; DBUG_VOID_RETURN; } int spider_db_mbase_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); } 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_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) { DBUG_PRINT("info",("spider num_fields != 7")); my_printf_error(ER_SPIDER_UNKNOWN_NUM, ER_SPIDER_UNKNOWN_STR, MYF(0)); DBUG_RETURN(ER_SPIDER_UNKNOWN_NUM); } do { if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN); if (str->append(mysql_row[0], strlen(mysql_row[0]), access_charset)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN + SPIDER_SQL_SPACE_LEN)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN); str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN); if (str->append(mysql_row[5], strlen(mysql_row[5]), access_charset)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } if (mysql_row[3]) { 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], length); } if (mysql_row[4]) { 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], length); } if (!strcmp(mysql_row[2], "NO")) { if (str->reserve(SPIDER_SQL_NOT_NULL_LEN)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_SQL_NOT_NULL_STR, SPIDER_SQL_NOT_NULL_LEN); if (mysql_row[1]) { if (str->reserve(SPIDER_SQL_DEFAULT_LEN)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_SQL_DEFAULT_STR, SPIDER_SQL_DEFAULT_LEN); if (str->append(mysql_row[1], strlen(mysql_row[1]), access_charset)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } } } else { if (str->reserve(SPIDER_SQL_DEFAULT_LEN)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_SQL_DEFAULT_STR, SPIDER_SQL_DEFAULT_LEN); if (mysql_row[1]) { if (str->append(mysql_row[1], strlen(mysql_row[1]), access_charset)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } } else { if (str->reserve(SPIDER_SQL_NULL_LEN)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_SQL_NULL_STR, SPIDER_SQL_NULL_LEN); } } if (mysql_row[6] && !strcmp(mysql_row[6], "auto_increment")) { if (str->reserve(SPIDER_SQL_AUTO_INCREMENT_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_AUTO_INCREMENT_STR, SPIDER_SQL_AUTO_INCREMENT_LEN); } 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); } 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_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_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 ((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); } if (num_fields() != 13) { DBUG_PRINT("info",("spider num_fields != 13")); my_printf_error(ER_SPIDER_UNKNOWN_NUM, ER_SPIDER_UNKNOWN_STR, MYF(0)); DBUG_RETURN(ER_SPIDER_UNKNOWN_NUM); } bool first = TRUE; bool without_size = FALSE; bool using_hash = FALSE; do { if (!strcmp(mysql_row[3], "1")) { without_size = FALSE; if (first) { first = FALSE; } else { if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN + SPIDER_SQL_COMMA_LEN + (using_hash ? SPIDER_SQL_USING_HASH_LEN : 0))) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN); if (using_hash) str->q_append(SPIDER_SQL_USING_HASH_STR, SPIDER_SQL_USING_HASH_LEN); str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); } /* new index */ if (!strcmp(mysql_row[2], SPIDER_DB_PK_NAME_STR)) { /* primary key */ if (str->reserve(SPIDER_DB_PK_NAME_LEN + SPIDER_SQL_SPACE_LEN)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_DB_PK_NAME_STR, SPIDER_DB_PK_NAME_LEN); str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN); } else if (!strcmp(mysql_row[1], "0")) { /* unique key */ if (str->reserve(SPIDER_DB_UNIQUE_NAME_LEN + SPIDER_SQL_SPACE_LEN)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_DB_UNIQUE_NAME_STR, SPIDER_DB_UNIQUE_NAME_LEN); str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN); } else if (mysql_row[10] && !strcmp(mysql_row[10], "FULLTEXT")) { /* fulltext key */ if (str->reserve(SPIDER_SQL_FULLTEXT_LEN + SPIDER_SQL_SPACE_LEN)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_SQL_FULLTEXT_STR, SPIDER_SQL_FULLTEXT_LEN); str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN); } else if (mysql_row[10] && !strcmp(mysql_row[10], "SPATIAL")) { /* spatial key */ without_size = TRUE; if (str->reserve(SPIDER_SQL_SPATIAL_LEN + SPIDER_SQL_SPACE_LEN)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_SQL_SPATIAL_STR, SPIDER_SQL_SPATIAL_LEN); str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN); } if (str->reserve(SPIDER_DB_KEY_NAME_LEN + SPIDER_SQL_SPACE_LEN)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_DB_KEY_NAME_STR, SPIDER_DB_KEY_NAME_LEN); str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN); if (strcmp(mysql_row[2], SPIDER_DB_PK_NAME_STR)) { if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN); if (str->append(mysql_row[2], strlen(mysql_row[2]), access_charset)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN); } if (str->reserve(SPIDER_SQL_OPEN_PAREN_LEN)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN); if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN); if (str->append(mysql_row[4], strlen(mysql_row[4]), access_charset)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN); if (mysql_row[7] && !without_size) { if (str->reserve(SPIDER_SQL_OPEN_PAREN_LEN)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN); if (str->append(mysql_row[7], strlen(mysql_row[7]), access_charset)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } 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); } } else { if (str->reserve(SPIDER_SQL_COMMA_LEN + SPIDER_SQL_NAME_QUOTE_LEN)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN); if (str->append(mysql_row[4], strlen(mysql_row[4]), access_charset)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN); if (mysql_row[7] && !without_size) { if (str->reserve(SPIDER_SQL_OPEN_PAREN_LEN)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN); if (str->append(mysql_row[7], strlen(mysql_row[7]), access_charset)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } 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); } } if (mysql_row[10] && !strcmp(mysql_row[10], "HASH")) using_hash = TRUE; 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 + (using_hash ? SPIDER_SQL_USING_HASH_LEN : 0))) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN); if (using_hash) str->q_append(SPIDER_SQL_USING_HASH_STR, SPIDER_SQL_USING_HASH_LEN); str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); } DBUG_RETURN(0); } 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; myf utf8_flag= global_system_variables.old_behavior & OLD_MODE_UTF8_IS_UTF8MB3 ? MY_UTF8_IS_UTF8MB3 : 0; 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) { DBUG_PRINT("info",("spider num_fields != 18")); my_printf_error(ER_SPIDER_UNKNOWN_NUM, ER_SPIDER_UNKNOWN_STR, MYF(0)); DBUG_RETURN(ER_SPIDER_UNKNOWN_NUM); } if (!mysql_row[14]) { DBUG_PRINT("info",("spider mysql_row[14] is null")); my_printf_error(ER_SPIDER_UNKNOWN_NUM, ER_SPIDER_UNKNOWN_STR, MYF(0)); DBUG_RETURN(ER_SPIDER_UNKNOWN_NUM); } DBUG_PRINT("info",("spider mysql_row[14]=%s", mysql_row[14])); if (!spider_share->table_share->table_charset) { spider_share->table_share->table_charset = get_charset_by_name(mysql_row[14], MYF(utf8_flag | MY_WME)); } DBUG_RETURN(0); } 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) { 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_mbase(conn, &spider_db_mysql_utility) { DBUG_ENTER("spider_db_mysql::spider_db_mysql"); DBUG_PRINT("info",("spider this=%p", this)); DBUG_VOID_RETURN; } spider_db_mariadb::spider_db_mariadb( SPIDER_CONN *conn ) : spider_db_mbase(conn, &spider_db_mariadb_utility) { 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 (lock_table_hash_inited) { spider_free_mem_calc(spider_current_trx, lock_table_hash_id, lock_table_hash.array.max_element * lock_table_hash.array.size_of_element); my_hash_free(&lock_table_hash); } DBUG_VOID_RETURN; } 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_mbase::init"); DBUG_PRINT("info",("spider this=%p", this)); if ( my_hash_init(PSI_INSTRUMENT_ME, &lock_table_hash, spd_charset_utf8mb3_bin, 32, 0, 0, (my_hash_get_key) spider_link_get_key, 0, 0) ) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } spider_alloc_calc_mem_init(lock_table_hash, 140); spider_alloc_calc_mem(spider_current_trx, lock_table_hash, lock_table_hash.array.max_element * lock_table_hash.array.size_of_element); lock_table_hash_inited = TRUE; DBUG_RETURN(0); } bool spider_db_mbase::is_connected() { DBUG_ENTER("spider_db_mbase::is_connected"); DBUG_PRINT("info",("spider this=%p", this)); DBUG_RETURN(db_conn); } void spider_db_mbase::bg_connect() { DBUG_ENTER("spider_db_mbase::bg_connect"); DBUG_PRINT("info",("spider this=%p", this)); DBUG_VOID_RETURN; } int spider_db_mbase::connect( char *tgt_host, char *tgt_username, char *tgt_password, long tgt_port, char *tgt_socket, char *server_name, int connect_retry_count, longlong connect_retry_interval ) { int error_num; my_bool connect_mutex = spider_param_connect_mutex(); DBUG_ENTER("spider_db_mbase::connect"); DBUG_PRINT("info",("spider this=%p", this)); while (TRUE) { THD *thd = current_thd; DBUG_PRINT("info",("spider thd->killed=%s", thd ? (thd->killed ? "TRUE" : "FALSE") : "NULL")); DBUG_PRINT("info",("spider abort_loop=%s", *spd_abort_loop ? "TRUE" : "FALSE")); if ( (thd && thd->killed) || *spd_abort_loop ) { DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); } if (!db_conn) { if (!(db_conn = mysql_init(NULL))) DBUG_RETURN(HA_ERR_OUT_OF_MEM); } mysql_options(db_conn, MYSQL_OPT_READ_TIMEOUT, &conn->net_read_timeout); mysql_options(db_conn, MYSQL_OPT_WRITE_TIMEOUT, &conn->net_write_timeout); mysql_options(db_conn, MYSQL_OPT_CONNECT_TIMEOUT, &conn->connect_timeout); mysql_options(db_conn, MYSQL_OPT_USE_REMOTE_CONNECTION, NULL); if ( conn->tgt_ssl_ca_length | conn->tgt_ssl_capath_length | conn->tgt_ssl_cert_length | conn->tgt_ssl_key_length ) { mysql_options(db_conn, MYSQL_OPT_SSL_KEY, conn->tgt_ssl_key); mysql_options(db_conn, MYSQL_OPT_SSL_CERT, conn->tgt_ssl_cert); mysql_options(db_conn, MYSQL_OPT_SSL_CA, conn->tgt_ssl_ca); mysql_options(db_conn, MYSQL_OPT_SSL_CAPATH, conn->tgt_ssl_capath); mysql_options(db_conn, MYSQL_OPT_SSL_CIPHER, conn->tgt_ssl_cipher); if (conn->tgt_ssl_vsc) { my_bool verify_flg = TRUE; mysql_options(db_conn, MYSQL_OPT_SSL_VERIFY_SERVER_CERT, &verify_flg); } } if (conn->tgt_default_file) { DBUG_PRINT("info",("spider tgt_default_file=%s", conn->tgt_default_file)); mysql_options(db_conn, MYSQL_READ_DEFAULT_FILE, conn->tgt_default_file); } if (conn->tgt_default_group) { DBUG_PRINT("info",("spider tgt_default_group=%s", conn->tgt_default_group)); mysql_options(db_conn, MYSQL_READ_DEFAULT_GROUP, conn->tgt_default_group); } if (!spider_param_same_server_link(thd)) { if (!strcmp(tgt_host, my_localhost)) { if (!strcmp(tgt_socket, *spd_mysqld_unix_port)) { my_printf_error(ER_SPIDER_SAME_SERVER_LINK_NUM, ER_SPIDER_SAME_SERVER_LINK_STR1, MYF(0), tgt_host, tgt_socket); DBUG_RETURN(ER_SPIDER_SAME_SERVER_LINK_NUM); } } else if (!strcmp(tgt_host, "127.0.0.1") || !strcmp(tgt_host, glob_hostname)) { if (tgt_port == (long) *spd_mysqld_port) { my_printf_error(ER_SPIDER_SAME_SERVER_LINK_NUM, ER_SPIDER_SAME_SERVER_LINK_STR2, MYF(0), tgt_host, tgt_port); DBUG_RETURN(ER_SPIDER_SAME_SERVER_LINK_NUM); } } } if (connect_mutex) pthread_mutex_lock(&spider_open_conn_mutex); /* tgt_db not use */ if ( !spider_param_dry_access() && !mysql_real_connect( db_conn, tgt_host, tgt_username, tgt_password, NULL, tgt_port, tgt_socket, CLIENT_MULTI_STATEMENTS ) ) { if (connect_mutex) pthread_mutex_unlock(&spider_open_conn_mutex); error_num = mysql_errno(db_conn); disconnect(); DBUG_PRINT("info",("spider thd->killed=%s", thd ? (thd->killed ? "TRUE" : "FALSE") : "NULL")); DBUG_PRINT("info",("spider abort_loop=%s", *spd_abort_loop ? "TRUE" : "FALSE")); if ( (thd && thd->killed) || *spd_abort_loop ) { DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); } if ( ( error_num != CR_CONN_HOST_ERROR && error_num != CR_CONNECTION_ERROR ) || !connect_retry_count ) { if (error_num == ER_CON_COUNT_ERROR) { *conn->need_mon = 0; my_error(ER_CON_COUNT_ERROR, MYF(0)); DBUG_RETURN(ER_CON_COUNT_ERROR); } *conn->need_mon = ER_CONNECT_TO_FOREIGN_DATA_SOURCE; my_error(ER_CONNECT_TO_FOREIGN_DATA_SOURCE, MYF(0), server_name ? server_name : tgt_host); DBUG_RETURN(ER_CONNECT_TO_FOREIGN_DATA_SOURCE); } 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; } } DBUG_RETURN(0); } int spider_db_mbase::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_mbase::bg_disconnect() { DBUG_ENTER("spider_db_mbase::bg_disconnect"); DBUG_PRINT("info",("spider this=%p", this)); DBUG_VOID_RETURN; } void spider_db_mbase::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) { mysql_close(db_conn); db_conn = NULL; } DBUG_VOID_RETURN; } int spider_db_mbase::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); my_net_set_write_timeout(&db_conn->net, conn->net_write_timeout); DBUG_RETURN(0); } 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_mbase::exec_query"); DBUG_PRINT("info",("spider this=%p", this)); if (spider_param_general_log()) { const char *tgt_str = conn->tgt_host; uint32 tgt_len = conn->tgt_host_length; spider_string tmp_query_str; tmp_query_str.init_calc_mem(230); if (tmp_query_str.reserve( length + conn->tgt_wrapper_length + tgt_len + (SPIDER_SQL_SPACE_LEN * 2))) DBUG_RETURN(HA_ERR_OUT_OF_MEM); tmp_query_str.q_append(conn->tgt_wrapper, conn->tgt_wrapper_length); tmp_query_str.q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN); tmp_query_str.q_append(tgt_str, tgt_len); tmp_query_str.q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN); tmp_query_str.q_append(query, length); general_log_write(current_thd, COM_QUERY, tmp_query_str.ptr(), tmp_query_str.length()); } if (!spider_param_dry_access()) { error_num = mysql_real_query(db_conn, query, length); } if ( (error_num && log_result_errors >= 1) || (log_result_errors >= 2 && db_conn->warning_count > 0) || (log_result_errors >= 4) ) { THD *thd = current_thd; uint log_result_error_with_sql = spider_param_log_result_error_with_sql(); if (log_result_error_with_sql) { time_t cur_time = (time_t) time((time_t*) 0); struct tm lt; struct tm *l_time = localtime_r(&cur_time, <); spider_string tmp_query_str; tmp_query_str.init_calc_mem(243); uint query_length = thd->query_length(); if ((log_result_error_with_sql & 2) && query_length) { Security_context *security_ctx = thd->security_ctx; tmp_query_str.length(0); if (tmp_query_str.reserve(query_length + 1)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); tmp_query_str.q_append(thd->query(), query_length); fprintf(stderr, "%04d%02d%02d %02d:%02d:%02d [RECV SPIDER SQL] " "from [%s][%s] to %ld: " "sql: %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, security_ctx->user ? security_ctx->user : "system user", security_ctx->host_or_ip, (ulong) thd->thread_id, tmp_query_str.c_ptr_safe()); } if (log_result_error_with_sql & 1) { tmp_query_str.length(0); if (tmp_query_str.reserve(length + 1)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); tmp_query_str.q_append(query, length); fprintf(stderr, "%04d%02d%02d %02d:%02d:%02d [SEND SPIDER SQL] " "from %ld to [%s] %ld: " "sql: %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) thd->thread_id, conn->tgt_host, (ulong) db_conn->thread_id, tmp_query_str.c_ptr_safe()); } } if (log_result_errors >= 2 && db_conn->warning_count > 0) { time_t cur_time = (time_t) time((time_t*) 0); struct tm lt; struct tm *l_time = localtime_r(&cur_time, <); fprintf(stderr, "%04d%02d%02d %02d:%02d:%02d [WARN SPIDER RESULT] " "from [%s] %ld to %ld: " "affected_rows: %llu id: %llu status: %u warning_count: %u\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, conn->tgt_host, (ulong) db_conn->thread_id, (ulong) thd->thread_id, db_conn->affected_rows, db_conn->insert_id, db_conn->server_status, db_conn->warning_count); if (spider_param_log_result_errors() >= 3) fetch_and_print_warnings(l_time); } else if (log_result_errors >= 4) { time_t cur_time = (time_t) time((time_t*) 0); struct tm lt; struct tm *l_time = localtime_r(&cur_time, <); fprintf(stderr, "%04d%02d%02d %02d:%02d:%02d [INFO SPIDER RESULT] " "from [%s] %ld to %ld: " "affected_rows: %llu id: %llu status: %u warning_count: %u\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, conn->tgt_host, (ulong) db_conn->thread_id, (ulong) thd->thread_id, db_conn->affected_rows, db_conn->insert_id, db_conn->server_status, db_conn->warning_count); } } DBUG_RETURN(error_num); } int spider_db_mbase::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_mbase::get_error() { const char *error_ptr; 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_mbase::is_server_gone_error( int error_num ) { bool server_gone; 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); DBUG_PRINT("info",("spider server_gone=%s", server_gone ? "TRUE" : "FALSE")); DBUG_RETURN(server_gone); } bool spider_db_mbase::is_dup_entry_error( int error_num ) { bool dup_entry; DBUG_ENTER("spider_db_mbase::is_dup_entry_error"); DBUG_PRINT("info",("spider this=%p", this)); dup_entry = ( error_num == ER_DUP_ENTRY || error_num == ER_DUP_KEY || error_num == HA_ERR_FOUND_DUPP_KEY ); DBUG_PRINT("info",("spider dup_entry=%s", dup_entry ? "TRUE" : "FALSE")); DBUG_RETURN(dup_entry); } bool spider_db_mbase::is_xa_nota_error( int error_num ) { bool xa_nota; DBUG_ENTER("spider_db_mbase::is_xa_nota_error"); DBUG_PRINT("info",("spider this=%p", this)); xa_nota = ( error_num == ER_XAER_NOTA || error_num == ER_XA_RBTIMEOUT || error_num == ER_XA_RBDEADLOCK ); DBUG_PRINT("info",("spider xa_nota=%s", xa_nota ? "TRUE" : "FALSE")); DBUG_RETURN(xa_nota); } int spider_db_mbase::fetch_and_print_warnings(struct tm *l_time) { int error_num = 0; DBUG_ENTER("spider_db_mbase::fetch_and_print_warnings"); DBUG_PRINT("info",("spider this=%p", this)); if (spider_param_dry_access() || db_conn->status != MYSQL_STATUS_READY || db_conn->server_status & SERVER_MORE_RESULTS_EXISTS || !db_conn->warning_count) DBUG_RETURN(0); if (mysql_real_query(db_conn, SPIDER_SQL_SHOW_WARNINGS_STR, SPIDER_SQL_SHOW_WARNINGS_LEN)) DBUG_RETURN(0); MYSQL_RES *res= mysql_store_result(db_conn); if (!res) DBUG_RETURN(0); uint num_fields= mysql_num_fields(res); if (num_fields != 3) { mysql_free_result(res); DBUG_RETURN(0); } MYSQL_ROW row= mysql_fetch_row(res); if (l_time) { while (row) { fprintf(stderr, "%04d%02d%02d %02d:%02d:%02d [WARN SPIDER RESULT] from [%s] %ld " "to %ld: %s %s %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, conn->tgt_host, (ulong) db_conn->thread_id, (ulong) current_thd->thread_id, row[0], row[1], row[2]); row= mysql_fetch_row(res); } } else { while (row) { DBUG_PRINT("info",("spider row[0]=%s", row[0])); DBUG_PRINT("info",("spider row[1]=%s", row[1])); DBUG_PRINT("info",("spider row[2]=%s", row[2])); longlong res_num = (longlong) my_strtoll10(row[1], (char**) NULL, &error_num); DBUG_PRINT("info",("spider res_num=%lld", res_num)); my_printf_error((int) res_num, row[2], MYF(0)); error_num = (int) res_num; row = mysql_fetch_row(res); } } mysql_free_result(res); DBUG_RETURN(error_num); } 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_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_mbase_result(this))) { *error_num = 0; if ( spider_param_dry_access() || !(result->db_result = mysql_store_result(db_conn)) ) { delete result; result = NULL; } else { result->first_row = result->db_result->data_cursor; DBUG_PRINT("info",("spider result->first_row=%p", result->first_row)); } } else { *error_num = HA_ERR_OUT_OF_MEM; } DBUG_RETURN(result); } spider_db_result *spider_db_mbase::use_result( ha_spider *spider, st_spider_db_request_key *request_key, int *error_num ) { spider_db_mbase_result *result; DBUG_ENTER("spider_db_mbase::use_result"); DBUG_PRINT("info",("spider this=%p", this)); if ((result = new spider_db_mbase_result(this))) { *error_num = 0; if ( spider_param_dry_access() || !(result->db_result = db_conn->methods->use_result(db_conn)) ) { delete result; result = NULL; } else { result->first_row = NULL; } } else { *error_num = HA_ERR_OUT_OF_MEM; } DBUG_RETURN(result); } int spider_db_mbase::next_result() { int status; DBUG_ENTER("spider_db_mbase::next_result"); DBUG_PRINT("info",("spider this=%p", this)); if (db_conn->status != MYSQL_STATUS_READY) { my_message(ER_SPIDER_UNKNOWN_NUM, ER_SPIDER_UNKNOWN_STR, MYF(0)); DBUG_RETURN(ER_SPIDER_UNKNOWN_NUM); } db_conn->net.last_errno = 0; db_conn->net.last_error[0] = '\0'; strmov(db_conn->net.sqlstate, "00000"); db_conn->affected_rows = ~(my_ulonglong) 0; if (db_conn->server_status & SERVER_MORE_RESULTS_EXISTS) { if ((status = db_conn->methods->read_query_result(db_conn)) > 0) DBUG_RETURN(spider_db_errorno(conn)); DBUG_RETURN(status); } DBUG_RETURN(-1); } uint spider_db_mbase::affected_rows() { MYSQL *last_used_con; DBUG_ENTER("spider_db_mbase::affected_rows"); DBUG_PRINT("info",("spider this=%p", this)); last_used_con = db_conn; DBUG_RETURN((uint) last_used_con->affected_rows); } uint spider_db_mbase::matched_rows() { MYSQL *last_used_con; DBUG_ENTER("spider_db_mysql::matched_rows"); DBUG_PRINT("info", ("spider this=%p", this)); last_used_con = db_conn; /* Rows matched: 65 Changed: 65 Warnings: 0 */ const char *info = last_used_con->info; if (!info) DBUG_RETURN(0); DBUG_PRINT("info", ("spider info=%s", info)); const char *begin = strstr(info, "Rows matched: "); if (!begin) DBUG_RETURN(0); DBUG_RETURN(atoi(begin + strlen("Rows matched: "))); } bool spider_db_mbase::inserted_info( spider_db_handler *handler, ha_copy_info *copy_info ) { MYSQL *last_used_con; uchar direct_insert_kind = ((spider_mbase_handler *) handler)->direct_insert_kind; DBUG_ENTER("spider_db_mysql::inserted_info"); DBUG_PRINT("info", ("spider this=%p", this)); if (direct_insert_kind == SPIDER_SQL_DIRECT_INSERT_KIND_INSERT) { DBUG_RETURN(TRUE); } last_used_con = db_conn; /* Records: 10 Duplicates: 4 Warnings: 0 */ const char *info = last_used_con->info; if (!info) DBUG_RETURN(FALSE); DBUG_PRINT("info", ("spider info=%s", info)); const char *begin = strstr(info, "Records: "); if (!begin) DBUG_RETURN(FALSE); begin += strlen("Records: "); uint records = atoi(begin); begin = strstr(begin, "Duplicates: "); if (!begin) DBUG_RETURN(FALSE); uint duplicates = atoi(begin + strlen("Duplicates: ")); copy_info->records+= records; switch (direct_insert_kind) { case SPIDER_SQL_DIRECT_INSERT_KIND_IGNORE: copy_info->copied+= duplicates; break; case SPIDER_SQL_DIRECT_INSERT_KIND_REPLACE: copy_info->copied+= records; copy_info->deleted+= duplicates; break; case SPIDER_SQL_DIRECT_INSERT_KIND_DUP_UPDATE: copy_info->touched+= (last_used_con->affected_rows - (duplicates * 2)); copy_info->copied+= (last_used_con->affected_rows - duplicates); copy_info->updated+= duplicates; break; default: DBUG_ASSERT(0); DBUG_RETURN(FALSE); } DBUG_RETURN(TRUE); } ulonglong spider_db_mbase::last_insert_id() { MYSQL *last_used_con; DBUG_ENTER("spider_db_mbase::last_insert_id"); DBUG_PRINT("info",("spider this=%p", this)); last_used_con = db_conn; DBUG_RETURN((uint) last_used_con->insert_id); } int spider_db_mbase::set_character_set( const char *csname ) { 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_mbase::select_db( const char *dbname ) { 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_mbase::consistent_snapshot( int *need_mon ) { 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); 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; if (spider_db_query( conn, SPIDER_SQL_START_CONSISTENT_SNAPSHOT_STR, SPIDER_SQL_START_CONSISTENT_SNAPSHOT_LEN, -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_RETURN(spider_db_errorno(conn)); } 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); } bool spider_db_mbase::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_mbase::start_transaction( int *need_mon ) { 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); DBUG_ASSERT(conn->mta_conn_mutex_unlock_later); if (spider_db_query( conn, SPIDER_SQL_START_TRANSACTION_STR, SPIDER_SQL_START_TRANSACTION_LEN, -1, need_mon) ) { DBUG_RETURN(spider_db_errorno(conn)); } DBUG_RETURN(0); } int spider_db_mbase::commit( int *need_mon ) { 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); 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; if (spider_db_query( conn, SPIDER_SQL_COMMIT_STR, SPIDER_SQL_COMMIT_LEN, -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_RETURN(spider_db_errorno(conn)); } 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::rollback( int *need_mon ) { bool is_error; int error_num; 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); 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; if (spider_db_query( conn, SPIDER_SQL_ROLLBACK_STR, SPIDER_SQL_ROLLBACK_LEN, -1, need_mon) ) { is_error = conn->thd->is_error(); error_num = spider_db_errorno(conn); if ( error_num == ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM && !is_error ) conn->thd->clear_error(); 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_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; SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos); pthread_mutex_unlock(&conn->mta_conn_mutex); DBUG_RETURN(0); } int spider_db_mbase::xa_start( XID *xid, int *need_mon ) { DBUG_ENTER("spider_db_mbase::xa_start"); DBUG_PRINT("info",("spider this=%p", this)); DBUG_ASSERT(0); DBUG_RETURN(0); } bool spider_db_mbase::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_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_mbase::xa_end"); DBUG_PRINT("info",("spider this=%p", this)); sql_str.init_calc_mem(108); sql_str.length(0); sql_str.q_append(SPIDER_SQL_XA_END_STR, SPIDER_SQL_XA_END_LEN); spider_db_append_xid_str(&sql_str, xid); 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; if (spider_db_query( conn, sql_str.ptr(), sql_str.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_RETURN(spider_db_errorno(conn)); } 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::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_mbase::xa_prepare"); DBUG_PRINT("info",("spider this=%p", this)); sql_str.init_calc_mem(109); sql_str.length(0); sql_str.q_append(SPIDER_SQL_XA_PREPARE_STR, SPIDER_SQL_XA_PREPARE_LEN); spider_db_append_xid_str(&sql_str, xid); 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; if (spider_db_query( conn, sql_str.ptr(), sql_str.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_RETURN(spider_db_errorno(conn)); } 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::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_mbase::xa_commit"); DBUG_PRINT("info",("spider this=%p", this)); sql_str.init_calc_mem(110); sql_str.length(0); sql_str.q_append(SPIDER_SQL_XA_COMMIT_STR, SPIDER_SQL_XA_COMMIT_LEN); spider_db_append_xid_str(&sql_str, xid); 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; if (spider_db_query( conn, sql_str.ptr(), sql_str.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_RETURN(spider_db_errorno(conn)); } 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::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_mbase::xa_rollback"); DBUG_PRINT("info",("spider this=%p", this)); sql_str.init_calc_mem(111); sql_str.length(0); sql_str.q_append(SPIDER_SQL_XA_ROLLBACK_STR, SPIDER_SQL_XA_ROLLBACK_LEN); spider_db_append_xid_str(&sql_str, xid); 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; if (spider_db_query( conn, sql_str.ptr(), sql_str.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_RETURN(spider_db_errorno(conn)); } 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); } bool spider_db_mbase::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_mbase::set_trx_isolation( int trx_isolation, int *need_mon ) { DBUG_ENTER("spider_db_mbase::set_trx_isolation"); DBUG_PRINT("info",("spider this=%p", this)); switch (trx_isolation) { case ISO_READ_UNCOMMITTED: 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; if (spider_db_query( conn, SPIDER_SQL_ISO_READ_UNCOMMITTED_STR, SPIDER_SQL_ISO_READ_UNCOMMITTED_LEN, -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_RETURN(spider_db_errorno(conn)); } 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); break; case ISO_READ_COMMITTED: 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; if (spider_db_query( conn, SPIDER_SQL_ISO_READ_COMMITTED_STR, SPIDER_SQL_ISO_READ_COMMITTED_LEN, -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_RETURN(spider_db_errorno(conn)); } 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); break; case ISO_REPEATABLE_READ: 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; if (spider_db_query( conn, SPIDER_SQL_ISO_REPEATABLE_READ_STR, SPIDER_SQL_ISO_REPEATABLE_READ_LEN, -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_RETURN(spider_db_errorno(conn)); } 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); break; case ISO_SERIALIZABLE: 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; if (spider_db_query( conn, SPIDER_SQL_ISO_SERIALIZABLE_STR, SPIDER_SQL_ISO_SERIALIZABLE_LEN, -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_RETURN(spider_db_errorno(conn)); } 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); break; default: DBUG_RETURN(HA_ERR_UNSUPPORTED); } DBUG_RETURN(0); } bool spider_db_mbase::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_mbase::set_autocommit( bool autocommit, int *need_mon ) { DBUG_ENTER("spider_db_mbase::set_autocommit"); DBUG_PRINT("info",("spider this=%p", this)); if (autocommit) { 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; if (spider_db_query( conn, SPIDER_SQL_AUTOCOMMIT_ON_STR, SPIDER_SQL_AUTOCOMMIT_ON_LEN, -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_RETURN(spider_db_errorno(conn)); } 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); } else { 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; if (spider_db_query( conn, SPIDER_SQL_AUTOCOMMIT_OFF_STR, SPIDER_SQL_AUTOCOMMIT_OFF_LEN, -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_RETURN(spider_db_errorno(conn)); } 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); } bool spider_db_mbase::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_mbase::set_sql_log_off( bool sql_log_off, int *need_mon ) { DBUG_ENTER("spider_db_mbase::set_sql_log_off"); DBUG_PRINT("info",("spider this=%p", this)); if (sql_log_off) { 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; if (spider_db_query( conn, SPIDER_SQL_SQL_LOG_ON_STR, SPIDER_SQL_SQL_LOG_ON_LEN, -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_RETURN(spider_db_errorno(conn)); } 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); } else { 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; if (spider_db_query( conn, SPIDER_SQL_SQL_LOG_OFF_STR, SPIDER_SQL_SQL_LOG_OFF_LEN, -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_RETURN(spider_db_errorno(conn)); } 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); } bool spider_db_mbase::set_wait_timeout_in_bulk_sql() { DBUG_ENTER("spider_db_mbase::set_wait_timeout_in_bulk_sql"); DBUG_PRINT("info",("spider this=%p", this)); DBUG_RETURN(TRUE); } int spider_db_mbase::set_wait_timeout( int wait_timeout, int *need_mon ) { char sql_buf[MAX_FIELD_WIDTH]; char timeout_str[SPIDER_SQL_INT_LEN]; int timeout_str_length; spider_string sql_str(sql_buf, sizeof(sql_buf), &my_charset_bin); DBUG_ENTER("spider_db_mbase::set_wait_timeout"); DBUG_PRINT("info",("spider this=%p", this)); sql_str.init_calc_mem(264); sql_str.length(0); timeout_str_length = my_sprintf(timeout_str, (timeout_str, "%d", wait_timeout)); if (sql_str.reserve(SPIDER_SQL_WAIT_TIMEOUT_LEN + timeout_str_length)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); sql_str.q_append(SPIDER_SQL_WAIT_TIMEOUT_STR, SPIDER_SQL_WAIT_TIMEOUT_LEN); sql_str.q_append(timeout_str, timeout_str_length); 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; if (spider_db_query( conn, sql_str.ptr(), sql_str.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_RETURN(spider_db_errorno(conn)); } 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); } bool spider_db_mbase::set_sql_mode_in_bulk_sql() { DBUG_ENTER("spider_db_mbase::set_sql_mode_in_bulk_sql"); DBUG_PRINT("info",("spider this=%p", this)); DBUG_RETURN(TRUE); } int spider_db_mbase::set_sql_mode( sql_mode_t sql_mode, int *need_mon ) { int error_num; char sql_buf[MAX_FIELD_WIDTH]; spider_string sql_str(sql_buf, sizeof(sql_buf), &my_charset_bin); DBUG_ENTER("spider_db_mbase::set_sql_mode"); DBUG_PRINT("info",("spider this=%p", this)); sql_str.init_calc_mem(265); sql_str.length(0); if (sql_str.reserve(SPIDER_SQL_SQL_MODE_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); sql_str.q_append(SPIDER_SQL_SQL_MODE_STR, SPIDER_SQL_SQL_MODE_LEN); if ((error_num = spider_db_mbase_utility->append_sql_mode_internal(&sql_str, sql_mode))) { DBUG_RETURN(error_num); } if (sql_str.length() > SPIDER_SQL_SQL_MODE_LEN) { sql_str.length(sql_str.length() - SPIDER_SQL_COMMA_LEN); } else { if (sql_str.reserve(SPIDER_SQL_VALUE_QUOTE_LEN)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } } sql_str.q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN); 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; if (spider_db_query( conn, sql_str.ptr(), sql_str.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_RETURN(spider_db_errorno(conn)); } 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); } bool spider_db_mbase::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_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_mbase::set_time_zone"); DBUG_PRINT("info",("spider this=%p", this)); sql_str.init_calc_mem(214); sql_str.length(0); if (sql_str.reserve(SPIDER_SQL_TIME_ZONE_LEN + tz_str->length() + SPIDER_SQL_VALUE_QUOTE_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); sql_str.q_append(SPIDER_SQL_TIME_ZONE_STR, SPIDER_SQL_TIME_ZONE_LEN); sql_str.q_append(tz_str->ptr(), tz_str->length()); sql_str.q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN); 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; if (spider_db_query( conn, sql_str.ptr(), sql_str.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_RETURN(spider_db_errorno(conn)); } 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); } bool spider_db_mbase::set_loop_check_in_bulk_sql() { DBUG_ENTER("spider_db_mbase::set_loop_check_in_bulk_sql"); DBUG_PRINT("info",("spider this=%p", this)); DBUG_RETURN(TRUE); } int spider_db_mbase::set_loop_check( int *need_mon ) { SPIDER_CONN_LOOP_CHECK *lcptr; char sql_buf[MAX_FIELD_WIDTH]; spider_string sql_str(sql_buf, sizeof(sql_buf), &my_charset_bin); DBUG_ENTER("spider_db_mbase::set_loop_check"); DBUG_PRINT("info",("spider this=%p", this)); sql_str.init_calc_mem(270); while ((lcptr = (SPIDER_CONN_LOOP_CHECK *) my_hash_element( &conn->loop_check_queue, 0))) { sql_str.length(0); if (sql_str.reserve(SPIDER_SQL_SET_USER_VAL_LEN + SPIDER_SQL_LOP_CHK_PRM_PRF_LEN + lcptr->to_name.length + SPIDER_SQL_NAME_QUOTE_LEN + SPIDER_SQL_EQUAL_LEN + SPIDER_SQL_VALUE_QUOTE_LEN + lcptr->merged_value.length + SPIDER_SQL_VALUE_QUOTE_LEN)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } sql_str.q_append(SPIDER_SQL_SET_USER_VAL_STR, SPIDER_SQL_SET_USER_VAL_LEN); sql_str.q_append(SPIDER_SQL_LOP_CHK_PRM_PRF_STR, SPIDER_SQL_LOP_CHK_PRM_PRF_LEN); sql_str.q_append(lcptr->to_name.str, lcptr->to_name.length); sql_str.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN); sql_str.q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN); sql_str.q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN); sql_str.q_append(lcptr->merged_value.str, lcptr->merged_value.length); sql_str.q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN); 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; if (spider_db_query( conn, sql_str.ptr(), sql_str.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_RETURN(spider_db_errorno(conn)); } 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); my_hash_delete(&conn->loop_check_queue, (uchar*) lcptr); } DBUG_RETURN(0); } int spider_db_mbase::fin_loop_check() { st_spider_conn_loop_check *lcptr; DBUG_ENTER("spider_db_mbase::fin_loop_check"); DBUG_PRINT("info",("spider this=%p", this)); if (conn->loop_check_queue.records) { uint l = 0; while ((lcptr = (SPIDER_CONN_LOOP_CHECK *) my_hash_element( &conn->loop_check_queue, l))) { lcptr->flag = 0; ++l; } my_hash_reset(&conn->loop_check_queue); } lcptr = conn->loop_check_ignored_first; while (lcptr) { lcptr->flag = 0; lcptr = lcptr->next; } conn->loop_check_ignored_first = NULL; lcptr = conn->loop_check_meraged_first; while (lcptr) { lcptr->flag = 0; lcptr = lcptr->next; } conn->loop_check_meraged_first = NULL; 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(>id_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); } size_t spider_db_mbase::escape_string( char *to, const char *from, size_t from_length ) { my_bool overflow; 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, from, from_length, &overflow)); DBUG_RETURN(escape_string_for_mysql(db_conn->charset, to, 0, from, from_length, &overflow)); } bool spider_db_mbase::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_mbase::append_lock_tables( spider_string *str ) { int error_num; ha_spider *tmp_spider; int lock_type; uint conn_link_idx; int tmp_link_idx; SPIDER_LINK_FOR_HASH *tmp_link_for_hash; const char *db_name; uint db_name_length; CHARSET_INFO *db_name_charset; const char *table_name; uint table_name_length; CHARSET_INFO *table_name_charset; DBUG_ENTER("spider_db_mbase::lock_tables"); DBUG_PRINT("info",("spider this=%p", this)); if ((error_num = spider_db_mbase_utility->append_lock_table_head(str))) { DBUG_RETURN(error_num); } while ((tmp_link_for_hash = (SPIDER_LINK_FOR_HASH *) my_hash_element(&lock_table_hash, 0))) { tmp_spider = tmp_link_for_hash->spider; tmp_link_idx = tmp_link_for_hash->link_idx; switch (tmp_spider->wide_handler->lock_type) { case TL_READ: lock_type = SPIDER_DB_TABLE_LOCK_READ_LOCAL; break; case TL_READ_NO_INSERT: lock_type = SPIDER_DB_TABLE_LOCK_READ; break; case TL_WRITE_LOW_PRIORITY: lock_type = SPIDER_DB_TABLE_LOCK_LOW_PRIORITY_WRITE; break; case TL_WRITE: lock_type = SPIDER_DB_TABLE_LOCK_WRITE; break; default: // no lock DBUG_PRINT("info",("spider lock_type=%d", tmp_spider->wide_handler->lock_type)); DBUG_RETURN(0); } conn_link_idx = tmp_spider->conn_link_idx[tmp_link_idx]; spider_mbase_share *db_share = (spider_mbase_share *) tmp_spider->share->dbton_share[conn->dbton_id]; db_name = db_share->db_names_str[conn_link_idx].ptr(); db_name_length = db_share->db_names_str[conn_link_idx].length(); db_name_charset = tmp_spider->share->access_charset; table_name = db_share->table_names_str[conn_link_idx].ptr(); table_name_length = db_share->table_names_str[conn_link_idx].length(); table_name_charset = tmp_spider->share->access_charset; if ((error_num = spider_db_mbase_utility-> append_lock_table_body( str, db_name, db_name_length, db_name_charset, table_name, table_name_length, table_name_charset, lock_type ) )) { my_hash_reset(&lock_table_hash); DBUG_RETURN(error_num); } my_hash_delete(&lock_table_hash, (uchar*) tmp_link_for_hash); } if ((error_num = spider_db_mbase_utility->append_lock_table_tail(str))) { DBUG_RETURN(error_num); } DBUG_RETURN(0); } int spider_db_mbase::append_unlock_tables( spider_string *str ) { int error_num; DBUG_ENTER("spider_db_mbase::append_unlock_tables"); DBUG_PRINT("info",("spider this=%p", this)); if ((error_num = spider_db_mbase_utility->append_unlock_table(str))) { DBUG_RETURN(error_num); } DBUG_RETURN(0); } uint spider_db_mbase::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_mbase::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; } void spider_db_mbase::set_dup_key_idx( ha_spider *spider, int link_idx ) { TABLE *table = spider->get_table(); uint roop_count, pk_idx = table->s->primary_key; int key_name_length; int max_length = 0; 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++) { if (roop_count == pk_idx) { DBUG_PRINT("info",("spider pk_idx=%u", roop_count)); int all_link_idx = spider->conn_link_idx[link_idx]; key_name = spider->share->tgt_pk_names[all_link_idx]; key_name_length = spider->share->tgt_pk_names_lengths[all_link_idx]; } else { key_name = table->key_info[roop_count].name.str; key_name_length = table->key_info[roop_count].name.length; } DBUG_PRINT("info",("spider key_name=%s", key_name)); if ( max_length < key_name_length && conn->error_length - 1 >= key_name_length && *(conn->error_str + conn->error_length - 2 - key_name_length) == '\'' && !strncasecmp(conn->error_str + conn->error_length - 1 - key_name_length, key_name, key_name_length) ) { max_length = key_name_length; spider->dup_key_idx = roop_count; } } if (max_length == 0) spider->dup_key_idx = (uint) -1; DBUG_PRINT("info",("spider dup_key_idx=%d", spider->dup_key_idx)); DBUG_VOID_RETURN; } bool spider_db_mbase::cmp_request_key_to_snd( st_spider_db_request_key *request_key ) { DBUG_ENTER("spider_db_mbase::cmp_request_key_to_snd"); DBUG_PRINT("info",("spider this=%p", this)); DBUG_RETURN(TRUE); } 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"); DBUG_PRINT("info",("spider this=%p", this)); DBUG_VOID_RETURN; } 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_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_mbase_util::append_name_with_charset( spider_string *str, const char *name, uint name_length, CHARSET_INFO *name_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); str->append(name, name_length, name_charset); if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN); DBUG_RETURN(0); } int spider_db_mbase_util::append_escaped_name( spider_string *str, const char *name, uint name_length ) { int error_num; DBUG_ENTER("spider_db_mbase_util::append_name"); 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); if ((error_num = spider_db_append_name_with_quote_str_internal( str, name, name_length, dbton_id))) { DBUG_RETURN(error_num); } if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN); DBUG_RETURN(0); } int spider_db_mbase_util::append_escaped_name_with_charset( spider_string *str, const char *name, uint name_length, CHARSET_INFO *name_charset ) { int error_num; 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); if ((error_num = spider_db_append_name_with_quote_str_internal( str, name, name_length, name_charset, dbton_id))) { DBUG_RETURN(error_num); } if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN); DBUG_RETURN(0); } bool spider_db_mbase_util::is_name_quote( const char head_code ) { DBUG_ENTER("spider_db_mbase_util::is_name_quote"); DBUG_RETURN(head_code == *name_quote_str); } int spider_db_mbase_util::append_escaped_name_quote( spider_string *str ) { 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); str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN); DBUG_RETURN(0); } int spider_db_mariadb_util::append_column_value(ha_spider *spider, spider_string *str, Field *field, const uchar *new_ptr, bool is_like, CHARSET_INFO *access_charset) { bool float_value = FALSE; int error_num; char buf[MAX_FIELD_WIDTH]; spider_string tmp_str(buf, MAX_FIELD_WIDTH, field->charset()); String *ptr; uint length; THD *thd = field->table->in_use; Time_zone *saved_time_zone = thd->variables.time_zone; DBUG_ENTER("spider_db_mariadb_util::append_column_value"); tmp_str.init_calc_mem(113); thd->variables.time_zone = UTC; if (new_ptr) { if ( field->type() == MYSQL_TYPE_BLOB || field->real_type() == MYSQL_TYPE_VARCHAR ) { length = uint2korr(new_ptr); tmp_str.set((char *) new_ptr + HA_KEY_BLOB_LENGTH, length, field->charset()); ptr = tmp_str.get_str(); } else if (field->type() == MYSQL_TYPE_GEOMETRY) { #ifdef DBUG_TRACE double xmin, xmax, ymin, ymax; float8get(xmin, new_ptr); float8get(xmax, new_ptr + 8); float8get(ymin, new_ptr + 16); float8get(ymax, new_ptr + 24); DBUG_PRINT("info", ("spider geo is %f %f %f %f", xmin, xmax, ymin, ymax)); #endif tmp_str.length(0); tmp_str.q_append((char *) SPIDER_SQL_LINESTRING_HEAD_STR, SPIDER_SQL_LINESTRING_HEAD_LEN); tmp_str.q_append((char *) new_ptr, SIZEOF_STORED_DOUBLE); tmp_str.q_append((char *) new_ptr + SIZEOF_STORED_DOUBLE * 2, SIZEOF_STORED_DOUBLE); tmp_str.q_append((char *) new_ptr + SIZEOF_STORED_DOUBLE, SIZEOF_STORED_DOUBLE); tmp_str.q_append((char *) new_ptr + SIZEOF_STORED_DOUBLE * 3, SIZEOF_STORED_DOUBLE); ptr = tmp_str.get_str(); } else { ptr = field->val_str(tmp_str.get_str(), new_ptr); tmp_str.mem_calc(); } } else { ptr = field->val_str(tmp_str.get_str()); tmp_str.mem_calc(); if (field->type() == MYSQL_TYPE_FLOAT) { float_value = TRUE; } } 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())); if (field->result_type() == STRING_RESULT) { DBUG_PRINT("info", ("spider STRING_RESULT")); if (str->charset() != field->charset()) { if ((error_num = spider_db_append_charset_name_before_string(str, field->charset()))) { DBUG_RETURN(error_num); } } 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 ( field->type() == MYSQL_TYPE_VARCHAR || (field->type() >= MYSQL_TYPE_ENUM && field->type() <= MYSQL_TYPE_GEOMETRY) ) { DBUG_PRINT("info", ("spider append_escaped")); char buf2[MAX_FIELD_WIDTH]; spider_string tmp_str2(buf2, MAX_FIELD_WIDTH, field->charset()); tmp_str2.init_calc_mem(114); tmp_str2.length(0); if ( tmp_str2.append(ptr->ptr(), ptr->length(), field->charset()) || str->reserve(tmp_str2.length() * 2) || append_escaped_util(str, tmp_str2.get_str()) ) DBUG_RETURN(HA_ERR_OUT_OF_MEM); if (is_like && str->append(SPIDER_SQL_PERCENT_STR, SPIDER_SQL_PERCENT_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); } else if (str->append(*ptr)) 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 (field->str_needs_quotes()) { if (str->charset() != field->charset()) { if ((error_num = spider_db_append_charset_name_before_string(str, field->charset()))) { DBUG_RETURN(error_num); } } if (str->reserve(SPIDER_SQL_VALUE_QUOTE_LEN * 2 + ptr->length() * 2 + 2)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN); append_escaped_util(str, ptr); str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN); } else if (float_value) { if (str->reserve(SPIDER_SQL_CAST_LEN + ptr->length() + SPIDER_SQL_AS_FLOAT_LEN + SPIDER_SQL_CLOSE_PAREN_LEN)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN); str->q_append(ptr->ptr(), ptr->length()); str->q_append(SPIDER_SQL_AS_FLOAT_STR, SPIDER_SQL_AS_FLOAT_LEN); str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN); } else if (str->append(*ptr)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } DBUG_RETURN(0); } int spider_db_mysql_util::append_column_value( ha_spider *spider, spider_string *str, Field *field, const uchar *new_ptr, bool is_like, CHARSET_INFO *access_charset ) { bool float_value = FALSE; int error_num; char buf[MAX_FIELD_WIDTH]; spider_string tmp_str(buf, MAX_FIELD_WIDTH, field->charset()); String *ptr; uint length; THD *thd = field->table->in_use; Time_zone *saved_time_zone = thd->variables.time_zone; DBUG_ENTER("spider_db_mysql_util::append_column_value"); tmp_str.init_calc_mem(266); thd->variables.time_zone = UTC; if (new_ptr) { if ( field->type() == MYSQL_TYPE_BLOB || field->real_type() == MYSQL_TYPE_VARCHAR ) { length = uint2korr(new_ptr); tmp_str.set((char *) new_ptr + HA_KEY_BLOB_LENGTH, length, field->charset()); ptr = tmp_str.get_str(); } else if (field->type() == MYSQL_TYPE_GEOMETRY) { /* uint mlength = SIZEOF_STORED_DOUBLE, lcnt; uchar *dest = (uchar *) buf; const uchar *source; for (lcnt = 0; lcnt < 4; lcnt++) { mlength = SIZEOF_STORED_DOUBLE; source = new_ptr + mlength + SIZEOF_STORED_DOUBLE * lcnt; while (mlength--) *dest++ = *--source; } tmp_str.length(SIZEOF_STORED_DOUBLE * lcnt); */ #ifdef DBUG_TRACE double xmin, xmax, ymin, ymax; /* float8store(buf,xmin); float8store(buf+8,xmax); float8store(buf+16,ymin); float8store(buf+24,ymax); memcpy(&xmin,new_ptr,sizeof(xmin)); memcpy(&xmax,new_ptr + 8,sizeof(xmax)); memcpy(&ymin,new_ptr + 16,sizeof(ymin)); memcpy(&ymax,new_ptr + 24,sizeof(ymax)); float8get(xmin, buf); float8get(xmax, buf + 8); float8get(ymin, buf + 16); float8get(ymax, buf + 24); DBUG_PRINT("info", ("spider geo is %f %f %f %f", xmin, xmax, ymin, ymax)); DBUG_PRINT("info", ("spider geo is %.14g %.14g %.14g %.14g", xmin, xmax, ymin, ymax)); */ float8get(xmin, new_ptr); float8get(xmax, new_ptr + 8); float8get(ymin, new_ptr + 16); float8get(ymax, new_ptr + 24); DBUG_PRINT("info", ("spider geo is %f %f %f %f", xmin, xmax, ymin, ymax)); /* float8get(xmin, new_ptr + SIZEOF_STORED_DOUBLE * 4); float8get(xmax, new_ptr + SIZEOF_STORED_DOUBLE * 5); float8get(ymin, new_ptr + SIZEOF_STORED_DOUBLE * 6); float8get(ymax, new_ptr + SIZEOF_STORED_DOUBLE * 7); DBUG_PRINT("info", ("spider geo is %f %f %f %f", xmin, xmax, ymin, ymax)); float8get(xmin, new_ptr + SIZEOF_STORED_DOUBLE * 8); float8get(xmax, new_ptr + SIZEOF_STORED_DOUBLE * 9); float8get(ymin, new_ptr + SIZEOF_STORED_DOUBLE * 10); float8get(ymax, new_ptr + SIZEOF_STORED_DOUBLE * 11); DBUG_PRINT("info", ("spider geo is %f %f %f %f", xmin, xmax, ymin, ymax)); float8get(xmin, new_ptr + SIZEOF_STORED_DOUBLE * 12); float8get(xmax, new_ptr + SIZEOF_STORED_DOUBLE * 13); float8get(ymin, new_ptr + SIZEOF_STORED_DOUBLE * 14); float8get(ymax, new_ptr + SIZEOF_STORED_DOUBLE * 15); DBUG_PRINT("info", ("spider geo is %f %f %f %f", xmin, xmax, ymin, ymax)); */ #endif /* tmp_str.set((char *) new_ptr, SIZEOF_STORED_DOUBLE * 4, &my_charset_bin); */ tmp_str.length(0); tmp_str.q_append((char *) SPIDER_SQL_LINESTRING_HEAD_STR, SPIDER_SQL_LINESTRING_HEAD_LEN); tmp_str.q_append((char *) new_ptr, SIZEOF_STORED_DOUBLE); tmp_str.q_append((char *) new_ptr + SIZEOF_STORED_DOUBLE * 2, SIZEOF_STORED_DOUBLE); tmp_str.q_append((char *) new_ptr + SIZEOF_STORED_DOUBLE, SIZEOF_STORED_DOUBLE); tmp_str.q_append((char *) new_ptr + SIZEOF_STORED_DOUBLE * 3, SIZEOF_STORED_DOUBLE); ptr = tmp_str.get_str(); } else { ptr = field->val_str(tmp_str.get_str(), new_ptr); tmp_str.mem_calc(); } } else { ptr = field->val_str(tmp_str.get_str()); tmp_str.mem_calc(); if (field->type() == MYSQL_TYPE_FLOAT) { float_value = TRUE; } } 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())); /* if ( field->type() == MYSQL_TYPE_BIT || (field->type() >= MYSQL_TYPE_TINY_BLOB && field->type() <= MYSQL_TYPE_BLOB) ) { uchar *hex_ptr = (uchar *) ptr->ptr(), *end_ptr; char *str_ptr; DBUG_PRINT("info", ("spider HEX")); if (str->reserve(SPIDER_SQL_HEX_LEN + ptr->length() * 2)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_HEX_STR, SPIDER_SQL_HEX_LEN); str_ptr = (char *) str->ptr() + str->length(); for (end_ptr = hex_ptr + ptr->length(); hex_ptr < end_ptr; hex_ptr++) { *str_ptr++ = spider_dig_upper[(*hex_ptr) >> 4]; *str_ptr++ = spider_dig_upper[(*hex_ptr) & 0x0F]; } str->length(str->length() + ptr->length() * 2); } else */ if (field->result_type() == STRING_RESULT) { DBUG_PRINT("info", ("spider STRING_RESULT")); if (str->charset() != field->charset()) { if ((error_num = spider_db_append_charset_name_before_string(str, field->charset()))) { DBUG_RETURN(error_num); } } 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 ( field->type() == MYSQL_TYPE_VARCHAR || (field->type() >= MYSQL_TYPE_ENUM && field->type() <= MYSQL_TYPE_GEOMETRY) ) { DBUG_PRINT("info", ("spider append_escaped")); char buf2[MAX_FIELD_WIDTH]; spider_string tmp_str2(buf2, MAX_FIELD_WIDTH, field->charset()); tmp_str2.init_calc_mem(267); tmp_str2.length(0); if ( tmp_str2.append(ptr->ptr(), ptr->length(), field->charset()) || str->reserve(tmp_str2.length() * 2) || append_escaped_util(str, tmp_str2.get_str()) ) DBUG_RETURN(HA_ERR_OUT_OF_MEM); if (is_like && str->append(SPIDER_SQL_PERCENT_STR, SPIDER_SQL_PERCENT_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); } else if (str->append(*ptr)) 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 (field->str_needs_quotes()) { if (str->charset() != field->charset()) { if ((error_num = spider_db_append_charset_name_before_string(str, field->charset()))) { DBUG_RETURN(error_num); } } if (str->reserve(SPIDER_SQL_VALUE_QUOTE_LEN * 2 + ptr->length() * 2 + 2)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN); append_escaped_util(str, ptr); str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN); } else if (float_value) { if (str->reserve(SPIDER_SQL_TO_FLOAT_LEN + ptr->length() + SPIDER_SQL_CLOSE_PAREN_LEN)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_SQL_TO_FLOAT_STR, SPIDER_SQL_TO_FLOAT_LEN); str->q_append(ptr->ptr(), ptr->length()); str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN); } else if (str->append(*ptr)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } DBUG_RETURN(0); } int spider_db_mbase_util::append_column_value(ha_spider *, spider_string *, Field *, const uchar *, bool, CHARSET_INFO *) { MY_ASSERT_UNREACHABLE(); return 0; } int spider_db_mbase_util::append_from_with_alias( spider_string *str, const char **table_names, uint *table_name_lengths, const char **table_aliases, uint *table_alias_lengths, uint table_count, int *table_name_pos, bool over_write ) { uint roop_count, length = 0; DBUG_ENTER("spider_db_mbase_util::append_from_with_alias"); DBUG_PRINT("info",("spider this=%p", this)); if (!over_write) { for (roop_count = 0; roop_count < table_count; roop_count++) length += table_name_lengths[roop_count] + SPIDER_SQL_SPACE_LEN + table_alias_lengths[roop_count] + SPIDER_SQL_COMMA_LEN; if (str->reserve(SPIDER_SQL_FROM_LEN + length)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN); *table_name_pos = str->length(); } for (roop_count = 0; roop_count < table_count; roop_count++) { str->q_append(table_names[roop_count], table_name_lengths[roop_count]); str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN); str->q_append(table_aliases[roop_count], table_alias_lengths[roop_count]); 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_mbase_util::append_trx_isolation( spider_string *str, int 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)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); if (str->length()) { str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN); } switch (trx_isolation) { case ISO_READ_UNCOMMITTED: str->q_append(SPIDER_SQL_ISO_READ_UNCOMMITTED_STR, SPIDER_SQL_ISO_READ_UNCOMMITTED_LEN); break; case ISO_READ_COMMITTED: str->q_append(SPIDER_SQL_ISO_READ_COMMITTED_STR, SPIDER_SQL_ISO_READ_COMMITTED_LEN); break; case ISO_REPEATABLE_READ: str->q_append(SPIDER_SQL_ISO_REPEATABLE_READ_STR, SPIDER_SQL_ISO_REPEATABLE_READ_LEN); break; case ISO_SERIALIZABLE: str->q_append(SPIDER_SQL_ISO_SERIALIZABLE_STR, SPIDER_SQL_ISO_SERIALIZABLE_LEN); break; default: DBUG_RETURN(HA_ERR_UNSUPPORTED); } DBUG_RETURN(0); } int spider_db_mbase_util::append_autocommit( spider_string *str, bool 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); if (str->length()) { str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN); } if (autocommit) { str->q_append(SPIDER_SQL_AUTOCOMMIT_ON_STR, SPIDER_SQL_AUTOCOMMIT_ON_LEN); } else { str->q_append(SPIDER_SQL_AUTOCOMMIT_OFF_STR, SPIDER_SQL_AUTOCOMMIT_OFF_LEN); } DBUG_RETURN(0); } int spider_db_mbase_util::append_sql_log_off( spider_string *str, bool 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); if (str->length()) { str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN); } if (sql_log_off) { str->q_append(SPIDER_SQL_SQL_LOG_ON_STR, SPIDER_SQL_SQL_LOG_ON_LEN); } else { str->q_append(SPIDER_SQL_SQL_LOG_OFF_STR, SPIDER_SQL_SQL_LOG_OFF_LEN); } DBUG_RETURN(0); } int spider_db_mbase_util::append_wait_timeout( spider_string *str, int wait_timeout ) { char timeout_str[SPIDER_SQL_INT_LEN]; int timeout_str_length; DBUG_ENTER("spider_db_mbase_util::append_wait_timeout"); DBUG_PRINT("info",("spider this=%p", this)); timeout_str_length = my_sprintf(timeout_str, (timeout_str, "%d", wait_timeout)); if (str->reserve(SPIDER_SQL_SEMICOLON_LEN + SPIDER_SQL_WAIT_TIMEOUT_LEN + timeout_str_length)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } if (str->length()) { str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN); } str->q_append(SPIDER_SQL_WAIT_TIMEOUT_STR, SPIDER_SQL_WAIT_TIMEOUT_LEN); str->q_append(timeout_str, timeout_str_length); DBUG_RETURN(0); } #define SPIDER_REAL_AS_FLOAT_STR "real_as_float" #define SPIDER_REAL_AS_FLOAT_LEN (sizeof(SPIDER_REAL_AS_FLOAT_STR) - 1) #define SPIDER_PIPES_AS_CONCAT_STR "pipes_as_concat" #define SPIDER_PIPES_AS_CONCAT_LEN (sizeof(SPIDER_PIPES_AS_CONCAT_STR) - 1) #define SPIDER_ANSI_QUOTES_STR "ansi_quotes" #define SPIDER_ANSI_QUOTES_LEN (sizeof(SPIDER_ANSI_QUOTES_STR) - 1) #define SPIDER_IGNORE_SPACE_STR "ignore_space" #define SPIDER_IGNORE_SPACE_LEN (sizeof(SPIDER_IGNORE_SPACE_STR) - 1) #define SPIDER_IGNORE_BAD_TABLE_OPTIONS_STR "ignore_bad_table_options" #define SPIDER_IGNORE_BAD_TABLE_OPTIONS_LEN (sizeof(SPIDER_IGNORE_BAD_TABLE_OPTIONS_STR) - 1) #define SPIDER_ONLY_FULL_GROUP_BY_STR "only_full_group_by" #define SPIDER_ONLY_FULL_GROUP_BY_LEN (sizeof(SPIDER_ONLY_FULL_GROUP_BY_STR) - 1) #define SPIDER_NO_UNSIGNED_SUBTRACTION_STR "no_unsigned_subtraction" #define SPIDER_NO_UNSIGNED_SUBTRACTION_LEN (sizeof(SPIDER_NO_UNSIGNED_SUBTRACTION_STR) - 1) #define SPIDER_NO_DIR_IN_CREATE_STR "no_dir_in_create" #define SPIDER_NO_DIR_IN_CREATE_LEN (sizeof(SPIDER_NO_DIR_IN_CREATE_STR) - 1) #define SPIDER_POSTGRESQL_STR "postgresql" #define SPIDER_POSTGRESQL_LEN (sizeof(SPIDER_POSTGRESQL_STR) - 1) #define SPIDER_ORACLE_STR "oracle" #define SPIDER_ORACLE_LEN (sizeof(SPIDER_ORACLE_STR) - 1) #define SPIDER_MSSQL_STR "mssql" #define SPIDER_MSSQL_LEN (sizeof(SPIDER_MSSQL_STR) - 1) #define SPIDER_DB2_STR "db2" #define SPIDER_DB2_LEN (sizeof(SPIDER_DB2_STR) - 1) #define SPIDER_MAXDB_STR "maxdb" #define SPIDER_MAXDB_LEN (sizeof(SPIDER_MAXDB_STR) - 1) #define SPIDER_NO_KEY_OPTIONS_STR "no_key_options" #define SPIDER_NO_KEY_OPTIONS_LEN (sizeof(SPIDER_NO_KEY_OPTIONS_STR) - 1) #define SPIDER_NO_TABLE_OPTIONS_STR "no_table_options" #define SPIDER_NO_TABLE_OPTIONS_LEN (sizeof(SPIDER_NO_TABLE_OPTIONS_STR) - 1) #define SPIDER_NO_FIELD_OPTIONS_STR "no_field_options" #define SPIDER_NO_FIELD_OPTIONS_LEN (sizeof(SPIDER_NO_FIELD_OPTIONS_STR) - 1) #define SPIDER_MYSQL323_STR "mysql323" #define SPIDER_MYSQL323_LEN (sizeof(SPIDER_MYSQL323_STR) - 1) #define SPIDER_MYSQL40_STR "mysql40" #define SPIDER_MYSQL40_LEN (sizeof(SPIDER_MYSQL40_STR) - 1) #define SPIDER_ANSI_STR "ansi" #define SPIDER_ANSI_LEN (sizeof(SPIDER_ANSI_STR) - 1) #define SPIDER_NO_AUTO_VALUE_ON_ZERO_STR "no_auto_value_on_zero" #define SPIDER_NO_AUTO_VALUE_ON_ZERO_LEN (sizeof(SPIDER_NO_AUTO_VALUE_ON_ZERO_STR) - 1) #define SPIDER_NO_BACKSLASH_ESCAPES_STR "no_backslash_escapes" #define SPIDER_NO_BACKSLASH_ESCAPES_LEN (sizeof(SPIDER_NO_BACKSLASH_ESCAPES_STR) - 1) #define SPIDER_STRICT_TRANS_TABLES_STR "strict_trans_tables" #define SPIDER_STRICT_TRANS_TABLES_LEN (sizeof(SPIDER_STRICT_TRANS_TABLES_STR) - 1) #define SPIDER_STRICT_ALL_TABLES_STR "strict_all_tables" #define SPIDER_STRICT_ALL_TABLES_LEN (sizeof(SPIDER_STRICT_ALL_TABLES_STR) - 1) #define SPIDER_NO_ZERO_IN_DATE_STR "no_zero_in_date" #define SPIDER_NO_ZERO_IN_DATE_LEN (sizeof(SPIDER_NO_ZERO_IN_DATE_STR) - 1) #define SPIDER_NO_ZERO_DATE_STR "no_zero_date" #define SPIDER_NO_ZERO_DATE_LEN (sizeof(SPIDER_NO_ZERO_DATE_STR) - 1) #define SPIDER_INVALID_DATES_STR "allow_invalid_dates" #define SPIDER_INVALID_DATES_LEN (sizeof(SPIDER_INVALID_DATES_STR) - 1) #define SPIDER_ERROR_FOR_DIVISION_BY_ZERO_STR "error_for_division_by_zero" #define SPIDER_ERROR_FOR_DIVISION_BY_ZERO_LEN (sizeof(SPIDER_ERROR_FOR_DIVISION_BY_ZERO_STR) - 1) #define SPIDER_TRADITIONAL_STR "traditional" #define SPIDER_TRADITIONAL_LEN (sizeof(SPIDER_TRADITIONAL_STR) - 1) #define SPIDER_NO_AUTO_CREATE_USER_STR "no_auto_create_user" #define SPIDER_NO_AUTO_CREATE_USER_LEN (sizeof(SPIDER_NO_AUTO_CREATE_USER_STR) - 1) #define SPIDER_HIGH_NOT_PRECEDENCE_STR "high_not_precedence" #define SPIDER_HIGH_NOT_PRECEDENCE_LEN (sizeof(SPIDER_HIGH_NOT_PRECEDENCE_STR) - 1) #define SPIDER_NO_ENGINE_SUBSTITUTION_STR "no_engine_substitution" #define SPIDER_NO_ENGINE_SUBSTITUTION_LEN (sizeof(SPIDER_NO_ENGINE_SUBSTITUTION_STR) - 1) #define SPIDER_PAD_CHAR_TO_FULL_LENGTH_STR "pad_char_to_full_length" #define SPIDER_PAD_CHAR_TO_FULL_LENGTH_LEN (sizeof(SPIDER_PAD_CHAR_TO_FULL_LENGTH_STR) - 1) #define SPIDER_EMPTY_STRING_IS_NULL_STR "empty_string_is_null" #define SPIDER_EMPTY_STRING_IS_NULL_LEN (sizeof(SPIDER_EMPTY_STRING_IS_NULL_STR) - 1) #define SPIDER_SIMULTANEOUS_ASSIGNMENT_STR "simultaneous_assignment" #define SPIDER_SIMULTANEOUS_ASSIGNMENT_LEN (sizeof(SPIDER_SIMULTANEOUS_ASSIGNMENT_STR) - 1) #define SPIDER_TIME_ROUND_FRACTIONAL_STR "time_round_fractional" #define SPIDER_TIME_ROUND_FRACTIONAL_LEN (sizeof(SPIDER_TIME_ROUND_FRACTIONAL_STR) - 1) sql_mode_t full_sql_mode = #ifdef MODE_REAL_AS_FLOAT MODE_REAL_AS_FLOAT | #endif #ifdef MODE_PIPES_AS_CONCAT MODE_PIPES_AS_CONCAT | #endif #ifdef MODE_ANSI_QUOTES MODE_ANSI_QUOTES | #endif #ifdef MODE_IGNORE_SPACE MODE_IGNORE_SPACE | #endif #ifdef MODE_IGNORE_BAD_TABLE_OPTIONS MODE_IGNORE_BAD_TABLE_OPTIONS | #endif #ifdef MODE_ONLY_FULL_GROUP_BY MODE_ONLY_FULL_GROUP_BY | #endif #ifdef MODE_NO_UNSIGNED_SUBTRACTION MODE_NO_UNSIGNED_SUBTRACTION | #endif #ifdef MODE_NO_DIR_IN_CREATE MODE_NO_DIR_IN_CREATE | #endif #ifdef MODE_POSTGRESQL MODE_POSTGRESQL | #endif #ifdef MODE_ORACLE MODE_ORACLE | #endif #ifdef MODE_MSSQL MODE_MSSQL | #endif #ifdef MODE_DB2 MODE_DB2 | #endif #ifdef MODE_MAXDB MODE_MAXDB | #endif #ifdef MODE_NO_KEY_OPTIONS MODE_NO_KEY_OPTIONS | #endif #ifdef MODE_NO_TABLE_OPTIONS MODE_NO_TABLE_OPTIONS | #endif #ifdef MODE_NO_FIELD_OPTIONS MODE_NO_FIELD_OPTIONS | #endif #ifdef MODE_MYSQL323 MODE_MYSQL323 | #endif #ifdef MODE_MYSQL40 MODE_MYSQL40 | #endif #ifdef MODE_ANSI MODE_ANSI | #endif #ifdef MODE_NO_AUTO_VALUE_ON_ZERO MODE_NO_AUTO_VALUE_ON_ZERO | #endif #ifdef MODE_NO_BACKSLASH_ESCAPES MODE_NO_BACKSLASH_ESCAPES | #endif #ifdef MODE_STRICT_TRANS_TABLES MODE_STRICT_TRANS_TABLES | #endif #ifdef MODE_STRICT_ALL_TABLES MODE_STRICT_ALL_TABLES | #endif #ifdef MODE_NO_ZERO_IN_DATE MODE_NO_ZERO_IN_DATE | #endif #ifdef MODE_NO_ZERO_DATE MODE_NO_ZERO_DATE | #endif #ifdef MODE_INVALID_DATES MODE_INVALID_DATES | #endif #ifdef MODE_ERROR_FOR_DIVISION_BY_ZERO MODE_ERROR_FOR_DIVISION_BY_ZERO | #endif #ifdef MODE_TRADITIONAL MODE_TRADITIONAL | #endif #ifdef MODE_NO_AUTO_CREATE_USER MODE_NO_AUTO_CREATE_USER | #endif #ifdef MODE_HIGH_NOT_PRECEDENCE MODE_HIGH_NOT_PRECEDENCE | #endif #ifdef MODE_NO_ENGINE_SUBSTITUTION MODE_NO_ENGINE_SUBSTITUTION | #endif #ifdef MODE_PAD_CHAR_TO_FULL_LENGTH MODE_PAD_CHAR_TO_FULL_LENGTH | #endif #ifdef MODE_EMPTY_STRING_IS_NULL MODE_EMPTY_STRING_IS_NULL | #endif #ifdef MODE_SIMULTANEOUS_ASSIGNMENT MODE_SIMULTANEOUS_ASSIGNMENT | #endif #ifdef MODE_TIME_ROUND_FRACTIONAL MODE_TIME_ROUND_FRACTIONAL | #endif 0; #ifdef MODE_REAL_AS_FLOAT /* pushdown */ #define SPIDER_SQL_MODE_REAL_AS_FLOAT #endif #ifdef MODE_PIPES_AS_CONCAT /* no pushdown */ #endif #ifdef MODE_ANSI_QUOTES /* no pushdown */ #endif #ifdef MODE_IGNORE_SPACE /* no pushdown */ #endif #ifdef MODE_IGNORE_BAD_TABLE_OPTIONS /* pushdown */ #define SPIDER_SQL_MODE_IGNORE_BAD_TABLE_OPTIONS #endif #ifdef MODE_ONLY_FULL_GROUP_BY /* no pushdown */ #endif #ifdef MODE_NO_UNSIGNED_SUBTRACTION /* pushdown */ #define SPIDER_SQL_MODE_NO_UNSIGNED_SUBTRACTION #endif #ifdef MODE_NO_DIR_IN_CREATE /* pushdown */ #define SPIDER_SQL_MODE_NO_DIR_IN_CREATE #endif #ifdef MODE_POSTGRESQL /* no pushdown */ #endif #ifdef MODE_ORACLE /* no pushdown */ #endif #ifdef MODE_MSSQL /* no pushdown */ #endif #ifdef MODE_DB2 /* no pushdown */ #endif #ifdef MODE_MAXDB /* no pushdown */ #endif #ifdef MODE_NO_KEY_OPTIONS /* no pushdown */ #endif #ifdef MODE_NO_TABLE_OPTIONS /* no pushdown */ #endif #ifdef MODE_NO_FIELD_OPTIONS /* no pushdown */ #endif #ifdef MODE_MYSQL323 /* no pushdown */ #endif #ifdef MODE_MYSQL40 /* no pushdown */ #endif #ifdef MODE_ANSI /* no pushdown */ #endif #ifdef MODE_NO_AUTO_VALUE_ON_ZERO /* pushdown */ #define SPIDER_SQL_MODE_NO_AUTO_VALUE_ON_ZERO #endif #ifdef MODE_NO_BACKSLASH_ESCAPES /* no pushdown */ #endif #ifdef MODE_STRICT_TRANS_TABLES /* pushdown */ #define SPIDER_SQL_MODE_STRICT_TRANS_TABLES #endif #ifdef MODE_STRICT_ALL_TABLES /* pushdown */ #define SPIDER_SQL_MODE_STRICT_ALL_TABLES #endif #ifdef MODE_NO_ZERO_IN_DATE /* pushdown */ #define SPIDER_SQL_MODE_NO_ZERO_IN_DATE #endif #ifdef MODE_NO_ZERO_DATE /* pushdown */ #define SPIDER_SQL_MODE_NO_ZERO_DATE #endif #ifdef MODE_INVALID_DATES /* pushdown */ #define SPIDER_SQL_MODE_INVALID_DATES #endif #ifdef MODE_ERROR_FOR_DIVISION_BY_ZERO /* pushdown */ #define SPIDER_SQL_MODE_ERROR_FOR_DIVISION_BY_ZERO #endif #ifdef MODE_TRADITIONAL /* no pushdown */ #endif #ifdef MODE_NO_AUTO_CREATE_USER /* pushdown */ #define SPIDER_SQL_MODE_NO_AUTO_CREATE_USER #endif #ifdef MODE_HIGH_NOT_PRECEDENCE /* pushdown */ #define SPIDER_SQL_MODE_HIGH_NOT_PRECEDENCE #endif #ifdef MODE_NO_ENGINE_SUBSTITUTION /* pushdown */ #define SPIDER_SQL_MODE_NO_ENGINE_SUBSTITUTION #endif #ifdef MODE_PAD_CHAR_TO_FULL_LENGTH /* pushdown */ #define SPIDER_SQL_MODE_PAD_CHAR_TO_FULL_LENGTH #endif #ifdef MODE_EMPTY_STRING_IS_NULL /* pushdown */ #define SPIDER_SQL_MODE_EMPTY_STRING_IS_NULL #endif #ifdef MODE_SIMULTANEOUS_ASSIGNMENT /* pushdown */ #define SPIDER_SQL_MODE_SIMULTANEOUS_ASSIGNMENT #endif #ifdef MODE_TIME_ROUND_FRACTIONAL /* pushdown */ #define SPIDER_SQL_MODE_TIME_ROUND_FRACTIONAL #endif sql_mode_t pushdown_sql_mode = #ifdef SPIDER_SQL_MODE_REAL_AS_FLOAT MODE_REAL_AS_FLOAT | #endif #ifdef SPIDER_SQL_MODE_PIPES_AS_CONCAT MODE_PIPES_AS_CONCAT | #endif #ifdef SPIDER_SQL_MODE_ANSI_QUOTES MODE_ANSI_QUOTES | #endif #ifdef SPIDER_SQL_MODE_IGNORE_SPACE MODE_IGNORE_SPACE | #endif #ifdef SPIDER_SQL_MODE_IGNORE_BAD_TABLE_OPTIONS MODE_IGNORE_BAD_TABLE_OPTIONS | #endif #ifdef SPIDER_SQL_MODE_ONLY_FULL_GROUP_BY MODE_ONLY_FULL_GROUP_BY | #endif #ifdef SPIDER_SQL_MODE_NO_UNSIGNED_SUBTRACTION MODE_NO_UNSIGNED_SUBTRACTION | #endif #ifdef SPIDER_SQL_MODE_NO_DIR_IN_CREATE MODE_NO_DIR_IN_CREATE | #endif #ifdef SPIDER_SQL_MODE_POSTGRESQL MODE_POSTGRESQL | #endif #ifdef SPIDER_SQL_MODE_ORACLE MODE_ORACLE | #endif #ifdef SPIDER_SQL_MODE_MSSQL MODE_MSSQL | #endif #ifdef SPIDER_SQL_MODE_DB2 MODE_DB2 | #endif #ifdef SPIDER_SQL_MODE_MAXDB MODE_MAXDB | #endif #ifdef SPIDER_SQL_MODE_NO_KEY_OPTIONS MODE_NO_KEY_OPTIONS | #endif #ifdef SPIDER_SQL_MODE_NO_TABLE_OPTIONS MODE_NO_TABLE_OPTIONS | #endif #ifdef SPIDER_SQL_MODE_NO_FIELD_OPTIONS MODE_NO_FIELD_OPTIONS | #endif #ifdef SPIDER_SQL_MODE_MYSQL323 MODE_MYSQL323 | #endif #ifdef SPIDER_SQL_MODE_MYSQL40 MODE_MYSQL40 | #endif #ifdef SPIDER_SQL_MODE_ANSI MODE_ANSI | #endif #ifdef SPIDER_SQL_MODE_NO_AUTO_VALUE_ON_ZERO MODE_NO_AUTO_VALUE_ON_ZERO | #endif #ifdef SPIDER_SQL_MODE_NO_BACKSLASH_ESCAPES MODE_NO_BACKSLASH_ESCAPES | #endif #ifdef SPIDER_SQL_MODE_STRICT_TRANS_TABLES MODE_STRICT_TRANS_TABLES | #endif #ifdef SPIDER_SQL_MODE_STRICT_ALL_TABLES MODE_STRICT_ALL_TABLES | #endif #ifdef SPIDER_SQL_MODE_NO_ZERO_IN_DATE MODE_NO_ZERO_IN_DATE | #endif #ifdef SPIDER_SQL_MODE_NO_ZERO_DATE MODE_NO_ZERO_DATE | #endif #ifdef SPIDER_SQL_MODE_INVALID_DATES MODE_INVALID_DATES | #endif #ifdef SPIDER_SQL_MODE_ERROR_FOR_DIVISION_BY_ZERO MODE_ERROR_FOR_DIVISION_BY_ZERO | #endif #ifdef SPIDER_SQL_MODE_TRADITIONAL MODE_TRADITIONAL | #endif #ifdef SPIDER_SQL_MODE_NO_AUTO_CREATE_USER MODE_NO_AUTO_CREATE_USER | #endif #ifdef SPIDER_SQL_MODE_HIGH_NOT_PRECEDENCE MODE_HIGH_NOT_PRECEDENCE | #endif #ifdef SPIDER_SQL_MODE_NO_ENGINE_SUBSTITUTION MODE_NO_ENGINE_SUBSTITUTION | #endif #ifdef SPIDER_SQL_MODE_PAD_CHAR_TO_FULL_LENGTH MODE_PAD_CHAR_TO_FULL_LENGTH | #endif #ifdef SPIDER_SQL_MODE_EMPTY_STRING_IS_NULL MODE_EMPTY_STRING_IS_NULL | #endif #ifdef SPIDER_SQL_MODE_SIMULTANEOUS_ASSIGNMENT MODE_SIMULTANEOUS_ASSIGNMENT | #endif #ifdef SPIDER_SQL_MODE_TIME_ROUND_FRACTIONAL MODE_TIME_ROUND_FRACTIONAL | #endif 0; int spider_db_mbase_util::append_sql_mode_internal( spider_string *str, sql_mode_t sql_mode ) { DBUG_ENTER("spider_db_mbase_util::append_sql_mode_internal"); DBUG_PRINT("info",("spider this=%p", this)); #ifdef SPIDER_SQL_MODE_REAL_AS_FLOAT if (sql_mode & MODE_REAL_AS_FLOAT) { if (str->reserve(SPIDER_REAL_AS_FLOAT_LEN + SPIDER_SQL_COMMA_LEN)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_REAL_AS_FLOAT_STR, SPIDER_REAL_AS_FLOAT_LEN); str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); } #endif #ifdef SPIDER_SQL_MODE_PIPES_AS_CONCAT if (sql_mode & MODE_PIPES_AS_CONCAT) { if (str->reserve(SPIDER_PIPES_AS_CONCAT_LEN + SPIDER_SQL_COMMA_LEN)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_PIPES_AS_CONCAT_STR, SPIDER_PIPES_AS_CONCAT_LEN); str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); } #endif #ifdef SPIDER_SQL_MODE_ANSI_QUOTES if (sql_mode & MODE_ANSI_QUOTES) { if (str->reserve(SPIDER_ANSI_QUOTES_LEN + SPIDER_SQL_COMMA_LEN)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_ANSI_QUOTES_STR, SPIDER_ANSI_QUOTES_LEN); str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); } #endif #ifdef SPIDER_SQL_MODE_IGNORE_SPACE if (sql_mode & MODE_IGNORE_SPACE) { if (str->reserve(SPIDER_IGNORE_SPACE_LEN + SPIDER_SQL_COMMA_LEN)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_IGNORE_SPACE_STR, SPIDER_IGNORE_SPACE_LEN); str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); } #endif #ifdef SPIDER_SQL_MODE_IGNORE_BAD_TABLE_OPTIONS if (sql_mode & MODE_IGNORE_BAD_TABLE_OPTIONS) { if (str->reserve(SPIDER_IGNORE_BAD_TABLE_OPTIONS_LEN + SPIDER_SQL_COMMA_LEN)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_IGNORE_BAD_TABLE_OPTIONS_STR, SPIDER_IGNORE_BAD_TABLE_OPTIONS_LEN); str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); } #endif #ifdef SPIDER_SQL_MODE_ONLY_FULL_GROUP_BY if (sql_mode & MODE_ONLY_FULL_GROUP_BY) { if (str->reserve(SPIDER_ONLY_FULL_GROUP_BY_LEN + SPIDER_SQL_COMMA_LEN)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_ONLY_FULL_GROUP_BY_STR, SPIDER_ONLY_FULL_GROUP_BY_LEN); str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); } #endif #ifdef SPIDER_SQL_MODE_NO_UNSIGNED_SUBTRACTION if (sql_mode & MODE_NO_UNSIGNED_SUBTRACTION) { if (str->reserve(SPIDER_NO_UNSIGNED_SUBTRACTION_LEN + SPIDER_SQL_COMMA_LEN)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_NO_UNSIGNED_SUBTRACTION_STR, SPIDER_NO_UNSIGNED_SUBTRACTION_LEN); str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); } #endif #ifdef SPIDER_SQL_MODE_NO_DIR_IN_CREATE if (sql_mode & MODE_NO_DIR_IN_CREATE) { if (str->reserve(SPIDER_NO_DIR_IN_CREATE_LEN + SPIDER_SQL_COMMA_LEN)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_NO_DIR_IN_CREATE_STR, SPIDER_NO_DIR_IN_CREATE_LEN); str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); } #endif #ifdef SPIDER_SQL_MODE_POSTGRESQL if (sql_mode & MODE_POSTGRESQL) { if (str->reserve(SPIDER_POSTGRESQL_LEN + SPIDER_SQL_COMMA_LEN)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_POSTGRESQL_STR, SPIDER_POSTGRESQL_LEN); str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); } #endif #ifdef SPIDER_SQL_MODE_ORACLE if (sql_mode & MODE_ORACLE) { if (str->reserve(SPIDER_ORACLE_LEN + SPIDER_SQL_COMMA_LEN)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_ORACLE_STR, SPIDER_ORACLE_LEN); str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); } #endif #ifdef SPIDER_SQL_MODE_MSSQL if (sql_mode & MODE_MSSQL) { if (str->reserve(SPIDER_MSSQL_LEN + SPIDER_SQL_COMMA_LEN)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_MSSQL_STR, SPIDER_MSSQL_LEN); str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); } #endif #ifdef SPIDER_SQL_MODE_DB2 if (sql_mode & MODE_DB2) { if (str->reserve(SPIDER_DB2_LEN + SPIDER_SQL_COMMA_LEN)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_DB2_STR, SPIDER_DB2_LEN); str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); } #endif #ifdef SPIDER_SQL_MODE_MAXDB if (sql_mode & MODE_MAXDB) { if (str->reserve(SPIDER_MAXDB_LEN + SPIDER_SQL_COMMA_LEN)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_MAXDB_STR, SPIDER_MAXDB_LEN); str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); } #endif #ifdef SPIDER_SQL_MODE_NO_KEY_OPTIONS if (sql_mode & MODE_NO_KEY_OPTIONS) { if (str->reserve(SPIDER_NO_KEY_OPTIONS_LEN + SPIDER_SQL_COMMA_LEN)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_NO_KEY_OPTIONS_STR, SPIDER_NO_KEY_OPTIONS_LEN); str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); } #endif #ifdef SPIDER_SQL_MODE_NO_TABLE_OPTIONS if (sql_mode & MODE_NO_TABLE_OPTIONS) { if (str->reserve(SPIDER_NO_TABLE_OPTIONS_LEN + SPIDER_SQL_COMMA_LEN)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_NO_TABLE_OPTIONS_STR, SPIDER_NO_TABLE_OPTIONS_LEN); str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); } #endif #ifdef SPIDER_SQL_MODE_NO_FIELD_OPTIONS if (sql_mode & MODE_NO_FIELD_OPTIONS) { if (str->reserve(SPIDER_NO_FIELD_OPTIONS_LEN + SPIDER_SQL_COMMA_LEN)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_NO_FIELD_OPTIONS_STR, SPIDER_NO_FIELD_OPTIONS_LEN); str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); } #endif #ifdef SPIDER_SQL_MODE_MYSQL323 if (sql_mode & MODE_MYSQL323) { if (str->reserve(SPIDER_MYSQL323_LEN + SPIDER_SQL_COMMA_LEN)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_MYSQL323_STR, SPIDER_MYSQL323_LEN); str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); } #endif #ifdef SPIDER_SQL_MODE_MYSQL40 if (sql_mode & MODE_MYSQL40) { if (str->reserve(SPIDER_MYSQL40_LEN + SPIDER_SQL_COMMA_LEN)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_MYSQL40_STR, SPIDER_MYSQL40_LEN); str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); } #endif #ifdef SPIDER_SQL_MODE_ANSI if (sql_mode & MODE_ANSI) { if (str->reserve(SPIDER_ANSI_LEN + SPIDER_SQL_COMMA_LEN)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_ANSI_STR, SPIDER_ANSI_LEN); str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); } #endif #ifdef SPIDER_SQL_MODE_NO_AUTO_VALUE_ON_ZERO if (sql_mode & MODE_NO_AUTO_VALUE_ON_ZERO) { if (str->reserve(SPIDER_NO_AUTO_VALUE_ON_ZERO_LEN + SPIDER_SQL_COMMA_LEN)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_NO_AUTO_VALUE_ON_ZERO_STR, SPIDER_NO_AUTO_VALUE_ON_ZERO_LEN); str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); } #endif #ifdef SPIDER_SQL_MODE_NO_BACKSLASH_ESCAPES if (sql_mode & MODE_NO_BACKSLASH_ESCAPES) { if (str->reserve(SPIDER_NO_BACKSLASH_ESCAPES_LEN + SPIDER_SQL_COMMA_LEN)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_NO_BACKSLASH_ESCAPES_STR, SPIDER_NO_BACKSLASH_ESCAPES_LEN); str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); } #endif #ifdef SPIDER_SQL_MODE_STRICT_TRANS_TABLES if (sql_mode & MODE_STRICT_TRANS_TABLES) { if (str->reserve(SPIDER_STRICT_TRANS_TABLES_LEN + SPIDER_SQL_COMMA_LEN)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_STRICT_TRANS_TABLES_STR, SPIDER_STRICT_TRANS_TABLES_LEN); str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); } #endif #ifdef SPIDER_SQL_MODE_STRICT_ALL_TABLES if (sql_mode & MODE_STRICT_ALL_TABLES) { if (str->reserve(SPIDER_STRICT_ALL_TABLES_LEN + SPIDER_SQL_COMMA_LEN)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_STRICT_ALL_TABLES_STR, SPIDER_STRICT_ALL_TABLES_LEN); str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); } #endif #ifdef SPIDER_SQL_MODE_NO_ZERO_IN_DATE if (sql_mode & MODE_NO_ZERO_IN_DATE) { if (str->reserve(SPIDER_NO_ZERO_IN_DATE_LEN + SPIDER_SQL_COMMA_LEN)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_NO_ZERO_IN_DATE_STR, SPIDER_NO_ZERO_IN_DATE_LEN); str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); } #endif #ifdef SPIDER_SQL_MODE_NO_ZERO_DATE if (sql_mode & MODE_NO_ZERO_DATE) { if (str->reserve(SPIDER_NO_ZERO_DATE_LEN + SPIDER_SQL_COMMA_LEN)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_NO_ZERO_DATE_STR, SPIDER_NO_ZERO_DATE_LEN); str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); } #endif #ifdef SPIDER_SQL_MODE_INVALID_DATES if (sql_mode & MODE_INVALID_DATES) { if (str->reserve(SPIDER_INVALID_DATES_LEN + SPIDER_SQL_COMMA_LEN)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_INVALID_DATES_STR, SPIDER_INVALID_DATES_LEN); str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); } #endif #ifdef SPIDER_SQL_MODE_ERROR_FOR_DIVISION_BY_ZERO if (sql_mode & MODE_ERROR_FOR_DIVISION_BY_ZERO) { if (str->reserve(SPIDER_ERROR_FOR_DIVISION_BY_ZERO_LEN + SPIDER_SQL_COMMA_LEN)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_ERROR_FOR_DIVISION_BY_ZERO_STR, SPIDER_ERROR_FOR_DIVISION_BY_ZERO_LEN); str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); } #endif #ifdef SPIDER_SQL_MODE_TRADITIONAL if (sql_mode & MODE_TRADITIONAL) { if (str->reserve(SPIDER_TRADITIONAL_LEN + SPIDER_SQL_COMMA_LEN)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_TRADITIONAL_STR, SPIDER_TRADITIONAL_LEN); str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); } #endif #ifdef SPIDER_SQL_MODE_NO_AUTO_CREATE_USER if (sql_mode & MODE_NO_AUTO_CREATE_USER) { if (str->reserve(SPIDER_NO_AUTO_CREATE_USER_LEN + SPIDER_SQL_COMMA_LEN)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_NO_AUTO_CREATE_USER_STR, SPIDER_NO_AUTO_CREATE_USER_LEN); str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); } #endif #ifdef SPIDER_SQL_MODE_HIGH_NOT_PRECEDENCE if (sql_mode & MODE_HIGH_NOT_PRECEDENCE) { if (str->reserve(SPIDER_HIGH_NOT_PRECEDENCE_LEN + SPIDER_SQL_COMMA_LEN)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_HIGH_NOT_PRECEDENCE_STR, SPIDER_HIGH_NOT_PRECEDENCE_LEN); str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); } #endif #ifdef SPIDER_SQL_MODE_NO_ENGINE_SUBSTITUTION if (sql_mode & MODE_NO_ENGINE_SUBSTITUTION) { if (str->reserve(SPIDER_NO_ENGINE_SUBSTITUTION_LEN + SPIDER_SQL_COMMA_LEN)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_NO_ENGINE_SUBSTITUTION_STR, SPIDER_NO_ENGINE_SUBSTITUTION_LEN); str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); } #endif #ifdef SPIDER_SQL_MODE_PAD_CHAR_TO_FULL_LENGTH if (sql_mode & MODE_PAD_CHAR_TO_FULL_LENGTH) { if (str->reserve(SPIDER_PAD_CHAR_TO_FULL_LENGTH_LEN + SPIDER_SQL_COMMA_LEN)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_PAD_CHAR_TO_FULL_LENGTH_STR, SPIDER_PAD_CHAR_TO_FULL_LENGTH_LEN); str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); } #endif DBUG_RETURN(0); } int spider_db_mariadb_util::append_sql_mode_internal( spider_string *str, sql_mode_t sql_mode ) { int error_num; DBUG_ENTER("spider_db_mbase_util::append_sql_mode_internal"); DBUG_PRINT("info",("spider this=%p", this)); if ((error_num = spider_db_mbase_util::append_sql_mode_internal( str, sql_mode))) { DBUG_RETURN(error_num); } #ifdef SPIDER_SQL_MODE_EMPTY_STRING_IS_NULL if (sql_mode & MODE_EMPTY_STRING_IS_NULL) { if (str->reserve(SPIDER_EMPTY_STRING_IS_NULL_LEN + SPIDER_SQL_COMMA_LEN)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_EMPTY_STRING_IS_NULL_STR, SPIDER_EMPTY_STRING_IS_NULL_LEN); str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); } #endif #ifdef SPIDER_SQL_MODE_SIMULTANEOUS_ASSIGNMENT if (sql_mode & MODE_SIMULTANEOUS_ASSIGNMENT) { if (str->reserve(SPIDER_SIMULTANEOUS_ASSIGNMENT_LEN + SPIDER_SQL_COMMA_LEN)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_SIMULTANEOUS_ASSIGNMENT_STR, SPIDER_SIMULTANEOUS_ASSIGNMENT_LEN); str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); } #endif #ifdef SPIDER_SQL_MODE_TIME_ROUND_FRACTIONAL if (sql_mode & MODE_TIME_ROUND_FRACTIONAL) { if (str->reserve(SPIDER_TIME_ROUND_FRACTIONAL_LEN + SPIDER_SQL_COMMA_LEN)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_TIME_ROUND_FRACTIONAL_STR, SPIDER_TIME_ROUND_FRACTIONAL_LEN); str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); } #endif DBUG_RETURN(0); } int spider_db_mbase_util::append_sql_mode( spider_string *str, sql_mode_t sql_mode ) { int error_num; uint length; DBUG_ENTER("spider_db_mbase_util::append_sql_mode"); DBUG_PRINT("info",("spider this=%p", this)); if (str->reserve(SPIDER_SQL_SEMICOLON_LEN + SPIDER_SQL_SQL_MODE_LEN)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } if (str->length()) { str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN); } str->q_append(SPIDER_SQL_SQL_MODE_STR, SPIDER_SQL_SQL_MODE_LEN); length = str->length(); if ((error_num = append_sql_mode_internal(str, sql_mode))) { DBUG_RETURN(error_num); } if (str->length() > length) { str->length(str->length() - SPIDER_SQL_COMMA_LEN); } else { 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); DBUG_RETURN(0); } 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_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)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); if (str->length()) str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN); str->q_append(SPIDER_SQL_TIME_ZONE_STR, SPIDER_SQL_TIME_ZONE_LEN); str->q_append(tz_str->ptr(), tz_str->length()); str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN); DBUG_RETURN(0); } int spider_db_mbase_util::append_loop_check( spider_string *str, SPIDER_CONN *conn ) { SPIDER_CONN_LOOP_CHECK *lcptr; DBUG_ENTER("spider_db_mbase_util::append_loop_check"); DBUG_PRINT("info",("spider this=%p", this)); DBUG_PRINT("info",("spider str=%s", str->c_ptr_safe())); uint l = 0; while ((lcptr = (SPIDER_CONN_LOOP_CHECK *) my_hash_element( &conn->loop_check_queue, l))) { DBUG_PRINT("info",("spider lcptr=%p", lcptr)); if (str->reserve(SPIDER_SQL_SEMICOLON_LEN + SPIDER_SQL_SET_USER_VAL_LEN + SPIDER_SQL_LOP_CHK_PRM_PRF_LEN + lcptr->to_name.length + SPIDER_SQL_NAME_QUOTE_LEN + SPIDER_SQL_EQUAL_LEN + SPIDER_SQL_VALUE_QUOTE_LEN + lcptr->merged_value.length + SPIDER_SQL_VALUE_QUOTE_LEN)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } if (str->length()) { str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN); } str->q_append(SPIDER_SQL_SET_USER_VAL_STR, SPIDER_SQL_SET_USER_VAL_LEN); str->q_append(SPIDER_SQL_LOP_CHK_PRM_PRF_STR, SPIDER_SQL_LOP_CHK_PRM_PRF_LEN); str->q_append(lcptr->to_name.str, lcptr->to_name.length); str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN); str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN); str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN); str->q_append(lcptr->merged_value.str, lcptr->merged_value.length); str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN); ++l; DBUG_PRINT("info",("spider str=%s", str->c_ptr_safe())); } DBUG_RETURN(0); } int spider_db_mbase_util::append_start_transaction( spider_string *str ) { 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)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); if (str->length()) { str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN); } str->q_append(SPIDER_SQL_START_TRANSACTION_STR, SPIDER_SQL_START_TRANSACTION_LEN); DBUG_RETURN(0); } int spider_db_mbase_util::append_xa_start( spider_string *str, XID *xid ) { 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)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); if (str->length()) { str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN); } str->q_append(SPIDER_SQL_XA_START_STR, SPIDER_SQL_XA_START_LEN); spider_db_append_xid_str(str, xid); DBUG_RETURN(0); } int spider_db_mbase_util::append_lock_table_head( spider_string *str ) { 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); str->q_append(SPIDER_SQL_LOCK_TABLE_STR, SPIDER_SQL_LOCK_TABLE_LEN); DBUG_RETURN(0); } int spider_db_mbase_util::append_lock_table_body( spider_string *str, const char *db_name, uint db_name_length, CHARSET_INFO *db_name_charset, const char *table_name, uint table_name_length, CHARSET_INFO *table_name_charset, int lock_type ) { 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)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN); if ( str->append(db_name, db_name_length, db_name_charset) || str->reserve((SPIDER_SQL_NAME_QUOTE_LEN) * 2 + SPIDER_SQL_DOT_LEN) ) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN); str->q_append(SPIDER_SQL_DOT_STR, SPIDER_SQL_DOT_LEN); str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN); if ( str->append(table_name, table_name_length, table_name_charset) || str->reserve(SPIDER_SQL_NAME_QUOTE_LEN + spider_db_table_lock_len[lock_type]) ) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN); str->q_append(spider_db_table_lock_str[lock_type], spider_db_table_lock_len[lock_type]); DBUG_RETURN(0); } int spider_db_mbase_util::append_lock_table_tail( spider_string *str ) { 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_mbase_util::append_unlock_table( spider_string *str ) { DBUG_ENTER("spider_db_mbase_util::append_unlock_table"); DBUG_PRINT("info",("spider this=%p", this)); if (str->reserve(SPIDER_SQL_UNLOCK_TABLE_LEN)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_SQL_UNLOCK_TABLE_STR, SPIDER_SQL_UNLOCK_TABLE_LEN); DBUG_RETURN(0); } /** The function check if the given item_func and its arguments can be pushed down to a data node. If so and str != NULL, the function also print, to str, the string corresponding to the item_func. @return 0: success, otherwise: error */ int spider_db_mbase_util::open_item_func( Item_func *item_func, ha_spider *spider, spider_string *str, const char *alias, uint alias_length, bool use_fields, spider_fields *fields ) { DBUG_ENTER("spider_db_mbase_util::open_item_func"); int error = check_item_func(item_func, spider, alias, alias_length, use_fields, fields); if (error) DBUG_RETURN(error); if (!str) DBUG_RETURN(0); DBUG_RETURN(print_item_func(item_func, spider, str, alias, alias_length, use_fields, fields)); } static bool item_func_is_timestampdiff( const char *func_name, int func_name_length ) { return func_name_length == 13 && !strncasecmp("timestampdiff", func_name, func_name_length); } static bool not_func_should_be_skipped( Item_func *item_func ){ DBUG_ENTER("not_func_should_be_skipped"); DBUG_ASSERT(item_func->functype() == Item_func::NOT_FUNC); Item **item_list = item_func->arguments(); if (item_list[0]->type() == Item::COND_ITEM) { DBUG_PRINT("info",("spider item_list[0] is COND_ITEM")); Item_cond *item_cond = (Item_cond *) item_list[0]; if (item_cond->functype() == Item_func::COND_AND_FUNC) { DBUG_PRINT("info",("spider item_cond is COND_AND_FUNC")); List_iterator_fast lif(*(item_cond->argument_list())); bool has_expr_cache_item = FALSE; bool has_isnotnull_func = FALSE; bool has_other_item = FALSE; while(Item *item = lif++) { if ( item->type() == Item::EXPR_CACHE_ITEM ) { DBUG_PRINT("info",("spider EXPR_CACHE_ITEM")); has_expr_cache_item = TRUE; } else if ( item->type() == Item::FUNC_ITEM && ((Item_func *) item)->functype() == Item_func::ISNOTNULL_FUNC ) { DBUG_PRINT("info",("spider ISNOTNULL_FUNC")); has_isnotnull_func = TRUE; } else { DBUG_PRINT("info",("spider has other item")); DBUG_PRINT("info",("spider COND type=%d", item->type())); has_other_item = TRUE; } } if (has_expr_cache_item && has_isnotnull_func && !has_other_item) { DBUG_PRINT("info",("spider NOT EXISTS skip")); DBUG_RETURN(TRUE); } } } DBUG_RETURN(FALSE); } /** Check if the given item_func and its arguments can be pushed down to a data node. This function is recursive because we need to also check the arguments of the item_func. @return 0: success, otherwise: error */ int spider_db_mbase_util::check_item_func( Item_func *item_func, ha_spider *spider, const char *alias, uint alias_length, bool use_fields, spider_fields *fields ) { int use_pushdown_udf; DBUG_ENTER("spider_db_mbase_util::check_item_func"); Item_func::Functype func_type = item_func->functype(); DBUG_PRINT("info",("spider functype = %d", func_type)); const char *func_name = (char*) item_func->func_name(); int func_name_length = strlen(func_name); DBUG_PRINT("info",("spider func_name = %s", func_name)); /* The blacklist of the functions that cannot be pushed down */ switch (func_type) { case Item_func::TRIG_COND_FUNC: case Item_func::CASE_SEARCHED_FUNC: case Item_func::CASE_SIMPLE_FUNC: DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); case Item_func::NOT_FUNC: /* Why the following check is necessary? */ if (not_func_should_be_skipped(item_func)) DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); break; case Item_func::FUNC_SP: case Item_func::UDF_FUNC: /* Notes on merging regarding MDEV-29447: please refer to the following commits for build error or merge conflicts: 10.6: 1ed20b993b0dd4e95450cab2e8347e5bf4617a69 10.9: dd316b6e20265cfd832bb5585cb4c96e716387c8 10.10-11: 3f67f110ba1b23a89c5ede0fbeeb203cf5e164f4 11.0-1: 17ba6748afa8834df5658361088e6c8e65aca16f Please remove this comment after merging. */ use_pushdown_udf= spider_param_use_pushdown_udf( spider->wide_handler->trx->thd, spider->share->use_pushdown_udf); if (!use_pushdown_udf) DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); break; case Item_func::FT_FUNC: if (spider_db_check_ft_idx(item_func, spider) == MAX_KEY) DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); break; #ifndef ITEM_FUNC_TIMESTAMPDIFF_ARE_PUBLIC case Item_func::UNKNOWN_FUNC: if (item_func_is_timestampdiff(func_name, func_name_length)) DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); break; #endif default: break; } /* End of the blacklist */ /* Check the arguments recursively */ if (uint item_count = item_func->argument_count()) { Item **item_list = item_func->arguments(); for (uint roop_count = 0; roop_count < item_count; roop_count++) { Item *item = item_list[roop_count]; if (int error_num = spider_db_print_item_type(item, NULL, spider, NULL, alias, alias_length, dbton_id, use_fields, fields)) DBUG_RETURN(error_num); } } DBUG_RETURN(0); } /** The function print the string corresponding to the given item_func to str. The function is assumed to be called only when the check by the function check_item_func() has passed. @return 0: success, otherwise: error */ int spider_db_mbase_util::print_item_func( Item_func *item_func, ha_spider *spider, spider_string *str, const char *alias, uint alias_length, bool use_fields, spider_fields *fields ) { int error_num; Item *item, **item_list = item_func->arguments(); Field *field; spider_string tmp_str; uint roop_count, item_count = item_func->argument_count(), start_item = 0; LEX_CSTRING org_func_name= {SPIDER_SQL_NULL_CHAR_STR, SPIDER_SQL_NULL_CHAR_LEN}; const char *func_name = 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, 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_mbase_util::print_item_func"); DBUG_ASSERT(!check_item_func(item_func, spider, alias, alias_length, use_fields, fields)); DBUG_ASSERT(str); if (str->reserve(SPIDER_SQL_OPEN_PAREN_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN); DBUG_PRINT("info",("spider functype = %d", item_func->functype())); switch (item_func->functype()) { case Item_func::ISNULL_FUNC: last_str = SPIDER_SQL_IS_NULL_STR; last_str_length = SPIDER_SQL_IS_NULL_LEN; break; case Item_func::ISNOTNULL_FUNC: last_str = SPIDER_SQL_IS_NOT_NULL_STR; last_str_length = SPIDER_SQL_IS_NOT_NULL_LEN; break; case Item_func::UNKNOWN_FUNC: org_func_name= item_func->func_name_cstring(); func_name= org_func_name.str; func_name_length = org_func_name.length; DBUG_PRINT("info",("spider func_name = %s", func_name)); DBUG_PRINT("info",("spider func_name_length = %d", func_name_length)); if (func_name_length == 1 && ( !strncasecmp("+", func_name, func_name_length) || !strncasecmp("-", func_name, func_name_length) || !strncasecmp("*", func_name, func_name_length) || !strncasecmp("/", func_name, func_name_length) || !strncasecmp("%", func_name, func_name_length) || !strncasecmp("&", func_name, func_name_length) || !strncasecmp("|", func_name, func_name_length) || !strncasecmp("^", func_name, func_name_length) ) ) { /* no action */ break; } else if (func_name_length == 2 && ( !strncasecmp("<<", func_name, func_name_length) || !strncasecmp(">>", func_name, func_name_length) ) ) { /* no action */ break; } else if (func_name_length == 3 && !strncasecmp("div", func_name, func_name_length) ) { /* no action */ break; } else if (func_name_length == 4) { if ( !strncasecmp("rand", func_name, func_name_length) && !item_func->argument_count() ) { str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); DBUG_RETURN(spider_db_open_item_int(item_func, NULL, spider, str, alias, alias_length, dbton_id, use_fields, fields)); } else if ( !strncasecmp("trim", func_name, func_name_length) && item_count == 2 ) { /* item_count == 1 means this TRIM() is without a remove_str */ item = item_list[0]; Item *item_tmp = item_list[1]; if (item_tmp->is_of_type(Item::CONST_ITEM, STRING_RESULT)) { /* 1. append 'TRIM(BOTH ' */ if (str->reserve(SPIDER_SQL_TRIM_LEN + SPIDER_SQL_OPEN_PAREN_LEN + SPIDER_SQL_TRIM_BOTH_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_TRIM_STR, SPIDER_SQL_TRIM_LEN); str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN); str->q_append(SPIDER_SQL_TRIM_BOTH_STR, SPIDER_SQL_TRIM_BOTH_LEN); /* 2. append "remove_str"*/ if ((error_num = spider_db_print_item_type( item_tmp, NULL, spider, str, alias, alias_length, dbton_id, use_fields, fields))) DBUG_RETURN(error_num); /* 3. append ' FROM ' */ if (str->reserve(SPIDER_SQL_FROM_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN); /* 4. append `field` */ if ((error_num = spider_db_print_item_type( item, NULL, spider, str, alias, alias_length, dbton_id, use_fields, fields))) DBUG_RETURN(error_num); /* 5. append ')' */ 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_count -= 2; break; } } else if (func_name_length == 5) { if ( (!strncasecmp("ltrim", func_name, func_name_length) || !strncasecmp("rtrim", func_name, func_name_length)) && (item_count == 2) ) { /* the func_name for TRIM(LEADING ...) is LTRIM, for TRIM(TRAILING) is RTRIM */ /* item_count == 2 means this TRIM(LEADING/TRAILING ...) is with a remove_str */ item = item_list[0]; Item *item_tmp = item_list[1]; if (item_tmp->is_of_type(Item::CONST_ITEM, STRING_RESULT)) { /* 1. append 'TRIM(LEADING ' or 'TRIM(TRAILING ' */ if (func_name[0] == 'l' || func_name[0] == 'L') { /* ltrim */ if (str->reserve(SPIDER_SQL_TRIM_LEN + SPIDER_SQL_OPEN_PAREN_LEN + SPIDER_SQL_TRIM_LEADING_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_TRIM_STR, SPIDER_SQL_TRIM_LEN); str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN); str->q_append(SPIDER_SQL_TRIM_LEADING_STR, SPIDER_SQL_TRIM_LEADING_LEN); } else { /* rtrim */ if (str->reserve(SPIDER_SQL_TRIM_LEN + SPIDER_SQL_OPEN_PAREN_LEN + SPIDER_SQL_TRIM_TRAILING_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_TRIM_STR, SPIDER_SQL_TRIM_LEN); str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN); str->q_append(SPIDER_SQL_TRIM_TRAILING_STR, SPIDER_SQL_TRIM_TRAILING_LEN); } /* 2. append "remove_str"*/ if ((error_num = spider_db_print_item_type( item_tmp, NULL, spider, str, alias, alias_length, dbton_id, use_fields, fields))) DBUG_RETURN(error_num); /* 3. append ' FROM ' */ if (str->reserve(SPIDER_SQL_FROM_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN); /* 4. append `field` */ if ((error_num = spider_db_print_item_type( item, NULL, spider, str, alias, alias_length, dbton_id, use_fields, fields))) DBUG_RETURN(error_num); /* 5. append ')' */ 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_count -= 2; break; } } else if (func_name_length == 6 && !strncasecmp("istrue", func_name, func_name_length) ) { last_str = SPIDER_SQL_IS_TRUE_STR; last_str_length = SPIDER_SQL_IS_TRUE_LEN; break; } else if (func_name_length == 7) { if (!strncasecmp("isfalse", func_name, func_name_length)) { last_str = SPIDER_SQL_IS_FALSE_STR; last_str_length = SPIDER_SQL_IS_FALSE_LEN; break; } else if ( !strncasecmp("sysdate", func_name, func_name_length) || !strncasecmp("curdate", func_name, func_name_length) || !strncasecmp("curtime", func_name, func_name_length) ) { str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); 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) ) { if (str->reserve(func_name_length * 2 + 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); last_str = SPIDER_SQL_CLOSE_PAREN_STR; last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN; break; } } else if (func_name_length == 8 && ( !strncasecmp("utc_date", func_name, func_name_length) || !strncasecmp("utc_time", func_name, func_name_length) ) ) { str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); 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) { 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)) { 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; LEX_CSTRING org_func_name= ifunc->func_name_cstring(); DBUG_PRINT("info",("spider child is UNKNOWN_FUNC")); child_func_name = org_func_name.str; child_func_name_length = org_func_name.length; 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; } } } str->length(str->length() - SPIDER_SQL_OPEN_PAREN_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; LEX_CSTRING org_func_name= ifunc->func_name_cstring(); DBUG_PRINT("info",("spider child is UNKNOWN_FUNC")); child_func_name = org_func_name.str; child_func_name_length = org_func_name.length; 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; } } } str->length(str->length() - SPIDER_SQL_OPEN_PAREN_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; break; } } else if (func_name_length == 13) { if (!strncasecmp("utc_timestamp", func_name, func_name_length)) { str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); 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 Item_func_timestamp_diff *item_func_timestamp_diff = (Item_func_timestamp_diff *) item_func; const char *interval_str; uint interval_len; switch (item_func_timestamp_diff->int_type) { case INTERVAL_YEAR: interval_str = SPIDER_SQL_YEAR_STR; interval_len = SPIDER_SQL_YEAR_LEN; break; case INTERVAL_QUARTER: interval_str = SPIDER_SQL_QUARTER_STR; interval_len = SPIDER_SQL_QUARTER_LEN; break; case INTERVAL_MONTH: interval_str = SPIDER_SQL_MONTH_STR; interval_len = SPIDER_SQL_MONTH_LEN; break; case INTERVAL_WEEK: interval_str = SPIDER_SQL_WEEK_STR; interval_len = SPIDER_SQL_WEEK_LEN; break; case INTERVAL_DAY: interval_str = SPIDER_SQL_DAY_STR; interval_len = SPIDER_SQL_DAY_LEN; break; case INTERVAL_HOUR: interval_str = SPIDER_SQL_HOUR_STR; interval_len = SPIDER_SQL_HOUR_LEN; break; case INTERVAL_MINUTE: interval_str = SPIDER_SQL_MINUTE_STR; interval_len = SPIDER_SQL_MINUTE_LEN; break; case INTERVAL_SECOND: interval_str = SPIDER_SQL_SECOND_STR; interval_len = SPIDER_SQL_SECOND_LEN; break; case INTERVAL_MICROSECOND: interval_str = SPIDER_SQL_MICROSECOND_STR; interval_len = SPIDER_SQL_MICROSECOND_LEN; break; default: interval_str = ""; interval_len = 0; break; } str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); if (str->reserve(func_name_length + SPIDER_SQL_OPEN_PAREN_LEN + interval_len + SPIDER_SQL_COMMA_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); 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], 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); } 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) { if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN); } DBUG_RETURN(0); #else DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); #endif } } else if (func_name_length == 14) { 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; LEX_CSTRING org_func_name= ifunc->func_name_cstring(); DBUG_PRINT("info",("spider child is UNKNOWN_FUNC")); child_func_name = org_func_name.str; child_func_name_length = org_func_name.length; 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; } } } char *tmp_ptr, *tmp_ptr2; DBUG_ASSERT(tmp_str.length() == 0); tmp_str.set_charset(str->charset()); tmp_str.init_calc_mem(123); tmp_str.reserve(MAX_FIELD_WIDTH); str->length(str->length() - SPIDER_SQL_OPEN_PAREN_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); } item_func->print(tmp_str.get_str(), QT_TO_SYSTEM_CHARSET); tmp_str.mem_calc(); if (tmp_str.reserve(1)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); tmp_ptr = tmp_str.c_ptr_quick(); DBUG_PRINT("info",("spider tmp_ptr = %s", tmp_ptr)); while ((tmp_ptr2 = strstr(tmp_ptr, SPIDER_SQL_AS_BINARY_STR))) tmp_ptr = tmp_ptr2 + 1; last_str = tmp_ptr - 1; last_str_length = strlen(last_str) - SPIDER_SQL_CLOSE_PAREN_LEN; 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; LEX_CSTRING org_func_name= ifunc->func_name_cstring(); DBUG_PRINT("info",("spider child is UNKNOWN_FUNC")); child_func_name = org_func_name.str; child_func_name_length = org_func_name.length; 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; } } } str->length(str->length() - SPIDER_SQL_OPEN_PAREN_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; break; } } else if (func_name_length == 16) { 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; LEX_CSTRING org_func_name= ifunc->func_name_cstring(); DBUG_PRINT("info",("spider child is UNKNOWN_FUNC")); child_func_name = org_func_name.str; child_func_name_length = org_func_name.length; 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; } } } str->length(str->length() - SPIDER_SQL_OPEN_PAREN_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; break; } 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; LEX_CSTRING org_func_name= ifunc->func_name_cstring(); DBUG_PRINT("info",("spider child is UNKNOWN_FUNC")); child_func_name = org_func_name.str; child_func_name_length = org_func_name.length; 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; } } } char *tmp_ptr, *tmp_ptr2; DBUG_ASSERT(tmp_str.length() == 0); tmp_str.set_charset(str->charset()); tmp_str.init_calc_mem(124); tmp_str.reserve(MAX_FIELD_WIDTH); str->length(str->length() - SPIDER_SQL_OPEN_PAREN_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); } item_func->print(tmp_str.get_str(), QT_TO_SYSTEM_CHARSET); tmp_str.mem_calc(); if (tmp_str.reserve(1)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); tmp_ptr = tmp_str.c_ptr_quick(); DBUG_PRINT("info",("spider tmp_ptr = %s", tmp_ptr)); while ((tmp_ptr2 = strstr(tmp_ptr, SPIDER_SQL_AS_DECIMAL_STR))) tmp_ptr = tmp_ptr2 + 1; last_str = tmp_ptr - 1; last_str_length = strlen(last_str) - SPIDER_SQL_CLOSE_PAREN_LEN; break; } 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; LEX_CSTRING org_func_name= ifunc->func_name_cstring(); DBUG_PRINT("info",("spider child is UNKNOWN_FUNC")); child_func_name = org_func_name.str; child_func_name_length = org_func_name.length; 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; } } } str->length(str->length() - SPIDER_SQL_OPEN_PAREN_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; break; } } else if (func_name_length == 17) { if (!strncasecmp("date_add_interval", func_name, func_name_length)) { Item_date_add_interval *item_date_add_interval = (Item_date_add_interval *) 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], NULL, spider, str, alias, alias_length, dbton_id, use_fields, fields))) DBUG_RETURN(error_num); if (item_date_add_interval->date_sub_interval) { if (str->reserve(SPIDER_SQL_NEGINTERVAL_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_NEGINTERVAL_STR, SPIDER_SQL_NEGINTERVAL_LEN); } else { if (str->reserve(SPIDER_SQL_INTERVAL_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_INTERVAL_STR, SPIDER_SQL_INTERVAL_LEN); } 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->reserve(func_name_length + SPIDER_SQL_CLOSE_PAREN_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(func_name, func_name_length); str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN); DBUG_RETURN(0); } } 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; last_str = SPIDER_SQL_CLOSE_PAREN_STR; last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN; break; case Item_func::NOW_FUNC: str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); 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; LEX_CSTRING org_func_name= ifunc->func_name_cstring(); DBUG_PRINT("info",("spider child is UNKNOWN_FUNC")); child_func_name = org_func_name.str; child_func_name_length = org_func_name.length; 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; } } } char *tmp_ptr, *tmp_ptr2; DBUG_ASSERT(tmp_str.length() == 0); tmp_str.set_charset(str->charset()); tmp_str.init_calc_mem(125); tmp_str.reserve(MAX_FIELD_WIDTH); str->length(str->length() - SPIDER_SQL_OPEN_PAREN_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); } item_func->print(tmp_str.get_str(), QT_TO_SYSTEM_CHARSET); tmp_str.mem_calc(); if (tmp_str.reserve(1)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); tmp_ptr = tmp_str.c_ptr_quick(); DBUG_PRINT("info",("spider tmp_ptr = %s", tmp_ptr)); while ((tmp_ptr2 = strstr(tmp_ptr, SPIDER_SQL_AS_CHAR_STR))) tmp_ptr = tmp_ptr2 + 1; last_str = tmp_ptr - 1; last_str_length = strlen(last_str) - SPIDER_SQL_CLOSE_PAREN_LEN; } break; case Item_func::NOT_FUNC: DBUG_PRINT("info",("spider NOT_FUNC")); /* Why the following check is necessary? */ if (not_func_should_be_skipped(item_func)) DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); { LEX_CSTRING org_func_name= item_func->func_name_cstring(); func_name = org_func_name.str; func_name_length = org_func_name.length; } if (str->reserve(func_name_length + SPIDER_SQL_SPACE_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(func_name, func_name_length); str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN); break; case Item_func::NEG_FUNC: { LEX_CSTRING org_func_name= item_func->func_name_cstring(); func_name = org_func_name.str; func_name_length = org_func_name.length; } if (str->reserve(func_name_length + SPIDER_SQL_SPACE_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(func_name, func_name_length); str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN); break; case Item_func::IN_FUNC: if (((Item_func_opt_neg *) item_func)->negated) { func_name = SPIDER_SQL_NOT_IN_STR; func_name_length = SPIDER_SQL_NOT_IN_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; 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::BETWEEN: if (((Item_func_opt_neg *) item_func)->negated) { func_name = SPIDER_SQL_NOT_BETWEEN_STR; func_name_length = SPIDER_SQL_NOT_BETWEEN_LEN; separator_str = SPIDER_SQL_AND_STR; separator_str_length = SPIDER_SQL_AND_LEN; } else { LEX_CSTRING org_func_name= item_func->func_name_cstring(); func_name = org_func_name.str; func_name_length = org_func_name.length; separator_str = SPIDER_SQL_AND_STR; separator_str_length = SPIDER_SQL_AND_LEN; } break; case Item_func::FUNC_SP: case Item_func::UDF_FUNC: use_pushdown_udf = spider_param_use_pushdown_udf( spider->wide_handler->trx->thd, spider->share->use_pushdown_udf); if (!use_pushdown_udf) /* This is the default behavior because the remote nodes may deal with the function in an unexpected way (e.g. not having the same definition). Users can turn it on if they know what they are doing. */ DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); { LEX_CSTRING org_func_name= item_func->func_name_cstring(); func_name = org_func_name.str; func_name_length = org_func_name.length; } DBUG_PRINT("info",("spider func_name = %s", func_name)); DBUG_PRINT("info",("spider func_name_length = %d", func_name_length)); 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; last_str = SPIDER_SQL_CLOSE_PAREN_STR; last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN; break; case Item_func::TRIG_COND_FUNC: DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); case Item_func::GUSERVAR_FUNC: 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, NULL, spider, str, alias, alias_length, dbton_id, use_fields, fields)); else 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); start_item = 1; if (str->reserve(SPIDER_SQL_MATCH_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_MATCH_STR, SPIDER_SQL_MATCH_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::SP_EQUALS_FUNC: func_name = SPIDER_SQL_MBR_EQUAL_STR; func_name_length = SPIDER_SQL_MBR_EQUAL_LEN; DBUG_PRINT("info",("spider func_name = %s", func_name)); DBUG_PRINT("info",("spider func_name_length = %d", func_name_length)); if (str->reserve(func_name_length)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(func_name, func_name_length); 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; last_str = SPIDER_SQL_CLOSE_PAREN_STR; last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN; break; case Item_func::SP_DISJOINT_FUNC: case Item_func::SP_INTERSECTS_FUNC: case Item_func::SP_TOUCHES_FUNC: case Item_func::SP_CROSSES_FUNC: case Item_func::SP_WITHIN_FUNC: case Item_func::SP_CONTAINS_FUNC: case Item_func::SP_OVERLAPS_FUNC: { LEX_CSTRING org_func_name= item_func->func_name_cstring(); func_name = org_func_name.str; func_name_length = org_func_name.length; } DBUG_PRINT("info",("spider func_name = %s", func_name)); DBUG_PRINT("info",("spider func_name_length = %d", func_name_length)); 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; last_str = SPIDER_SQL_CLOSE_PAREN_STR; last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN; break; case Item_func::EQ_FUNC: case Item_func::EQUAL_FUNC: case Item_func::NE_FUNC: case Item_func::LT_FUNC: case Item_func::LE_FUNC: case Item_func::GE_FUNC: case Item_func::GT_FUNC: case Item_func::XOR_FUNC: func_name = (char*) item_func->func_name(); func_name_length = strlen(func_name); break; case Item_func::LIKE_FUNC: if (((Item_func_like *)item_func)->get_negated()) { func_name = SPIDER_SQL_NOT_LIKE_STR; func_name_length = SPIDER_SQL_NOT_LIKE_LEN; } else { LEX_CSTRING org_func_name= item_func->func_name_cstring(); func_name = org_func_name.str; func_name_length = org_func_name.length; } break; DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); case Item_func::CASE_SEARCHED_FUNC: case Item_func::CASE_SIMPLE_FUNC: DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); case Item_func::JSON_EXTRACT_FUNC: func_name = (char*) item_func->func_name(); func_name_length = strlen(func_name); 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; last_str = SPIDER_SQL_CLOSE_PAREN_STR; last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN; break; default: THD *thd = spider->wide_handler->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); LEX_CSTRING org_func_name= item_func->func_name_cstring(); func_name = org_func_name.str; func_name_length = org_func_name.length; break; } DBUG_PRINT("info",("spider func_name = %s", func_name)); DBUG_PRINT("info",("spider func_name_length = %d", func_name_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, field, spider, str, alias, alias_length, dbton_id, use_fields, fields))) DBUG_RETURN(error_num); if (roop_count == 1) { /* Remaining operands need to be preceded by the separator */ func_name = separator_str; func_name_length = separator_str_length; } if (str->reserve(func_name_length + SPIDER_SQL_SPACE_LEN * 2)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN); str->q_append(func_name, func_name_length); 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, 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; if (str->reserve(SPIDER_SQL_AGAINST_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_AGAINST_STR, SPIDER_SQL_AGAINST_LEN); item = item_list[0]; 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->reserve( ((item_func_match->match_flags & FT_BOOL) ? SPIDER_SQL_IN_BOOLEAN_MODE_LEN : 0) + ((item_func_match->match_flags & FT_EXPAND) ? SPIDER_SQL_WITH_QUERY_EXPANSION_LEN : 0) )) DBUG_RETURN(HA_ERR_OUT_OF_MEM); if (item_func_match->match_flags & FT_BOOL) str->q_append(SPIDER_SQL_IN_BOOLEAN_MODE_STR, SPIDER_SQL_IN_BOOLEAN_MODE_LEN); if (item_func_match->match_flags & FT_EXPAND) str->q_append(SPIDER_SQL_WITH_QUERY_EXPANSION_STR, SPIDER_SQL_WITH_QUERY_EXPANSION_LEN); } else if (item_func->functype() == Item_func::UNKNOWN_FUNC) { if ( func_name_length == 7 && !strncasecmp("convert", func_name, func_name_length) ) { Item_func_conv_charset *item_func_conv_charset = (Item_func_conv_charset *)item_func; CHARSET_INFO *conv_charset = item_func_conv_charset->SPIDER_Item_func_conv_charset_conv_charset; uint cset_length = conv_charset->cs_name.length; if (str->reserve(SPIDER_SQL_USING_LEN + cset_length)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_USING_STR, SPIDER_SQL_USING_LEN); str->q_append(conv_charset->cs_name.str, cset_length); } } 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); str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN); DBUG_RETURN(0); } 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, bool use_fields, spider_fields *fields ) { uint roop_count, item_count = item_sum->get_arg_count(); int error_num; 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()) { case Item_sum::COUNT_FUNC: case Item_sum::SUM_FUNC: case Item_sum::MIN_FUNC: case Item_sum::MAX_FUNC: { LEX_CSTRING org_func_name= item_sum->func_name_cstring(); const char *func_name = org_func_name.str; uint func_name_length = org_func_name.length; 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::COUNT_DISTINCT_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); LEX_CSTRING org_func_name= item_sum->func_name_cstring(); const char *func_name = org_func_name.str; uint func_name_length = org_func_name.length; 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: case Item_sum::UDF_SUM_FUNC: case Item_sum::GROUP_CONCAT_FUNC: default: DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); } DBUG_RETURN(0); } int spider_db_mbase_util::append_escaped_util( spider_string *to, String *from ) { DBUG_ENTER("spider_db_mbase_util::append_escaped_util"); DBUG_PRINT("info",("spider this=%p", this)); DBUG_PRINT("info",("spider from=%s", from->charset()->cs_name.str)); DBUG_PRINT("info",("spider to=%s", to->charset()->cs_name.str)); to->append_escape_string(from->ptr(), from->length()); DBUG_RETURN(0); } 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 (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); } } 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 *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 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 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 *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 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 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, ¤t_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, ¤t_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); } bool spider_db_mbase_util::tables_on_different_db_are_joinable() { DBUG_ENTER("spider_db_mbase_util::tables_on_different_db_are_joinable"); DBUG_PRINT("info",("spider this=%p", this)); DBUG_RETURN(TRUE); } bool spider_db_mbase_util::socket_has_default_value() { DBUG_ENTER("spider_db_mbase_util::socket_has_default_value"); DBUG_PRINT("info",("spider this=%p", this)); DBUG_RETURN(TRUE); } bool spider_db_mbase_util::database_has_default_value() { DBUG_ENTER("spider_db_mbase_util::database_has_default_value"); DBUG_PRINT("info",("spider this=%p", this)); DBUG_RETURN(TRUE); } bool spider_db_mbase_util::default_file_has_default_value() { DBUG_ENTER("spider_db_mbase_util::default_file_has_default_value"); DBUG_PRINT("info",("spider this=%p", this)); DBUG_RETURN(TRUE); } bool spider_db_mbase_util::host_has_default_value() { DBUG_ENTER("spider_db_mbase_util::host_has_default_value"); DBUG_PRINT("info",("spider this=%p", this)); DBUG_RETURN(TRUE); } bool spider_db_mbase_util::port_has_default_value() { DBUG_ENTER("spider_db_mbase_util::port_has_default_value"); DBUG_PRINT("info",("spider this=%p", this)); DBUG_RETURN(TRUE); } bool spider_db_mbase_util::append_charset_name_before_string() { DBUG_ENTER("spider_db_mbase_util::append_charset_name_before_string"); DBUG_PRINT("info",("spider this=%p", this)); DBUG_RETURN(TRUE); } 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, dbton_id ), spider_db_mbase_utility(spider_db_mbase_utility), table_select(NULL), table_select_pos(0), key_select(NULL), key_select_pos(NULL), key_hint(NULL), show_table_status(NULL), show_records(NULL), show_index(NULL), table_names_str(NULL), db_names_str(NULL), db_table_str(NULL), db_table_str_hash_value(NULL), table_nm_max_length(0), db_nm_max_length(0), column_name_str(NULL), same_db_table_name(TRUE), first_all_link_idx(-1) { 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( 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_mbase_share::~spider_mbase_share"); DBUG_PRINT("info",("spider this=%p", this)); if (table_select) delete [] table_select; if (key_select) delete [] key_select; if (key_hint) delete [] key_hint; free_show_table_status(); free_show_records(); free_show_index(); free_column_name_str(); free_table_names_str(); if (key_select_pos) { spider_free(spider_current_trx, key_select_pos, MYF(0)); } spider_free_mem_calc(spider_current_trx, mem_calc_id, sizeof(*this)); DBUG_VOID_RETURN; } 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_mbase_share::init"); DBUG_PRINT("info",("spider this=%p", this)); if (!(key_select_pos = (int *) spider_bulk_alloc_mem(spider_current_trx, 112, __func__, __FILE__, __LINE__, MYF(MY_WME | MY_ZEROFILL), &key_select_pos, sizeof(int) * keys, &db_table_str_hash_value, sizeof(my_hash_value_type) * spider_share->all_link_count, NullS)) ) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } if (keys > 0 && !(key_hint = new spider_string[keys]) ) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } for (roop_count = 0; roop_count < keys; roop_count++) { key_hint[roop_count].init_calc_mem(189); key_hint[roop_count].set_charset(spider_share->access_charset); } DBUG_PRINT("info",("spider key_hint=%p", key_hint)); if ( !(table_select = new spider_string[1]) || (keys > 0 && !(key_select = new spider_string[keys]) ) || (error_num = create_table_names_str()) || (table_share && ( (error_num = create_column_name_str()) || (error_num = convert_key_hint_str()) || (error_num = append_show_table_status()) || (error_num = append_show_records()) || (error_num = append_show_index()) ) ) ) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } table_select->init_calc_mem(96); if (table_share && (error_num = append_table_select())) DBUG_RETURN(error_num); for (roop_count = 0; roop_count < keys; roop_count++) { key_select[roop_count].init_calc_mem(97); if ((error_num = append_key_select(roop_count))) DBUG_RETURN(error_num); } DBUG_RETURN(error_num); } uint spider_mbase_share::get_column_name_length( uint field_index ) { 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_mbase_share::append_column_name( spider_string *str, uint field_index ) { int error_num; DBUG_ENTER("spider_mbase_share::append_column_name"); DBUG_PRINT("info",("spider this=%p", this)); 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_mbase_share::append_column_name_with_alias( spider_string *str, uint field_index, const char *alias, uint alias_length ) { DBUG_ENTER("spider_mbase_share::append_column_name_with_alias"); DBUG_PRINT("info",("spider this=%p", this)); if (str->reserve( alias_length + column_name_str[field_index].length() + /* SPIDER_SQL_NAME_QUOTE_LEN */ 2)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(alias, alias_length); append_column_name(str, field_index); DBUG_RETURN(0); } int spider_mbase_share::append_table_name( spider_string *str, int all_link_idx ) { const char *db_nm = db_names_str[all_link_idx].ptr(); 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_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_mbase_utility->append_name(str, db_nm, db_nm_len); str->q_append(SPIDER_SQL_DOT_STR, SPIDER_SQL_DOT_LEN); spider_db_mbase_utility->append_name(str, table_nm, table_nm_len); DBUG_RETURN(0); } int spider_mbase_share::append_table_name_with_adjusting( spider_string *str, int all_link_idx ) { const char *db_nm = db_names_str[all_link_idx].ptr(); uint db_nm_len = db_names_str[all_link_idx].length(); uint db_nm_max_len = db_nm_max_length; 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_mbase_share::append_table_name_with_adjusting"); DBUG_PRINT("info",("spider this=%p", this)); 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_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; memset((char *) str->ptr() + str->length(), ' ', length); str->length(str->length() + length); DBUG_RETURN(0); } int spider_mbase_share::append_from_with_adjusted_table_name( spider_string *str, int *table_name_pos ) { const char *db_nm = db_names_str[0].ptr(); uint db_nm_len = db_names_str[0].length(); uint db_nm_max_len = db_nm_max_length; 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_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 + /* SPIDER_SQL_NAME_QUOTE_LEN */ 4)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN); *table_name_pos = str->length(); 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_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; memset((char *) str->ptr() + str->length(), ' ', length); str->length(str->length() + length); DBUG_RETURN(0); } 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; DBUG_ENTER("spider_mbase_share::create_table_names_str"); table_names_str = NULL; db_names_str = NULL; db_table_str = NULL; if ( !(table_names_str = new spider_string[spider_share->all_link_count]) || !(db_names_str = new spider_string[spider_share->all_link_count]) || !(db_table_str = new spider_string[spider_share->all_link_count]) ) { error_num = HA_ERR_OUT_OF_MEM; goto error; } same_db_table_name = TRUE; first_tbl_nm = spider_share->tgt_table_names[0]; first_db_nm = spider_share->tgt_dbs[0]; table_nm_len = spider_share->tgt_table_names_lengths[0]; db_nm_len = spider_share->tgt_dbs_lengths[0]; first_tbl_nm_str = &table_names_str[0]; first_db_nm_str = &db_names_str[0]; first_db_tbl_str = &db_table_str[0]; for (roop_count = 0; roop_count < (int) spider_share->all_link_count; roop_count++) { table_names_str[roop_count].init_calc_mem(86); db_names_str[roop_count].init_calc_mem(87); db_table_str[roop_count].init_calc_mem(88); if (spider_share->sql_dbton_ids[roop_count] != dbton_id) continue; if (first_all_link_idx == -1) first_all_link_idx = roop_count; str = &table_names_str[roop_count]; if ( roop_count != 0 && same_db_table_name && spider_share->tgt_table_names_lengths[roop_count] == table_nm_len && !memcmp(first_tbl_nm, spider_share->tgt_table_names[roop_count], table_nm_len) ) { if (str->copy(*first_tbl_nm_str)) { error_num = HA_ERR_OUT_OF_MEM; goto error; } } else { str->set_charset(spider_share->access_charset); if ((error_num = spider_db_append_name_with_quote_str(str, spider_share->tgt_table_names[roop_count], dbton_id))) goto error; if (roop_count) { same_db_table_name = FALSE; DBUG_PRINT("info", ("spider found different table name %s", spider_share->tgt_table_names[roop_count])); if (str->length() > table_nm_max_length) table_nm_max_length = str->length(); } else table_nm_max_length = str->length(); } str = &db_names_str[roop_count]; if ( roop_count != 0 && same_db_table_name && spider_share->tgt_dbs_lengths[roop_count] == db_nm_len && !memcmp(first_db_nm, spider_share->tgt_dbs[roop_count], db_nm_len) ) { if (str->copy(*first_db_nm_str)) { error_num = HA_ERR_OUT_OF_MEM; goto error; } } else { str->set_charset(spider_share->access_charset); if ((error_num = spider_db_append_name_with_quote_str(str, spider_share->tgt_dbs[roop_count], dbton_id))) goto error; if (roop_count) { same_db_table_name = FALSE; DBUG_PRINT("info", ("spider found different db name %s", spider_share->tgt_dbs[roop_count])); if (str->length() > db_nm_max_length) db_nm_max_length = str->length(); } else db_nm_max_length = str->length(); } str = &db_table_str[roop_count]; if ( roop_count != 0 && same_db_table_name ) { if (str->copy(*first_db_tbl_str)) { error_num = HA_ERR_OUT_OF_MEM; goto error; } } else { str->set_charset(spider_share->access_charset); if ((error_num = append_table_name(str, roop_count))) goto error; } db_table_str_hash_value[roop_count] = my_calc_hash( &spider_open_connections, (uchar*) str->ptr(), str->length()); } DBUG_RETURN(0); error: if (db_table_str) { delete [] db_table_str; db_table_str = NULL; } if (db_names_str) { delete [] db_names_str; db_names_str = NULL; } if (table_names_str) { delete [] table_names_str; table_names_str = NULL; } DBUG_RETURN(error_num); } void spider_mbase_share::free_table_names_str() { DBUG_ENTER("spider_mbase_share::free_table_names_str"); if (db_table_str) { delete [] db_table_str; db_table_str = NULL; } if (db_names_str) { delete [] db_names_str; db_names_str = NULL; } if (table_names_str) { delete [] table_names_str; table_names_str = NULL; } DBUG_VOID_RETURN; } int spider_mbase_share::create_column_name_str() { spider_string *str; int error_num; Field **field; TABLE_SHARE *table_share = spider_share->table_share; DBUG_ENTER("spider_mbase_share::create_column_name_str"); if ( table_share->fields && !(column_name_str = new spider_string[table_share->fields]) ) DBUG_RETURN(HA_ERR_OUT_OF_MEM); for (field = table_share->field, str = column_name_str; *field; field++, str++) { str->init_calc_mem(89); str->set_charset(spider_share->access_charset); if ((error_num = spider_db_append_name_with_quote_str(str, (*field)->field_name, dbton_id))) goto error; } DBUG_RETURN(0); error: if (column_name_str) { delete [] column_name_str; column_name_str = NULL; } DBUG_RETURN(error_num); } void spider_mbase_share::free_column_name_str() { DBUG_ENTER("spider_mbase_share::free_column_name_str"); if (column_name_str) { delete [] column_name_str; column_name_str = NULL; } DBUG_VOID_RETURN; } 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_mbase_share::convert_key_hint_str"); if (spider_share->access_charset->cset != system_charset_info->cset) { /* need conversion */ for (roop_count = 0, tmp_key_hint = key_hint; roop_count < (int) table_share->keys; roop_count++, tmp_key_hint++) { tmp_key_hint->length(0); if (tmp_key_hint->append(spider_share->key_hint->ptr(), spider_share->key_hint->length(), system_charset_info)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); } } else { for (roop_count = 0, tmp_key_hint = key_hint; roop_count < (int) table_share->keys; roop_count++, tmp_key_hint++) { if (tmp_key_hint->copy(spider_share->key_hint[roop_count])) DBUG_RETURN(HA_ERR_OUT_OF_MEM); } } DBUG_RETURN(0); } int spider_mbase_share::append_show_table_status() { int roop_count; spider_string *str; DBUG_ENTER("spider_mysql_append_show_table_status"); if (!(show_table_status = new spider_string[2 * spider_share->all_link_count])) goto error; for (roop_count = 0; roop_count < (int) spider_share->all_link_count; roop_count++) { show_table_status[0 + (2 * roop_count)].init_calc_mem(90); show_table_status[1 + (2 * roop_count)].init_calc_mem(91); if (spider_share->sql_dbton_ids[roop_count] != dbton_id) continue; if ( show_table_status[0 + (2 * roop_count)].reserve( SPIDER_SQL_SHOW_TABLE_STATUS_LEN + db_names_str[roop_count].length() + SPIDER_SQL_LIKE_LEN + table_names_str[roop_count].length() + ((SPIDER_SQL_NAME_QUOTE_LEN) * 2) + ((SPIDER_SQL_VALUE_QUOTE_LEN) * 2)) || show_table_status[1 + (2 * roop_count)].reserve( SPIDER_SQL_SELECT_TABLES_STATUS_LEN + db_names_str[roop_count].length() + SPIDER_SQL_AND_LEN + SPIDER_SQL_TABLE_NAME_LEN + SPIDER_SQL_EQUAL_LEN + table_names_str[roop_count].length() + ((SPIDER_SQL_VALUE_QUOTE_LEN) * 4)) ) goto error; str = &show_table_status[0 + (2 * roop_count)]; str->q_append( SPIDER_SQL_SHOW_TABLE_STATUS_STR, SPIDER_SQL_SHOW_TABLE_STATUS_LEN); str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN); str->q_append(db_names_str[roop_count].ptr(), db_names_str[roop_count].length()); str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN); str->q_append(SPIDER_SQL_LIKE_STR, SPIDER_SQL_LIKE_LEN); str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN); str->q_append(table_names_str[roop_count].ptr(), table_names_str[roop_count].length()); str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN); str = &show_table_status[1 + (2 * roop_count)]; str->q_append( SPIDER_SQL_SELECT_TABLES_STATUS_STR, SPIDER_SQL_SELECT_TABLES_STATUS_LEN); str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN); str->q_append(db_names_str[roop_count].ptr(), db_names_str[roop_count].length()); str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN); str->q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN); str->q_append(SPIDER_SQL_TABLE_NAME_STR, SPIDER_SQL_TABLE_NAME_LEN); str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN); str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN); str->q_append(table_names_str[roop_count].ptr(), table_names_str[roop_count].length()); str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN); } DBUG_RETURN(0); error: if (show_table_status) { delete [] show_table_status; show_table_status = NULL; } DBUG_RETURN(HA_ERR_OUT_OF_MEM); } void spider_mbase_share::free_show_table_status() { DBUG_ENTER("spider_mysql_free_show_table_status"); if (show_table_status) { delete [] show_table_status; show_table_status = NULL; } DBUG_VOID_RETURN; } int spider_mbase_share::append_show_records() { int roop_count; spider_string *str; DBUG_ENTER("spider_mbase_share::append_show_records"); if (!(show_records = new spider_string[spider_share->all_link_count])) goto error; for (roop_count = 0; roop_count < (int) spider_share->all_link_count; roop_count++) { show_records[roop_count].init_calc_mem(92); if (spider_share->sql_dbton_ids[roop_count] != dbton_id) continue; if ( show_records[roop_count].reserve( SPIDER_SQL_SHOW_RECORDS_LEN + db_names_str[roop_count].length() + SPIDER_SQL_DOT_LEN + table_names_str[roop_count].length() + /* SPIDER_SQL_NAME_QUOTE_LEN */ 4) ) goto error; str = &show_records[roop_count]; str->q_append(SPIDER_SQL_SHOW_RECORDS_STR, SPIDER_SQL_SHOW_RECORDS_LEN); append_table_name(str, roop_count); } DBUG_RETURN(0); error: if (show_records) { delete [] show_records; show_records = NULL; } DBUG_RETURN(HA_ERR_OUT_OF_MEM); } void spider_mbase_share::free_show_records() { DBUG_ENTER("spider_mbase_share::free_show_records"); if (show_records) { delete [] show_records; show_records = NULL; } DBUG_VOID_RETURN; } int spider_mbase_share::append_show_index() { int roop_count; spider_string *str; DBUG_ENTER("spider_mbase_share::append_show_index"); if (!(show_index = new spider_string[2 * spider_share->all_link_count])) goto error; for (roop_count = 0; roop_count < (int) spider_share->all_link_count; roop_count++) { show_index[0 + (2 * roop_count)].init_calc_mem(93); show_index[1 + (2 * roop_count)].init_calc_mem(94); if (spider_share->sql_dbton_ids[roop_count] != dbton_id) continue; if ( show_index[0 + (2 * roop_count)].reserve( SPIDER_SQL_SHOW_INDEX_LEN + db_names_str[roop_count].length() + SPIDER_SQL_DOT_LEN + table_names_str[roop_count].length() + /* SPIDER_SQL_NAME_QUOTE_LEN */ 4) || show_index[1 + (2 * roop_count)].reserve( SPIDER_SQL_SELECT_STATISTICS_LEN + db_names_str[roop_count].length() + SPIDER_SQL_AND_LEN + SPIDER_SQL_TABLE_NAME_LEN + SPIDER_SQL_EQUAL_LEN + table_names_str[roop_count].length() + ((SPIDER_SQL_VALUE_QUOTE_LEN) * 4) + SPIDER_SQL_GROUP_LEN + SPIDER_SQL_COLUMN_NAME_LEN) ) goto error; str = &show_index[0 + (2 * roop_count)]; str->q_append( SPIDER_SQL_SHOW_INDEX_STR, SPIDER_SQL_SHOW_INDEX_LEN); append_table_name(str, roop_count); str = &show_index[1 + (2 * roop_count)]; str->q_append( SPIDER_SQL_SELECT_STATISTICS_STR, SPIDER_SQL_SELECT_STATISTICS_LEN); str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN); str->q_append(db_names_str[roop_count].ptr(), db_names_str[roop_count].length()); str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN); str->q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN); str->q_append(SPIDER_SQL_TABLE_NAME_STR, SPIDER_SQL_TABLE_NAME_LEN); str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN); str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN); str->q_append(table_names_str[roop_count].ptr(), table_names_str[roop_count].length()); str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN); str->q_append(SPIDER_SQL_GROUP_STR, SPIDER_SQL_GROUP_LEN); str->q_append(SPIDER_SQL_COLUMN_NAME_STR, SPIDER_SQL_COLUMN_NAME_LEN); } DBUG_RETURN(0); error: if (show_index) { delete [] show_index; show_index = NULL; } DBUG_RETURN(HA_ERR_OUT_OF_MEM); } void spider_mbase_share::free_show_index() { DBUG_ENTER("spider_mbase_share::free_show_index"); if (show_index) { delete [] show_index; show_index = NULL; } DBUG_VOID_RETURN; } 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_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(); if (str->reserve(field_length + /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); append_column_name(str, (*field)->field_index); str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); } str->length(str->length() - SPIDER_SQL_COMMA_LEN); DBUG_RETURN(append_from_with_adjusted_table_name(str, &table_select_pos)); } int spider_mbase_share::append_key_select( uint idx ) { KEY_PART_INFO *key_part; Field *field; uint part_num; uint field_length; 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_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++) { field = key_part->field; field_length = column_name_str[field->field_index].length(); if (str->reserve(field_length + /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); append_column_name(str, field->field_index); str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); } str->length(str->length() - SPIDER_SQL_COMMA_LEN); DBUG_RETURN(append_from_with_adjusted_table_name(str, &key_select_pos[idx])); } bool spider_mbase_share::need_change_db_table_name() { DBUG_ENTER("spider_mbase_share::need_change_db_table_name"); DBUG_RETURN(!same_db_table_name); } int spider_mbase_share::discover_table_structure( SPIDER_TRX *trx, SPIDER_SHARE *spider_share, spider_string *str ) { 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 strlen = str->length(); 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; roop_count++) { if (spider_share->sql_dbton_ids[roop_count] != dbton_id) { DBUG_PRINT("info",("spider spider_share->sql_dbton_ids[%d]=%u", roop_count, spider_share->sql_dbton_ids[roop_count])); DBUG_PRINT("info",("spider dbton_id=%u", dbton_id)); continue; } str->length(strlen); sql_str.length(0); if (sql_str.reserve( SPIDER_SQL_SELECT_COLUMNS_LEN + db_names_str[roop_count].length() + SPIDER_SQL_AND_LEN + SPIDER_SQL_TABLE_NAME_LEN + SPIDER_SQL_EQUAL_LEN + table_names_str[roop_count].length() + SPIDER_SQL_ORDER_LEN + SPIDER_SQL_ORDINAL_POSITION_LEN + /* SPIDER_SQL_VALUE_QUOTE_LEN */ 8 + SPIDER_SQL_SEMICOLON_LEN + SPIDER_SQL_SHOW_INDEX_LEN + db_names_str[roop_count].length() + SPIDER_SQL_DOT_LEN + table_names_str[roop_count].length() + /* SPIDER_SQL_NAME_QUOTE_LEN */ 4 + SPIDER_SQL_SEMICOLON_LEN + SPIDER_SQL_SHOW_TABLE_STATUS_LEN + db_names_str[roop_count].length() + SPIDER_SQL_LIKE_LEN + table_names_str[roop_count].length() + /* SPIDER_SQL_NAME_QUOTE_LEN */ 4 )) { DBUG_PRINT("info",("spider alloc sql_str error")); DBUG_RETURN(HA_ERR_OUT_OF_MEM); } sql_str.q_append(SPIDER_SQL_SELECT_COLUMNS_STR, SPIDER_SQL_SELECT_COLUMNS_LEN); sql_str.q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN); sql_str.q_append(db_names_str[roop_count].ptr(), db_names_str[roop_count].length()); sql_str.q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN); sql_str.q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN); sql_str.q_append(SPIDER_SQL_TABLE_NAME_STR, SPIDER_SQL_TABLE_NAME_LEN); sql_str.q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN); sql_str.q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN); sql_str.q_append(table_names_str[roop_count].ptr(), table_names_str[roop_count].length()); sql_str.q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN); sql_str.q_append(SPIDER_SQL_ORDER_STR, SPIDER_SQL_ORDER_LEN); sql_str.q_append(SPIDER_SQL_ORDINAL_POSITION_STR, SPIDER_SQL_ORDINAL_POSITION_LEN); sql_str.q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN); sql_str.q_append(SPIDER_SQL_SHOW_INDEX_STR, SPIDER_SQL_SHOW_INDEX_LEN); append_table_name(&sql_str, roop_count); sql_str.q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN); sql_str.q_append( SPIDER_SQL_SHOW_TABLE_STATUS_STR, SPIDER_SQL_SHOW_TABLE_STATUS_LEN); sql_str.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN); sql_str.q_append(db_names_str[roop_count].ptr(), db_names_str[roop_count].length()); sql_str.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN); sql_str.q_append(SPIDER_SQL_LIKE_STR, SPIDER_SQL_LIKE_LEN); sql_str.q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN); sql_str.q_append(table_names_str[roop_count].ptr(), table_names_str[roop_count].length()); sql_str.q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN); SPIDER_CONN *conn; int need_mon; if (!(conn = spider_get_conn( spider_share, 0, spider_share->conn_keys[roop_count], trx, NULL, FALSE, FALSE, SPIDER_CONN_KIND_MYSQL, &error_num)) ) { DBUG_RETURN(error_num); } 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; if (!conn->disable_reconnect) { ha_spider tmp_spider; SPIDER_WIDE_HANDLER wide_handler; int need_mon = 0; uint tmp_conn_link_idx = 0; tmp_spider.wide_handler = &wide_handler; wide_handler.trx = trx; tmp_spider.share = spider_share; tmp_spider.need_mons = &need_mon; tmp_spider.conn_link_idx = &tmp_conn_link_idx; if ((error_num = spider_db_ping(&tmp_spider, conn, 0))) { DBUG_PRINT("info",("spider spider_db_ping error")); 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); continue; } } spider_conn_set_timeout_from_share(conn, roop_count, trx->thd, spider_share); if ( (error_num = spider_db_set_names_internal(trx, spider_share, conn, roop_count, &need_mon)) || ( spider_db_query( conn, sql_str.ptr(), sql_str.length(), -1, &need_mon) && (error_num = spider_db_errorno(conn)) ) ) { DBUG_PRINT("info",("spider spider_get_trx error")); 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); continue; } st_spider_db_request_key request_key; request_key.spider_thread_id = trx->spider_thread_id; request_key.query_id = trx->thd->query_id; request_key.handler = NULL; request_key.request_id = 1; request_key.next = NULL; spider_db_result *res; /* get column list */ if (!(res = conn->db_conn->store_result(NULL, &request_key, &error_num))) { if (error_num || (error_num = spider_db_errorno(conn))) { DBUG_PRINT("info",("spider column store error")); 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); continue; } /* no record */ DBUG_PRINT("info",("spider column no record error")); 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); continue; } if ((error_num = res->fetch_columns_for_discover_table_structure(str, spider_share->access_charset))) { DBUG_PRINT("info",("spider column fetch error")); res->free_result(); delete res; 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); my_printf_error(ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM, ER_SPIDER_REMOTE_TABLE_NOT_FOUND_STR, MYF(0), db_names_str[roop_count].ptr(), table_names_str[roop_count].ptr()); error_num = ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM; continue; } res->free_result(); delete res; if (conn->db_conn->next_result()) { DBUG_PRINT("info",("spider single result error")); 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); continue; } /* get index list */ if (!(res = conn->db_conn->store_result(NULL, &request_key, &error_num))) { if (error_num || (error_num = spider_db_errorno(conn))) { DBUG_PRINT("info",("spider index store error")); 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); continue; } /* no record */ DBUG_PRINT("info",("spider index no record error")); 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); continue; } if ((error_num = res->fetch_index_for_discover_table_structure(str, spider_share->access_charset))) { DBUG_PRINT("info",("spider index fetch error")); res->free_result(); delete res; 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); continue; } res->free_result(); delete res; if (conn->db_conn->next_result()) { DBUG_PRINT("info",("spider dual result error")); 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); continue; } /* get table info */ if (!(res = conn->db_conn->store_result(NULL, &request_key, &error_num))) { if (error_num || (error_num = spider_db_errorno(conn))) { DBUG_PRINT("info",("spider table store error")); 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); continue; } /* no record */ DBUG_PRINT("info",("spider table no record error")); 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); continue; } if ((error_num = res->fetch_table_for_discover_table_structure(str, spider_share, spider_share->access_charset))) { DBUG_PRINT("info",("spider table fetch error")); res->free_result(); delete res; 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); continue; } res->free_result(); delete res; 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) break; } DBUG_RETURN(error_num); } bool spider_mbase_share::checksum_support() { DBUG_ENTER("spider_mbase_share::checksum_support"); DBUG_PRINT("info",("spider this=%p", this)); DBUG_RETURN(TRUE); } spider_mbase_handler::spider_mbase_handler( ha_spider *spider, 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), table_name_pos(0), ha_read_pos(0), ha_next_pos(0), ha_where_pos(0), ha_limit_pos(0), ha_table_name_pos(0), insert_pos(0), insert_table_name_pos(0), upd_tmp_tbl(NULL), tmp_sql_pos1(0), tmp_sql_pos2(0), tmp_sql_pos3(0), tmp_sql_pos4(0), tmp_sql_pos5(0), reading_from_bulk_tmp_table(FALSE), union_table_name_pos_first(NULL), union_table_name_pos_current(NULL), mysql_share(db_share), link_for_hash(NULL) { 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( 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_mbase_handler::~spider_mbase_handler"); DBUG_PRINT("info",("spider this=%p", this)); while (union_table_name_pos_first) { SPIDER_INT_HLD *tmp_pos = union_table_name_pos_first; union_table_name_pos_first = tmp_pos->next; spider_free(spider_current_trx, tmp_pos, MYF(0)); } if (link_for_hash) { spider_free(spider_current_trx, link_for_hash, MYF(0)); } spider_free_mem_calc(spider_current_trx, mem_calc_id, sizeof(*this)); DBUG_VOID_RETURN; } 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->wide_handler->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); TABLE *table = spider->get_table(); DBUG_ENTER("spider_mbase_handler::init"); DBUG_PRINT("info",("spider this=%p", this)); sql.init_calc_mem(59); sql_part.init_calc_mem(60); sql_part2.init_calc_mem(61); ha_sql.init_calc_mem(62); insert_sql.init_calc_mem(64); update_sql.init_calc_mem(65); tmp_sql.init_calc_mem(66); dup_update_sql.init_calc_mem(166); if ( (sql.real_alloc(init_sql_alloc_size)) || (insert_sql.real_alloc(init_sql_alloc_size)) || (update_sql.real_alloc(init_sql_alloc_size)) || (tmp_sql.real_alloc(init_sql_alloc_size)) ) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } sql.set_charset(share->access_charset); sql_part.set_charset(share->access_charset); sql_part2.set_charset(share->access_charset); ha_sql.set_charset(share->access_charset); insert_sql.set_charset(share->access_charset); update_sql.set_charset(share->access_charset); tmp_sql.set_charset(share->access_charset); dup_update_sql.set_charset(share->access_charset); upd_tmp_tbl_prm.init(); upd_tmp_tbl_prm.field_count = 1; if (!(link_for_hash = (SPIDER_LINK_FOR_HASH *) spider_bulk_alloc_mem(spider_current_trx, 141, __func__, __FILE__, __LINE__, MYF(MY_WME | MY_ZEROFILL), &link_for_hash, sizeof(SPIDER_LINK_FOR_HASH) * share->link_count, &minimum_select_bitmap, table ? sizeof(uchar) * no_bytes_in_map(table->read_set) : 0, NullS)) ) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } for (roop_count = 0; roop_count < share->link_count; roop_count++) { link_for_hash[roop_count].spider = spider; link_for_hash[roop_count].link_idx = roop_count; link_for_hash[roop_count].db_table_str = &mysql_share->db_table_str[roop_count]; link_for_hash[roop_count].db_table_str_hash_value = mysql_share->db_table_str_hash_value[roop_count]; } DBUG_RETURN(0); } int spider_mbase_handler::append_index_hint( spider_string *str, int link_idx, ulong sql_type ) { List *index_hints = spider_get_index_hints(spider); List_iterator 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++)) { { 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_mbase_handler::append_table_name_with_adjusting"); DBUG_PRINT("info",("spider this=%p", this)); error_num = mysql_share->append_table_name_with_adjusting(str, spider->conn_link_idx[link_idx]); DBUG_RETURN(error_num); } int spider_mbase_handler::append_key_column_types( const key_range *start_key, spider_string *str ) { SPIDER_RESULT_LIST *result_list = &spider->result_list; KEY *key_info = result_list->key_info; uint key_name_length, key_count; key_part_map full_key_part_map = make_prev_keypart_map(spider_user_defined_key_parts(key_info)); key_part_map start_key_part_map; KEY_PART_INFO *key_part; Field *field; char tmp_buf[MAX_FIELD_WIDTH]; spider_string tmp_str(tmp_buf, sizeof(tmp_buf), system_charset_info); DBUG_ENTER("spider_mbase_handler::append_key_column_types"); DBUG_PRINT("info",("spider this=%p", this)); tmp_str.init_calc_mem(115); 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))); DBUG_PRINT("info", ("spider full_key_part_map=%lu", full_key_part_map)); DBUG_PRINT("info", ("spider start_key_part_map=%lu", start_key_part_map)); if (!start_key_part_map) DBUG_RETURN(0); for ( key_part = key_info->key_part, key_count = 0; start_key_part_map; start_key_part_map >>= 1, key_part++, key_count++ ) { field = key_part->field; key_name_length = my_sprintf(tmp_buf, (tmp_buf, "c%u", key_count)); if (str->reserve(key_name_length + SPIDER_SQL_SPACE_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(tmp_buf, key_name_length); str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN); if (tmp_str.ptr() != tmp_buf) tmp_str.set(tmp_buf, sizeof(tmp_buf), system_charset_info); else tmp_str.set_charset(system_charset_info); field->sql_type(*tmp_str.get_str()); tmp_str.mem_calc(); str->append(tmp_str); if (field->has_charset()) { CHARSET_INFO *cs = field->charset(); uint coll_length = cs->coll_name.length; if (str->reserve(SPIDER_SQL_COLLATE_LEN + coll_length)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_COLLATE_STR, SPIDER_SQL_COLLATE_LEN); str->q_append(cs->coll_name.str, coll_length); } 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_key_join_columns_for_bka( const key_range *start_key, spider_string *str, const char **table_aliases, uint *table_alias_lengths ) { KEY *key_info = spider->result_list.key_info; uint length, key_name_length, key_count; key_part_map full_key_part_map = make_prev_keypart_map(spider_user_defined_key_parts(key_info)); key_part_map start_key_part_map; KEY_PART_INFO *key_part; Field *field; char tmp_buf[MAX_FIELD_WIDTH]; bool start_where = ((int) str->length() == where_pos); 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", spider_user_defined_key_parts(key_info))); DBUG_PRINT("info", ("spider full_key_part_map=%lu", full_key_part_map)); DBUG_PRINT("info", ("spider start_key_part_map=%lu", start_key_part_map)); if (!start_key_part_map) DBUG_RETURN(0); if (start_where) { 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); } else { if (str->reserve(SPIDER_SQL_AND_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN); } for ( key_part = key_info->key_part, key_count = 0; start_key_part_map; start_key_part_map >>= 1, key_part++, key_count++ ) { field = key_part->field; key_name_length = mysql_share->column_name_str[field->field_index].length(); length = my_sprintf(tmp_buf, (tmp_buf, "c%u", key_count)); if (str->reserve(length + table_alias_lengths[0] + key_name_length + /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + table_alias_lengths[1] + SPIDER_SQL_PF_EQUAL_LEN + SPIDER_SQL_AND_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(table_aliases[0], table_alias_lengths[0]); str->q_append(tmp_buf, length); str->q_append(SPIDER_SQL_PF_EQUAL_STR, SPIDER_SQL_PF_EQUAL_LEN); str->q_append(table_aliases[1], table_alias_lengths[1]); mysql_share->append_column_name(str, field->field_index); str->q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN); } str->length(str->length() - SPIDER_SQL_AND_LEN); DBUG_RETURN(0); } int spider_mbase_handler::append_tmp_table_and_sql_for_bka( const key_range *start_key ) { int error_num; 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]; int tmp_table_name_length; spider_string tgt_table_name_str(tgt_table_name, MAX_FIELD_WIDTH * 2, mysql_share->db_names_str[0].charset()); const char *table_names[2], *table_aliases[2], *table_dot_aliases[2]; uint table_name_lengths[2], table_alias_lengths[2], table_dot_alias_lengths[2]; tgt_table_name_str.init_calc_mem(99); tgt_table_name_str.length(0); create_tmp_bka_table_name(tmp_table_name, &tmp_table_name_length, first_link_idx); if ((error_num = append_table_name_with_adjusting(&tgt_table_name_str, first_link_idx, SPIDER_SQL_TYPE_SELECT_SQL))) { DBUG_RETURN(error_num); } table_names[0] = tmp_table_name; table_names[1] = tgt_table_name_str.c_ptr_safe(); table_name_lengths[0] = tmp_table_name_length; table_name_lengths[1] = tgt_table_name_str.length(); table_aliases[0] = SPIDER_SQL_A_STR; table_aliases[1] = SPIDER_SQL_B_STR; table_alias_lengths[0] = SPIDER_SQL_A_LEN; table_alias_lengths[1] = SPIDER_SQL_B_LEN; table_dot_aliases[0] = SPIDER_SQL_A_DOT_STR; table_dot_aliases[1] = SPIDER_SQL_B_DOT_STR; table_dot_alias_lengths[0] = SPIDER_SQL_A_DOT_LEN; table_dot_alias_lengths[1] = SPIDER_SQL_B_DOT_LEN; if ( (error_num = append_drop_tmp_bka_table( &tmp_sql, tmp_table_name, tmp_table_name_length, &tmp_sql_pos1, &tmp_sql_pos5, TRUE)) || (error_num = append_create_tmp_bka_table( start_key, &tmp_sql, tmp_table_name, tmp_table_name_length, &tmp_sql_pos2, spider->share->table_share->table_charset)) || (error_num = append_insert_tmp_bka_table( start_key, &tmp_sql, tmp_table_name, tmp_table_name_length, &tmp_sql_pos3)) ) DBUG_RETURN(error_num); tmp_sql_pos4 = tmp_sql.length(); if ((error_num = spider_db_append_select(spider))) DBUG_RETURN(error_num); if (sql.reserve(SPIDER_SQL_A_DOT_LEN + SPIDER_SQL_ID_LEN + SPIDER_SQL_COMMA_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); sql.q_append(SPIDER_SQL_A_DOT_STR, SPIDER_SQL_A_DOT_LEN); sql.q_append(SPIDER_SQL_ID_STR, SPIDER_SQL_ID_LEN); sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); if ( (error_num = append_select_columns_with_alias(&sql, SPIDER_SQL_B_DOT_STR, SPIDER_SQL_B_DOT_LEN)) || (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)) ) DBUG_RETURN(error_num); if ( mysql_share->key_hint && (error_num = spider_db_append_hint_after_table(spider, &sql, &mysql_share->key_hint[spider->active_index])) ) DBUG_RETURN(HA_ERR_OUT_OF_MEM); where_pos = sql.length(); if ( (error_num = append_key_join_columns_for_bka( start_key, &sql, table_dot_aliases, table_dot_alias_lengths)) || (error_num = append_condition_part( SPIDER_SQL_B_DOT_STR, SPIDER_SQL_B_DOT_LEN, SPIDER_SQL_TYPE_SELECT_SQL, FALSE)) ) DBUG_RETURN(error_num); if (spider->result_list.direct_order_limit) { if ((error_num = append_key_order_for_direct_order_limit_with_alias(&sql, SPIDER_SQL_B_DOT_STR, SPIDER_SQL_B_DOT_LEN))) DBUG_RETURN(error_num); } else if (spider->result_list.direct_aggregate) { if ((error_num = append_group_by(&sql, SPIDER_SQL_B_DOT_STR, SPIDER_SQL_B_DOT_LEN))) DBUG_RETURN(error_num); } DBUG_RETURN(0); } int spider_mbase_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); ha_sql.length(ha_limit_pos); DBUG_RETURN(0); } 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_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) { adjust_length = mysql_share->db_nm_max_length - mysql_share->db_names_str[spider->conn_link_idx[link_idx]].length() + mysql_share->table_nm_max_length - mysql_share->table_names_str[spider->conn_link_idx[link_idx]].length(); *tmp_table_name_length = mysql_share->db_nm_max_length + mysql_share->table_nm_max_length; memset(tmp_table_name, ' ', adjust_length); tmp_table_name += adjust_length; memcpy(tmp_table_name, mysql_share->db_names_str[link_idx].c_ptr(), mysql_share->db_names_str[link_idx].length()); tmp_table_name += mysql_share->db_names_str[link_idx].length(); length = my_sprintf(tmp_table_name, (tmp_table_name, "%s%s%p%s", SPIDER_SQL_DOT_STR, SPIDER_SQL_TMP_BKA_STR, spider, SPIDER_SQL_UNDERSCORE_STR)); *tmp_table_name_length += length; tmp_table_name += length; memcpy(tmp_table_name, mysql_share->table_names_str[spider->conn_link_idx[link_idx]].c_ptr(), mysql_share->table_names_str[spider->conn_link_idx[link_idx]].length()); } else { adjust_length = mysql_share->db_nm_max_length - mysql_share->db_names_str[spider->conn_link_idx[link_idx]].length(); *tmp_table_name_length = mysql_share->db_nm_max_length; memset(tmp_table_name, ' ', adjust_length); tmp_table_name += adjust_length; memcpy(tmp_table_name, mysql_share->db_names_str[link_idx].c_ptr(), mysql_share->db_names_str[link_idx].length()); tmp_table_name += mysql_share->db_names_str[link_idx].length(); length = my_sprintf(tmp_table_name, (tmp_table_name, "%s%s%p", SPIDER_SQL_DOT_STR, SPIDER_SQL_TMP_BKA_STR, spider)); *tmp_table_name_length += length; } DBUG_VOID_RETURN; } int spider_mbase_handler::append_create_tmp_bka_table( const key_range *start_key, spider_string *str, char *tmp_table_name, int tmp_table_name_length, int *db_name_pos, CHARSET_INFO *table_charset ) { int error_num; SPIDER_SHARE *share = spider->share; THD *thd = spider->wide_handler->trx->thd; char *bka_engine = spider_param_bka_engine(thd, share->bka_engine); uint bka_engine_length = strlen(bka_engine), cset_length = table_charset->cs_name.length, coll_length = table_charset->coll_name.length; 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)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_CREATE_TMP_STR, SPIDER_SQL_CREATE_TMP_LEN); *db_name_pos = str->length(); str->q_append(tmp_table_name, tmp_table_name_length); str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN); str->q_append(SPIDER_SQL_ID_STR, SPIDER_SQL_ID_LEN); str->q_append(SPIDER_SQL_ID_TYPE_STR, SPIDER_SQL_ID_TYPE_LEN); str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); if ((error_num = append_key_column_types(start_key, str))) DBUG_RETURN(error_num); if (str->reserve(SPIDER_SQL_ENGINE_LEN + bka_engine_length + SPIDER_SQL_DEF_CHARSET_LEN + cset_length + SPIDER_SQL_COLLATE_LEN + coll_length + SPIDER_SQL_SEMICOLON_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_ENGINE_STR, SPIDER_SQL_ENGINE_LEN); str->q_append(bka_engine, bka_engine_length); str->q_append(SPIDER_SQL_DEF_CHARSET_STR, SPIDER_SQL_DEF_CHARSET_LEN); str->q_append(table_charset->cs_name.str, cset_length); str->q_append(SPIDER_SQL_COLLATE_STR, SPIDER_SQL_COLLATE_LEN); str->q_append(table_charset->coll_name.str, coll_length); str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN); DBUG_RETURN(0); } int spider_mbase_handler::append_drop_tmp_bka_table( spider_string *str, char *tmp_table_name, int tmp_table_name_length, int *db_name_pos, int *drop_table_end_pos, bool with_semicolon ) { 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); str->q_append(SPIDER_SQL_DROP_TMP_STR, SPIDER_SQL_DROP_TMP_LEN); *db_name_pos = str->length(); str->q_append(tmp_table_name, tmp_table_name_length); *drop_table_end_pos = str->length(); if (with_semicolon) str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN); DBUG_RETURN(0); } int spider_mbase_handler::append_insert_tmp_bka_table( const key_range *start_key, spider_string *str, char *tmp_table_name, int tmp_table_name_length, int *db_name_pos ) { int error_num; 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)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_INSERT_STR, SPIDER_SQL_INSERT_LEN); str->q_append(SPIDER_SQL_INTO_STR, SPIDER_SQL_INTO_LEN); *db_name_pos = str->length(); str->q_append(tmp_table_name, tmp_table_name_length); str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN); str->q_append(SPIDER_SQL_ID_STR, SPIDER_SQL_ID_LEN); str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); if ((error_num = spider_db_append_key_columns(start_key, spider, str))) DBUG_RETURN(error_num); if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN + SPIDER_SQL_VALUES_LEN + SPIDER_SQL_OPEN_PAREN_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN); str->q_append(SPIDER_SQL_VALUES_STR, SPIDER_SQL_VALUES_LEN); str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN); DBUG_RETURN(0); } int spider_mbase_handler::append_union_table_and_sql_for_bka( const key_range *start_key ) { int error_num; 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, mysql_share->db_names_str[0].charset()); const char *table_names[2], *table_aliases[2], *table_dot_aliases[2]; uint table_name_lengths[2], table_alias_lengths[2], table_dot_alias_lengths[2]; tgt_table_name_str.init_calc_mem(233); tgt_table_name_str.length(0); if ((error_num = append_table_name_with_adjusting(&tgt_table_name_str, first_link_idx, SPIDER_SQL_TYPE_SELECT_SQL))) { DBUG_RETURN(error_num); } table_names[0] = ""; table_names[1] = tgt_table_name_str.c_ptr_safe(); table_name_lengths[0] = 0; table_name_lengths[1] = tgt_table_name_str.length(); table_aliases[0] = SPIDER_SQL_A_STR; table_aliases[1] = SPIDER_SQL_B_STR; table_alias_lengths[0] = SPIDER_SQL_A_LEN; table_alias_lengths[1] = SPIDER_SQL_B_LEN; table_dot_aliases[0] = SPIDER_SQL_A_DOT_STR; table_dot_aliases[1] = SPIDER_SQL_B_DOT_STR; table_dot_alias_lengths[0] = SPIDER_SQL_A_DOT_LEN; table_dot_alias_lengths[1] = SPIDER_SQL_B_DOT_LEN; if ((error_num = spider_db_append_select(spider))) DBUG_RETURN(error_num); if (sql.reserve(SPIDER_SQL_A_DOT_LEN + SPIDER_SQL_ID_LEN + SPIDER_SQL_COMMA_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); sql.q_append(SPIDER_SQL_A_DOT_STR, SPIDER_SQL_A_DOT_LEN); sql.q_append(SPIDER_SQL_ID_STR, SPIDER_SQL_ID_LEN); sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); if ((error_num = append_select_columns_with_alias(&sql, SPIDER_SQL_B_DOT_STR, SPIDER_SQL_B_DOT_LEN))) DBUG_RETURN(error_num); if (sql.reserve(SPIDER_SQL_FROM_LEN + (SPIDER_SQL_OPEN_PAREN_LEN * 2))) DBUG_RETURN(HA_ERR_OUT_OF_MEM); sql.q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN); sql.q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN); sql.q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN); tmp_sql_pos1 = sql.length(); if ( (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)) ) DBUG_RETURN(error_num); if ( mysql_share->key_hint && (error_num = spider_db_append_hint_after_table(spider, &tmp_sql, &mysql_share->key_hint[spider->active_index])) ) DBUG_RETURN(HA_ERR_OUT_OF_MEM); where_pos = tmp_sql.length(); if ( (error_num = append_key_join_columns_for_bka( start_key, &tmp_sql, table_dot_aliases, table_dot_alias_lengths)) || (error_num = append_condition_part( SPIDER_SQL_B_DOT_STR, SPIDER_SQL_B_DOT_LEN, SPIDER_SQL_TYPE_TMP_SQL, FALSE)) ) DBUG_RETURN(error_num); if (spider->result_list.direct_order_limit) { if ((error_num = append_key_order_for_direct_order_limit_with_alias(&tmp_sql, SPIDER_SQL_B_DOT_STR, SPIDER_SQL_B_DOT_LEN)) ) DBUG_RETURN(error_num); } else if (spider->result_list.direct_aggregate) { if ((error_num = append_group_by(&tmp_sql, SPIDER_SQL_B_DOT_STR, SPIDER_SQL_B_DOT_LEN))) DBUG_RETURN(error_num); } DBUG_RETURN(0); } int spider_mbase_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_mbase_handler::append_insert_for_recovery( ulong sql_type, int link_idx ) { const TABLE *table = spider->get_table(); SPIDER_SHARE *share = spider->share; Field **field; uint field_name_length = 0; bool add_value = FALSE; spider_string *insert_sql; DBUG_ENTER("spider_mbase_handler::append_insert_for_recovery"); DBUG_PRINT("info",("spider this=%p", this)); if (sql_type == SPIDER_SQL_TYPE_INSERT_SQL) { insert_sql = &spider->result_list.insert_sqls[link_idx]; insert_sql->length(0); } else { insert_sql = &spider->result_list.update_sqls[link_idx]; } if (insert_sql->reserve( SPIDER_SQL_INSERT_LEN + SPIDER_SQL_SQL_IGNORE_LEN + SPIDER_SQL_INTO_LEN + mysql_share->db_nm_max_length + SPIDER_SQL_DOT_LEN + mysql_share->table_nm_max_length + /* SPIDER_SQL_NAME_QUOTE_LEN */ 4 + SPIDER_SQL_OPEN_PAREN_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); insert_sql->q_append(SPIDER_SQL_INSERT_STR, SPIDER_SQL_INSERT_LEN); insert_sql->q_append(SPIDER_SQL_SQL_IGNORE_STR, SPIDER_SQL_SQL_IGNORE_LEN); insert_sql->q_append(SPIDER_SQL_INTO_STR, SPIDER_SQL_INTO_LEN); mysql_share->append_table_name(insert_sql, spider->conn_link_idx[link_idx]); insert_sql->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN); for (field = table->field; *field; field++) { field_name_length = mysql_share->column_name_str[(*field)->field_index].length(); if (insert_sql->reserve(field_name_length + /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); mysql_share->append_column_name(insert_sql, (*field)->field_index); insert_sql->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); } if (field_name_length) insert_sql->length(insert_sql->length() - SPIDER_SQL_COMMA_LEN); if (insert_sql->reserve(SPIDER_SQL_CLOSE_PAREN_LEN + SPIDER_SQL_VALUES_LEN + SPIDER_SQL_OPEN_PAREN_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); insert_sql->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN); insert_sql->q_append(SPIDER_SQL_VALUES_STR, SPIDER_SQL_VALUES_LEN); insert_sql->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN); for (field = table->field; *field; field++) { add_value = TRUE; if ((*field)->is_null()) { if (insert_sql->reserve(SPIDER_SQL_NULL_LEN + SPIDER_SQL_COMMA_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); insert_sql->q_append(SPIDER_SQL_NULL_STR, SPIDER_SQL_NULL_LEN); } else { if (spider_db_mbase_utility->append_column_value(spider, insert_sql, *field, NULL, false, share->access_charset) || insert_sql->reserve(SPIDER_SQL_COMMA_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); } insert_sql->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); } if (add_value) insert_sql->length(insert_sql->length() - SPIDER_SQL_COMMA_LEN); if (insert_sql->reserve(SPIDER_SQL_CLOSE_PAREN_LEN, SPIDER_SQL_COMMA_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); insert_sql->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN); if (sql_type == SPIDER_SQL_TYPE_INSERT_SQL) { exec_insert_sql = insert_sql; } DBUG_RETURN(0); } 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_mbase_handler::append_update"); DBUG_PRINT("info",("spider this=%p", this)); if (str->length() > 0) { if (str->reserve(SPIDER_SQL_SEMICOLON_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN); } if ( (error_num = append_update(str, 0)) || (error_num = append_update_set(str)) || (error_num = append_update_where(str, table, ptr_diff)) ) DBUG_RETURN(error_num); filled_up = (str->length() >= (uint) spider->result_list.bulk_update_size); DBUG_RETURN(0); } int spider_mbase_handler::append_update( const TABLE *table, my_ptrdiff_t ptr_diff, int link_idx ) { int error_num; SPIDER_SHARE *share = spider->share; spider_string *str = &spider->result_list.update_sqls[link_idx]; DBUG_ENTER("spider_mbase_handler::append_update"); DBUG_PRINT("info",("spider this=%p", this)); if (str->length() > 0) { if (str->reserve(SPIDER_SQL_SEMICOLON_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN); } if ( (error_num = append_update(str, link_idx)) || (error_num = append_update_set(str)) || (error_num = append_update_where(str, table, ptr_diff)) ) DBUG_RETURN(error_num); if ( spider->pk_update && share->link_statuses[link_idx] == SPIDER_LINK_STATUS_RECOVERY ) { if (str->reserve(SPIDER_SQL_SEMICOLON_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN); if ((error_num = append_insert_for_recovery( SPIDER_SQL_TYPE_UPDATE_SQL, link_idx))) DBUG_RETURN(error_num); } if (!filled_up) filled_up = (str->length() >= (uint) spider->result_list.bulk_update_size); DBUG_RETURN(0); } 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_mbase_handler::append_delete"); DBUG_PRINT("info",("spider this=%p", this)); if (str->length() > 0) { if (str->reserve(SPIDER_SQL_SEMICOLON_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN); } if ( (error_num = append_delete(str)) || (error_num = append_from(str, SPIDER_SQL_TYPE_DELETE_SQL, first_link_idx)) || (error_num = append_update_where(str, table, ptr_diff)) ) DBUG_RETURN(error_num); filled_up = (str->length() >= (uint) spider->result_list.bulk_update_size); DBUG_RETURN(0); } 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_mbase_handler::append_delete"); DBUG_PRINT("info",("spider this=%p", this)); if (str->length() > 0) { if (str->reserve(SPIDER_SQL_SEMICOLON_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN); } if ( (error_num = append_delete(str)) || (error_num = append_from(str, SPIDER_SQL_TYPE_DELETE_SQL, link_idx)) || (error_num = append_update_where(str, table, ptr_diff)) ) DBUG_RETURN(error_num); if (!filled_up) filled_up = (str->length() >= (uint) spider->result_list.bulk_update_size); DBUG_RETURN(0); } int spider_mbase_handler::append_insert_part() { int error_num; 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_mbase_handler::append_insert( spider_string *str, int link_idx ) { DBUG_ENTER("spider_mbase_handler::append_insert"); direct_insert_kind = SPIDER_SQL_DIRECT_INSERT_KIND_INSERT; if ( ( spider->wide_handler->write_can_replace || /* for direct_dup_insert without patch for partition */ spider->wide_handler->sql_command == SQLCOM_REPLACE || spider->wide_handler->sql_command == SQLCOM_REPLACE_SELECT ) && spider->direct_dup_insert ) { direct_insert_kind = SPIDER_SQL_DIRECT_INSERT_KIND_REPLACE; if (str->reserve(SPIDER_SQL_REPLACE_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_REPLACE_STR, SPIDER_SQL_REPLACE_LEN); } else { if (str->reserve(SPIDER_SQL_INSERT_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_INSERT_STR, SPIDER_SQL_INSERT_LEN); } if (spider->wide_handler->low_priority) { if (str->reserve(SPIDER_SQL_LOW_PRIORITY_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_LOW_PRIORITY_STR, SPIDER_SQL_LOW_PRIORITY_LEN); } else if ( spider->wide_handler->lock_type >= TL_WRITE && !spider->wide_handler->write_can_replace && /* for direct_dup_insert without patch for partition */ spider->wide_handler->sql_command != SQLCOM_REPLACE && spider->wide_handler->sql_command != SQLCOM_REPLACE_SELECT ) { if (str->reserve(SPIDER_SQL_HIGH_PRIORITY_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_HIGH_PRIORITY_STR, SPIDER_SQL_HIGH_PRIORITY_LEN); } if ( spider->wide_handler->ignore_dup_key && spider->direct_dup_insert && !spider->wide_handler->write_can_replace && (!spider->wide_handler->insert_with_update || !dup_update_sql.length()) && /* for direct_dup_insert without patch for partition */ spider->wide_handler->sql_command != SQLCOM_REPLACE && spider->wide_handler->sql_command != SQLCOM_REPLACE_SELECT ) { direct_insert_kind = SPIDER_SQL_DIRECT_INSERT_KIND_IGNORE; if (str->reserve(SPIDER_SQL_SQL_IGNORE_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_SQL_IGNORE_STR, SPIDER_SQL_SQL_IGNORE_LEN); } DBUG_RETURN(0); } int spider_mbase_handler::append_update_part() { int error_num; 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_mbase_handler::append_update( spider_string *str, int link_idx ) { 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); if (spider->wide_handler->low_priority) { if (str->reserve(SPIDER_SQL_LOW_PRIORITY_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_LOW_PRIORITY_STR, SPIDER_SQL_LOW_PRIORITY_LEN); } if ( spider->wide_handler->ignore_dup_key && !spider->wide_handler->insert_with_update ) { if (str->reserve(SPIDER_SQL_SQL_IGNORE_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_SQL_IGNORE_STR, SPIDER_SQL_SQL_IGNORE_LEN); } if (str->reserve(mysql_share->db_nm_max_length + SPIDER_SQL_DOT_LEN + mysql_share->table_nm_max_length + /* SPIDER_SQL_NAME_QUOTE_LEN */ 4)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); table_name_pos = str->length(); append_table_name_with_adjusting(str, link_idx, SPIDER_SQL_TYPE_UPDATE_SQL); DBUG_RETURN(0); } int spider_mbase_handler::append_delete_part() { int error_num; 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_mbase_handler::append_delete( spider_string *str ) { 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); if (spider->wide_handler->low_priority) { if (str->reserve(SPIDER_SQL_LOW_PRIORITY_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_LOW_PRIORITY_STR, SPIDER_SQL_LOW_PRIORITY_LEN); } if (spider->wide_handler->quick_mode) { if (str->reserve(SPIDER_SQL_SQL_QUICK_MODE_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_SQL_QUICK_MODE_STR, SPIDER_SQL_SQL_QUICK_MODE_LEN); } if (spider->wide_handler->ignore_dup_key) { if (str->reserve(SPIDER_SQL_SQL_IGNORE_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_SQL_IGNORE_STR, SPIDER_SQL_SQL_IGNORE_LEN); } str->length(str->length() - 1); DBUG_RETURN(0); } int spider_mbase_handler::append_update_set_part() { int error_num; 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_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_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); for (fields = table->field; *fields; fields++) { if (bitmap_is_set(table->write_set, (*fields)->field_index)) { field_name_length = mysql_share->column_name_str[(*fields)->field_index].length(); if ((*fields)->is_null()) { if (str->reserve(field_name_length + /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_EQUAL_LEN + SPIDER_SQL_NULL_LEN + SPIDER_SQL_COMMA_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); mysql_share->append_column_name(str, (*fields)->field_index); str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN); str->q_append(SPIDER_SQL_NULL_STR, SPIDER_SQL_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, (*fields)->field_index); str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN); #ifndef DBUG_OFF MY_BITMAP *tmp_map = dbug_tmp_use_all_columns(table, &table->read_set); #endif if (spider_db_mbase_utility->append_column_value( spider, str, *fields, NULL, FALSE, share->access_charset) || str->reserve(SPIDER_SQL_COMMA_LEN)) { #ifndef DBUG_OFF dbug_tmp_restore_column_map(&table->read_set, tmp_map); #endif DBUG_RETURN(HA_ERR_OUT_OF_MEM); } #ifndef DBUG_OFF dbug_tmp_restore_column_map(&table->read_set, tmp_map); #endif } 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_direct_update_set_part() { int error_num; 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_mbase_handler::append_direct_update_set( spider_string *str ) { DBUG_ENTER("spider_mbase_handler::append_direct_update_set"); if (spider->wide_handler->direct_update_fields) { 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); DBUG_RETURN(spider_db_append_update_columns(spider, str, NULL, 0, dbton_id, FALSE, NULL)); } DBUG_RETURN(0); } int spider_mbase_handler::append_dup_update_pushdown_part( const char *alias, uint alias_length ) { int error_num; 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_mbase_handler::append_update_columns_part( const char *alias, uint alias_length ) { int error_num; 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_mbase_handler::check_update_columns_part() { int error_num; 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_mbase_handler::append_update_columns( spider_string *str, const char *alias, uint alias_length ) { int error_num; DBUG_ENTER("spider_mbase_handler::append_update_columns"); error_num = spider_db_append_update_columns(spider, str, alias, alias_length, dbton_id, FALSE, NULL); DBUG_RETURN(error_num); } int spider_mbase_handler::append_select_part( ulong sql_type ) { int error_num; spider_string *str; DBUG_ENTER("spider_mbase_handler::append_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_select(str, sql_type); DBUG_RETURN(error_num); } int spider_mbase_handler::append_select( spider_string *str, ulong sql_type ) { SPIDER_RESULT_LIST *result_list = &spider->result_list; SPIDER_WIDE_HANDLER *wide_handler = spider->wide_handler; DBUG_ENTER("spider_mbase_handler::append_select"); { if (str->reserve(SPIDER_SQL_SELECT_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_SELECT_STR, SPIDER_SQL_SELECT_LEN); if (result_list->direct_distinct) { if (str->reserve(SPIDER_SQL_DISTINCT_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_DISTINCT_STR, SPIDER_SQL_DISTINCT_LEN); } if (wide_handler->external_lock_type != F_WRLCK && wide_handler->lock_mode < 1) { /* no lock */ LEX *lex = wide_handler->trx->thd->lex; if ( lex->sql_cache == LEX::SQL_CACHE && (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 ( lex->sql_cache == LEX::SQL_NO_CACHE && (spider->share->query_cache_sync & 2) ) { if (str->reserve(SPIDER_SQL_SQL_NO_CACHE_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_SQL_NO_CACHE_STR, SPIDER_SQL_SQL_NO_CACHE_LEN); } else if (spider->share->query_cache == 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 (spider->share->query_cache == 2) { if (str->reserve(SPIDER_SQL_SQL_NO_CACHE_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_SQL_NO_CACHE_STR, SPIDER_SQL_SQL_NO_CACHE_LEN); } } if (wide_handler->high_priority) { if (str->reserve(SPIDER_SQL_HIGH_PRIORITY_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_HIGH_PRIORITY_STR, SPIDER_SQL_HIGH_PRIORITY_LEN); } } DBUG_RETURN(0); } int spider_mbase_handler::append_table_select_part( ulong sql_type ) { int error_num; spider_string *str; DBUG_ENTER("spider_mbase_handler::append_table_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_table_select(str); DBUG_RETURN(error_num); } int spider_mbase_handler::append_table_select( spider_string *str ) { st_select_lex *select_lex = NULL; bool sgb = (spider->result_list.direct_aggregate && spider_param_strict_group_by(current_thd, (strict_group_by ? 1 : 0)) == 1); DBUG_ENTER("spider_mbase_handler::append_table_select"); if (sgb) { select_lex = spider_get_select_lex(spider); JOIN *join = select_lex->join; if (!(*join->sum_funcs) && !select_lex->group_list.elements) { select_lex = NULL; } } if (select_lex) { TABLE *table = spider->get_table(); Field **field; int field_length; for (field = table->field; *field; field++) { field_length = mysql_share->column_name_str[(*field)->field_index].length(); if (!spider_db_check_select_colum_in_group(select_lex, *field)) { if (str->reserve(SPIDER_SQL_MIN_LEN + SPIDER_SQL_OPEN_PAREN_LEN + field_length + /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_CLOSE_PAREN_LEN + SPIDER_SQL_COMMA_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_MIN_STR, SPIDER_SQL_MIN_LEN); str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN); mysql_share->append_column_name(str, (*field)->field_index); str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN); } else { if (str->reserve(field_length + /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); mysql_share->append_column_name(str, (*field)->field_index); } str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); } str->length(str->length() - SPIDER_SQL_COMMA_LEN); } else { 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_mbase_handler::append_key_select_part( ulong sql_type, uint idx ) { int error_num; spider_string *str; DBUG_ENTER("spider_mbase_handler::append_key_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_key_select(str, idx); DBUG_RETURN(error_num); } int spider_mbase_handler::append_key_select( spider_string *str, uint idx ) { st_select_lex *select_lex = NULL; bool sgb = (spider->result_list.direct_aggregate && spider_param_strict_group_by(current_thd, (strict_group_by ? 1 : 0)) == 1); DBUG_ENTER("spider_mbase_handler::append_key_select"); if (sgb) { select_lex = spider_get_select_lex(spider); JOIN *join = select_lex->join; if (!(*join->sum_funcs) && !select_lex->group_list.elements) { select_lex = NULL; } } if (select_lex) { TABLE *table = spider->get_table(); KEY *key_info = &table->key_info[idx]; KEY_PART_INFO *key_part; Field *field; uint part_num; int field_length; 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_length = mysql_share->column_name_str[field->field_index].length(); if (!spider_db_check_select_colum_in_group(select_lex, field)) { if (str->reserve(SPIDER_SQL_MIN_LEN + SPIDER_SQL_OPEN_PAREN_LEN + field_length + /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_CLOSE_PAREN_LEN + SPIDER_SQL_COMMA_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_MIN_STR, SPIDER_SQL_MIN_LEN); str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN); mysql_share->append_column_name(str, field->field_index); str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN); } else { if (str->reserve(field_length + /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); mysql_share->append_column_name(str, field->field_index); } str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); } str->length(str->length() - SPIDER_SQL_COMMA_LEN); } else { 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_mbase_handler::append_minimum_select_part( ulong sql_type ) { int error_num; spider_string *str; DBUG_ENTER("spider_mbase_handler::append_minimum_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_minimum_select(str, sql_type); DBUG_RETURN(error_num); } int spider_mbase_handler::append_minimum_select( spider_string *str, ulong sql_type ) { TABLE *table = spider->get_table(); Field **field; int field_length; bool appended = FALSE; st_select_lex *select_lex = NULL; bool sgb = (spider->result_list.direct_aggregate && spider_param_strict_group_by(current_thd, (strict_group_by ? 1 : 0)) == 1); DBUG_ENTER("spider_mbase_handler::append_minimum_select"); if (sgb) { select_lex = spider_get_select_lex(spider); JOIN *join = select_lex->join; if (!(*join->sum_funcs) && !select_lex->group_list.elements) { select_lex = NULL; } } minimum_select_bitmap_create(); for (field = table->field; *field; field++) { if (minimum_select_bit_is_set((*field)->field_index)) { /* spider_set_bit(minimum_select_bitmap, (*field)->field_index); */ field_length = mysql_share->column_name_str[(*field)->field_index].length(); if (select_lex && !spider_db_check_select_colum_in_group(select_lex, *field)) { if (str->reserve(SPIDER_SQL_MIN_LEN + SPIDER_SQL_OPEN_PAREN_LEN + field_length + /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_CLOSE_PAREN_LEN + SPIDER_SQL_COMMA_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_MIN_STR, SPIDER_SQL_MIN_LEN); str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN); mysql_share->append_column_name(str, (*field)->field_index); str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN); } else { if (str->reserve(field_length + /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); mysql_share->append_column_name(str, (*field)->field_index); } str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); appended = TRUE; } } if (appended) str->length(str->length() - SPIDER_SQL_COMMA_LEN); else { 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); } DBUG_RETURN(append_from(str, sql_type, first_link_idx)); } int spider_mbase_handler::append_table_select_with_alias( spider_string *str, const char *alias, uint alias_length ) { TABLE *table = spider->get_table(); Field **field; int field_length; st_select_lex *select_lex = NULL; bool sgb = (spider->result_list.direct_aggregate && spider_param_strict_group_by(current_thd, (strict_group_by ? 1 : 0)) == 1); DBUG_ENTER("spider_mbase_handler::append_table_select_with_alias"); if (sgb) { select_lex = spider_get_select_lex(spider); JOIN *join = select_lex->join; if (!(*join->sum_funcs) && !select_lex->group_list.elements) { select_lex = NULL; } } for (field = table->field; *field; field++) { field_length = mysql_share->column_name_str[(*field)->field_index].length(); if (select_lex && !spider_db_check_select_colum_in_group(select_lex, *field)) { if (str->reserve(SPIDER_SQL_MIN_LEN + SPIDER_SQL_OPEN_PAREN_LEN + alias_length + field_length + /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_CLOSE_PAREN_LEN + SPIDER_SQL_COMMA_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_MIN_STR, SPIDER_SQL_MIN_LEN); str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN); str->q_append(alias, alias_length); mysql_share->append_column_name(str, (*field)->field_index); str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN); } else { if (str->reserve(alias_length + field_length + /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(alias, alias_length); mysql_share->append_column_name(str, (*field)->field_index); } 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_key_select_with_alias( spider_string *str, const KEY *key_info, const char *alias, uint alias_length ) { KEY_PART_INFO *key_part; Field *field; uint part_num; int field_length; st_select_lex *select_lex = NULL; bool sgb = (spider->result_list.direct_aggregate && spider_param_strict_group_by(current_thd, (strict_group_by ? 1 : 0)) == 1); DBUG_ENTER("spider_mbase_handler::append_key_select_with_alias"); if (sgb) { select_lex = spider_get_select_lex(spider); JOIN *join = select_lex->join; if (!(*join->sum_funcs) && !select_lex->group_list.elements) { select_lex = NULL; } } 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_length = mysql_share->column_name_str[field->field_index].length(); if (select_lex && !spider_db_check_select_colum_in_group(select_lex, field)) { if (str->reserve(SPIDER_SQL_MIN_LEN + SPIDER_SQL_OPEN_PAREN_LEN + alias_length + field_length + /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_CLOSE_PAREN_LEN + SPIDER_SQL_COMMA_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_MIN_STR, SPIDER_SQL_MIN_LEN); str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN); str->q_append(alias, alias_length); mysql_share->append_column_name(str, field->field_index); str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN); } else { if (str->reserve(alias_length + field_length + /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(alias, alias_length); mysql_share->append_column_name(str, field->field_index); } 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_minimum_select_with_alias( spider_string *str, const char *alias, uint alias_length ) { TABLE *table = spider->get_table(); Field **field; int field_length; bool appended = FALSE; st_select_lex *select_lex = NULL; bool sgb = (spider->result_list.direct_aggregate && spider_param_strict_group_by(current_thd, (strict_group_by ? 1 : 0)) == 1); DBUG_ENTER("spider_mbase_handler::append_minimum_select_with_alias"); if (sgb) { select_lex = spider_get_select_lex(spider); JOIN *join = select_lex->join; if (!(*join->sum_funcs) && !select_lex->group_list.elements) { select_lex = NULL; } } minimum_select_bitmap_create(); for (field = table->field; *field; field++) { if (minimum_select_bit_is_set((*field)->field_index)) { /* spider_set_bit(minimum_select_bitmap, (*field)->field_index); */ field_length = mysql_share->column_name_str[(*field)->field_index].length(); if (select_lex && !spider_db_check_select_colum_in_group(select_lex, *field)) { if (str->reserve(SPIDER_SQL_MIN_LEN + SPIDER_SQL_OPEN_PAREN_LEN + alias_length + field_length + /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_CLOSE_PAREN_LEN + SPIDER_SQL_COMMA_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_MIN_STR, SPIDER_SQL_MIN_LEN); str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN); str->q_append(alias, alias_length); mysql_share->append_column_name(str, (*field)->field_index); str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN); } else { if (str->reserve(alias_length + field_length + /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(alias, alias_length); mysql_share->append_column_name(str, (*field)->field_index); } str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); appended = TRUE; } } if (appended) str->length(str->length() - SPIDER_SQL_COMMA_LEN); else { 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); } DBUG_RETURN(0); } 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_mbase_handler::append_select_columns_with_alias"); if ( result_list->direct_aggregate && (error_num = append_sum_select(str, alias, alias_length)) ) DBUG_RETURN(error_num); if ((error_num = append_match_select(str, alias, alias_length))) DBUG_RETURN(error_num); if (!spider->select_column_mode) { if (result_list->keyread) DBUG_RETURN(append_key_select_with_alias( str, result_list->key_info, alias, alias_length)); else DBUG_RETURN(append_table_select_with_alias( str, alias, alias_length)); } DBUG_RETURN(append_minimum_select_with_alias(str, alias, alias_length)); } int spider_mbase_handler::append_hint_after_table_part( ulong sql_type ) { int error_num; spider_string *str; DBUG_ENTER("spider_mbase_handler::append_hint_after_table_part"); DBUG_PRINT("info",("spider this=%p", this)); switch (sql_type) { case SPIDER_SQL_TYPE_SELECT_SQL: case SPIDER_SQL_TYPE_TMP_SQL: str = &sql; break; case SPIDER_SQL_TYPE_INSERT_SQL: case SPIDER_SQL_TYPE_UPDATE_SQL: case SPIDER_SQL_TYPE_DELETE_SQL: case SPIDER_SQL_TYPE_BULK_UPDATE_SQL: str = &update_sql; break; default: DBUG_RETURN(0); } error_num = append_hint_after_table(str); DBUG_RETURN(error_num); } int spider_mbase_handler::append_hint_after_table( spider_string *str ) { int error_num; DBUG_ENTER("spider_mbase_handler::append_hint_after_table"); DBUG_PRINT("info",("spider this=%p", this)); if ( mysql_share->key_hint && (error_num = spider_db_append_hint_after_table(spider, str, &mysql_share->key_hint[spider->active_index])) ) DBUG_RETURN(HA_ERR_OUT_OF_MEM); DBUG_RETURN(0); } void spider_mbase_handler::set_where_pos( ulong sql_type ) { DBUG_ENTER("spider_mbase_handler::set_where_pos"); switch (sql_type) { case SPIDER_SQL_TYPE_SELECT_SQL: case SPIDER_SQL_TYPE_TMP_SQL: where_pos = sql.length(); break; case SPIDER_SQL_TYPE_INSERT_SQL: case SPIDER_SQL_TYPE_UPDATE_SQL: case SPIDER_SQL_TYPE_DELETE_SQL: case SPIDER_SQL_TYPE_BULK_UPDATE_SQL: where_pos = update_sql.length(); break; default: break; } DBUG_VOID_RETURN; } void spider_mbase_handler::set_where_to_pos( ulong sql_type ) { DBUG_ENTER("spider_mbase_handler::set_where_to_pos"); switch (sql_type) { case SPIDER_SQL_TYPE_SELECT_SQL: case SPIDER_SQL_TYPE_TMP_SQL: sql.length(where_pos); break; case SPIDER_SQL_TYPE_INSERT_SQL: case SPIDER_SQL_TYPE_UPDATE_SQL: case SPIDER_SQL_TYPE_DELETE_SQL: case SPIDER_SQL_TYPE_BULK_UPDATE_SQL: update_sql.length(where_pos); break; default: break; } DBUG_VOID_RETURN; } int spider_mbase_handler::check_item_type( Item *item ) { int error_num; DBUG_ENTER("spider_mbase_handler::check_item_type"); DBUG_PRINT("info",("spider this=%p", this)); error_num = spider_db_print_item_type(item, NULL, spider, NULL, NULL, 0, dbton_id, FALSE, NULL); DBUG_RETURN(error_num); } int spider_mbase_handler::append_values_connector_part( ulong sql_type ) { int error_num; spider_string *str; DBUG_ENTER("spider_mbase_handler::append_values_connector_part"); DBUG_PRINT("info",("spider this=%p", this)); switch (sql_type) { case SPIDER_SQL_TYPE_SELECT_SQL: str = &sql; break; case SPIDER_SQL_TYPE_TMP_SQL: str = &tmp_sql; break; default: DBUG_RETURN(0); } error_num = append_values_connector(str); DBUG_RETURN(error_num); } int spider_mbase_handler::append_values_connector( spider_string *str ) { 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)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN); str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN); DBUG_RETURN(0); } int spider_mbase_handler::append_values_terminator_part( ulong sql_type ) { int error_num; spider_string *str; DBUG_ENTER("spider_mbase_handler::append_values_terminator_part"); DBUG_PRINT("info",("spider this=%p", this)); switch (sql_type) { case SPIDER_SQL_TYPE_SELECT_SQL: str = &sql; break; case SPIDER_SQL_TYPE_TMP_SQL: str = &tmp_sql; break; default: DBUG_RETURN(0); } error_num = append_values_terminator(str); DBUG_RETURN(error_num); } int spider_mbase_handler::append_values_terminator( spider_string *str ) { 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_mbase_handler::append_union_table_connector_part( ulong sql_type ) { int error_num; spider_string *str; DBUG_ENTER("spider_mbase_handler::append_union_table_connector_part"); DBUG_PRINT("info",("spider this=%p", this)); switch (sql_type) { case SPIDER_SQL_TYPE_SELECT_SQL: str = &sql; break; case SPIDER_SQL_TYPE_TMP_SQL: str = &tmp_sql; break; default: DBUG_RETURN(0); } error_num = append_union_table_connector(str); DBUG_RETURN(error_num); } int spider_mbase_handler::append_union_table_connector( spider_string *str ) { 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); str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN); str->q_append(SPIDER_SQL_UNION_ALL_STR, SPIDER_SQL_UNION_ALL_LEN); str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN); DBUG_RETURN(0); } int spider_mbase_handler::append_union_table_terminator_part( ulong sql_type ) { int error_num; spider_string *str; DBUG_ENTER("spider_mbase_handler::append_union_table_terminator_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_union_table_terminator(str); DBUG_RETURN(error_num); } int spider_mbase_handler::append_union_table_terminator( spider_string *str ) { 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)); str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN); str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN); table_name_pos = str->length() + SPIDER_SQL_SPACE_LEN + SPIDER_SQL_A_LEN + SPIDER_SQL_COMMA_LEN; if (str->reserve(tmp_sql.length() - SPIDER_SQL_FROM_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(tmp_sql.ptr() + SPIDER_SQL_FROM_LEN, tmp_sql.length() - SPIDER_SQL_FROM_LEN); DBUG_RETURN(0); } 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_mbase_handler::append_key_column_values_part"); switch (sql_type) { case SPIDER_SQL_TYPE_SELECT_SQL: str = &sql; break; case SPIDER_SQL_TYPE_TMP_SQL: str = &tmp_sql; break; default: DBUG_RETURN(0); } error_num = append_key_column_values(str, start_key); DBUG_RETURN(error_num); } int spider_mbase_handler::append_key_column_values( spider_string *str, const key_range *start_key ) { int error_num; const uchar *ptr; SPIDER_RESULT_LIST *result_list = &spider->result_list; SPIDER_SHARE *share = spider->share; KEY *key_info = result_list->key_info; uint length; uint store_length; key_part_map full_key_part_map = make_prev_keypart_map(spider_user_defined_key_parts(key_info)); key_part_map start_key_part_map; KEY_PART_INFO *key_part; Field *field; 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))); DBUG_PRINT("info", ("spider full_key_part_map=%lu", full_key_part_map)); DBUG_PRINT("info", ("spider start_key_part_map=%lu", start_key_part_map)); if (!start_key_part_map) DBUG_RETURN(0); for ( key_part = key_info->key_part, length = 0; start_key_part_map; start_key_part_map >>= 1, key_part++, length += store_length ) { store_length = key_part->store_length; ptr = start_key->key + length; field = key_part->field; if ((error_num = spider_db_append_null_value(str, key_part, &ptr))) { if (error_num > 0) DBUG_RETURN(error_num); } else { if (spider_db_mbase_utility->append_column_value( spider, str, field, ptr, FALSE, share->access_charset)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); } 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_key_column_values_with_name_part( const key_range *start_key, ulong sql_type ) { int error_num; spider_string *str; DBUG_ENTER("spider_mbase_handler::append_key_column_values_with_name_part"); switch (sql_type) { case SPIDER_SQL_TYPE_SELECT_SQL: str = &sql; break; case SPIDER_SQL_TYPE_TMP_SQL: str = &tmp_sql; break; default: DBUG_RETURN(0); } error_num = append_key_column_values_with_name(str, start_key); DBUG_RETURN(error_num); } int spider_mbase_handler::append_key_column_values_with_name( spider_string *str, const key_range *start_key ) { int error_num; const uchar *ptr; SPIDER_RESULT_LIST *result_list = &spider->result_list; SPIDER_SHARE *share = spider->share; KEY *key_info = result_list->key_info; uint length; uint key_name_length, key_count; uint store_length; key_part_map full_key_part_map = make_prev_keypart_map(spider_user_defined_key_parts(key_info)); key_part_map start_key_part_map; KEY_PART_INFO *key_part; Field *field; char tmp_buf[MAX_FIELD_WIDTH]; 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))); DBUG_PRINT("info", ("spider full_key_part_map=%lu", full_key_part_map)); DBUG_PRINT("info", ("spider start_key_part_map=%lu", start_key_part_map)); if (!start_key_part_map) DBUG_RETURN(0); for ( key_part = key_info->key_part, length = 0, key_count = 0; start_key_part_map; start_key_part_map >>= 1, key_part++, length += store_length, key_count++ ) { store_length = key_part->store_length; ptr = start_key->key + length; field = key_part->field; if ((error_num = spider_db_append_null_value(str, key_part, &ptr))) { if (error_num > 0) DBUG_RETURN(error_num); } else { if (spider_db_mbase_utility->append_column_value( spider, str, field, ptr, FALSE, share->access_charset)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); } key_name_length = my_sprintf(tmp_buf, (tmp_buf, "c%u", key_count)); if (str->reserve(SPIDER_SQL_SPACE_LEN + key_name_length + SPIDER_SQL_COMMA_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN); str->q_append(tmp_buf, key_name_length); 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_key_where_part( const key_range *start_key, const key_range *end_key, ulong sql_type ) { int error_num; spider_string *str, *str_part = NULL, *str_part2 = NULL; bool set_order; DBUG_ENTER("spider_mbase_handler::append_key_where_part"); switch (sql_type) { case SPIDER_SQL_TYPE_SELECT_SQL: str = &sql; set_order = FALSE; break; case SPIDER_SQL_TYPE_TMP_SQL: str = &tmp_sql; set_order = FALSE; break; case SPIDER_SQL_TYPE_INSERT_SQL: case SPIDER_SQL_TYPE_UPDATE_SQL: case SPIDER_SQL_TYPE_DELETE_SQL: case SPIDER_SQL_TYPE_BULK_UPDATE_SQL: str = &update_sql; set_order = FALSE; break; default: DBUG_RETURN(0); } error_num = append_key_where(str, str_part, str_part2, start_key, end_key, sql_type, set_order); DBUG_RETURN(error_num); } int spider_mbase_handler::append_key_where( spider_string *str, spider_string *str_part, spider_string *str_part2, const key_range *start_key, const key_range *end_key, ulong sql_type, bool set_order ) { int error_num; 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, dbton_id); DBUG_RETURN(error_num); } int spider_mbase_handler::append_is_null_part( ulong sql_type, KEY_PART_INFO *key_part, const key_range *key, const uchar **ptr, bool key_eq, bool tgt_final ) { int error_num; spider_string *str, *str_part = NULL, *str_part2 = NULL; DBUG_ENTER("spider_mbase_handler::append_is_null_part"); DBUG_PRINT("info",("spider this=%p", this)); switch (sql_type) { case SPIDER_SQL_TYPE_SELECT_SQL: case SPIDER_SQL_TYPE_TMP_SQL: str = &sql; break; case SPIDER_SQL_TYPE_INSERT_SQL: case SPIDER_SQL_TYPE_UPDATE_SQL: case SPIDER_SQL_TYPE_DELETE_SQL: case SPIDER_SQL_TYPE_BULK_UPDATE_SQL: str = &update_sql; break; default: DBUG_RETURN(0); } error_num = append_is_null(sql_type, str, str_part, str_part2, key_part, key, ptr, key_eq, tgt_final); DBUG_RETURN(error_num); } int spider_mbase_handler::append_is_null( ulong sql_type, spider_string *str, spider_string *str_part, spider_string *str_part2, KEY_PART_INFO *key_part, const key_range *key, const uchar **ptr, bool key_eq, bool tgt_final ) { 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) { if (*(*ptr)++) { if ( key_eq || key->flag == HA_READ_KEY_EXACT || key->flag == HA_READ_KEY_OR_NEXT ) { if (str->reserve(SPIDER_SQL_IS_NULL_LEN + /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + mysql_share->column_name_str[key_part->field->field_index].length())) DBUG_RETURN(HA_ERR_OUT_OF_MEM); mysql_share->append_column_name(str, key_part->field->field_index); str->q_append(SPIDER_SQL_IS_NULL_STR, SPIDER_SQL_IS_NULL_LEN); } else { if (str->reserve(SPIDER_SQL_IS_NOT_NULL_LEN + /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + mysql_share->column_name_str[key_part->field->field_index].length())) DBUG_RETURN(HA_ERR_OUT_OF_MEM); mysql_share->append_column_name(str, key_part->field->field_index); str->q_append(SPIDER_SQL_IS_NOT_NULL_STR, SPIDER_SQL_IS_NOT_NULL_LEN); } DBUG_RETURN(-1); } } DBUG_RETURN(0); } 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_mbase_handler::append_where_terminator_part"); DBUG_PRINT("info",("spider this=%p", this)); switch (sql_type) { case SPIDER_SQL_TYPE_SELECT_SQL: case SPIDER_SQL_TYPE_TMP_SQL: str = &sql; break; case SPIDER_SQL_TYPE_INSERT_SQL: case SPIDER_SQL_TYPE_UPDATE_SQL: case SPIDER_SQL_TYPE_DELETE_SQL: case SPIDER_SQL_TYPE_BULK_UPDATE_SQL: str = &update_sql; break; default: DBUG_RETURN(0); } error_num = append_where_terminator(sql_type, str, str_part, str_part2, set_order, key_count); DBUG_RETURN(error_num); } int spider_mbase_handler::append_where_terminator( ulong sql_type, spider_string *str, spider_string *str_part, spider_string *str_part2, bool set_order, int key_count ) { SPIDER_RESULT_LIST *result_list = &spider->result_list; DBUG_ENTER("spider_mbase_handler::append_where_terminator"); DBUG_PRINT("info", ("spider this=%p", this)); str->length(str->length() - SPIDER_SQL_AND_LEN); if (!set_order) result_list->key_order= key_count; DBUG_RETURN(0); } int spider_mbase_handler::append_match_where_part( ulong sql_type ) { int error_num; spider_string *str; DBUG_ENTER("spider_mbase_handler::append_match_where_part"); switch (sql_type) { case SPIDER_SQL_TYPE_SELECT_SQL: str = &sql; break; default: DBUG_ASSERT(0); DBUG_RETURN(0); } error_num = append_match_where(str); DBUG_RETURN(error_num); } 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_mbase_handler::append_match_where"); if (spider->ft_current) { while (TRUE) { if (ft_info->used_in_where) { if (first) { 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); first = FALSE; } if ((error_num = append_match_against(str, ft_info, NULL, 0))) DBUG_RETURN(error_num); if (str->reserve(SPIDER_SQL_AND_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN); } if (ft_info == spider->ft_current) break; ft_info = ft_info->next; } if (!first) str->length(str->length() - SPIDER_SQL_AND_LEN); } DBUG_RETURN(0); } 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->wide_handler->trx->thd; SPIDER_SHARE *share = spider->share; 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); 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, FALSE, 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)) { 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, FALSE, 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); } } 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_mbase_handler::append_condition_part( const char *alias, uint alias_length, ulong sql_type, bool test_flg ) { int error_num; spider_string *str; bool start_where = FALSE; DBUG_ENTER("spider_mbase_handler::append_condition_part"); switch (sql_type) { case SPIDER_SQL_TYPE_SELECT_SQL: if (test_flg) { str = NULL; } else { str = &sql; start_where = ((int) str->length() == where_pos); } break; case SPIDER_SQL_TYPE_TMP_SQL: if (test_flg) { str = NULL; } else { str = &tmp_sql; start_where = ((int) str->length() == where_pos); } break; case SPIDER_SQL_TYPE_INSERT_SQL: case SPIDER_SQL_TYPE_UPDATE_SQL: case SPIDER_SQL_TYPE_DELETE_SQL: case SPIDER_SQL_TYPE_BULK_UPDATE_SQL: if (test_flg) { str = NULL; } else { str = &update_sql; start_where = ((int) str->length() == where_pos); } break; default: DBUG_RETURN(0); } error_num = append_condition(str, alias, alias_length, start_where, sql_type); DBUG_RETURN(error_num); } int spider_mbase_handler::append_condition( spider_string *str, const char *alias, uint alias_length, bool start_where, ulong sql_type ) { int error_num, restart_pos = 0, start_where_pos; SPIDER_CONDITION *tmp_cond = spider->wide_handler->condition; DBUG_ENTER("spider_mbase_handler::append_condition"); if (str && start_where) { start_where_pos = str->length(); } else { start_where_pos = 0; } if (spider->is_clone && !tmp_cond) { tmp_cond = spider->pt_clone_source_handler->wide_handler->condition; } while (tmp_cond) { if (str) { restart_pos = str->length(); if (start_where) { 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); start_where = FALSE; } else { if (str->reserve(SPIDER_SQL_AND_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN); } } if ((error_num = spider_db_print_item_type( (Item *) tmp_cond->cond, NULL, spider, str, alias, alias_length, dbton_id, FALSE, NULL))) { if (str && error_num == ER_SPIDER_COND_SKIP_NUM) { DBUG_PRINT("info",("spider COND skip")); str->length(restart_pos); start_where = (restart_pos == start_where_pos); } else DBUG_RETURN(error_num); } tmp_cond = tmp_cond->next; } DBUG_RETURN(0); } int spider_mbase_handler::append_match_against_part( ulong sql_type, st_spider_ft_info *ft_info, const char *alias, uint alias_length ) { int error_num; spider_string *str; DBUG_ENTER("spider_mbase_handler::append_match_against_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_match_against(str, ft_info, alias, alias_length); DBUG_RETURN(error_num); } int spider_mbase_handler::append_match_against( spider_string *str, st_spider_ft_info *ft_info, const char *alias, uint alias_length ) { SPIDER_SHARE *share = spider->share; TABLE *table = spider->get_table(); String *ft_init_key; KEY *key_info; uint key_name_length; int key_count; KEY_PART_INFO *key_part; Field *field; 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); str->q_append(SPIDER_SQL_MATCH_STR, SPIDER_SQL_MATCH_LEN); ft_init_key = ft_info->key; key_info = &table->key_info[ft_info->inx]; DBUG_PRINT("info", ("spider spider_user_defined_key_parts=%u", spider_user_defined_key_parts(key_info))); for ( key_part = key_info->key_part, key_count = 0; key_count < (int) spider_user_defined_key_parts(key_info); key_part++, key_count++ ) { field = key_part->field; key_name_length = mysql_share->column_name_str[field->field_index].length(); if (alias_length) { if (str->reserve(alias_length + key_name_length + /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(alias, alias_length); } else { if (str->reserve(key_name_length + /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); } mysql_share->append_column_name(str, field->field_index); str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); } str->length(str->length() - SPIDER_SQL_COMMA_LEN); if (str->reserve(SPIDER_SQL_AGAINST_LEN + SPIDER_SQL_VALUE_QUOTE_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_AGAINST_STR, SPIDER_SQL_AGAINST_LEN); str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN); char buf[MAX_FIELD_WIDTH]; spider_string tmp_str(buf, MAX_FIELD_WIDTH, share->access_charset); tmp_str.init_calc_mem(116); tmp_str.length(0); if ( tmp_str.append(ft_init_key->ptr(), ft_init_key->length(), ft_init_key->charset()) || str->reserve(tmp_str.length() * 2) || spider_db_mbase_utility->append_escaped_util(str, tmp_str.get_str()) ) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->mem_calc(); if (str->reserve( SPIDER_SQL_VALUE_QUOTE_LEN + SPIDER_SQL_CLOSE_PAREN_LEN + ((ft_info->flags & FT_BOOL) ? SPIDER_SQL_IN_BOOLEAN_MODE_LEN : 0) + ((ft_info->flags & FT_EXPAND) ? SPIDER_SQL_WITH_QUERY_EXPANSION_LEN : 0) )) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN); if (ft_info->flags & FT_BOOL) str->q_append(SPIDER_SQL_IN_BOOLEAN_MODE_STR, SPIDER_SQL_IN_BOOLEAN_MODE_LEN); if (ft_info->flags & FT_EXPAND) str->q_append(SPIDER_SQL_WITH_QUERY_EXPANSION_STR, SPIDER_SQL_WITH_QUERY_EXPANSION_LEN); str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN); DBUG_RETURN(0); } 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_mbase_handler::append_match_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_match_select(str, alias, alias_length); DBUG_RETURN(error_num); } int spider_mbase_handler::append_match_select( spider_string *str, const char *alias, uint alias_length ) { int error_num; DBUG_ENTER("spider_mbase_handler::append_match_select"); DBUG_PRINT("info",("spider this=%p", this)); if (spider->ft_current) { st_spider_ft_info *ft_info = spider->ft_first; while (TRUE) { if ((error_num = append_match_against(str, ft_info, alias, alias_length))) 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); if (ft_info == spider->ft_current) break; ft_info = ft_info->next; } } DBUG_RETURN(0); } 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_mbase_handler::append_sum_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_sum_select(str, alias, alias_length); DBUG_RETURN(error_num); } 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_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_mbase_utility->open_item_sum_func(*item_sum_ptr, spider, str, alias, alias_length, FALSE, NULL))) { 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); } DBUG_RETURN(0); } void spider_mbase_handler::set_order_pos( ulong sql_type ) { DBUG_ENTER("spider_mbase_handler::set_order_pos"); switch (sql_type) { case SPIDER_SQL_TYPE_SELECT_SQL: case SPIDER_SQL_TYPE_TMP_SQL: order_pos = sql.length(); break; case SPIDER_SQL_TYPE_INSERT_SQL: case SPIDER_SQL_TYPE_UPDATE_SQL: case SPIDER_SQL_TYPE_DELETE_SQL: case SPIDER_SQL_TYPE_BULK_UPDATE_SQL: order_pos = update_sql.length(); break; default: DBUG_ASSERT(0); break; } DBUG_VOID_RETURN; } void spider_mbase_handler::set_order_to_pos( ulong sql_type ) { DBUG_ENTER("spider_mbase_handler::set_order_to_pos"); switch (sql_type) { case SPIDER_SQL_TYPE_SELECT_SQL: case SPIDER_SQL_TYPE_TMP_SQL: sql.length(order_pos); break; case SPIDER_SQL_TYPE_INSERT_SQL: case SPIDER_SQL_TYPE_UPDATE_SQL: case SPIDER_SQL_TYPE_DELETE_SQL: case SPIDER_SQL_TYPE_BULK_UPDATE_SQL: update_sql.length(order_pos); break; default: DBUG_ASSERT(0); break; } DBUG_VOID_RETURN; } 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_mbase_handler::append_group_by_part"); DBUG_PRINT("info",("spider this=%p", this)); switch (sql_type) { case SPIDER_SQL_TYPE_SELECT_SQL: case SPIDER_SQL_TYPE_TMP_SQL: str = &sql; break; case SPIDER_SQL_TYPE_INSERT_SQL: case SPIDER_SQL_TYPE_UPDATE_SQL: case SPIDER_SQL_TYPE_DELETE_SQL: case SPIDER_SQL_TYPE_BULK_UPDATE_SQL: str = &update_sql; break; default: DBUG_RETURN(0); } error_num = append_group_by(str, alias, alias_length); DBUG_RETURN(error_num); } 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_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; if (group) { 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 (; group; group = group->next) { if ((error_num = spider_db_print_item_type((*group->item), NULL, spider, str, alias, alias_length, dbton_id, FALSE, NULL))) { 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_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_mbase_handler::append_key_order_for_merge_with_alias_part"); DBUG_PRINT("info",("spider this=%p", this)); switch (sql_type) { case SPIDER_SQL_TYPE_SELECT_SQL: case SPIDER_SQL_TYPE_TMP_SQL: str = &sql; break; case SPIDER_SQL_TYPE_INSERT_SQL: case SPIDER_SQL_TYPE_UPDATE_SQL: case SPIDER_SQL_TYPE_DELETE_SQL: case SPIDER_SQL_TYPE_BULK_UPDATE_SQL: str = &update_sql; break; default: DBUG_RETURN(0); } error_num = append_key_order_for_merge_with_alias(str, alias, alias_length); DBUG_RETURN(error_num); } int spider_mbase_handler::append_key_order_for_merge_with_alias( spider_string *str, const char *alias, uint alias_length ) { /* sort for index merge */ TABLE *table = spider->get_table(); int length; Field *field; uint key_name_length; DBUG_ENTER("spider_mbase_handler::append_key_order_for_merge_with_alias"); DBUG_PRINT("info",("spider this=%p", this)); if (spider->result_list.direct_aggregate) { int error_num; if ((error_num = append_group_by(str, alias, alias_length))) DBUG_RETURN(error_num); } if (table->s->primary_key < MAX_KEY) { /* sort by primary key */ KEY *key_info = &table->key_info[table->s->primary_key]; KEY_PART_INFO *key_part; for ( key_part = key_info->key_part, length = 1; length <= (int) spider_user_defined_key_parts(key_info); key_part++, length++ ) { field = key_part->field; key_name_length = mysql_share->column_name_str[field->field_index].length(); if (length == 1) { 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); } if (str->reserve(alias_length + key_name_length + /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(alias, alias_length); mysql_share->append_column_name(str, field->field_index); str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); } if (length > 1) { str->length(str->length() - SPIDER_SQL_COMMA_LEN); } } else { /* sort by all columns */ Field **fieldp; for ( fieldp = table->field, length = 1; *fieldp; fieldp++, length++ ) { key_name_length = mysql_share->column_name_str[(*fieldp)->field_index].length(); if (length == 1) { 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); } if (str->reserve(alias_length + key_name_length + /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(alias, alias_length); mysql_share->append_column_name(str, (*fieldp)->field_index); str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); } if (length > 1) { str->length(str->length() - SPIDER_SQL_COMMA_LEN); } } limit_pos = str->length(); DBUG_RETURN(0); } 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_mbase_handler::append_key_order_for_direct_order_limit_with_alias_part"); DBUG_PRINT("info",("spider this=%p", this)); switch (sql_type) { case SPIDER_SQL_TYPE_SELECT_SQL: case SPIDER_SQL_TYPE_TMP_SQL: str = &sql; break; case SPIDER_SQL_TYPE_INSERT_SQL: case SPIDER_SQL_TYPE_UPDATE_SQL: case SPIDER_SQL_TYPE_DELETE_SQL: case SPIDER_SQL_TYPE_BULK_UPDATE_SQL: str = &update_sql; break; default: DBUG_RETURN(0); } error_num = append_key_order_for_direct_order_limit_with_alias( str, alias, alias_length); DBUG_RETURN(error_num); } int spider_mbase_handler::append_key_order_for_direct_order_limit_with_alias( spider_string *str, const char *alias, uint alias_length ) { int error_num; ORDER *order; st_select_lex *select_lex; longlong select_limit; longlong offset_limit; DBUG_ENTER("spider_mbase_handler::append_key_order_for_direct_order_limit_with_alias"); DBUG_PRINT("info",("spider this=%p", this)); if (spider->result_list.direct_aggregate) { if ((error_num = append_group_by(str, alias, alias_length))) DBUG_RETURN(error_num); } spider_get_select_limit(spider, &select_lex, &select_limit, &offset_limit); if (select_lex->order_list.first) { 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 *) select_lex->order_list.first; order; order = order->next) { if ((error_num = 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 (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_DESC_LEN + SPIDER_SQL_COMMA_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); } limit_pos = str->length(); DBUG_RETURN(0); } 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_mbase_handler::append_key_order_with_alias_part"); DBUG_PRINT("info",("spider this=%p", this)); switch (sql_type) { case SPIDER_SQL_TYPE_SELECT_SQL: case SPIDER_SQL_TYPE_TMP_SQL: str = &sql; break; case SPIDER_SQL_TYPE_INSERT_SQL: case SPIDER_SQL_TYPE_UPDATE_SQL: case SPIDER_SQL_TYPE_DELETE_SQL: case SPIDER_SQL_TYPE_BULK_UPDATE_SQL: str = &update_sql; break; default: DBUG_RETURN(0); } error_num = append_key_order_with_alias(str, alias, alias_length); DBUG_RETURN(error_num); } int spider_mbase_handler::append_key_order_for_handler( spider_string *str, const char *alias, uint alias_length ) { 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)); str->q_append(alias, alias_length); memset((char *) str->ptr() + str->length(), ' ', ha_where_pos - ha_next_pos - alias_length); DBUG_RETURN(0); } int spider_mbase_handler::append_key_order_with_alias( spider_string *str, const char *alias, uint alias_length ) { SPIDER_RESULT_LIST *result_list = &spider->result_list; KEY *key_info = result_list->key_info; int length; KEY_PART_INFO *key_part; Field *field; uint key_name_length; DBUG_ENTER("spider_mbase_handler::append_key_order_with_alias"); DBUG_PRINT("info",("spider this=%p", this)); if (spider->result_list.direct_aggregate) { int error_num; if ((error_num = append_group_by(str, alias, alias_length))) DBUG_RETURN(error_num); } if (result_list->sorted == TRUE) { if (result_list->desc_flg == TRUE) { for ( key_part = key_info->key_part + result_list->key_order, length = 1; length + result_list->key_order < (int) spider_user_defined_key_parts(key_info) && length < result_list->max_order; key_part++, length++ ) { field = key_part->field; key_name_length = mysql_share->column_name_str[field->field_index].length(); if (length == 1) { 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); } if (key_part->key_part_flag & HA_REVERSE_SORT) { if (str->reserve(alias_length + key_name_length + /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(alias, alias_length); mysql_share->append_column_name(str, field->field_index); str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); } else { if (str->reserve(alias_length + key_name_length + /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_DESC_LEN + SPIDER_SQL_COMMA_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(alias, alias_length); mysql_share->append_column_name(str, field->field_index); str->q_append(SPIDER_SQL_DESC_STR, SPIDER_SQL_DESC_LEN); str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); } } if ( length + result_list->key_order <= (int) spider_user_defined_key_parts(key_info) && length <= result_list->max_order ) { field = key_part->field; key_name_length = mysql_share->column_name_str[field->field_index].length(); if (length == 1) { 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); } if (key_part->key_part_flag & HA_REVERSE_SORT) { if (str->reserve(alias_length + key_name_length + /* SPIDER_SQL_NAME_QUOTE_LEN */ 2)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(alias, alias_length); mysql_share->append_column_name(str, field->field_index); } else { if (str->reserve(alias_length + key_name_length + /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_DESC_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(alias, alias_length); mysql_share->append_column_name(str, field->field_index); str->q_append(SPIDER_SQL_DESC_STR, SPIDER_SQL_DESC_LEN); } } } else { for ( key_part = key_info->key_part + result_list->key_order, length = 1; length + result_list->key_order < (int) spider_user_defined_key_parts(key_info) && length < result_list->max_order; key_part++, length++ ) { field = key_part->field; key_name_length = mysql_share->column_name_str[field->field_index].length(); if (length == 1) { 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); } if (key_part->key_part_flag & HA_REVERSE_SORT) { if (str->reserve(alias_length + key_name_length + /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_DESC_LEN + SPIDER_SQL_COMMA_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(alias, alias_length); mysql_share->append_column_name(str, field->field_index); 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(alias_length + key_name_length + /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(alias, alias_length); mysql_share->append_column_name(str, field->field_index); str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); } } if ( length + result_list->key_order <= (int) spider_user_defined_key_parts(key_info) && length <= result_list->max_order ) { field = key_part->field; key_name_length = mysql_share->column_name_str[field->field_index].length(); if (length == 1) { 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); } if (key_part->key_part_flag & HA_REVERSE_SORT) { if (str->reserve(alias_length + key_name_length + /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_DESC_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(alias, alias_length); mysql_share->append_column_name(str, field->field_index); str->q_append(SPIDER_SQL_DESC_STR, SPIDER_SQL_DESC_LEN); } else { if (str->reserve(alias_length + key_name_length + /* SPIDER_SQL_NAME_QUOTE_LEN */ 2)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(alias, alias_length); mysql_share->append_column_name(str, field->field_index); } } } } limit_pos = str->length(); DBUG_RETURN(0); } int spider_mbase_handler::append_limit_part( longlong offset, longlong limit, ulong sql_type ) { int error_num; spider_string *str; DBUG_ENTER("spider_mbase_handler::append_limit_part"); DBUG_PRINT("info",("spider this=%p", this)); switch (sql_type) { case SPIDER_SQL_TYPE_SELECT_SQL: str = &sql; limit_pos = str->length(); break; case SPIDER_SQL_TYPE_TMP_SQL: str = &tmp_sql; limit_pos = str->length(); break; case SPIDER_SQL_TYPE_INSERT_SQL: case SPIDER_SQL_TYPE_UPDATE_SQL: case SPIDER_SQL_TYPE_DELETE_SQL: case SPIDER_SQL_TYPE_BULK_UPDATE_SQL: str = &update_sql; limit_pos = str->length(); break; default: DBUG_RETURN(0); } error_num = append_limit(str, offset, limit); DBUG_RETURN(error_num); } int spider_mbase_handler::reappend_limit_part( longlong offset, longlong limit, ulong sql_type ) { int error_num; spider_string *str; DBUG_ENTER("spider_mbase_handler::reappend_limit_part"); DBUG_PRINT("info",("spider this=%p", this)); switch (sql_type) { case SPIDER_SQL_TYPE_SELECT_SQL: str = &sql; str->length(limit_pos); break; case SPIDER_SQL_TYPE_TMP_SQL: str = &tmp_sql; str->length(limit_pos); break; case SPIDER_SQL_TYPE_INSERT_SQL: case SPIDER_SQL_TYPE_UPDATE_SQL: case SPIDER_SQL_TYPE_DELETE_SQL: case SPIDER_SQL_TYPE_BULK_UPDATE_SQL: str = &update_sql; str->length(limit_pos); break; default: DBUG_RETURN(0); } error_num = append_limit(str, offset, limit); DBUG_RETURN(error_num); } int spider_mbase_handler::append_limit( spider_string *str, longlong offset, longlong limit ) { char buf[SPIDER_LONGLONG_LEN + 1]; uint32 length; 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)); if (offset || limit < 9223372036854775807LL) { if (str->reserve(SPIDER_SQL_LIMIT_LEN + SPIDER_SQL_COMMA_LEN + ((SPIDER_LONGLONG_LEN) * 2))) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_LIMIT_STR, SPIDER_SQL_LIMIT_LEN); if (offset) { length = (uint32) (my_charset_bin.longlong10_to_str)( buf, SPIDER_LONGLONG_LEN + 1, -10, offset); str->q_append(buf, length); str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); } length = (uint32) (my_charset_bin.longlong10_to_str)( buf, SPIDER_LONGLONG_LEN + 1, -10, limit); str->q_append(buf, length); } DBUG_RETURN(0); } int spider_mbase_handler::append_select_lock_part( ulong sql_type ) { int error_num; spider_string *str; DBUG_ENTER("spider_mbase_handler::append_select_lock_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_select_lock(str); DBUG_RETURN(error_num); } int spider_mbase_handler::append_select_lock( spider_string *str ) { int lock_mode = spider_conn_lock_mode(spider); DBUG_ENTER("spider_mbase_handler::append_select_lock"); DBUG_PRINT("info",("spider this=%p", this)); if (lock_mode == SPIDER_LOCK_MODE_EXCLUSIVE) { if (str->reserve(SPIDER_SQL_FOR_UPDATE_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_FOR_UPDATE_STR, SPIDER_SQL_FOR_UPDATE_LEN); } else if (lock_mode == SPIDER_LOCK_MODE_SHARED) { if (str->reserve(SPIDER_SQL_SHARED_LOCK_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_SHARED_LOCK_STR, SPIDER_SQL_SHARED_LOCK_LEN); } DBUG_RETURN(0); } int spider_mbase_handler::append_union_all_start_part( ulong sql_type ) { int error_num; spider_string *str; DBUG_ENTER("spider_mbase_handler::append_union_all_start_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_union_all_start(str); DBUG_RETURN(error_num); } int spider_mbase_handler::append_union_all_start( spider_string *str ) { 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); str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN); DBUG_RETURN(0); } int spider_mbase_handler::append_union_all_part( ulong sql_type ) { int error_num; spider_string *str; DBUG_ENTER("spider_mbase_handler::append_union_all_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_union_all(str); DBUG_RETURN(error_num); } int spider_mbase_handler::append_union_all( spider_string *str ) { 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); str->q_append(SPIDER_SQL_UNION_ALL_STR, SPIDER_SQL_UNION_ALL_LEN); DBUG_RETURN(0); } int spider_mbase_handler::append_union_all_end_part( ulong sql_type ) { int error_num; spider_string *str; DBUG_ENTER("spider_mbase_handler::append_union_all_end_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_union_all_end(str); DBUG_RETURN(error_num); } int spider_mbase_handler::append_union_all_end( spider_string *str ) { 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_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_mbase_handler::append_multi_range_cnt_part"); DBUG_PRINT("info",("spider this=%p", this)); switch (sql_type) { case SPIDER_SQL_TYPE_SELECT_SQL: str = &sql; break; case SPIDER_SQL_TYPE_TMP_SQL: str = &tmp_sql; break; default: DBUG_RETURN(0); } error_num = append_multi_range_cnt(str, multi_range_cnt, with_comma); DBUG_RETURN(error_num); } 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_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)); if (with_comma) { if (str->reserve(range_cnt_length + SPIDER_SQL_COMMA_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(range_cnt_str, range_cnt_length); str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); } else { if (str->reserve(range_cnt_length)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(range_cnt_str, range_cnt_length); } DBUG_RETURN(0); } 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_mbase_handler::append_multi_range_cnt_with_name_part"); DBUG_PRINT("info",("spider this=%p", this)); switch (sql_type) { case SPIDER_SQL_TYPE_SELECT_SQL: str = &sql; break; case SPIDER_SQL_TYPE_TMP_SQL: str = &tmp_sql; break; default: DBUG_RETURN(0); } error_num = append_multi_range_cnt_with_name(str, multi_range_cnt); DBUG_RETURN(error_num); } 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_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)); if (str->reserve(range_cnt_length + SPIDER_SQL_SPACE_LEN + SPIDER_SQL_ID_LEN + SPIDER_SQL_COMMA_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(range_cnt_str, range_cnt_length); str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN); str->q_append(SPIDER_SQL_ID_STR, SPIDER_SQL_ID_LEN); str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); DBUG_RETURN(0); } int spider_mbase_handler::append_insert_terminator_part( ulong sql_type ) { int error_num; spider_string *str; DBUG_ENTER("spider_mbase_handler::append_insert_terminator_part"); DBUG_PRINT("info",("spider this=%p", this)); switch (sql_type) { case SPIDER_SQL_TYPE_INSERT_SQL: str = &insert_sql; break; default: DBUG_RETURN(0); } error_num = append_insert_terminator(str); DBUG_RETURN(error_num); } int spider_mbase_handler::append_insert_terminator( spider_string *str ) { 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 ( spider->result_list.insert_dup_update_pushdown && dup_update_sql.length() ) { DBUG_PRINT("info",("spider add duplicate key update")); direct_insert_kind = SPIDER_SQL_DIRECT_INSERT_KIND_DUP_UPDATE; str->length(str->length() - SPIDER_SQL_COMMA_LEN); if (str->reserve(SPIDER_SQL_DUPLICATE_KEY_UPDATE_LEN + dup_update_sql.length())) { str->length(0); DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_SQL_DUPLICATE_KEY_UPDATE_STR, SPIDER_SQL_DUPLICATE_KEY_UPDATE_LEN); if (str->append(dup_update_sql)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); } else { str->length(str->length() - SPIDER_SQL_COMMA_LEN); } DBUG_RETURN(0); } int spider_mbase_handler::append_insert_values_part( ulong sql_type ) { int error_num; spider_string *str; DBUG_ENTER("spider_mbase_handler::append_insert_values_part"); DBUG_PRINT("info",("spider this=%p", this)); switch (sql_type) { case SPIDER_SQL_TYPE_INSERT_SQL: str = &insert_sql; break; default: DBUG_RETURN(0); } error_num = append_insert_values(str); DBUG_RETURN(error_num); } 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_mbase_handler::append_insert_values"); DBUG_PRINT("info",("spider this=%p", this)); if (str->reserve(SPIDER_SQL_OPEN_PAREN_LEN)) { str->length(0); DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN); for (field = table->field; *field; field++) { DBUG_PRINT("info",("spider field_index=%u", (*field)->field_index)); if ( bitmap_is_set(table->write_set, (*field)->field_index) || bitmap_is_set(table->read_set, (*field)->field_index) ) { #ifndef DBUG_OFF MY_BITMAP *tmp_map = dbug_tmp_use_all_columns(table, &table->read_set); #endif add_value = TRUE; DBUG_PRINT("info",("spider is_null()=%s", (*field)->is_null() ? "TRUE" : "FALSE")); DBUG_PRINT("info",("spider table->next_number_field=%p", table->next_number_field)); DBUG_PRINT("info",("spider *field=%p", *field)); DBUG_PRINT("info",("spider force_auto_increment=%s", (table->next_number_field && spider->force_auto_increment) ? "TRUE" : "FALSE")); if ( (*field)->is_null() || ( table->next_number_field == *field && !table->auto_increment_field_not_null && !spider->force_auto_increment ) ) { if (str->reserve(SPIDER_SQL_NULL_LEN + SPIDER_SQL_COMMA_LEN)) { #ifndef DBUG_OFF dbug_tmp_restore_column_map(&table->read_set, tmp_map); #endif str->length(0); DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_SQL_NULL_STR, SPIDER_SQL_NULL_LEN); } else { if (spider_db_mbase_utility->append_column_value( spider, str, *field, NULL, FALSE, share->access_charset) || str->reserve(SPIDER_SQL_COMMA_LEN)) { #ifndef DBUG_OFF dbug_tmp_restore_column_map(&table->read_set, tmp_map); #endif str->length(0); DBUG_RETURN(HA_ERR_OUT_OF_MEM); } } str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); #ifndef DBUG_OFF dbug_tmp_restore_column_map(&table->read_set, tmp_map); #endif } } if (add_value) str->length(str->length() - SPIDER_SQL_COMMA_LEN); if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN + SPIDER_SQL_COMMA_LEN)) { str->length(0); DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN); str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); DBUG_RETURN(0); } int spider_mbase_handler::append_into_part( ulong sql_type ) { int error_num; spider_string *str; DBUG_ENTER("spider_mbase_handler::append_into_part"); DBUG_PRINT("info",("spider this=%p", this)); switch (sql_type) { case SPIDER_SQL_TYPE_INSERT_SQL: str = &insert_sql; break; default: DBUG_RETURN(0); } error_num = append_into(str); DBUG_RETURN(error_num); } 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_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 + /* SPIDER_SQL_NAME_QUOTE_LEN */ 4 + SPIDER_SQL_OPEN_PAREN_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_INTO_STR, SPIDER_SQL_INTO_LEN); insert_table_name_pos = str->length(); append_table_name_with_adjusting(str, first_link_idx, SPIDER_SQL_TYPE_INSERT_SQL); str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN); for (field = table->field; *field; field++) { if ( bitmap_is_set(table->write_set, (*field)->field_index) || bitmap_is_set(table->read_set, (*field)->field_index) ) { field_name_length = mysql_share->column_name_str[(*field)->field_index].length(); if (str->reserve(field_name_length + /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); mysql_share->append_column_name(str, (*field)->field_index); str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); } } if (field_name_length) str->length(str->length() - SPIDER_SQL_COMMA_LEN); if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN + SPIDER_SQL_VALUES_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN); str->q_append(SPIDER_SQL_VALUES_STR, SPIDER_SQL_VALUES_LEN); insert_pos = str->length(); DBUG_RETURN(0); } void spider_mbase_handler::set_insert_to_pos( ulong sql_type ) { DBUG_ENTER("spider_mbase_handler::set_insert_to_pos"); switch (sql_type) { case SPIDER_SQL_TYPE_INSERT_SQL: insert_sql.length(insert_pos); break; default: DBUG_ASSERT(0); break; } DBUG_VOID_RETURN; } int spider_mbase_handler::append_from_part( ulong sql_type, int link_idx ) { int error_num; spider_string *str; DBUG_ENTER("spider_mbase_handler::append_from_part"); DBUG_PRINT("info",("spider this=%p", this)); switch (sql_type) { case SPIDER_SQL_TYPE_UPDATE_SQL: case SPIDER_SQL_TYPE_DELETE_SQL: case SPIDER_SQL_TYPE_BULK_UPDATE_SQL: str = &update_sql; break; default: str = &sql; break; } error_num = append_from(str, sql_type, link_idx); DBUG_RETURN(error_num); } int spider_mbase_handler::append_from( spider_string *str, ulong sql_type, int link_idx ) { 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 (str->reserve(SPIDER_SQL_FROM_LEN + mysql_share->db_nm_max_length + SPIDER_SQL_DOT_LEN + mysql_share->table_nm_max_length + /* SPIDER_SQL_NAME_QUOTE_LEN */ 4 + SPIDER_SQL_OPEN_PAREN_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); 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->wide_handler->trx->thd)) { DBUG_RETURN(error_num); } DBUG_RETURN(0); } 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_mbase_handler::append_flush_tables_part"); DBUG_PRINT("info",("spider this=%p", this)); switch (sql_type) { case SPIDER_SQL_TYPE_OTHER_SQL: str = &spider->result_list.sqls[link_idx]; break; default: DBUG_RETURN(0); } error_num = append_flush_tables(str, link_idx, lock); DBUG_RETURN(error_num); } int spider_mbase_handler::append_flush_tables( spider_string *str, int link_idx, bool lock ) { DBUG_ENTER("spider_mbase_handler::append_flush_tables"); DBUG_PRINT("info",("spider this=%p", this)); if (lock) { if (str->reserve(SPIDER_SQL_FLUSH_TABLES_LEN + SPIDER_SQL_WITH_READ_LOCK_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_FLUSH_TABLES_STR, SPIDER_SQL_FLUSH_TABLES_LEN); str->q_append(SPIDER_SQL_WITH_READ_LOCK_STR, SPIDER_SQL_WITH_READ_LOCK_LEN); } else { if (str->reserve(SPIDER_SQL_FLUSH_TABLES_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_FLUSH_TABLES_STR, SPIDER_SQL_FLUSH_TABLES_LEN); } DBUG_RETURN(0); } int spider_mbase_handler::append_optimize_table_part( ulong sql_type, int link_idx ) { int error_num; spider_string *str; DBUG_ENTER("spider_mbase_handler::append_optimize_table_part"); DBUG_PRINT("info",("spider this=%p", this)); switch (sql_type) { case SPIDER_SQL_TYPE_OTHER_SQL: str = &spider->result_list.sqls[link_idx]; break; default: DBUG_RETURN(0); } error_num = append_optimize_table(str, link_idx); DBUG_RETURN(error_num); } int spider_mbase_handler::append_optimize_table( spider_string *str, int link_idx ) { SPIDER_SHARE *share = spider->share; int conn_link_idx = spider->conn_link_idx[link_idx]; int local_length = spider_param_internal_optimize_local( spider->wide_handler->trx->thd, share->internal_optimize_local) * SPIDER_SQL_SQL_LOCAL_LEN; 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 + mysql_share->db_names_str[conn_link_idx].length() + SPIDER_SQL_DOT_LEN + mysql_share->table_names_str[conn_link_idx].length() + /* SPIDER_SQL_NAME_QUOTE_LEN */ 4)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_SQL_OPTIMIZE_STR, SPIDER_SQL_SQL_OPTIMIZE_LEN); if (local_length) str->q_append(SPIDER_SQL_SQL_LOCAL_STR, SPIDER_SQL_SQL_LOCAL_LEN); str->q_append(SPIDER_SQL_SQL_TABLE_STR, SPIDER_SQL_SQL_TABLE_LEN); mysql_share->append_table_name(str, conn_link_idx); DBUG_RETURN(0); } int spider_mbase_handler::append_analyze_table_part( ulong sql_type, int link_idx ) { int error_num; spider_string *str; DBUG_ENTER("spider_mbase_handler::append_analyze_table_part"); DBUG_PRINT("info",("spider this=%p", this)); switch (sql_type) { case SPIDER_SQL_TYPE_OTHER_SQL: str = &spider->result_list.sqls[link_idx]; break; default: DBUG_RETURN(0); } error_num = append_analyze_table(str, link_idx); DBUG_RETURN(error_num); } int spider_mbase_handler::append_analyze_table( spider_string *str, int link_idx ) { SPIDER_SHARE *share = spider->share; int conn_link_idx = spider->conn_link_idx[link_idx]; int local_length = spider_param_internal_optimize_local( spider->wide_handler->trx->thd, share->internal_optimize_local) * SPIDER_SQL_SQL_LOCAL_LEN; 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 + mysql_share->db_names_str[conn_link_idx].length() + SPIDER_SQL_DOT_LEN + mysql_share->table_names_str[conn_link_idx].length() + /* SPIDER_SQL_NAME_QUOTE_LEN */ 4)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_SQL_ANALYZE_STR, SPIDER_SQL_SQL_ANALYZE_LEN); if (local_length) str->q_append(SPIDER_SQL_SQL_LOCAL_STR, SPIDER_SQL_SQL_LOCAL_LEN); str->q_append(SPIDER_SQL_SQL_TABLE_STR, SPIDER_SQL_SQL_TABLE_LEN); mysql_share->append_table_name(str, conn_link_idx); DBUG_RETURN(0); } 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_mbase_handler::append_repair_table_part"); DBUG_PRINT("info",("spider this=%p", this)); switch (sql_type) { case SPIDER_SQL_TYPE_OTHER_SQL: str = &spider->result_list.sqls[link_idx]; break; default: DBUG_RETURN(0); } error_num = append_repair_table(str, link_idx, check_opt); DBUG_RETURN(error_num); } int spider_mbase_handler::append_repair_table( spider_string *str, int link_idx, HA_CHECK_OPT* check_opt ) { SPIDER_SHARE *share = spider->share; int conn_link_idx = spider->conn_link_idx[link_idx]; int local_length = spider_param_internal_optimize_local( spider->wide_handler->trx->thd, share->internal_optimize_local) * SPIDER_SQL_SQL_LOCAL_LEN; 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 + mysql_share->db_names_str[conn_link_idx].length() + SPIDER_SQL_DOT_LEN + mysql_share->table_names_str[conn_link_idx].length() + /* SPIDER_SQL_NAME_QUOTE_LEN */ 4)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_SQL_REPAIR_STR, SPIDER_SQL_SQL_REPAIR_LEN); if (local_length) str->q_append(SPIDER_SQL_SQL_LOCAL_STR, SPIDER_SQL_SQL_LOCAL_LEN); str->q_append(SPIDER_SQL_SQL_TABLE_STR, SPIDER_SQL_SQL_TABLE_LEN); mysql_share->append_table_name(str, conn_link_idx); if (check_opt->flags & T_QUICK) { if (str->reserve(SPIDER_SQL_SQL_QUICK_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_SQL_QUICK_STR, SPIDER_SQL_SQL_QUICK_LEN); } if (check_opt->flags & T_EXTEND) { if (str->reserve(SPIDER_SQL_SQL_EXTENDED_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_SQL_EXTENDED_STR, SPIDER_SQL_SQL_EXTENDED_LEN); } if (check_opt->sql_flags & TT_USEFRM) { if (str->reserve(SPIDER_SQL_SQL_USE_FRM_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_SQL_USE_FRM_STR, SPIDER_SQL_SQL_USE_FRM_LEN); } DBUG_RETURN(0); } 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_mbase_handler::append_check_table_part"); DBUG_PRINT("info",("spider this=%p", this)); switch (sql_type) { case SPIDER_SQL_TYPE_OTHER_SQL: str = &spider->result_list.sqls[link_idx]; break; default: DBUG_RETURN(0); } error_num = append_check_table(str, link_idx, check_opt); DBUG_RETURN(error_num); } 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_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() + SPIDER_SQL_DOT_LEN + mysql_share->table_names_str[conn_link_idx].length() + /* SPIDER_SQL_NAME_QUOTE_LEN */ 4)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_SQL_CHECK_TABLE_STR, SPIDER_SQL_SQL_CHECK_TABLE_LEN); mysql_share->append_table_name(str, conn_link_idx); if (check_opt->flags & T_QUICK) { if (str->reserve(SPIDER_SQL_SQL_QUICK_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_SQL_QUICK_STR, SPIDER_SQL_SQL_QUICK_LEN); } if (check_opt->flags & T_FAST) { if (str->reserve(SPIDER_SQL_SQL_FAST_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_SQL_FAST_STR, SPIDER_SQL_SQL_FAST_LEN); } if (check_opt->flags & T_MEDIUM) { if (str->reserve(SPIDER_SQL_SQL_MEDIUM_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_SQL_MEDIUM_STR, SPIDER_SQL_SQL_MEDIUM_LEN); } if (check_opt->flags & T_EXTEND) { if (str->reserve(SPIDER_SQL_SQL_EXTENDED_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_SQL_EXTENDED_STR, SPIDER_SQL_SQL_EXTENDED_LEN); } DBUG_RETURN(0); } int spider_mbase_handler::append_enable_keys_part( ulong sql_type, int link_idx ) { int error_num; spider_string *str; DBUG_ENTER("spider_mbase_handler::append_enable_keys_part"); DBUG_PRINT("info",("spider this=%p", this)); switch (sql_type) { case SPIDER_SQL_TYPE_OTHER_SQL: str = &spider->result_list.sqls[link_idx]; break; default: DBUG_RETURN(0); } error_num = append_enable_keys(str, link_idx); DBUG_RETURN(error_num); } 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_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() + SPIDER_SQL_DOT_LEN + mysql_share->table_names_str[conn_link_idx].length() + /* SPIDER_SQL_NAME_QUOTE_LEN */ 4 + SPIDER_SQL_SQL_ENABLE_KEYS_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_SQL_ALTER_TABLE_STR, SPIDER_SQL_SQL_ALTER_TABLE_LEN); mysql_share->append_table_name(str, conn_link_idx); str->q_append(SPIDER_SQL_SQL_ENABLE_KEYS_STR, SPIDER_SQL_SQL_ENABLE_KEYS_LEN); DBUG_RETURN(0); } int spider_mbase_handler::append_disable_keys_part( ulong sql_type, int link_idx ) { int error_num; spider_string *str; DBUG_ENTER("spider_mbase_handler::append_disable_keys_part"); DBUG_PRINT("info",("spider this=%p", this)); switch (sql_type) { case SPIDER_SQL_TYPE_OTHER_SQL: str = &spider->result_list.sqls[link_idx]; break; default: DBUG_RETURN(0); } error_num = append_disable_keys(str, link_idx); DBUG_RETURN(error_num); } 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_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() + SPIDER_SQL_DOT_LEN + mysql_share->table_names_str[conn_link_idx].length() + /* SPIDER_SQL_NAME_QUOTE_LEN */ 4 + SPIDER_SQL_SQL_DISABLE_KEYS_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_SQL_ALTER_TABLE_STR, SPIDER_SQL_SQL_ALTER_TABLE_LEN); mysql_share->append_table_name(str, conn_link_idx); str->q_append(SPIDER_SQL_SQL_DISABLE_KEYS_STR, SPIDER_SQL_SQL_DISABLE_KEYS_LEN); DBUG_RETURN(0); } int spider_mbase_handler::append_delete_all_rows_part( ulong sql_type ) { int error_num; spider_string *str; DBUG_ENTER("spider_mbase_handler::append_delete_all_rows_part"); DBUG_PRINT("info",("spider this=%p", this)); switch (sql_type) { case SPIDER_SQL_TYPE_DELETE_SQL: str = &update_sql; break; default: DBUG_RETURN(0); } error_num = append_delete_all_rows(str, sql_type); DBUG_RETURN(error_num); } int spider_mbase_handler::append_delete_all_rows( spider_string *str, ulong sql_type ) { int error_num; DBUG_ENTER("spider_mbase_handler::append_delete_all_rows"); DBUG_PRINT("info",("spider this=%p", this)); if (spider->wide_handler->sql_command == SQLCOM_TRUNCATE) { if ((error_num = append_truncate(str, sql_type, first_link_idx))) DBUG_RETURN(error_num); } else { if ( (error_num = append_delete(str)) || (error_num = append_from(str, sql_type, first_link_idx)) ) DBUG_RETURN(error_num); } DBUG_RETURN(0); } int spider_mbase_handler::append_truncate( spider_string *str, ulong sql_type, int link_idx ) { 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 + /* SPIDER_SQL_NAME_QUOTE_LEN */ 4 + SPIDER_SQL_OPEN_PAREN_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_TRUNCATE_TABLE_STR, SPIDER_SQL_TRUNCATE_TABLE_LEN); table_name_pos = str->length(); append_table_name_with_adjusting(str, link_idx, sql_type); DBUG_RETURN(0); } int spider_mbase_handler::append_explain_select_part( const key_range *start_key, const key_range *end_key, ulong sql_type, int link_idx ) { int error_num; spider_string *str; DBUG_ENTER("spider_mbase_handler::append_explain_select_part"); DBUG_PRINT("info",("spider this=%p", this)); switch (sql_type) { case SPIDER_SQL_TYPE_OTHER_SQL: str = &spider->result_list.sqls[link_idx]; break; default: DBUG_RETURN(0); } error_num = append_explain_select(str, start_key, end_key, sql_type, link_idx); DBUG_RETURN(error_num); } int spider_mbase_handler::append_explain_select( spider_string *str, const key_range *start_key, const key_range *end_key, ulong sql_type, int link_idx ) { int error_num; DBUG_ENTER("spider_mbase_handler::append_explain_select"); DBUG_PRINT("info",("spider this=%p", this)); if (str->reserve(SPIDER_SQL_EXPLAIN_SELECT_LEN)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_SQL_EXPLAIN_SELECT_STR, SPIDER_SQL_EXPLAIN_SELECT_LEN); if ( (error_num = append_from(str, sql_type, link_idx)) || (error_num = append_key_where(str, NULL, NULL, start_key, end_key, sql_type, FALSE)) ) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } DBUG_RETURN(0); } /******************************************************************** * Determine whether the current query's projection list * consists solely of the specified column. * * Params IN - field_index: * Field index of the column of interest within * its table. * * Returns TRUE - if the query's projection list consists * solely of the specified column. * FALSE - otherwise. ********************************************************************/ 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; if ( !( minimum_select_bit_is_set( projection_field_index ) ) ) { // Current field is not in the projection list continue; } 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 && ( projection_field_count == 1 ) ) { // Field of interest is the only column in the projection list DBUG_RETURN( TRUE ); } DBUG_RETURN( FALSE ); } bool spider_mbase_handler::is_bulk_insert_exec_period( bool bulk_end ) { 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)); DBUG_PRINT("info",("spider insert_sql=%s", insert_sql.c_ptr_safe())); if ( (bulk_end || (int) insert_sql.length() >= spider->bulk_size) && (int) insert_sql.length() > insert_pos ) { DBUG_RETURN(TRUE); } DBUG_RETURN(FALSE); } bool spider_mbase_handler::sql_is_filled_up( ulong sql_type ) { DBUG_ENTER("spider_mbase_handler::sql_is_filled_up"); DBUG_PRINT("info",("spider this=%p", this)); DBUG_RETURN(filled_up); } bool spider_mbase_handler::sql_is_empty( ulong sql_type ) { bool is_empty; DBUG_ENTER("spider_mbase_handler::sql_is_empty"); DBUG_PRINT("info",("spider this=%p", this)); switch (sql_type) { case SPIDER_SQL_TYPE_SELECT_SQL: is_empty = (sql.length() == 0); break; case SPIDER_SQL_TYPE_INSERT_SQL: is_empty = (insert_sql.length() == 0); break; case SPIDER_SQL_TYPE_UPDATE_SQL: case SPIDER_SQL_TYPE_DELETE_SQL: case SPIDER_SQL_TYPE_BULK_UPDATE_SQL: is_empty = (update_sql.length() == 0); break; case SPIDER_SQL_TYPE_TMP_SQL: is_empty = (tmp_sql.length() == 0); break; default: is_empty = TRUE; break; } DBUG_RETURN(is_empty); } bool spider_mbase_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_mbase_handler::support_bulk_update() { DBUG_ENTER("spider_mbase_handler::support_bulk_update"); DBUG_PRINT("info",("spider this=%p", this)); DBUG_RETURN(TRUE); } int spider_mbase_handler::bulk_tmp_table_insert() { int error_num; 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_mbase_handler::bulk_tmp_table_insert( int link_idx ) { int error_num; 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], spider->result_list.upd_tmp_tbls[link_idx]); DBUG_RETURN(error_num); } int spider_mbase_handler::bulk_tmp_table_end_bulk_insert() { int error_num; 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())) { DBUG_RETURN(error_num); } DBUG_RETURN(0); } int spider_mbase_handler::bulk_tmp_table_rnd_init() { int error_num; 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))) { DBUG_RETURN(error_num); } reading_from_bulk_tmp_table = TRUE; DBUG_RETURN(0); } int spider_mbase_handler::bulk_tmp_table_rnd_next() { int error_num; DBUG_ENTER("spider_mbase_handler::bulk_tmp_table_rnd_next"); DBUG_PRINT("info",("spider this=%p", this)); error_num = upd_tmp_tbl->file->ha_rnd_next(upd_tmp_tbl->record[0]); if (!error_num) { error_num = restore_sql_from_bulk_tmp_table(&insert_sql, upd_tmp_tbl); } DBUG_RETURN(error_num); } int spider_mbase_handler::bulk_tmp_table_rnd_end() { int error_num; 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())) { DBUG_RETURN(error_num); } DBUG_RETURN(0); } bool spider_mbase_handler::need_copy_for_update( int link_idx ) { int all_link_idx = spider->conn_link_idx[link_idx]; 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_mbase_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_mbase_handler::mk_bulk_tmp_table_and_bulk_start() { THD *thd = spider->wide_handler->trx->thd; TABLE *table = spider->get_table(); 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); } upd_tmp_tbl->file->extra(HA_EXTRA_WRITE_CACHE); upd_tmp_tbl->file->ha_start_bulk_insert((ha_rows) 0); } DBUG_RETURN(0); } void spider_mbase_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) { spider_rm_sys_tmp_table(spider->wide_handler->trx->thd, upd_tmp_tbl, &upd_tmp_tbl_prm); upd_tmp_tbl = NULL; } DBUG_VOID_RETURN; } int spider_mbase_handler::store_sql_to_bulk_tmp_table( spider_string *str, TABLE *tmp_table ) { int error_num; 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()); if ((error_num = tmp_table->file->ha_write_row(tmp_table->record[0]))) DBUG_RETURN(error_num); DBUG_RETURN(0); } int spider_mbase_handler::restore_sql_from_bulk_tmp_table( spider_string *str, TABLE *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_mbase_handler::insert_lock_tables_list( SPIDER_CONN *conn, int link_idx ) { 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_mbase_handler::insert_lock_tables_list"); DBUG_PRINT("info",("spider this=%p", this)); uint old_elements = db_conn->lock_table_hash.array.max_element; if (my_hash_insert(&db_conn->lock_table_hash, (uchar*) tmp_link_for_hash2)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } if (db_conn->lock_table_hash.array.max_element > old_elements) { spider_alloc_calc_mem(spider_current_trx, db_conn->lock_table_hash, (db_conn->lock_table_hash.array.max_element - old_elements) * db_conn->lock_table_hash.array.size_of_element); } DBUG_RETURN(0); } int spider_mbase_handler::append_lock_tables_list( SPIDER_CONN *conn, int link_idx, int *appended ) { 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_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)); DBUG_PRINT("info",("spider db_conn=%p", db_conn)); tmp_link_for_hash2 = &link_for_hash[link_idx]; tmp_link_for_hash2->db_table_str = &mysql_share->db_table_str[conn_link_idx]; DBUG_PRINT("info",("spider db_table_str=%s", tmp_link_for_hash2->db_table_str->c_ptr_safe())); tmp_link_for_hash2->db_table_str_hash_value = mysql_share->db_table_str_hash_value[conn_link_idx]; if (!(tmp_link_for_hash = (SPIDER_LINK_FOR_HASH *) my_hash_search_using_hash_value( &db_conn->lock_table_hash, tmp_link_for_hash2->db_table_str_hash_value, (uchar*) tmp_link_for_hash2->db_table_str->ptr(), tmp_link_for_hash2->db_table_str->length()))) { if ((error_num = insert_lock_tables_list(conn, link_idx))) DBUG_RETURN(error_num); *appended = 1; } else { if (tmp_link_for_hash->spider->wide_handler->lock_type < spider->wide_handler->lock_type) { my_hash_delete(&db_conn->lock_table_hash, (uchar*) tmp_link_for_hash); uint old_elements = db_conn->lock_table_hash.array.max_element; if (my_hash_insert(&db_conn->lock_table_hash, (uchar*) tmp_link_for_hash2)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } if (db_conn->lock_table_hash.array.max_element > old_elements) { spider_alloc_calc_mem(spider_current_trx, db_conn->lock_table_hash, (db_conn->lock_table_hash.array.max_element - old_elements) * db_conn->lock_table_hash.array.size_of_element); } } } DBUG_RETURN(0); } int spider_mbase_handler::realloc_sql( ulong *realloced ) { THD *thd = spider->wide_handler->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_mbase_handler::realloc_sql"); DBUG_PRINT("info",("spider this=%p", this)); if ((int) sql.alloced_length() > init_sql_alloc_size * 2) { sql.free(); if (sql.real_alloc(init_sql_alloc_size)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); *realloced |= SPIDER_SQL_TYPE_SELECT_SQL; } if ((int) ha_sql.alloced_length() > init_sql_alloc_size * 2) { ha_sql.free(); if (ha_sql.real_alloc(init_sql_alloc_size)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); *realloced |= SPIDER_SQL_TYPE_SELECT_SQL; } if ((int) dup_update_sql.alloced_length() > init_sql_alloc_size * 2) { dup_update_sql.free(); if (dup_update_sql.real_alloc(init_sql_alloc_size)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); } if ((int) insert_sql.alloced_length() > init_sql_alloc_size * 2) { insert_sql.free(); if (insert_sql.real_alloc(init_sql_alloc_size)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); *realloced |= SPIDER_SQL_TYPE_INSERT_SQL; } if ((int) update_sql.alloced_length() > init_sql_alloc_size * 2) { update_sql.free(); if (update_sql.real_alloc(init_sql_alloc_size)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); *realloced |= (SPIDER_SQL_TYPE_UPDATE_SQL | SPIDER_SQL_TYPE_DELETE_SQL); } update_sql.length(0); if ((int) tmp_sql.alloced_length() > init_sql_alloc_size * 2) { tmp_sql.free(); if (tmp_sql.real_alloc(init_sql_alloc_size)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); *realloced |= SPIDER_SQL_TYPE_TMP_SQL; } DBUG_RETURN(0); } int spider_mbase_handler::reset_sql( ulong sql_type ) { DBUG_ENTER("spider_mbase_handler::reset_sql"); DBUG_PRINT("info",("spider this=%p", this)); if (sql_type & SPIDER_SQL_TYPE_SELECT_SQL) { sql.length(0); } if (sql_type & SPIDER_SQL_TYPE_INSERT_SQL) { insert_sql.length(0); } if (sql_type & (SPIDER_SQL_TYPE_UPDATE_SQL | SPIDER_SQL_TYPE_DELETE_SQL | SPIDER_SQL_TYPE_BULK_UPDATE_SQL)) { update_sql.length(0); } if (sql_type & SPIDER_SQL_TYPE_TMP_SQL) { tmp_sql.length(0); } DBUG_RETURN(0); } 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); } int spider_mbase_handler::set_sql_for_exec( ulong sql_type, int link_idx ) { int error_num; uint tmp_pos; 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_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)) { if (mysql_share->same_db_table_name || link_idx == first_link_idx) { if (sql_type & SPIDER_SQL_TYPE_SELECT_SQL) exec_sql = &sql; if (sql_type & SPIDER_SQL_TYPE_TMP_SQL) exec_tmp_sql = &tmp_sql; } else { char tmp_table_name[MAX_FIELD_WIDTH * 2], tgt_table_name[MAX_FIELD_WIDTH * 2]; int tmp_table_name_length; spider_string tgt_table_name_str(tgt_table_name, MAX_FIELD_WIDTH * 2, mysql_share->db_names_str[link_idx].charset()); const char *table_names[2], *table_aliases[2]; uint table_name_lengths[2], table_alias_lengths[2]; tgt_table_name_str.init_calc_mem(104); tgt_table_name_str.length(0); if (result_list->tmp_table_join && spider->bka_mode != 2) { create_tmp_bka_table_name(tmp_table_name, &tmp_table_name_length, link_idx); append_table_name_with_adjusting(&tgt_table_name_str, link_idx, SPIDER_SQL_TYPE_TMP_SQL); table_names[0] = tmp_table_name; table_names[1] = tgt_table_name_str.ptr(); table_name_lengths[0] = tmp_table_name_length; table_name_lengths[1] = tgt_table_name_str.length(); table_aliases[0] = SPIDER_SQL_A_STR; table_aliases[1] = SPIDER_SQL_B_STR; table_alias_lengths[0] = SPIDER_SQL_A_LEN; table_alias_lengths[1] = SPIDER_SQL_B_LEN; } if (sql_type & SPIDER_SQL_TYPE_SELECT_SQL) { exec_sql = &result_list->sqls[link_idx]; if (exec_sql->copy(sql)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); else if (result_list->use_union) { if ((error_num = reset_union_table_name(exec_sql, link_idx, SPIDER_SQL_TYPE_SELECT_SQL))) DBUG_RETURN(error_num); } else { tmp_pos = exec_sql->length(); exec_sql->length(table_name_pos); if (result_list->tmp_table_join && spider->bka_mode != 2) { 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)) ) DBUG_RETURN(error_num); exec_sql->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN); } else { append_table_name_with_adjusting(exec_sql, link_idx, SPIDER_SQL_TYPE_SELECT_SQL); } exec_sql->length(tmp_pos); } } if (sql_type & SPIDER_SQL_TYPE_TMP_SQL) { exec_tmp_sql = &result_list->tmp_sqls[link_idx]; if (result_list->tmp_table_join && spider->bka_mode != 2) { if (exec_tmp_sql->copy(tmp_sql)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); else { tmp_pos = exec_tmp_sql->length(); exec_tmp_sql->length(tmp_sql_pos1); exec_tmp_sql->q_append(tmp_table_name, tmp_table_name_length); exec_tmp_sql->length(tmp_sql_pos2); exec_tmp_sql->q_append(tmp_table_name, tmp_table_name_length); exec_tmp_sql->length(tmp_sql_pos3); exec_tmp_sql->q_append(tmp_table_name, tmp_table_name_length); exec_tmp_sql->length(tmp_pos); } } } } } if (sql_type & SPIDER_SQL_TYPE_INSERT_SQL) { if (mysql_share->same_db_table_name || link_idx == first_link_idx) exec_insert_sql = &insert_sql; else { exec_insert_sql = &result_list->insert_sqls[link_idx]; if (exec_insert_sql->copy(insert_sql)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); DBUG_PRINT("info",("spider exec_insert_sql=%s", exec_insert_sql->c_ptr_safe())); tmp_pos = exec_insert_sql->length(); exec_insert_sql->length(insert_table_name_pos); append_table_name_with_adjusting(exec_insert_sql, link_idx, sql_type); exec_insert_sql->length(tmp_pos); DBUG_PRINT("info",("spider exec_insert_sql->length=%u", exec_insert_sql->length())); DBUG_PRINT("info",("spider exec_insert_sql=%s", exec_insert_sql->c_ptr_safe())); } } if (sql_type & SPIDER_SQL_TYPE_BULK_UPDATE_SQL) { if (reading_from_bulk_tmp_table) { if ( mysql_share->same_db_table_name && share->link_statuses[all_link_idx] != SPIDER_LINK_STATUS_RECOVERY ) { exec_update_sql = &insert_sql; } else if (!spider->result_list.upd_tmp_tbls[link_idx]) { DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); } else { exec_update_sql = &spider->result_list.insert_sqls[link_idx]; if ((error_num = restore_sql_from_bulk_tmp_table(exec_update_sql, spider->result_list.upd_tmp_tbls[link_idx]))) { DBUG_RETURN(error_num); } } } else { if ( mysql_share->same_db_table_name && share->link_statuses[all_link_idx] != SPIDER_LINK_STATUS_RECOVERY ) { exec_update_sql = &update_sql; } else { exec_update_sql = &spider->result_list.update_sqls[link_idx]; } } } else if (sql_type & (SPIDER_SQL_TYPE_UPDATE_SQL | SPIDER_SQL_TYPE_DELETE_SQL)) { if (mysql_share->same_db_table_name || link_idx == first_link_idx) exec_update_sql = &update_sql; else { exec_update_sql = &spider->result_list.update_sqls[link_idx]; if (exec_update_sql->copy(update_sql)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); tmp_pos = exec_update_sql->length(); exec_update_sql->length(table_name_pos); append_table_name_with_adjusting(exec_update_sql, link_idx, sql_type); exec_update_sql->length(tmp_pos); } } DBUG_RETURN(0); } int spider_mbase_handler::set_sql_for_exec( spider_db_copy_table *tgt_ct, ulong sql_type ) { 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) { case SPIDER_SQL_TYPE_INSERT_SQL: exec_insert_sql = &mysql_ct->sql; break; default: DBUG_ASSERT(0); break; } DBUG_RETURN(0); } int spider_mbase_handler::execute_sql( ulong sql_type, SPIDER_CONN *conn, int quick_mode, int *need_mon ) { spider_string *tgt_sql; uint tgt_length; DBUG_ENTER("spider_mbase_handler::execute_sql"); DBUG_PRINT("info",("spider this=%p", this)); switch (sql_type) { case SPIDER_SQL_TYPE_SELECT_SQL: DBUG_PRINT("info",("spider SPIDER_SQL_TYPE_SELECT_SQL")); tgt_sql = exec_sql; tgt_length = tgt_sql->length(); break; case SPIDER_SQL_TYPE_INSERT_SQL: DBUG_PRINT("info",("spider SPIDER_SQL_TYPE_SELECT_SQL")); tgt_sql = exec_insert_sql; tgt_length = tgt_sql->length(); break; case SPIDER_SQL_TYPE_UPDATE_SQL: case SPIDER_SQL_TYPE_DELETE_SQL: case SPIDER_SQL_TYPE_BULK_UPDATE_SQL: DBUG_PRINT("info",("spider %s", sql_type == SPIDER_SQL_TYPE_UPDATE_SQL ? "SPIDER_SQL_TYPE_UPDATE_SQL" : sql_type == SPIDER_SQL_TYPE_DELETE_SQL ? "SPIDER_SQL_TYPE_DELETE_SQL" : "SPIDER_SQL_TYPE_BULK_UPDATE_SQL" )); tgt_sql = exec_update_sql; tgt_length = tgt_sql->length(); break; case SPIDER_SQL_TYPE_TMP_SQL: DBUG_PRINT("info",("spider SPIDER_SQL_TYPE_TMP_SQL")); tgt_sql = exec_tmp_sql; tgt_length = tgt_sql->length(); break; case SPIDER_SQL_TYPE_DROP_TMP_TABLE_SQL: DBUG_PRINT("info",("spider SPIDER_SQL_TYPE_DROP_TMP_TABLE_SQL")); tgt_sql = exec_tmp_sql; tgt_length = tmp_sql_pos5; break; default: /* nothing to do */ DBUG_PRINT("info",("spider default")); DBUG_RETURN(0); } DBUG_RETURN(spider_db_query( conn, tgt_sql->ptr(), tgt_length, quick_mode, need_mon )); } int spider_mbase_handler::reset() { DBUG_ENTER("spider_mbase_handler::reset"); DBUG_PRINT("info",("spider this=%p", this)); update_sql.length(0); DBUG_RETURN(0); } int spider_mbase_handler::sts_mode_exchange( int sts_mode ) { DBUG_ENTER("spider_mbase_handler::sts_mode_exchange"); DBUG_PRINT("info",("spider sts_mode=%d", sts_mode)); DBUG_RETURN(sts_mode); } int spider_mbase_handler::show_table_status( int link_idx, int sts_mode, uint flag ) { int error_num; SPIDER_CONN *conn = spider->conns[link_idx]; SPIDER_DB_RESULT *res; SPIDER_SHARE *share = spider->share; uint pos = (2 * spider->conn_link_idx[link_idx]); ulonglong auto_increment_value = 0; DBUG_ENTER("spider_mbase_handler::show_table_status"); DBUG_PRINT("info",("spider sts_mode=%d", sts_mode)); if (sts_mode == 1) { 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 = &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; conn->disable_connect_retry = TRUE; spider_conn_set_timeout_from_share(conn, link_idx, spider->wide_handler->trx->thd, share); if ( (error_num = spider_db_set_names(spider, conn, link_idx)) || ( spider_db_query( conn, mysql_share->show_table_status[0 + pos].ptr(), mysql_share->show_table_status[0 + pos].length(), -1, &spider->need_mons[link_idx]) && (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(spider, conn, link_idx))) { conn->disable_connect_retry = FALSE; 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(error_num); } if ((error_num = spider_db_set_names(spider, conn, link_idx))) { conn->disable_connect_retry = FALSE; 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(error_num); } spider_conn_set_timeout_from_share(conn, link_idx, spider->wide_handler->trx->thd, share); if (spider_db_query( conn, mysql_share->show_table_status[0 + pos].ptr(), mysql_share->show_table_status[0 + pos].length(), -1, &spider->need_mons[link_idx]) ) { conn->disable_connect_retry = FALSE; 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_RETURN(spider_db_errorno(conn)); } } else { conn->disable_connect_retry = FALSE; 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(error_num); } } st_spider_db_request_key request_key; request_key.spider_thread_id = spider->wide_handler->trx->spider_thread_id; request_key.query_id = spider->wide_handler->trx->thd->query_id; request_key.handler = spider; request_key.request_id = 1; request_key.next = NULL; if (spider_param_dry_access()) { conn->disable_connect_retry = FALSE; 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); } if (!(res = conn->db_conn->store_result(NULL, &request_key, &error_num))) { conn->disable_connect_retry = FALSE; 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_RETURN(error_num); } else if ((error_num = spider_db_errorno(conn))) DBUG_RETURN(error_num); 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(), mysql_share->table_names_str[spider->conn_link_idx[ link_idx]].ptr()); DBUG_RETURN(ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM); } } conn->disable_connect_retry = FALSE; 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); error_num = res->fetch_table_status( sts_mode, share->stat ); auto_increment_value = share->stat.auto_increment_value; res->free_result(); delete res; if (error_num) { switch (error_num) { case ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM: 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(), mysql_share->table_names_str[spider->conn_link_idx[ link_idx]].ptr()); break; case ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM: my_printf_error(ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM, ER_SPIDER_INVALID_REMOTE_TABLE_INFO_STR, MYF(0), mysql_share->db_names_str[spider->conn_link_idx[link_idx]].ptr(), mysql_share->table_names_str[spider->conn_link_idx[ link_idx]].ptr()); break; default: break; } DBUG_RETURN(error_num); } } else { 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 = &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; conn->disable_connect_retry = TRUE; spider_conn_set_timeout_from_share(conn, link_idx, spider->wide_handler->trx->thd, share); if ( (error_num = spider_db_set_names(spider, conn, link_idx)) || ( spider_db_query( conn, mysql_share->show_table_status[1 + pos].ptr(), mysql_share->show_table_status[1 + pos].length(), -1, &spider->need_mons[link_idx]) && (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(spider, conn, link_idx))) { conn->disable_connect_retry = FALSE; 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(error_num); } if ((error_num = spider_db_set_names(spider, conn, link_idx))) { conn->disable_connect_retry = FALSE; 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(error_num); } spider_conn_set_timeout_from_share(conn, link_idx, spider->wide_handler->trx->thd, share); if (spider_db_query( conn, mysql_share->show_table_status[1 + pos].ptr(), mysql_share->show_table_status[1 + pos].length(), -1, &spider->need_mons[link_idx]) ) { conn->disable_connect_retry = FALSE; 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_RETURN(spider_db_errorno(conn)); } } else { conn->disable_connect_retry = FALSE; 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(error_num); } } st_spider_db_request_key request_key; request_key.spider_thread_id = spider->wide_handler->trx->spider_thread_id; request_key.query_id = spider->wide_handler->trx->thd->query_id; request_key.handler = spider; request_key.request_id = 1; request_key.next = NULL; if (spider_param_dry_access()) { conn->disable_connect_retry = FALSE; 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); } if (!(res = conn->db_conn->store_result(NULL, &request_key, &error_num))) { conn->disable_connect_retry = FALSE; 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 || (error_num = spider_db_errorno(conn))) DBUG_RETURN(error_num); else DBUG_RETURN(ER_QUERY_ON_FOREIGN_DATA_SOURCE); } conn->disable_connect_retry = FALSE; 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); error_num = res->fetch_table_status( sts_mode, share->stat ); auto_increment_value = share->stat.auto_increment_value; res->free_result(); delete res; if (error_num) { switch (error_num) { case ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM: 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(), mysql_share->table_names_str[spider->conn_link_idx[ link_idx]].ptr()); break; case ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM: my_printf_error(ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM, ER_SPIDER_INVALID_REMOTE_TABLE_INFO_STR, MYF(0), mysql_share->db_names_str[spider->conn_link_idx[link_idx]].ptr(), mysql_share->table_names_str[spider->conn_link_idx[ link_idx]].ptr()); break; default: break; } DBUG_RETURN(error_num); } } if ((error_num = ((spider_db_mbase *) conn->db_conn)->fetch_and_print_warnings(NULL))) { DBUG_RETURN(error_num); } if (share->static_records_for_status != -1) { share->stat.records = (ha_rows) share->static_records_for_status; } if (share->static_mean_rec_length != -1) { share->stat.mean_rec_length = (ulong) share->static_mean_rec_length; } if (auto_increment_value > share->lgtm_tblhnd_share->auto_increment_value) { share->lgtm_tblhnd_share->auto_increment_value = auto_increment_value; DBUG_PRINT("info",("spider auto_increment_value=%llu", share->lgtm_tblhnd_share->auto_increment_value)); } DBUG_RETURN(0); } int spider_mbase_handler::crd_mode_exchange( int crd_mode ) { DBUG_ENTER("spider_mbase_handler::crd_mode_exchange"); DBUG_PRINT("info",("spider crd_mode=%d", crd_mode)); DBUG_RETURN(crd_mode); } int spider_mbase_handler::show_index( int link_idx, int crd_mode ) { int error_num; SPIDER_CONN *conn = spider->conns[link_idx]; SPIDER_SHARE *share = spider->share; TABLE *table = spider->get_table(); SPIDER_DB_RESULT *res; int roop_count; longlong *tmp_cardinality; uint pos = (2 * spider->conn_link_idx[link_idx]); DBUG_ENTER("spider_mbase_handler::show_index"); DBUG_PRINT("info",("spider crd_mode=%d", crd_mode)); if (crd_mode == 1) { 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 = &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; spider_conn_set_timeout_from_share(conn, link_idx, spider->wide_handler->trx->thd, share); if ( (error_num = spider_db_set_names(spider, conn, link_idx)) || ( spider_db_query( conn, mysql_share->show_index[0 + pos].ptr(), mysql_share->show_index[0 + pos].length(), -1, &spider->need_mons[link_idx]) && (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(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); DBUG_RETURN(error_num); } 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); DBUG_RETURN(error_num); } spider_conn_set_timeout_from_share(conn, link_idx, spider->wide_handler->trx->thd, share); if (spider_db_query( conn, mysql_share->show_index[0 + pos].ptr(), mysql_share->show_index[0 + pos].length(), -1, &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; 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_RETURN(error_num); } } st_spider_db_request_key request_key; request_key.spider_thread_id = spider->wide_handler->trx->spider_thread_id; request_key.query_id = spider->wide_handler->trx->thd->query_id; request_key.handler = spider; request_key.request_id = 1; request_key.next = NULL; if (!(res = conn->db_conn->store_result(NULL, &request_key, &error_num))) { if (error_num || (error_num = spider_db_errorno(conn))) { 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(error_num); } /* no record is ok */ } 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 (res) { error_num = res->fetch_table_cardinality( crd_mode, table, share->cardinality, share->cardinality_upd, share->bitmap_size ); } for (roop_count = 0, tmp_cardinality = share->cardinality; roop_count < (int) table->s->fields; roop_count++, tmp_cardinality++) { if (!spider_bit_is_set(share->cardinality_upd, roop_count)) { DBUG_PRINT("info", ("spider uninitialized column cardinality id=%d", roop_count)); *tmp_cardinality = -1; } } if (res) { res->free_result(); delete res; } if (error_num) { switch (error_num) { case ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM: 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(), mysql_share->table_names_str[spider->conn_link_idx[ link_idx]].ptr()); break; case ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM: my_printf_error(ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM, ER_SPIDER_INVALID_REMOTE_TABLE_INFO_STR, MYF(0), mysql_share->db_names_str[spider->conn_link_idx[link_idx]].ptr(), mysql_share->table_names_str[spider->conn_link_idx[ link_idx]].ptr()); break; default: break; } DBUG_RETURN(error_num); } } else { 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 = &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; spider_conn_set_timeout_from_share(conn, link_idx, spider->wide_handler->trx->thd, share); if ( (error_num = spider_db_set_names(spider, conn, link_idx)) || ( spider_db_query( conn, mysql_share->show_index[1 + pos].ptr(), mysql_share->show_index[1 + pos].length(), -1, &spider->need_mons[link_idx]) && (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(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); DBUG_RETURN(error_num); } 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); DBUG_RETURN(error_num); } spider_conn_set_timeout_from_share(conn, link_idx, spider->wide_handler->trx->thd, share); if (spider_db_query( conn, mysql_share->show_index[1 + pos].ptr(), mysql_share->show_index[1 + pos].length(), -1, &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; 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_RETURN(error_num); } } st_spider_db_request_key request_key; request_key.spider_thread_id = spider->wide_handler->trx->spider_thread_id; request_key.query_id = spider->wide_handler->trx->thd->query_id; request_key.handler = spider; request_key.request_id = 1; request_key.next = NULL; if (!(res = conn->db_conn->store_result(NULL, &request_key, &error_num))) { if (error_num || (error_num = spider_db_errorno(conn))) { 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(error_num); } /* no record is ok */ } 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 (res) { error_num = res->fetch_table_cardinality( crd_mode, table, share->cardinality, share->cardinality_upd, share->bitmap_size ); } for (roop_count = 0, tmp_cardinality = share->cardinality; roop_count < (int) table->s->fields; roop_count++, tmp_cardinality++) { if (!spider_bit_is_set(share->cardinality_upd, roop_count)) { DBUG_PRINT("info", ("spider uninitialized column cardinality id=%d", roop_count)); *tmp_cardinality = -1; } } if (res) { res->free_result(); delete res; } if (error_num) { switch (error_num) { case ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM: 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(), mysql_share->table_names_str[spider->conn_link_idx[ link_idx]].ptr()); break; case ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM: my_printf_error(ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM, ER_SPIDER_INVALID_REMOTE_TABLE_INFO_STR, MYF(0), mysql_share->db_names_str[spider->conn_link_idx[link_idx]].ptr(), mysql_share->table_names_str[spider->conn_link_idx[ link_idx]].ptr()); break; default: break; } DBUG_RETURN(error_num); } } DBUG_RETURN(0); } int spider_mbase_handler::simple_action( uint simple_action, int link_idx ) { int error_num; SPIDER_CONN *conn = spider->conns[link_idx]; SPIDER_DB_RESULT *res; SPIDER_SHARE *share = spider->share; uint pos = spider->conn_link_idx[link_idx]; spider_string *str = NULL; DBUG_ENTER("spider_mbase_handler::simple_action"); switch (simple_action) { case SPIDER_SIMPLE_RECORDS: DBUG_PRINT("info",("spider simple records")); str = &mysql_share->show_records[pos]; break; case SPIDER_SIMPLE_CHECKSUM_TABLE: DBUG_PRINT("info",("spider simple checksum_table")); str = &spider->result_list.sqls[link_idx]; str->length(0); if (str->reserve( SPIDER_SQL_CHECKSUM_TABLE_LEN + mysql_share->db_nm_max_length + SPIDER_SQL_DOT_LEN + mysql_share->table_nm_max_length + /* SPIDER_SQL_NAME_QUOTE_LEN */ 4 + ((spider->action_flags & T_QUICK) ? SPIDER_SQL_SQL_QUICK_LEN : 0) + ((spider->action_flags & T_EXTEND) ? SPIDER_SQL_SQL_EXTENDED_LEN : 0) )) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } str->q_append(SPIDER_SQL_CHECKSUM_TABLE_STR, SPIDER_SQL_CHECKSUM_TABLE_LEN); mysql_share->append_table_name(str, pos); if (spider->action_flags & T_QUICK) { str->q_append(SPIDER_SQL_SQL_QUICK_STR, SPIDER_SQL_SQL_QUICK_LEN); } if (spider->action_flags & T_EXTEND) { str->q_append(SPIDER_SQL_SQL_EXTENDED_STR, SPIDER_SQL_SQL_EXTENDED_LEN); } break; default: DBUG_ASSERT(0); DBUG_RETURN(0); } 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 = &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; spider_conn_set_timeout_from_share(conn, link_idx, spider->wide_handler->trx->thd, share); if ( (error_num = spider_db_set_names(spider, conn, link_idx)) || ( spider_db_query( conn, str->ptr(), str->length(), -1, &spider->need_mons[link_idx]) && (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(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); DBUG_PRINT("info", ("spider error_num=%d 1", error_num)); DBUG_RETURN(error_num); } 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); DBUG_PRINT("info", ("spider error_num=%d 2", error_num)); DBUG_RETURN(error_num); } spider_conn_set_timeout_from_share(conn, link_idx, spider->wide_handler->trx->thd, share); if (spider_db_query( conn, str->ptr(), str->length(), -1, &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; 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); } } st_spider_db_request_key request_key; request_key.spider_thread_id = spider->wide_handler->trx->spider_thread_id; request_key.query_id = spider->wide_handler->trx->thd->query_id; request_key.handler = spider; request_key.request_id = 1; request_key.next = NULL; if (!(res = conn->db_conn->store_result(NULL, &request_key, &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); switch (simple_action) { case SPIDER_SIMPLE_RECORDS: DBUG_PRINT("info",("spider simple records")); error_num = res->fetch_table_records(1, spider->table_rows); break; case SPIDER_SIMPLE_CHECKSUM_TABLE: DBUG_PRINT("info",("spider simple checksum_table")); error_num = res->fetch_table_checksum(spider); break; default: DBUG_ASSERT(0); break; } res->free_result(); delete res; if (error_num) { DBUG_PRINT("info", ("spider error_num=%d 7", error_num)); DBUG_RETURN(error_num); } DBUG_RETURN(0); } int spider_mbase_handler::show_records( int link_idx ) { int error_num; DBUG_ENTER("spider_mbase_handler::show_records"); error_num = simple_action(SPIDER_SIMPLE_RECORDS, link_idx); if (error_num) { DBUG_PRINT("info", ("spider error_num=%d", error_num)); DBUG_RETURN(error_num); } DBUG_RETURN(0); } int spider_mbase_handler::checksum_table( int link_idx ) { DBUG_ENTER("spider_mbase_handler::checksum_table"); DBUG_RETURN(simple_action(SPIDER_SIMPLE_CHECKSUM_TABLE, link_idx)); DBUG_RETURN(0); } 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_mbase_handler::show_last_insert_id"); last_insert_id = conn->db_conn->last_insert_id(); DBUG_RETURN(0); } ha_rows spider_mbase_handler::explain_select( const key_range *start_key, const key_range *end_key, int link_idx ) { int error_num; SPIDER_CONN *conn = spider->conns[link_idx]; SPIDER_RESULT_LIST *result_list = &spider->result_list; spider_string *str = &result_list->sqls[link_idx]; SPIDER_DB_RESULT *res; ha_rows rows; spider_db_handler *dbton_hdl = spider->dbton_handler[conn->dbton_id]; 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))) { my_errno = error_num; DBUG_RETURN(HA_POS_ERROR); } 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 = &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; spider_conn_set_timeout_from_share(conn, link_idx, spider->wide_handler->trx->thd, spider->share); if ( (error_num = spider_db_set_names(spider, conn, link_idx)) || ( spider_db_query( conn, str->ptr(), str->length(), -1, &spider->need_mons[link_idx]) && (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(spider, conn, link_idx))) { if (spider->check_error_mode(error_num)) my_errno = 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; SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos); pthread_mutex_unlock(&conn->mta_conn_mutex); DBUG_RETURN(HA_POS_ERROR); } if ((error_num = spider_db_set_names(spider, conn, link_idx))) { if (spider->check_error_mode(error_num)) my_errno = 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; SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos); pthread_mutex_unlock(&conn->mta_conn_mutex); DBUG_RETURN(HA_POS_ERROR); } spider_conn_set_timeout_from_share(conn, link_idx, spider->wide_handler->trx->thd, spider->share); if (spider_db_query( conn, str->ptr(), str->length(), -1, &spider->need_mons[link_idx]) ) { error_num = spider_db_errorno(conn); if (spider->check_error_mode(error_num)) my_errno = 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; SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos); pthread_mutex_unlock(&conn->mta_conn_mutex); DBUG_RETURN(HA_POS_ERROR); } } else { if (spider->check_error_mode(error_num)) my_errno = 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; SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos); pthread_mutex_unlock(&conn->mta_conn_mutex); DBUG_RETURN(HA_POS_ERROR); } } st_spider_db_request_key request_key; request_key.spider_thread_id = spider->wide_handler->trx->spider_thread_id; request_key.query_id = spider->wide_handler->trx->thd->query_id; request_key.handler = spider; request_key.request_id = 1; request_key.next = NULL; if (!(res = conn->db_conn->store_result(NULL, &request_key, &error_num))) { if (error_num || (error_num = spider_db_errorno(conn))) { if (spider->check_error_mode(error_num)) my_errno = 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; SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos); pthread_mutex_unlock(&conn->mta_conn_mutex); DBUG_RETURN(HA_POS_ERROR); } else { my_errno = 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(HA_POS_ERROR); } } 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); error_num = res->fetch_table_records( 2, rows ); res->free_result(); delete res; if (error_num) { my_errno = error_num; DBUG_RETURN(HA_POS_ERROR); } DBUG_RETURN(rows); } 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_mbase_handler::lock_tables"); str->length(0); if ((error_num = conn->db_conn->append_lock_tables(str))) { DBUG_RETURN(error_num); } if (str->length()) { 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 = &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); DBUG_RETURN(error_num); } spider_conn_set_timeout_from_share(conn, link_idx, spider->wide_handler->trx->thd, spider->share); if (spider_db_query( conn, str->ptr(), str->length(), -1, &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; DBUG_RETURN(spider_db_errorno(conn)); } 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 (!conn->table_locked) { conn->table_locked = TRUE; spider->wide_handler->trx->locked_connections++; } DBUG_RETURN(0); } int spider_mbase_handler::unlock_tables( int link_idx ) { int error_num; SPIDER_CONN *conn = spider->conns[link_idx]; DBUG_ENTER("spider_mbase_handler::unlock_tables"); if (conn->table_locked) { spider_string *str = &sql; conn->table_locked = FALSE; spider->wide_handler->trx->locked_connections--; str->length(0); if ((error_num = conn->db_conn->append_unlock_tables(str))) { DBUG_RETURN(error_num); } if (str->length()) { spider_conn_set_timeout_from_share(conn, link_idx, spider->wide_handler->trx->thd, spider->share); 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 = &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 (spider_db_query( conn, str->ptr(), str->length(), -1, &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; DBUG_RETURN(spider_db_errorno(conn)); } 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_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_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, link_idx))) { DBUG_RETURN(error_num); } 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 = &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); DBUG_RETURN(error_num); } spider_conn_set_timeout_from_share(conn, link_idx, spider->wide_handler->trx->thd, share); if (spider_db_query( conn, str->ptr(), str->length(), -1, &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); 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; SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos); pthread_mutex_unlock(&conn->mta_conn_mutex); DBUG_RETURN(0); } 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_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, link_idx))) { DBUG_RETURN(error_num); } 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 = &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); DBUG_RETURN(error_num); } spider_conn_set_timeout_from_share(conn, link_idx, spider->wide_handler->trx->thd, share); if (spider_db_query( conn, str->ptr(), str->length(), -1, &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); 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; SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos); pthread_mutex_unlock(&conn->mta_conn_mutex); DBUG_RETURN(0); } int spider_mbase_handler::check_table( SPIDER_CONN *conn, int link_idx, HA_CHECK_OPT* check_opt ) { int error_num; SPIDER_SHARE *share = spider->share; spider_string *str = &spider->result_list.sqls[link_idx]; 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, link_idx, check_opt))) { DBUG_RETURN(error_num); } 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 = &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); DBUG_RETURN(error_num); } spider_conn_set_timeout_from_share(conn, link_idx, spider->wide_handler->trx->thd, share); if (spider_db_query( conn, str->ptr(), str->length(), -1, &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); 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; SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos); pthread_mutex_unlock(&conn->mta_conn_mutex); DBUG_RETURN(0); } int spider_mbase_handler::repair_table( SPIDER_CONN *conn, int link_idx, HA_CHECK_OPT* check_opt ) { int error_num; SPIDER_SHARE *share = spider->share; spider_string *str = &spider->result_list.sqls[link_idx]; 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, link_idx, check_opt))) { DBUG_RETURN(error_num); } 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 = &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); DBUG_RETURN(error_num); } spider_conn_set_timeout_from_share(conn, link_idx, spider->wide_handler->trx->thd, share); if (spider_db_query( conn, str->ptr(), str->length(), -1, &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); 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; SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos); pthread_mutex_unlock(&conn->mta_conn_mutex); DBUG_RETURN(0); } 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_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, link_idx))) { DBUG_RETURN(error_num); } 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 = &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); DBUG_RETURN(error_num); } spider_conn_set_timeout_from_share(conn, link_idx, spider->wide_handler->trx->thd, share); if (spider_db_query( conn, str->ptr(), str->length(), -1, &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); 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; SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos); pthread_mutex_unlock(&conn->mta_conn_mutex); DBUG_RETURN(0); } 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_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, link_idx))) { DBUG_RETURN(error_num); } 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 = &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); DBUG_RETURN(error_num); } spider_conn_set_timeout_from_share(conn, link_idx, spider->wide_handler->trx->thd, share); if (spider_db_query( conn, str->ptr(), str->length(), -1, &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); 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; SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos); pthread_mutex_unlock(&conn->mta_conn_mutex); DBUG_RETURN(0); } int spider_mbase_handler::flush_tables( SPIDER_CONN *conn, int link_idx, bool lock ) { int error_num; SPIDER_SHARE *share = spider->share; spider_string *str = &spider->result_list.sqls[link_idx]; 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, link_idx, lock))) { DBUG_RETURN(error_num); } spider_conn_set_timeout_from_share(conn, link_idx, spider->wide_handler->trx->thd, share); 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 = &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 (spider_db_query( conn, str->ptr(), str->length(), -1, &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); 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; SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos); pthread_mutex_unlock(&conn->mta_conn_mutex); DBUG_RETURN(0); } int spider_mbase_handler::flush_logs( SPIDER_CONN *conn, int link_idx ) { int error_num; SPIDER_SHARE *share = spider->share; DBUG_ENTER("spider_mbase_handler::flush_logs"); DBUG_PRINT("info",("spider this=%p", this)); spider_conn_set_timeout_from_share(conn, link_idx, spider->wide_handler->trx->thd, share); 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 = &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 (spider_db_query( conn, SPIDER_SQL_FLUSH_LOGS_STR, SPIDER_SQL_FLUSH_LOGS_LEN, -1, &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); 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; SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos); pthread_mutex_unlock(&conn->mta_conn_mutex); DBUG_RETURN(0); } int spider_mbase_handler::sync_from_clone_source( spider_db_handler *dbton_hdl ) { DBUG_ENTER("spider_mbase_handler::sync_from_clone_source"); DBUG_PRINT("info",("spider this=%p", this)); DBUG_RETURN(0); } void spider_mbase_handler::minimum_select_bitmap_create() { TABLE *table = spider->get_table(); Field **field_p; 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 ( spider->use_index_merge || spider->is_clone ) { /* need preparing for cmp_ref */ TABLE_SHARE *table_share = table->s; if ( table_share->primary_key == MAX_KEY ) { /* need all columns */ memset(minimum_select_bitmap, 0xFF, no_bytes_in_map(table->read_set)); DBUG_VOID_RETURN; } else { /* need primary key columns */ uint roop_count; KEY *key_info; KEY_PART_INFO *key_part; Field *field; key_info = &table_share->key_info[table_share->primary_key]; key_part = key_info->key_part; for (roop_count = 0; roop_count < spider_user_defined_key_parts(key_info); roop_count++) { field = key_part[roop_count].field; spider_set_bit(minimum_select_bitmap, field->field_index); } } } DBUG_PRINT("info",("spider searched_bitmap=%p", spider->wide_handler->searched_bitmap)); for (field_p = table->field; *field_p; field_p++) { uint field_index = (*field_p)->field_index; DBUG_PRINT("info",("spider field_index=%u", field_index)); DBUG_PRINT("info",("spider ft_discard_bitmap=%s", spider_bit_is_set(spider->wide_handler->ft_discard_bitmap, field_index) ? "TRUE" : "FALSE")); DBUG_PRINT("info",("spider searched_bitmap=%s", spider_bit_is_set(spider->wide_handler->searched_bitmap, field_index) ? "TRUE" : "FALSE")); DBUG_PRINT("info",("spider read_set=%s", bitmap_is_set(table->read_set, field_index) ? "TRUE" : "FALSE")); DBUG_PRINT("info",("spider write_set=%s", bitmap_is_set(table->write_set, field_index) ? "TRUE" : "FALSE")); if ( spider_bit_is_set(spider->wide_handler->ft_discard_bitmap, field_index) && ( spider_bit_is_set(spider->wide_handler->searched_bitmap, field_index) || bitmap_is_set(table->read_set, field_index) || bitmap_is_set(table->write_set, field_index) ) ) { spider_set_bit(minimum_select_bitmap, field_index); } } DBUG_VOID_RETURN; } bool spider_mbase_handler::minimum_select_bit_is_set( uint field_index ) { 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", spider_bit_is_set(minimum_select_bitmap, field_index) ? "TRUE" : "FALSE")); DBUG_RETURN(spider_bit_is_set(minimum_select_bitmap, field_index)); } void spider_mbase_handler::copy_minimum_select_bitmap( uchar *bitmap ) { int roop_count; TABLE *table = spider->get_table(); DBUG_ENTER("spider_mbase_handler::copy_minimum_select_bitmap"); for (roop_count = 0; roop_count < (int) ((table->s->fields + 7) / 8); roop_count++) { bitmap[roop_count] = minimum_select_bitmap[roop_count]; DBUG_PRINT("info",("spider roop_count=%d", roop_count)); DBUG_PRINT("info",("spider bitmap=%d", bitmap[roop_count])); } DBUG_VOID_RETURN; } int spider_mbase_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) { if (!spider_bulk_malloc(spider_current_trx, 236, MYF(MY_WME), &union_table_name_pos_first, (uint) (sizeof(SPIDER_INT_HLD)), NullS) ) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } union_table_name_pos_first->next = NULL; } union_table_name_pos_current = union_table_name_pos_first; union_table_name_pos_current->tgt_num = 0; DBUG_RETURN(0); } int spider_mbase_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) { if (!union_table_name_pos_current->next) { if (!spider_bulk_malloc(spider_current_trx, 237, MYF(MY_WME), &union_table_name_pos_current->next, (uint) (sizeof(SPIDER_INT_HLD)), NullS) ) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } union_table_name_pos_current->next->next = NULL; } union_table_name_pos_current = union_table_name_pos_current->next; union_table_name_pos_current->tgt_num = 0; } union_table_name_pos_current->tgt[union_table_name_pos_current->tgt_num] = table_name_pos; ++union_table_name_pos_current->tgt_num; DBUG_RETURN(0); } int spider_mbase_handler::reset_union_table_name( spider_string *str, int link_idx, ulong sql_type ) { 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); SPIDER_INT_HLD *tmp_pos = union_table_name_pos_first; uint cur_num, pos_backup = str->length(); while(TRUE) { for (cur_num = 0; cur_num < tmp_pos->tgt_num; ++cur_num) { str->length(tmp_pos->tgt[cur_num]); append_table_name_with_adjusting(str, link_idx, sql_type); } if (tmp_pos == union_table_name_pos_current) break; tmp_pos = tmp_pos->next; } str->length(pos_backup); DBUG_RETURN(0); } 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 *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 *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 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_escaped_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); } bool spider_mbase_handler::check_direct_update( st_select_lex *select_lex, longlong select_limit, longlong offset_limit ) { DBUG_ENTER("spider_mbase_handler::check_direct_update"); DBUG_PRINT("info",("spider this=%p", this)); DBUG_RETURN(FALSE); } bool spider_mbase_handler::check_direct_delete( st_select_lex *select_lex, longlong select_limit, longlong offset_limit ) { DBUG_ENTER("spider_mbase_handler::check_direct_delete"); DBUG_PRINT("info",("spider this=%p", this)); DBUG_RETURN(FALSE); } 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"); DBUG_PRINT("info",("spider this=%p", this)); DBUG_VOID_RETURN; } 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_mbase_copy_table::init"); DBUG_PRINT("info",("spider this=%p", this)); sql.init_calc_mem(78); DBUG_RETURN(0); } void spider_mbase_copy_table::set_sql_charset( CHARSET_INFO *cs ) { 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_mbase_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); sql.q_append(SPIDER_SQL_SELECT_STR, SPIDER_SQL_SELECT_LEN); DBUG_RETURN(0); } int spider_mbase_copy_table::append_insert_str( int insert_flg ) { DBUG_ENTER("spider_mbase_copy_table::append_insert_str"); DBUG_PRINT("info",("spider this=%p", this)); if (insert_flg & SPIDER_DB_INSERT_REPLACE) { if (sql.reserve(SPIDER_SQL_REPLACE_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); sql.q_append(SPIDER_SQL_REPLACE_STR, SPIDER_SQL_REPLACE_LEN); } else { if (sql.reserve(SPIDER_SQL_INSERT_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); sql.q_append(SPIDER_SQL_INSERT_STR, SPIDER_SQL_INSERT_LEN); } if (insert_flg & SPIDER_DB_INSERT_LOW_PRIORITY) { if (sql.reserve(SPIDER_SQL_LOW_PRIORITY_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); sql.q_append(SPIDER_SQL_LOW_PRIORITY_STR, SPIDER_SQL_LOW_PRIORITY_LEN); } else if (insert_flg & SPIDER_DB_INSERT_HIGH_PRIORITY) { if (sql.reserve(SPIDER_SQL_HIGH_PRIORITY_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); sql.q_append(SPIDER_SQL_HIGH_PRIORITY_STR, SPIDER_SQL_HIGH_PRIORITY_LEN); } if (insert_flg & SPIDER_DB_INSERT_IGNORE) { if (sql.reserve(SPIDER_SQL_SQL_IGNORE_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); sql.q_append(SPIDER_SQL_SQL_IGNORE_STR, SPIDER_SQL_SQL_IGNORE_LEN); } DBUG_RETURN(0); } int spider_mbase_copy_table::append_table_columns( TABLE_SHARE *table_share ) { int error_num; Field **field; DBUG_ENTER("spider_mbase_copy_table::append_table_columns"); DBUG_PRINT("info",("spider this=%p", this)); for (field = table_share->field; *field; field++) { 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, (*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); sql.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN); sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); } sql.length(sql.length() - SPIDER_SQL_COMMA_LEN); DBUG_RETURN(0); } int spider_mbase_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); sql.q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN); DBUG_RETURN(0); } int spider_mbase_copy_table::append_table_name( int link_idx ) { int error_num; 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_mbase_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_mbase_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_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_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)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } sql.q_append(SPIDER_SQL_WHERE_STR, SPIDER_SQL_WHERE_LEN); sql.q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN); Field *field; KEY_PART_INFO *key_part = key_info->key_part; for (roop_count = spider_user_defined_key_parts(key_info) - 1; roop_count >= 0; roop_count--) { for (roop_count2 = 0; roop_count2 < roop_count; roop_count2++) { field = key_part[roop_count2].field; if ((error_num = copy_key_row(source_ct, field, &last_row_pos[field->field_index], &last_lengths[field->field_index], SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN))) { DBUG_RETURN(error_num); } } field = key_part[roop_count2].field; if ((error_num = copy_key_row(source_ct, field, &last_row_pos[field->field_index], &last_lengths[field->field_index], SPIDER_SQL_GT_STR, SPIDER_SQL_GT_LEN))) { DBUG_RETURN(error_num); } sql.length(sql.length() - SPIDER_SQL_AND_LEN); if (sql.reserve(SPIDER_SQL_CLOSE_PAREN_LEN + SPIDER_SQL_OR_LEN + SPIDER_SQL_OPEN_PAREN_LEN)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } sql.q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN); sql.q_append(SPIDER_SQL_OR_STR, SPIDER_SQL_OR_LEN); sql.q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN); } sql.length(sql.length() - SPIDER_SQL_OR_LEN - SPIDER_SQL_OPEN_PAREN_LEN); DBUG_RETURN(0); } int spider_mbase_copy_table::append_key_order_str( KEY *key_info, int start_pos, bool desc_flg ) { int length, error_num; KEY_PART_INFO *key_part; Field *field; 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) { if (sql.reserve(SPIDER_SQL_ORDER_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); sql.q_append(SPIDER_SQL_ORDER_STR, SPIDER_SQL_ORDER_LEN); if (desc_flg == TRUE) { for ( key_part = key_info->key_part + start_pos, length = 0; length + start_pos < (int) spider_user_defined_key_parts(key_info); key_part++, length++ ) { field = key_part->field; 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, field->field_name, dbton_id))) DBUG_RETURN(error_num); if (key_part->key_part_flag & HA_REVERSE_SORT) { if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN + SPIDER_SQL_COMMA_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); sql.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN); sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); } else { if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN + SPIDER_SQL_DESC_LEN + SPIDER_SQL_COMMA_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); sql.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN); sql.q_append(SPIDER_SQL_DESC_STR, SPIDER_SQL_DESC_LEN); sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); } } } else { for ( key_part = key_info->key_part + start_pos, length = 0; length + start_pos < (int) spider_user_defined_key_parts(key_info); key_part++, length++ ) { field = key_part->field; 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, field->field_name, dbton_id))) DBUG_RETURN(error_num); if (key_part->key_part_flag & HA_REVERSE_SORT) { if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN + SPIDER_SQL_DESC_LEN + SPIDER_SQL_COMMA_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); sql.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN); sql.q_append(SPIDER_SQL_DESC_STR, SPIDER_SQL_DESC_LEN); sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); } else { if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN + SPIDER_SQL_COMMA_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); sql.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN); sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); } } } sql.length(sql.length() - SPIDER_SQL_COMMA_LEN); } DBUG_RETURN(0); } int spider_mbase_copy_table::append_limit( longlong offset, longlong limit ) { char buf[SPIDER_LONGLONG_LEN + 1]; uint32 length; DBUG_ENTER("spider_mbase_copy_table::append_limit"); DBUG_PRINT("info",("spider this=%p", this)); if (offset || limit < 9223372036854775807LL) { if (sql.reserve(SPIDER_SQL_LIMIT_LEN + SPIDER_SQL_COMMA_LEN + ((SPIDER_LONGLONG_LEN) * 2))) DBUG_RETURN(HA_ERR_OUT_OF_MEM); sql.q_append(SPIDER_SQL_LIMIT_STR, SPIDER_SQL_LIMIT_LEN); if (offset) { length = (uint32) (my_charset_bin.longlong10_to_str)( buf, SPIDER_LONGLONG_LEN + 1, -10, offset); sql.q_append(buf, length); sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); } length = (uint32) (my_charset_bin.longlong10_to_str)( buf, SPIDER_LONGLONG_LEN + 1, -10, limit); sql.q_append(buf, length); } DBUG_RETURN(0); } int spider_mbase_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); sql.q_append(SPIDER_SQL_INTO_STR, SPIDER_SQL_INTO_LEN); DBUG_RETURN(0); } int spider_mbase_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); sql.q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN); DBUG_RETURN(0); } int spider_mbase_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)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); sql.q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN); sql.q_append(SPIDER_SQL_VALUES_STR, SPIDER_SQL_VALUES_LEN); sql.q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN); DBUG_RETURN(0); } int spider_mbase_copy_table::append_select_lock_str( int lock_mode ) { DBUG_ENTER("spider_mbase_copy_table::append_select_lock_str"); DBUG_PRINT("info",("spider this=%p", this)); if (lock_mode == SPIDER_LOCK_MODE_EXCLUSIVE) { if (sql.reserve(SPIDER_SQL_FOR_UPDATE_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); sql.q_append(SPIDER_SQL_FOR_UPDATE_STR, SPIDER_SQL_FOR_UPDATE_LEN); } else if (lock_mode == SPIDER_LOCK_MODE_SHARED) { if (sql.reserve(SPIDER_SQL_SHARED_LOCK_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); sql.q_append(SPIDER_SQL_SHARED_LOCK_STR, SPIDER_SQL_SHARED_LOCK_LEN); } DBUG_RETURN(0); } int spider_mbase_copy_table::exec_query( SPIDER_CONN *conn, int quick_mode, int *need_mon ) { int error_num; 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_mbase_copy_table::copy_key_row( spider_db_copy_table *source_ct, Field *field, ulong *row_pos, ulong *length, const char *joint_str, const int joint_length ) { int error_num; 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, field->field_name, dbton_id))) DBUG_RETURN(error_num); if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN + joint_length + *length + SPIDER_SQL_AND_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); sql.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN); sql.q_append(joint_str, joint_length); sql.q_append(source_str->ptr() + *row_pos, *length); sql.q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN); DBUG_RETURN(0); } int spider_mbase_copy_table::copy_row( Field *field, SPIDER_DB_ROW *row ) { int error_num; DBUG_ENTER("spider_mbase_copy_table::copy_row"); DBUG_PRINT("info",("spider this=%p", this)); if (row->is_null()) { if (sql.reserve(SPIDER_SQL_NULL_LEN + SPIDER_SQL_COMMA_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); sql.q_append(SPIDER_SQL_NULL_STR, SPIDER_SQL_NULL_LEN); } else if (field->str_needs_quotes()) { if (sql.reserve(SPIDER_SQL_VALUE_QUOTE_LEN)) 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, 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); sql.q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN); } else { if ((error_num = row->append_to_str(&sql))) DBUG_RETURN(error_num); if (sql.reserve(SPIDER_SQL_COMMA_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); } sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); DBUG_RETURN(0); } int spider_mbase_copy_table::copy_rows( TABLE *table, SPIDER_DB_ROW *row, ulong **last_row_pos, ulong **last_lengths ) { int error_num; Field **field; ulong *lengths2, *row_pos2; DBUG_ENTER("spider_mbase_copy_table::copy_rows"); DBUG_PRINT("info",("spider this=%p", this)); row_pos2 = *last_row_pos; lengths2 = *last_lengths; for ( field = table->field; *field; field++, lengths2++ ) { *row_pos2 = sql.length(); if ((error_num = copy_row(*field, row))) DBUG_RETURN(error_num); *lengths2 = sql.length() - *row_pos2 - SPIDER_SQL_COMMA_LEN; row->next(); row_pos2++; } sql.length(sql.length() - SPIDER_SQL_COMMA_LEN); if (sql.reserve(SPIDER_SQL_CLOSE_PAREN_LEN + SPIDER_SQL_COMMA_LEN + SPIDER_SQL_OPEN_PAREN_LEN)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } sql.q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN); sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); sql.q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN); DBUG_RETURN(0); } int spider_mbase_copy_table::copy_rows( TABLE *table, SPIDER_DB_ROW *row ) { int error_num; Field **field; DBUG_ENTER("spider_mbase_copy_table::copy_rows"); DBUG_PRINT("info",("spider this=%p", this)); for ( field = table->field; *field; field++ ) { if ((error_num = copy_row(*field, row))) DBUG_RETURN(error_num); row->next(); } sql.length(sql.length() - SPIDER_SQL_COMMA_LEN); if (sql.reserve(SPIDER_SQL_CLOSE_PAREN_LEN + SPIDER_SQL_COMMA_LEN + SPIDER_SQL_OPEN_PAREN_LEN)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } sql.q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN); sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); sql.q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN); DBUG_RETURN(0); } int spider_mbase_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_mbase_copy_table::copy_insert_values( spider_db_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_mbase_copy_table::copy_insert_values"); DBUG_PRINT("info",("spider this=%p", this)); if (sql.reserve(values_length)) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } sql.q_append(values_ptr, values_length); DBUG_RETURN(0); }