1 /* Copyright (C) 2012-2018 Kentoku Shiba
2 
3   This program is free software; you can redistribute it and/or modify
4   it under the terms of the GNU General Public License as published by
5   the Free Software Foundation; version 2 of the License.
6 
7   This program is distributed in the hope that it will be useful,
8   but WITHOUT ANY WARRANTY; without even the implied warranty of
9   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10   GNU General Public License for more details.
11 
12   You should have received a copy of the GNU General Public License
13   along with this program; if not, write to the Free Software
14   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */
15 
16 #define MYSQL_SERVER 1
17 #include <my_global.h>
18 #include "mysql_version.h"
19 #include "spd_environ.h"
20 #if MYSQL_VERSION_ID < 50500
21 #include "mysql_priv.h"
22 #include <mysql/plugin.h>
23 #else
24 #include "sql_priv.h"
25 #include "probes_mysql.h"
26 #include "sql_class.h"
27 #include "sql_partition.h"
28 #include "sql_analyse.h"
29 #include "sql_base.h"
30 #include "tztime.h"
31 #ifdef HANDLER_HAS_DIRECT_AGGREGATE
32 #include "sql_select.h"
33 #endif
34 #endif
35 #include "sql_common.h"
36 #include <mysql.h>
37 #include <errmsg.h>
38 #include "spd_err.h"
39 #include "spd_param.h"
40 #include "spd_db_include.h"
41 #include "spd_include.h"
42 #include "spd_db_mysql.h"
43 #include "ha_spider.h"
44 #include "spd_conn.h"
45 #include "spd_db_conn.h"
46 #include "spd_malloc.h"
47 #include "spd_sys_table.h"
48 #include "spd_table.h"
49 
50 extern struct charset_info_st *spd_charset_utf8_bin;
51 extern bool volatile *spd_abort_loop;
52 
53 extern handlerton *spider_hton_ptr;
54 extern pthread_mutex_t spider_open_conn_mutex;
55 extern HASH spider_open_connections;
56 extern HASH spider_ipport_conns;
57 extern SPIDER_DBTON spider_dbton[SPIDER_DBTON_SIZE];
58 extern const char spider_dig_upper[];
59 extern const char **spd_mysqld_unix_port;
60 extern uint *spd_mysqld_port;
61 
62 spider_db_mysql_util spider_db_mysql_utility;
63 spider_db_mariadb_util spider_db_mariadb_utility;
64 
65 #define SPIDER_SQL_NAME_QUOTE_STR "`"
66 #define SPIDER_SQL_NAME_QUOTE_LEN (sizeof(SPIDER_SQL_NAME_QUOTE_STR) - 1)
67 static const char *name_quote_str = SPIDER_SQL_NAME_QUOTE_STR;
68 
69 #define SPIDER_SQL_ISO_READ_UNCOMMITTED_STR "set session transaction isolation level read uncommitted"
70 #define SPIDER_SQL_ISO_READ_UNCOMMITTED_LEN sizeof(SPIDER_SQL_ISO_READ_UNCOMMITTED_STR) - 1
71 #define SPIDER_SQL_ISO_READ_COMMITTED_STR "set session transaction isolation level read committed"
72 #define SPIDER_SQL_ISO_READ_COMMITTED_LEN sizeof(SPIDER_SQL_ISO_READ_COMMITTED_STR) - 1
73 #define SPIDER_SQL_ISO_REPEATABLE_READ_STR "set session transaction isolation level repeatable read"
74 #define SPIDER_SQL_ISO_REPEATABLE_READ_LEN sizeof(SPIDER_SQL_ISO_REPEATABLE_READ_STR) - 1
75 #define SPIDER_SQL_ISO_SERIALIZABLE_STR "set session transaction isolation level serializable"
76 #define SPIDER_SQL_ISO_SERIALIZABLE_LEN sizeof(SPIDER_SQL_ISO_SERIALIZABLE_STR) - 1
77 
78 #define SPIDER_SQL_START_CONSISTENT_SNAPSHOT_STR "start transaction with consistent snapshot"
79 #define SPIDER_SQL_START_CONSISTENT_SNAPSHOT_LEN sizeof(SPIDER_SQL_START_CONSISTENT_SNAPSHOT_STR) - 1
80 #define SPIDER_SQL_START_TRANSACTION_STR "start transaction"
81 #define SPIDER_SQL_START_TRANSACTION_LEN sizeof(SPIDER_SQL_START_TRANSACTION_STR) - 1
82 
83 #define SPIDER_SQL_AUTOCOMMIT_OFF_STR "set session autocommit = 0"
84 #define SPIDER_SQL_AUTOCOMMIT_OFF_LEN sizeof(SPIDER_SQL_AUTOCOMMIT_OFF_STR) - 1
85 #define SPIDER_SQL_AUTOCOMMIT_ON_STR "set session autocommit = 1"
86 #define SPIDER_SQL_AUTOCOMMIT_ON_LEN sizeof(SPIDER_SQL_AUTOCOMMIT_ON_STR) - 1
87 
88 #define SPIDER_SQL_SQL_LOG_OFF_STR "set session sql_log_off = 0"
89 #define SPIDER_SQL_SQL_LOG_OFF_LEN sizeof(SPIDER_SQL_SQL_LOG_OFF_STR) - 1
90 #define SPIDER_SQL_SQL_LOG_ON_STR "set session sql_log_off = 1"
91 #define SPIDER_SQL_SQL_LOG_ON_LEN sizeof(SPIDER_SQL_SQL_LOG_ON_STR) - 1
92 
93 #define SPIDER_SQL_WAIT_TIMEOUT_STR "set session wait_timeout = "
94 #define SPIDER_SQL_WAIT_TIMEOUT_LEN sizeof(SPIDER_SQL_WAIT_TIMEOUT_STR) - 1
95 
96 #define SPIDER_SQL_SQL_MODE_STR "set session sql_mode = '"
97 #define SPIDER_SQL_SQL_MODE_LEN sizeof(SPIDER_SQL_SQL_MODE_STR) - 1
98 
99 #define SPIDER_SQL_TIME_ZONE_STR "set session time_zone = '"
100 #define SPIDER_SQL_TIME_ZONE_LEN sizeof(SPIDER_SQL_TIME_ZONE_STR) - 1
101 
102 #define SPIDER_SQL_COMMIT_STR "commit"
103 #define SPIDER_SQL_COMMIT_LEN sizeof(SPIDER_SQL_COMMIT_STR) - 1
104 #define SPIDER_SQL_ROLLBACK_STR "rollback"
105 #define SPIDER_SQL_ROLLBACK_LEN sizeof(SPIDER_SQL_ROLLBACK_STR) - 1
106 
107 #define SPIDER_SQL_XA_START_STR "xa start "
108 #define SPIDER_SQL_XA_START_LEN sizeof(SPIDER_SQL_XA_START_STR) - 1
109 #define SPIDER_SQL_XA_END_STR "xa end "
110 #define SPIDER_SQL_XA_END_LEN sizeof(SPIDER_SQL_XA_END_STR) - 1
111 #define SPIDER_SQL_XA_PREPARE_STR "xa prepare "
112 #define SPIDER_SQL_XA_PREPARE_LEN sizeof(SPIDER_SQL_XA_PREPARE_STR) - 1
113 #define SPIDER_SQL_XA_COMMIT_STR "xa commit "
114 #define SPIDER_SQL_XA_COMMIT_LEN sizeof(SPIDER_SQL_XA_COMMIT_STR) - 1
115 #define SPIDER_SQL_XA_ROLLBACK_STR "xa rollback "
116 #define SPIDER_SQL_XA_ROLLBACK_LEN sizeof(SPIDER_SQL_XA_ROLLBACK_STR) - 1
117 
118 #define SPIDER_SQL_LOCK_TABLE_STR "lock tables "
119 #define SPIDER_SQL_LOCK_TABLE_LEN (sizeof(SPIDER_SQL_LOCK_TABLE_STR) - 1)
120 #define SPIDER_SQL_UNLOCK_TABLE_STR "unlock tables"
121 #define SPIDER_SQL_UNLOCK_TABLE_LEN (sizeof(SPIDER_SQL_UNLOCK_TABLE_STR) - 1)
122 
123 #define SPIDER_SQL_LEFT_JOIN_STR " left join "
124 #define SPIDER_SQL_LEFT_JOIN_LEN (sizeof(SPIDER_SQL_LEFT_JOIN_STR) - 1)
125 #define SPIDER_SQL_RIGHT_JOIN_STR " right join "
126 #define SPIDER_SQL_RIGHT_JOIN_LEN (sizeof(SPIDER_SQL_RIGHT_JOIN_STR) - 1)
127 #define SPIDER_SQL_JOIN_STR " join "
128 #define SPIDER_SQL_JOIN_LEN (sizeof(SPIDER_SQL_JOIN_STR) - 1)
129 #define SPIDER_SQL_ON_STR " on "
130 #define SPIDER_SQL_ON_LEN (sizeof(SPIDER_SQL_ON_STR) - 1)
131 
132 #define SPIDER_SQL_SHOW_TABLE_STATUS_STR "show table status from "
133 #define SPIDER_SQL_SHOW_TABLE_STATUS_LEN sizeof(SPIDER_SQL_SHOW_TABLE_STATUS_STR) - 1
134 #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` = "
135 #define SPIDER_SQL_SELECT_TABLES_STATUS_LEN sizeof(SPIDER_SQL_SELECT_TABLES_STATUS_STR) - 1
136 #define SPIDER_SQL_SHOW_WARNINGS_STR "show warnings"
137 #define SPIDER_SQL_SHOW_WARNINGS_LEN sizeof(SPIDER_SQL_SHOW_WARNINGS_STR) - 1
138 
139 #define SPIDER_SQL_SHOW_MASTER_STATUS_STR "show master status"
140 #define SPIDER_SQL_SHOW_MASTER_STATUS_LEN sizeof(SPIDER_SQL_SHOW_MASTER_STATUS_STR) - 1
141 #define SPIDER_SQL_BINLOG_GTID_POS_STR "select binlog_gtid_pos"
142 #define SPIDER_SQL_BINLOG_GTID_POS_LEN sizeof(SPIDER_SQL_BINLOG_GTID_POS_STR) - 1
143 
144 #ifdef SPIDER_HAS_DISCOVER_TABLE_STRUCTURE
145 #define SPIDER_SQL_SHOW_COLUMNS_STR "show columns from "
146 #define SPIDER_SQL_SHOW_COLUMNS_LEN sizeof(SPIDER_SQL_SHOW_COLUMNS_STR) - 1
147 #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` = "
148 #define SPIDER_SQL_SELECT_COLUMNS_LEN sizeof(SPIDER_SQL_SELECT_COLUMNS_STR) - 1
149 
150 #define SPIDER_SQL_AUTO_INCREMENT_STR " auto_increment"
151 #define SPIDER_SQL_AUTO_INCREMENT_LEN sizeof(SPIDER_SQL_AUTO_INCREMENT_STR) - 1
152 #define SPIDER_SQL_ORDINAL_POSITION_STR "ordinal_position"
153 #define SPIDER_SQL_ORDINAL_POSITION_LEN sizeof(SPIDER_SQL_ORDINAL_POSITION_STR) - 1
154 #define SPIDER_SQL_FULLTEXT_STR "fulltext"
155 #define SPIDER_SQL_FULLTEXT_LEN sizeof(SPIDER_SQL_FULLTEXT_STR) - 1
156 #define SPIDER_SQL_SPATIAL_STR "spatial"
157 #define SPIDER_SQL_SPATIAL_LEN sizeof(SPIDER_SQL_SPATIAL_STR) - 1
158 #define SPIDER_SQL_USING_HASH_STR " using hash"
159 #define SPIDER_SQL_USING_HASH_LEN sizeof(SPIDER_SQL_USING_HASH_STR) - 1
160 #endif
161 
162 #define SPIDER_SQL_SHOW_RECORDS_RECORDS_POS 0
163 #define SPIDER_SQL_EXPLAIN_SELECT_RECORDS_POS 8
164 
165 #ifdef HA_HAS_CHECKSUM_EXTENDED
166 #define SPIDER_SQL_CHECKSUM_CHECKSUM_POS 1
167 #define SPIDER_SQL_CHECKSUM_TABLE_STR "checksum table "
168 #define SPIDER_SQL_CHECKSUM_TABLE_LEN (sizeof(SPIDER_SQL_CHECKSUM_TABLE_STR) - 1)
169 #endif
170 
171 #define SPIDER_SQL_LIKE_STR " like "
172 #define SPIDER_SQL_LIKE_LEN (sizeof(SPIDER_SQL_LIKE_STR) - 1)
173 #define SPIDER_SQL_LIMIT1_STR " limit 1"
174 #define SPIDER_SQL_LIMIT1_LEN (sizeof(SPIDER_SQL_LIMIT1_STR) - 1)
175 #define SPIDER_SQL_COLLATE_STR " collate "
176 #define SPIDER_SQL_COLLATE_LEN (sizeof(SPIDER_SQL_COLLATE_STR) - 1)
177 
178 #define SPIDER_SQL_INTERVAL_STR " + interval "
179 #define SPIDER_SQL_INTERVAL_LEN (sizeof(SPIDER_SQL_INTERVAL_STR) - 1)
180 #define SPIDER_SQL_NEGINTERVAL_STR " - interval "
181 #define SPIDER_SQL_NEGINTERVAL_LEN (sizeof(SPIDER_SQL_NEGINTERVAL_STR) - 1)
182 
183 static uchar SPIDER_SQL_LINESTRING_HEAD_STR[] =
184   {0x00,0x00,0x00,0x00,0x01,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00};
185 #define SPIDER_SQL_LINESTRING_HEAD_LEN sizeof(SPIDER_SQL_LINESTRING_HEAD_STR)
186 
187 #define SPIDER_SQL_DIRECT_INSERT_KIND_INSERT     0
188 #define SPIDER_SQL_DIRECT_INSERT_KIND_REPLACE    1
189 #define SPIDER_SQL_DIRECT_INSERT_KIND_IGNORE     2
190 #define SPIDER_SQL_DIRECT_INSERT_KIND_DUP_UPDATE 3
191 
192 static const char *spider_db_table_lock_str[] =
193 {
194   " read local,",
195   " read,",
196   " low_priority write,",
197   " write,"
198 };
199 static const int spider_db_table_lock_len[] =
200 {
201   sizeof(" read local,") - 1,
202   sizeof(" read,") - 1,
203   sizeof(" low_priority write,") - 1,
204   sizeof(" write,") - 1
205 };
206 static const char *spider_db_timefunc_interval_str[] =
207 {
208   " year", " quarter", " month", " week", " day",
209   " hour", " minute", " second", " microsecond",
210   " year_month", " day_hour", " day_minute",
211   " day_second", " hour_minute", " hour_second",
212   " minute_second", " day_microsecond", " hour_microsecond",
213   " minute_microsecond", " second_microsecond"
214 };
215 
216 /* UTC time zone for timestamp columns */
217 extern Time_zone *UTC;
218 
spider_mysql_init()219 int spider_mysql_init()
220 {
221   DBUG_ENTER("spider_mysql_init");
222   DBUG_RETURN(0);
223 }
224 
spider_mariadb_init()225 int spider_mariadb_init()
226 {
227   DBUG_ENTER("spider_mariadb_init");
228   DBUG_RETURN(0);
229 }
230 
spider_mysql_deinit()231 int spider_mysql_deinit()
232 {
233   DBUG_ENTER("spider_mysql_deinit");
234   DBUG_RETURN(0);
235 }
236 
spider_mariadb_deinit()237 int spider_mariadb_deinit()
238 {
239   DBUG_ENTER("spider_mariadb_deinit");
240   DBUG_RETURN(0);
241 }
242 
spider_mysql_create_share(SPIDER_SHARE * share)243 spider_db_share *spider_mysql_create_share(
244   SPIDER_SHARE *share
245 ) {
246   DBUG_ENTER("spider_mysql_create_share");
247   DBUG_RETURN(new spider_mysql_share(share));
248 }
249 
spider_mariadb_create_share(SPIDER_SHARE * share)250 spider_db_share *spider_mariadb_create_share(
251   SPIDER_SHARE *share
252 ) {
253   DBUG_ENTER("spider_mariadb_create_share");
254   DBUG_RETURN(new spider_mariadb_share(share));
255 }
256 
spider_mysql_create_handler(ha_spider * spider,spider_db_share * db_share)257 spider_db_handler *spider_mysql_create_handler(
258   ha_spider *spider,
259   spider_db_share *db_share
260 ) {
261   DBUG_ENTER("spider_mysql_create_handler");
262   DBUG_RETURN(new spider_mysql_handler(spider,
263     (spider_mbase_share *) db_share));
264 }
265 
spider_mariadb_create_handler(ha_spider * spider,spider_db_share * db_share)266 spider_db_handler *spider_mariadb_create_handler(
267   ha_spider *spider,
268   spider_db_share *db_share
269 ) {
270   DBUG_ENTER("spider_mariadb_create_handler");
271   DBUG_RETURN(new spider_mariadb_handler(spider,
272     (spider_mbase_share *) db_share));
273 }
274 
spider_mysql_create_copy_table(spider_db_share * db_share)275 spider_db_copy_table *spider_mysql_create_copy_table(
276   spider_db_share *db_share
277 ) {
278   DBUG_ENTER("spider_mysql_create_copy_table");
279   DBUG_RETURN(new spider_mysql_copy_table(
280     (spider_mbase_share *) db_share));
281 }
282 
spider_mariadb_create_copy_table(spider_db_share * db_share)283 spider_db_copy_table *spider_mariadb_create_copy_table(
284   spider_db_share *db_share
285 ) {
286   DBUG_ENTER("spider_mariadb_create_copy_table");
287   DBUG_RETURN(new spider_mariadb_copy_table(
288     (spider_mbase_share *) db_share));
289 }
290 
spider_mysql_create_conn(SPIDER_CONN * conn)291 SPIDER_DB_CONN *spider_mysql_create_conn(
292   SPIDER_CONN *conn
293 ) {
294   DBUG_ENTER("spider_mysql_create_conn");
295   DBUG_RETURN(new spider_db_mysql(conn));
296 }
297 
spider_mariadb_create_conn(SPIDER_CONN * conn)298 SPIDER_DB_CONN *spider_mariadb_create_conn(
299   SPIDER_CONN *conn
300 ) {
301   DBUG_ENTER("spider_mariadb_create_conn");
302   DBUG_RETURN(new spider_db_mariadb(conn));
303 }
304 
spider_mysql_support_direct_join()305 bool spider_mysql_support_direct_join(
306 ) {
307   DBUG_ENTER("spider_mysql_support_direct_join");
308   DBUG_RETURN(TRUE);
309 }
310 
spider_mariadb_support_direct_join()311 bool spider_mariadb_support_direct_join(
312 ) {
313   DBUG_ENTER("spider_mariadb_support_direct_join");
314   DBUG_RETURN(TRUE);
315 }
316 
317 SPIDER_DBTON spider_dbton_mysql = {
318   0,
319   SPIDER_DB_WRAPPER_MYSQL,
320   SPIDER_DB_ACCESS_TYPE_SQL,
321   spider_mysql_init,
322   spider_mysql_deinit,
323   spider_mysql_create_share,
324   spider_mysql_create_handler,
325   spider_mysql_create_copy_table,
326   spider_mysql_create_conn,
327   spider_mysql_support_direct_join,
328   &spider_db_mysql_utility
329 };
330 
331 SPIDER_DBTON spider_dbton_mariadb = {
332   0,
333   SPIDER_DB_WRAPPER_MARIADB,
334   SPIDER_DB_ACCESS_TYPE_SQL,
335   spider_mariadb_init,
336   spider_mariadb_deinit,
337   spider_mariadb_create_share,
338   spider_mariadb_create_handler,
339   spider_mariadb_create_copy_table,
340   spider_mariadb_create_conn,
341   spider_mariadb_support_direct_join,
342   &spider_db_mariadb_utility
343 };
344 
spider_db_mbase_row(uint dbton_id)345 spider_db_mbase_row::spider_db_mbase_row(
346   uint dbton_id
347 ) : spider_db_row(dbton_id),
348   row(NULL), lengths(NULL), cloned(FALSE)
349 {
350   DBUG_ENTER("spider_db_mbase_row::spider_db_mbase_row");
351   DBUG_PRINT("info",("spider this=%p", this));
352   DBUG_VOID_RETURN;
353 }
354 
spider_db_mysql_row()355 spider_db_mysql_row::spider_db_mysql_row() :
356   spider_db_mbase_row(spider_db_mysql_utility.dbton_id)
357 {
358   DBUG_ENTER("spider_db_mysql_row::spider_db_mysql_row");
359   DBUG_PRINT("info",("spider this=%p", this));
360   DBUG_VOID_RETURN;
361 }
362 
spider_db_mariadb_row()363 spider_db_mariadb_row::spider_db_mariadb_row() :
364   spider_db_mbase_row(spider_db_mariadb_utility.dbton_id)
365 {
366   DBUG_ENTER("spider_db_mariadb_row::spider_db_mariadb_row");
367   DBUG_PRINT("info",("spider this=%p", this));
368   DBUG_VOID_RETURN;
369 }
370 
~spider_db_mbase_row()371 spider_db_mbase_row::~spider_db_mbase_row()
372 {
373   DBUG_ENTER("spider_db_mbase_row::~spider_db_mbase_row");
374   DBUG_PRINT("info",("spider this=%p", this));
375   if (cloned)
376   {
377     spider_free(spider_current_trx, row_first, MYF(0));
378   }
379   DBUG_VOID_RETURN;
380 }
381 
~spider_db_mysql_row()382 spider_db_mysql_row::~spider_db_mysql_row()
383 {
384   DBUG_ENTER("spider_db_mysql_row::~spider_db_mysql_row");
385   DBUG_PRINT("info",("spider this=%p", this));
386   DBUG_VOID_RETURN;
387 }
388 
~spider_db_mariadb_row()389 spider_db_mariadb_row::~spider_db_mariadb_row()
390 {
391   DBUG_ENTER("spider_db_mariadb_row::~spider_db_mariadb_row");
392   DBUG_PRINT("info",("spider this=%p", this));
393   DBUG_VOID_RETURN;
394 }
395 
store_to_field(Field * field,CHARSET_INFO * access_charset)396 int spider_db_mbase_row::store_to_field(
397   Field *field,
398   CHARSET_INFO *access_charset
399 ) {
400   DBUG_ENTER("spider_db_mbase_row::store_to_field");
401   DBUG_PRINT("info",("spider this=%p", this));
402   if (!*row)
403   {
404     DBUG_PRINT("info", ("spider field is null"));
405     field->set_null();
406     field->reset();
407   } else {
408     field->set_notnull();
409     if (field->flags & BLOB_FLAG)
410     {
411       DBUG_PRINT("info", ("spider blob field"));
412       if (
413         field->charset() == &my_charset_bin ||
414         field->charset()->cset == access_charset->cset
415       )
416         ((Field_blob *)field)->set_ptr(*lengths, (uchar *) *row);
417       else {
418         DBUG_PRINT("info", ("spider blob convert"));
419         if (field->table->file->ht == spider_hton_ptr)
420         {
421           ha_spider *spider = (ha_spider *) field->table->file;
422           spider_string *str = &spider->blob_buff[field->field_index];
423           str->length(0);
424           if (str->append(*row, *lengths, access_charset))
425             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
426           ((Field_blob *)field)->set_ptr(str->length(), (uchar *) str->ptr());
427         } else {
428           field->store(*row, *lengths, access_charset);
429         }
430       }
431     } else
432       field->store(*row, *lengths, access_charset);
433   }
434   DBUG_RETURN(0);
435 }
436 
append_to_str(spider_string * str)437 int spider_db_mbase_row::append_to_str(
438   spider_string *str
439 ) {
440   DBUG_ENTER("spider_db_mbase_row::append_to_str");
441   DBUG_PRINT("info",("spider this=%p", this));
442   if (str->reserve(*lengths))
443     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
444   str->q_append(*row, *lengths);
445   DBUG_RETURN(0);
446 }
447 
append_escaped_to_str(spider_string * str,uint dbton_id)448 int spider_db_mbase_row::append_escaped_to_str(
449   spider_string *str,
450   uint dbton_id
451 ) {
452   DBUG_ENTER("spider_db_mbase_row::append_escaped_to_str");
453   DBUG_PRINT("info",("spider this=%p", this));
454   spider_string tmp_str(*row, *lengths + 1, str->charset());
455   tmp_str.init_calc_mem(133);
456   tmp_str.length(*lengths);
457   if (str->reserve(*lengths * 2 + 2))
458     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
459   spider_dbton[dbton_id].db_util->append_escaped_util(str, tmp_str.get_str());
460   DBUG_RETURN(0);
461 }
462 
first()463 void spider_db_mbase_row::first()
464 {
465   DBUG_ENTER("spider_db_mbase_row::first");
466   DBUG_PRINT("info",("spider this=%p", this));
467   row = row_first;
468   lengths = lengths_first;
469   DBUG_VOID_RETURN;
470 }
471 
next()472 void spider_db_mbase_row::next()
473 {
474   DBUG_ENTER("spider_db_mbase_row::next");
475   DBUG_PRINT("info",("spider this=%p", this));
476   row++;
477   lengths++;
478   DBUG_VOID_RETURN;
479 }
480 
is_null()481 bool spider_db_mbase_row::is_null()
482 {
483   DBUG_ENTER("spider_db_mbase_row::is_null");
484   DBUG_PRINT("info",("spider this=%p", this));
485   DBUG_RETURN(!(*row));
486 }
487 
val_int()488 int spider_db_mbase_row::val_int()
489 {
490   DBUG_ENTER("spider_db_mbase_row::val_int");
491   DBUG_PRINT("info",("spider this=%p", this));
492   DBUG_RETURN(*row ? atoi(*row) : 0);
493 }
494 
val_real()495 double spider_db_mbase_row::val_real()
496 {
497   DBUG_ENTER("spider_db_mbase_row::val_real");
498   DBUG_PRINT("info",("spider this=%p", this));
499   DBUG_RETURN(*row ? my_atof(*row) : 0.0);
500 }
501 
val_decimal(my_decimal * decimal_value,CHARSET_INFO * access_charset)502 my_decimal *spider_db_mbase_row::val_decimal(
503   my_decimal *decimal_value,
504   CHARSET_INFO *access_charset
505 ) {
506   DBUG_ENTER("spider_db_mbase_row::val_decimal");
507   DBUG_PRINT("info",("spider this=%p", this));
508   if (!*row)
509     DBUG_RETURN(NULL);
510 
511 #ifdef SPIDER_HAS_DECIMAL_OPERATION_RESULTS_VALUE_TYPE
512   decimal_operation_results(str2my_decimal(0, *row, *lengths, access_charset,
513     decimal_value), "", "");
514 #else
515   decimal_operation_results(str2my_decimal(0, *row, *lengths, access_charset,
516     decimal_value));
517 #endif
518 
519   DBUG_RETURN(decimal_value);
520 }
521 
clone()522 SPIDER_DB_ROW *spider_db_mbase_row::clone()
523 {
524   spider_db_mbase_row *clone_row;
525   char *tmp_char;
526   MYSQL_ROW tmp_row = row_first, ctmp_row;
527   ulong *tmp_lengths = lengths_first;
528   uint row_size, i;
529   DBUG_ENTER("spider_db_mbase_row::clone");
530   DBUG_PRINT("info",("spider this=%p", this));
531   if (!(clone_row = new spider_db_mbase_row(dbton_id)))
532   {
533     DBUG_RETURN(NULL);
534   }
535   if (!record_size)
536   {
537     row_size = field_count;
538     for (i = 0; i < field_count; i++)
539     {
540       row_size += *tmp_lengths;
541       tmp_lengths++;
542     }
543     record_size = row_size - field_count;
544   } else {
545     row_size = record_size + field_count;
546   }
547   if (!spider_bulk_malloc(spider_current_trx, 29, MYF(MY_WME),
548     &clone_row->row, sizeof(char*) * field_count,
549     &tmp_char, row_size,
550     &clone_row->lengths, sizeof(ulong) * field_count,
551     NullS)
552   ) {
553     delete clone_row;
554     DBUG_RETURN(NULL);
555   }
556   memcpy(clone_row->lengths, lengths_first, sizeof(ulong) * field_count);
557   tmp_lengths = lengths_first;
558   ctmp_row = clone_row->row;
559   for (i = 0; i < field_count; i++)
560   {
561     DBUG_PRINT("info",("spider *lengths=%lu", *tmp_lengths));
562     if (*tmp_row == NULL)
563     {
564       *ctmp_row = NULL;
565       *tmp_char = 0;
566       tmp_char++;
567     } else {
568       *ctmp_row = tmp_char;
569       memcpy(tmp_char, *tmp_row, *tmp_lengths + 1);
570       tmp_char += *tmp_lengths + 1;
571     }
572     ctmp_row++;
573     tmp_lengths++;
574     tmp_row++;
575   }
576   clone_row->field_count = field_count;
577   clone_row->record_size = record_size;
578   clone_row->row_first = clone_row->row;
579   clone_row->lengths_first = clone_row->lengths;
580   clone_row->cloned = TRUE;
581   DBUG_RETURN((SPIDER_DB_ROW *) clone_row);
582 }
583 
store_to_tmp_table(TABLE * tmp_table,spider_string * str)584 int spider_db_mbase_row::store_to_tmp_table(
585   TABLE *tmp_table,
586   spider_string *str
587 ) {
588   uint i;
589   MYSQL_ROW tmp_row = row;
590   ulong *tmp_lengths = lengths;
591   DBUG_ENTER("spider_db_mbase_row::store_to_tmp_table");
592   DBUG_PRINT("info",("spider this=%p", this));
593   str->length(0);
594   for (i = 0; i < field_count; i++)
595   {
596     if (*tmp_row)
597     {
598       if (str->reserve(*tmp_lengths + 1))
599       {
600         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
601       }
602       str->q_append(*tmp_row, *tmp_lengths + 1);
603     }
604     tmp_lengths++;
605     tmp_row++;
606   }
607   tmp_table->field[0]->set_notnull();
608   tmp_table->field[0]->store(
609     (const char *) lengths,
610     sizeof(ulong) * field_count, &my_charset_bin);
611   tmp_table->field[1]->set_notnull();
612   tmp_table->field[1]->store(
613     str->ptr(), str->length(), &my_charset_bin);
614   tmp_table->field[2]->set_notnull();
615   tmp_table->field[2]->store(
616     (char *) row, (uint) (sizeof(char *) * field_count), &my_charset_bin);
617   DBUG_RETURN(tmp_table->file->ha_write_row(tmp_table->record[0]));
618 }
619 
get_byte_size()620 uint spider_db_mbase_row::get_byte_size()
621 {
622   ulong *tmp_lengths = lengths_first;
623   uint i;
624   DBUG_ENTER("spider_db_mbase_row::get_byte_size");
625   DBUG_PRINT("info",("spider this=%p", this));
626   if (!record_size)
627   {
628     for (i = 0; i < field_count; i++)
629     {
630       record_size += *tmp_lengths;
631       tmp_lengths++;
632     }
633   }
634   DBUG_RETURN(record_size);
635 }
636 
spider_db_mbase_result(SPIDER_DB_CONN * in_db_conn)637 spider_db_mbase_result::spider_db_mbase_result(
638   SPIDER_DB_CONN *in_db_conn
639 ) : spider_db_result(in_db_conn),
640   db_result(NULL), row(in_db_conn->dbton_id)
641 {
642   DBUG_ENTER("spider_db_mbase_result::spider_db_mbase_result");
643   DBUG_PRINT("info",("spider this=%p", this));
644   DBUG_VOID_RETURN;
645 }
646 
spider_db_mysql_result(SPIDER_DB_CONN * in_db_conn)647 spider_db_mysql_result::spider_db_mysql_result(
648   SPIDER_DB_CONN *in_db_conn
649 ) : spider_db_mbase_result(in_db_conn)
650 {
651   DBUG_ENTER("spider_db_mysql_result::spider_db_mysql_result");
652   DBUG_PRINT("info",("spider this=%p", this));
653   DBUG_VOID_RETURN;
654 }
655 
spider_db_mariadb_result(SPIDER_DB_CONN * in_db_conn)656 spider_db_mariadb_result::spider_db_mariadb_result(
657   SPIDER_DB_CONN *in_db_conn
658 ) : spider_db_mbase_result(in_db_conn)
659 {
660   DBUG_ENTER("spider_db_mariadb_result::spider_db_mariadb_result");
661   DBUG_PRINT("info",("spider this=%p", this));
662   DBUG_VOID_RETURN;
663 }
664 
~spider_db_mbase_result()665 spider_db_mbase_result::~spider_db_mbase_result()
666 {
667   DBUG_ENTER("spider_db_mbase_result::~spider_db_mbase_result");
668   DBUG_PRINT("info",("spider this=%p", this));
669   if (db_result)
670   {
671     free_result();
672   }
673   DBUG_VOID_RETURN;
674 }
675 
~spider_db_mysql_result()676 spider_db_mysql_result::~spider_db_mysql_result()
677 {
678   DBUG_ENTER("spider_db_mysql_result::~spider_db_mysql_result");
679   DBUG_PRINT("info",("spider this=%p", this));
680   DBUG_VOID_RETURN;
681 }
682 
~spider_db_mariadb_result()683 spider_db_mariadb_result::~spider_db_mariadb_result()
684 {
685   DBUG_ENTER("spider_db_mariadb_result::~spider_db_mariadb_result");
686   DBUG_PRINT("info",("spider this=%p", this));
687   DBUG_VOID_RETURN;
688 }
689 
has_result()690 bool spider_db_mbase_result::has_result()
691 {
692   DBUG_ENTER("spider_db_mbase_result::has_result");
693   DBUG_PRINT("info",("spider this=%p", this));
694   DBUG_RETURN(db_result);
695 }
696 
free_result()697 void spider_db_mbase_result::free_result()
698 {
699   DBUG_ENTER("spider_db_mbase_result::free_result");
700   DBUG_PRINT("info",("spider this=%p", this));
701   /* need 2 times execution design */
702   if (db_result)
703   {
704     mysql_free_result(db_result);
705     db_result = NULL;
706   }
707   DBUG_VOID_RETURN;
708 }
709 
current_row()710 SPIDER_DB_ROW *spider_db_mbase_result::current_row()
711 {
712   DBUG_ENTER("spider_db_mbase_result::current_row");
713   DBUG_PRINT("info",("spider this=%p", this));
714   DBUG_RETURN((SPIDER_DB_ROW *) row.clone());
715 }
716 
fetch_row()717 SPIDER_DB_ROW *spider_db_mbase_result::fetch_row()
718 {
719   DBUG_ENTER("spider_db_mbase_result::fetch_row");
720   DBUG_PRINT("info",("spider this=%p", this));
721   if (!(row.row = mysql_fetch_row(db_result)))
722   {
723     if (mysql_errno(((spider_db_mbase *) db_conn)->db_conn))
724     {
725       store_error_num = mysql_errno(((spider_db_mbase *) db_conn)->db_conn);
726       my_message(store_error_num,
727         mysql_error(((spider_db_mbase *) db_conn)->db_conn), MYF(0));
728     } else
729       store_error_num = HA_ERR_END_OF_FILE;
730     DBUG_RETURN(NULL);
731   }
732   row.lengths = mysql_fetch_lengths(db_result);
733   row.field_count = mysql_num_fields(db_result);
734   row.row_first = row.row;
735   row.lengths_first = row.lengths;
736   row.record_size = 0;
737   DBUG_RETURN((SPIDER_DB_ROW *) &row);
738 }
739 
fetch_row_from_result_buffer(spider_db_result_buffer * spider_res_buf)740 SPIDER_DB_ROW *spider_db_mbase_result::fetch_row_from_result_buffer(
741   spider_db_result_buffer *spider_res_buf
742 ) {
743   DBUG_ENTER("spider_db_mbase_result::fetch_row_from_result_buffer");
744   DBUG_PRINT("info",("spider this=%p", this));
745   if (!(row.row = mysql_fetch_row(db_result)))
746   {
747     if (mysql_errno(((spider_db_mbase *) db_conn)->db_conn))
748     {
749       store_error_num = mysql_errno(((spider_db_mbase *) db_conn)->db_conn);
750       my_message(store_error_num,
751         mysql_error(((spider_db_mbase *) db_conn)->db_conn), MYF(0));
752     } else
753       store_error_num = HA_ERR_END_OF_FILE;
754     DBUG_RETURN(NULL);
755   }
756   row.lengths = mysql_fetch_lengths(db_result);
757   row.field_count = mysql_num_fields(db_result);
758   row.row_first = row.row;
759   row.lengths_first = row.lengths;
760   row.record_size = 0;
761   DBUG_RETURN((SPIDER_DB_ROW *) &row);
762 }
763 
fetch_row_from_tmp_table(TABLE * tmp_table)764 SPIDER_DB_ROW *spider_db_mbase_result::fetch_row_from_tmp_table(
765   TABLE *tmp_table
766 ) {
767   uint i;
768   spider_string tmp_str1, tmp_str2, tmp_str3;
769   const char *row_ptr;
770   MYSQL_ROW tmp_row;
771   ulong *tmp_lengths;
772   uint field_count;
773   DBUG_ENTER("spider_db_mbase_result::fetch_row_from_tmp_table");
774   DBUG_PRINT("info",("spider this=%p", this));
775   tmp_str1.init_calc_mem(117);
776   tmp_str2.init_calc_mem(118);
777   tmp_str3.init_calc_mem(170);
778   tmp_table->field[0]->val_str(tmp_str1.get_str());
779   tmp_table->field[1]->val_str(tmp_str2.get_str());
780   tmp_table->field[2]->val_str(tmp_str3.get_str());
781   tmp_str1.mem_calc();
782   tmp_str2.mem_calc();
783   tmp_str3.mem_calc();
784   row_ptr = tmp_str2.ptr();
785   tmp_lengths = (ulong *) tmp_str1.ptr();
786   tmp_row = (MYSQL_ROW) tmp_str3.ptr();
787   field_count = tmp_str1.length() / sizeof(ulong);
788   row.row = tmp_row;
789   row.lengths = tmp_lengths;
790   row.field_count = field_count;
791   row.row_first = row.row;
792   row.lengths_first = row.lengths;
793   row.record_size = tmp_str2.length();
794   for (i = 0; i < field_count; i++)
795   {
796     if (*tmp_row)
797     {
798       *tmp_row = (char *) row_ptr;
799       row_ptr += *tmp_lengths + 1;
800     }
801     tmp_row++;
802     tmp_lengths++;
803   }
804   DBUG_RETURN((SPIDER_DB_ROW *) &row);
805 }
806 
fetch_table_status(int mode,ha_statistics & stat)807 int spider_db_mbase_result::fetch_table_status(
808   int mode,
809   ha_statistics &stat
810 ) {
811   int error_num;
812   MYSQL_ROW mysql_row;
813   MYSQL_TIME mysql_time;
814 #ifdef MARIADB_BASE_VERSION
815   uint not_used_uint;
816 #else
817   my_bool not_used_my_bool;
818 #endif
819 #ifdef SPIDER_HAS_TIME_STATUS
820   MYSQL_TIME_STATUS time_status;
821 #else
822   int time_status;
823 #endif
824   long not_used_long;
825   DBUG_ENTER("spider_db_mbase_result::fetch_table_status");
826   DBUG_PRINT("info",("spider this=%p", this));
827   if (!(mysql_row = mysql_fetch_row(db_result)))
828   {
829     DBUG_PRINT("info",("spider fetch row is null"));
830     if ((error_num = mysql_errno(((spider_db_mbase *) db_conn)->db_conn)))
831     {
832       my_message(error_num,
833         mysql_error(((spider_db_mbase *) db_conn)->db_conn), MYF(0));
834       DBUG_RETURN(error_num);
835     }
836     DBUG_RETURN(ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM);
837   }
838   if (mode == 1)
839   {
840     /* Ok to test for 18 fields as all new fields are added last */
841     if (num_fields() < 18)
842     {
843       DBUG_PRINT("info",("spider field_count < 18"));
844       DBUG_RETURN(ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM);
845     }
846 
847     if (mysql_row[4])
848       stat.records =
849         (ha_rows) my_strtoll10(mysql_row[4], (char**) NULL, &error_num);
850     else
851       stat.records = (ha_rows) 0;
852     DBUG_PRINT("info",
853       ("spider records=%lld", stat.records));
854     if (mysql_row[5])
855       stat.mean_rec_length =
856         (ulong) my_strtoll10(mysql_row[5], (char**) NULL, &error_num);
857     else
858       stat.mean_rec_length = 0;
859     DBUG_PRINT("info",
860       ("spider mean_rec_length=%lu", stat.mean_rec_length));
861     if (mysql_row[6])
862       stat.data_file_length =
863         (ulonglong) my_strtoll10(mysql_row[6], (char**) NULL, &error_num);
864     else
865       stat.data_file_length = 0;
866     DBUG_PRINT("info",
867       ("spider data_file_length=%lld", stat.data_file_length));
868     if (mysql_row[7])
869       stat.max_data_file_length =
870         (ulonglong) my_strtoll10(mysql_row[7], (char**) NULL, &error_num);
871     else
872       stat.max_data_file_length = 0;
873     DBUG_PRINT("info",
874       ("spider max_data_file_length=%lld", stat.max_data_file_length));
875     if (mysql_row[8])
876       stat.index_file_length =
877         (ulonglong) my_strtoll10(mysql_row[8], (char**) NULL, &error_num);
878     else
879       stat.index_file_length = 0;
880     DBUG_PRINT("info",
881       ("spider index_file_length=%lld", stat.index_file_length));
882     if (mysql_row[10])
883       stat.auto_increment_value =
884         (ulonglong) my_strtoll10(mysql_row[10], (char**) NULL, &error_num);
885     else
886       stat.auto_increment_value = 1;
887     DBUG_PRINT("info",
888       ("spider auto_increment_value=%lld", stat.auto_increment_value));
889     if (mysql_row[11])
890     {
891 #ifdef SPIDER_HAS_TIME_STATUS
892       my_time_status_init(&time_status);
893 #endif
894       SPIDER_str_to_datetime(mysql_row[11], strlen(mysql_row[11]),
895         &mysql_time, 0, &time_status);
896 #ifdef MARIADB_BASE_VERSION
897       stat.create_time = (time_t) my_system_gmt_sec(&mysql_time,
898         &not_used_long, &not_used_uint);
899 #else
900       stat.create_time = (time_t) my_system_gmt_sec(&mysql_time,
901         &not_used_long, &not_used_my_bool);
902 #endif
903     } else
904       stat.create_time = (time_t) 0;
905 #ifndef DBUG_OFF
906     {
907       struct tm *ts, tmp_ts;
908       char buf[80];
909       ts = localtime_r(&stat.create_time, &tmp_ts);
910       strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", ts);
911       DBUG_PRINT("info",("spider create_time=%s", buf));
912     }
913 #endif
914     if (mysql_row[12])
915     {
916 #ifdef SPIDER_HAS_TIME_STATUS
917       my_time_status_init(&time_status);
918 #endif
919       SPIDER_str_to_datetime(mysql_row[12], strlen(mysql_row[12]),
920         &mysql_time, 0, &time_status);
921 #ifdef MARIADB_BASE_VERSION
922       stat.update_time = (time_t) my_system_gmt_sec(&mysql_time,
923         &not_used_long, &not_used_uint);
924 #else
925       stat.update_time = (time_t) my_system_gmt_sec(&mysql_time,
926         &not_used_long, &not_used_my_bool);
927 #endif
928     } else
929       stat.update_time = (time_t) 0;
930 #ifndef DBUG_OFF
931     {
932       struct tm *ts, tmp_ts;
933       char buf[80];
934       ts = localtime_r(&stat.update_time, &tmp_ts);
935       strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", ts);
936       DBUG_PRINT("info",("spider update_time=%s", buf));
937     }
938 #endif
939     if (mysql_row[13])
940     {
941 #ifdef SPIDER_HAS_TIME_STATUS
942       my_time_status_init(&time_status);
943 #endif
944       SPIDER_str_to_datetime(mysql_row[13], strlen(mysql_row[13]),
945         &mysql_time, 0, &time_status);
946 #ifdef MARIADB_BASE_VERSION
947       stat.check_time = (time_t) my_system_gmt_sec(&mysql_time,
948         &not_used_long, &not_used_uint);
949 #else
950       stat.check_time = (time_t) my_system_gmt_sec(&mysql_time,
951         &not_used_long, &not_used_my_bool);
952 #endif
953     } else
954       stat.check_time = (time_t) 0;
955 #ifndef DBUG_OFF
956     {
957       struct tm *ts, tmp_ts;
958       char buf[80];
959       ts = localtime_r(&stat.check_time, &tmp_ts);
960       strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", ts);
961       DBUG_PRINT("info",("spider check_time=%s", buf));
962     }
963 #endif
964     if (mysql_row[15])
965     {
966       stat.checksum_null = FALSE;
967       stat.checksum =
968         (ha_checksum) my_strtoll10(mysql_row[15], (char**) NULL, &error_num);
969       DBUG_PRINT("info", ("spider checksum=%lu", (ulong) stat.checksum));
970     } else {
971       stat.checksum_null = TRUE;
972       stat.checksum = (ha_checksum) 0;
973       DBUG_PRINT("info", ("spider checksum is null"));
974     }
975   } else {
976     if (mysql_row[0])
977       stat.records =
978         (ha_rows) my_strtoll10(mysql_row[0], (char**) NULL, &error_num);
979     else
980       stat.records = (ha_rows) 0;
981     DBUG_PRINT("info",
982       ("spider records=%lld", stat.records));
983     if (mysql_row[1])
984       stat.mean_rec_length =
985         (ulong) my_strtoll10(mysql_row[1], (char**) NULL, &error_num);
986     else
987       stat.mean_rec_length = 0;
988     DBUG_PRINT("info",
989       ("spider mean_rec_length=%lu", stat.mean_rec_length));
990     if (mysql_row[2])
991       stat.data_file_length =
992         (ulonglong) my_strtoll10(mysql_row[2], (char**) NULL, &error_num);
993     else
994       stat.data_file_length = 0;
995     DBUG_PRINT("info",
996       ("spider data_file_length=%lld", stat.data_file_length));
997     if (mysql_row[3])
998       stat.max_data_file_length =
999         (ulonglong) my_strtoll10(mysql_row[3], (char**) NULL, &error_num);
1000     else
1001       stat.max_data_file_length = 0;
1002     DBUG_PRINT("info",
1003       ("spider max_data_file_length=%lld", stat.max_data_file_length));
1004     if (mysql_row[4])
1005       stat.index_file_length =
1006         (ulonglong) my_strtoll10(mysql_row[4], (char**) NULL, &error_num);
1007     else
1008       stat.index_file_length = 0;
1009     DBUG_PRINT("info",
1010       ("spider index_file_length=%lld", stat.index_file_length));
1011     if (mysql_row[5])
1012       stat.auto_increment_value =
1013         (ulonglong) my_strtoll10(mysql_row[5], (char**) NULL, &error_num);
1014     else
1015       stat.auto_increment_value = 1;
1016     DBUG_PRINT("info",
1017       ("spider auto_increment_value=%lld", stat.auto_increment_value));
1018     if (mysql_row[6])
1019     {
1020 #ifdef SPIDER_HAS_TIME_STATUS
1021       my_time_status_init(&time_status);
1022 #endif
1023       SPIDER_str_to_datetime(mysql_row[6], strlen(mysql_row[6]),
1024         &mysql_time, 0, &time_status);
1025 #ifdef MARIADB_BASE_VERSION
1026       stat.create_time = (time_t) my_system_gmt_sec(&mysql_time,
1027         &not_used_long, &not_used_uint);
1028 #else
1029       stat.create_time = (time_t) my_system_gmt_sec(&mysql_time,
1030         &not_used_long, &not_used_my_bool);
1031 #endif
1032     } else
1033       stat.create_time = (time_t) 0;
1034 #ifndef DBUG_OFF
1035     {
1036       struct tm *ts, tmp_ts;
1037       char buf[80];
1038       ts = localtime_r(&stat.create_time, &tmp_ts);
1039       strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", ts);
1040       DBUG_PRINT("info",("spider create_time=%s", buf));
1041     }
1042 #endif
1043     if (mysql_row[7])
1044     {
1045 #ifdef SPIDER_HAS_TIME_STATUS
1046       my_time_status_init(&time_status);
1047 #endif
1048       SPIDER_str_to_datetime(mysql_row[7], strlen(mysql_row[7]),
1049         &mysql_time, 0, &time_status);
1050 #ifdef MARIADB_BASE_VERSION
1051       stat.update_time = (time_t) my_system_gmt_sec(&mysql_time,
1052         &not_used_long, &not_used_uint);
1053 #else
1054       stat.update_time = (time_t) my_system_gmt_sec(&mysql_time,
1055         &not_used_long, &not_used_my_bool);
1056 #endif
1057     } else
1058       stat.update_time = (time_t) 0;
1059 #ifndef DBUG_OFF
1060     {
1061       struct tm *ts, tmp_ts;
1062       char buf[80];
1063       ts = localtime_r(&stat.update_time, &tmp_ts);
1064       strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", ts);
1065       DBUG_PRINT("info",("spider update_time=%s", buf));
1066     }
1067 #endif
1068     if (mysql_row[8])
1069     {
1070 #ifdef SPIDER_HAS_TIME_STATUS
1071       my_time_status_init(&time_status);
1072 #endif
1073       SPIDER_str_to_datetime(mysql_row[8], strlen(mysql_row[8]),
1074         &mysql_time, 0, &time_status);
1075 #ifdef MARIADB_BASE_VERSION
1076       stat.check_time = (time_t) my_system_gmt_sec(&mysql_time,
1077         &not_used_long, &not_used_uint);
1078 #else
1079       stat.check_time = (time_t) my_system_gmt_sec(&mysql_time,
1080         &not_used_long, &not_used_my_bool);
1081 #endif
1082     } else
1083       stat.check_time = (time_t) 0;
1084 #ifndef DBUG_OFF
1085     {
1086       struct tm *ts, tmp_ts;
1087       char buf[80];
1088       ts = localtime_r(&stat.check_time, &tmp_ts);
1089       strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", ts);
1090       DBUG_PRINT("info",("spider check_time=%s", buf));
1091     }
1092 #endif
1093     if (mysql_row[9])
1094     {
1095       stat.checksum_null = FALSE;
1096       stat.checksum =
1097         (ha_checksum) my_strtoll10(mysql_row[9], (char**) NULL, &error_num);
1098       DBUG_PRINT("info", ("spider checksum=%lu", (ulong) stat.checksum));
1099     } else {
1100       stat.checksum_null = TRUE;
1101       stat.checksum = (ha_checksum) 0;
1102       DBUG_PRINT("info", ("spider checksum is null"));
1103     }
1104   }
1105   DBUG_RETURN(0);
1106 }
1107 
fetch_simple_action(uint simple_action,uint position,void * param)1108 int spider_db_mbase_result::fetch_simple_action(
1109   uint simple_action,
1110   uint position,
1111   void *param
1112 ) {
1113   int error_num;
1114   MYSQL_ROW mysql_row;
1115   DBUG_ENTER("spider_db_mbase_result::fetch_simple_action");
1116   DBUG_PRINT("info",("spider this=%p", this));
1117   if (!(mysql_row = mysql_fetch_row(db_result)))
1118   {
1119     DBUG_PRINT("info",("spider fetch row is null"));
1120     if ((error_num = mysql_errno(((spider_db_mbase *) db_conn)->db_conn)))
1121     {
1122       my_message(error_num,
1123         mysql_error(((spider_db_mbase *) db_conn)->db_conn), MYF(0));
1124       DBUG_RETURN(error_num);
1125     }
1126     DBUG_RETURN(ER_QUERY_ON_FOREIGN_DATA_SOURCE);
1127   }
1128   if (num_fields() <= position)
1129   {
1130     DBUG_RETURN(ER_QUERY_ON_FOREIGN_DATA_SOURCE);
1131   }
1132   switch (simple_action)
1133   {
1134     case SPIDER_SIMPLE_RECORDS:
1135     {
1136       ha_rows *records = (ha_rows *) param;
1137       if (mysql_row[position])
1138       {
1139         *records =
1140           (ha_rows) my_strtoll10(mysql_row[position], (char**) NULL,
1141           &error_num);
1142       } else {
1143         *records = (ha_rows) 0;
1144       }
1145       DBUG_PRINT("info", ("spider records=%lld", *records));
1146       break;
1147     }
1148 #ifdef HA_HAS_CHECKSUM_EXTENDED
1149     case SPIDER_SIMPLE_CHECKSUM_TABLE:
1150     {
1151       ha_spider *spider = (ha_spider *) param;
1152       if (mysql_row[position])
1153       {
1154         spider->checksum_val =
1155           (ha_checksum) my_strtoll10(mysql_row[position], (char**) NULL,
1156           &error_num);
1157         DBUG_PRINT("info", ("spider checksum=%llu", (ulonglong)spider->checksum_val));
1158         spider->checksum_null = FALSE;
1159       } else {
1160         spider->checksum_null = TRUE;
1161         DBUG_PRINT("info", ("spider checksum is null"));
1162       }
1163       break;
1164     }
1165 #endif
1166     default:
1167       DBUG_ASSERT(0);
1168       break;
1169   }
1170   DBUG_RETURN(0);
1171 }
1172 
fetch_table_records(int mode,ha_rows & records)1173 int spider_db_mbase_result::fetch_table_records(
1174   int mode,
1175   ha_rows &records
1176 ) {
1177   DBUG_ENTER("spider_db_mbase_result::fetch_table_records");
1178   DBUG_PRINT("info",("spider this=%p", this));
1179   if (mode == 1)
1180   {
1181     DBUG_RETURN(fetch_simple_action(SPIDER_SIMPLE_RECORDS,
1182       SPIDER_SQL_SHOW_RECORDS_RECORDS_POS, &records));
1183   } else {
1184     DBUG_RETURN(fetch_simple_action(SPIDER_SIMPLE_RECORDS,
1185       SPIDER_SQL_EXPLAIN_SELECT_RECORDS_POS, &records));
1186   }
1187 }
1188 
1189 #ifdef HA_HAS_CHECKSUM_EXTENDED
fetch_table_checksum(ha_spider * spider)1190 int spider_db_mbase_result::fetch_table_checksum(
1191   ha_spider *spider
1192 ) {
1193   DBUG_ENTER("spider_db_mbase_result::fetch_table_checksum");
1194   DBUG_PRINT("info",("spider this=%p", this));
1195   DBUG_RETURN(fetch_simple_action(SPIDER_SIMPLE_CHECKSUM_TABLE,
1196     SPIDER_SQL_CHECKSUM_CHECKSUM_POS, spider));
1197 }
1198 #endif
1199 
fetch_table_cardinality(int mode,TABLE * table,longlong * cardinality,uchar * cardinality_upd,int bitmap_size)1200 int spider_db_mbase_result::fetch_table_cardinality(
1201   int mode,
1202   TABLE *table,
1203   longlong *cardinality,
1204   uchar *cardinality_upd,
1205   int bitmap_size
1206 ) {
1207   int error_num;
1208   MYSQL_ROW mysql_row;
1209   Field *field;
1210   DBUG_ENTER("spider_db_mbase_result::fetch_table_cardinality");
1211   DBUG_PRINT("info",("spider this=%p", this));
1212   memset((uchar *) cardinality_upd, 0, sizeof(uchar) * bitmap_size);
1213   if (!(mysql_row = mysql_fetch_row(db_result)))
1214   {
1215     DBUG_PRINT("info",("spider fetch row is null"));
1216     if ((error_num = mysql_errno(((spider_db_mbase *) db_conn)->db_conn)))
1217     {
1218       my_message(error_num,
1219         mysql_error(((spider_db_mbase *) db_conn)->db_conn), MYF(0));
1220       DBUG_RETURN(error_num);
1221     }
1222     /* no index */
1223     DBUG_RETURN(0);
1224   }
1225   if (mode == 1)
1226   {
1227     uint num_fields = this->num_fields();
1228     if (num_fields < 12 || num_fields > 13)
1229     {
1230       DBUG_PRINT("info",("spider num_fields < 12 || num_fields > 13"));
1231       DBUG_RETURN(ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM);
1232     }
1233 
1234     while (mysql_row)
1235     {
1236       if (
1237         mysql_row[4] &&
1238         mysql_row[6] &&
1239         (field = find_field_in_table_sef(table, mysql_row[4]))
1240       ) {
1241         if ((cardinality[field->field_index] =
1242           (longlong) my_strtoll10(mysql_row[6], (char**) NULL, &error_num))
1243         <= 0)
1244           cardinality[field->field_index] = 1;
1245         spider_set_bit(cardinality_upd, field->field_index);
1246         DBUG_PRINT("info",
1247           ("spider col_name=%s", mysql_row[4]));
1248         DBUG_PRINT("info",
1249           ("spider cardinality=%lld",
1250           cardinality[field->field_index]));
1251       } else if (mysql_row[4])
1252       {
1253         DBUG_PRINT("info",
1254           ("spider skip col_name=%s", mysql_row[4]));
1255       } else {
1256         DBUG_RETURN(ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM);
1257       }
1258       mysql_row = mysql_fetch_row(db_result);
1259     }
1260   } else {
1261     while (mysql_row)
1262     {
1263       if (
1264         mysql_row[0] &&
1265         mysql_row[1] &&
1266         (field = find_field_in_table_sef(table, mysql_row[0]))
1267       ) {
1268         if ((cardinality[field->field_index] =
1269           (longlong) my_strtoll10(mysql_row[1], (char**) NULL, &error_num))
1270         <= 0)
1271           cardinality[field->field_index] = 1;
1272         spider_set_bit(cardinality_upd, field->field_index);
1273         DBUG_PRINT("info",
1274           ("spider col_name=%s", mysql_row[0]));
1275         DBUG_PRINT("info",
1276           ("spider cardinality=%lld",
1277           cardinality[field->field_index]));
1278       } else if (mysql_row[0])
1279       {
1280         DBUG_PRINT("info",
1281           ("spider skip col_name=%s", mysql_row[0]));
1282       } else {
1283         DBUG_RETURN(ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM);
1284       }
1285       mysql_row = mysql_fetch_row(db_result);
1286     }
1287   }
1288   if ((error_num = mysql_errno(((spider_db_mbase *) db_conn)->db_conn)))
1289   {
1290     my_message(error_num,
1291       mysql_error(((spider_db_mbase *) db_conn)->db_conn), MYF(0));
1292     DBUG_RETURN(error_num);
1293   }
1294   DBUG_RETURN(0);
1295 }
1296 
fetch_table_mon_status(int & status)1297 int spider_db_mbase_result::fetch_table_mon_status(
1298   int &status
1299 ) {
1300   int error_num;
1301   MYSQL_ROW mysql_row;
1302   DBUG_ENTER("spider_db_mbase_result::fetch_table_mon_status");
1303   DBUG_PRINT("info",("spider this=%p", this));
1304   if (!(mysql_row = mysql_fetch_row(db_result)))
1305   {
1306     DBUG_PRINT("info",("spider fetch row is null"));
1307     if ((error_num = mysql_errno(((spider_db_mbase *) db_conn)->db_conn)))
1308     {
1309       my_message(error_num,
1310         mysql_error(((spider_db_mbase *) db_conn)->db_conn), MYF(0));
1311       DBUG_RETURN(error_num);
1312     }
1313     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1314   }
1315   if (num_fields() != 1)
1316   {
1317     DBUG_PRINT("info",("spider num_fields != 1"));
1318     my_printf_error(ER_SPIDER_UNKNOWN_NUM, ER_SPIDER_UNKNOWN_STR, MYF(0));
1319     DBUG_RETURN(ER_SPIDER_UNKNOWN_NUM);
1320   }
1321   if (mysql_row[0])
1322     status = atoi(mysql_row[0]);
1323   else
1324     status = SPIDER_LINK_MON_OK;
1325   DBUG_PRINT("info", ("spider status=%d", status));
1326   DBUG_RETURN(0);
1327 }
1328 
fetch_show_master_status(const char ** binlog_file_name,const char ** binlog_pos)1329 int spider_db_mbase_result::fetch_show_master_status(
1330   const char **binlog_file_name,
1331   const char **binlog_pos
1332 ) {
1333   int error_num;
1334   MYSQL_ROW mysql_row;
1335   DBUG_ENTER("spider_db_mbase_result::fetch_show_master_status");
1336   DBUG_PRINT("info",("spider this=%p", this));
1337   if (!(mysql_row = mysql_fetch_row(db_result)))
1338   {
1339     DBUG_PRINT("info",("spider fetch row is null"));
1340     if ((error_num = mysql_errno(((spider_db_mbase *) db_conn)->db_conn)))
1341     {
1342       my_message(error_num,
1343         mysql_error(((spider_db_mbase *) db_conn)->db_conn), MYF(0));
1344       DBUG_RETURN(error_num);
1345     }
1346     DBUG_RETURN(ER_QUERY_ON_FOREIGN_DATA_SOURCE);
1347   }
1348   if (num_fields() != 4)
1349   {
1350     DBUG_RETURN(ER_QUERY_ON_FOREIGN_DATA_SOURCE);
1351   }
1352 
1353   *binlog_file_name = mysql_row[0];
1354   DBUG_PRINT("info",("spider binlog_file_name=%s", *binlog_file_name));
1355   *binlog_pos = mysql_row[1];
1356   DBUG_PRINT("info",("spider binlog_pos=%s", *binlog_pos));
1357   DBUG_RETURN(0);
1358 }
1359 
fetch_select_binlog_gtid_pos(const char ** gtid_pos)1360 int spider_db_mbase_result::fetch_select_binlog_gtid_pos(
1361   const char **gtid_pos
1362 ) {
1363   int error_num;
1364   MYSQL_ROW mysql_row;
1365   DBUG_ENTER("spider_db_mbase_result::fetch_select_binlog_gtid_pos");
1366   DBUG_PRINT("info",("spider this=%p", this));
1367   if (!(mysql_row = mysql_fetch_row(db_result)))
1368   {
1369     DBUG_PRINT("info",("spider fetch row is null"));
1370     if ((error_num = mysql_errno(((spider_db_mbase *) db_conn)->db_conn)))
1371     {
1372       my_message(error_num,
1373         mysql_error(((spider_db_mbase *) db_conn)->db_conn), MYF(0));
1374       DBUG_RETURN(error_num);
1375     }
1376     DBUG_RETURN(ER_QUERY_ON_FOREIGN_DATA_SOURCE);
1377   }
1378   if (num_fields() != 1)
1379   {
1380     DBUG_RETURN(ER_QUERY_ON_FOREIGN_DATA_SOURCE);
1381   }
1382 
1383   *gtid_pos = mysql_row[0];
1384   DBUG_PRINT("info",("spider gtid_pos=%s", *gtid_pos));
1385   DBUG_RETURN(0);
1386 }
1387 
num_rows()1388 longlong spider_db_mbase_result::num_rows()
1389 {
1390   DBUG_ENTER("spider_db_mbase_result::num_rows");
1391   DBUG_PRINT("info",("spider this=%p", this));
1392   DBUG_RETURN((longlong) mysql_num_rows(db_result));
1393 }
1394 
num_fields()1395 uint spider_db_mbase_result::num_fields()
1396 {
1397   DBUG_ENTER("spider_db_mbase_result::num_fields");
1398   DBUG_PRINT("info",("spider this=%p", this));
1399   DBUG_RETURN(mysql_num_fields(db_result));
1400 }
1401 
move_to_pos(longlong pos)1402 void spider_db_mbase_result::move_to_pos(
1403   longlong pos
1404 ) {
1405   DBUG_ENTER("spider_db_mbase_result::move_to_pos");
1406   DBUG_PRINT("info",("spider this=%p", this));
1407   DBUG_PRINT("info",("spider pos=%lld", pos));
1408 /*
1409   DBUG_ASSERT(first_row);
1410 */
1411   db_result->data_cursor = first_row + pos;
1412   DBUG_VOID_RETURN;
1413 }
1414 
get_errno()1415 int spider_db_mbase_result::get_errno()
1416 {
1417   DBUG_ENTER("spider_db_mbase_result::get_errno");
1418   DBUG_PRINT("info",("spider this=%p", this));
1419   DBUG_PRINT("info",("spider store_error_num=%d", store_error_num));
1420   DBUG_RETURN(store_error_num);
1421 }
1422 
1423 #ifdef SPIDER_HAS_DISCOVER_TABLE_STRUCTURE
fetch_columns_for_discover_table_structure(spider_string * str,CHARSET_INFO * access_charset)1424 int spider_db_mbase_result::fetch_columns_for_discover_table_structure(
1425   spider_string *str,
1426   CHARSET_INFO *access_charset
1427 ) {
1428   int error_num;
1429   uint length;
1430   MYSQL_ROW mysql_row;
1431   DBUG_ENTER("spider_db_mbase_result::fetch_columns_for_discover_table_structure");
1432   DBUG_PRINT("info",("spider this=%p", this));
1433   if (!(mysql_row = mysql_fetch_row(db_result)))
1434   {
1435     DBUG_PRINT("info",("spider fetch row is null"));
1436     if ((error_num = mysql_errno(((spider_db_mbase *) db_conn)->db_conn)))
1437     {
1438       my_message(error_num,
1439         mysql_error(((spider_db_mbase *) db_conn)->db_conn), MYF(0));
1440       DBUG_RETURN(error_num);
1441     }
1442     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1443   }
1444   if (num_fields() != 7)
1445   {
1446     DBUG_PRINT("info",("spider num_fields != 7"));
1447     my_printf_error(ER_SPIDER_UNKNOWN_NUM, ER_SPIDER_UNKNOWN_STR, MYF(0));
1448     DBUG_RETURN(ER_SPIDER_UNKNOWN_NUM);
1449   }
1450   do {
1451     if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN))
1452     {
1453       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1454     }
1455     str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
1456     if (str->append(mysql_row[0], strlen(mysql_row[0]), access_charset))
1457     {
1458       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1459     }
1460     if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN + SPIDER_SQL_SPACE_LEN))
1461     {
1462       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1463     }
1464     str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
1465     str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
1466     if (str->append(mysql_row[5], strlen(mysql_row[5]), access_charset))
1467     {
1468       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1469     }
1470     if (mysql_row[3])
1471     {
1472       length = strlen(mysql_row[3]);
1473       if (str->reserve(SPIDER_SQL_CHARACTER_SET_LEN + length))
1474       {
1475         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1476       }
1477       str->q_append(SPIDER_SQL_CHARACTER_SET_STR, SPIDER_SQL_CHARACTER_SET_LEN);
1478       str->q_append(mysql_row[3], length);
1479     }
1480     if (mysql_row[4])
1481     {
1482       length = strlen(mysql_row[4]);
1483       if (str->reserve(SPIDER_SQL_COLLATE_LEN + length))
1484       {
1485         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1486       }
1487       str->q_append(SPIDER_SQL_COLLATE_STR, SPIDER_SQL_COLLATE_LEN);
1488       str->q_append(mysql_row[4], length);
1489     }
1490     if (!strcmp(mysql_row[2], "NO"))
1491     {
1492       if (str->reserve(SPIDER_SQL_NOT_NULL_LEN))
1493       {
1494         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1495       }
1496       str->q_append(SPIDER_SQL_NOT_NULL_STR, SPIDER_SQL_NOT_NULL_LEN);
1497       if (mysql_row[1])
1498       {
1499         if (str->reserve(SPIDER_SQL_DEFAULT_LEN))
1500         {
1501           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1502         }
1503         str->q_append(SPIDER_SQL_DEFAULT_STR, SPIDER_SQL_DEFAULT_LEN);
1504         if (str->append(mysql_row[1], strlen(mysql_row[1]), access_charset))
1505         {
1506           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1507         }
1508       }
1509     } else {
1510       if (str->reserve(SPIDER_SQL_DEFAULT_LEN))
1511       {
1512         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1513       }
1514       str->q_append(SPIDER_SQL_DEFAULT_STR, SPIDER_SQL_DEFAULT_LEN);
1515       if (mysql_row[1])
1516       {
1517         if (str->append(mysql_row[1], strlen(mysql_row[1]), access_charset))
1518         {
1519           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1520         }
1521       } else {
1522         if (str->reserve(SPIDER_SQL_NULL_LEN))
1523         {
1524           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1525         }
1526         str->q_append(SPIDER_SQL_NULL_STR, SPIDER_SQL_NULL_LEN);
1527       }
1528     }
1529     if (mysql_row[6] && !strcmp(mysql_row[6], "auto_increment"))
1530     {
1531       if (str->reserve(SPIDER_SQL_AUTO_INCREMENT_LEN))
1532         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1533       str->q_append(SPIDER_SQL_AUTO_INCREMENT_STR, SPIDER_SQL_AUTO_INCREMENT_LEN);
1534     }
1535     if (str->reserve(SPIDER_SQL_COMMA_LEN))
1536     {
1537       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1538     }
1539     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
1540   } while ((mysql_row = mysql_fetch_row(db_result)));
1541   if ((error_num = mysql_errno(((spider_db_mbase *) db_conn)->db_conn)))
1542   {
1543     my_message(error_num,
1544       mysql_error(((spider_db_mbase *) db_conn)->db_conn), MYF(0));
1545     DBUG_RETURN(error_num);
1546   }
1547   DBUG_RETURN(0);
1548 }
1549 
fetch_index_for_discover_table_structure(spider_string * str,CHARSET_INFO * access_charset)1550 int spider_db_mbase_result::fetch_index_for_discover_table_structure(
1551   spider_string *str,
1552   CHARSET_INFO *access_charset
1553 ) {
1554   int error_num;
1555   MYSQL_ROW mysql_row;
1556   DBUG_ENTER("spider_db_mbase_result::fetch_index_for_discover_table_structure");
1557   DBUG_PRINT("info",("spider this=%p", this));
1558   if (!(mysql_row = mysql_fetch_row(db_result)))
1559   {
1560     DBUG_PRINT("info",("spider fetch row is null"));
1561     if ((error_num = mysql_errno(((spider_db_mbase *) db_conn)->db_conn)))
1562     {
1563       my_message(error_num,
1564         mysql_error(((spider_db_mbase *) db_conn)->db_conn), MYF(0));
1565       DBUG_RETURN(error_num);
1566     }
1567     DBUG_RETURN(0);
1568   }
1569   if (num_fields() != 13)
1570   {
1571     DBUG_PRINT("info",("spider num_fields != 13"));
1572     my_printf_error(ER_SPIDER_UNKNOWN_NUM, ER_SPIDER_UNKNOWN_STR, MYF(0));
1573     DBUG_RETURN(ER_SPIDER_UNKNOWN_NUM);
1574   }
1575   bool first = TRUE;
1576   bool without_size = FALSE;
1577   bool using_hash = FALSE;
1578   do {
1579     if (!strcmp(mysql_row[3], "1"))
1580     {
1581       without_size = FALSE;
1582       if (first)
1583       {
1584         first = FALSE;
1585       } else {
1586         if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN + SPIDER_SQL_COMMA_LEN +
1587           (using_hash ? SPIDER_SQL_USING_HASH_LEN : 0)))
1588         {
1589           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1590         }
1591         str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
1592         if (using_hash)
1593           str->q_append(SPIDER_SQL_USING_HASH_STR, SPIDER_SQL_USING_HASH_LEN);
1594         str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
1595       }
1596       /* new index */
1597       if (!strcmp(mysql_row[2], SPIDER_DB_PK_NAME_STR))
1598       {
1599         /* primary key */
1600         if (str->reserve(SPIDER_DB_PK_NAME_LEN + SPIDER_SQL_SPACE_LEN))
1601         {
1602           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1603         }
1604         str->q_append(SPIDER_DB_PK_NAME_STR, SPIDER_DB_PK_NAME_LEN);
1605         str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
1606       } else if (!strcmp(mysql_row[1], "0"))
1607       {
1608         /* unique key */
1609         if (str->reserve(SPIDER_DB_UNIQUE_NAME_LEN + SPIDER_SQL_SPACE_LEN))
1610         {
1611           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1612         }
1613         str->q_append(SPIDER_DB_UNIQUE_NAME_STR, SPIDER_DB_UNIQUE_NAME_LEN);
1614         str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
1615       } else if (mysql_row[10] && !strcmp(mysql_row[10], "FULLTEXT"))
1616       {
1617         /* fulltext key */
1618         if (str->reserve(SPIDER_SQL_FULLTEXT_LEN + SPIDER_SQL_SPACE_LEN))
1619         {
1620           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1621         }
1622         str->q_append(SPIDER_SQL_FULLTEXT_STR, SPIDER_SQL_FULLTEXT_LEN);
1623         str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
1624       } else if (mysql_row[10] && !strcmp(mysql_row[10], "SPATIAL"))
1625       {
1626         /* spatial key */
1627         without_size = TRUE;
1628         if (str->reserve(SPIDER_SQL_SPATIAL_LEN + SPIDER_SQL_SPACE_LEN))
1629         {
1630           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1631         }
1632         str->q_append(SPIDER_SQL_SPATIAL_STR, SPIDER_SQL_SPATIAL_LEN);
1633         str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
1634       }
1635       if (str->reserve(SPIDER_DB_KEY_NAME_LEN + SPIDER_SQL_SPACE_LEN))
1636       {
1637         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1638       }
1639       str->q_append(SPIDER_DB_KEY_NAME_STR, SPIDER_DB_KEY_NAME_LEN);
1640       str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
1641       if (strcmp(mysql_row[2], SPIDER_DB_PK_NAME_STR))
1642       {
1643         if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN))
1644         {
1645           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1646         }
1647         str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
1648         if (str->append(mysql_row[2], strlen(mysql_row[2]), access_charset))
1649         {
1650           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1651         }
1652         if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN))
1653         {
1654           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1655         }
1656         str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
1657       }
1658       if (str->reserve(SPIDER_SQL_OPEN_PAREN_LEN))
1659       {
1660         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1661       }
1662       str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
1663       if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN))
1664       {
1665         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1666       }
1667       str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
1668       if (str->append(mysql_row[4], strlen(mysql_row[4]), access_charset))
1669       {
1670         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1671       }
1672       if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN))
1673       {
1674         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1675       }
1676       str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
1677       if (mysql_row[7] && !without_size)
1678       {
1679         if (str->reserve(SPIDER_SQL_OPEN_PAREN_LEN))
1680         {
1681           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1682         }
1683         str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
1684         if (str->append(mysql_row[7], strlen(mysql_row[7]), access_charset))
1685         {
1686           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1687         }
1688         if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN))
1689         {
1690           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1691         }
1692         str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
1693       }
1694     } else {
1695       if (str->reserve(SPIDER_SQL_COMMA_LEN + SPIDER_SQL_NAME_QUOTE_LEN))
1696       {
1697         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1698       }
1699       str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
1700       str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
1701       if (str->append(mysql_row[4], strlen(mysql_row[4]), access_charset))
1702       {
1703         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1704       }
1705       if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN))
1706       {
1707         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1708       }
1709       str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
1710       if (mysql_row[7] && !without_size)
1711       {
1712         if (str->reserve(SPIDER_SQL_OPEN_PAREN_LEN))
1713         {
1714           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1715         }
1716         str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
1717         if (str->append(mysql_row[7], strlen(mysql_row[7]), access_charset))
1718         {
1719           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1720         }
1721         if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN))
1722         {
1723           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1724         }
1725         str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
1726       }
1727     }
1728     if (mysql_row[10] && !strcmp(mysql_row[10], "HASH"))
1729       using_hash = TRUE;
1730     else
1731       using_hash = FALSE;
1732   } while ((mysql_row = mysql_fetch_row(db_result)));
1733   if ((error_num = mysql_errno(((spider_db_mbase *) db_conn)->db_conn)))
1734   {
1735     my_message(error_num,
1736       mysql_error(((spider_db_mbase *) db_conn)->db_conn), MYF(0));
1737     DBUG_RETURN(error_num);
1738   }
1739   if (!first)
1740   {
1741     if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN + SPIDER_SQL_COMMA_LEN +
1742       (using_hash ? SPIDER_SQL_USING_HASH_LEN : 0)))
1743     {
1744       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1745     }
1746     str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
1747     if (using_hash)
1748       str->q_append(SPIDER_SQL_USING_HASH_STR, SPIDER_SQL_USING_HASH_LEN);
1749     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
1750   }
1751   DBUG_RETURN(0);
1752 }
1753 
fetch_table_for_discover_table_structure(spider_string * str,SPIDER_SHARE * spider_share,CHARSET_INFO * access_charset)1754 int spider_db_mbase_result::fetch_table_for_discover_table_structure(
1755   spider_string *str,
1756   SPIDER_SHARE *spider_share,
1757   CHARSET_INFO *access_charset
1758 ) {
1759   int error_num;
1760   MYSQL_ROW mysql_row;
1761   DBUG_ENTER("spider_db_mbase_result::fetch_table_for_discover_table_structure");
1762   DBUG_PRINT("info",("spider this=%p", this));
1763   if (!(mysql_row = mysql_fetch_row(db_result)))
1764   {
1765     DBUG_PRINT("info",("spider fetch row is null"));
1766     if ((error_num = mysql_errno(((spider_db_mbase *) db_conn)->db_conn)))
1767     {
1768       my_message(error_num,
1769         mysql_error(((spider_db_mbase *) db_conn)->db_conn), MYF(0));
1770       DBUG_RETURN(error_num);
1771     }
1772     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1773   }
1774   if (num_fields() < 18)
1775   {
1776     DBUG_PRINT("info",("spider num_fields != 18"));
1777     my_printf_error(ER_SPIDER_UNKNOWN_NUM, ER_SPIDER_UNKNOWN_STR, MYF(0));
1778     DBUG_RETURN(ER_SPIDER_UNKNOWN_NUM);
1779   }
1780   if (!mysql_row[14])
1781   {
1782     DBUG_PRINT("info",("spider mysql_row[14] is null"));
1783     my_printf_error(ER_SPIDER_UNKNOWN_NUM, ER_SPIDER_UNKNOWN_STR, MYF(0));
1784     DBUG_RETURN(ER_SPIDER_UNKNOWN_NUM);
1785   }
1786   DBUG_PRINT("info",("spider mysql_row[14]=%s", mysql_row[14]));
1787   if (!spider_share->table_share->table_charset)
1788   {
1789     spider_share->table_share->table_charset = get_charset_by_name(mysql_row[14], MYF(MY_WME));
1790   }
1791   DBUG_RETURN(0);
1792 }
1793 #endif
1794 
spider_db_mbase(SPIDER_CONN * conn,spider_db_mbase_util * spider_db_mbase_utility)1795 spider_db_mbase::spider_db_mbase(
1796   SPIDER_CONN *conn,
1797   spider_db_mbase_util *spider_db_mbase_utility
1798 ) : spider_db_conn(conn), spider_db_mbase_utility(spider_db_mbase_utility),
1799   lock_table_hash_inited(FALSE), handler_open_array_inited(FALSE)
1800 {
1801   DBUG_ENTER("spider_db_mbase::spider_db_mbase");
1802   DBUG_PRINT("info",("spider this=%p", this));
1803   db_conn = NULL;
1804   DBUG_VOID_RETURN;
1805 }
1806 
spider_db_mysql(SPIDER_CONN * conn)1807 spider_db_mysql::spider_db_mysql(
1808   SPIDER_CONN *conn
1809 ) : spider_db_mbase(conn, &spider_db_mysql_utility)
1810 {
1811   DBUG_ENTER("spider_db_mysql::spider_db_mysql");
1812   DBUG_PRINT("info",("spider this=%p", this));
1813   DBUG_VOID_RETURN;
1814 }
1815 
spider_db_mariadb(SPIDER_CONN * conn)1816 spider_db_mariadb::spider_db_mariadb(
1817   SPIDER_CONN *conn
1818 ) : spider_db_mbase(conn, &spider_db_mariadb_utility)
1819 {
1820   DBUG_ENTER("spider_db_mariadb::spider_db_mariadb");
1821   DBUG_PRINT("info",("spider this=%p", this));
1822   DBUG_VOID_RETURN;
1823 }
1824 
~spider_db_mbase()1825 spider_db_mbase::~spider_db_mbase()
1826 {
1827   DBUG_ENTER("spider_db_mbase::~spider_db_mbase");
1828   DBUG_PRINT("info",("spider this=%p", this));
1829   if (handler_open_array_inited)
1830   {
1831     reset_opened_handler();
1832     spider_free_mem_calc(spider_current_trx,
1833       handler_open_array_id,
1834       handler_open_array.max_element *
1835       handler_open_array.size_of_element);
1836     delete_dynamic(&handler_open_array);
1837   }
1838   if (lock_table_hash_inited)
1839   {
1840     spider_free_mem_calc(spider_current_trx,
1841       lock_table_hash_id,
1842       lock_table_hash.array.max_element *
1843       lock_table_hash.array.size_of_element);
1844     my_hash_free(&lock_table_hash);
1845   }
1846   DBUG_VOID_RETURN;
1847 }
1848 
~spider_db_mysql()1849 spider_db_mysql::~spider_db_mysql()
1850 {
1851   DBUG_ENTER("spider_db_mysql::~spider_db_mysql");
1852   DBUG_PRINT("info",("spider this=%p", this));
1853   DBUG_VOID_RETURN;
1854 }
1855 
~spider_db_mariadb()1856 spider_db_mariadb::~spider_db_mariadb()
1857 {
1858   DBUG_ENTER("spider_db_mariadb::~spider_db_mariadb");
1859   DBUG_PRINT("info",("spider this=%p", this));
1860   DBUG_VOID_RETURN;
1861 }
1862 
init()1863 int spider_db_mbase::init()
1864 {
1865   DBUG_ENTER("spider_db_mbase::init");
1866   DBUG_PRINT("info",("spider this=%p", this));
1867   if (
1868     my_hash_init(&lock_table_hash, spd_charset_utf8_bin, 32, 0, 0,
1869       (my_hash_get_key) spider_link_get_key, 0, 0)
1870   ) {
1871     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1872   }
1873   spider_alloc_calc_mem_init(lock_table_hash, 140);
1874   spider_alloc_calc_mem(spider_current_trx,
1875     lock_table_hash,
1876     lock_table_hash.array.max_element *
1877     lock_table_hash.array.size_of_element);
1878   lock_table_hash_inited = TRUE;
1879 
1880   if (
1881     SPD_INIT_DYNAMIC_ARRAY2(&handler_open_array,
1882       sizeof(SPIDER_LINK_FOR_HASH *), NULL, 16, 16, MYF(MY_WME))
1883   ) {
1884     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1885   }
1886   spider_alloc_calc_mem_init(handler_open_array, 162);
1887   spider_alloc_calc_mem(spider_current_trx,
1888     handler_open_array,
1889     handler_open_array.max_element *
1890     handler_open_array.size_of_element);
1891   handler_open_array_inited = TRUE;
1892   DBUG_RETURN(0);
1893 }
1894 
is_connected()1895 bool spider_db_mbase::is_connected()
1896 {
1897   DBUG_ENTER("spider_db_mbase::is_connected");
1898   DBUG_PRINT("info",("spider this=%p", this));
1899   DBUG_RETURN(db_conn);
1900 }
1901 
bg_connect()1902 void spider_db_mbase::bg_connect()
1903 {
1904   DBUG_ENTER("spider_db_mbase::bg_connect");
1905   DBUG_PRINT("info",("spider this=%p", this));
1906   DBUG_VOID_RETURN;
1907 }
1908 
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)1909 int spider_db_mbase::connect(
1910   char *tgt_host,
1911   char *tgt_username,
1912   char *tgt_password,
1913   long tgt_port,
1914   char *tgt_socket,
1915   char *server_name,
1916   int connect_retry_count,
1917   longlong connect_retry_interval
1918 ) {
1919   int error_num;
1920   my_bool connect_mutex = spider_param_connect_mutex();
1921   DBUG_ENTER("spider_db_mbase::connect");
1922   DBUG_PRINT("info",("spider this=%p", this));
1923   while (TRUE)
1924   {
1925     THD *thd = current_thd;
1926     DBUG_PRINT("info",("spider thd->killed=%s",
1927       thd ? (thd->killed ? "TRUE" : "FALSE") : "NULL"));
1928     DBUG_PRINT("info",("spider abort_loop=%s",
1929       *spd_abort_loop ? "TRUE" : "FALSE"));
1930     if (
1931       (thd && thd->killed) ||
1932       *spd_abort_loop
1933     ) {
1934       DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
1935     }
1936 
1937     if (!db_conn)
1938     {
1939       if (!(db_conn = mysql_init(NULL)))
1940         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1941     }
1942 
1943     mysql_options(db_conn, MYSQL_OPT_READ_TIMEOUT,
1944       &conn->net_read_timeout);
1945     mysql_options(db_conn, MYSQL_OPT_WRITE_TIMEOUT,
1946       &conn->net_write_timeout);
1947     mysql_options(db_conn, MYSQL_OPT_CONNECT_TIMEOUT,
1948       &conn->connect_timeout);
1949     mysql_options(db_conn, MYSQL_OPT_USE_REMOTE_CONNECTION,
1950       NULL);
1951 
1952     if (
1953       conn->tgt_ssl_ca_length |
1954       conn->tgt_ssl_capath_length |
1955       conn->tgt_ssl_cert_length |
1956       conn->tgt_ssl_key_length
1957     ) {
1958       mysql_ssl_set(db_conn, conn->tgt_ssl_key, conn->tgt_ssl_cert,
1959         conn->tgt_ssl_ca, conn->tgt_ssl_capath, conn->tgt_ssl_cipher);
1960       if (conn->tgt_ssl_vsc)
1961       {
1962         my_bool verify_flg = TRUE;
1963         mysql_options(db_conn, MYSQL_OPT_SSL_VERIFY_SERVER_CERT,
1964           &verify_flg);
1965       }
1966     }
1967 
1968     if (conn->tgt_default_file)
1969     {
1970       DBUG_PRINT("info",("spider tgt_default_file=%s",
1971         conn->tgt_default_file));
1972       mysql_options(db_conn, MYSQL_READ_DEFAULT_FILE,
1973         conn->tgt_default_file);
1974     }
1975     if (conn->tgt_default_group)
1976     {
1977       DBUG_PRINT("info",("spider tgt_default_group=%s",
1978         conn->tgt_default_group));
1979       mysql_options(db_conn, MYSQL_READ_DEFAULT_GROUP,
1980         conn->tgt_default_group);
1981     }
1982 
1983     if (!spider_param_same_server_link(thd))
1984     {
1985       if (!strcmp(tgt_host, my_localhost))
1986       {
1987         if (!strcmp(tgt_socket, *spd_mysqld_unix_port))
1988         {
1989           my_printf_error(ER_SPIDER_SAME_SERVER_LINK_NUM,
1990             ER_SPIDER_SAME_SERVER_LINK_STR1, MYF(0),
1991             tgt_host, tgt_socket);
1992           DBUG_RETURN(ER_SPIDER_SAME_SERVER_LINK_NUM);
1993         }
1994       } else if (!strcmp(tgt_host, "127.0.0.1") ||
1995         !strcmp(tgt_host, glob_hostname))
1996       {
1997         if (tgt_port == (long) *spd_mysqld_port)
1998         {
1999           my_printf_error(ER_SPIDER_SAME_SERVER_LINK_NUM,
2000             ER_SPIDER_SAME_SERVER_LINK_STR2, MYF(0),
2001             tgt_host, tgt_port);
2002           DBUG_RETURN(ER_SPIDER_SAME_SERVER_LINK_NUM);
2003         }
2004       }
2005     }
2006 
2007     if (connect_mutex)
2008       pthread_mutex_lock(&spider_open_conn_mutex);
2009     /* tgt_db not use */
2010     if (
2011       !spider_param_dry_access() &&
2012       !mysql_real_connect(
2013         db_conn,
2014         tgt_host,
2015         tgt_username,
2016         tgt_password,
2017         NULL,
2018         tgt_port,
2019         tgt_socket,
2020         CLIENT_MULTI_STATEMENTS
2021       )
2022     ) {
2023       if (connect_mutex)
2024         pthread_mutex_unlock(&spider_open_conn_mutex);
2025       error_num = mysql_errno(db_conn);
2026       disconnect();
2027       DBUG_PRINT("info",("spider thd->killed=%s",
2028         thd ? (thd->killed ? "TRUE" : "FALSE") : "NULL"));
2029       DBUG_PRINT("info",("spider abort_loop=%s",
2030         *spd_abort_loop ? "TRUE" : "FALSE"));
2031       if (
2032         (thd && thd->killed) ||
2033         *spd_abort_loop
2034       ) {
2035         DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
2036       }
2037       if (
2038         (
2039           error_num != CR_CONN_HOST_ERROR &&
2040           error_num != CR_CONNECTION_ERROR
2041         ) ||
2042         !connect_retry_count
2043       ) {
2044         if (error_num == ER_CON_COUNT_ERROR)
2045         {
2046           *conn->need_mon = 0;
2047           my_error(ER_CON_COUNT_ERROR, MYF(0));
2048           DBUG_RETURN(ER_CON_COUNT_ERROR);
2049         }
2050         *conn->need_mon = ER_CONNECT_TO_FOREIGN_DATA_SOURCE;
2051         my_error(ER_CONNECT_TO_FOREIGN_DATA_SOURCE, MYF(0),
2052           server_name ? server_name : tgt_host);
2053         DBUG_RETURN(ER_CONNECT_TO_FOREIGN_DATA_SOURCE);
2054       }
2055       connect_retry_count--;
2056       my_sleep((ulong) connect_retry_interval);
2057     } else {
2058 #ifdef SPIDER_NET_HAS_THD
2059       db_conn->net.thd = NULL;
2060 #endif
2061       if (connect_mutex)
2062         pthread_mutex_unlock(&spider_open_conn_mutex);
2063       break;
2064     }
2065   }
2066   DBUG_RETURN(0);
2067 }
2068 
ping()2069 int spider_db_mbase::ping(
2070 ) {
2071   DBUG_ENTER("spider_db_mbase::ping");
2072   DBUG_PRINT("info",("spider this=%p", this));
2073   if (spider_param_dry_access())
2074     DBUG_RETURN(0);
2075   DBUG_RETURN(simple_command(db_conn, COM_PING, 0, 0, 0));
2076 }
2077 
bg_disconnect()2078 void spider_db_mbase::bg_disconnect()
2079 {
2080   DBUG_ENTER("spider_db_mbase::bg_disconnect");
2081   DBUG_PRINT("info",("spider this=%p", this));
2082   DBUG_VOID_RETURN;
2083 }
2084 
disconnect()2085 void spider_db_mbase::disconnect()
2086 {
2087   DBUG_ENTER("spider_db_mbase::disconnect");
2088   DBUG_PRINT("info",("spider this=%p", this));
2089   DBUG_PRINT("info",("spider db_conn=%p", db_conn));
2090   if (db_conn)
2091   {
2092     mysql_close(db_conn);
2093     db_conn = NULL;
2094   }
2095   DBUG_VOID_RETURN;
2096 }
2097 
set_net_timeout()2098 int spider_db_mbase::set_net_timeout()
2099 {
2100   DBUG_ENTER("spider_db_mbase::set_net_timeout");
2101   DBUG_PRINT("info",("spider this=%p", this));
2102   DBUG_PRINT("info",("spider conn=%p", conn));
2103   my_net_set_read_timeout(&db_conn->net, conn->net_read_timeout);
2104   my_net_set_write_timeout(&db_conn->net, conn->net_write_timeout);
2105   DBUG_RETURN(0);
2106 }
2107 
exec_query(const char * query,uint length,int quick_mode)2108 int spider_db_mbase::exec_query(
2109   const char *query,
2110   uint length,
2111   int quick_mode
2112 ) {
2113   int error_num = 0;
2114   uint log_result_errors = spider_param_log_result_errors();
2115   DBUG_ENTER("spider_db_mbase::exec_query");
2116   DBUG_PRINT("info",("spider this=%p", this));
2117   if (spider_param_general_log())
2118   {
2119     const char *tgt_str = conn->tgt_host;
2120     uint32 tgt_len = conn->tgt_host_length;
2121     spider_string tmp_query_str;
2122     tmp_query_str.init_calc_mem(230);
2123     if (tmp_query_str.reserve(
2124       length + conn->tgt_wrapper_length +
2125       tgt_len + (SPIDER_SQL_SPACE_LEN * 2)))
2126       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
2127     tmp_query_str.q_append(conn->tgt_wrapper, conn->tgt_wrapper_length);
2128     tmp_query_str.q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
2129     tmp_query_str.q_append(tgt_str, tgt_len);
2130     tmp_query_str.q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
2131     tmp_query_str.q_append(query, length);
2132     general_log_write(current_thd, COM_QUERY, tmp_query_str.ptr(),
2133       tmp_query_str.length());
2134   }
2135   if (!spider_param_dry_access())
2136   {
2137     error_num = mysql_real_query(db_conn, query, length);
2138   }
2139   if (
2140     (error_num && log_result_errors >= 1) ||
2141     (log_result_errors >= 2 && db_conn->warning_count > 0) ||
2142     (log_result_errors >= 4)
2143   ) {
2144     THD *thd = current_thd;
2145     uint log_result_error_with_sql = spider_param_log_result_error_with_sql();
2146     if (log_result_error_with_sql)
2147     {
2148       time_t cur_time = (time_t) time((time_t*) 0);
2149       struct tm lt;
2150       struct tm *l_time = localtime_r(&cur_time, &lt);
2151       spider_string tmp_query_str;
2152       tmp_query_str.init_calc_mem(243);
2153       uint query_length = thd->query_length();
2154       if ((log_result_error_with_sql & 2) && query_length)
2155       {
2156         Security_context *security_ctx = thd->security_ctx;
2157         tmp_query_str.length(0);
2158         if (tmp_query_str.reserve(query_length + 1))
2159           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
2160         tmp_query_str.q_append(thd->query(), query_length);
2161         fprintf(stderr, "%04d%02d%02d %02d:%02d:%02d [RECV SPIDER SQL] "
2162           "from [%s][%s] to %ld:  "
2163           "sql: %s\n",
2164           l_time->tm_year + 1900, l_time->tm_mon + 1, l_time->tm_mday,
2165           l_time->tm_hour, l_time->tm_min, l_time->tm_sec,
2166           security_ctx->user ? security_ctx->user : "system user",
2167           security_ctx->host_or_ip,
2168           (ulong) thd->thread_id,
2169           tmp_query_str.c_ptr_safe());
2170       }
2171       if (log_result_error_with_sql & 1)
2172       {
2173         tmp_query_str.length(0);
2174         if (tmp_query_str.reserve(length + 1))
2175           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
2176         tmp_query_str.q_append(query, length);
2177         fprintf(stderr, "%04d%02d%02d %02d:%02d:%02d [SEND SPIDER SQL] "
2178           "from %ld to [%s] %ld:  "
2179           "sql: %s\n",
2180           l_time->tm_year + 1900, l_time->tm_mon + 1, l_time->tm_mday,
2181           l_time->tm_hour, l_time->tm_min, l_time->tm_sec,
2182           (ulong) thd->thread_id, conn->tgt_host, (ulong) db_conn->thread_id,
2183           tmp_query_str.c_ptr_safe());
2184       }
2185     }
2186     if (log_result_errors >= 2 && db_conn->warning_count > 0)
2187     {
2188       time_t cur_time = (time_t) time((time_t*) 0);
2189       struct tm lt;
2190       struct tm *l_time = localtime_r(&cur_time, &lt);
2191       fprintf(stderr, "%04d%02d%02d %02d:%02d:%02d [WARN SPIDER RESULT] "
2192         "from [%s] %ld to %ld:  "
2193         "affected_rows: %llu  id: %llu  status: %u  warning_count: %u\n",
2194         l_time->tm_year + 1900, l_time->tm_mon + 1, l_time->tm_mday,
2195         l_time->tm_hour, l_time->tm_min, l_time->tm_sec,
2196         conn->tgt_host, (ulong) db_conn->thread_id, (ulong) thd->thread_id,
2197         db_conn->affected_rows, db_conn->insert_id,
2198         db_conn->server_status, db_conn->warning_count);
2199       if (spider_param_log_result_errors() >= 3)
2200         print_warnings(l_time);
2201     } else if (log_result_errors >= 4)
2202     {
2203       time_t cur_time = (time_t) time((time_t*) 0);
2204       struct tm lt;
2205       struct tm *l_time = localtime_r(&cur_time, &lt);
2206       fprintf(stderr, "%04d%02d%02d %02d:%02d:%02d [INFO SPIDER RESULT] "
2207         "from [%s] %ld to %ld:  "
2208         "affected_rows: %llu  id: %llu  status: %u  warning_count: %u\n",
2209         l_time->tm_year + 1900, l_time->tm_mon + 1, l_time->tm_mday,
2210         l_time->tm_hour, l_time->tm_min, l_time->tm_sec,
2211         conn->tgt_host, (ulong) db_conn->thread_id, (ulong) thd->thread_id,
2212         db_conn->affected_rows, db_conn->insert_id,
2213         db_conn->server_status, db_conn->warning_count);
2214     }
2215   }
2216   DBUG_RETURN(error_num);
2217 }
2218 
get_errno()2219 int spider_db_mbase::get_errno()
2220 {
2221   DBUG_ENTER("spider_db_mbase::get_errno");
2222   DBUG_PRINT("info",("spider this=%p", this));
2223   stored_error = mysql_errno(db_conn);
2224   DBUG_PRINT("info",("spider stored_error=%d", stored_error));
2225   DBUG_RETURN(stored_error);
2226 }
2227 
get_error()2228 const char *spider_db_mbase::get_error()
2229 {
2230   const char *error_ptr;
2231   DBUG_ENTER("spider_db_mbase::get_error");
2232   DBUG_PRINT("info",("spider this=%p", this));
2233   error_ptr = mysql_error(db_conn);
2234   DBUG_PRINT("info",("spider error=%s", error_ptr));
2235   DBUG_RETURN(error_ptr);
2236 }
2237 
is_server_gone_error(int error_num)2238 bool spider_db_mbase::is_server_gone_error(
2239   int error_num
2240 ) {
2241   bool server_gone;
2242   DBUG_ENTER("spider_db_mbase::is_server_gone_error");
2243   DBUG_PRINT("info",("spider this=%p", this));
2244   server_gone =
2245     (error_num == CR_SERVER_GONE_ERROR || error_num == CR_SERVER_LOST);
2246   DBUG_PRINT("info",("spider server_gone=%s", server_gone ? "TRUE" : "FALSE"));
2247   DBUG_RETURN(server_gone);
2248 }
2249 
is_dup_entry_error(int error_num)2250 bool spider_db_mbase::is_dup_entry_error(
2251   int error_num
2252 ) {
2253   bool dup_entry;
2254   DBUG_ENTER("spider_db_mbase::is_dup_entry_error");
2255   DBUG_PRINT("info",("spider this=%p", this));
2256   dup_entry =
2257     (
2258       error_num == ER_DUP_ENTRY ||
2259       error_num == ER_DUP_KEY ||
2260       error_num == HA_ERR_FOUND_DUPP_KEY
2261     );
2262   DBUG_PRINT("info",("spider dup_entry=%s", dup_entry ? "TRUE" : "FALSE"));
2263   DBUG_RETURN(dup_entry);
2264 }
2265 
is_xa_nota_error(int error_num)2266 bool spider_db_mbase::is_xa_nota_error(
2267   int error_num
2268 ) {
2269   bool xa_nota;
2270   DBUG_ENTER("spider_db_mbase::is_xa_nota_error");
2271   DBUG_PRINT("info",("spider this=%p", this));
2272   xa_nota =
2273     (
2274       error_num == ER_XAER_NOTA ||
2275       error_num == ER_XA_RBTIMEOUT ||
2276       error_num == ER_XA_RBDEADLOCK
2277     );
2278   DBUG_PRINT("info",("spider xa_nota=%s", xa_nota ? "TRUE" : "FALSE"));
2279   DBUG_RETURN(xa_nota);
2280 }
2281 
print_warnings(struct tm * l_time)2282 void spider_db_mbase::print_warnings(
2283   struct tm *l_time
2284 ) {
2285   DBUG_ENTER("spider_db_mbase::print_warnings");
2286   DBUG_PRINT("info",("spider this=%p", this));
2287   if (db_conn->status == MYSQL_STATUS_READY)
2288   {
2289 #if MYSQL_VERSION_ID < 50500
2290     if (!(db_conn->last_used_con->server_status & SERVER_MORE_RESULTS_EXISTS))
2291 #else
2292     if (!(db_conn->server_status & SERVER_MORE_RESULTS_EXISTS))
2293 #endif
2294     {
2295       if (
2296         spider_param_dry_access() ||
2297         !mysql_real_query(db_conn, SPIDER_SQL_SHOW_WARNINGS_STR,
2298           SPIDER_SQL_SHOW_WARNINGS_LEN)
2299       ) {
2300         MYSQL_RES *res = NULL;
2301         MYSQL_ROW row = NULL;
2302         uint num_fields;
2303         if (
2304           spider_param_dry_access() ||
2305           !(res = mysql_store_result(db_conn)) ||
2306           !(row = mysql_fetch_row(res))
2307         ) {
2308           if (mysql_errno(db_conn))
2309           {
2310             if (res)
2311               mysql_free_result(res);
2312             DBUG_VOID_RETURN;
2313           }
2314           /* no record is ok */
2315         }
2316         num_fields = mysql_num_fields(res);
2317         if (num_fields != 3)
2318         {
2319           mysql_free_result(res);
2320           DBUG_VOID_RETURN;
2321         }
2322         while (row)
2323         {
2324           fprintf(stderr, "%04d%02d%02d %02d:%02d:%02d [WARN SPIDER RESULT] "
2325             "from [%s] %ld to %ld: %s %s %s\n",
2326             l_time->tm_year + 1900, l_time->tm_mon + 1, l_time->tm_mday,
2327             l_time->tm_hour, l_time->tm_min, l_time->tm_sec,
2328             conn->tgt_host, (ulong) db_conn->thread_id,
2329             (ulong) current_thd->thread_id, row[0], row[1], row[2]);
2330           row = mysql_fetch_row(res);
2331         }
2332         if (res)
2333           mysql_free_result(res);
2334       }
2335     }
2336   }
2337   DBUG_VOID_RETURN;
2338 }
2339 
store_result(spider_db_result_buffer ** spider_res_buf,st_spider_db_request_key * request_key,int * error_num)2340 spider_db_result *spider_db_mbase::store_result(
2341   spider_db_result_buffer **spider_res_buf,
2342   st_spider_db_request_key *request_key,
2343   int *error_num
2344 ) {
2345   spider_db_mbase_result *result;
2346   DBUG_ENTER("spider_db_mbase::store_result");
2347   DBUG_PRINT("info",("spider this=%p", this));
2348   DBUG_ASSERT(!spider_res_buf);
2349   if ((result = new spider_db_mbase_result(this)))
2350   {
2351     *error_num = 0;
2352     if (
2353       spider_param_dry_access() ||
2354       !(result->db_result = mysql_store_result(db_conn))
2355     ) {
2356       delete result;
2357       result = NULL;
2358     } else {
2359       result->first_row = result->db_result->data_cursor;
2360       DBUG_PRINT("info",("spider result->first_row=%p", result->first_row));
2361     }
2362   } else {
2363     *error_num = HA_ERR_OUT_OF_MEM;
2364   }
2365   DBUG_RETURN(result);
2366 }
2367 
use_result(st_spider_db_request_key * request_key,int * error_num)2368 spider_db_result *spider_db_mbase::use_result(
2369   st_spider_db_request_key *request_key,
2370   int *error_num
2371 ) {
2372   spider_db_mbase_result *result;
2373   DBUG_ENTER("spider_db_mbase::use_result");
2374   DBUG_PRINT("info",("spider this=%p", this));
2375   if ((result = new spider_db_mbase_result(this)))
2376   {
2377     *error_num = 0;
2378     if (
2379       spider_param_dry_access() ||
2380       !(result->db_result = db_conn->methods->use_result(db_conn))
2381     ) {
2382       delete result;
2383       result = NULL;
2384     } else {
2385       result->first_row = NULL;
2386     }
2387   } else {
2388     *error_num = HA_ERR_OUT_OF_MEM;
2389   }
2390   DBUG_RETURN(result);
2391 }
2392 
next_result()2393 int spider_db_mbase::next_result()
2394 {
2395   int status;
2396   DBUG_ENTER("spider_db_mbase::next_result");
2397   DBUG_PRINT("info",("spider this=%p", this));
2398   if (db_conn->status != MYSQL_STATUS_READY)
2399   {
2400     my_message(ER_SPIDER_UNKNOWN_NUM, ER_SPIDER_UNKNOWN_STR, MYF(0));
2401     DBUG_RETURN(ER_SPIDER_UNKNOWN_NUM);
2402   }
2403 
2404   db_conn->net.last_errno = 0;
2405   db_conn->net.last_error[0] = '\0';
2406   strmov(db_conn->net.sqlstate, "00000");
2407   db_conn->affected_rows = ~(my_ulonglong) 0;
2408 
2409 #if MYSQL_VERSION_ID < 50500
2410   if (db_conn->last_used_con->server_status & SERVER_MORE_RESULTS_EXISTS)
2411 #else
2412   if (db_conn->server_status & SERVER_MORE_RESULTS_EXISTS)
2413 #endif
2414   {
2415     if ((status = db_conn->methods->read_query_result(db_conn)) > 0)
2416       DBUG_RETURN(spider_db_errorno(conn));
2417     DBUG_RETURN(status);
2418   }
2419   DBUG_RETURN(-1);
2420 }
2421 
affected_rows()2422 uint spider_db_mbase::affected_rows()
2423 {
2424   MYSQL *last_used_con;
2425   DBUG_ENTER("spider_db_mbase::affected_rows");
2426   DBUG_PRINT("info",("spider this=%p", this));
2427 #if MYSQL_VERSION_ID < 50500
2428   last_used_con = db_conn->last_used_con;
2429 #else
2430   last_used_con = db_conn;
2431 #endif
2432   DBUG_RETURN((uint) last_used_con->affected_rows);
2433 }
2434 
matched_rows()2435 uint spider_db_mbase::matched_rows()
2436 {
2437   MYSQL *last_used_con;
2438   DBUG_ENTER("spider_db_mysql::matched_rows");
2439   DBUG_PRINT("info", ("spider this=%p", this));
2440 #if MYSQL_VERSION_ID < 50500
2441   last_used_con = db_conn->last_used_con;
2442 #else
2443   last_used_con = db_conn;
2444 #endif
2445   /* Rows matched: 65 Changed: 65 Warnings: 0 */
2446   const char *info = last_used_con->info;
2447   if (!info)
2448     DBUG_RETURN(0);
2449   DBUG_PRINT("info", ("spider info=%s", info));
2450   const char *begin = strstr(info, "Rows matched: ");
2451   if (!begin)
2452     DBUG_RETURN(0);
2453   DBUG_RETURN(atoi(begin + strlen("Rows matched: ")));
2454 }
2455 
inserted_info(spider_db_handler * handler,ha_copy_info * copy_info)2456 bool spider_db_mbase::inserted_info(
2457   spider_db_handler *handler,
2458   ha_copy_info *copy_info
2459 ) {
2460   MYSQL *last_used_con;
2461   uchar direct_insert_kind =
2462     ((spider_mbase_handler *) handler)->direct_insert_kind;
2463   DBUG_ENTER("spider_db_mysql::inserted_info");
2464   DBUG_PRINT("info", ("spider this=%p", this));
2465   if (direct_insert_kind == SPIDER_SQL_DIRECT_INSERT_KIND_INSERT)
2466   {
2467     DBUG_RETURN(TRUE);
2468   }
2469 #if MYSQL_VERSION_ID < 50500
2470   last_used_con = db_conn->last_used_con;
2471 #else
2472   last_used_con = db_conn;
2473 #endif
2474   /* Records: 10  Duplicates: 4  Warnings: 0 */
2475   const char *info = last_used_con->info;
2476   if (!info)
2477     DBUG_RETURN(FALSE);
2478   DBUG_PRINT("info", ("spider info=%s", info));
2479   const char *begin = strstr(info, "Records: ");
2480   if (!begin)
2481     DBUG_RETURN(FALSE);
2482   begin += strlen("Records: ");
2483   uint records = atoi(begin);
2484   begin = strstr(begin, "Duplicates: ");
2485   if (!begin)
2486     DBUG_RETURN(FALSE);
2487   uint duplicates = atoi(begin + strlen("Duplicates: "));
2488   copy_info->records+= records;
2489   switch (direct_insert_kind)
2490   {
2491     case SPIDER_SQL_DIRECT_INSERT_KIND_IGNORE:
2492       copy_info->copied+= duplicates;
2493       break;
2494     case SPIDER_SQL_DIRECT_INSERT_KIND_REPLACE:
2495       copy_info->copied+= records;
2496       copy_info->deleted+= duplicates;
2497       break;
2498     case SPIDER_SQL_DIRECT_INSERT_KIND_DUP_UPDATE:
2499       copy_info->touched+= (last_used_con->affected_rows - (duplicates * 2));
2500       copy_info->copied+= (last_used_con->affected_rows - duplicates);
2501       copy_info->updated+= duplicates;
2502       break;
2503     default:
2504       DBUG_ASSERT(0);
2505       DBUG_RETURN(FALSE);
2506   }
2507   DBUG_RETURN(TRUE);
2508 }
2509 
last_insert_id()2510 ulonglong spider_db_mbase::last_insert_id()
2511 {
2512   MYSQL *last_used_con;
2513   DBUG_ENTER("spider_db_mbase::last_insert_id");
2514   DBUG_PRINT("info",("spider this=%p", this));
2515 #if MYSQL_VERSION_ID < 50500
2516   last_used_con = db_conn->last_used_con;
2517 #else
2518   last_used_con = db_conn;
2519 #endif
2520   DBUG_RETURN((uint) last_used_con->insert_id);
2521 }
2522 
set_character_set(const char * csname)2523 int spider_db_mbase::set_character_set(
2524   const char *csname
2525 ) {
2526   DBUG_ENTER("spider_db_mbase::set_character_set");
2527   DBUG_PRINT("info",("spider this=%p", this));
2528   if (spider_param_dry_access())
2529     DBUG_RETURN(0);
2530   DBUG_RETURN(mysql_set_character_set(db_conn, csname));
2531 }
2532 
select_db(const char * dbname)2533 int spider_db_mbase::select_db(
2534   const char *dbname
2535 ) {
2536   DBUG_ENTER("spider_db_mbase::select_db");
2537   DBUG_PRINT("info",("spider this=%p", this));
2538   if (spider_param_dry_access())
2539     DBUG_RETURN(0);
2540   DBUG_RETURN(mysql_select_db(db_conn, dbname));
2541 }
2542 
consistent_snapshot(int * need_mon)2543 int spider_db_mbase::consistent_snapshot(
2544   int *need_mon
2545 ) {
2546   DBUG_ENTER("spider_db_mbase::consistent_snapshot");
2547   DBUG_PRINT("info",("spider this=%p", this));
2548   pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
2549   pthread_mutex_lock(&conn->mta_conn_mutex);
2550   SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
2551   conn->need_mon = need_mon;
2552   DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
2553   DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
2554   conn->mta_conn_mutex_lock_already = TRUE;
2555   conn->mta_conn_mutex_unlock_later = TRUE;
2556   if (spider_db_query(
2557     conn,
2558     SPIDER_SQL_START_CONSISTENT_SNAPSHOT_STR,
2559     SPIDER_SQL_START_CONSISTENT_SNAPSHOT_LEN,
2560     -1,
2561     need_mon)
2562   ) {
2563     DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
2564     DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2565     conn->mta_conn_mutex_lock_already = FALSE;
2566     conn->mta_conn_mutex_unlock_later = FALSE;
2567     DBUG_RETURN(spider_db_errorno(conn));
2568   }
2569   DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
2570   DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2571   conn->mta_conn_mutex_lock_already = FALSE;
2572   conn->mta_conn_mutex_unlock_later = FALSE;
2573   SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
2574   pthread_mutex_unlock(&conn->mta_conn_mutex);
2575   DBUG_RETURN(0);
2576 }
2577 
trx_start_in_bulk_sql()2578 bool spider_db_mbase::trx_start_in_bulk_sql()
2579 {
2580   DBUG_ENTER("spider_db_mbase::trx_start_in_bulk_sql");
2581   DBUG_PRINT("info",("spider this=%p", this));
2582   DBUG_RETURN(TRUE);
2583 }
2584 
start_transaction(int * need_mon)2585 int spider_db_mbase::start_transaction(
2586   int *need_mon
2587 ) {
2588   DBUG_ENTER("spider_db_mbase::start_transaction");
2589   DBUG_PRINT("info",("spider this=%p", this));
2590   pthread_mutex_assert_owner(&conn->mta_conn_mutex);
2591   DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
2592   DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2593   if (spider_db_query(
2594     conn,
2595     SPIDER_SQL_START_TRANSACTION_STR,
2596     SPIDER_SQL_START_TRANSACTION_LEN,
2597     -1,
2598     need_mon)
2599   ) {
2600     DBUG_RETURN(spider_db_errorno(conn));
2601   }
2602   DBUG_RETURN(0);
2603 }
2604 
commit(int * need_mon)2605 int spider_db_mbase::commit(
2606   int *need_mon
2607 ) {
2608   DBUG_ENTER("spider_db_mbase::commit");
2609   DBUG_PRINT("info",("spider this=%p", this));
2610   pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
2611   pthread_mutex_lock(&conn->mta_conn_mutex);
2612   SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
2613   conn->need_mon = need_mon;
2614   DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
2615   DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
2616   conn->mta_conn_mutex_lock_already = TRUE;
2617   conn->mta_conn_mutex_unlock_later = TRUE;
2618   if (spider_db_query(
2619     conn,
2620     SPIDER_SQL_COMMIT_STR,
2621     SPIDER_SQL_COMMIT_LEN,
2622     -1,
2623     need_mon)
2624   ) {
2625     DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
2626     DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2627     conn->mta_conn_mutex_lock_already = FALSE;
2628     conn->mta_conn_mutex_unlock_later = FALSE;
2629     DBUG_RETURN(spider_db_errorno(conn));
2630   }
2631   DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
2632   DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2633   conn->mta_conn_mutex_lock_already = FALSE;
2634   conn->mta_conn_mutex_unlock_later = FALSE;
2635   SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
2636   pthread_mutex_unlock(&conn->mta_conn_mutex);
2637   DBUG_RETURN(0);
2638 }
2639 
rollback(int * need_mon)2640 int spider_db_mbase::rollback(
2641   int *need_mon
2642 ) {
2643   bool is_error;
2644   int error_num;
2645   DBUG_ENTER("spider_db_mbase::rollback");
2646   DBUG_PRINT("info",("spider this=%p", this));
2647   pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
2648   pthread_mutex_lock(&conn->mta_conn_mutex);
2649   SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
2650   conn->need_mon = need_mon;
2651   DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
2652   DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
2653   conn->mta_conn_mutex_lock_already = TRUE;
2654   conn->mta_conn_mutex_unlock_later = TRUE;
2655   if (spider_db_query(
2656     conn,
2657     SPIDER_SQL_ROLLBACK_STR,
2658     SPIDER_SQL_ROLLBACK_LEN,
2659     -1,
2660     need_mon)
2661   ) {
2662     is_error = conn->thd->is_error();
2663     error_num = spider_db_errorno(conn);
2664     if (
2665       error_num == ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM &&
2666       !is_error
2667     )
2668       conn->thd->clear_error();
2669     else {
2670       DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
2671       DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2672       conn->mta_conn_mutex_lock_already = FALSE;
2673       conn->mta_conn_mutex_unlock_later = FALSE;
2674       SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
2675       pthread_mutex_unlock(&conn->mta_conn_mutex);
2676       DBUG_RETURN(error_num);
2677     }
2678   }
2679   DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
2680   DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2681   conn->mta_conn_mutex_lock_already = FALSE;
2682   conn->mta_conn_mutex_unlock_later = FALSE;
2683   SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
2684   pthread_mutex_unlock(&conn->mta_conn_mutex);
2685   DBUG_RETURN(0);
2686 }
2687 
xa_start(XID * xid,int * need_mon)2688 int spider_db_mbase::xa_start(
2689   XID *xid,
2690   int *need_mon
2691 ) {
2692   DBUG_ENTER("spider_db_mbase::xa_start");
2693   DBUG_PRINT("info",("spider this=%p", this));
2694   DBUG_ASSERT(0);
2695   DBUG_RETURN(0);
2696 }
2697 
xa_start_in_bulk_sql()2698 bool spider_db_mbase::xa_start_in_bulk_sql()
2699 {
2700   DBUG_ENTER("spider_db_mbase::xa_start_in_bulk_sql");
2701   DBUG_PRINT("info",("spider this=%p", this));
2702   DBUG_RETURN(TRUE);
2703 }
2704 
xa_end(XID * xid,int * need_mon)2705 int spider_db_mbase::xa_end(
2706   XID *xid,
2707   int *need_mon
2708 ) {
2709   char sql_buf[SPIDER_SQL_XA_END_LEN + XIDDATASIZE + sizeof(long) + 9];
2710   spider_string sql_str(sql_buf, sizeof(sql_buf), &my_charset_bin);
2711   DBUG_ENTER("spider_db_mbase::xa_end");
2712   DBUG_PRINT("info",("spider this=%p", this));
2713   sql_str.init_calc_mem(108);
2714 
2715   sql_str.length(0);
2716   sql_str.q_append(SPIDER_SQL_XA_END_STR, SPIDER_SQL_XA_END_LEN);
2717   spider_db_append_xid_str(&sql_str, xid);
2718   pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
2719   pthread_mutex_lock(&conn->mta_conn_mutex);
2720   SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
2721   conn->need_mon = need_mon;
2722   DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
2723   DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
2724   conn->mta_conn_mutex_lock_already = TRUE;
2725   conn->mta_conn_mutex_unlock_later = TRUE;
2726   if (spider_db_query(
2727     conn,
2728     sql_str.ptr(),
2729     sql_str.length(),
2730     -1,
2731     need_mon)
2732   ) {
2733     DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
2734     DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2735     conn->mta_conn_mutex_lock_already = FALSE;
2736     conn->mta_conn_mutex_unlock_later = FALSE;
2737     DBUG_RETURN(spider_db_errorno(conn));
2738   }
2739   DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
2740   DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2741   conn->mta_conn_mutex_lock_already = FALSE;
2742   conn->mta_conn_mutex_unlock_later = FALSE;
2743   SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
2744   pthread_mutex_unlock(&conn->mta_conn_mutex);
2745   DBUG_RETURN(0);
2746 }
2747 
xa_prepare(XID * xid,int * need_mon)2748 int spider_db_mbase::xa_prepare(
2749   XID *xid,
2750   int *need_mon
2751 ) {
2752   char sql_buf[SPIDER_SQL_XA_PREPARE_LEN + XIDDATASIZE + sizeof(long) + 9];
2753   spider_string sql_str(sql_buf, sizeof(sql_buf), &my_charset_bin);
2754   DBUG_ENTER("spider_db_mbase::xa_prepare");
2755   DBUG_PRINT("info",("spider this=%p", this));
2756   sql_str.init_calc_mem(109);
2757 
2758   sql_str.length(0);
2759   sql_str.q_append(SPIDER_SQL_XA_PREPARE_STR, SPIDER_SQL_XA_PREPARE_LEN);
2760   spider_db_append_xid_str(&sql_str, xid);
2761   pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
2762   pthread_mutex_lock(&conn->mta_conn_mutex);
2763   SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
2764   conn->need_mon = need_mon;
2765   DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
2766   DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
2767   conn->mta_conn_mutex_lock_already = TRUE;
2768   conn->mta_conn_mutex_unlock_later = TRUE;
2769   if (spider_db_query(
2770     conn,
2771     sql_str.ptr(),
2772     sql_str.length(),
2773     -1,
2774     need_mon)
2775   ) {
2776     DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
2777     DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2778     conn->mta_conn_mutex_lock_already = FALSE;
2779     conn->mta_conn_mutex_unlock_later = FALSE;
2780     DBUG_RETURN(spider_db_errorno(conn));
2781   }
2782   DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
2783   DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2784   conn->mta_conn_mutex_lock_already = FALSE;
2785   conn->mta_conn_mutex_unlock_later = FALSE;
2786   SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
2787   pthread_mutex_unlock(&conn->mta_conn_mutex);
2788   DBUG_RETURN(0);
2789 }
2790 
xa_commit(XID * xid,int * need_mon)2791 int spider_db_mbase::xa_commit(
2792   XID *xid,
2793   int *need_mon
2794 ) {
2795   char sql_buf[SPIDER_SQL_XA_COMMIT_LEN + XIDDATASIZE + sizeof(long) + 9];
2796   spider_string sql_str(sql_buf, sizeof(sql_buf), &my_charset_bin);
2797   DBUG_ENTER("spider_db_mbase::xa_commit");
2798   DBUG_PRINT("info",("spider this=%p", this));
2799   sql_str.init_calc_mem(110);
2800 
2801   sql_str.length(0);
2802   sql_str.q_append(SPIDER_SQL_XA_COMMIT_STR, SPIDER_SQL_XA_COMMIT_LEN);
2803   spider_db_append_xid_str(&sql_str, xid);
2804   pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
2805   pthread_mutex_lock(&conn->mta_conn_mutex);
2806   SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
2807   conn->need_mon = need_mon;
2808   DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
2809   DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
2810   conn->mta_conn_mutex_lock_already = TRUE;
2811   conn->mta_conn_mutex_unlock_later = TRUE;
2812   if (spider_db_query(
2813     conn,
2814     sql_str.ptr(),
2815     sql_str.length(),
2816     -1,
2817     need_mon)
2818   ) {
2819     DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
2820     DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2821     conn->mta_conn_mutex_lock_already = FALSE;
2822     conn->mta_conn_mutex_unlock_later = FALSE;
2823     DBUG_RETURN(spider_db_errorno(conn));
2824   }
2825   DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
2826   DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2827   conn->mta_conn_mutex_lock_already = FALSE;
2828   conn->mta_conn_mutex_unlock_later = FALSE;
2829   SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
2830   pthread_mutex_unlock(&conn->mta_conn_mutex);
2831   DBUG_RETURN(0);
2832 }
2833 
xa_rollback(XID * xid,int * need_mon)2834 int spider_db_mbase::xa_rollback(
2835   XID *xid,
2836   int *need_mon
2837 ) {
2838   char sql_buf[SPIDER_SQL_XA_ROLLBACK_LEN + XIDDATASIZE + sizeof(long) + 9];
2839   spider_string sql_str(sql_buf, sizeof(sql_buf), &my_charset_bin);
2840   DBUG_ENTER("spider_db_mbase::xa_rollback");
2841   DBUG_PRINT("info",("spider this=%p", this));
2842   sql_str.init_calc_mem(111);
2843 
2844   sql_str.length(0);
2845   sql_str.q_append(SPIDER_SQL_XA_ROLLBACK_STR, SPIDER_SQL_XA_ROLLBACK_LEN);
2846   spider_db_append_xid_str(&sql_str, xid);
2847   pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
2848   pthread_mutex_lock(&conn->mta_conn_mutex);
2849   SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
2850   conn->need_mon = need_mon;
2851   DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
2852   DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
2853   conn->mta_conn_mutex_lock_already = TRUE;
2854   conn->mta_conn_mutex_unlock_later = TRUE;
2855   if (spider_db_query(
2856     conn,
2857     sql_str.ptr(),
2858     sql_str.length(),
2859     -1,
2860     need_mon)
2861   ) {
2862     DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
2863     DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2864     conn->mta_conn_mutex_lock_already = FALSE;
2865     conn->mta_conn_mutex_unlock_later = FALSE;
2866     DBUG_RETURN(spider_db_errorno(conn));
2867   }
2868   DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
2869   DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2870   conn->mta_conn_mutex_lock_already = FALSE;
2871   conn->mta_conn_mutex_unlock_later = FALSE;
2872   SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
2873   pthread_mutex_unlock(&conn->mta_conn_mutex);
2874   DBUG_RETURN(0);
2875 }
2876 
set_trx_isolation_in_bulk_sql()2877 bool spider_db_mbase::set_trx_isolation_in_bulk_sql()
2878 {
2879   DBUG_ENTER("spider_db_mbase::set_trx_isolation_in_bulk_sql");
2880   DBUG_PRINT("info",("spider this=%p", this));
2881   DBUG_RETURN(TRUE);
2882 }
2883 
set_trx_isolation(int trx_isolation,int * need_mon)2884 int spider_db_mbase::set_trx_isolation(
2885   int trx_isolation,
2886   int *need_mon
2887 ) {
2888   DBUG_ENTER("spider_db_mbase::set_trx_isolation");
2889   DBUG_PRINT("info",("spider this=%p", this));
2890   switch (trx_isolation)
2891   {
2892     case ISO_READ_UNCOMMITTED:
2893       pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
2894       pthread_mutex_lock(&conn->mta_conn_mutex);
2895       SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
2896       conn->need_mon = need_mon;
2897       DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
2898       DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
2899       conn->mta_conn_mutex_lock_already = TRUE;
2900       conn->mta_conn_mutex_unlock_later = TRUE;
2901       if (spider_db_query(
2902         conn,
2903         SPIDER_SQL_ISO_READ_UNCOMMITTED_STR,
2904         SPIDER_SQL_ISO_READ_UNCOMMITTED_LEN,
2905         -1,
2906         need_mon)
2907       ) {
2908         DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
2909         DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2910         conn->mta_conn_mutex_lock_already = FALSE;
2911         conn->mta_conn_mutex_unlock_later = FALSE;
2912         DBUG_RETURN(spider_db_errorno(conn));
2913       }
2914       DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
2915       DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2916       conn->mta_conn_mutex_lock_already = FALSE;
2917       conn->mta_conn_mutex_unlock_later = FALSE;
2918       SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
2919       pthread_mutex_unlock(&conn->mta_conn_mutex);
2920       break;
2921     case ISO_READ_COMMITTED:
2922       pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
2923       pthread_mutex_lock(&conn->mta_conn_mutex);
2924       SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
2925       conn->need_mon = need_mon;
2926       DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
2927       DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
2928       conn->mta_conn_mutex_lock_already = TRUE;
2929       conn->mta_conn_mutex_unlock_later = TRUE;
2930       if (spider_db_query(
2931         conn,
2932         SPIDER_SQL_ISO_READ_COMMITTED_STR,
2933         SPIDER_SQL_ISO_READ_COMMITTED_LEN,
2934         -1,
2935         need_mon)
2936       ) {
2937         DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
2938         DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2939         conn->mta_conn_mutex_lock_already = FALSE;
2940         conn->mta_conn_mutex_unlock_later = FALSE;
2941         DBUG_RETURN(spider_db_errorno(conn));
2942       }
2943       DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
2944       DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2945       conn->mta_conn_mutex_lock_already = FALSE;
2946       conn->mta_conn_mutex_unlock_later = FALSE;
2947       SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
2948       pthread_mutex_unlock(&conn->mta_conn_mutex);
2949       break;
2950     case ISO_REPEATABLE_READ:
2951       pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
2952       pthread_mutex_lock(&conn->mta_conn_mutex);
2953       SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
2954       conn->need_mon = need_mon;
2955       DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
2956       DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
2957       conn->mta_conn_mutex_lock_already = TRUE;
2958       conn->mta_conn_mutex_unlock_later = TRUE;
2959       if (spider_db_query(
2960         conn,
2961         SPIDER_SQL_ISO_REPEATABLE_READ_STR,
2962         SPIDER_SQL_ISO_REPEATABLE_READ_LEN,
2963         -1,
2964         need_mon)
2965       ) {
2966         DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
2967         DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2968         conn->mta_conn_mutex_lock_already = FALSE;
2969         conn->mta_conn_mutex_unlock_later = FALSE;
2970         DBUG_RETURN(spider_db_errorno(conn));
2971       }
2972       DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
2973       DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2974       conn->mta_conn_mutex_lock_already = FALSE;
2975       conn->mta_conn_mutex_unlock_later = FALSE;
2976       SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
2977       pthread_mutex_unlock(&conn->mta_conn_mutex);
2978       break;
2979     case ISO_SERIALIZABLE:
2980       pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
2981       pthread_mutex_lock(&conn->mta_conn_mutex);
2982       SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
2983       conn->need_mon = need_mon;
2984       DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
2985       DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
2986       conn->mta_conn_mutex_lock_already = TRUE;
2987       conn->mta_conn_mutex_unlock_later = TRUE;
2988       if (spider_db_query(
2989         conn,
2990         SPIDER_SQL_ISO_SERIALIZABLE_STR,
2991         SPIDER_SQL_ISO_SERIALIZABLE_LEN,
2992         -1,
2993         need_mon)
2994       ) {
2995         DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
2996         DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2997         conn->mta_conn_mutex_lock_already = FALSE;
2998         conn->mta_conn_mutex_unlock_later = FALSE;
2999         DBUG_RETURN(spider_db_errorno(conn));
3000       }
3001       DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
3002       DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
3003       conn->mta_conn_mutex_lock_already = FALSE;
3004       conn->mta_conn_mutex_unlock_later = FALSE;
3005       SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
3006       pthread_mutex_unlock(&conn->mta_conn_mutex);
3007       break;
3008     default:
3009       DBUG_RETURN(HA_ERR_UNSUPPORTED);
3010   }
3011   DBUG_RETURN(0);
3012 }
3013 
set_autocommit_in_bulk_sql()3014 bool spider_db_mbase::set_autocommit_in_bulk_sql()
3015 {
3016   DBUG_ENTER("spider_db_mbase::set_autocommit_in_bulk_sql");
3017   DBUG_PRINT("info",("spider this=%p", this));
3018   DBUG_RETURN(TRUE);
3019 }
3020 
set_autocommit(bool autocommit,int * need_mon)3021 int spider_db_mbase::set_autocommit(
3022   bool autocommit,
3023   int *need_mon
3024 ) {
3025   DBUG_ENTER("spider_db_mbase::set_autocommit");
3026   DBUG_PRINT("info",("spider this=%p", this));
3027   if (autocommit)
3028   {
3029     pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
3030     pthread_mutex_lock(&conn->mta_conn_mutex);
3031     SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
3032     conn->need_mon = need_mon;
3033     DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
3034     DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
3035     conn->mta_conn_mutex_lock_already = TRUE;
3036     conn->mta_conn_mutex_unlock_later = TRUE;
3037     if (spider_db_query(
3038       conn,
3039       SPIDER_SQL_AUTOCOMMIT_ON_STR,
3040       SPIDER_SQL_AUTOCOMMIT_ON_LEN,
3041       -1,
3042       need_mon)
3043     ) {
3044       DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
3045       DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
3046       conn->mta_conn_mutex_lock_already = FALSE;
3047       conn->mta_conn_mutex_unlock_later = FALSE;
3048       DBUG_RETURN(spider_db_errorno(conn));
3049     }
3050     DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
3051     DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
3052     conn->mta_conn_mutex_lock_already = FALSE;
3053     conn->mta_conn_mutex_unlock_later = FALSE;
3054     SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
3055     pthread_mutex_unlock(&conn->mta_conn_mutex);
3056   } else {
3057     pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
3058     pthread_mutex_lock(&conn->mta_conn_mutex);
3059     SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
3060     conn->need_mon = need_mon;
3061     DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
3062     DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
3063     conn->mta_conn_mutex_lock_already = TRUE;
3064     conn->mta_conn_mutex_unlock_later = TRUE;
3065     if (spider_db_query(
3066       conn,
3067       SPIDER_SQL_AUTOCOMMIT_OFF_STR,
3068       SPIDER_SQL_AUTOCOMMIT_OFF_LEN,
3069       -1,
3070       need_mon)
3071     ) {
3072       DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
3073       DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
3074       conn->mta_conn_mutex_lock_already = FALSE;
3075       conn->mta_conn_mutex_unlock_later = FALSE;
3076       DBUG_RETURN(spider_db_errorno(conn));
3077     }
3078     DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
3079     DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
3080     conn->mta_conn_mutex_lock_already = FALSE;
3081     conn->mta_conn_mutex_unlock_later = FALSE;
3082     SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
3083     pthread_mutex_unlock(&conn->mta_conn_mutex);
3084   }
3085   DBUG_RETURN(0);
3086 }
3087 
set_sql_log_off_in_bulk_sql()3088 bool spider_db_mbase::set_sql_log_off_in_bulk_sql()
3089 {
3090   DBUG_ENTER("spider_db_mbase::set_sql_log_off_in_bulk_sql");
3091   DBUG_PRINT("info",("spider this=%p", this));
3092   DBUG_RETURN(TRUE);
3093 }
3094 
set_sql_log_off(bool sql_log_off,int * need_mon)3095 int spider_db_mbase::set_sql_log_off(
3096   bool sql_log_off,
3097   int *need_mon
3098 ) {
3099   DBUG_ENTER("spider_db_mbase::set_sql_log_off");
3100   DBUG_PRINT("info",("spider this=%p", this));
3101   if (sql_log_off)
3102   {
3103     pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
3104     pthread_mutex_lock(&conn->mta_conn_mutex);
3105     SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
3106     conn->need_mon = need_mon;
3107     DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
3108     DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
3109     conn->mta_conn_mutex_lock_already = TRUE;
3110     conn->mta_conn_mutex_unlock_later = TRUE;
3111     if (spider_db_query(
3112       conn,
3113       SPIDER_SQL_SQL_LOG_ON_STR,
3114       SPIDER_SQL_SQL_LOG_ON_LEN,
3115       -1,
3116       need_mon)
3117     ) {
3118       DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
3119       DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
3120       conn->mta_conn_mutex_lock_already = FALSE;
3121       conn->mta_conn_mutex_unlock_later = FALSE;
3122       DBUG_RETURN(spider_db_errorno(conn));
3123     }
3124     DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
3125     DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
3126     conn->mta_conn_mutex_lock_already = FALSE;
3127     conn->mta_conn_mutex_unlock_later = FALSE;
3128     SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
3129     pthread_mutex_unlock(&conn->mta_conn_mutex);
3130   } else {
3131     pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
3132     pthread_mutex_lock(&conn->mta_conn_mutex);
3133     SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
3134     conn->need_mon = need_mon;
3135     DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
3136     DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
3137     conn->mta_conn_mutex_lock_already = TRUE;
3138     conn->mta_conn_mutex_unlock_later = TRUE;
3139     if (spider_db_query(
3140       conn,
3141       SPIDER_SQL_SQL_LOG_OFF_STR,
3142       SPIDER_SQL_SQL_LOG_OFF_LEN,
3143       -1,
3144       need_mon)
3145     ) {
3146       DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
3147       DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
3148       conn->mta_conn_mutex_lock_already = FALSE;
3149       conn->mta_conn_mutex_unlock_later = FALSE;
3150       DBUG_RETURN(spider_db_errorno(conn));
3151     }
3152     DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
3153     DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
3154     conn->mta_conn_mutex_lock_already = FALSE;
3155     conn->mta_conn_mutex_unlock_later = FALSE;
3156     SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
3157     pthread_mutex_unlock(&conn->mta_conn_mutex);
3158   }
3159   DBUG_RETURN(0);
3160 }
3161 
set_wait_timeout_in_bulk_sql()3162 bool spider_db_mbase::set_wait_timeout_in_bulk_sql()
3163 {
3164   DBUG_ENTER("spider_db_mbase::set_wait_timeout_in_bulk_sql");
3165   DBUG_PRINT("info",("spider this=%p", this));
3166   DBUG_RETURN(TRUE);
3167 }
3168 
set_wait_timeout(int wait_timeout,int * need_mon)3169 int spider_db_mbase::set_wait_timeout(
3170   int wait_timeout,
3171   int *need_mon
3172 ) {
3173   char sql_buf[MAX_FIELD_WIDTH];
3174   char timeout_str[SPIDER_SQL_INT_LEN];
3175   int timeout_str_length;
3176   spider_string sql_str(sql_buf, sizeof(sql_buf), &my_charset_bin);
3177   DBUG_ENTER("spider_db_mbase::set_wait_timeout");
3178   DBUG_PRINT("info",("spider this=%p", this));
3179   sql_str.init_calc_mem(264);
3180   sql_str.length(0);
3181   timeout_str_length =
3182     my_sprintf(timeout_str, (timeout_str, "%d", wait_timeout));
3183   if (sql_str.reserve(SPIDER_SQL_WAIT_TIMEOUT_LEN + timeout_str_length))
3184     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
3185   sql_str.q_append(SPIDER_SQL_WAIT_TIMEOUT_STR, SPIDER_SQL_WAIT_TIMEOUT_LEN);
3186   sql_str.q_append(timeout_str, timeout_str_length);
3187   pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
3188   pthread_mutex_lock(&conn->mta_conn_mutex);
3189   SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
3190   conn->need_mon = need_mon;
3191   DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
3192   DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
3193   conn->mta_conn_mutex_lock_already = TRUE;
3194   conn->mta_conn_mutex_unlock_later = TRUE;
3195   if (spider_db_query(
3196     conn,
3197     sql_str.ptr(),
3198     sql_str.length(),
3199     -1,
3200     need_mon)
3201   ) {
3202     DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
3203     DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
3204     conn->mta_conn_mutex_lock_already = FALSE;
3205     conn->mta_conn_mutex_unlock_later = FALSE;
3206     DBUG_RETURN(spider_db_errorno(conn));
3207   }
3208   DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
3209   DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
3210   conn->mta_conn_mutex_lock_already = FALSE;
3211   conn->mta_conn_mutex_unlock_later = FALSE;
3212   SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
3213   pthread_mutex_unlock(&conn->mta_conn_mutex);
3214   DBUG_RETURN(0);
3215 }
3216 
set_sql_mode_in_bulk_sql()3217 bool spider_db_mbase::set_sql_mode_in_bulk_sql()
3218 {
3219   DBUG_ENTER("spider_db_mbase::set_sql_mode_in_bulk_sql");
3220   DBUG_PRINT("info",("spider this=%p", this));
3221   DBUG_RETURN(TRUE);
3222 }
3223 
set_sql_mode(sql_mode_t sql_mode,int * need_mon)3224 int spider_db_mbase::set_sql_mode(
3225   sql_mode_t sql_mode,
3226   int *need_mon
3227 ) {
3228   int error_num;
3229   char sql_buf[MAX_FIELD_WIDTH];
3230   spider_string sql_str(sql_buf, sizeof(sql_buf), &my_charset_bin);
3231   DBUG_ENTER("spider_db_mbase::set_sql_mode");
3232   DBUG_PRINT("info",("spider this=%p", this));
3233   sql_str.init_calc_mem(265);
3234   sql_str.length(0);
3235   if (sql_str.reserve(SPIDER_SQL_SQL_MODE_LEN))
3236     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
3237   sql_str.q_append(SPIDER_SQL_SQL_MODE_STR, SPIDER_SQL_SQL_MODE_LEN);
3238   if ((error_num = spider_db_mbase_utility->append_sql_mode_internal(&sql_str, sql_mode)))
3239   {
3240     DBUG_RETURN(error_num);
3241   }
3242   if (sql_str.length() > SPIDER_SQL_SQL_MODE_LEN)
3243   {
3244     sql_str.length(sql_str.length() - SPIDER_SQL_COMMA_LEN);
3245   } else {
3246     if (sql_str.reserve(SPIDER_SQL_VALUE_QUOTE_LEN))
3247     {
3248       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
3249     }
3250   }
3251   sql_str.q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
3252   pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
3253   pthread_mutex_lock(&conn->mta_conn_mutex);
3254   SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
3255   conn->need_mon = need_mon;
3256   DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
3257   DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
3258   conn->mta_conn_mutex_lock_already = TRUE;
3259   conn->mta_conn_mutex_unlock_later = TRUE;
3260   if (spider_db_query(
3261     conn,
3262     sql_str.ptr(),
3263     sql_str.length(),
3264     -1,
3265     need_mon)
3266   ) {
3267     DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
3268     DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
3269     conn->mta_conn_mutex_lock_already = FALSE;
3270     conn->mta_conn_mutex_unlock_later = FALSE;
3271     DBUG_RETURN(spider_db_errorno(conn));
3272   }
3273   DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
3274   DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
3275   conn->mta_conn_mutex_lock_already = FALSE;
3276   conn->mta_conn_mutex_unlock_later = FALSE;
3277   SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
3278   pthread_mutex_unlock(&conn->mta_conn_mutex);
3279   DBUG_RETURN(0);
3280 }
3281 
set_time_zone_in_bulk_sql()3282 bool spider_db_mbase::set_time_zone_in_bulk_sql()
3283 {
3284   DBUG_ENTER("spider_db_mbase::set_time_zone_in_bulk_sql");
3285   DBUG_PRINT("info",("spider this=%p", this));
3286   DBUG_RETURN(TRUE);
3287 }
3288 
set_time_zone(Time_zone * time_zone,int * need_mon)3289 int spider_db_mbase::set_time_zone(
3290   Time_zone *time_zone,
3291   int *need_mon
3292 ) {
3293   const String *tz_str = time_zone->get_name();
3294   char sql_buf[MAX_FIELD_WIDTH];
3295   spider_string sql_str(sql_buf, sizeof(sql_buf), &my_charset_bin);
3296   DBUG_ENTER("spider_db_mbase::set_time_zone");
3297   DBUG_PRINT("info",("spider this=%p", this));
3298   sql_str.init_calc_mem(214);
3299   sql_str.length(0);
3300   if (sql_str.reserve(SPIDER_SQL_TIME_ZONE_LEN +
3301     tz_str->length() + SPIDER_SQL_VALUE_QUOTE_LEN))
3302     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
3303   sql_str.q_append(SPIDER_SQL_TIME_ZONE_STR, SPIDER_SQL_TIME_ZONE_LEN);
3304   sql_str.q_append(tz_str->ptr(), tz_str->length());
3305   sql_str.q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
3306   pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
3307   pthread_mutex_lock(&conn->mta_conn_mutex);
3308   SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
3309   conn->need_mon = need_mon;
3310   DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
3311   DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
3312   conn->mta_conn_mutex_lock_already = TRUE;
3313   conn->mta_conn_mutex_unlock_later = TRUE;
3314   if (spider_db_query(
3315     conn,
3316     sql_str.ptr(),
3317     sql_str.length(),
3318     -1,
3319     need_mon)
3320   ) {
3321     DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
3322     DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
3323     conn->mta_conn_mutex_lock_already = FALSE;
3324     conn->mta_conn_mutex_unlock_later = FALSE;
3325     DBUG_RETURN(spider_db_errorno(conn));
3326   }
3327   DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
3328   DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
3329   conn->mta_conn_mutex_lock_already = FALSE;
3330   conn->mta_conn_mutex_unlock_later = FALSE;
3331   SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
3332   pthread_mutex_unlock(&conn->mta_conn_mutex);
3333   DBUG_RETURN(0);
3334 }
3335 
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)3336 int spider_db_mbase::exec_simple_sql_with_result(
3337   SPIDER_TRX *trx,
3338   SPIDER_SHARE *share,
3339   const char *sql,
3340   uint sql_length,
3341   int all_link_idx,
3342   int *need_mon,
3343   SPIDER_DB_RESULT **res
3344 ) {
3345   int error_num;
3346   DBUG_ENTER("spider_db_mbase::exec_simple_sql_with_result");
3347   pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
3348   pthread_mutex_lock(&conn->mta_conn_mutex);
3349   SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
3350   conn->need_mon = need_mon;
3351   DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
3352   DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
3353   conn->mta_conn_mutex_lock_already = TRUE;
3354   conn->mta_conn_mutex_unlock_later = TRUE;
3355   spider_conn_set_timeout_from_share(conn, all_link_idx, trx->thd,
3356     share);
3357   if (
3358     (error_num = spider_db_set_names_internal(trx, share, conn,
3359       all_link_idx, need_mon)) ||
3360     (
3361       spider_db_query(
3362         conn,
3363         sql,
3364         sql_length,
3365         -1,
3366         need_mon) &&
3367       (error_num = spider_db_errorno(conn))
3368     )
3369   ) {
3370     if (
3371       error_num == ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM &&
3372       !conn->disable_reconnect
3373     ) {
3374       /* retry */
3375       if ((error_num = spider_db_ping_internal(share, conn,
3376         all_link_idx, need_mon)))
3377       {
3378         DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
3379         DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
3380         conn->mta_conn_mutex_lock_already = FALSE;
3381         conn->mta_conn_mutex_unlock_later = FALSE;
3382         SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
3383         pthread_mutex_unlock(&conn->mta_conn_mutex);
3384         DBUG_PRINT("info", ("spider error_num=%d 1", error_num));
3385         DBUG_RETURN(error_num);
3386       }
3387       if ((error_num = spider_db_set_names_internal(trx, share, conn,
3388         all_link_idx, need_mon)))
3389       {
3390         DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
3391         DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
3392         conn->mta_conn_mutex_lock_already = FALSE;
3393         conn->mta_conn_mutex_unlock_later = FALSE;
3394         SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
3395         pthread_mutex_unlock(&conn->mta_conn_mutex);
3396         DBUG_PRINT("info", ("spider error_num=%d 2", error_num));
3397         DBUG_RETURN(error_num);
3398       }
3399       spider_conn_set_timeout_from_share(conn, all_link_idx, trx->thd,
3400         share);
3401       if (spider_db_query(
3402         conn,
3403         sql,
3404         sql_length,
3405         -1,
3406         need_mon)
3407       ) {
3408         DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
3409         DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
3410         conn->mta_conn_mutex_lock_already = FALSE;
3411         conn->mta_conn_mutex_unlock_later = FALSE;
3412         DBUG_PRINT("info", ("spider error_num=%d 3", error_num));
3413         DBUG_RETURN(spider_db_errorno(conn));
3414       }
3415     } else {
3416       DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
3417       DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
3418       conn->mta_conn_mutex_lock_already = FALSE;
3419       conn->mta_conn_mutex_unlock_later = FALSE;
3420       SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
3421       pthread_mutex_unlock(&conn->mta_conn_mutex);
3422       DBUG_PRINT("info", ("spider error_num=%d 4", error_num));
3423       DBUG_RETURN(error_num);
3424     }
3425   }
3426   if (!(*res = store_result(NULL, NULL, &error_num)))
3427   {
3428     DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
3429     DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
3430     conn->mta_conn_mutex_lock_already = FALSE;
3431     conn->mta_conn_mutex_unlock_later = FALSE;
3432     if (error_num)
3433     {
3434       SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
3435       pthread_mutex_unlock(&conn->mta_conn_mutex);
3436       DBUG_PRINT("info", ("spider error_num=%d 5", error_num));
3437       DBUG_RETURN(error_num);
3438     }
3439     else if ((error_num = spider_db_errorno(conn)))
3440     {
3441       DBUG_PRINT("info", ("spider error_num=%d 6", error_num));
3442       DBUG_RETURN(error_num);
3443     } else {
3444       DBUG_PRINT("info", ("spider error_num=%d 7",
3445         ER_QUERY_ON_FOREIGN_DATA_SOURCE));
3446       DBUG_RETURN(ER_QUERY_ON_FOREIGN_DATA_SOURCE);
3447     }
3448   }
3449   DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
3450   DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
3451   conn->mta_conn_mutex_lock_already = FALSE;
3452   conn->mta_conn_mutex_unlock_later = FALSE;
3453   SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
3454   pthread_mutex_unlock(&conn->mta_conn_mutex);
3455   DBUG_RETURN(0);
3456 }
3457 
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)3458 int spider_db_mbase::show_master_status(
3459   SPIDER_TRX *trx,
3460   SPIDER_SHARE *share,
3461   int all_link_idx,
3462   int *need_mon,
3463   TABLE *table,
3464   spider_string *str,
3465   int mode,
3466   SPIDER_DB_RESULT **res1,
3467   SPIDER_DB_RESULT **res2
3468 ) {
3469   int error_num;
3470   const char *binlog_file_name, *binlog_pos;
3471   uint binlog_file_name_length, binlog_pos_length;
3472   DBUG_ENTER("spider_db_mbase::show_master_status");
3473   if ((error_num = exec_simple_sql_with_result(trx, share,
3474     SPIDER_SQL_SHOW_MASTER_STATUS_STR, SPIDER_SQL_SHOW_MASTER_STATUS_LEN,
3475     all_link_idx, need_mon, res1))
3476   ) {
3477     DBUG_PRINT("info", ("spider error_num=%d 1", error_num));
3478     DBUG_RETURN(error_num);
3479   }
3480 
3481   if (!(error_num = ((spider_db_mbase_result *)*res1)->fetch_show_master_status(
3482     &binlog_file_name, &binlog_pos))
3483   ) {
3484     binlog_file_name_length = strlen(binlog_file_name);
3485     binlog_pos_length = strlen(binlog_pos);
3486     spider_store_binlog_pos_binlog_file(table,
3487       binlog_file_name, binlog_file_name_length,
3488       binlog_pos, binlog_pos_length, conn->access_charset);
3489     if (mode > 0)
3490     {
3491       error_num = select_binlog_gtid_pos(
3492         trx,
3493         share,
3494         all_link_idx,
3495         need_mon,
3496         table,
3497         str,
3498         binlog_file_name,
3499         binlog_file_name_length,
3500         binlog_pos,
3501         binlog_pos_length,
3502         res2
3503       );
3504     } else {
3505       spider_store_binlog_pos_gtid(table, NULL, 0, conn->access_charset);
3506     }
3507   }
3508 /*
3509   res->free_result();
3510   delete res;
3511 */
3512   if (error_num)
3513   {
3514     DBUG_PRINT("info", ("spider error_num=%d 2", error_num));
3515     DBUG_RETURN(error_num);
3516   }
3517   DBUG_RETURN(0);
3518 }
3519 
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)3520 int spider_db_mbase::select_binlog_gtid_pos(
3521   SPIDER_TRX *trx,
3522   SPIDER_SHARE *share,
3523   int all_link_idx,
3524   int *need_mon,
3525   TABLE *table,
3526   spider_string *str,
3527   const char *binlog_file_name,
3528   uint binlog_file_name_length,
3529   const char *binlog_pos,
3530   uint binlog_pos_length,
3531   SPIDER_DB_RESULT **res
3532 ) {
3533   int error_num;
3534   size_t length;
3535   const char *gtid_pos;
3536   DBUG_ENTER("spider_db_mbase::select_binlog_gtid_pos");
3537   str->length(0);
3538   if (str->reserve(
3539     SPIDER_SQL_BINLOG_GTID_POS_LEN +
3540     SPIDER_SQL_OPEN_PAREN_LEN +
3541     SPIDER_SQL_VALUE_QUOTE_LEN +
3542     binlog_file_name_length * 2 +
3543     SPIDER_SQL_VALUE_QUOTE_LEN +
3544     SPIDER_SQL_COMMA_LEN +
3545     SPIDER_SQL_VALUE_QUOTE_LEN +
3546     binlog_pos_length * 2 +
3547     SPIDER_SQL_VALUE_QUOTE_LEN +
3548     SPIDER_SQL_CLOSE_PAREN_LEN
3549   ))
3550     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
3551   str->q_append(SPIDER_SQL_BINLOG_GTID_POS_STR,
3552     SPIDER_SQL_BINLOG_GTID_POS_LEN);
3553   str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
3554   str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
3555   length = conn->db_conn->escape_string((char *)str->ptr() + str->length(),
3556      binlog_file_name, binlog_file_name_length);
3557   str->length(str->length() + length);
3558   str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
3559   str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
3560   str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
3561   length = conn->db_conn->escape_string((char *)str->ptr() + str->length(),
3562      binlog_pos, binlog_pos_length);
3563   str->length(str->length() + length);
3564   str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
3565   str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
3566 
3567   if ((error_num = exec_simple_sql_with_result(trx, share,
3568     str->ptr(), str->length(), all_link_idx, need_mon, res)))
3569   {
3570     DBUG_PRINT("info", ("spider error_num=%d 1", error_num));
3571     DBUG_RETURN(error_num);
3572   }
3573   if (!(error_num = ((spider_db_mbase_result *)*res)->fetch_select_binlog_gtid_pos(&gtid_pos)))
3574   {
3575     spider_store_binlog_pos_gtid(table, gtid_pos, strlen(gtid_pos), conn->access_charset);
3576   }
3577 /*
3578   res->free_result();
3579   delete res;
3580 */
3581   if (error_num)
3582   {
3583     DBUG_PRINT("info", ("spider error_num=%d 2", error_num));
3584     DBUG_RETURN(error_num);
3585   }
3586   DBUG_RETURN(0);
3587 }
3588 
3589 #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
append_sql(char * sql,ulong sql_length,st_spider_db_request_key * request_key)3590 int spider_db_mbase::append_sql(
3591   char *sql,
3592   ulong sql_length,
3593   st_spider_db_request_key *request_key
3594 ) {
3595   DBUG_ENTER("spider_db_mbase::append_sql");
3596   DBUG_PRINT("info",("spider this=%p", this));
3597   DBUG_ASSERT(0);
3598   DBUG_RETURN(0);
3599 }
3600 
append_open_handler(uint handler_id,const char * db_name,const char * table_name,const char * index_name,const char * sql,st_spider_db_request_key * request_key)3601 int spider_db_mbase::append_open_handler(
3602   uint handler_id,
3603   const char *db_name,
3604   const char *table_name,
3605   const char *index_name,
3606   const char *sql,
3607   st_spider_db_request_key *request_key
3608 ) {
3609   DBUG_ENTER("spider_db_mbase::append_open_handler");
3610   DBUG_PRINT("info",("spider this=%p", this));
3611   DBUG_ASSERT(0);
3612   DBUG_RETURN(0);
3613 }
3614 
append_select(uint handler_id,spider_string * sql,SPIDER_DB_HS_STRING_REF_BUFFER * keys,int limit,int skip,st_spider_db_request_key * request_key)3615 int spider_db_mbase::append_select(
3616   uint handler_id,
3617   spider_string *sql,
3618   SPIDER_DB_HS_STRING_REF_BUFFER *keys,
3619   int limit,
3620   int skip,
3621   st_spider_db_request_key *request_key
3622 ) {
3623   DBUG_ENTER("spider_db_mbase::append_select");
3624   DBUG_PRINT("info",("spider this=%p", this));
3625   DBUG_ASSERT(0);
3626   DBUG_RETURN(0);
3627 }
3628 
append_insert(uint handler_id,SPIDER_DB_HS_STRING_REF_BUFFER * upds,st_spider_db_request_key * request_key)3629 int spider_db_mbase::append_insert(
3630   uint handler_id,
3631   SPIDER_DB_HS_STRING_REF_BUFFER *upds,
3632   st_spider_db_request_key *request_key
3633 ) {
3634   DBUG_ENTER("spider_db_mbase::append_insert");
3635   DBUG_PRINT("info",("spider this=%p", this));
3636   DBUG_ASSERT(0);
3637   DBUG_RETURN(0);
3638 }
3639 
append_update(uint handler_id,spider_string * sql,SPIDER_DB_HS_STRING_REF_BUFFER * keys,SPIDER_DB_HS_STRING_REF_BUFFER * upds,int limit,int skip,bool increment,bool decrement,st_spider_db_request_key * request_key)3640 int spider_db_mbase::append_update(
3641   uint handler_id,
3642   spider_string *sql,
3643   SPIDER_DB_HS_STRING_REF_BUFFER *keys,
3644   SPIDER_DB_HS_STRING_REF_BUFFER *upds,
3645   int limit,
3646   int skip,
3647   bool increment,
3648   bool decrement,
3649   st_spider_db_request_key *request_key
3650 ) {
3651   DBUG_ENTER("spider_db_mbase::append_update");
3652   DBUG_PRINT("info",("spider this=%p", this));
3653   DBUG_ASSERT(0);
3654   DBUG_RETURN(0);
3655 }
3656 
append_delete(uint handler_id,spider_string * sql,SPIDER_DB_HS_STRING_REF_BUFFER * keys,int limit,int skip,st_spider_db_request_key * request_key)3657 int spider_db_mbase::append_delete(
3658   uint handler_id,
3659   spider_string *sql,
3660   SPIDER_DB_HS_STRING_REF_BUFFER *keys,
3661   int limit,
3662   int skip,
3663   st_spider_db_request_key *request_key
3664 ) {
3665   DBUG_ENTER("spider_db_mbase::append_delete");
3666   DBUG_PRINT("info",("spider this=%p", this));
3667   DBUG_ASSERT(0);
3668   DBUG_RETURN(0);
3669 }
3670 
reset_request_queue()3671 void spider_db_mbase::reset_request_queue()
3672 {
3673   DBUG_ENTER("spider_db_mbase::reset_request_queue");
3674   DBUG_PRINT("info",("spider this=%p", this));
3675   DBUG_ASSERT(0);
3676   DBUG_VOID_RETURN;
3677 }
3678 #endif
3679 
escape_string(char * to,const char * from,size_t from_length)3680 size_t spider_db_mbase::escape_string(
3681   char *to,
3682   const char *from,
3683   size_t from_length
3684 ) {
3685   DBUG_ENTER("spider_db_mbase::escape_string");
3686   DBUG_PRINT("info",("spider this=%p", this));
3687   if (db_conn->server_status & SERVER_STATUS_NO_BACKSLASH_ESCAPES)
3688     DBUG_RETURN(escape_quotes_for_mysql(db_conn->charset, to, 0,
3689       from, from_length));
3690   DBUG_RETURN(escape_string_for_mysql(db_conn->charset, to, 0,
3691     from, from_length));
3692 }
3693 
have_lock_table_list()3694 bool spider_db_mbase::have_lock_table_list()
3695 {
3696   DBUG_ENTER("spider_db_mbase::have_lock_table_list");
3697   DBUG_PRINT("info",("spider this=%p", this));
3698   DBUG_RETURN(lock_table_hash.records);
3699 }
3700 
append_lock_tables(spider_string * str)3701 int spider_db_mbase::append_lock_tables(
3702   spider_string *str
3703 ) {
3704   int error_num;
3705   ha_spider *tmp_spider;
3706   int lock_type;
3707   uint conn_link_idx;
3708   int tmp_link_idx;
3709   SPIDER_LINK_FOR_HASH *tmp_link_for_hash;
3710   const char *db_name;
3711   uint db_name_length;
3712   CHARSET_INFO *db_name_charset;
3713   const char *table_name;
3714   uint table_name_length;
3715   CHARSET_INFO *table_name_charset;
3716   DBUG_ENTER("spider_db_mbase::lock_tables");
3717   DBUG_PRINT("info",("spider this=%p", this));
3718   if ((error_num = spider_db_mbase_utility->append_lock_table_head(str)))
3719   {
3720     DBUG_RETURN(error_num);
3721   }
3722   while ((tmp_link_for_hash =
3723     (SPIDER_LINK_FOR_HASH *) my_hash_element(&lock_table_hash, 0)))
3724   {
3725     tmp_spider = tmp_link_for_hash->spider;
3726     tmp_link_idx = tmp_link_for_hash->link_idx;
3727     switch (tmp_spider->lock_type)
3728     {
3729       case TL_READ:
3730         lock_type = SPIDER_DB_TABLE_LOCK_READ_LOCAL;
3731         break;
3732       case TL_READ_NO_INSERT:
3733         lock_type = SPIDER_DB_TABLE_LOCK_READ;
3734         break;
3735       case TL_WRITE_LOW_PRIORITY:
3736         lock_type = SPIDER_DB_TABLE_LOCK_LOW_PRIORITY_WRITE;
3737         break;
3738       case TL_WRITE:
3739         lock_type = SPIDER_DB_TABLE_LOCK_WRITE;
3740         break;
3741       default:
3742         // no lock
3743         DBUG_PRINT("info",("spider lock_type=%d", tmp_spider->lock_type));
3744         DBUG_RETURN(0);
3745     }
3746     conn_link_idx = tmp_spider->conn_link_idx[tmp_link_idx];
3747     spider_mbase_share *db_share = (spider_mbase_share *)
3748       tmp_spider->share->dbton_share[conn->dbton_id];
3749     if (&db_share->db_names_str[conn_link_idx])
3750     {
3751       db_name = db_share->db_names_str[conn_link_idx].ptr();
3752       db_name_length = db_share->db_names_str[conn_link_idx].length();
3753       db_name_charset = tmp_spider->share->access_charset;
3754     } else {
3755       db_name = tmp_spider->share->tgt_dbs[conn_link_idx];
3756       db_name_length = tmp_spider->share->tgt_dbs_lengths[conn_link_idx];
3757       db_name_charset = system_charset_info;
3758     }
3759     if (&db_share->table_names_str[conn_link_idx])
3760     {
3761       table_name = db_share->table_names_str[conn_link_idx].ptr();
3762       table_name_length = db_share->table_names_str[conn_link_idx].length();
3763       table_name_charset = tmp_spider->share->access_charset;
3764     } else {
3765       table_name = tmp_spider->share->tgt_table_names[conn_link_idx];
3766       table_name_length =
3767         tmp_spider->share->tgt_table_names_lengths[conn_link_idx];
3768       table_name_charset = system_charset_info;
3769     }
3770     if ((error_num = spider_db_mbase_utility->
3771       append_lock_table_body(
3772         str,
3773         db_name,
3774         db_name_length,
3775         db_name_charset,
3776         table_name,
3777         table_name_length,
3778         table_name_charset,
3779         lock_type
3780       )
3781     )) {
3782       my_hash_reset(&lock_table_hash);
3783       DBUG_RETURN(error_num);
3784     }
3785 #ifdef HASH_UPDATE_WITH_HASH_VALUE
3786     my_hash_delete_with_hash_value(&lock_table_hash,
3787       tmp_link_for_hash->db_table_str_hash_value, (uchar*) tmp_link_for_hash);
3788 #else
3789     my_hash_delete(&lock_table_hash, (uchar*) tmp_link_for_hash);
3790 #endif
3791   }
3792   if ((error_num = spider_db_mbase_utility->append_lock_table_tail(str)))
3793   {
3794     DBUG_RETURN(error_num);
3795   }
3796   DBUG_RETURN(0);
3797 }
3798 
append_unlock_tables(spider_string * str)3799 int spider_db_mbase::append_unlock_tables(
3800   spider_string *str
3801 ) {
3802   int error_num;
3803   DBUG_ENTER("spider_db_mbase::append_unlock_tables");
3804   DBUG_PRINT("info",("spider this=%p", this));
3805   if ((error_num = spider_db_mbase_utility->append_unlock_table(str)))
3806   {
3807     DBUG_RETURN(error_num);
3808   }
3809   DBUG_RETURN(0);
3810 }
3811 
get_lock_table_hash_count()3812 uint spider_db_mbase::get_lock_table_hash_count()
3813 {
3814   DBUG_ENTER("spider_db_mbase::get_lock_table_hash_count");
3815   DBUG_PRINT("info",("spider this=%p", this));
3816   DBUG_RETURN(lock_table_hash.records);
3817 }
3818 
reset_lock_table_hash()3819 void spider_db_mbase::reset_lock_table_hash()
3820 {
3821   DBUG_ENTER("spider_db_mbase::reset_lock_table_hash");
3822   DBUG_PRINT("info",("spider this=%p", this));
3823   my_hash_reset(&lock_table_hash);
3824   DBUG_VOID_RETURN;
3825 }
3826 
get_opened_handler_count()3827 uint spider_db_mbase::get_opened_handler_count()
3828 {
3829   DBUG_ENTER("spider_db_mbase::get_opened_handler_count");
3830   DBUG_PRINT("info",("spider this=%p", this));
3831   DBUG_RETURN(handler_open_array.elements);
3832 }
3833 
reset_opened_handler()3834 void spider_db_mbase::reset_opened_handler()
3835 {
3836   ha_spider *tmp_spider;
3837   int tmp_link_idx;
3838   SPIDER_LINK_FOR_HASH **tmp_link_for_hash;
3839   DBUG_ENTER("spider_db_mbase::reset_opened_handler");
3840   DBUG_PRINT("info",("spider this=%p", this));
3841   while ((tmp_link_for_hash =
3842     (SPIDER_LINK_FOR_HASH **) pop_dynamic(&handler_open_array)))
3843   {
3844     tmp_spider = (*tmp_link_for_hash)->spider;
3845     tmp_link_idx = (*tmp_link_for_hash)->link_idx;
3846     tmp_spider->clear_handler_opened(tmp_link_idx, conn->conn_kind);
3847   }
3848   DBUG_VOID_RETURN;
3849 }
3850 
set_dup_key_idx(ha_spider * spider,int link_idx)3851 void spider_db_mbase::set_dup_key_idx(
3852   ha_spider *spider,
3853   int link_idx
3854 ) {
3855   TABLE *table = spider->get_table();
3856   uint roop_count, pk_idx = table->s->primary_key;
3857   int key_name_length;
3858   int max_length = 0;
3859   const char *key_name;
3860   DBUG_ENTER("spider_db_mbase::set_dup_key_idx");
3861   DBUG_PRINT("info",("spider this=%p", this));
3862   DBUG_PRINT("info",("spider error_str=%s", conn->error_str));
3863   for (roop_count = 0; roop_count < table->s->keys; roop_count++)
3864   {
3865     if (roop_count == pk_idx)
3866     {
3867       DBUG_PRINT("info",("spider pk_idx=%u", roop_count));
3868       int all_link_idx = spider->conn_link_idx[link_idx];
3869       key_name = spider->share->tgt_pk_names[all_link_idx];
3870       key_name_length = spider->share->tgt_pk_names_lengths[all_link_idx];
3871     } else {
3872 #ifdef SPIDER_use_LEX_CSTRING_for_KEY_Field_name
3873       key_name = table->key_info[roop_count].name.str;
3874       key_name_length = table->key_info[roop_count].name.length;
3875 #else
3876       key_name = table->key_info[roop_count].name;
3877       key_name_length = strlen(key_name);
3878 #endif
3879     }
3880     DBUG_PRINT("info",("spider key_name=%s", key_name));
3881     if (
3882       max_length < key_name_length &&
3883       conn->error_length - 1 >= key_name_length &&
3884       *(conn->error_str + conn->error_length - 2 -
3885         key_name_length) == '\'' &&
3886       !strncasecmp(conn->error_str +
3887         conn->error_length - 1 - key_name_length,
3888         key_name, key_name_length)
3889     ) {
3890       max_length = key_name_length;
3891       spider->dup_key_idx = roop_count;
3892     }
3893   }
3894   if (max_length == 0)
3895     spider->dup_key_idx = (uint) -1;
3896   DBUG_PRINT("info",("spider dup_key_idx=%d", spider->dup_key_idx));
3897   DBUG_VOID_RETURN;
3898 }
3899 
cmp_request_key_to_snd(st_spider_db_request_key * request_key)3900 bool spider_db_mbase::cmp_request_key_to_snd(
3901   st_spider_db_request_key *request_key
3902 ) {
3903   DBUG_ENTER("spider_db_mbase::cmp_request_key_to_snd");
3904   DBUG_PRINT("info",("spider this=%p", this));
3905   DBUG_RETURN(TRUE);
3906 }
3907 
spider_db_mbase_util()3908 spider_db_mbase_util::spider_db_mbase_util() : spider_db_util()
3909 {
3910   DBUG_ENTER("spider_db_mbase_util::spider_db_mbase_util");
3911   DBUG_PRINT("info",("spider this=%p", this));
3912   DBUG_VOID_RETURN;
3913 }
3914 
spider_db_mysql_util()3915 spider_db_mysql_util::spider_db_mysql_util() : spider_db_mbase_util()
3916 {
3917   DBUG_ENTER("spider_db_mysql_util::spider_db_mysql_util");
3918   DBUG_PRINT("info",("spider this=%p", this));
3919   DBUG_VOID_RETURN;
3920 }
3921 
spider_db_mariadb_util()3922 spider_db_mariadb_util::spider_db_mariadb_util() : spider_db_mbase_util()
3923 {
3924   DBUG_ENTER("spider_db_mariadb_util::spider_db_mariadb_util");
3925   DBUG_PRINT("info",("spider this=%p", this));
3926   DBUG_VOID_RETURN;
3927 }
3928 
~spider_db_mbase_util()3929 spider_db_mbase_util::~spider_db_mbase_util()
3930 {
3931   DBUG_ENTER("spider_db_mbase_util::~spider_db_mbase_util");
3932   DBUG_PRINT("info",("spider this=%p", this));
3933   DBUG_VOID_RETURN;
3934 }
3935 
~spider_db_mysql_util()3936 spider_db_mysql_util::~spider_db_mysql_util()
3937 {
3938   DBUG_ENTER("spider_db_mysql_util::~spider_db_mysql_util");
3939   DBUG_PRINT("info",("spider this=%p", this));
3940   DBUG_VOID_RETURN;
3941 }
3942 
~spider_db_mariadb_util()3943 spider_db_mariadb_util::~spider_db_mariadb_util()
3944 {
3945   DBUG_ENTER("spider_db_mariadb_util::~spider_db_mariadb_util");
3946   DBUG_PRINT("info",("spider this=%p", this));
3947   DBUG_VOID_RETURN;
3948 }
3949 
append_name(spider_string * str,const char * name,uint name_length)3950 int spider_db_mbase_util::append_name(
3951   spider_string *str,
3952   const char *name,
3953   uint name_length
3954 ) {
3955   DBUG_ENTER("spider_db_mbase_util::append_name");
3956   str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
3957   str->q_append(name, name_length);
3958   str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
3959   DBUG_RETURN(0);
3960 }
3961 
append_name_with_charset(spider_string * str,const char * name,uint name_length,CHARSET_INFO * name_charset)3962 int spider_db_mbase_util::append_name_with_charset(
3963   spider_string *str,
3964   const char *name,
3965   uint name_length,
3966   CHARSET_INFO *name_charset
3967 ) {
3968   DBUG_ENTER("spider_db_mbase_util::append_name_with_charset");
3969   if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN * 2 + name_length * 2))
3970     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
3971   str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
3972   str->append(name, name_length, name_charset);
3973   if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN))
3974     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
3975   str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
3976   DBUG_RETURN(0);
3977 }
3978 
append_escaped_name(spider_string * str,const char * name,uint name_length)3979 int spider_db_mbase_util::append_escaped_name(
3980   spider_string *str,
3981   const char *name,
3982   uint name_length
3983 ) {
3984   int error_num;
3985   DBUG_ENTER("spider_db_mbase_util::append_name");
3986   if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN * 2 + name_length * 2))
3987   {
3988     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
3989   }
3990   str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
3991   if ((error_num = spider_db_append_name_with_quote_str_internal(
3992     str, name, name_length, dbton_id)))
3993   {
3994     DBUG_RETURN(error_num);
3995   }
3996   if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN))
3997   {
3998     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
3999   }
4000   str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
4001   DBUG_RETURN(0);
4002 }
4003 
append_escaped_name_with_charset(spider_string * str,const char * name,uint name_length,CHARSET_INFO * name_charset)4004 int spider_db_mbase_util::append_escaped_name_with_charset(
4005   spider_string *str,
4006   const char *name,
4007   uint name_length,
4008   CHARSET_INFO *name_charset
4009 ) {
4010   int error_num;
4011   DBUG_ENTER("spider_db_mbase_util::append_name_with_charset");
4012   if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN * 2 + name_length * 2))
4013   {
4014     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4015   }
4016   str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
4017   if ((error_num = spider_db_append_name_with_quote_str_internal(
4018     str, name, name_length, name_charset, dbton_id)))
4019   {
4020     DBUG_RETURN(error_num);
4021   }
4022   if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN))
4023   {
4024     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4025   }
4026   str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
4027   DBUG_RETURN(0);
4028 }
4029 
is_name_quote(const char head_code)4030 bool spider_db_mbase_util::is_name_quote(
4031   const char head_code
4032 ) {
4033   DBUG_ENTER("spider_db_mbase_util::is_name_quote");
4034   DBUG_RETURN(head_code == *name_quote_str);
4035 }
4036 
append_escaped_name_quote(spider_string * str)4037 int spider_db_mbase_util::append_escaped_name_quote(
4038   spider_string *str
4039 ) {
4040   DBUG_ENTER("spider_db_mbase_util::append_escaped_name_quote");
4041   if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN * 2))
4042     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4043   str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
4044   str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
4045   DBUG_RETURN(0);
4046 }
4047 
append_column_value(ha_spider * spider,spider_string * str,Field * field,const uchar * new_ptr,CHARSET_INFO * access_charset)4048 int spider_db_mariadb_util::append_column_value(
4049   ha_spider *spider,
4050   spider_string *str,
4051   Field *field,
4052   const uchar *new_ptr,
4053   CHARSET_INFO *access_charset
4054 ) {
4055   bool float_value = FALSE;
4056   int error_num;
4057   char buf[MAX_FIELD_WIDTH];
4058   spider_string tmp_str(buf, MAX_FIELD_WIDTH, field->charset());
4059   String *ptr;
4060   uint length;
4061   THD *thd = field->table->in_use;
4062   Time_zone *saved_time_zone = thd->variables.time_zone;
4063   DBUG_ENTER("spider_db_mariadb_util::append_column_value");
4064   tmp_str.init_calc_mem(113);
4065 
4066   thd->variables.time_zone = UTC;
4067 
4068   if (new_ptr)
4069   {
4070     if (
4071       field->type() == MYSQL_TYPE_BLOB ||
4072       field->real_type() == MYSQL_TYPE_VARCHAR
4073     ) {
4074       length = uint2korr(new_ptr);
4075       tmp_str.set_quick((char *) new_ptr + HA_KEY_BLOB_LENGTH, length,
4076         field->charset());
4077       ptr = tmp_str.get_str();
4078     } else if (field->type() == MYSQL_TYPE_GEOMETRY)
4079     {
4080 /*
4081       uint mlength = SIZEOF_STORED_DOUBLE, lcnt;
4082       uchar *dest = (uchar *) buf;
4083       const uchar *source;
4084       for (lcnt = 0; lcnt < 4; lcnt++)
4085       {
4086         mlength = SIZEOF_STORED_DOUBLE;
4087         source = new_ptr + mlength + SIZEOF_STORED_DOUBLE * lcnt;
4088         while (mlength--)
4089           *dest++ = *--source;
4090       }
4091       tmp_str.length(SIZEOF_STORED_DOUBLE * lcnt);
4092 */
4093 #ifndef DBUG_OFF
4094       double xmin, xmax, ymin, ymax;
4095 /*
4096       float8store(buf,xmin);
4097       float8store(buf+8,xmax);
4098       float8store(buf+16,ymin);
4099       float8store(buf+24,ymax);
4100       memcpy(&xmin,new_ptr,sizeof(xmin));
4101       memcpy(&xmax,new_ptr + 8,sizeof(xmax));
4102       memcpy(&ymin,new_ptr + 16,sizeof(ymin));
4103       memcpy(&ymax,new_ptr + 24,sizeof(ymax));
4104       float8get(xmin, buf);
4105       float8get(xmax, buf + 8);
4106       float8get(ymin, buf + 16);
4107       float8get(ymax, buf + 24);
4108       DBUG_PRINT("info", ("spider geo is %f %f %f %f",
4109         xmin, xmax, ymin, ymax));
4110       DBUG_PRINT("info", ("spider geo is %.14g %.14g %.14g %.14g",
4111         xmin, xmax, ymin, ymax));
4112 */
4113       float8get(xmin, new_ptr);
4114       float8get(xmax, new_ptr + 8);
4115       float8get(ymin, new_ptr + 16);
4116       float8get(ymax, new_ptr + 24);
4117       DBUG_PRINT("info", ("spider geo is %f %f %f %f",
4118         xmin, xmax, ymin, ymax));
4119 /*
4120       float8get(xmin, new_ptr + SIZEOF_STORED_DOUBLE * 4);
4121       float8get(xmax, new_ptr + SIZEOF_STORED_DOUBLE * 5);
4122       float8get(ymin, new_ptr + SIZEOF_STORED_DOUBLE * 6);
4123       float8get(ymax, new_ptr + SIZEOF_STORED_DOUBLE * 7);
4124       DBUG_PRINT("info", ("spider geo is %f %f %f %f",
4125         xmin, xmax, ymin, ymax));
4126       float8get(xmin, new_ptr + SIZEOF_STORED_DOUBLE * 8);
4127       float8get(xmax, new_ptr + SIZEOF_STORED_DOUBLE * 9);
4128       float8get(ymin, new_ptr + SIZEOF_STORED_DOUBLE * 10);
4129       float8get(ymax, new_ptr + SIZEOF_STORED_DOUBLE * 11);
4130       DBUG_PRINT("info", ("spider geo is %f %f %f %f",
4131         xmin, xmax, ymin, ymax));
4132       float8get(xmin, new_ptr + SIZEOF_STORED_DOUBLE * 12);
4133       float8get(xmax, new_ptr + SIZEOF_STORED_DOUBLE * 13);
4134       float8get(ymin, new_ptr + SIZEOF_STORED_DOUBLE * 14);
4135       float8get(ymax, new_ptr + SIZEOF_STORED_DOUBLE * 15);
4136       DBUG_PRINT("info", ("spider geo is %f %f %f %f",
4137         xmin, xmax, ymin, ymax));
4138 */
4139 #endif
4140 /*
4141       tmp_str.set_quick((char *) new_ptr, SIZEOF_STORED_DOUBLE * 4,
4142         &my_charset_bin);
4143 */
4144       tmp_str.length(0);
4145       tmp_str.q_append((char *) SPIDER_SQL_LINESTRING_HEAD_STR,
4146         SPIDER_SQL_LINESTRING_HEAD_LEN);
4147       tmp_str.q_append((char *) new_ptr, SIZEOF_STORED_DOUBLE);
4148       tmp_str.q_append((char *) new_ptr + SIZEOF_STORED_DOUBLE * 2,
4149         SIZEOF_STORED_DOUBLE);
4150       tmp_str.q_append((char *) new_ptr + SIZEOF_STORED_DOUBLE,
4151         SIZEOF_STORED_DOUBLE);
4152       tmp_str.q_append((char *) new_ptr + SIZEOF_STORED_DOUBLE * 3,
4153         SIZEOF_STORED_DOUBLE);
4154       ptr = tmp_str.get_str();
4155     } else {
4156       ptr = field->val_str(tmp_str.get_str(), new_ptr);
4157       tmp_str.mem_calc();
4158     }
4159   } else {
4160     ptr = field->val_str(tmp_str.get_str());
4161     tmp_str.mem_calc();
4162     if (field->type() == MYSQL_TYPE_FLOAT)
4163     {
4164       float_value = TRUE;
4165     }
4166   }
4167 
4168   thd->variables.time_zone = saved_time_zone;
4169 
4170   DBUG_PRINT("info", ("spider field->type() is %d", field->type()));
4171   DBUG_PRINT("info", ("spider ptr->length() is %d", ptr->length()));
4172 /*
4173   if (
4174     field->type() == MYSQL_TYPE_BIT ||
4175     (field->type() >= MYSQL_TYPE_TINY_BLOB &&
4176       field->type() <= MYSQL_TYPE_BLOB)
4177   ) {
4178     uchar *hex_ptr = (uchar *) ptr->ptr(), *end_ptr;
4179     char *str_ptr;
4180     DBUG_PRINT("info", ("spider HEX"));
4181     if (str->reserve(SPIDER_SQL_HEX_LEN + ptr->length() * 2))
4182       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4183     str->q_append(SPIDER_SQL_HEX_STR, SPIDER_SQL_HEX_LEN);
4184     str_ptr = (char *) str->ptr() + str->length();
4185     for (end_ptr = hex_ptr + ptr->length(); hex_ptr < end_ptr; hex_ptr++)
4186     {
4187       *str_ptr++ = spider_dig_upper[(*hex_ptr) >> 4];
4188       *str_ptr++ = spider_dig_upper[(*hex_ptr) & 0x0F];
4189     }
4190     str->length(str->length() + ptr->length() * 2);
4191   } else
4192 */
4193   if (field->result_type() == STRING_RESULT)
4194   {
4195     DBUG_PRINT("info", ("spider STRING_RESULT"));
4196     if (str->charset() != field->charset())
4197     {
4198       if ((error_num = spider_db_append_charset_name_before_string(str,
4199         field->charset())))
4200       {
4201         DBUG_RETURN(error_num);
4202       }
4203     }
4204     if (str->reserve(SPIDER_SQL_VALUE_QUOTE_LEN))
4205       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4206     str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
4207     if (
4208       field->type() == MYSQL_TYPE_VARCHAR ||
4209       (field->type() >= MYSQL_TYPE_ENUM &&
4210         field->type() <= MYSQL_TYPE_GEOMETRY)
4211     ) {
4212       DBUG_PRINT("info", ("spider append_escaped"));
4213       char buf2[MAX_FIELD_WIDTH];
4214       spider_string tmp_str2(buf2, MAX_FIELD_WIDTH, field->charset());
4215       tmp_str2.init_calc_mem(114);
4216       tmp_str2.length(0);
4217       if (
4218         tmp_str2.append(ptr->ptr(), ptr->length(), field->charset()) ||
4219         str->reserve(tmp_str2.length() * 2) ||
4220         append_escaped_util(str, tmp_str2.get_str())
4221       )
4222         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4223     } else if (str->append(*ptr))
4224       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4225     if (str->reserve(SPIDER_SQL_VALUE_QUOTE_LEN))
4226       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4227     str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
4228   } else if (field->str_needs_quotes())
4229   {
4230     if (str->charset() != field->charset())
4231     {
4232       if ((error_num = spider_db_append_charset_name_before_string(str,
4233         field->charset())))
4234       {
4235         DBUG_RETURN(error_num);
4236       }
4237     }
4238     if (str->reserve(SPIDER_SQL_VALUE_QUOTE_LEN * 2 + ptr->length() * 2 + 2))
4239       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4240     str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
4241     append_escaped_util(str, ptr);
4242     str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
4243   } else if (float_value)
4244   {
4245     if (str->reserve(SPIDER_SQL_CAST_LEN + ptr->length() +
4246                      SPIDER_SQL_AS_FLOAT_LEN + SPIDER_SQL_CLOSE_PAREN_LEN))
4247     {
4248       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4249     }
4250     str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
4251     str->q_append(ptr->ptr(), ptr->length());
4252     str->q_append(SPIDER_SQL_AS_FLOAT_STR, SPIDER_SQL_AS_FLOAT_LEN);
4253     str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
4254   } else if (str->append(*ptr))
4255   {
4256     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4257   }
4258   DBUG_RETURN(0);
4259 }
4260 
append_column_value(ha_spider * spider,spider_string * str,Field * field,const uchar * new_ptr,CHARSET_INFO * access_charset)4261 int spider_db_mysql_util::append_column_value(
4262   ha_spider *spider,
4263   spider_string *str,
4264   Field *field,
4265   const uchar *new_ptr,
4266   CHARSET_INFO *access_charset
4267 ) {
4268   bool float_value = FALSE;
4269   int error_num;
4270   char buf[MAX_FIELD_WIDTH];
4271   spider_string tmp_str(buf, MAX_FIELD_WIDTH, field->charset());
4272   String *ptr;
4273   uint length;
4274   THD *thd = field->table->in_use;
4275   Time_zone *saved_time_zone = thd->variables.time_zone;
4276   DBUG_ENTER("spider_db_mysql_util::append_column_value");
4277   tmp_str.init_calc_mem(266);
4278 
4279   thd->variables.time_zone = UTC;
4280 
4281   if (new_ptr)
4282   {
4283     if (
4284       field->type() == MYSQL_TYPE_BLOB ||
4285       field->real_type() == MYSQL_TYPE_VARCHAR
4286     ) {
4287       length = uint2korr(new_ptr);
4288       tmp_str.set_quick((char *) new_ptr + HA_KEY_BLOB_LENGTH, length,
4289         field->charset());
4290       ptr = tmp_str.get_str();
4291     } else if (field->type() == MYSQL_TYPE_GEOMETRY)
4292     {
4293 /*
4294       uint mlength = SIZEOF_STORED_DOUBLE, lcnt;
4295       uchar *dest = (uchar *) buf;
4296       const uchar *source;
4297       for (lcnt = 0; lcnt < 4; lcnt++)
4298       {
4299         mlength = SIZEOF_STORED_DOUBLE;
4300         source = new_ptr + mlength + SIZEOF_STORED_DOUBLE * lcnt;
4301         while (mlength--)
4302           *dest++ = *--source;
4303       }
4304       tmp_str.length(SIZEOF_STORED_DOUBLE * lcnt);
4305 */
4306 #ifndef DBUG_OFF
4307       double xmin, xmax, ymin, ymax;
4308 /*
4309       float8store(buf,xmin);
4310       float8store(buf+8,xmax);
4311       float8store(buf+16,ymin);
4312       float8store(buf+24,ymax);
4313       memcpy(&xmin,new_ptr,sizeof(xmin));
4314       memcpy(&xmax,new_ptr + 8,sizeof(xmax));
4315       memcpy(&ymin,new_ptr + 16,sizeof(ymin));
4316       memcpy(&ymax,new_ptr + 24,sizeof(ymax));
4317       float8get(xmin, buf);
4318       float8get(xmax, buf + 8);
4319       float8get(ymin, buf + 16);
4320       float8get(ymax, buf + 24);
4321       DBUG_PRINT("info", ("spider geo is %f %f %f %f",
4322         xmin, xmax, ymin, ymax));
4323       DBUG_PRINT("info", ("spider geo is %.14g %.14g %.14g %.14g",
4324         xmin, xmax, ymin, ymax));
4325 */
4326       float8get(xmin, new_ptr);
4327       float8get(xmax, new_ptr + 8);
4328       float8get(ymin, new_ptr + 16);
4329       float8get(ymax, new_ptr + 24);
4330       DBUG_PRINT("info", ("spider geo is %f %f %f %f",
4331         xmin, xmax, ymin, ymax));
4332 /*
4333       float8get(xmin, new_ptr + SIZEOF_STORED_DOUBLE * 4);
4334       float8get(xmax, new_ptr + SIZEOF_STORED_DOUBLE * 5);
4335       float8get(ymin, new_ptr + SIZEOF_STORED_DOUBLE * 6);
4336       float8get(ymax, new_ptr + SIZEOF_STORED_DOUBLE * 7);
4337       DBUG_PRINT("info", ("spider geo is %f %f %f %f",
4338         xmin, xmax, ymin, ymax));
4339       float8get(xmin, new_ptr + SIZEOF_STORED_DOUBLE * 8);
4340       float8get(xmax, new_ptr + SIZEOF_STORED_DOUBLE * 9);
4341       float8get(ymin, new_ptr + SIZEOF_STORED_DOUBLE * 10);
4342       float8get(ymax, new_ptr + SIZEOF_STORED_DOUBLE * 11);
4343       DBUG_PRINT("info", ("spider geo is %f %f %f %f",
4344         xmin, xmax, ymin, ymax));
4345       float8get(xmin, new_ptr + SIZEOF_STORED_DOUBLE * 12);
4346       float8get(xmax, new_ptr + SIZEOF_STORED_DOUBLE * 13);
4347       float8get(ymin, new_ptr + SIZEOF_STORED_DOUBLE * 14);
4348       float8get(ymax, new_ptr + SIZEOF_STORED_DOUBLE * 15);
4349       DBUG_PRINT("info", ("spider geo is %f %f %f %f",
4350         xmin, xmax, ymin, ymax));
4351 */
4352 #endif
4353 /*
4354       tmp_str.set_quick((char *) new_ptr, SIZEOF_STORED_DOUBLE * 4,
4355         &my_charset_bin);
4356 */
4357       tmp_str.length(0);
4358       tmp_str.q_append((char *) SPIDER_SQL_LINESTRING_HEAD_STR,
4359         SPIDER_SQL_LINESTRING_HEAD_LEN);
4360       tmp_str.q_append((char *) new_ptr, SIZEOF_STORED_DOUBLE);
4361       tmp_str.q_append((char *) new_ptr + SIZEOF_STORED_DOUBLE * 2,
4362         SIZEOF_STORED_DOUBLE);
4363       tmp_str.q_append((char *) new_ptr + SIZEOF_STORED_DOUBLE,
4364         SIZEOF_STORED_DOUBLE);
4365       tmp_str.q_append((char *) new_ptr + SIZEOF_STORED_DOUBLE * 3,
4366         SIZEOF_STORED_DOUBLE);
4367       ptr = tmp_str.get_str();
4368     } else {
4369       ptr = field->val_str(tmp_str.get_str(), new_ptr);
4370       tmp_str.mem_calc();
4371     }
4372   } else {
4373     ptr = field->val_str(tmp_str.get_str());
4374     tmp_str.mem_calc();
4375     if (field->type() == MYSQL_TYPE_FLOAT)
4376     {
4377       float_value = TRUE;
4378     }
4379   }
4380 
4381   thd->variables.time_zone = saved_time_zone;
4382 
4383   DBUG_PRINT("info", ("spider field->type() is %d", field->type()));
4384   DBUG_PRINT("info", ("spider ptr->length() is %d", ptr->length()));
4385 /*
4386   if (
4387     field->type() == MYSQL_TYPE_BIT ||
4388     (field->type() >= MYSQL_TYPE_TINY_BLOB &&
4389       field->type() <= MYSQL_TYPE_BLOB)
4390   ) {
4391     uchar *hex_ptr = (uchar *) ptr->ptr(), *end_ptr;
4392     char *str_ptr;
4393     DBUG_PRINT("info", ("spider HEX"));
4394     if (str->reserve(SPIDER_SQL_HEX_LEN + ptr->length() * 2))
4395       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4396     str->q_append(SPIDER_SQL_HEX_STR, SPIDER_SQL_HEX_LEN);
4397     str_ptr = (char *) str->ptr() + str->length();
4398     for (end_ptr = hex_ptr + ptr->length(); hex_ptr < end_ptr; hex_ptr++)
4399     {
4400       *str_ptr++ = spider_dig_upper[(*hex_ptr) >> 4];
4401       *str_ptr++ = spider_dig_upper[(*hex_ptr) & 0x0F];
4402     }
4403     str->length(str->length() + ptr->length() * 2);
4404   } else
4405 */
4406   if (field->result_type() == STRING_RESULT)
4407   {
4408     DBUG_PRINT("info", ("spider STRING_RESULT"));
4409     if (str->charset() != field->charset())
4410     {
4411       if ((error_num = spider_db_append_charset_name_before_string(str,
4412         field->charset())))
4413       {
4414         DBUG_RETURN(error_num);
4415       }
4416     }
4417     if (str->reserve(SPIDER_SQL_VALUE_QUOTE_LEN))
4418       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4419     str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
4420     if (
4421       field->type() == MYSQL_TYPE_VARCHAR ||
4422       (field->type() >= MYSQL_TYPE_ENUM &&
4423         field->type() <= MYSQL_TYPE_GEOMETRY)
4424     ) {
4425       DBUG_PRINT("info", ("spider append_escaped"));
4426       char buf2[MAX_FIELD_WIDTH];
4427       spider_string tmp_str2(buf2, MAX_FIELD_WIDTH, field->charset());
4428       tmp_str2.init_calc_mem(267);
4429       tmp_str2.length(0);
4430       if (
4431         tmp_str2.append(ptr->ptr(), ptr->length(), field->charset()) ||
4432         str->reserve(tmp_str2.length() * 2) ||
4433         append_escaped_util(str, tmp_str2.get_str())
4434       )
4435         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4436     } else if (str->append(*ptr))
4437       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4438     if (str->reserve(SPIDER_SQL_VALUE_QUOTE_LEN))
4439       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4440     str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
4441   } else if (field->str_needs_quotes())
4442   {
4443     if (str->charset() != field->charset())
4444     {
4445       if ((error_num = spider_db_append_charset_name_before_string(str,
4446         field->charset())))
4447       {
4448         DBUG_RETURN(error_num);
4449       }
4450     }
4451     if (str->reserve(SPIDER_SQL_VALUE_QUOTE_LEN * 2 + ptr->length() * 2 + 2))
4452       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4453     str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
4454     append_escaped_util(str, ptr);
4455     str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
4456   } else if (float_value)
4457   {
4458     if (str->reserve(SPIDER_SQL_TO_FLOAT_LEN + ptr->length() +
4459       SPIDER_SQL_CLOSE_PAREN_LEN))
4460     {
4461       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4462     }
4463     str->q_append(SPIDER_SQL_TO_FLOAT_STR, SPIDER_SQL_TO_FLOAT_LEN);
4464     str->q_append(ptr->ptr(), ptr->length());
4465     str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
4466   } else if (str->append(*ptr))
4467   {
4468     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4469   }
4470   DBUG_RETURN(0);
4471 }
4472 
append_column_value(ha_spider * spider,spider_string * str,Field * field,const uchar * new_ptr,CHARSET_INFO * access_charset)4473 int spider_db_mbase_util::append_column_value(
4474   ha_spider *spider,
4475   spider_string *str,
4476   Field *field,
4477   const uchar *new_ptr,
4478   CHARSET_INFO *access_charset
4479 ) {
4480   DBUG_ENTER("spider_db_mbase_util::append_column_value");
4481   DBUG_ASSERT(0);
4482   DBUG_RETURN(0);
4483 }
4484 
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)4485 int spider_db_mbase_util::append_from_with_alias(
4486   spider_string *str,
4487   const char **table_names,
4488   uint *table_name_lengths,
4489   const char **table_aliases,
4490   uint *table_alias_lengths,
4491   uint table_count,
4492   int *table_name_pos,
4493   bool over_write
4494 ) {
4495   uint roop_count, length = 0;
4496   DBUG_ENTER("spider_db_mbase_util::append_from_with_alias");
4497   DBUG_PRINT("info",("spider this=%p", this));
4498   if (!over_write)
4499   {
4500     for (roop_count = 0; roop_count < table_count; roop_count++)
4501       length += table_name_lengths[roop_count] + SPIDER_SQL_SPACE_LEN +
4502         table_alias_lengths[roop_count] + SPIDER_SQL_COMMA_LEN;
4503     if (str->reserve(SPIDER_SQL_FROM_LEN + length))
4504       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4505     str->q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN);
4506     *table_name_pos = str->length();
4507   }
4508   for (roop_count = 0; roop_count < table_count; roop_count++)
4509   {
4510     str->q_append(table_names[roop_count], table_name_lengths[roop_count]);
4511     str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
4512     str->q_append(table_aliases[roop_count], table_alias_lengths[roop_count]);
4513     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
4514   }
4515   str->length(str->length() - SPIDER_SQL_COMMA_LEN);
4516   DBUG_RETURN(0);
4517 }
4518 
append_trx_isolation(spider_string * str,int trx_isolation)4519 int spider_db_mbase_util::append_trx_isolation(
4520   spider_string *str,
4521   int trx_isolation
4522 ) {
4523   DBUG_ENTER("spider_db_mbase_util::append_trx_isolation");
4524   DBUG_PRINT("info",("spider this=%p", this));
4525   if (str->reserve(SPIDER_SQL_SEMICOLON_LEN +
4526     SPIDER_SQL_ISO_READ_UNCOMMITTED_LEN))
4527     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4528   if (str->length())
4529   {
4530     str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
4531   }
4532   switch (trx_isolation)
4533   {
4534     case ISO_READ_UNCOMMITTED:
4535       str->q_append(SPIDER_SQL_ISO_READ_UNCOMMITTED_STR,
4536         SPIDER_SQL_ISO_READ_UNCOMMITTED_LEN);
4537       break;
4538     case ISO_READ_COMMITTED:
4539       str->q_append(SPIDER_SQL_ISO_READ_COMMITTED_STR,
4540         SPIDER_SQL_ISO_READ_COMMITTED_LEN);
4541       break;
4542     case ISO_REPEATABLE_READ:
4543       str->q_append(SPIDER_SQL_ISO_REPEATABLE_READ_STR,
4544         SPIDER_SQL_ISO_REPEATABLE_READ_LEN);
4545       break;
4546     case ISO_SERIALIZABLE:
4547       str->q_append(SPIDER_SQL_ISO_SERIALIZABLE_STR,
4548         SPIDER_SQL_ISO_SERIALIZABLE_LEN);
4549       break;
4550     default:
4551       DBUG_RETURN(HA_ERR_UNSUPPORTED);
4552   }
4553   DBUG_RETURN(0);
4554 }
4555 
append_autocommit(spider_string * str,bool autocommit)4556 int spider_db_mbase_util::append_autocommit(
4557   spider_string *str,
4558   bool autocommit
4559 ) {
4560   DBUG_ENTER("spider_db_mbase_util::append_autocommit");
4561   DBUG_PRINT("info",("spider this=%p", this));
4562   if (str->reserve(SPIDER_SQL_SEMICOLON_LEN + SPIDER_SQL_AUTOCOMMIT_OFF_LEN))
4563     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4564   if (str->length())
4565   {
4566     str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
4567   }
4568   if (autocommit)
4569   {
4570     str->q_append(SPIDER_SQL_AUTOCOMMIT_ON_STR,
4571       SPIDER_SQL_AUTOCOMMIT_ON_LEN);
4572   } else {
4573     str->q_append(SPIDER_SQL_AUTOCOMMIT_OFF_STR,
4574       SPIDER_SQL_AUTOCOMMIT_OFF_LEN);
4575   }
4576   DBUG_RETURN(0);
4577 }
4578 
append_sql_log_off(spider_string * str,bool sql_log_off)4579 int spider_db_mbase_util::append_sql_log_off(
4580   spider_string *str,
4581   bool sql_log_off
4582 ) {
4583   DBUG_ENTER("spider_db_mbase_util::append_sql_log_off");
4584   DBUG_PRINT("info",("spider this=%p", this));
4585   if (str->reserve(SPIDER_SQL_SEMICOLON_LEN + SPIDER_SQL_SQL_LOG_OFF_LEN))
4586     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4587   if (str->length())
4588   {
4589     str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
4590   }
4591   if (sql_log_off)
4592   {
4593     str->q_append(SPIDER_SQL_SQL_LOG_ON_STR, SPIDER_SQL_SQL_LOG_ON_LEN);
4594   } else {
4595     str->q_append(SPIDER_SQL_SQL_LOG_OFF_STR, SPIDER_SQL_SQL_LOG_OFF_LEN);
4596   }
4597   DBUG_RETURN(0);
4598 }
4599 
append_wait_timeout(spider_string * str,int wait_timeout)4600 int spider_db_mbase_util::append_wait_timeout(
4601   spider_string *str,
4602   int wait_timeout
4603 ) {
4604   char timeout_str[SPIDER_SQL_INT_LEN];
4605   int timeout_str_length;
4606   DBUG_ENTER("spider_db_mbase_util::append_wait_timeout");
4607   DBUG_PRINT("info",("spider this=%p", this));
4608   timeout_str_length =
4609     my_sprintf(timeout_str, (timeout_str, "%d", wait_timeout));
4610   if (str->reserve(SPIDER_SQL_SEMICOLON_LEN + SPIDER_SQL_WAIT_TIMEOUT_LEN +
4611     timeout_str_length))
4612   {
4613     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4614   }
4615   if (str->length())
4616   {
4617     str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
4618   }
4619   str->q_append(SPIDER_SQL_WAIT_TIMEOUT_STR, SPIDER_SQL_WAIT_TIMEOUT_LEN);
4620   str->q_append(timeout_str, timeout_str_length);
4621   DBUG_RETURN(0);
4622 }
4623 
4624 #define SPIDER_REAL_AS_FLOAT_STR              "real_as_float"
4625 #define SPIDER_REAL_AS_FLOAT_LEN              (sizeof(SPIDER_REAL_AS_FLOAT_STR) - 1)
4626 #define SPIDER_PIPES_AS_CONCAT_STR            "pipes_as_concat"
4627 #define SPIDER_PIPES_AS_CONCAT_LEN            (sizeof(SPIDER_PIPES_AS_CONCAT_STR) - 1)
4628 #define SPIDER_ANSI_QUOTES_STR                "ansi_quotes"
4629 #define SPIDER_ANSI_QUOTES_LEN                (sizeof(SPIDER_ANSI_QUOTES_STR) - 1)
4630 #define SPIDER_IGNORE_SPACE_STR               "ignore_space"
4631 #define SPIDER_IGNORE_SPACE_LEN               (sizeof(SPIDER_IGNORE_SPACE_STR) - 1)
4632 #define SPIDER_IGNORE_BAD_TABLE_OPTIONS_STR   "ignore_bad_table_options"
4633 #define SPIDER_IGNORE_BAD_TABLE_OPTIONS_LEN   (sizeof(SPIDER_IGNORE_BAD_TABLE_OPTIONS_STR) - 1)
4634 #define SPIDER_ONLY_FULL_GROUP_BY_STR         "only_full_group_by"
4635 #define SPIDER_ONLY_FULL_GROUP_BY_LEN         (sizeof(SPIDER_ONLY_FULL_GROUP_BY_STR) - 1)
4636 #define SPIDER_NO_UNSIGNED_SUBTRACTION_STR    "no_unsigned_subtraction"
4637 #define SPIDER_NO_UNSIGNED_SUBTRACTION_LEN    (sizeof(SPIDER_NO_UNSIGNED_SUBTRACTION_STR) - 1)
4638 #define SPIDER_NO_DIR_IN_CREATE_STR           "no_dir_in_create"
4639 #define SPIDER_NO_DIR_IN_CREATE_LEN           (sizeof(SPIDER_NO_DIR_IN_CREATE_STR) - 1)
4640 #define SPIDER_POSTGRESQL_STR                 "postgresql"
4641 #define SPIDER_POSTGRESQL_LEN                 (sizeof(SPIDER_POSTGRESQL_STR) - 1)
4642 #define SPIDER_ORACLE_STR                     "oracle"
4643 #define SPIDER_ORACLE_LEN                     (sizeof(SPIDER_ORACLE_STR) - 1)
4644 #define SPIDER_MSSQL_STR                      "mssql"
4645 #define SPIDER_MSSQL_LEN                      (sizeof(SPIDER_MSSQL_STR) - 1)
4646 #define SPIDER_DB2_STR                        "db2"
4647 #define SPIDER_DB2_LEN                        (sizeof(SPIDER_DB2_STR) - 1)
4648 #define SPIDER_MAXDB_STR                      "maxdb"
4649 #define SPIDER_MAXDB_LEN                      (sizeof(SPIDER_MAXDB_STR) - 1)
4650 #define SPIDER_NO_KEY_OPTIONS_STR             "no_key_options"
4651 #define SPIDER_NO_KEY_OPTIONS_LEN             (sizeof(SPIDER_NO_KEY_OPTIONS_STR) - 1)
4652 #define SPIDER_NO_TABLE_OPTIONS_STR           "no_table_options"
4653 #define SPIDER_NO_TABLE_OPTIONS_LEN           (sizeof(SPIDER_NO_TABLE_OPTIONS_STR) - 1)
4654 #define SPIDER_NO_FIELD_OPTIONS_STR           "no_field_options"
4655 #define SPIDER_NO_FIELD_OPTIONS_LEN           (sizeof(SPIDER_NO_FIELD_OPTIONS_STR) - 1)
4656 #define SPIDER_MYSQL323_STR                   "mysql323"
4657 #define SPIDER_MYSQL323_LEN                   (sizeof(SPIDER_MYSQL323_STR) - 1)
4658 #define SPIDER_MYSQL40_STR                    "mysql40"
4659 #define SPIDER_MYSQL40_LEN                    (sizeof(SPIDER_MYSQL40_STR) - 1)
4660 #define SPIDER_ANSI_STR                       "ansi"
4661 #define SPIDER_ANSI_LEN                       (sizeof(SPIDER_ANSI_STR) - 1)
4662 #define SPIDER_NO_AUTO_VALUE_ON_ZERO_STR      "no_auto_value_on_zero"
4663 #define SPIDER_NO_AUTO_VALUE_ON_ZERO_LEN      (sizeof(SPIDER_NO_AUTO_VALUE_ON_ZERO_STR) - 1)
4664 #define SPIDER_NO_BACKSLASH_ESCAPES_STR       "no_backslash_escapes"
4665 #define SPIDER_NO_BACKSLASH_ESCAPES_LEN       (sizeof(SPIDER_NO_BACKSLASH_ESCAPES_STR) - 1)
4666 #define SPIDER_STRICT_TRANS_TABLES_STR        "strict_trans_tables"
4667 #define SPIDER_STRICT_TRANS_TABLES_LEN        (sizeof(SPIDER_STRICT_TRANS_TABLES_STR) - 1)
4668 #define SPIDER_STRICT_ALL_TABLES_STR          "strict_all_tables"
4669 #define SPIDER_STRICT_ALL_TABLES_LEN          (sizeof(SPIDER_STRICT_ALL_TABLES_STR) - 1)
4670 #define SPIDER_NO_ZERO_IN_DATE_STR            "no_zero_in_date"
4671 #define SPIDER_NO_ZERO_IN_DATE_LEN            (sizeof(SPIDER_NO_ZERO_IN_DATE_STR) - 1)
4672 #define SPIDER_NO_ZERO_DATE_STR               "no_zero_date"
4673 #define SPIDER_NO_ZERO_DATE_LEN               (sizeof(SPIDER_NO_ZERO_DATE_STR) - 1)
4674 #define SPIDER_INVALID_DATES_STR              "allow_invalid_dates"
4675 #define SPIDER_INVALID_DATES_LEN              (sizeof(SPIDER_INVALID_DATES_STR) - 1)
4676 #define SPIDER_ERROR_FOR_DIVISION_BY_ZERO_STR "error_for_division_by_zero"
4677 #define SPIDER_ERROR_FOR_DIVISION_BY_ZERO_LEN (sizeof(SPIDER_ERROR_FOR_DIVISION_BY_ZERO_STR) - 1)
4678 #define SPIDER_TRADITIONAL_STR                "traditional"
4679 #define SPIDER_TRADITIONAL_LEN                (sizeof(SPIDER_TRADITIONAL_STR) - 1)
4680 #define SPIDER_NO_AUTO_CREATE_USER_STR        "no_auto_create_user"
4681 #define SPIDER_NO_AUTO_CREATE_USER_LEN        (sizeof(SPIDER_NO_AUTO_CREATE_USER_STR) - 1)
4682 #define SPIDER_HIGH_NOT_PRECEDENCE_STR        "high_not_precedence"
4683 #define SPIDER_HIGH_NOT_PRECEDENCE_LEN        (sizeof(SPIDER_HIGH_NOT_PRECEDENCE_STR) - 1)
4684 #define SPIDER_NO_ENGINE_SUBSTITUTION_STR     "no_engine_substitution"
4685 #define SPIDER_NO_ENGINE_SUBSTITUTION_LEN     (sizeof(SPIDER_NO_ENGINE_SUBSTITUTION_STR) - 1)
4686 #define SPIDER_PAD_CHAR_TO_FULL_LENGTH_STR    "pad_char_to_full_length"
4687 #define SPIDER_PAD_CHAR_TO_FULL_LENGTH_LEN    (sizeof(SPIDER_PAD_CHAR_TO_FULL_LENGTH_STR) - 1)
4688 #define SPIDER_EMPTY_STRING_IS_NULL_STR       "empty_string_is_null"
4689 #define SPIDER_EMPTY_STRING_IS_NULL_LEN       (sizeof(SPIDER_EMPTY_STRING_IS_NULL_STR) - 1)
4690 #define SPIDER_SIMULTANEOUS_ASSIGNMENT_STR    "simultaneous_assignment"
4691 #define SPIDER_SIMULTANEOUS_ASSIGNMENT_LEN    (sizeof(SPIDER_SIMULTANEOUS_ASSIGNMENT_STR) - 1)
4692 #define SPIDER_TIME_ROUND_FRACTIONAL_STR      "time_round_fractional"
4693 #define SPIDER_TIME_ROUND_FRACTIONAL_LEN      (sizeof(SPIDER_TIME_ROUND_FRACTIONAL_STR) - 1)
4694 
4695 sql_mode_t full_sql_mode =
4696 #ifdef MODE_REAL_AS_FLOAT
4697   MODE_REAL_AS_FLOAT |
4698 #endif
4699 #ifdef MODE_PIPES_AS_CONCAT
4700   MODE_PIPES_AS_CONCAT |
4701 #endif
4702 #ifdef MODE_ANSI_QUOTES
4703   MODE_ANSI_QUOTES |
4704 #endif
4705 #ifdef MODE_IGNORE_SPACE
4706   MODE_IGNORE_SPACE |
4707 #endif
4708 #ifdef MODE_IGNORE_BAD_TABLE_OPTIONS
4709   MODE_IGNORE_BAD_TABLE_OPTIONS |
4710 #endif
4711 #ifdef MODE_ONLY_FULL_GROUP_BY
4712   MODE_ONLY_FULL_GROUP_BY |
4713 #endif
4714 #ifdef MODE_NO_UNSIGNED_SUBTRACTION
4715   MODE_NO_UNSIGNED_SUBTRACTION |
4716 #endif
4717 #ifdef MODE_NO_DIR_IN_CREATE
4718   MODE_NO_DIR_IN_CREATE |
4719 #endif
4720 #ifdef MODE_POSTGRESQL
4721   MODE_POSTGRESQL |
4722 #endif
4723 #ifdef MODE_ORACLE
4724   MODE_ORACLE |
4725 #endif
4726 #ifdef MODE_MSSQL
4727   MODE_MSSQL |
4728 #endif
4729 #ifdef MODE_DB2
4730   MODE_DB2 |
4731 #endif
4732 #ifdef MODE_MAXDB
4733   MODE_MAXDB |
4734 #endif
4735 #ifdef MODE_NO_KEY_OPTIONS
4736   MODE_NO_KEY_OPTIONS |
4737 #endif
4738 #ifdef MODE_NO_TABLE_OPTIONS
4739   MODE_NO_TABLE_OPTIONS |
4740 #endif
4741 #ifdef MODE_NO_FIELD_OPTIONS
4742   MODE_NO_FIELD_OPTIONS |
4743 #endif
4744 #ifdef MODE_MYSQL323
4745   MODE_MYSQL323 |
4746 #endif
4747 #ifdef MODE_MYSQL40
4748   MODE_MYSQL40 |
4749 #endif
4750 #ifdef MODE_ANSI
4751   MODE_ANSI |
4752 #endif
4753 #ifdef MODE_NO_AUTO_VALUE_ON_ZERO
4754   MODE_NO_AUTO_VALUE_ON_ZERO |
4755 #endif
4756 #ifdef MODE_NO_BACKSLASH_ESCAPES
4757   MODE_NO_BACKSLASH_ESCAPES |
4758 #endif
4759 #ifdef MODE_STRICT_TRANS_TABLES
4760   MODE_STRICT_TRANS_TABLES |
4761 #endif
4762 #ifdef MODE_STRICT_ALL_TABLES
4763   MODE_STRICT_ALL_TABLES |
4764 #endif
4765 #ifdef MODE_NO_ZERO_IN_DATE
4766   MODE_NO_ZERO_IN_DATE |
4767 #endif
4768 #ifdef MODE_NO_ZERO_DATE
4769   MODE_NO_ZERO_DATE |
4770 #endif
4771 #ifdef MODE_INVALID_DATES
4772   MODE_INVALID_DATES |
4773 #endif
4774 #ifdef MODE_ERROR_FOR_DIVISION_BY_ZERO
4775   MODE_ERROR_FOR_DIVISION_BY_ZERO |
4776 #endif
4777 #ifdef MODE_TRADITIONAL
4778   MODE_TRADITIONAL |
4779 #endif
4780 #ifdef MODE_NO_AUTO_CREATE_USER
4781   MODE_NO_AUTO_CREATE_USER |
4782 #endif
4783 #ifdef MODE_HIGH_NOT_PRECEDENCE
4784   MODE_HIGH_NOT_PRECEDENCE |
4785 #endif
4786 #ifdef MODE_NO_ENGINE_SUBSTITUTION
4787   MODE_NO_ENGINE_SUBSTITUTION |
4788 #endif
4789 #ifdef MODE_PAD_CHAR_TO_FULL_LENGTH
4790   MODE_PAD_CHAR_TO_FULL_LENGTH |
4791 #endif
4792 #ifdef MODE_EMPTY_STRING_IS_NULL
4793   MODE_EMPTY_STRING_IS_NULL |
4794 #endif
4795 #ifdef MODE_SIMULTANEOUS_ASSIGNMENT
4796   MODE_SIMULTANEOUS_ASSIGNMENT |
4797 #endif
4798 #ifdef MODE_TIME_ROUND_FRACTIONAL
4799   MODE_TIME_ROUND_FRACTIONAL |
4800 #endif
4801   0;
4802 
4803 #ifdef MODE_REAL_AS_FLOAT
4804 /* pushdown */
4805 #define SPIDER_SQL_MODE_REAL_AS_FLOAT
4806 #endif
4807 #ifdef MODE_PIPES_AS_CONCAT
4808 /* no pushdown */
4809 #endif
4810 #ifdef MODE_ANSI_QUOTES
4811 /* no pushdown */
4812 #endif
4813 #ifdef MODE_IGNORE_SPACE
4814 /* no pushdown */
4815 #endif
4816 #ifdef MODE_IGNORE_BAD_TABLE_OPTIONS
4817 /* pushdown */
4818 #define SPIDER_SQL_MODE_IGNORE_BAD_TABLE_OPTIONS
4819 #endif
4820 #ifdef MODE_ONLY_FULL_GROUP_BY
4821 /* no pushdown */
4822 #endif
4823 #ifdef MODE_NO_UNSIGNED_SUBTRACTION
4824 /* pushdown */
4825 #define SPIDER_SQL_MODE_NO_UNSIGNED_SUBTRACTION
4826 #endif
4827 #ifdef MODE_NO_DIR_IN_CREATE
4828 /* pushdown */
4829 #define SPIDER_SQL_MODE_NO_DIR_IN_CREATE
4830 #endif
4831 #ifdef MODE_POSTGRESQL
4832 /* no pushdown */
4833 #endif
4834 #ifdef MODE_ORACLE
4835 /* no pushdown */
4836 #endif
4837 #ifdef MODE_MSSQL
4838 /* no pushdown */
4839 #endif
4840 #ifdef MODE_DB2
4841 /* no pushdown */
4842 #endif
4843 #ifdef MODE_MAXDB
4844 /* no pushdown */
4845 #endif
4846 #ifdef MODE_NO_KEY_OPTIONS
4847 /* no pushdown */
4848 #endif
4849 #ifdef MODE_NO_TABLE_OPTIONS
4850 /* no pushdown */
4851 #endif
4852 #ifdef MODE_NO_FIELD_OPTIONS
4853 /* no pushdown */
4854 #endif
4855 #ifdef MODE_MYSQL323
4856 /* no pushdown */
4857 #endif
4858 #ifdef MODE_MYSQL40
4859 /* no pushdown */
4860 #endif
4861 #ifdef MODE_ANSI
4862 /* no pushdown */
4863 #endif
4864 #ifdef MODE_NO_AUTO_VALUE_ON_ZERO
4865 /* pushdown */
4866 #define SPIDER_SQL_MODE_NO_AUTO_VALUE_ON_ZERO
4867 #endif
4868 #ifdef MODE_NO_BACKSLASH_ESCAPES
4869 /* no pushdown */
4870 #endif
4871 #ifdef MODE_STRICT_TRANS_TABLES
4872 /* pushdown */
4873 #define SPIDER_SQL_MODE_STRICT_TRANS_TABLES
4874 #endif
4875 #ifdef MODE_STRICT_ALL_TABLES
4876 /* pushdown */
4877 #define SPIDER_SQL_MODE_STRICT_ALL_TABLES
4878 #endif
4879 #ifdef MODE_NO_ZERO_IN_DATE
4880 /* pushdown */
4881 #define SPIDER_SQL_MODE_NO_ZERO_IN_DATE
4882 #endif
4883 #ifdef MODE_NO_ZERO_DATE
4884 /* pushdown */
4885 #define SPIDER_SQL_MODE_NO_ZERO_DATE
4886 #endif
4887 #ifdef MODE_INVALID_DATES
4888 /* pushdown */
4889 #define SPIDER_SQL_MODE_INVALID_DATES
4890 #endif
4891 #ifdef MODE_ERROR_FOR_DIVISION_BY_ZERO
4892 /* pushdown */
4893 #define SPIDER_SQL_MODE_ERROR_FOR_DIVISION_BY_ZERO
4894 #endif
4895 #ifdef MODE_TRADITIONAL
4896 /* no pushdown */
4897 #endif
4898 #ifdef MODE_NO_AUTO_CREATE_USER
4899 /* pushdown */
4900 #define SPIDER_SQL_MODE_NO_AUTO_CREATE_USER
4901 #endif
4902 #ifdef MODE_HIGH_NOT_PRECEDENCE
4903 /* pushdown */
4904 #define SPIDER_SQL_MODE_HIGH_NOT_PRECEDENCE
4905 #endif
4906 #ifdef MODE_NO_ENGINE_SUBSTITUTION
4907 /* pushdown */
4908 #define SPIDER_SQL_MODE_NO_ENGINE_SUBSTITUTION
4909 #endif
4910 #ifdef MODE_PAD_CHAR_TO_FULL_LENGTH
4911 /* pushdown */
4912 #define SPIDER_SQL_MODE_PAD_CHAR_TO_FULL_LENGTH
4913 #endif
4914 #ifdef MODE_EMPTY_STRING_IS_NULL
4915 /* pushdown */
4916 #define SPIDER_SQL_MODE_EMPTY_STRING_IS_NULL
4917 #endif
4918 #ifdef MODE_SIMULTANEOUS_ASSIGNMENT
4919 /* pushdown */
4920 #define SPIDER_SQL_MODE_SIMULTANEOUS_ASSIGNMENT
4921 #endif
4922 #ifdef MODE_TIME_ROUND_FRACTIONAL
4923 /* pushdown */
4924 #define SPIDER_SQL_MODE_TIME_ROUND_FRACTIONAL
4925 #endif
4926 
4927 sql_mode_t pushdown_sql_mode =
4928 #ifdef SPIDER_SQL_MODE_REAL_AS_FLOAT
4929   MODE_REAL_AS_FLOAT |
4930 #endif
4931 #ifdef SPIDER_SQL_MODE_PIPES_AS_CONCAT
4932   MODE_PIPES_AS_CONCAT |
4933 #endif
4934 #ifdef SPIDER_SQL_MODE_ANSI_QUOTES
4935   MODE_ANSI_QUOTES |
4936 #endif
4937 #ifdef SPIDER_SQL_MODE_IGNORE_SPACE
4938   MODE_IGNORE_SPACE |
4939 #endif
4940 #ifdef SPIDER_SQL_MODE_IGNORE_BAD_TABLE_OPTIONS
4941   MODE_IGNORE_BAD_TABLE_OPTIONS |
4942 #endif
4943 #ifdef SPIDER_SQL_MODE_ONLY_FULL_GROUP_BY
4944   MODE_ONLY_FULL_GROUP_BY |
4945 #endif
4946 #ifdef SPIDER_SQL_MODE_NO_UNSIGNED_SUBTRACTION
4947   MODE_NO_UNSIGNED_SUBTRACTION |
4948 #endif
4949 #ifdef SPIDER_SQL_MODE_NO_DIR_IN_CREATE
4950   MODE_NO_DIR_IN_CREATE |
4951 #endif
4952 #ifdef SPIDER_SQL_MODE_POSTGRESQL
4953   MODE_POSTGRESQL |
4954 #endif
4955 #ifdef SPIDER_SQL_MODE_ORACLE
4956   MODE_ORACLE |
4957 #endif
4958 #ifdef SPIDER_SQL_MODE_MSSQL
4959   MODE_MSSQL |
4960 #endif
4961 #ifdef SPIDER_SQL_MODE_DB2
4962   MODE_DB2 |
4963 #endif
4964 #ifdef SPIDER_SQL_MODE_MAXDB
4965   MODE_MAXDB |
4966 #endif
4967 #ifdef SPIDER_SQL_MODE_NO_KEY_OPTIONS
4968   MODE_NO_KEY_OPTIONS |
4969 #endif
4970 #ifdef SPIDER_SQL_MODE_NO_TABLE_OPTIONS
4971   MODE_NO_TABLE_OPTIONS |
4972 #endif
4973 #ifdef SPIDER_SQL_MODE_NO_FIELD_OPTIONS
4974   MODE_NO_FIELD_OPTIONS |
4975 #endif
4976 #ifdef SPIDER_SQL_MODE_MYSQL323
4977   MODE_MYSQL323 |
4978 #endif
4979 #ifdef SPIDER_SQL_MODE_MYSQL40
4980   MODE_MYSQL40 |
4981 #endif
4982 #ifdef SPIDER_SQL_MODE_ANSI
4983   MODE_ANSI |
4984 #endif
4985 #ifdef SPIDER_SQL_MODE_NO_AUTO_VALUE_ON_ZERO
4986   MODE_NO_AUTO_VALUE_ON_ZERO |
4987 #endif
4988 #ifdef SPIDER_SQL_MODE_NO_BACKSLASH_ESCAPES
4989   MODE_NO_BACKSLASH_ESCAPES |
4990 #endif
4991 #ifdef SPIDER_SQL_MODE_STRICT_TRANS_TABLES
4992   MODE_STRICT_TRANS_TABLES |
4993 #endif
4994 #ifdef SPIDER_SQL_MODE_STRICT_ALL_TABLES
4995   MODE_STRICT_ALL_TABLES |
4996 #endif
4997 #ifdef SPIDER_SQL_MODE_NO_ZERO_IN_DATE
4998   MODE_NO_ZERO_IN_DATE |
4999 #endif
5000 #ifdef SPIDER_SQL_MODE_NO_ZERO_DATE
5001   MODE_NO_ZERO_DATE |
5002 #endif
5003 #ifdef SPIDER_SQL_MODE_INVALID_DATES
5004   MODE_INVALID_DATES |
5005 #endif
5006 #ifdef SPIDER_SQL_MODE_ERROR_FOR_DIVISION_BY_ZERO
5007   MODE_ERROR_FOR_DIVISION_BY_ZERO |
5008 #endif
5009 #ifdef SPIDER_SQL_MODE_TRADITIONAL
5010   MODE_TRADITIONAL |
5011 #endif
5012 #ifdef SPIDER_SQL_MODE_NO_AUTO_CREATE_USER
5013   MODE_NO_AUTO_CREATE_USER |
5014 #endif
5015 #ifdef SPIDER_SQL_MODE_HIGH_NOT_PRECEDENCE
5016   MODE_HIGH_NOT_PRECEDENCE |
5017 #endif
5018 #ifdef SPIDER_SQL_MODE_NO_ENGINE_SUBSTITUTION
5019   MODE_NO_ENGINE_SUBSTITUTION |
5020 #endif
5021 #ifdef SPIDER_SQL_MODE_PAD_CHAR_TO_FULL_LENGTH
5022   MODE_PAD_CHAR_TO_FULL_LENGTH |
5023 #endif
5024 #ifdef SPIDER_SQL_MODE_EMPTY_STRING_IS_NULL
5025   MODE_EMPTY_STRING_IS_NULL |
5026 #endif
5027 #ifdef SPIDER_SQL_MODE_SIMULTANEOUS_ASSIGNMENT
5028   MODE_SIMULTANEOUS_ASSIGNMENT |
5029 #endif
5030 #ifdef SPIDER_SQL_MODE_TIME_ROUND_FRACTIONAL
5031   MODE_TIME_ROUND_FRACTIONAL |
5032 #endif
5033   0;
5034 
append_sql_mode_internal(spider_string * str,sql_mode_t sql_mode)5035 int spider_db_mbase_util::append_sql_mode_internal(
5036   spider_string *str,
5037   sql_mode_t sql_mode
5038 ) {
5039   DBUG_ENTER("spider_db_mbase_util::append_sql_mode_internal");
5040   DBUG_PRINT("info",("spider this=%p", this));
5041 #ifdef SPIDER_SQL_MODE_REAL_AS_FLOAT
5042   if (sql_mode & MODE_REAL_AS_FLOAT)
5043   {
5044     if (str->reserve(SPIDER_REAL_AS_FLOAT_LEN + SPIDER_SQL_COMMA_LEN))
5045     {
5046       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5047     }
5048     str->q_append(SPIDER_REAL_AS_FLOAT_STR, SPIDER_REAL_AS_FLOAT_LEN);
5049     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5050   }
5051 #endif
5052 #ifdef SPIDER_SQL_MODE_PIPES_AS_CONCAT
5053   if (sql_mode & MODE_PIPES_AS_CONCAT)
5054   {
5055     if (str->reserve(SPIDER_PIPES_AS_CONCAT_LEN + SPIDER_SQL_COMMA_LEN))
5056     {
5057       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5058     }
5059     str->q_append(SPIDER_PIPES_AS_CONCAT_STR, SPIDER_PIPES_AS_CONCAT_LEN);
5060     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5061   }
5062 #endif
5063 #ifdef SPIDER_SQL_MODE_ANSI_QUOTES
5064   if (sql_mode & MODE_ANSI_QUOTES)
5065   {
5066     if (str->reserve(SPIDER_ANSI_QUOTES_LEN + SPIDER_SQL_COMMA_LEN))
5067     {
5068       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5069     }
5070     str->q_append(SPIDER_ANSI_QUOTES_STR, SPIDER_ANSI_QUOTES_LEN);
5071     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5072   }
5073 #endif
5074 #ifdef SPIDER_SQL_MODE_IGNORE_SPACE
5075   if (sql_mode & MODE_IGNORE_SPACE)
5076   {
5077     if (str->reserve(SPIDER_IGNORE_SPACE_LEN + SPIDER_SQL_COMMA_LEN))
5078     {
5079       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5080     }
5081     str->q_append(SPIDER_IGNORE_SPACE_STR, SPIDER_IGNORE_SPACE_LEN);
5082     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5083   }
5084 #endif
5085 #ifdef SPIDER_SQL_MODE_IGNORE_BAD_TABLE_OPTIONS
5086   if (sql_mode & MODE_IGNORE_BAD_TABLE_OPTIONS)
5087   {
5088     if (str->reserve(SPIDER_IGNORE_BAD_TABLE_OPTIONS_LEN + SPIDER_SQL_COMMA_LEN))
5089     {
5090       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5091     }
5092     str->q_append(SPIDER_IGNORE_BAD_TABLE_OPTIONS_STR, SPIDER_IGNORE_BAD_TABLE_OPTIONS_LEN);
5093     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5094   }
5095 #endif
5096 #ifdef SPIDER_SQL_MODE_ONLY_FULL_GROUP_BY
5097   if (sql_mode & MODE_ONLY_FULL_GROUP_BY)
5098   {
5099     if (str->reserve(SPIDER_ONLY_FULL_GROUP_BY_LEN + SPIDER_SQL_COMMA_LEN))
5100     {
5101       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5102     }
5103     str->q_append(SPIDER_ONLY_FULL_GROUP_BY_STR, SPIDER_ONLY_FULL_GROUP_BY_LEN);
5104     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5105   }
5106 #endif
5107 #ifdef SPIDER_SQL_MODE_NO_UNSIGNED_SUBTRACTION
5108   if (sql_mode & MODE_NO_UNSIGNED_SUBTRACTION)
5109   {
5110     if (str->reserve(SPIDER_NO_UNSIGNED_SUBTRACTION_LEN + SPIDER_SQL_COMMA_LEN))
5111     {
5112       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5113     }
5114     str->q_append(SPIDER_NO_UNSIGNED_SUBTRACTION_STR, SPIDER_NO_UNSIGNED_SUBTRACTION_LEN);
5115     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5116   }
5117 #endif
5118 #ifdef SPIDER_SQL_MODE_NO_DIR_IN_CREATE
5119   if (sql_mode & MODE_NO_DIR_IN_CREATE)
5120   {
5121     if (str->reserve(SPIDER_NO_DIR_IN_CREATE_LEN + SPIDER_SQL_COMMA_LEN))
5122     {
5123       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5124     }
5125     str->q_append(SPIDER_NO_DIR_IN_CREATE_STR, SPIDER_NO_DIR_IN_CREATE_LEN);
5126     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5127   }
5128 #endif
5129 #ifdef SPIDER_SQL_MODE_POSTGRESQL
5130   if (sql_mode & MODE_POSTGRESQL)
5131   {
5132     if (str->reserve(SPIDER_POSTGRESQL_LEN + SPIDER_SQL_COMMA_LEN))
5133     {
5134       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5135     }
5136     str->q_append(SPIDER_POSTGRESQL_STR, SPIDER_POSTGRESQL_LEN);
5137     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5138   }
5139 #endif
5140 #ifdef SPIDER_SQL_MODE_ORACLE
5141   if (sql_mode & MODE_ORACLE)
5142   {
5143     if (str->reserve(SPIDER_ORACLE_LEN + SPIDER_SQL_COMMA_LEN))
5144     {
5145       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5146     }
5147     str->q_append(SPIDER_ORACLE_STR, SPIDER_ORACLE_LEN);
5148     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5149   }
5150 #endif
5151 #ifdef SPIDER_SQL_MODE_MSSQL
5152   if (sql_mode & MODE_MSSQL)
5153   {
5154     if (str->reserve(SPIDER_MSSQL_LEN + SPIDER_SQL_COMMA_LEN))
5155     {
5156       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5157     }
5158     str->q_append(SPIDER_MSSQL_STR, SPIDER_MSSQL_LEN);
5159     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5160   }
5161 #endif
5162 #ifdef SPIDER_SQL_MODE_DB2
5163   if (sql_mode & MODE_DB2)
5164   {
5165     if (str->reserve(SPIDER_DB2_LEN + SPIDER_SQL_COMMA_LEN))
5166     {
5167       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5168     }
5169     str->q_append(SPIDER_DB2_STR, SPIDER_DB2_LEN);
5170     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5171   }
5172 #endif
5173 #ifdef SPIDER_SQL_MODE_MAXDB
5174   if (sql_mode & MODE_MAXDB)
5175   {
5176     if (str->reserve(SPIDER_MAXDB_LEN + SPIDER_SQL_COMMA_LEN))
5177     {
5178       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5179     }
5180     str->q_append(SPIDER_MAXDB_STR, SPIDER_MAXDB_LEN);
5181     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5182   }
5183 #endif
5184 #ifdef SPIDER_SQL_MODE_NO_KEY_OPTIONS
5185   if (sql_mode & MODE_NO_KEY_OPTIONS)
5186   {
5187     if (str->reserve(SPIDER_NO_KEY_OPTIONS_LEN + SPIDER_SQL_COMMA_LEN))
5188     {
5189       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5190     }
5191     str->q_append(SPIDER_NO_KEY_OPTIONS_STR, SPIDER_NO_KEY_OPTIONS_LEN);
5192     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5193   }
5194 #endif
5195 #ifdef SPIDER_SQL_MODE_NO_TABLE_OPTIONS
5196   if (sql_mode & MODE_NO_TABLE_OPTIONS)
5197   {
5198     if (str->reserve(SPIDER_NO_TABLE_OPTIONS_LEN + SPIDER_SQL_COMMA_LEN))
5199     {
5200       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5201     }
5202     str->q_append(SPIDER_NO_TABLE_OPTIONS_STR, SPIDER_NO_TABLE_OPTIONS_LEN);
5203     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5204   }
5205 #endif
5206 #ifdef SPIDER_SQL_MODE_NO_FIELD_OPTIONS
5207   if (sql_mode & MODE_NO_FIELD_OPTIONS)
5208   {
5209     if (str->reserve(SPIDER_NO_FIELD_OPTIONS_LEN + SPIDER_SQL_COMMA_LEN))
5210     {
5211       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5212     }
5213     str->q_append(SPIDER_NO_FIELD_OPTIONS_STR, SPIDER_NO_FIELD_OPTIONS_LEN);
5214     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5215   }
5216 #endif
5217 #ifdef SPIDER_SQL_MODE_MYSQL323
5218   if (sql_mode & MODE_MYSQL323)
5219   {
5220     if (str->reserve(SPIDER_MYSQL323_LEN + SPIDER_SQL_COMMA_LEN))
5221     {
5222       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5223     }
5224     str->q_append(SPIDER_MYSQL323_STR, SPIDER_MYSQL323_LEN);
5225     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5226   }
5227 #endif
5228 #ifdef SPIDER_SQL_MODE_MYSQL40
5229   if (sql_mode & MODE_MYSQL40)
5230   {
5231     if (str->reserve(SPIDER_MYSQL40_LEN + SPIDER_SQL_COMMA_LEN))
5232     {
5233       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5234     }
5235     str->q_append(SPIDER_MYSQL40_STR, SPIDER_MYSQL40_LEN);
5236     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5237   }
5238 #endif
5239 #ifdef SPIDER_SQL_MODE_ANSI
5240   if (sql_mode & MODE_ANSI)
5241   {
5242     if (str->reserve(SPIDER_ANSI_LEN + SPIDER_SQL_COMMA_LEN))
5243     {
5244       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5245     }
5246     str->q_append(SPIDER_ANSI_STR, SPIDER_ANSI_LEN);
5247     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5248   }
5249 #endif
5250 #ifdef SPIDER_SQL_MODE_NO_AUTO_VALUE_ON_ZERO
5251   if (sql_mode & MODE_NO_AUTO_VALUE_ON_ZERO)
5252   {
5253     if (str->reserve(SPIDER_NO_AUTO_VALUE_ON_ZERO_LEN + SPIDER_SQL_COMMA_LEN))
5254     {
5255       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5256     }
5257     str->q_append(SPIDER_NO_AUTO_VALUE_ON_ZERO_STR, SPIDER_NO_AUTO_VALUE_ON_ZERO_LEN);
5258     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5259   }
5260 #endif
5261 #ifdef SPIDER_SQL_MODE_NO_BACKSLASH_ESCAPES
5262   if (sql_mode & MODE_NO_BACKSLASH_ESCAPES)
5263   {
5264     if (str->reserve(SPIDER_NO_BACKSLASH_ESCAPES_LEN + SPIDER_SQL_COMMA_LEN))
5265     {
5266       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5267     }
5268     str->q_append(SPIDER_NO_BACKSLASH_ESCAPES_STR, SPIDER_NO_BACKSLASH_ESCAPES_LEN);
5269     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5270   }
5271 #endif
5272 #ifdef SPIDER_SQL_MODE_STRICT_TRANS_TABLES
5273   if (sql_mode & MODE_STRICT_TRANS_TABLES)
5274   {
5275     if (str->reserve(SPIDER_STRICT_TRANS_TABLES_LEN + SPIDER_SQL_COMMA_LEN))
5276     {
5277       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5278     }
5279     str->q_append(SPIDER_STRICT_TRANS_TABLES_STR, SPIDER_STRICT_TRANS_TABLES_LEN);
5280     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5281   }
5282 #endif
5283 #ifdef SPIDER_SQL_MODE_STRICT_ALL_TABLES
5284   if (sql_mode & MODE_STRICT_ALL_TABLES)
5285   {
5286     if (str->reserve(SPIDER_STRICT_ALL_TABLES_LEN + SPIDER_SQL_COMMA_LEN))
5287     {
5288       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5289     }
5290     str->q_append(SPIDER_STRICT_ALL_TABLES_STR, SPIDER_STRICT_ALL_TABLES_LEN);
5291     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5292   }
5293 #endif
5294 #ifdef SPIDER_SQL_MODE_NO_ZERO_IN_DATE
5295   if (sql_mode & MODE_NO_ZERO_IN_DATE)
5296   {
5297     if (str->reserve(SPIDER_NO_ZERO_IN_DATE_LEN + SPIDER_SQL_COMMA_LEN))
5298     {
5299       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5300     }
5301     str->q_append(SPIDER_NO_ZERO_IN_DATE_STR, SPIDER_NO_ZERO_IN_DATE_LEN);
5302     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5303   }
5304 #endif
5305 #ifdef SPIDER_SQL_MODE_NO_ZERO_DATE
5306   if (sql_mode & MODE_NO_ZERO_DATE)
5307   {
5308     if (str->reserve(SPIDER_NO_ZERO_DATE_LEN + SPIDER_SQL_COMMA_LEN))
5309     {
5310       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5311     }
5312     str->q_append(SPIDER_NO_ZERO_DATE_STR, SPIDER_NO_ZERO_DATE_LEN);
5313     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5314   }
5315 #endif
5316 #ifdef SPIDER_SQL_MODE_INVALID_DATES
5317   if (sql_mode & MODE_INVALID_DATES)
5318   {
5319     if (str->reserve(SPIDER_INVALID_DATES_LEN + SPIDER_SQL_COMMA_LEN))
5320     {
5321       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5322     }
5323     str->q_append(SPIDER_INVALID_DATES_STR, SPIDER_INVALID_DATES_LEN);
5324     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5325   }
5326 #endif
5327 #ifdef SPIDER_SQL_MODE_ERROR_FOR_DIVISION_BY_ZERO
5328   if (sql_mode & MODE_ERROR_FOR_DIVISION_BY_ZERO)
5329   {
5330     if (str->reserve(SPIDER_ERROR_FOR_DIVISION_BY_ZERO_LEN + SPIDER_SQL_COMMA_LEN))
5331     {
5332       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5333     }
5334     str->q_append(SPIDER_ERROR_FOR_DIVISION_BY_ZERO_STR, SPIDER_ERROR_FOR_DIVISION_BY_ZERO_LEN);
5335     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5336   }
5337 #endif
5338 #ifdef SPIDER_SQL_MODE_TRADITIONAL
5339   if (sql_mode & MODE_TRADITIONAL)
5340   {
5341     if (str->reserve(SPIDER_TRADITIONAL_LEN + SPIDER_SQL_COMMA_LEN))
5342     {
5343       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5344     }
5345     str->q_append(SPIDER_TRADITIONAL_STR, SPIDER_TRADITIONAL_LEN);
5346     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5347   }
5348 #endif
5349 #ifdef SPIDER_SQL_MODE_NO_AUTO_CREATE_USER
5350   if (sql_mode & MODE_NO_AUTO_CREATE_USER)
5351   {
5352     if (str->reserve(SPIDER_NO_AUTO_CREATE_USER_LEN + SPIDER_SQL_COMMA_LEN))
5353     {
5354       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5355     }
5356     str->q_append(SPIDER_NO_AUTO_CREATE_USER_STR, SPIDER_NO_AUTO_CREATE_USER_LEN);
5357     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5358   }
5359 #endif
5360 #ifdef SPIDER_SQL_MODE_HIGH_NOT_PRECEDENCE
5361   if (sql_mode & MODE_HIGH_NOT_PRECEDENCE)
5362   {
5363     if (str->reserve(SPIDER_HIGH_NOT_PRECEDENCE_LEN + SPIDER_SQL_COMMA_LEN))
5364     {
5365       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5366     }
5367     str->q_append(SPIDER_HIGH_NOT_PRECEDENCE_STR, SPIDER_HIGH_NOT_PRECEDENCE_LEN);
5368     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5369   }
5370 #endif
5371 #ifdef SPIDER_SQL_MODE_NO_ENGINE_SUBSTITUTION
5372   if (sql_mode & MODE_NO_ENGINE_SUBSTITUTION)
5373   {
5374     if (str->reserve(SPIDER_NO_ENGINE_SUBSTITUTION_LEN + SPIDER_SQL_COMMA_LEN))
5375     {
5376       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5377     }
5378     str->q_append(SPIDER_NO_ENGINE_SUBSTITUTION_STR, SPIDER_NO_ENGINE_SUBSTITUTION_LEN);
5379     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5380   }
5381 #endif
5382 #ifdef SPIDER_SQL_MODE_PAD_CHAR_TO_FULL_LENGTH
5383   if (sql_mode & MODE_PAD_CHAR_TO_FULL_LENGTH)
5384   {
5385     if (str->reserve(SPIDER_PAD_CHAR_TO_FULL_LENGTH_LEN + SPIDER_SQL_COMMA_LEN))
5386     {
5387       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5388     }
5389     str->q_append(SPIDER_PAD_CHAR_TO_FULL_LENGTH_STR, SPIDER_PAD_CHAR_TO_FULL_LENGTH_LEN);
5390     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5391   }
5392 #endif
5393   DBUG_RETURN(0);
5394 }
5395 
append_sql_mode_internal(spider_string * str,sql_mode_t sql_mode)5396 int spider_db_mariadb_util::append_sql_mode_internal(
5397   spider_string *str,
5398   sql_mode_t sql_mode
5399 ) {
5400   int error_num;
5401   DBUG_ENTER("spider_db_mbase_util::append_sql_mode_internal");
5402   DBUG_PRINT("info",("spider this=%p", this));
5403   if ((error_num = spider_db_mbase_util::append_sql_mode_internal(
5404     str, sql_mode)))
5405   {
5406     DBUG_RETURN(error_num);
5407   }
5408 #ifdef SPIDER_SQL_MODE_EMPTY_STRING_IS_NULL
5409   if (sql_mode & MODE_EMPTY_STRING_IS_NULL)
5410   {
5411     if (str->reserve(SPIDER_EMPTY_STRING_IS_NULL_LEN + SPIDER_SQL_COMMA_LEN))
5412     {
5413       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5414     }
5415     str->q_append(SPIDER_EMPTY_STRING_IS_NULL_STR, SPIDER_EMPTY_STRING_IS_NULL_LEN);
5416     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5417   }
5418 #endif
5419 #ifdef SPIDER_SQL_MODE_SIMULTANEOUS_ASSIGNMENT
5420   if (sql_mode & MODE_SIMULTANEOUS_ASSIGNMENT)
5421   {
5422     if (str->reserve(SPIDER_SIMULTANEOUS_ASSIGNMENT_LEN + SPIDER_SQL_COMMA_LEN))
5423     {
5424       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5425     }
5426     str->q_append(SPIDER_SIMULTANEOUS_ASSIGNMENT_STR, SPIDER_SIMULTANEOUS_ASSIGNMENT_LEN);
5427     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5428   }
5429 #endif
5430 #ifdef SPIDER_SQL_MODE_TIME_ROUND_FRACTIONAL
5431   if (sql_mode & MODE_TIME_ROUND_FRACTIONAL)
5432   {
5433     if (str->reserve(SPIDER_TIME_ROUND_FRACTIONAL_LEN + SPIDER_SQL_COMMA_LEN))
5434     {
5435       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5436     }
5437     str->q_append(SPIDER_TIME_ROUND_FRACTIONAL_STR, SPIDER_TIME_ROUND_FRACTIONAL_LEN);
5438     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5439   }
5440 #endif
5441   DBUG_RETURN(0);
5442 }
5443 
append_sql_mode(spider_string * str,sql_mode_t sql_mode)5444 int spider_db_mbase_util::append_sql_mode(
5445   spider_string *str,
5446   sql_mode_t sql_mode
5447 ) {
5448   int error_num;
5449   uint length;
5450   DBUG_ENTER("spider_db_mbase_util::append_sql_mode");
5451   DBUG_PRINT("info",("spider this=%p", this));
5452   if (str->reserve(SPIDER_SQL_SEMICOLON_LEN + SPIDER_SQL_SQL_MODE_LEN))
5453   {
5454     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5455   }
5456   if (str->length())
5457   {
5458     str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
5459   }
5460   str->q_append(SPIDER_SQL_SQL_MODE_STR, SPIDER_SQL_SQL_MODE_LEN);
5461   length = str->length();
5462   if ((error_num = append_sql_mode_internal(str, sql_mode)))
5463   {
5464     DBUG_RETURN(error_num);
5465   }
5466   if (str->length() > length)
5467   {
5468     str->length(str->length() - SPIDER_SQL_COMMA_LEN);
5469   } else {
5470     if (str->reserve(SPIDER_SQL_VALUE_QUOTE_LEN))
5471     {
5472       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5473     }
5474   }
5475   str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
5476   DBUG_RETURN(0);
5477 }
5478 
append_time_zone(spider_string * str,Time_zone * time_zone)5479 int spider_db_mbase_util::append_time_zone(
5480   spider_string *str,
5481   Time_zone *time_zone
5482 ) {
5483   const String *tz_str = time_zone->get_name();
5484   DBUG_ENTER("spider_db_mbase_util::append_time_zone");
5485   DBUG_PRINT("info",("spider this=%p", this));
5486   if (str->reserve(SPIDER_SQL_SEMICOLON_LEN + SPIDER_SQL_TIME_ZONE_LEN +
5487     tz_str->length() + SPIDER_SQL_VALUE_QUOTE_LEN))
5488     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5489   if (str->length())
5490     str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
5491   str->q_append(SPIDER_SQL_TIME_ZONE_STR, SPIDER_SQL_TIME_ZONE_LEN);
5492   str->q_append(tz_str->ptr(), tz_str->length());
5493   str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
5494   DBUG_RETURN(0);
5495 }
5496 
append_start_transaction(spider_string * str)5497 int spider_db_mbase_util::append_start_transaction(
5498   spider_string *str
5499 ) {
5500   DBUG_ENTER("spider_db_mbase_util::append_start_transaction");
5501   DBUG_PRINT("info",("spider this=%p", this));
5502   if (str->reserve(SPIDER_SQL_SEMICOLON_LEN +
5503     SPIDER_SQL_START_TRANSACTION_LEN))
5504     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5505   if (str->length())
5506   {
5507     str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
5508   }
5509   str->q_append(SPIDER_SQL_START_TRANSACTION_STR,
5510     SPIDER_SQL_START_TRANSACTION_LEN);
5511   DBUG_RETURN(0);
5512 }
5513 
append_xa_start(spider_string * str,XID * xid)5514 int spider_db_mbase_util::append_xa_start(
5515   spider_string *str,
5516   XID *xid
5517 ) {
5518   DBUG_ENTER("spider_db_mbase_util::append_xa_start");
5519   DBUG_PRINT("info",("spider this=%p", this));
5520   if (str->reserve(SPIDER_SQL_SEMICOLON_LEN +
5521     SPIDER_SQL_XA_START_LEN + XIDDATASIZE + sizeof(long) + 9))
5522     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5523   if (str->length())
5524   {
5525     str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
5526   }
5527   str->q_append(SPIDER_SQL_XA_START_STR, SPIDER_SQL_XA_START_LEN);
5528   spider_db_append_xid_str(str, xid);
5529   DBUG_RETURN(0);
5530 }
5531 
append_lock_table_head(spider_string * str)5532 int spider_db_mbase_util::append_lock_table_head(
5533   spider_string *str
5534 ) {
5535   DBUG_ENTER("spider_db_mbase_util::append_lock_table_head");
5536   DBUG_PRINT("info",("spider this=%p", this));
5537   if (str->reserve(SPIDER_SQL_LOCK_TABLE_LEN))
5538     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5539   str->q_append(SPIDER_SQL_LOCK_TABLE_STR, SPIDER_SQL_LOCK_TABLE_LEN);
5540   DBUG_RETURN(0);
5541 }
5542 
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)5543 int spider_db_mbase_util::append_lock_table_body(
5544   spider_string *str,
5545   const char *db_name,
5546   uint db_name_length,
5547   CHARSET_INFO *db_name_charset,
5548   const char *table_name,
5549   uint table_name_length,
5550   CHARSET_INFO *table_name_charset,
5551   int lock_type
5552 ) {
5553   DBUG_ENTER("spider_db_mbase_util::append_lock_table_body");
5554   DBUG_PRINT("info",("spider this=%p", this));
5555   if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN))
5556   {
5557     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5558   }
5559   str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
5560   if (
5561     str->append(db_name, db_name_length, db_name_charset) ||
5562     str->reserve((SPIDER_SQL_NAME_QUOTE_LEN) * 2 + SPIDER_SQL_DOT_LEN)
5563   ) {
5564     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5565   }
5566   str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
5567   str->q_append(SPIDER_SQL_DOT_STR, SPIDER_SQL_DOT_LEN);
5568   str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
5569   if (
5570     str->append(table_name, table_name_length, table_name_charset) ||
5571     str->reserve(SPIDER_SQL_NAME_QUOTE_LEN +
5572       spider_db_table_lock_len[lock_type])
5573   ) {
5574     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5575   }
5576   str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
5577   str->q_append(spider_db_table_lock_str[lock_type],
5578     spider_db_table_lock_len[lock_type]);
5579   DBUG_RETURN(0);
5580 }
5581 
append_lock_table_tail(spider_string * str)5582 int spider_db_mbase_util::append_lock_table_tail(
5583   spider_string *str
5584 ) {
5585   DBUG_ENTER("spider_db_mbase_util::append_lock_table_tail");
5586   DBUG_PRINT("info",("spider this=%p", this));
5587   str->length(str->length() - SPIDER_SQL_COMMA_LEN);
5588   DBUG_RETURN(0);
5589 }
5590 
append_unlock_table(spider_string * str)5591 int spider_db_mbase_util::append_unlock_table(
5592   spider_string *str
5593 ) {
5594   DBUG_ENTER("spider_db_mbase_util::append_unlock_table");
5595   DBUG_PRINT("info",("spider this=%p", this));
5596   if (str->reserve(SPIDER_SQL_UNLOCK_TABLE_LEN))
5597   {
5598     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5599   }
5600   str->q_append(SPIDER_SQL_UNLOCK_TABLE_STR, SPIDER_SQL_UNLOCK_TABLE_LEN);
5601   DBUG_RETURN(0);
5602 }
5603 
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)5604 int spider_db_mbase_util::open_item_func(
5605   Item_func *item_func,
5606   ha_spider *spider,
5607   spider_string *str,
5608   const char *alias,
5609   uint alias_length,
5610   bool use_fields,
5611   spider_fields *fields
5612 ) {
5613   int error_num;
5614   Item *item, **item_list = item_func->arguments();
5615   Field *field;
5616   uint roop_count, item_count = item_func->argument_count(), start_item = 0;
5617   const char *func_name = SPIDER_SQL_NULL_CHAR_STR,
5618     *separator_str = SPIDER_SQL_NULL_CHAR_STR,
5619     *last_str = SPIDER_SQL_NULL_CHAR_STR;
5620   int func_name_length = SPIDER_SQL_NULL_CHAR_LEN,
5621     separator_str_length = SPIDER_SQL_NULL_CHAR_LEN,
5622     last_str_length = SPIDER_SQL_NULL_CHAR_LEN;
5623   int use_pushdown_udf;
5624   bool merge_func = FALSE;
5625   DBUG_ENTER("spider_db_mbase_util::open_item_func");
5626   if (str)
5627   {
5628     if (str->reserve(SPIDER_SQL_OPEN_PAREN_LEN))
5629       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5630     str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
5631   }
5632   DBUG_PRINT("info",("spider functype = %d", item_func->functype()));
5633   switch (item_func->functype())
5634   {
5635     case Item_func::ISNULL_FUNC:
5636       last_str = SPIDER_SQL_IS_NULL_STR;
5637       last_str_length = SPIDER_SQL_IS_NULL_LEN;
5638       break;
5639     case Item_func::ISNOTNULL_FUNC:
5640       last_str = SPIDER_SQL_IS_NOT_NULL_STR;
5641       last_str_length = SPIDER_SQL_IS_NOT_NULL_LEN;
5642       break;
5643     case Item_func::UNKNOWN_FUNC:
5644       func_name = (char*) item_func->func_name();
5645       func_name_length = strlen(func_name);
5646       DBUG_PRINT("info",("spider func_name = %s", func_name));
5647       DBUG_PRINT("info",("spider func_name_length = %d", func_name_length));
5648       if (func_name_length == 1 &&
5649         (
5650           !strncasecmp("+", func_name, func_name_length) ||
5651           !strncasecmp("-", func_name, func_name_length) ||
5652           !strncasecmp("*", func_name, func_name_length) ||
5653           !strncasecmp("/", func_name, func_name_length) ||
5654           !strncasecmp("%", func_name, func_name_length) ||
5655           !strncasecmp("&", func_name, func_name_length) ||
5656           !strncasecmp("|", func_name, func_name_length) ||
5657           !strncasecmp("^", func_name, func_name_length)
5658         )
5659       ) {
5660         /* no action */
5661         break;
5662       } else if (func_name_length == 2 &&
5663         (
5664           !strncasecmp("<<", func_name, func_name_length) ||
5665           !strncasecmp(">>", func_name, func_name_length)
5666         )
5667       ) {
5668         /* no action */
5669         break;
5670       } else if (func_name_length == 3 &&
5671         !strncasecmp("div", func_name, func_name_length)
5672       ) {
5673         /* no action */
5674         break;
5675       } else if (func_name_length == 4)
5676       {
5677         if (
5678           !strncasecmp("rand", func_name, func_name_length) &&
5679 #ifdef SPIDER_Item_args_arg_count_IS_PROTECTED
5680           !item_func->argument_count()
5681 #else
5682           !item_func->arg_count
5683 #endif
5684         ) {
5685           if (str)
5686             str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
5687           DBUG_RETURN(spider_db_open_item_int(item_func, NULL, spider, str,
5688             alias, alias_length, dbton_id, use_fields, fields));
5689         } else if (
5690           !strncasecmp("trim", func_name, func_name_length) &&
5691           item_count == 2
5692         ) {
5693           /* item_count == 1 means this TRIM() is without a remove_str */
5694           item = item_list[0];
5695           Item *item_tmp = item_list[1];
5696           if (str)
5697           {
5698             if (item_tmp->is_of_type(Item::CONST_ITEM, STRING_RESULT))
5699             {
5700               /* 1. append 'TRIM(BOTH ' */
5701               if (str->reserve(SPIDER_SQL_TRIM_LEN + SPIDER_SQL_OPEN_PAREN_LEN +
5702                                SPIDER_SQL_TRIM_BOTH_LEN))
5703                 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5704               str->q_append(SPIDER_SQL_TRIM_STR, SPIDER_SQL_TRIM_LEN);
5705               str->q_append(SPIDER_SQL_OPEN_PAREN_STR,
5706                             SPIDER_SQL_OPEN_PAREN_LEN);
5707               str->q_append(SPIDER_SQL_TRIM_BOTH_STR, SPIDER_SQL_TRIM_BOTH_LEN);
5708               /* 2. append "remove_str"*/
5709               if ((error_num = spider_db_print_item_type(
5710                       item_tmp, NULL, spider, str, alias, alias_length, dbton_id,
5711                       use_fields, fields)))
5712                 DBUG_RETURN(error_num);
5713               /* 3. append ' FROM ' */
5714               if (str->reserve(SPIDER_SQL_FROM_LEN))
5715                 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5716               str->q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN);
5717               /* 4. append `field` */
5718               if ((error_num = spider_db_print_item_type(
5719                       item, NULL, spider, str, alias, alias_length, dbton_id,
5720                       use_fields, fields)))
5721                 DBUG_RETURN(error_num);
5722               /* 5. append ')' */
5723               if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN))
5724                 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5725               str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,
5726                             SPIDER_SQL_CLOSE_PAREN_LEN);
5727             }
5728           }
5729           item_count -= 2;
5730           break;
5731         }
5732       } else if (func_name_length == 5)
5733       {
5734         if (
5735           (!strncasecmp("ltrim", func_name, func_name_length) ||
5736            !strncasecmp("rtrim", func_name, func_name_length)) &&
5737           (item_count == 2)
5738         ) {
5739           /* the func_name for TRIM(LEADING ...) is LTRIM, for TRIM(TRAILING) is RTRIM */
5740           /* item_count == 2 means this TRIM(LEADING/TRAILING ...) is with a remove_str */
5741           item = item_list[0];
5742           Item *item_tmp = item_list[1];
5743           if (str)
5744           {
5745             if (item_tmp->is_of_type(Item::CONST_ITEM, STRING_RESULT))
5746             {
5747               /* 1. append 'TRIM(LEADING ' or 'TRIM(TRAILING ' */
5748               if (func_name[0] == 'l' || func_name[0] == 'L')
5749               { /* ltrim */
5750                 if (str->reserve(SPIDER_SQL_TRIM_LEN + SPIDER_SQL_OPEN_PAREN_LEN +
5751                                  SPIDER_SQL_TRIM_LEADING_LEN))
5752                   DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5753                 str->q_append(SPIDER_SQL_TRIM_STR, SPIDER_SQL_TRIM_LEN);
5754                 str->q_append(SPIDER_SQL_OPEN_PAREN_STR,
5755                               SPIDER_SQL_OPEN_PAREN_LEN);
5756                 str->q_append(SPIDER_SQL_TRIM_LEADING_STR, SPIDER_SQL_TRIM_LEADING_LEN);
5757               } else
5758               { /* rtrim */
5759                 if (str->reserve(SPIDER_SQL_TRIM_LEN + SPIDER_SQL_OPEN_PAREN_LEN +
5760                                  SPIDER_SQL_TRIM_TRAILING_LEN))
5761                   DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5762                 str->q_append(SPIDER_SQL_TRIM_STR, SPIDER_SQL_TRIM_LEN);
5763                 str->q_append(SPIDER_SQL_OPEN_PAREN_STR,
5764                               SPIDER_SQL_OPEN_PAREN_LEN);
5765                 str->q_append(SPIDER_SQL_TRIM_TRAILING_STR, SPIDER_SQL_TRIM_TRAILING_LEN);
5766               }
5767               /* 2. append "remove_str"*/
5768               if ((error_num = spider_db_print_item_type(
5769                   item_tmp, NULL, spider, str, alias, alias_length, dbton_id,
5770                   use_fields, fields)))
5771                 DBUG_RETURN(error_num);
5772               /* 3. append ' FROM ' */
5773               if (str->reserve(SPIDER_SQL_FROM_LEN))
5774                 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5775               str->q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN);
5776               /* 4. append `field` */
5777               if ((error_num = spider_db_print_item_type(
5778                   item, NULL, spider, str, alias, alias_length, dbton_id,
5779                   use_fields, fields)))
5780                 DBUG_RETURN(error_num);
5781               /* 5. append ')' */
5782               if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN))
5783                 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5784               str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,
5785                             SPIDER_SQL_CLOSE_PAREN_LEN);
5786             }
5787           }
5788           item_count -= 2;
5789           break;
5790         }
5791       } else if (func_name_length == 6 &&
5792         !strncasecmp("istrue", func_name, func_name_length)
5793       ) {
5794         last_str = SPIDER_SQL_IS_TRUE_STR;
5795         last_str_length = SPIDER_SQL_IS_TRUE_LEN;
5796         break;
5797       } else if (func_name_length == 7)
5798       {
5799         if (!strncasecmp("isfalse", func_name, func_name_length))
5800         {
5801           last_str = SPIDER_SQL_IS_FALSE_STR;
5802           last_str_length = SPIDER_SQL_IS_FALSE_LEN;
5803           break;
5804         } else if (
5805           !strncasecmp("sysdate", func_name, func_name_length) ||
5806           !strncasecmp("curdate", func_name, func_name_length) ||
5807           !strncasecmp("curtime", func_name, func_name_length)
5808         ) {
5809           if (str)
5810             str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
5811           DBUG_RETURN(spider_db_open_item_string(item_func, NULL, spider, str,
5812             alias, alias_length, dbton_id, use_fields, fields));
5813         } else if (
5814           !strncasecmp("convert", func_name, func_name_length)
5815         ) {
5816           if (str)
5817           {
5818             if (str->reserve(func_name_length * 2 + SPIDER_SQL_OPEN_PAREN_LEN))
5819               DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5820             str->q_append(func_name, func_name_length);
5821             str->q_append(SPIDER_SQL_OPEN_PAREN_STR,
5822               SPIDER_SQL_OPEN_PAREN_LEN);
5823             last_str = SPIDER_SQL_CLOSE_PAREN_STR;
5824             last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
5825           }
5826           break;
5827         }
5828       } else if (func_name_length == 8 &&
5829         (
5830           !strncasecmp("utc_date", func_name, func_name_length) ||
5831           !strncasecmp("utc_time", func_name, func_name_length)
5832         )
5833       ) {
5834         if (str)
5835           str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
5836         DBUG_RETURN(spider_db_open_item_string(item_func, NULL, spider, str,
5837           alias, alias_length, dbton_id, use_fields, fields));
5838       } else if (func_name_length == 9 &&
5839         !strncasecmp("isnottrue", func_name, func_name_length)
5840       ) {
5841         last_str = SPIDER_SQL_IS_NOT_TRUE_STR;
5842         last_str_length = SPIDER_SQL_IS_NOT_TRUE_LEN;
5843         break;
5844       } else if (func_name_length == 10)
5845       {
5846         if (!strncasecmp("isnotfalse", func_name, func_name_length))
5847         {
5848           last_str = SPIDER_SQL_IS_NOT_FALSE_STR;
5849           last_str_length = SPIDER_SQL_IS_NOT_FALSE_LEN;
5850           break;
5851         } else if (!strncasecmp("column_get", func_name, func_name_length))
5852         {
5853           if (str)
5854           {
5855             str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
5856             if (str->reserve(func_name_length + SPIDER_SQL_OPEN_PAREN_LEN))
5857               DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5858             str->q_append(func_name, func_name_length);
5859             str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
5860           }
5861           func_name = SPIDER_SQL_COMMA_STR;
5862           func_name_length = SPIDER_SQL_COMMA_LEN;
5863           separator_str = SPIDER_SQL_COMMA_STR;
5864           separator_str_length = SPIDER_SQL_COMMA_LEN;
5865           break;
5866         }
5867       } else if (func_name_length == 12)
5868       {
5869         if (!strncasecmp("cast_as_date", func_name, func_name_length))
5870         {
5871           item = item_list[0];
5872           if (item->type() == Item::FUNC_ITEM)
5873           {
5874             DBUG_PRINT("info",("spider child is FUNC_ITEM"));
5875             Item_func *ifunc = (Item_func *) item;
5876             if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
5877             {
5878               const char *child_func_name;
5879               int child_func_name_length;
5880               DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
5881               child_func_name = (char*) ifunc->func_name();
5882               child_func_name_length = strlen(child_func_name);
5883               DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
5884               if (
5885                 child_func_name_length == 10 &&
5886                 !strncasecmp("column_get", child_func_name, child_func_name_length)
5887               ) {
5888                 DBUG_PRINT("info",("spider this is merge func"));
5889                 merge_func = TRUE;
5890               }
5891             }
5892           }
5893 
5894           if (str)
5895           {
5896             str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
5897             if (!merge_func)
5898             {
5899               if (str->reserve(SPIDER_SQL_CAST_LEN))
5900                 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5901               str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
5902             }
5903           }
5904           last_str = SPIDER_SQL_AS_DATE_STR;
5905           last_str_length = SPIDER_SQL_AS_DATE_LEN;
5906           break;
5907         } else if (!strncasecmp("cast_as_time", func_name, func_name_length))
5908         {
5909           item = item_list[0];
5910           if (item->type() == Item::FUNC_ITEM)
5911           {
5912             DBUG_PRINT("info",("spider child is FUNC_ITEM"));
5913             Item_func *ifunc = (Item_func *) item;
5914             if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
5915             {
5916               const char *child_func_name;
5917               int child_func_name_length;
5918               DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
5919               child_func_name = (char*) ifunc->func_name();
5920               child_func_name_length = strlen(child_func_name);
5921               DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
5922               if (
5923                 child_func_name_length == 10 &&
5924                 !strncasecmp("column_get", child_func_name, child_func_name_length)
5925               ) {
5926                 DBUG_PRINT("info",("spider this is merge func"));
5927                 merge_func = TRUE;
5928               }
5929             }
5930           }
5931 
5932           if (str)
5933           {
5934             str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
5935             if (!merge_func)
5936             {
5937               if (str->reserve(SPIDER_SQL_CAST_LEN))
5938                 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5939               str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
5940             }
5941           }
5942           last_str = SPIDER_SQL_AS_TIME_STR;
5943           last_str_length = SPIDER_SQL_AS_TIME_LEN;
5944           break;
5945         }
5946       } else if (func_name_length == 13)
5947       {
5948         if (!strncasecmp("utc_timestamp", func_name, func_name_length))
5949         {
5950           if (str)
5951             str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
5952           DBUG_RETURN(spider_db_open_item_string(item_func, NULL, spider, str,
5953             alias, alias_length, dbton_id, use_fields, fields));
5954         } else if (!strncasecmp("timestampdiff", func_name, func_name_length))
5955         {
5956 #ifdef ITEM_FUNC_TIMESTAMPDIFF_ARE_PUBLIC
5957           Item_func_timestamp_diff *item_func_timestamp_diff =
5958             (Item_func_timestamp_diff *) item_func;
5959           if (str)
5960           {
5961             const char *interval_str;
5962             uint interval_len;
5963             switch (item_func_timestamp_diff->int_type)
5964             {
5965               case INTERVAL_YEAR:
5966                 interval_str = SPIDER_SQL_YEAR_STR;
5967                 interval_len = SPIDER_SQL_YEAR_LEN;
5968                 break;
5969               case INTERVAL_QUARTER:
5970                 interval_str = SPIDER_SQL_QUARTER_STR;
5971                 interval_len = SPIDER_SQL_QUARTER_LEN;
5972                 break;
5973               case INTERVAL_MONTH:
5974                 interval_str = SPIDER_SQL_MONTH_STR;
5975                 interval_len = SPIDER_SQL_MONTH_LEN;
5976                 break;
5977               case INTERVAL_WEEK:
5978                 interval_str = SPIDER_SQL_WEEK_STR;
5979                 interval_len = SPIDER_SQL_WEEK_LEN;
5980                 break;
5981               case INTERVAL_DAY:
5982                 interval_str = SPIDER_SQL_DAY_STR;
5983                 interval_len = SPIDER_SQL_DAY_LEN;
5984                 break;
5985               case INTERVAL_HOUR:
5986                 interval_str = SPIDER_SQL_HOUR_STR;
5987                 interval_len = SPIDER_SQL_HOUR_LEN;
5988                 break;
5989               case INTERVAL_MINUTE:
5990                 interval_str = SPIDER_SQL_MINUTE_STR;
5991                 interval_len = SPIDER_SQL_MINUTE_LEN;
5992                 break;
5993               case INTERVAL_SECOND:
5994                 interval_str = SPIDER_SQL_SECOND_STR;
5995                 interval_len = SPIDER_SQL_SECOND_LEN;
5996                 break;
5997               case INTERVAL_MICROSECOND:
5998                 interval_str = SPIDER_SQL_MICROSECOND_STR;
5999                 interval_len = SPIDER_SQL_MICROSECOND_LEN;
6000                 break;
6001               default:
6002                 interval_str = "";
6003                 interval_len = 0;
6004                 break;
6005             }
6006             str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
6007             if (str->reserve(func_name_length + SPIDER_SQL_OPEN_PAREN_LEN +
6008               interval_len + SPIDER_SQL_COMMA_LEN))
6009               DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6010             str->q_append(func_name, func_name_length);
6011             str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
6012             str->q_append(interval_str, interval_len);
6013             str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
6014           }
6015           if ((error_num = spider_db_print_item_type(item_list[0], NULL, spider,
6016             str, alias, alias_length, dbton_id, use_fields, fields)))
6017             DBUG_RETURN(error_num);
6018           if (str)
6019           {
6020             if (str->reserve(SPIDER_SQL_COMMA_LEN))
6021               DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6022             str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
6023           }
6024           if ((error_num = spider_db_print_item_type(item_list[1], NULL, spider,
6025             str, alias, alias_length, dbton_id, use_fields, fields)))
6026             DBUG_RETURN(error_num);
6027           if (str)
6028           {
6029             if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN))
6030               DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6031             str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,
6032               SPIDER_SQL_CLOSE_PAREN_LEN);
6033           }
6034           DBUG_RETURN(0);
6035 #else
6036           DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
6037 #endif
6038         }
6039       } else if (func_name_length == 14)
6040       {
6041         if (!strncasecmp("cast_as_binary", func_name, func_name_length))
6042         {
6043           item = item_list[0];
6044           if (item->type() == Item::FUNC_ITEM)
6045           {
6046             DBUG_PRINT("info",("spider child is FUNC_ITEM"));
6047             Item_func *ifunc = (Item_func *) item;
6048             if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
6049             {
6050               const char *child_func_name;
6051               int child_func_name_length;
6052               DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
6053               child_func_name = (char*) ifunc->func_name();
6054               child_func_name_length = strlen(child_func_name);
6055               DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
6056               if (
6057                 child_func_name_length == 10 &&
6058                 !strncasecmp("column_get", child_func_name, child_func_name_length)
6059               ) {
6060                 DBUG_PRINT("info",("spider this is merge func"));
6061                 merge_func = TRUE;
6062               }
6063             }
6064           }
6065 
6066           if (str)
6067           {
6068             char tmp_buf[MAX_FIELD_WIDTH], *tmp_ptr, *tmp_ptr2;
6069             spider_string tmp_str(tmp_buf, MAX_FIELD_WIDTH, str->charset());
6070             tmp_str.init_calc_mem(123);
6071             tmp_str.length(0);
6072             str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
6073             if (!merge_func)
6074             {
6075               if (str->reserve(SPIDER_SQL_CAST_LEN))
6076                 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6077               str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
6078             }
6079 #if MYSQL_VERSION_ID < 50500
6080             item_func->print(tmp_str.get_str(), QT_IS);
6081 #else
6082             item_func->print(tmp_str.get_str(), QT_TO_SYSTEM_CHARSET);
6083 #endif
6084             tmp_str.mem_calc();
6085             if (tmp_str.reserve(1))
6086               DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6087             tmp_ptr = tmp_str.c_ptr_quick();
6088             DBUG_PRINT("info",("spider tmp_ptr = %s", tmp_ptr));
6089             while ((tmp_ptr2 = strstr(tmp_ptr, SPIDER_SQL_AS_BINARY_STR)))
6090               tmp_ptr = tmp_ptr2 + 1;
6091             last_str = tmp_ptr - 1;
6092             last_str_length = strlen(last_str) - SPIDER_SQL_CLOSE_PAREN_LEN;
6093           }
6094           break;
6095         } else if (!strncasecmp("cast_as_signed", func_name, func_name_length))
6096         {
6097           item = item_list[0];
6098           if (item->type() == Item::FUNC_ITEM)
6099           {
6100             DBUG_PRINT("info",("spider child is FUNC_ITEM"));
6101             Item_func *ifunc = (Item_func *) item;
6102             if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
6103             {
6104               const char *child_func_name;
6105               int child_func_name_length;
6106               DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
6107               child_func_name = (char*) ifunc->func_name();
6108               child_func_name_length = strlen(child_func_name);
6109               DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
6110               if (
6111                 child_func_name_length == 10 &&
6112                 !strncasecmp("column_get", child_func_name, child_func_name_length)
6113               ) {
6114                 DBUG_PRINT("info",("spider this is merge func"));
6115                 merge_func = TRUE;
6116               }
6117             }
6118           }
6119 
6120           if (str)
6121           {
6122             str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
6123             if (!merge_func)
6124             {
6125               if (str->reserve(SPIDER_SQL_CAST_LEN))
6126                 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6127               str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
6128             }
6129           }
6130           last_str = SPIDER_SQL_AS_SIGNED_STR;
6131           last_str_length = SPIDER_SQL_AS_SIGNED_LEN;
6132           break;
6133         }
6134       } else if (func_name_length == 16)
6135       {
6136         if (!strncasecmp("cast_as_unsigned", func_name, func_name_length))
6137         {
6138           item = item_list[0];
6139           if (item->type() == Item::FUNC_ITEM)
6140           {
6141             DBUG_PRINT("info",("spider child is FUNC_ITEM"));
6142             Item_func *ifunc = (Item_func *) item;
6143             if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
6144             {
6145               const char *child_func_name;
6146               int child_func_name_length;
6147               DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
6148               child_func_name = (char*) ifunc->func_name();
6149               child_func_name_length = strlen(child_func_name);
6150               DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
6151               if (
6152                 child_func_name_length == 10 &&
6153                 !strncasecmp("column_get", child_func_name, child_func_name_length)
6154               ) {
6155                 DBUG_PRINT("info",("spider this is merge func"));
6156                 merge_func = TRUE;
6157               }
6158             }
6159           }
6160 
6161           if (str)
6162           {
6163             str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
6164             if (!merge_func)
6165             {
6166               if (str->reserve(SPIDER_SQL_CAST_LEN))
6167                 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6168               str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
6169             }
6170           }
6171           last_str = SPIDER_SQL_AS_UNSIGNED_STR;
6172           last_str_length = SPIDER_SQL_AS_UNSIGNED_LEN;
6173           break;
6174         } else if (!strncasecmp("decimal_typecast", func_name,
6175           func_name_length))
6176         {
6177           item = item_list[0];
6178           if (item->type() == Item::FUNC_ITEM)
6179           {
6180             DBUG_PRINT("info",("spider child is FUNC_ITEM"));
6181             Item_func *ifunc = (Item_func *) item;
6182             if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
6183             {
6184               const char *child_func_name;
6185               int child_func_name_length;
6186               DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
6187               child_func_name = (char*) ifunc->func_name();
6188               child_func_name_length = strlen(child_func_name);
6189               DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
6190               if (
6191                 child_func_name_length == 10 &&
6192                 !strncasecmp("column_get", child_func_name, child_func_name_length)
6193               ) {
6194                 DBUG_PRINT("info",("spider this is merge func"));
6195                 merge_func = TRUE;
6196               }
6197             }
6198           }
6199 
6200           if (str)
6201           {
6202             char tmp_buf[MAX_FIELD_WIDTH], *tmp_ptr, *tmp_ptr2;
6203             spider_string tmp_str(tmp_buf, MAX_FIELD_WIDTH, str->charset());
6204             tmp_str.init_calc_mem(124);
6205             tmp_str.length(0);
6206             str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
6207             if (!merge_func)
6208             {
6209               if (str->reserve(SPIDER_SQL_CAST_LEN))
6210                 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6211               str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
6212             }
6213 #if MYSQL_VERSION_ID < 50500
6214             item_func->print(tmp_str.get_str(), QT_IS);
6215 #else
6216             item_func->print(tmp_str.get_str(), QT_TO_SYSTEM_CHARSET);
6217 #endif
6218             tmp_str.mem_calc();
6219             if (tmp_str.reserve(1))
6220               DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6221             tmp_ptr = tmp_str.c_ptr_quick();
6222             DBUG_PRINT("info",("spider tmp_ptr = %s", tmp_ptr));
6223             while ((tmp_ptr2 = strstr(tmp_ptr, SPIDER_SQL_AS_DECIMAL_STR)))
6224               tmp_ptr = tmp_ptr2 + 1;
6225             last_str = tmp_ptr - 1;
6226             last_str_length = strlen(last_str) - SPIDER_SQL_CLOSE_PAREN_LEN;
6227           }
6228           break;
6229         } else if (!strncasecmp("cast_as_datetime", func_name,
6230           func_name_length))
6231         {
6232           item = item_list[0];
6233           if (item->type() == Item::FUNC_ITEM)
6234           {
6235             DBUG_PRINT("info",("spider child is FUNC_ITEM"));
6236             Item_func *ifunc = (Item_func *) item;
6237             if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
6238             {
6239               const char *child_func_name;
6240               int child_func_name_length;
6241               DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
6242               child_func_name = (char*) ifunc->func_name();
6243               child_func_name_length = strlen(child_func_name);
6244               DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
6245               if (
6246                 child_func_name_length == 10 &&
6247                 !strncasecmp("column_get", child_func_name, child_func_name_length)
6248               ) {
6249                 DBUG_PRINT("info",("spider this is merge func"));
6250                 merge_func = TRUE;
6251               }
6252             }
6253           }
6254 
6255           if (str)
6256           {
6257             str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
6258             if (!merge_func)
6259             {
6260               if (str->reserve(SPIDER_SQL_CAST_LEN))
6261                 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6262               str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
6263             }
6264           }
6265           last_str = SPIDER_SQL_AS_DATETIME_STR;
6266           last_str_length = SPIDER_SQL_AS_DATETIME_LEN;
6267           break;
6268         }
6269       } else if (func_name_length == 17)
6270       {
6271         if (!strncasecmp("date_add_interval", func_name, func_name_length))
6272         {
6273           Item_date_add_interval *item_date_add_interval =
6274             (Item_date_add_interval *) item_func;
6275           func_name = spider_db_timefunc_interval_str[
6276             item_date_add_interval->int_type];
6277           func_name_length = strlen(func_name);
6278           if ((error_num = spider_db_print_item_type(item_list[0], NULL, spider,
6279             str, alias, alias_length, dbton_id, use_fields, fields)))
6280             DBUG_RETURN(error_num);
6281           if (str)
6282           {
6283             if (item_date_add_interval->date_sub_interval)
6284             {
6285               if (str->reserve(SPIDER_SQL_NEGINTERVAL_LEN))
6286                 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6287               str->q_append(SPIDER_SQL_NEGINTERVAL_STR,
6288                 SPIDER_SQL_NEGINTERVAL_LEN);
6289             } else {
6290               if (str->reserve(SPIDER_SQL_INTERVAL_LEN))
6291                 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6292               str->q_append(SPIDER_SQL_INTERVAL_STR, SPIDER_SQL_INTERVAL_LEN);
6293             }
6294           }
6295           if ((error_num = spider_db_print_item_type(item_list[1], NULL, spider,
6296             str, alias, alias_length, dbton_id, use_fields, fields)))
6297             DBUG_RETURN(error_num);
6298           if (str)
6299           {
6300             if (str->reserve(func_name_length + SPIDER_SQL_CLOSE_PAREN_LEN))
6301               DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6302             str->q_append(func_name, func_name_length);
6303             str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,
6304               SPIDER_SQL_CLOSE_PAREN_LEN);
6305           }
6306           DBUG_RETURN(0);
6307         }
6308       }
6309       if (str)
6310       {
6311         if (str->reserve(func_name_length + SPIDER_SQL_OPEN_PAREN_LEN))
6312           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6313         str->q_append(func_name, func_name_length);
6314         str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
6315       }
6316       func_name = SPIDER_SQL_COMMA_STR;
6317       func_name_length = SPIDER_SQL_COMMA_LEN;
6318       separator_str = SPIDER_SQL_COMMA_STR;
6319       separator_str_length = SPIDER_SQL_COMMA_LEN;
6320       last_str = SPIDER_SQL_CLOSE_PAREN_STR;
6321       last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
6322       break;
6323     case Item_func::NOW_FUNC:
6324       if (str)
6325         str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
6326       DBUG_RETURN(spider_db_open_item_string(item_func, NULL, spider,
6327         str, alias, alias_length, dbton_id, use_fields, fields));
6328     case Item_func::CHAR_TYPECAST_FUNC:
6329       DBUG_PRINT("info",("spider CHAR_TYPECAST_FUNC"));
6330       {
6331         item = item_list[0];
6332         if (item->type() == Item::FUNC_ITEM)
6333         {
6334           DBUG_PRINT("info",("spider child is FUNC_ITEM"));
6335           Item_func *ifunc = (Item_func *) item;
6336           if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
6337           {
6338             const char *child_func_name;
6339             int child_func_name_length;
6340             DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
6341             child_func_name = (char*) ifunc->func_name();
6342             child_func_name_length = strlen(child_func_name);
6343             DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
6344             if (
6345               child_func_name_length == 10 &&
6346               !strncasecmp("column_get", child_func_name, child_func_name_length)
6347             ) {
6348               DBUG_PRINT("info",("spider this is merge func"));
6349               merge_func = TRUE;
6350             }
6351           }
6352         }
6353 
6354         if (str)
6355         {
6356           char tmp_buf[MAX_FIELD_WIDTH], *tmp_ptr, *tmp_ptr2;
6357           spider_string tmp_str(tmp_buf, MAX_FIELD_WIDTH, str->charset());
6358           tmp_str.init_calc_mem(125);
6359           tmp_str.length(0);
6360           str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
6361           if (!merge_func)
6362           {
6363             if (str->reserve(SPIDER_SQL_CAST_LEN))
6364               DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6365             str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
6366           }
6367 #if MYSQL_VERSION_ID < 50500
6368           item_func->print(tmp_str.get_str(), QT_IS);
6369 #else
6370           item_func->print(tmp_str.get_str(), QT_TO_SYSTEM_CHARSET);
6371 #endif
6372           tmp_str.mem_calc();
6373           if (tmp_str.reserve(1))
6374             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6375           tmp_ptr = tmp_str.c_ptr_quick();
6376           DBUG_PRINT("info",("spider tmp_ptr = %s", tmp_ptr));
6377           while ((tmp_ptr2 = strstr(tmp_ptr, SPIDER_SQL_AS_CHAR_STR)))
6378             tmp_ptr = tmp_ptr2 + 1;
6379           last_str = tmp_ptr - 1;
6380           last_str_length = strlen(last_str) - SPIDER_SQL_CLOSE_PAREN_LEN;
6381         }
6382       }
6383       break;
6384     case Item_func::NOT_FUNC:
6385       DBUG_PRINT("info",("spider NOT_FUNC"));
6386       if (item_list[0]->type() == Item::COND_ITEM)
6387       {
6388         DBUG_PRINT("info",("spider item_list[0] is COND_ITEM"));
6389         Item_cond *item_cond = (Item_cond *) item_list[0];
6390         if (item_cond->functype() == Item_func::COND_AND_FUNC)
6391         {
6392           DBUG_PRINT("info",("spider item_cond is COND_AND_FUNC"));
6393           List_iterator_fast<Item> lif(*(item_cond->argument_list()));
6394           bool has_expr_cache_item = FALSE;
6395           bool has_isnotnull_func = FALSE;
6396           bool has_other_item = FALSE;
6397           while((item = lif++))
6398           {
6399 #ifdef SPIDER_HAS_EXPR_CACHE_ITEM
6400             if (
6401               item->type() == Item::EXPR_CACHE_ITEM
6402             ) {
6403               DBUG_PRINT("info",("spider EXPR_CACHE_ITEM"));
6404               has_expr_cache_item = TRUE;
6405             } else
6406 #endif
6407             if (
6408               item->type() == Item::FUNC_ITEM &&
6409               ((Item_func *) item)->functype() == Item_func::ISNOTNULL_FUNC
6410             ) {
6411               DBUG_PRINT("info",("spider ISNOTNULL_FUNC"));
6412               has_isnotnull_func = TRUE;
6413             } else {
6414               DBUG_PRINT("info",("spider has other item"));
6415               DBUG_PRINT("info",("spider COND type=%d", item->type()));
6416               has_other_item = TRUE;
6417             }
6418           }
6419           if (has_expr_cache_item && has_isnotnull_func && !has_other_item)
6420           {
6421             DBUG_PRINT("info",("spider NOT EXISTS skip"));
6422             DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
6423           }
6424         }
6425       }
6426       if (str)
6427       {
6428         func_name = (char*) item_func->func_name();
6429         func_name_length = strlen(func_name);
6430         if (str->reserve(func_name_length + SPIDER_SQL_SPACE_LEN))
6431           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6432         str->q_append(func_name, func_name_length);
6433         str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
6434       }
6435       break;
6436     case Item_func::NEG_FUNC:
6437       if (str)
6438       {
6439         func_name = (char*) item_func->func_name();
6440         func_name_length = strlen(func_name);
6441         if (str->reserve(func_name_length + SPIDER_SQL_SPACE_LEN))
6442           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6443         str->q_append(func_name, func_name_length);
6444         str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
6445       }
6446       break;
6447     case Item_func::IN_FUNC:
6448       if (((Item_func_opt_neg *) item_func)->negated)
6449       {
6450         func_name = SPIDER_SQL_NOT_IN_STR;
6451         func_name_length = SPIDER_SQL_NOT_IN_LEN;
6452         separator_str = SPIDER_SQL_COMMA_STR;
6453         separator_str_length = SPIDER_SQL_COMMA_LEN;
6454         last_str = SPIDER_SQL_CLOSE_PAREN_STR;
6455         last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
6456       } else {
6457         func_name = SPIDER_SQL_IN_STR;
6458         func_name_length = SPIDER_SQL_IN_LEN;
6459         separator_str = SPIDER_SQL_COMMA_STR;
6460         separator_str_length = SPIDER_SQL_COMMA_LEN;
6461         last_str = SPIDER_SQL_CLOSE_PAREN_STR;
6462         last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
6463       }
6464       break;
6465     case Item_func::BETWEEN:
6466       if (((Item_func_opt_neg *) item_func)->negated)
6467       {
6468         func_name = SPIDER_SQL_NOT_BETWEEN_STR;
6469         func_name_length = SPIDER_SQL_NOT_BETWEEN_LEN;
6470         separator_str = SPIDER_SQL_AND_STR;
6471         separator_str_length = SPIDER_SQL_AND_LEN;
6472       } else {
6473         func_name = (char*) item_func->func_name();
6474         func_name_length = strlen(func_name);
6475         separator_str = SPIDER_SQL_AND_STR;
6476         separator_str_length = SPIDER_SQL_AND_LEN;
6477       }
6478       break;
6479     case Item_func::FUNC_SP:
6480     case Item_func::UDF_FUNC:
6481       use_pushdown_udf = spider_param_use_pushdown_udf(spider->trx->thd,
6482         spider->share->use_pushdown_udf);
6483       if (!use_pushdown_udf)
6484         /*
6485           This is the default behavior because the remote nodes may deal with
6486           the function in an unexpected way (e.g. not having the same
6487           definition). Users can turn it on if they know what they are doing.
6488         */
6489         DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
6490       if (str)
6491       {
6492         func_name = (char*) item_func->func_name();
6493         func_name_length = strlen(func_name);
6494         DBUG_PRINT("info",("spider func_name = %s", func_name));
6495         DBUG_PRINT("info",("spider func_name_length = %d", func_name_length));
6496         if (str->reserve(func_name_length + SPIDER_SQL_OPEN_PAREN_LEN))
6497           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6498         str->q_append(func_name, func_name_length);
6499         str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
6500       }
6501       func_name = SPIDER_SQL_COMMA_STR;
6502       func_name_length = SPIDER_SQL_COMMA_LEN;
6503       separator_str = SPIDER_SQL_COMMA_STR;
6504       separator_str_length = SPIDER_SQL_COMMA_LEN;
6505       last_str = SPIDER_SQL_CLOSE_PAREN_STR;
6506       last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
6507       break;
6508 #ifdef MARIADB_BASE_VERSION
6509     case Item_func::XOR_FUNC:
6510 #else
6511     case Item_func::COND_XOR_FUNC:
6512 #endif
6513       if (str)
6514         str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
6515       DBUG_RETURN(
6516         spider_db_open_item_cond((Item_cond *) item_func, spider, str,
6517           alias, alias_length, dbton_id, use_fields, fields));
6518     case Item_func::TRIG_COND_FUNC:
6519       DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
6520     case Item_func::GUSERVAR_FUNC:
6521       if (str)
6522         str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
6523       if (item_func->result_type() == STRING_RESULT)
6524         DBUG_RETURN(spider_db_open_item_string(item_func, NULL, spider, str,
6525           alias, alias_length, dbton_id, use_fields, fields));
6526       else
6527         DBUG_RETURN(spider_db_open_item_int(item_func, NULL, spider, str,
6528           alias, alias_length, dbton_id, use_fields, fields));
6529     case Item_func::FT_FUNC:
6530       if (spider_db_check_ft_idx(item_func, spider) == MAX_KEY)
6531         DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
6532       start_item = 1;
6533       if (str)
6534       {
6535         if (str->reserve(SPIDER_SQL_MATCH_LEN))
6536           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6537         str->q_append(SPIDER_SQL_MATCH_STR, SPIDER_SQL_MATCH_LEN);
6538       }
6539       separator_str = SPIDER_SQL_COMMA_STR;
6540       separator_str_length = SPIDER_SQL_COMMA_LEN;
6541       last_str = SPIDER_SQL_CLOSE_PAREN_STR;
6542       last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
6543       break;
6544     case Item_func::SP_EQUALS_FUNC:
6545       if (str)
6546       {
6547         func_name = SPIDER_SQL_MBR_EQUAL_STR;
6548         func_name_length = SPIDER_SQL_MBR_EQUAL_LEN;
6549         DBUG_PRINT("info",("spider func_name = %s", func_name));
6550         DBUG_PRINT("info",("spider func_name_length = %d", func_name_length));
6551         if (str->reserve(func_name_length))
6552           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6553         str->q_append(func_name, func_name_length);
6554       }
6555       func_name = SPIDER_SQL_COMMA_STR;
6556       func_name_length = SPIDER_SQL_COMMA_LEN;
6557       separator_str = SPIDER_SQL_COMMA_STR;
6558       separator_str_length = SPIDER_SQL_COMMA_LEN;
6559       last_str = SPIDER_SQL_CLOSE_PAREN_STR;
6560       last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
6561       break;
6562     case Item_func::SP_DISJOINT_FUNC:
6563     case Item_func::SP_INTERSECTS_FUNC:
6564     case Item_func::SP_TOUCHES_FUNC:
6565     case Item_func::SP_CROSSES_FUNC:
6566     case Item_func::SP_WITHIN_FUNC:
6567     case Item_func::SP_CONTAINS_FUNC:
6568     case Item_func::SP_OVERLAPS_FUNC:
6569       if (str)
6570       {
6571         func_name = (char*) item_func->func_name();
6572         func_name_length = strlen(func_name);
6573         DBUG_PRINT("info",("spider func_name = %s", func_name));
6574         DBUG_PRINT("info",("spider func_name_length = %d", func_name_length));
6575         if (str->reserve(
6576 #ifndef SPIDER_ITEM_GEOFUNC_NAME_HAS_MBR
6577           SPIDER_SQL_MBR_LEN +
6578 #endif
6579           func_name_length + SPIDER_SQL_OPEN_PAREN_LEN))
6580           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6581 #ifndef SPIDER_ITEM_GEOFUNC_NAME_HAS_MBR
6582         str->q_append(SPIDER_SQL_MBR_STR, SPIDER_SQL_MBR_LEN);
6583 #endif
6584         str->q_append(func_name, func_name_length);
6585         str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
6586       }
6587       func_name = SPIDER_SQL_COMMA_STR;
6588       func_name_length = SPIDER_SQL_COMMA_LEN;
6589       separator_str = SPIDER_SQL_COMMA_STR;
6590       separator_str_length = SPIDER_SQL_COMMA_LEN;
6591       last_str = SPIDER_SQL_CLOSE_PAREN_STR;
6592       last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
6593       break;
6594     case Item_func::EQ_FUNC:
6595     case Item_func::EQUAL_FUNC:
6596     case Item_func::NE_FUNC:
6597     case Item_func::LT_FUNC:
6598     case Item_func::LE_FUNC:
6599     case Item_func::GE_FUNC:
6600     case Item_func::GT_FUNC:
6601       if (str)
6602       {
6603         func_name = (char*) item_func->func_name();
6604         func_name_length = strlen(func_name);
6605       }
6606       break;
6607     case Item_func::LIKE_FUNC:
6608 #ifdef SPIDER_LIKE_FUNC_HAS_GET_NEGATED
6609       if (str)
6610       {
6611          if (((Item_func_like *)item_func)->get_negated())
6612          {
6613             func_name = SPIDER_SQL_NOT_LIKE_STR;
6614             func_name_length = SPIDER_SQL_NOT_LIKE_LEN;
6615          }
6616          else
6617          {
6618             func_name = (char*)item_func->func_name();
6619             func_name_length = strlen(func_name);
6620          }
6621       }
6622       break;
6623 #else
6624       DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
6625 #endif
6626     case Item_func::CASE_SEARCHED_FUNC:
6627     case Item_func::CASE_SIMPLE_FUNC:
6628 #ifdef ITEM_FUNC_CASE_PARAMS_ARE_PUBLIC
6629       Item_func_case *item_func_case = (Item_func_case *) item_func;
6630       if (str)
6631       {
6632         if (str->reserve(SPIDER_SQL_CASE_LEN))
6633           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6634         str->q_append(SPIDER_SQL_CASE_STR, SPIDER_SQL_CASE_LEN);
6635       }
6636       if (item_func_case->first_expr_num != -1)
6637       {
6638         if ((error_num = spider_db_print_item_type(
6639           item_list[item_func_case->first_expr_num], NULL, spider, str,
6640           alias, alias_length, dbton_id, use_fields, fields)))
6641           DBUG_RETURN(error_num);
6642       }
6643       for (roop_count = 0; roop_count < item_func_case->ncases;
6644         roop_count += 2)
6645       {
6646         if (str)
6647         {
6648           if (str->reserve(SPIDER_SQL_WHEN_LEN))
6649             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6650           str->q_append(SPIDER_SQL_WHEN_STR, SPIDER_SQL_WHEN_LEN);
6651         }
6652         if ((error_num = spider_db_print_item_type(
6653           item_list[roop_count], NULL, spider, str,
6654           alias, alias_length, dbton_id, use_fields, fields)))
6655           DBUG_RETURN(error_num);
6656         if (str)
6657         {
6658           if (str->reserve(SPIDER_SQL_THEN_LEN))
6659             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6660           str->q_append(SPIDER_SQL_THEN_STR, SPIDER_SQL_THEN_LEN);
6661         }
6662         if ((error_num = spider_db_print_item_type(
6663           item_list[roop_count + 1], NULL, spider, str,
6664           alias, alias_length, dbton_id, use_fields, fields)))
6665           DBUG_RETURN(error_num);
6666       }
6667       if (item_func_case->else_expr_num != -1)
6668       {
6669         if (str)
6670         {
6671           if (str->reserve(SPIDER_SQL_ELSE_LEN))
6672             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6673           str->q_append(SPIDER_SQL_ELSE_STR, SPIDER_SQL_ELSE_LEN);
6674         }
6675         if ((error_num = spider_db_print_item_type(
6676           item_list[item_func_case->else_expr_num], NULL, spider, str,
6677           alias, alias_length, dbton_id, use_fields, fields)))
6678           DBUG_RETURN(error_num);
6679       }
6680       if (str)
6681       {
6682         if (str->reserve(SPIDER_SQL_END_LEN + SPIDER_SQL_CLOSE_PAREN_LEN))
6683           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6684         str->q_append(SPIDER_SQL_END_STR, SPIDER_SQL_END_LEN);
6685         str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,
6686           SPIDER_SQL_CLOSE_PAREN_LEN);
6687       }
6688       DBUG_RETURN(0);
6689 #else
6690       DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
6691 #endif
6692     case Item_func::JSON_EXTRACT_FUNC:
6693       func_name = (char*) item_func->func_name();
6694       func_name_length = strlen(func_name);
6695       if (str)
6696       {
6697         if (str->reserve(func_name_length + SPIDER_SQL_OPEN_PAREN_LEN))
6698           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6699         str->q_append(func_name, func_name_length);
6700         str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
6701       }
6702       func_name = SPIDER_SQL_COMMA_STR;
6703       func_name_length = SPIDER_SQL_COMMA_LEN;
6704       separator_str = SPIDER_SQL_COMMA_STR;
6705       separator_str_length = SPIDER_SQL_COMMA_LEN;
6706       last_str = SPIDER_SQL_CLOSE_PAREN_STR;
6707       last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
6708       break;
6709     default:
6710       THD *thd = spider->trx->thd;
6711       SPIDER_SHARE *share = spider->share;
6712       if (spider_param_skip_default_condition(thd,
6713         share->skip_default_condition))
6714         DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
6715       if (str)
6716       {
6717         func_name = (char*) item_func->func_name();
6718         func_name_length = strlen(func_name);
6719       }
6720       break;
6721   }
6722   DBUG_PRINT("info",("spider func_name = %s", func_name));
6723   DBUG_PRINT("info",("spider func_name_length = %d", func_name_length));
6724   DBUG_PRINT("info",("spider separator_str = %s", separator_str));
6725   DBUG_PRINT("info",("spider separator_str_length = %d", separator_str_length));
6726   DBUG_PRINT("info",("spider last_str = %s", last_str));
6727   DBUG_PRINT("info",("spider last_str_length = %d", last_str_length));
6728   if (item_count)
6729   {
6730     /* Find the field in the list of items of the expression tree */
6731     field = spider_db_find_field_in_item_list(item_list,
6732                                               item_count, start_item,
6733                                               str,
6734                                               func_name, func_name_length);
6735     item_count--;
6736     /*
6737       Loop through the items of the current function expression to
6738       print its portion of the statement
6739     */
6740     for (roop_count = start_item; roop_count < item_count; roop_count++)
6741     {
6742       item = item_list[roop_count];
6743       if ((error_num = spider_db_print_item_type(item, field, spider, str,
6744         alias, alias_length, dbton_id, use_fields, fields)))
6745         DBUG_RETURN(error_num);
6746       if (roop_count == 1)
6747       {
6748         /* Remaining operands need to be preceded by the separator */
6749         func_name = separator_str;
6750         func_name_length = separator_str_length;
6751       }
6752       if (str)
6753       {
6754         if (str->reserve(func_name_length + SPIDER_SQL_SPACE_LEN * 2))
6755           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6756         str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
6757         str->q_append(func_name, func_name_length);
6758         str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
6759       }
6760     }
6761 
6762     /* Print the last operand value */
6763     item = item_list[roop_count];
6764     if ((error_num = spider_db_print_item_type(item, field, spider, str,
6765       alias, alias_length, dbton_id, use_fields, fields)))
6766       DBUG_RETURN(error_num);
6767   }
6768 
6769   if (item_func->functype() == Item_func::FT_FUNC)
6770   {
6771     Item_func_match *item_func_match = (Item_func_match *)item_func;
6772     if (str)
6773     {
6774       if (str->reserve(SPIDER_SQL_AGAINST_LEN))
6775         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6776       str->q_append(SPIDER_SQL_AGAINST_STR, SPIDER_SQL_AGAINST_LEN);
6777     }
6778     item = item_list[0];
6779     if ((error_num = spider_db_print_item_type(item, NULL, spider, str,
6780       alias, alias_length, dbton_id, use_fields, fields)))
6781       DBUG_RETURN(error_num);
6782     if (str)
6783     {
6784       if (str->reserve(
6785         ((item_func_match->flags & FT_BOOL) ?
6786           SPIDER_SQL_IN_BOOLEAN_MODE_LEN : 0) +
6787         ((item_func_match->flags & FT_EXPAND) ?
6788           SPIDER_SQL_WITH_QUERY_EXPANSION_LEN : 0)
6789       ))
6790         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6791       if (item_func_match->flags & FT_BOOL)
6792         str->q_append(SPIDER_SQL_IN_BOOLEAN_MODE_STR,
6793           SPIDER_SQL_IN_BOOLEAN_MODE_LEN);
6794       if (item_func_match->flags & FT_EXPAND)
6795         str->q_append(SPIDER_SQL_WITH_QUERY_EXPANSION_STR,
6796           SPIDER_SQL_WITH_QUERY_EXPANSION_LEN);
6797     }
6798   } else if (item_func->functype() == Item_func::UNKNOWN_FUNC)
6799   {
6800     if (
6801       func_name_length == 7 &&
6802       !strncasecmp("convert", func_name, func_name_length)
6803     ) {
6804       if (str)
6805       {
6806         Item_func_conv_charset *item_func_conv_charset =
6807           (Item_func_conv_charset *)item_func;
6808         CHARSET_INFO *conv_charset =
6809           item_func_conv_charset->SPIDER_Item_func_conv_charset_conv_charset;
6810         uint cset_length = strlen(conv_charset->csname);
6811         if (str->reserve(SPIDER_SQL_USING_LEN + cset_length))
6812           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6813         str->q_append(SPIDER_SQL_USING_STR, SPIDER_SQL_USING_LEN);
6814         str->q_append(conv_charset->csname, cset_length);
6815       }
6816     }
6817   }
6818   if (str)
6819   {
6820     if (merge_func)
6821       str->length(str->length() - SPIDER_SQL_CLOSE_PAREN_LEN);
6822     if (str->reserve(last_str_length + SPIDER_SQL_CLOSE_PAREN_LEN))
6823       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6824     str->q_append(last_str, last_str_length);
6825     str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
6826   }
6827   DBUG_RETURN(0);
6828 }
6829 
6830 #ifdef HANDLER_HAS_DIRECT_AGGREGATE
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)6831 int spider_db_mbase_util::open_item_sum_func(
6832   Item_sum *item_sum,
6833   ha_spider *spider,
6834   spider_string *str,
6835   const char *alias,
6836   uint alias_length,
6837   bool use_fields,
6838   spider_fields *fields
6839 ) {
6840   uint roop_count, item_count = item_sum->get_arg_count();
6841   int error_num;
6842   DBUG_ENTER("spider_db_mbase_util::open_item_sum_func");
6843   DBUG_PRINT("info",("spider Sumfunctype = %d", item_sum->sum_func()));
6844   switch (item_sum->sum_func())
6845   {
6846     case Item_sum::COUNT_FUNC:
6847     case Item_sum::SUM_FUNC:
6848     case Item_sum::MIN_FUNC:
6849     case Item_sum::MAX_FUNC:
6850       {
6851         const char *func_name = item_sum->func_name();
6852         uint func_name_length = strlen(func_name);
6853         Item *item, **args = item_sum->get_args();
6854         if (str)
6855         {
6856           if (str->reserve(func_name_length))
6857             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6858           str->q_append(func_name, func_name_length);
6859         }
6860         if (item_count)
6861         {
6862           item_count--;
6863           for (roop_count = 0; roop_count < item_count; roop_count++)
6864           {
6865             item = args[roop_count];
6866             if ((error_num = spider_db_print_item_type(item, NULL, spider, str,
6867               alias, alias_length, dbton_id, use_fields, fields)))
6868               DBUG_RETURN(error_num);
6869             if (str)
6870             {
6871               if (str->reserve(SPIDER_SQL_COMMA_LEN))
6872                 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6873               str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
6874             }
6875           }
6876           item = args[roop_count];
6877           if ((error_num = spider_db_print_item_type(item, NULL, spider, str,
6878             alias, alias_length, dbton_id, use_fields, fields)))
6879             DBUG_RETURN(error_num);
6880         }
6881         if (str)
6882         {
6883           if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN))
6884             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6885           str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,
6886             SPIDER_SQL_CLOSE_PAREN_LEN);
6887         }
6888       }
6889       break;
6890     case Item_sum::COUNT_DISTINCT_FUNC:
6891     case Item_sum::SUM_DISTINCT_FUNC:
6892     case Item_sum::AVG_FUNC:
6893     case Item_sum::AVG_DISTINCT_FUNC:
6894       {
6895         if (!use_fields)
6896           DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
6897         const char *func_name = item_sum->func_name();
6898         uint func_name_length = strlen(func_name);
6899         Item *item, **args = item_sum->get_args();
6900         if (str)
6901         {
6902           if (str->reserve(func_name_length))
6903             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6904           str->q_append(func_name, func_name_length);
6905         }
6906         if (item_count)
6907         {
6908           item_count--;
6909           for (roop_count = 0; roop_count < item_count; roop_count++)
6910           {
6911             item = args[roop_count];
6912             if ((error_num = spider_db_print_item_type(item, NULL, spider, str,
6913               alias, alias_length, dbton_id, use_fields, fields)))
6914               DBUG_RETURN(error_num);
6915             if (str)
6916             {
6917               if (str->reserve(SPIDER_SQL_COMMA_LEN))
6918                 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6919               str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
6920             }
6921           }
6922           item = args[roop_count];
6923           if ((error_num = spider_db_print_item_type(item, NULL, spider, str,
6924             alias, alias_length, dbton_id, use_fields, fields)))
6925             DBUG_RETURN(error_num);
6926         }
6927         if (str)
6928         {
6929           if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN))
6930             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6931           str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,
6932             SPIDER_SQL_CLOSE_PAREN_LEN);
6933         }
6934       }
6935       break;
6936     case Item_sum::STD_FUNC:
6937     case Item_sum::VARIANCE_FUNC:
6938     case Item_sum::SUM_BIT_FUNC:
6939     case Item_sum::UDF_SUM_FUNC:
6940     case Item_sum::GROUP_CONCAT_FUNC:
6941     default:
6942       DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
6943   }
6944   DBUG_RETURN(0);
6945 }
6946 #endif
6947 
append_escaped_util(spider_string * to,String * from)6948 int spider_db_mbase_util::append_escaped_util(
6949   spider_string *to,
6950   String *from
6951 ) {
6952   DBUG_ENTER("spider_db_mbase_util::append_escaped_util");
6953   DBUG_PRINT("info",("spider this=%p", this));
6954   DBUG_PRINT("info",("spider from=%s", from->charset()->csname));
6955   DBUG_PRINT("info",("spider to=%s", to->charset()->csname));
6956   to->append_escape_string(from->ptr(), from->length());
6957   DBUG_RETURN(0);
6958 }
6959 
6960 #ifdef SPIDER_HAS_GROUP_BY_HANDLER
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)6961 int spider_db_mbase_util::append_table(
6962   ha_spider *spider,
6963   spider_fields *fields,
6964   spider_string *str,
6965   TABLE_LIST *table_list,
6966   TABLE_LIST **used_table_list,
6967   uint *current_pos,
6968   TABLE_LIST **cond_table_list_ptr,
6969   bool top_down,
6970   bool first
6971 ) {
6972   int error_num;
6973   bool use_cond_table_list = FALSE;
6974   spider_mbase_share *db_share;
6975   spider_mbase_handler *dbton_hdl;
6976   SPIDER_TABLE_HOLDER *table_holder;
6977   TABLE_LIST *cond_table_list = *cond_table_list_ptr;
6978   ha_spider *spd;
6979   DBUG_ENTER("spider_db_mbase_util::append_table");
6980   DBUG_PRINT("info",("spider table_list=%p", table_list));
6981   DBUG_PRINT("info",("spider table_list->outer_join=%u",
6982     table_list->outer_join));
6983   DBUG_PRINT("info",("spider table_list->on_expr=%p",
6984     table_list->on_expr));
6985   DBUG_PRINT("info",("spider table_list->join_using_fields=%p",
6986     table_list->join_using_fields));
6987   DBUG_PRINT("info",("spider table_list->table=%p",
6988     table_list->table));
6989   if (!top_down && table_list->embedding)
6990   {
6991     if ((error_num = append_embedding_tables(spider, fields, str,
6992       table_list->embedding, used_table_list, current_pos,
6993       cond_table_list_ptr)))
6994       DBUG_RETURN(error_num);
6995   } else if (!table_list->table)
6996   {
6997     if ((error_num = append_tables_top_down(spider, fields, str, table_list,
6998       used_table_list, current_pos, cond_table_list_ptr)))
6999       DBUG_RETURN(error_num);
7000   } else {
7001     if (
7002       table_list->outer_join ||
7003       table_list->on_expr ||
7004       table_list->join_using_fields
7005     ) {
7006       DBUG_PRINT("info",("spider use table_list"));
7007       if (table_list->outer_join & JOIN_TYPE_LEFT)
7008       {
7009         if (str)
7010         {
7011           if (str->reserve(SPIDER_SQL_LEFT_JOIN_LEN))
7012           {
7013             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7014           }
7015           str->q_append(SPIDER_SQL_LEFT_JOIN_STR, SPIDER_SQL_LEFT_JOIN_LEN);
7016         }
7017       } else {
7018         if (str)
7019         {
7020           if (str->reserve(SPIDER_SQL_JOIN_LEN))
7021           {
7022             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7023           }
7024           str->q_append(SPIDER_SQL_JOIN_STR, SPIDER_SQL_JOIN_LEN);
7025         }
7026       }
7027     } else if (
7028       cond_table_list &&
7029       (
7030         cond_table_list->outer_join ||
7031         cond_table_list->on_expr ||
7032         cond_table_list->join_using_fields
7033       )
7034     ) {
7035       DBUG_PRINT("info",("spider use cond_table_list"));
7036       if (cond_table_list->outer_join & (JOIN_TYPE_LEFT | JOIN_TYPE_RIGHT))
7037       {
7038         if (str)
7039         {
7040           if (str->reserve(SPIDER_SQL_LEFT_JOIN_LEN))
7041           {
7042             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7043           }
7044           str->q_append(SPIDER_SQL_LEFT_JOIN_STR, SPIDER_SQL_LEFT_JOIN_LEN);
7045         }
7046       } else {
7047         if (str)
7048         {
7049           if (str->reserve(SPIDER_SQL_JOIN_LEN))
7050           {
7051             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7052           }
7053           str->q_append(SPIDER_SQL_JOIN_STR, SPIDER_SQL_JOIN_LEN);
7054         }
7055       }
7056       use_cond_table_list = TRUE;
7057     } else if (*current_pos > 0 && !first)
7058     {
7059       DBUG_PRINT("info",("spider no condition"));
7060       if (top_down)
7061       {
7062         if (str)
7063         {
7064           if (str->reserve(SPIDER_SQL_JOIN_LEN))
7065           {
7066             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7067           }
7068           str->q_append(SPIDER_SQL_JOIN_STR, SPIDER_SQL_JOIN_LEN);
7069         }
7070       } else {
7071         if (str)
7072         {
7073           if (str->reserve(SPIDER_SQL_COMMA_LEN))
7074           {
7075             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7076           }
7077           str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
7078         }
7079       }
7080     }
7081 
7082     if (str)
7083     {
7084       table_holder = fields->get_table_holder(table_list->table);
7085       spd = table_holder->spider;
7086       db_share = (spider_mbase_share *)
7087         spd->share->dbton_share[dbton_id];
7088       dbton_hdl = (spider_mbase_handler *)
7089         spd->dbton_handler[dbton_id];
7090 
7091       dbton_hdl->table_name_pos = str->length();
7092 
7093       if (str->reserve(
7094         db_share->db_nm_max_length +
7095         SPIDER_SQL_DOT_LEN + /* SPIDER_SQL_NAME_QUOTE_LEN */ 4 +
7096         db_share->table_nm_max_length + SPIDER_SQL_SPACE_LEN +
7097         table_holder->alias->length() - SPIDER_SQL_DOT_LEN
7098       )) {
7099         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7100       }
7101 
7102       if ((error_num = db_share->append_table_name_with_adjusting(str,
7103         spd->conn_link_idx[dbton_hdl->first_link_idx])))
7104       {
7105         DBUG_RETURN(error_num);
7106       }
7107       str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
7108       str->q_append(table_holder->alias->ptr(),
7109         table_holder->alias->length() - SPIDER_SQL_DOT_LEN);
7110     }
7111     used_table_list[(*current_pos)++] = table_list;
7112 
7113     if (str)
7114     {
7115       List<String> *join_using_fields = table_list->join_using_fields;
7116       if (!join_using_fields && cond_table_list)
7117       {
7118         join_using_fields = cond_table_list->join_using_fields;
7119       }
7120 
7121       if (join_using_fields)
7122       {
7123         if (str->reserve(SPIDER_SQL_USING_LEN + SPIDER_SQL_OPEN_PAREN_LEN))
7124         {
7125           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7126         }
7127         str->q_append(SPIDER_SQL_USING_STR, SPIDER_SQL_USING_LEN);
7128         str->q_append(SPIDER_SQL_OPEN_PAREN_STR,
7129           SPIDER_SQL_OPEN_PAREN_LEN);
7130         List_iterator_fast<String> it2(*join_using_fields);
7131         String *ptr;
7132         while ((ptr = it2++))
7133         {
7134           if (str->reserve(ptr->length() + SPIDER_SQL_COMMA_LEN))
7135           {
7136             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7137           }
7138           str->q_append(ptr->ptr(), ptr->length());
7139           str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
7140         }
7141         str->length(str->length() - SPIDER_SQL_COMMA_LEN);
7142         if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN))
7143         {
7144           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7145         }
7146         str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,
7147           SPIDER_SQL_CLOSE_PAREN_LEN);
7148       }
7149     }
7150 
7151     Item *on_expr = table_list->on_expr;
7152     if (!on_expr && cond_table_list)
7153     {
7154       on_expr = cond_table_list->on_expr;
7155     }
7156 
7157     if (on_expr)
7158     {
7159       if (str)
7160       {
7161         if (str->reserve(SPIDER_SQL_ON_LEN))
7162         {
7163           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7164         }
7165         str->q_append(SPIDER_SQL_ON_STR, SPIDER_SQL_ON_LEN);
7166       }
7167       if ((error_num = spider_db_print_item_type(on_expr, NULL,
7168         spider, str, NULL, 0, dbton_id, TRUE, fields)))
7169       {
7170         DBUG_RETURN(error_num);
7171       }
7172     }
7173 
7174     if (use_cond_table_list)
7175     {
7176       (*cond_table_list_ptr) = NULL;
7177       DBUG_PRINT("info",("spider cond_table_list=%p", (*cond_table_list_ptr)));
7178     }
7179   }
7180   DBUG_RETURN(0);
7181 }
7182 
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)7183 int spider_db_mbase_util::append_tables_top_down(
7184   ha_spider *spider,
7185   spider_fields *fields,
7186   spider_string *str,
7187   TABLE_LIST *table_list,
7188   TABLE_LIST **used_table_list,
7189   uint *current_pos,
7190   TABLE_LIST **cond_table_list_ptr
7191 ) {
7192   int error_num;
7193   uint outer_join_backup;
7194   TABLE_LIST *cur_table_list, *prev_table_list = NULL, *cond_table_list = NULL;
7195   bool first = TRUE;
7196   DBUG_ENTER("spider_db_mbase_util::append_tables_top_down");
7197   DBUG_PRINT("info",("spider this=%p", this));
7198   if (
7199     table_list->outer_join ||
7200     table_list->on_expr ||
7201     table_list->join_using_fields
7202   ) {
7203     DBUG_ASSERT(!(*cond_table_list_ptr));
7204     (*cond_table_list_ptr) = table_list;
7205     DBUG_PRINT("info",("spider cond_table_list=%p", table_list));
7206   }
7207   List_iterator_fast<TABLE_LIST> it1(table_list->nested_join->join_list);
7208   cur_table_list = it1++;
7209   if (cur_table_list->outer_join & JOIN_TYPE_RIGHT)
7210   {
7211     first = FALSE;
7212     prev_table_list = cur_table_list;
7213     cur_table_list = it1++;
7214   } else if (*cond_table_list_ptr)
7215   {
7216     first = TRUE;
7217     cond_table_list = (*cond_table_list_ptr);
7218     (*cond_table_list_ptr) = NULL;
7219     if (cond_table_list->outer_join & JOIN_TYPE_LEFT)
7220     {
7221       if (str)
7222       {
7223         if (str->reserve(SPIDER_SQL_LEFT_JOIN_LEN + SPIDER_SQL_OPEN_PAREN_LEN))
7224         {
7225           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7226         }
7227         str->q_append(SPIDER_SQL_LEFT_JOIN_STR, SPIDER_SQL_LEFT_JOIN_LEN);
7228         str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
7229       }
7230     } else {
7231       if (str)
7232       {
7233         if (str->reserve(SPIDER_SQL_JOIN_LEN + SPIDER_SQL_OPEN_PAREN_LEN))
7234         {
7235           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7236         }
7237         str->q_append(SPIDER_SQL_JOIN_STR, SPIDER_SQL_JOIN_LEN);
7238         str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
7239       }
7240     }
7241   }
7242 
7243   do {
7244     if (cur_table_list->outer_join & JOIN_TYPE_RIGHT)
7245     {
7246       prev_table_list = cur_table_list;
7247     } else {
7248       if ((error_num = append_table(spider, fields, str, cur_table_list,
7249         used_table_list, current_pos, cond_table_list_ptr, TRUE, first)))
7250         DBUG_RETURN(error_num);
7251       first = FALSE;
7252       if (prev_table_list)
7253       {
7254         outer_join_backup = prev_table_list->outer_join;
7255         prev_table_list->outer_join = JOIN_TYPE_LEFT;
7256         if ((error_num = append_table(spider, fields, str, prev_table_list,
7257           used_table_list, current_pos, cond_table_list_ptr, TRUE, FALSE)))
7258         {
7259           prev_table_list->outer_join = outer_join_backup;
7260           DBUG_RETURN(error_num);
7261         }
7262         prev_table_list->outer_join = outer_join_backup;
7263         prev_table_list = NULL;
7264       }
7265     }
7266   } while ((cur_table_list = it1++));
7267 
7268   if (cond_table_list)
7269   {
7270     if (str)
7271     {
7272       if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN))
7273       {
7274         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7275       }
7276       str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,
7277         SPIDER_SQL_CLOSE_PAREN_LEN);
7278 
7279       List<String> *join_using_fields = cond_table_list->join_using_fields;
7280       if (join_using_fields)
7281       {
7282         if (str->reserve(SPIDER_SQL_USING_LEN + SPIDER_SQL_OPEN_PAREN_LEN))
7283         {
7284           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7285         }
7286         str->q_append(SPIDER_SQL_USING_STR, SPIDER_SQL_USING_LEN);
7287         str->q_append(SPIDER_SQL_OPEN_PAREN_STR,
7288           SPIDER_SQL_OPEN_PAREN_LEN);
7289         List_iterator_fast<String> it2(*join_using_fields);
7290         String *ptr;
7291         while ((ptr = it2++))
7292         {
7293           if (str->reserve(ptr->length() + SPIDER_SQL_COMMA_LEN))
7294           {
7295             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7296           }
7297           str->q_append(ptr->ptr(), ptr->length());
7298           str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
7299         }
7300         str->length(str->length() - SPIDER_SQL_COMMA_LEN);
7301         if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN))
7302         {
7303           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7304         }
7305         str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,
7306           SPIDER_SQL_CLOSE_PAREN_LEN);
7307       }
7308     }
7309 
7310     Item *on_expr = cond_table_list->on_expr;
7311     if (on_expr)
7312     {
7313       if (str)
7314       {
7315         if (str->reserve(SPIDER_SQL_ON_LEN))
7316         {
7317           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7318         }
7319         str->q_append(SPIDER_SQL_ON_STR, SPIDER_SQL_ON_LEN);
7320       }
7321       if ((error_num = spider_db_print_item_type(on_expr, NULL,
7322         spider, str, NULL, 0, dbton_id, TRUE, fields)))
7323       {
7324         DBUG_RETURN(error_num);
7325       }
7326     }
7327   }
7328   DBUG_RETURN(0);
7329 }
7330 
append_tables_top_down_check(TABLE_LIST * table_list,TABLE_LIST ** used_table_list,uint * current_pos)7331 int spider_db_mbase_util::append_tables_top_down_check(
7332   TABLE_LIST *table_list,
7333   TABLE_LIST **used_table_list,
7334   uint *current_pos
7335 ) {
7336   int error_num;
7337   TABLE_LIST *cur_table_list;
7338   DBUG_ENTER("spider_db_mbase_util::append_tables_top_down_check");
7339   DBUG_PRINT("info",("spider this=%p", this));
7340   List_iterator_fast<TABLE_LIST> it1(table_list->nested_join->join_list);
7341   while ((cur_table_list = it1++))
7342   {
7343     if (!cur_table_list->table)
7344     {
7345       if ((error_num = append_tables_top_down_check(
7346         cur_table_list, used_table_list, current_pos)))
7347         DBUG_RETURN(error_num);
7348     } else {
7349       used_table_list[(*current_pos)++] = cur_table_list;
7350     }
7351   }
7352   DBUG_RETURN(0);
7353 }
7354 
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)7355 int spider_db_mbase_util::append_embedding_tables(
7356   ha_spider *spider,
7357   spider_fields *fields,
7358   spider_string *str,
7359   TABLE_LIST *table_list,
7360   TABLE_LIST **used_table_list,
7361   uint *current_pos,
7362   TABLE_LIST **cond_table_list_ptr
7363 ) {
7364   int error_num;
7365   TABLE_LIST *embedding = table_list->embedding;
7366   DBUG_ENTER("spider_db_mbase_util::append_embedding_tables");
7367   DBUG_PRINT("info",("spider this=%p", this));
7368   if (embedding)
7369   {
7370     DBUG_PRINT("info",("spider embedding=%p", embedding));
7371     DBUG_PRINT("info",("spider embedding->outer_join=%u",
7372       embedding->outer_join));
7373     DBUG_PRINT("info",("spider embedding->on_expr=%p",
7374       embedding->on_expr));
7375     DBUG_PRINT("info",("spider embedding->join_using_fields=%p",
7376       embedding->join_using_fields));
7377     DBUG_PRINT("info",("spider embedding->table=%p",
7378       embedding->table));
7379     if ((error_num = append_embedding_tables(spider, fields, str, embedding,
7380       used_table_list, current_pos, cond_table_list_ptr)))
7381       DBUG_RETURN(error_num);
7382   } else {
7383     DBUG_PRINT("info",("spider table_list=%p", table_list));
7384     DBUG_PRINT("info",("spider table_list->outer_join=%u",
7385       table_list->outer_join));
7386     DBUG_PRINT("info",("spider table_list->on_expr=%p",
7387       table_list->on_expr));
7388     DBUG_PRINT("info",("spider table_list->join_using_fields=%p",
7389       table_list->join_using_fields));
7390     DBUG_PRINT("info",("spider table_list->table=%p",
7391       table_list->table));
7392     if (table_list->outer_join & JOIN_TYPE_RIGHT)
7393     {
7394       if ((error_num = append_tables_top_down_check(table_list,
7395         used_table_list, current_pos)))
7396         DBUG_RETURN(error_num);
7397       DBUG_ASSERT(!(*cond_table_list_ptr));
7398       (*cond_table_list_ptr) = table_list;
7399       DBUG_PRINT("info",("spider cond_table_list=%p", table_list));
7400     } else {
7401       if ((error_num = append_tables_top_down(spider, fields, str, table_list,
7402         used_table_list, current_pos, cond_table_list_ptr)))
7403         DBUG_RETURN(error_num);
7404     }
7405   }
7406   DBUG_RETURN(0);
7407 }
7408 
append_from_and_tables(ha_spider * spider,spider_fields * fields,spider_string * str,TABLE_LIST * table_list,uint table_count)7409 int spider_db_mbase_util::append_from_and_tables(
7410   ha_spider *spider,
7411   spider_fields *fields,
7412   spider_string *str,
7413   TABLE_LIST *table_list,
7414   uint table_count
7415 ) {
7416   int error_num;
7417   uint current_pos = 0, roop_count, backup_pos, outer_join_backup;
7418   TABLE *table;
7419   TABLE_LIST **used_table_list, *prev_table_list = NULL,
7420     *cond_table_list = NULL;
7421   DBUG_ENTER("spider_db_mbase_util::append_from_and_tables");
7422   DBUG_PRINT("info",("spider this=%p", this));
7423   used_table_list = (TABLE_LIST **)
7424     my_alloca(sizeof(TABLE_LIST *) * table_count);
7425   if (!used_table_list)
7426     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7427 
7428   if (str)
7429   {
7430     if (str->reserve(SPIDER_SQL_FROM_LEN))
7431     {
7432       my_afree(used_table_list);
7433       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7434     }
7435     str->q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN);
7436   }
7437 
7438   do {
7439     table = table_list->table;
7440     if (table->const_table)
7441       continue;
7442 
7443     for (roop_count = 0; roop_count < current_pos; ++roop_count)
7444     {
7445       if (used_table_list[roop_count] == table_list)
7446         break;
7447     }
7448     if (roop_count < current_pos)
7449       continue;
7450 
7451     if (prev_table_list)
7452       current_pos = backup_pos;
7453     else
7454       backup_pos = current_pos;
7455     if ((error_num = append_table(spider, fields, str, table_list, used_table_list,
7456       &current_pos, &cond_table_list, FALSE, FALSE)))
7457     {
7458       my_afree(used_table_list);
7459       DBUG_RETURN(error_num);
7460     }
7461     if (prev_table_list)
7462     {
7463       outer_join_backup = prev_table_list->outer_join;
7464       prev_table_list->outer_join = JOIN_TYPE_LEFT;
7465       if ((error_num = append_table(spider, fields, str, prev_table_list,
7466         used_table_list, &current_pos, &cond_table_list, FALSE, FALSE)))
7467       {
7468         prev_table_list->outer_join = outer_join_backup;
7469         my_afree(used_table_list);
7470         DBUG_RETURN(error_num);
7471       }
7472       prev_table_list->outer_join = outer_join_backup;
7473       prev_table_list = NULL;
7474     }
7475     if (cond_table_list && (cond_table_list->outer_join & JOIN_TYPE_RIGHT))
7476     {
7477       prev_table_list = cond_table_list;
7478       cond_table_list = NULL;
7479       DBUG_PRINT("info",("spider cond_table_list=%p", cond_table_list));
7480     }
7481   } while ((table_list = table_list->next_local));
7482   my_afree(used_table_list);
7483   DBUG_RETURN(0);
7484 }
7485 
reappend_tables(spider_fields * fields,SPIDER_LINK_IDX_CHAIN * link_idx_chain,spider_string * str)7486 int spider_db_mbase_util::reappend_tables(
7487   spider_fields *fields,
7488   SPIDER_LINK_IDX_CHAIN *link_idx_chain,
7489   spider_string *str
7490 ) {
7491   int error_num;
7492   uint32 length;
7493   ha_spider *spider;
7494   spider_mbase_share *db_share;
7495   spider_mbase_handler *dbton_hdl;
7496   SPIDER_TABLE_HOLDER *table_holder;
7497   SPIDER_LINK_IDX_HOLDER *link_idx_holder;
7498   DBUG_ENTER("spider_db_mbase_util::reappend_tables");
7499   DBUG_PRINT("info",("spider this=%p", this));
7500   length = str->length();
7501   fields->set_pos_to_first_table_on_link_idx_chain(link_idx_chain);
7502   fields->set_pos_to_first_table_holder();
7503   while ((table_holder = fields->get_next_table_holder()))
7504   {
7505     link_idx_holder =
7506       fields->get_next_table_on_link_idx_chain(link_idx_chain);
7507     spider = table_holder->spider;
7508     db_share = (spider_mbase_share *)
7509       spider->share->dbton_share[dbton_id];
7510     if (!db_share->same_db_table_name)
7511     {
7512       dbton_hdl = (spider_mbase_handler *) spider->dbton_handler[dbton_id];
7513       str->length(dbton_hdl->table_name_pos);
7514       if ((error_num = db_share->append_table_name_with_adjusting(str,
7515         spider->conn_link_idx[link_idx_holder->link_idx])))
7516       {
7517         DBUG_RETURN(error_num);
7518       }
7519     }
7520   }
7521   str->length(length);
7522   DBUG_RETURN(0);
7523 }
7524 
append_where(spider_string * str)7525 int spider_db_mbase_util::append_where(
7526   spider_string *str
7527 ) {
7528   DBUG_ENTER("spider_db_mbase_util::append_where");
7529   DBUG_PRINT("info",("spider this=%p", this));
7530   if (str->reserve(SPIDER_SQL_WHERE_LEN))
7531     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7532   str->q_append(SPIDER_SQL_WHERE_STR, SPIDER_SQL_WHERE_LEN);
7533   DBUG_RETURN(0);
7534 }
7535 
append_having(spider_string * str)7536 int spider_db_mbase_util::append_having(
7537   spider_string *str
7538 ) {
7539   DBUG_ENTER("spider_db_mbase_util::append_having");
7540   DBUG_PRINT("info",("spider this=%p", this));
7541   if (str->reserve(SPIDER_SQL_HAVING_LEN))
7542     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7543   str->q_append(SPIDER_SQL_HAVING_STR, SPIDER_SQL_HAVING_LEN);
7544   DBUG_RETURN(0);
7545 }
7546 #endif
7547 
spider_mbase_share(st_spider_share * share,uint dbton_id,spider_db_mbase_util * spider_db_mbase_utility)7548 spider_mbase_share::spider_mbase_share(
7549   st_spider_share *share,
7550   uint dbton_id,
7551   spider_db_mbase_util *spider_db_mbase_utility
7552 ) : spider_db_share(
7553   share,
7554   dbton_id
7555 ),
7556   spider_db_mbase_utility(spider_db_mbase_utility),
7557   table_select(NULL),
7558   table_select_pos(0),
7559   key_select(NULL),
7560   key_select_pos(NULL),
7561   key_hint(NULL),
7562   show_table_status(NULL),
7563   show_records(NULL),
7564   show_index(NULL),
7565   table_names_str(NULL),
7566   db_names_str(NULL),
7567   db_table_str(NULL),
7568 #ifdef SPIDER_HAS_HASH_VALUE_TYPE
7569   db_table_str_hash_value(NULL),
7570 #endif
7571   table_nm_max_length(0),
7572   db_nm_max_length(0),
7573   column_name_str(NULL),
7574   same_db_table_name(TRUE),
7575   first_all_link_idx(-1)
7576 {
7577   DBUG_ENTER("spider_mbase_share::spider_mbase_share");
7578   DBUG_PRINT("info",("spider this=%p", this));
7579   spider_alloc_calc_mem_init(mem_calc, 71);
7580   spider_alloc_calc_mem(spider_current_trx, mem_calc, sizeof(*this));
7581   DBUG_VOID_RETURN;
7582 }
7583 
spider_mysql_share(st_spider_share * share)7584 spider_mysql_share::spider_mysql_share(
7585   st_spider_share *share
7586 ) : spider_mbase_share(
7587   share,
7588   spider_db_mysql_utility.dbton_id,
7589   &spider_db_mysql_utility
7590 ) {
7591   DBUG_ENTER("spider_mysql_share::spider_mysql_share");
7592   DBUG_PRINT("info",("spider this=%p", this));
7593   DBUG_VOID_RETURN;
7594 }
spider_mariadb_share(st_spider_share * share)7595 spider_mariadb_share::spider_mariadb_share(
7596   st_spider_share *share
7597 ) : spider_mbase_share(
7598   share,
7599   spider_db_mariadb_utility.dbton_id,
7600   &spider_db_mariadb_utility
7601 ) {
7602   DBUG_ENTER("spider_mariadb_share::spider_mariadb_share");
7603   DBUG_PRINT("info",("spider this=%p", this));
7604   DBUG_VOID_RETURN;
7605 }
7606 
~spider_mbase_share()7607 spider_mbase_share::~spider_mbase_share()
7608 {
7609   DBUG_ENTER("spider_mbase_share::~spider_mbase_share");
7610   DBUG_PRINT("info",("spider this=%p", this));
7611   if (table_select)
7612     delete [] table_select;
7613   if (key_select)
7614     delete [] key_select;
7615   if (key_hint)
7616     delete [] key_hint;
7617   free_show_table_status();
7618   free_show_records();
7619   free_show_index();
7620   free_column_name_str();
7621   free_table_names_str();
7622   if (key_select_pos)
7623   {
7624     spider_free(spider_current_trx, key_select_pos, MYF(0));
7625   }
7626   spider_free_mem_calc(spider_current_trx, mem_calc_id, sizeof(*this));
7627   DBUG_VOID_RETURN;
7628 }
7629 
~spider_mysql_share()7630 spider_mysql_share::~spider_mysql_share()
7631 {
7632   DBUG_ENTER("spider_mysql_share::~spider_mysql_share");
7633   DBUG_PRINT("info",("spider this=%p", this));
7634   DBUG_VOID_RETURN;
7635 }
7636 
~spider_mariadb_share()7637 spider_mariadb_share::~spider_mariadb_share()
7638 {
7639   DBUG_ENTER("spider_mariadb_share::~spider_mariadb_share");
7640   DBUG_PRINT("info",("spider this=%p", this));
7641   DBUG_VOID_RETURN;
7642 }
7643 
init()7644 int spider_mbase_share::init()
7645 {
7646   int error_num;
7647   uint roop_count;
7648   TABLE_SHARE *table_share = spider_share->table_share;
7649   uint keys = table_share ? table_share->keys : 0;
7650   DBUG_ENTER("spider_mbase_share::init");
7651   DBUG_PRINT("info",("spider this=%p", this));
7652   if (!(key_select_pos = (int *)
7653     spider_bulk_alloc_mem(spider_current_trx, 112,
7654       __func__, __FILE__, __LINE__, MYF(MY_WME | MY_ZEROFILL),
7655       &key_select_pos,
7656         sizeof(int) * keys,
7657 #ifdef SPIDER_HAS_HASH_VALUE_TYPE
7658       &db_table_str_hash_value,
7659         sizeof(my_hash_value_type) * spider_share->all_link_count,
7660 #endif
7661       NullS))
7662   ) {
7663     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7664   }
7665 
7666   if (keys > 0 &&
7667     !(key_hint = new spider_string[keys])
7668   ) {
7669     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7670   }
7671   for (roop_count = 0; roop_count < keys; roop_count++)
7672   {
7673     key_hint[roop_count].init_calc_mem(189);
7674     key_hint[roop_count].set_charset(spider_share->access_charset);
7675   }
7676   DBUG_PRINT("info",("spider key_hint=%p", key_hint));
7677 
7678   if (
7679     !(table_select = new spider_string[1]) ||
7680     (keys > 0 &&
7681       !(key_select = new spider_string[keys])
7682     ) ||
7683     (error_num = create_table_names_str()) ||
7684     (table_share &&
7685       (
7686         (error_num = create_column_name_str()) ||
7687         (error_num = convert_key_hint_str()) ||
7688         (error_num = append_show_table_status()) ||
7689         (error_num = append_show_records()) ||
7690         (error_num = append_show_index())
7691       )
7692     )
7693   ) {
7694     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7695   }
7696 
7697   table_select->init_calc_mem(96);
7698   if (table_share && (error_num = append_table_select()))
7699     DBUG_RETURN(error_num);
7700 
7701   for (roop_count = 0; roop_count < keys; roop_count++)
7702   {
7703     key_select[roop_count].init_calc_mem(97);
7704     if ((error_num = append_key_select(roop_count)))
7705       DBUG_RETURN(error_num);
7706   }
7707 
7708   DBUG_RETURN(error_num);
7709 }
7710 
get_column_name_length(uint field_index)7711 uint spider_mbase_share::get_column_name_length(
7712   uint field_index
7713 ) {
7714   DBUG_ENTER("spider_mbase_share::get_column_name_length");
7715   DBUG_PRINT("info",("spider this=%p", this));
7716   DBUG_RETURN(column_name_str[field_index].length());
7717 }
7718 
append_column_name(spider_string * str,uint field_index)7719 int spider_mbase_share::append_column_name(
7720   spider_string *str,
7721   uint field_index
7722 ) {
7723   int error_num;
7724   DBUG_ENTER("spider_mbase_share::append_column_name");
7725   DBUG_PRINT("info",("spider this=%p", this));
7726   error_num = spider_db_mbase_utility->append_name(str,
7727     column_name_str[field_index].ptr(), column_name_str[field_index].length());
7728   DBUG_RETURN(error_num);
7729 }
7730 
append_column_name_with_alias(spider_string * str,uint field_index,const char * alias,uint alias_length)7731 int spider_mbase_share::append_column_name_with_alias(
7732   spider_string *str,
7733   uint field_index,
7734   const char *alias,
7735   uint alias_length
7736 ) {
7737   DBUG_ENTER("spider_mbase_share::append_column_name_with_alias");
7738   DBUG_PRINT("info",("spider this=%p", this));
7739   if (str->reserve(
7740     alias_length +
7741     column_name_str[field_index].length() +
7742     /* SPIDER_SQL_NAME_QUOTE_LEN */ 2))
7743     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7744   str->q_append(alias, alias_length);
7745   append_column_name(str, field_index);
7746   DBUG_RETURN(0);
7747 }
7748 
append_table_name(spider_string * str,int all_link_idx)7749 int spider_mbase_share::append_table_name(
7750   spider_string *str,
7751   int all_link_idx
7752 ) {
7753   const char *db_nm = db_names_str[all_link_idx].ptr();
7754   uint db_nm_len = db_names_str[all_link_idx].length();
7755   const char *table_nm = table_names_str[all_link_idx].ptr();
7756   uint table_nm_len = table_names_str[all_link_idx].length();
7757   DBUG_ENTER("spider_mbase_share::append_table_name");
7758   DBUG_PRINT("info",("spider this=%p", this));
7759   if (str->reserve(db_nm_len + SPIDER_SQL_DOT_LEN + table_nm_len +
7760     /* SPIDER_SQL_NAME_QUOTE_LEN */ 4))
7761   {
7762     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7763   }
7764   spider_db_mbase_utility->append_name(str, db_nm, db_nm_len);
7765   str->q_append(SPIDER_SQL_DOT_STR, SPIDER_SQL_DOT_LEN);
7766   spider_db_mbase_utility->append_name(str, table_nm, table_nm_len);
7767   DBUG_RETURN(0);
7768 }
7769 
append_table_name_with_adjusting(spider_string * str,int all_link_idx)7770 int spider_mbase_share::append_table_name_with_adjusting(
7771   spider_string *str,
7772   int all_link_idx
7773 ) {
7774   const char *db_nm = db_names_str[all_link_idx].ptr();
7775   uint db_nm_len = db_names_str[all_link_idx].length();
7776   uint db_nm_max_len = db_nm_max_length;
7777   const char *table_nm = table_names_str[all_link_idx].ptr();
7778   uint table_nm_len = table_names_str[all_link_idx].length();
7779   uint table_nm_max_len = table_nm_max_length;
7780   DBUG_ENTER("spider_mbase_share::append_table_name_with_adjusting");
7781   DBUG_PRINT("info",("spider this=%p", this));
7782   spider_db_mbase_utility->append_name(str, db_nm, db_nm_len);
7783   str->q_append(SPIDER_SQL_DOT_STR, SPIDER_SQL_DOT_LEN);
7784   spider_db_mbase_utility->append_name(str, table_nm, table_nm_len);
7785   uint length =
7786     db_nm_max_len - db_nm_len +
7787     table_nm_max_len - table_nm_len;
7788   memset((char *) str->ptr() + str->length(), ' ', length);
7789   str->length(str->length() + length);
7790   DBUG_RETURN(0);
7791 }
7792 
append_from_with_adjusted_table_name(spider_string * str,int * table_name_pos)7793 int spider_mbase_share::append_from_with_adjusted_table_name(
7794   spider_string *str,
7795   int *table_name_pos
7796 ) {
7797   const char *db_nm = db_names_str[0].ptr();
7798   uint db_nm_len = db_names_str[0].length();
7799   uint db_nm_max_len = db_nm_max_length;
7800   const char *table_nm = table_names_str[0].ptr();
7801   uint table_nm_len = table_names_str[0].length();
7802   uint table_nm_max_len = table_nm_max_length;
7803   DBUG_ENTER("spider_mbase_share::append_from_with_adjusted_table_name");
7804   DBUG_PRINT("info",("spider this=%p", this));
7805   if (str->reserve(SPIDER_SQL_FROM_LEN + db_nm_max_length +
7806     SPIDER_SQL_DOT_LEN + table_nm_max_length +
7807     /* SPIDER_SQL_NAME_QUOTE_LEN */ 4))
7808   {
7809     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7810   }
7811   str->q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN);
7812   *table_name_pos = str->length();
7813   spider_db_mbase_utility->append_name(str, db_nm, db_nm_len);
7814   str->q_append(SPIDER_SQL_DOT_STR, SPIDER_SQL_DOT_LEN);
7815   spider_db_mbase_utility->append_name(str, table_nm, table_nm_len);
7816   uint length =
7817     db_nm_max_len - db_nm_len +
7818     table_nm_max_len - table_nm_len;
7819   memset((char *) str->ptr() + str->length(), ' ', length);
7820   str->length(str->length() + length);
7821   DBUG_RETURN(0);
7822 }
7823 
create_table_names_str()7824 int spider_mbase_share::create_table_names_str()
7825 {
7826   int error_num, roop_count;
7827   uint table_nm_len, db_nm_len;
7828   spider_string *str, *first_tbl_nm_str, *first_db_nm_str, *first_db_tbl_str;
7829   char *first_tbl_nm, *first_db_nm;
7830   DBUG_ENTER("spider_mbase_share::create_table_names_str");
7831   table_names_str = NULL;
7832   db_names_str = NULL;
7833   db_table_str = NULL;
7834   if (
7835     !(table_names_str = new spider_string[spider_share->all_link_count]) ||
7836     !(db_names_str = new spider_string[spider_share->all_link_count]) ||
7837     !(db_table_str = new spider_string[spider_share->all_link_count])
7838   ) {
7839     error_num = HA_ERR_OUT_OF_MEM;
7840     goto error;
7841   }
7842 
7843   same_db_table_name = TRUE;
7844   first_tbl_nm = spider_share->tgt_table_names[0];
7845   first_db_nm = spider_share->tgt_dbs[0];
7846   table_nm_len = spider_share->tgt_table_names_lengths[0];
7847   db_nm_len = spider_share->tgt_dbs_lengths[0];
7848   first_tbl_nm_str = &table_names_str[0];
7849   first_db_nm_str = &db_names_str[0];
7850   first_db_tbl_str = &db_table_str[0];
7851   for (roop_count = 0; roop_count < (int) spider_share->all_link_count;
7852     roop_count++)
7853   {
7854     table_names_str[roop_count].init_calc_mem(86);
7855     db_names_str[roop_count].init_calc_mem(87);
7856     db_table_str[roop_count].init_calc_mem(88);
7857     if (spider_share->sql_dbton_ids[roop_count] != dbton_id)
7858       continue;
7859     if (first_all_link_idx == -1)
7860       first_all_link_idx = roop_count;
7861 
7862     str = &table_names_str[roop_count];
7863     if (
7864       roop_count != 0 &&
7865       same_db_table_name &&
7866       spider_share->tgt_table_names_lengths[roop_count] == table_nm_len &&
7867       !memcmp(first_tbl_nm, spider_share->tgt_table_names[roop_count],
7868         table_nm_len)
7869     ) {
7870       if (str->copy(*first_tbl_nm_str))
7871       {
7872         error_num = HA_ERR_OUT_OF_MEM;
7873         goto error;
7874       }
7875     } else {
7876       str->set_charset(spider_share->access_charset);
7877       if ((error_num = spider_db_append_name_with_quote_str(str,
7878         spider_share->tgt_table_names[roop_count], dbton_id)))
7879         goto error;
7880       if (roop_count)
7881       {
7882         same_db_table_name = FALSE;
7883         DBUG_PRINT("info", ("spider found different table name %s",
7884           spider_share->tgt_table_names[roop_count]));
7885         if (str->length() > table_nm_max_length)
7886           table_nm_max_length = str->length();
7887       } else
7888         table_nm_max_length = str->length();
7889     }
7890 
7891     str = &db_names_str[roop_count];
7892     if (
7893       roop_count != 0 &&
7894       same_db_table_name &&
7895       spider_share->tgt_dbs_lengths[roop_count] == db_nm_len &&
7896       !memcmp(first_db_nm, spider_share->tgt_dbs[roop_count],
7897         db_nm_len)
7898     ) {
7899       if (str->copy(*first_db_nm_str))
7900       {
7901         error_num = HA_ERR_OUT_OF_MEM;
7902         goto error;
7903       }
7904     } else {
7905       str->set_charset(spider_share->access_charset);
7906       if ((error_num = spider_db_append_name_with_quote_str(str,
7907         spider_share->tgt_dbs[roop_count], dbton_id)))
7908         goto error;
7909       if (roop_count)
7910       {
7911         same_db_table_name = FALSE;
7912         DBUG_PRINT("info", ("spider found different db name %s",
7913           spider_share->tgt_dbs[roop_count]));
7914         if (str->length() > db_nm_max_length)
7915           db_nm_max_length = str->length();
7916       } else
7917         db_nm_max_length = str->length();
7918     }
7919 
7920     str = &db_table_str[roop_count];
7921     if (
7922       roop_count != 0 &&
7923       same_db_table_name
7924     ) {
7925       if (str->copy(*first_db_tbl_str))
7926       {
7927         error_num = HA_ERR_OUT_OF_MEM;
7928         goto error;
7929       }
7930     } else {
7931       str->set_charset(spider_share->access_charset);
7932       if ((error_num = append_table_name(str, roop_count)))
7933         goto error;
7934     }
7935 #ifdef SPIDER_HAS_HASH_VALUE_TYPE
7936     db_table_str_hash_value[roop_count] = my_calc_hash(
7937       &spider_open_connections, (uchar*) str->ptr(), str->length());
7938 #endif
7939   }
7940   DBUG_RETURN(0);
7941 
7942 error:
7943   if (db_table_str)
7944   {
7945     delete [] db_table_str;
7946     db_table_str = NULL;
7947   }
7948   if (db_names_str)
7949   {
7950     delete [] db_names_str;
7951     db_names_str = NULL;
7952   }
7953   if (table_names_str)
7954   {
7955     delete [] table_names_str;
7956     table_names_str = NULL;
7957   }
7958   DBUG_RETURN(error_num);
7959 }
7960 
free_table_names_str()7961 void spider_mbase_share::free_table_names_str()
7962 {
7963   DBUG_ENTER("spider_mbase_share::free_table_names_str");
7964   if (db_table_str)
7965   {
7966     delete [] db_table_str;
7967     db_table_str = NULL;
7968   }
7969   if (db_names_str)
7970   {
7971     delete [] db_names_str;
7972     db_names_str = NULL;
7973   }
7974   if (table_names_str)
7975   {
7976     delete [] table_names_str;
7977     table_names_str = NULL;
7978   }
7979   DBUG_VOID_RETURN;
7980 }
7981 
create_column_name_str()7982 int spider_mbase_share::create_column_name_str()
7983 {
7984   spider_string *str;
7985   int error_num;
7986   Field **field;
7987   TABLE_SHARE *table_share = spider_share->table_share;
7988   DBUG_ENTER("spider_mbase_share::create_column_name_str");
7989   if (
7990     table_share->fields &&
7991     !(column_name_str = new spider_string[table_share->fields])
7992   )
7993     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7994   for (field = table_share->field, str = column_name_str;
7995    *field; field++, str++)
7996   {
7997     str->init_calc_mem(89);
7998     str->set_charset(spider_share->access_charset);
7999     if ((error_num = spider_db_append_name_with_quote_str(str,
8000       (*field)->field_name, dbton_id)))
8001       goto error;
8002   }
8003   DBUG_RETURN(0);
8004 
8005 error:
8006   if (column_name_str)
8007   {
8008     delete [] column_name_str;
8009     column_name_str = NULL;
8010   }
8011   DBUG_RETURN(error_num);
8012 }
8013 
free_column_name_str()8014 void spider_mbase_share::free_column_name_str()
8015 {
8016   DBUG_ENTER("spider_mbase_share::free_column_name_str");
8017   if (column_name_str)
8018   {
8019     delete [] column_name_str;
8020     column_name_str = NULL;
8021   }
8022   DBUG_VOID_RETURN;
8023 }
8024 
convert_key_hint_str()8025 int spider_mbase_share::convert_key_hint_str()
8026 {
8027   spider_string *tmp_key_hint;
8028   int roop_count;
8029   TABLE_SHARE *table_share = spider_share->table_share;
8030   DBUG_ENTER("spider_mbase_share::convert_key_hint_str");
8031   if (spider_share->access_charset->cset != system_charset_info->cset)
8032   {
8033     /* need conversion */
8034     for (roop_count = 0, tmp_key_hint = key_hint;
8035       roop_count < (int) table_share->keys; roop_count++, tmp_key_hint++)
8036     {
8037       tmp_key_hint->length(0);
8038       if (tmp_key_hint->append(spider_share->key_hint->ptr(),
8039         spider_share->key_hint->length(), system_charset_info))
8040         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
8041     }
8042   } else {
8043     for (roop_count = 0, tmp_key_hint = key_hint;
8044       roop_count < (int) table_share->keys; roop_count++, tmp_key_hint++)
8045     {
8046       if (tmp_key_hint->copy(spider_share->key_hint[roop_count]))
8047         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
8048     }
8049   }
8050   DBUG_RETURN(0);
8051 }
8052 
append_show_table_status()8053 int spider_mbase_share::append_show_table_status()
8054 {
8055   int roop_count;
8056   spider_string *str;
8057   DBUG_ENTER("spider_mysql_append_show_table_status");
8058   if (!(show_table_status =
8059     new spider_string[2 * spider_share->all_link_count]))
8060     goto error;
8061 
8062   for (roop_count = 0; roop_count < (int) spider_share->all_link_count;
8063     roop_count++)
8064   {
8065     show_table_status[0 + (2 * roop_count)].init_calc_mem(90);
8066     show_table_status[1 + (2 * roop_count)].init_calc_mem(91);
8067     if (spider_share->sql_dbton_ids[roop_count] != dbton_id)
8068       continue;
8069 
8070     if (
8071       show_table_status[0 + (2 * roop_count)].reserve(
8072         SPIDER_SQL_SHOW_TABLE_STATUS_LEN +
8073         db_names_str[roop_count].length() +
8074         SPIDER_SQL_LIKE_LEN + table_names_str[roop_count].length() +
8075         ((SPIDER_SQL_NAME_QUOTE_LEN) * 2) +
8076         ((SPIDER_SQL_VALUE_QUOTE_LEN) * 2)) ||
8077       show_table_status[1 + (2 * roop_count)].reserve(
8078         SPIDER_SQL_SELECT_TABLES_STATUS_LEN +
8079         db_names_str[roop_count].length() +
8080         SPIDER_SQL_AND_LEN + SPIDER_SQL_TABLE_NAME_LEN + SPIDER_SQL_EQUAL_LEN +
8081         table_names_str[roop_count].length() +
8082         ((SPIDER_SQL_VALUE_QUOTE_LEN) * 4))
8083     )
8084       goto error;
8085     str = &show_table_status[0 + (2 * roop_count)];
8086     str->q_append(
8087       SPIDER_SQL_SHOW_TABLE_STATUS_STR, SPIDER_SQL_SHOW_TABLE_STATUS_LEN);
8088     str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
8089     str->q_append(db_names_str[roop_count].ptr(),
8090       db_names_str[roop_count].length());
8091     str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
8092     str->q_append(SPIDER_SQL_LIKE_STR, SPIDER_SQL_LIKE_LEN);
8093     str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
8094     str->q_append(table_names_str[roop_count].ptr(),
8095       table_names_str[roop_count].length());
8096     str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
8097     str = &show_table_status[1 + (2 * roop_count)];
8098     str->q_append(
8099       SPIDER_SQL_SELECT_TABLES_STATUS_STR,
8100       SPIDER_SQL_SELECT_TABLES_STATUS_LEN);
8101     str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
8102     str->q_append(db_names_str[roop_count].ptr(),
8103       db_names_str[roop_count].length());
8104     str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
8105     str->q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN);
8106     str->q_append(SPIDER_SQL_TABLE_NAME_STR, SPIDER_SQL_TABLE_NAME_LEN);
8107     str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
8108     str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
8109     str->q_append(table_names_str[roop_count].ptr(),
8110       table_names_str[roop_count].length());
8111     str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
8112   }
8113   DBUG_RETURN(0);
8114 
8115 error:
8116   if (show_table_status)
8117   {
8118     delete [] show_table_status;
8119     show_table_status = NULL;
8120   }
8121   DBUG_RETURN(HA_ERR_OUT_OF_MEM);
8122 }
8123 
free_show_table_status()8124 void spider_mbase_share::free_show_table_status()
8125 {
8126   DBUG_ENTER("spider_mysql_free_show_table_status");
8127   if (show_table_status)
8128   {
8129     delete [] show_table_status;
8130     show_table_status = NULL;
8131   }
8132   DBUG_VOID_RETURN;
8133 }
8134 
append_show_records()8135 int spider_mbase_share::append_show_records()
8136 {
8137   int roop_count;
8138   spider_string *str;
8139   DBUG_ENTER("spider_mbase_share::append_show_records");
8140   if (!(show_records = new spider_string[spider_share->all_link_count]))
8141     goto error;
8142 
8143   for (roop_count = 0; roop_count < (int) spider_share->all_link_count;
8144     roop_count++)
8145   {
8146     show_records[roop_count].init_calc_mem(92);
8147     if (spider_share->sql_dbton_ids[roop_count] != dbton_id)
8148       continue;
8149 
8150     if (
8151       show_records[roop_count].reserve(
8152         SPIDER_SQL_SHOW_RECORDS_LEN +
8153         db_names_str[roop_count].length() +
8154         SPIDER_SQL_DOT_LEN +
8155         table_names_str[roop_count].length() +
8156         /* SPIDER_SQL_NAME_QUOTE_LEN */ 4)
8157     )
8158       goto error;
8159     str = &show_records[roop_count];
8160     str->q_append(SPIDER_SQL_SHOW_RECORDS_STR, SPIDER_SQL_SHOW_RECORDS_LEN);
8161     append_table_name(str, roop_count);
8162   }
8163   DBUG_RETURN(0);
8164 
8165 error:
8166   if (show_records)
8167   {
8168     delete [] show_records;
8169     show_records = NULL;
8170   }
8171   DBUG_RETURN(HA_ERR_OUT_OF_MEM);
8172 }
8173 
free_show_records()8174 void spider_mbase_share::free_show_records()
8175 {
8176   DBUG_ENTER("spider_mbase_share::free_show_records");
8177   if (show_records)
8178   {
8179     delete [] show_records;
8180     show_records = NULL;
8181   }
8182   DBUG_VOID_RETURN;
8183 }
8184 
append_show_index()8185 int spider_mbase_share::append_show_index()
8186 {
8187   int roop_count;
8188   spider_string *str;
8189   DBUG_ENTER("spider_mbase_share::append_show_index");
8190   if (!(show_index = new spider_string[2 * spider_share->all_link_count]))
8191     goto error;
8192 
8193   for (roop_count = 0; roop_count < (int) spider_share->all_link_count;
8194     roop_count++)
8195   {
8196     show_index[0 + (2 * roop_count)].init_calc_mem(93);
8197     show_index[1 + (2 * roop_count)].init_calc_mem(94);
8198     if (spider_share->sql_dbton_ids[roop_count] != dbton_id)
8199       continue;
8200 
8201     if (
8202       show_index[0 + (2 * roop_count)].reserve(
8203         SPIDER_SQL_SHOW_INDEX_LEN + db_names_str[roop_count].length() +
8204         SPIDER_SQL_DOT_LEN +
8205         table_names_str[roop_count].length() +
8206         /* SPIDER_SQL_NAME_QUOTE_LEN */ 4) ||
8207       show_index[1 + (2 * roop_count)].reserve(
8208         SPIDER_SQL_SELECT_STATISTICS_LEN +
8209         db_names_str[roop_count].length() +
8210         SPIDER_SQL_AND_LEN + SPIDER_SQL_TABLE_NAME_LEN + SPIDER_SQL_EQUAL_LEN +
8211         table_names_str[roop_count].length() +
8212         ((SPIDER_SQL_VALUE_QUOTE_LEN) * 4) +
8213         SPIDER_SQL_GROUP_LEN + SPIDER_SQL_COLUMN_NAME_LEN)
8214     )
8215       goto error;
8216     str = &show_index[0 + (2 * roop_count)];
8217     str->q_append(
8218       SPIDER_SQL_SHOW_INDEX_STR, SPIDER_SQL_SHOW_INDEX_LEN);
8219     append_table_name(str, roop_count);
8220     str = &show_index[1 + (2 * roop_count)];
8221     str->q_append(
8222       SPIDER_SQL_SELECT_STATISTICS_STR, SPIDER_SQL_SELECT_STATISTICS_LEN);
8223     str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
8224     str->q_append(db_names_str[roop_count].ptr(),
8225       db_names_str[roop_count].length());
8226     str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
8227     str->q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN);
8228     str->q_append(SPIDER_SQL_TABLE_NAME_STR, SPIDER_SQL_TABLE_NAME_LEN);
8229     str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
8230     str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
8231     str->q_append(table_names_str[roop_count].ptr(),
8232       table_names_str[roop_count].length());
8233     str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
8234     str->q_append(SPIDER_SQL_GROUP_STR, SPIDER_SQL_GROUP_LEN);
8235     str->q_append(SPIDER_SQL_COLUMN_NAME_STR, SPIDER_SQL_COLUMN_NAME_LEN);
8236   }
8237   DBUG_RETURN(0);
8238 
8239 error:
8240   if (show_index)
8241   {
8242     delete [] show_index;
8243     show_index = NULL;
8244   }
8245   DBUG_RETURN(HA_ERR_OUT_OF_MEM);
8246 }
8247 
free_show_index()8248 void spider_mbase_share::free_show_index()
8249 {
8250   DBUG_ENTER("spider_mbase_share::free_show_index");
8251   if (show_index)
8252   {
8253     delete [] show_index;
8254     show_index = NULL;
8255   }
8256   DBUG_VOID_RETURN;
8257 }
8258 
append_table_select()8259 int spider_mbase_share::append_table_select()
8260 {
8261   Field **field;
8262   uint field_length;
8263   spider_string *str = table_select;
8264   TABLE_SHARE *table_share = spider_share->table_share;
8265   DBUG_ENTER("spider_mbase_share::append_table_select");
8266 
8267   if (!*table_share->field)
8268     DBUG_RETURN(0);
8269 
8270   for (field = table_share->field; *field; field++)
8271   {
8272     field_length = column_name_str[(*field)->field_index].length();
8273     if (str->reserve(field_length +
8274       /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
8275       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
8276     append_column_name(str, (*field)->field_index);
8277     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
8278   }
8279   str->length(str->length() - SPIDER_SQL_COMMA_LEN);
8280   DBUG_RETURN(append_from_with_adjusted_table_name(str, &table_select_pos));
8281 }
8282 
append_key_select(uint idx)8283 int spider_mbase_share::append_key_select(
8284   uint idx
8285 ) {
8286   KEY_PART_INFO *key_part;
8287   Field *field;
8288   uint part_num;
8289   uint field_length;
8290   spider_string *str = &key_select[idx];
8291   TABLE_SHARE *table_share = spider_share->table_share;
8292   const KEY *key_info = &table_share->key_info[idx];
8293   DBUG_ENTER("spider_mbase_share::append_key_select");
8294 
8295   if (!spider_user_defined_key_parts(key_info))
8296     DBUG_RETURN(0);
8297 
8298   for (key_part = key_info->key_part, part_num = 0;
8299     part_num < spider_user_defined_key_parts(key_info); key_part++, part_num++)
8300   {
8301     field = key_part->field;
8302     field_length = column_name_str[field->field_index].length();
8303     if (str->reserve(field_length +
8304       /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
8305       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
8306     append_column_name(str, field->field_index);
8307     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
8308   }
8309   str->length(str->length() - SPIDER_SQL_COMMA_LEN);
8310   DBUG_RETURN(append_from_with_adjusted_table_name(str, &key_select_pos[idx]));
8311 }
8312 
need_change_db_table_name()8313 bool spider_mbase_share::need_change_db_table_name()
8314 {
8315   DBUG_ENTER("spider_mbase_share::need_change_db_table_name");
8316   DBUG_RETURN(!same_db_table_name);
8317 }
8318 
8319 #ifdef SPIDER_HAS_DISCOVER_TABLE_STRUCTURE
discover_table_structure(SPIDER_TRX * trx,SPIDER_SHARE * spider_share,spider_string * str)8320 int spider_mbase_share::discover_table_structure(
8321   SPIDER_TRX *trx,
8322   SPIDER_SHARE *spider_share,
8323   spider_string *str
8324 ) {
8325   int roop_count, error_num = HA_ERR_WRONG_COMMAND;
8326   char sql_buf[MAX_FIELD_WIDTH];
8327   spider_string sql_str(sql_buf, sizeof(sql_buf), system_charset_info);
8328   uint strlen = str->length();
8329   DBUG_ENTER("spider_mbase_share::discover_table_structure");
8330   DBUG_PRINT("info",("spider this=%p", this));
8331   sql_str.init_calc_mem(228);
8332   for (roop_count = 0; roop_count < (int) spider_share->all_link_count;
8333     roop_count++)
8334   {
8335     if (spider_share->sql_dbton_ids[roop_count] != dbton_id)
8336     {
8337       DBUG_PRINT("info",("spider spider_share->sql_dbton_ids[%d]=%u",
8338         roop_count, spider_share->sql_dbton_ids[roop_count]));
8339       DBUG_PRINT("info",("spider dbton_id=%u", dbton_id));
8340       continue;
8341     }
8342 
8343     str->length(strlen);
8344     sql_str.length(0);
8345     if (sql_str.reserve(
8346       SPIDER_SQL_SELECT_COLUMNS_LEN + db_names_str[roop_count].length() +
8347       SPIDER_SQL_AND_LEN + SPIDER_SQL_TABLE_NAME_LEN + SPIDER_SQL_EQUAL_LEN +
8348       table_names_str[roop_count].length() + SPIDER_SQL_ORDER_LEN +
8349       SPIDER_SQL_ORDINAL_POSITION_LEN +
8350       /* SPIDER_SQL_VALUE_QUOTE_LEN */ 8 +
8351       SPIDER_SQL_SEMICOLON_LEN +
8352       SPIDER_SQL_SHOW_INDEX_LEN + db_names_str[roop_count].length() +
8353       SPIDER_SQL_DOT_LEN + table_names_str[roop_count].length() +
8354       /* SPIDER_SQL_NAME_QUOTE_LEN */ 4 +
8355       SPIDER_SQL_SEMICOLON_LEN +
8356       SPIDER_SQL_SHOW_TABLE_STATUS_LEN + db_names_str[roop_count].length() +
8357       SPIDER_SQL_LIKE_LEN + table_names_str[roop_count].length() +
8358       /* SPIDER_SQL_NAME_QUOTE_LEN */ 4
8359     )) {
8360       DBUG_PRINT("info",("spider alloc sql_str error"));
8361       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
8362     }
8363     sql_str.q_append(SPIDER_SQL_SELECT_COLUMNS_STR,
8364       SPIDER_SQL_SELECT_COLUMNS_LEN);
8365     sql_str.q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
8366     sql_str.q_append(db_names_str[roop_count].ptr(),
8367       db_names_str[roop_count].length());
8368     sql_str.q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
8369     sql_str.q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN);
8370     sql_str.q_append(SPIDER_SQL_TABLE_NAME_STR, SPIDER_SQL_TABLE_NAME_LEN);
8371     sql_str.q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
8372     sql_str.q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
8373     sql_str.q_append(table_names_str[roop_count].ptr(),
8374       table_names_str[roop_count].length());
8375     sql_str.q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
8376     sql_str.q_append(SPIDER_SQL_ORDER_STR, SPIDER_SQL_ORDER_LEN);
8377     sql_str.q_append(SPIDER_SQL_ORDINAL_POSITION_STR,
8378       SPIDER_SQL_ORDINAL_POSITION_LEN);
8379     sql_str.q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
8380     sql_str.q_append(SPIDER_SQL_SHOW_INDEX_STR, SPIDER_SQL_SHOW_INDEX_LEN);
8381     append_table_name(&sql_str, roop_count);
8382     sql_str.q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
8383     sql_str.q_append(
8384       SPIDER_SQL_SHOW_TABLE_STATUS_STR, SPIDER_SQL_SHOW_TABLE_STATUS_LEN);
8385     sql_str.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
8386     sql_str.q_append(db_names_str[roop_count].ptr(),
8387       db_names_str[roop_count].length());
8388     sql_str.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
8389     sql_str.q_append(SPIDER_SQL_LIKE_STR, SPIDER_SQL_LIKE_LEN);
8390     sql_str.q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
8391     sql_str.q_append(table_names_str[roop_count].ptr(),
8392       table_names_str[roop_count].length());
8393     sql_str.q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
8394 
8395     SPIDER_CONN *conn;
8396     int need_mon;
8397     if (!(conn = spider_get_conn(
8398       spider_share, 0, spider_share->conn_keys[roop_count], trx, NULL, FALSE,
8399       FALSE, SPIDER_CONN_KIND_MYSQL, &error_num))
8400     ) {
8401       DBUG_RETURN(error_num);
8402     }
8403     pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
8404     pthread_mutex_lock(&conn->mta_conn_mutex);
8405     SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
8406     conn->need_mon = &need_mon;
8407     DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
8408     DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
8409     conn->mta_conn_mutex_lock_already = TRUE;
8410     conn->mta_conn_mutex_unlock_later = TRUE;
8411     if (!conn->disable_reconnect)
8412     {
8413       ha_spider tmp_spider;
8414       int need_mon = 0;
8415       uint tmp_conn_link_idx = 0;
8416       tmp_spider.trx = trx;
8417       tmp_spider.share = spider_share;
8418       tmp_spider.need_mons = &need_mon;
8419       tmp_spider.conn_link_idx = &tmp_conn_link_idx;
8420       if ((error_num = spider_db_ping(&tmp_spider, conn, 0)))
8421       {
8422         DBUG_PRINT("info",("spider spider_db_ping error"));
8423         DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
8424         DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
8425         conn->mta_conn_mutex_lock_already = FALSE;
8426         conn->mta_conn_mutex_unlock_later = FALSE;
8427         SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
8428         pthread_mutex_unlock(&conn->mta_conn_mutex);
8429         continue;
8430       }
8431     }
8432     spider_conn_set_timeout_from_share(conn, roop_count, trx->thd,
8433       spider_share);
8434     if (
8435       (error_num = spider_db_set_names_internal(trx, spider_share, conn,
8436         roop_count, &need_mon)) ||
8437       (
8438         spider_db_query(
8439           conn,
8440           sql_str.ptr(),
8441           sql_str.length(),
8442           -1,
8443           &need_mon) &&
8444         (error_num = spider_db_errorno(conn))
8445       )
8446     ) {
8447       DBUG_PRINT("info",("spider spider_get_trx error"));
8448       DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
8449       DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
8450       conn->mta_conn_mutex_lock_already = FALSE;
8451       conn->mta_conn_mutex_unlock_later = FALSE;
8452       SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
8453       pthread_mutex_unlock(&conn->mta_conn_mutex);
8454       continue;
8455     }
8456     st_spider_db_request_key request_key;
8457     request_key.spider_thread_id = trx->spider_thread_id;
8458     request_key.query_id = trx->thd->query_id;
8459     request_key.handler = NULL;
8460     request_key.request_id = 1;
8461     request_key.next = NULL;
8462     spider_db_result *res;
8463     /* get column list */
8464     if (!(res = conn->db_conn->store_result(NULL, &request_key, &error_num)))
8465     {
8466       if (error_num || (error_num = spider_db_errorno(conn)))
8467       {
8468         DBUG_PRINT("info",("spider column store error"));
8469         DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
8470         DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
8471         conn->mta_conn_mutex_lock_already = FALSE;
8472         conn->mta_conn_mutex_unlock_later = FALSE;
8473         SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
8474         pthread_mutex_unlock(&conn->mta_conn_mutex);
8475         continue;
8476       }
8477       /* no record */
8478       DBUG_PRINT("info",("spider column no record error"));
8479       DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
8480       DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
8481       conn->mta_conn_mutex_lock_already = FALSE;
8482       conn->mta_conn_mutex_unlock_later = FALSE;
8483       SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
8484       pthread_mutex_unlock(&conn->mta_conn_mutex);
8485       continue;
8486     }
8487     if ((error_num = res->fetch_columns_for_discover_table_structure(str,
8488       spider_share->access_charset)))
8489     {
8490       DBUG_PRINT("info",("spider column fetch error"));
8491       res->free_result();
8492       delete res;
8493       DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
8494       DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
8495       conn->mta_conn_mutex_lock_already = FALSE;
8496       conn->mta_conn_mutex_unlock_later = FALSE;
8497       SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
8498       pthread_mutex_unlock(&conn->mta_conn_mutex);
8499       my_printf_error(ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM,
8500         ER_SPIDER_REMOTE_TABLE_NOT_FOUND_STR, MYF(0),
8501         db_names_str[roop_count].ptr(),
8502         table_names_str[roop_count].ptr());
8503       error_num = ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM;
8504       continue;
8505     }
8506     res->free_result();
8507     delete res;
8508     if (conn->db_conn->next_result())
8509     {
8510       DBUG_PRINT("info",("spider single result error"));
8511       DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
8512       DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
8513       conn->mta_conn_mutex_lock_already = FALSE;
8514       conn->mta_conn_mutex_unlock_later = FALSE;
8515       SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
8516       pthread_mutex_unlock(&conn->mta_conn_mutex);
8517       continue;
8518     }
8519     /* get index list */
8520     if (!(res = conn->db_conn->store_result(NULL, &request_key, &error_num)))
8521     {
8522       if (error_num || (error_num = spider_db_errorno(conn)))
8523       {
8524         DBUG_PRINT("info",("spider index store error"));
8525         DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
8526         DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
8527         conn->mta_conn_mutex_lock_already = FALSE;
8528         conn->mta_conn_mutex_unlock_later = FALSE;
8529         SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
8530         pthread_mutex_unlock(&conn->mta_conn_mutex);
8531         continue;
8532       }
8533       /* no record */
8534       DBUG_PRINT("info",("spider index no record error"));
8535       DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
8536       DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
8537       conn->mta_conn_mutex_lock_already = FALSE;
8538       conn->mta_conn_mutex_unlock_later = FALSE;
8539       SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
8540       pthread_mutex_unlock(&conn->mta_conn_mutex);
8541       continue;
8542     }
8543     if ((error_num = res->fetch_index_for_discover_table_structure(str,
8544       spider_share->access_charset)))
8545     {
8546       DBUG_PRINT("info",("spider index fetch error"));
8547       res->free_result();
8548       delete res;
8549       DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
8550       DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
8551       conn->mta_conn_mutex_lock_already = FALSE;
8552       conn->mta_conn_mutex_unlock_later = FALSE;
8553       SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
8554       pthread_mutex_unlock(&conn->mta_conn_mutex);
8555       continue;
8556     }
8557     res->free_result();
8558     delete res;
8559     if (conn->db_conn->next_result())
8560     {
8561       DBUG_PRINT("info",("spider dual result error"));
8562       DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
8563       DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
8564       conn->mta_conn_mutex_lock_already = FALSE;
8565       conn->mta_conn_mutex_unlock_later = FALSE;
8566       SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
8567       pthread_mutex_unlock(&conn->mta_conn_mutex);
8568       continue;
8569     }
8570     /* get table info */
8571     if (!(res = conn->db_conn->store_result(NULL, &request_key, &error_num)))
8572     {
8573       if (error_num || (error_num = spider_db_errorno(conn)))
8574       {
8575         DBUG_PRINT("info",("spider table store error"));
8576         DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
8577         DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
8578         conn->mta_conn_mutex_lock_already = FALSE;
8579         conn->mta_conn_mutex_unlock_later = FALSE;
8580         SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
8581         pthread_mutex_unlock(&conn->mta_conn_mutex);
8582         continue;
8583       }
8584       /* no record */
8585       DBUG_PRINT("info",("spider table no record error"));
8586       DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
8587       DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
8588       conn->mta_conn_mutex_lock_already = FALSE;
8589       conn->mta_conn_mutex_unlock_later = FALSE;
8590       SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
8591       pthread_mutex_unlock(&conn->mta_conn_mutex);
8592       continue;
8593     }
8594     if ((error_num = res->fetch_table_for_discover_table_structure(str,
8595       spider_share, spider_share->access_charset)))
8596     {
8597       DBUG_PRINT("info",("spider table fetch error"));
8598       res->free_result();
8599       delete res;
8600       DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
8601       DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
8602       conn->mta_conn_mutex_lock_already = FALSE;
8603       conn->mta_conn_mutex_unlock_later = FALSE;
8604       SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
8605       pthread_mutex_unlock(&conn->mta_conn_mutex);
8606       continue;
8607     }
8608     res->free_result();
8609     delete res;
8610     DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
8611     DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
8612     conn->mta_conn_mutex_lock_already = FALSE;
8613     conn->mta_conn_mutex_unlock_later = FALSE;
8614     SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
8615     pthread_mutex_unlock(&conn->mta_conn_mutex);
8616     if (!error_num)
8617       break;
8618   }
8619   DBUG_RETURN(error_num);
8620 }
8621 #endif
8622 
8623 #ifdef HA_HAS_CHECKSUM_EXTENDED
checksum_support()8624 bool spider_mbase_share::checksum_support()
8625 {
8626   DBUG_ENTER("spider_mbase_share::checksum_support");
8627   DBUG_PRINT("info",("spider this=%p", this));
8628   DBUG_RETURN(TRUE);
8629 }
8630 #endif
8631 
spider_mbase_handler(ha_spider * spider,spider_mbase_share * db_share,spider_db_mbase_util * spider_db_mbase_utility)8632 spider_mbase_handler::spider_mbase_handler(
8633   ha_spider *spider,
8634   spider_mbase_share *db_share,
8635   spider_db_mbase_util *spider_db_mbase_utility
8636 ) : spider_db_handler(
8637   spider,
8638   db_share
8639 ),
8640   spider_db_mbase_utility(spider_db_mbase_utility),
8641   where_pos(0),
8642   order_pos(0),
8643   limit_pos(0),
8644   table_name_pos(0),
8645   ha_read_pos(0),
8646   ha_next_pos(0),
8647   ha_where_pos(0),
8648   ha_limit_pos(0),
8649   ha_table_name_pos(0),
8650   insert_pos(0),
8651   insert_table_name_pos(0),
8652   upd_tmp_tbl(NULL),
8653   tmp_sql_pos1(0),
8654   tmp_sql_pos2(0),
8655   tmp_sql_pos3(0),
8656   tmp_sql_pos4(0),
8657   tmp_sql_pos5(0),
8658   reading_from_bulk_tmp_table(FALSE),
8659   union_table_name_pos_first(NULL),
8660   union_table_name_pos_current(NULL),
8661   mysql_share(db_share),
8662   link_for_hash(NULL)
8663 {
8664   DBUG_ENTER("spider_mbase_handler::spider_mbase_handler");
8665   DBUG_PRINT("info",("spider this=%p", this));
8666   spider_alloc_calc_mem_init(mem_calc, 183);
8667   spider_alloc_calc_mem(spider_current_trx, mem_calc, sizeof(*this));
8668   DBUG_VOID_RETURN;
8669 }
8670 
spider_mysql_handler(ha_spider * spider,spider_mbase_share * db_share)8671 spider_mysql_handler::spider_mysql_handler(
8672   ha_spider *spider,
8673   spider_mbase_share *db_share
8674 ) : spider_mbase_handler(
8675   spider,
8676   db_share,
8677   &spider_db_mysql_utility
8678 ) {
8679   DBUG_ENTER("spider_mysql_handler::spider_mysql_handler");
8680   DBUG_PRINT("info",("spider this=%p", this));
8681   DBUG_VOID_RETURN;
8682 }
8683 
spider_mariadb_handler(ha_spider * spider,spider_mbase_share * db_share)8684 spider_mariadb_handler::spider_mariadb_handler(
8685   ha_spider *spider,
8686   spider_mbase_share *db_share
8687 ) : spider_mbase_handler(
8688   spider,
8689   db_share,
8690   &spider_db_mariadb_utility
8691 ) {
8692   DBUG_ENTER("spider_mariadb_handler::spider_mariadb_handler");
8693   DBUG_PRINT("info",("spider this=%p", this));
8694   DBUG_VOID_RETURN;
8695 }
8696 
~spider_mbase_handler()8697 spider_mbase_handler::~spider_mbase_handler()
8698 {
8699   DBUG_ENTER("spider_mbase_handler::~spider_mbase_handler");
8700   DBUG_PRINT("info",("spider this=%p", this));
8701   while (union_table_name_pos_first)
8702   {
8703     SPIDER_INT_HLD *tmp_pos = union_table_name_pos_first;
8704     union_table_name_pos_first = tmp_pos->next;
8705     spider_free(spider_current_trx, tmp_pos, MYF(0));
8706   }
8707   if (link_for_hash)
8708   {
8709     spider_free(spider_current_trx, link_for_hash, MYF(0));
8710   }
8711   spider_free_mem_calc(spider_current_trx, mem_calc_id, sizeof(*this));
8712   DBUG_VOID_RETURN;
8713 }
8714 
~spider_mysql_handler()8715 spider_mysql_handler::~spider_mysql_handler()
8716 {
8717   DBUG_ENTER("spider_mysql_handler::~spider_mysql_handler");
8718   DBUG_PRINT("info",("spider this=%p", this));
8719   DBUG_VOID_RETURN;
8720 }
8721 
~spider_mariadb_handler()8722 spider_mariadb_handler::~spider_mariadb_handler()
8723 {
8724   DBUG_ENTER("spider_mariadb_handler::~spider_mariadb_handler");
8725   DBUG_PRINT("info",("spider this=%p", this));
8726   DBUG_VOID_RETURN;
8727 }
8728 
init()8729 int spider_mbase_handler::init()
8730 {
8731   uint roop_count;
8732   THD *thd = spider->trx->thd;
8733   st_spider_share *share = spider->share;
8734   int init_sql_alloc_size =
8735     spider_param_init_sql_alloc_size(thd, share->init_sql_alloc_size);
8736   TABLE *table = spider->get_table();
8737   DBUG_ENTER("spider_mbase_handler::init");
8738   DBUG_PRINT("info",("spider this=%p", this));
8739   sql.init_calc_mem(59);
8740   sql_part.init_calc_mem(60);
8741   sql_part2.init_calc_mem(61);
8742   ha_sql.init_calc_mem(62);
8743   insert_sql.init_calc_mem(64);
8744   update_sql.init_calc_mem(65);
8745   tmp_sql.init_calc_mem(66);
8746   dup_update_sql.init_calc_mem(166);
8747   if (
8748     (sql.real_alloc(init_sql_alloc_size)) ||
8749     (insert_sql.real_alloc(init_sql_alloc_size)) ||
8750     (update_sql.real_alloc(init_sql_alloc_size)) ||
8751     (tmp_sql.real_alloc(init_sql_alloc_size))
8752   ) {
8753     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
8754   }
8755   sql.set_charset(share->access_charset);
8756   sql_part.set_charset(share->access_charset);
8757   sql_part2.set_charset(share->access_charset);
8758   ha_sql.set_charset(share->access_charset);
8759   insert_sql.set_charset(share->access_charset);
8760   update_sql.set_charset(share->access_charset);
8761   tmp_sql.set_charset(share->access_charset);
8762   dup_update_sql.set_charset(share->access_charset);
8763   upd_tmp_tbl_prm.init();
8764   upd_tmp_tbl_prm.field_count = 1;
8765   if (!(link_for_hash = (SPIDER_LINK_FOR_HASH *)
8766     spider_bulk_alloc_mem(spider_current_trx, 141,
8767       __func__, __FILE__, __LINE__, MYF(MY_WME | MY_ZEROFILL),
8768       &link_for_hash,
8769         sizeof(SPIDER_LINK_FOR_HASH) * share->link_count,
8770       &minimum_select_bitmap,
8771         table ? sizeof(uchar) * no_bytes_in_map(table->read_set) : 0,
8772       NullS))
8773   ) {
8774     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
8775   }
8776   for (roop_count = 0; roop_count < share->link_count; roop_count++)
8777   {
8778     link_for_hash[roop_count].spider = spider;
8779     link_for_hash[roop_count].link_idx = roop_count;
8780     link_for_hash[roop_count].db_table_str =
8781       &mysql_share->db_table_str[roop_count];
8782 #ifdef SPIDER_HAS_HASH_VALUE_TYPE
8783     link_for_hash[roop_count].db_table_str_hash_value =
8784       mysql_share->db_table_str_hash_value[roop_count];
8785 #endif
8786   }
8787 #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
8788   hs_upds.init();
8789 #endif
8790   DBUG_RETURN(0);
8791 }
8792 
8793 
append_index_hint(spider_string * str,int link_idx,ulong sql_type)8794 int spider_mbase_handler::append_index_hint(
8795   spider_string *str,
8796   int link_idx,
8797   ulong sql_type
8798   )
8799 {
8800   List<Index_hint> *index_hints = spider_get_index_hints(spider);
8801   List_iterator <Index_hint> iter(*index_hints);
8802   Index_hint *hint;
8803 //  THD *thd = current_thd;
8804   int error_num = 0;
8805   DBUG_ENTER("spider_mbase_handler::append_index_hint");
8806   DBUG_PRINT("info",("spider this=%p", this));
8807 
8808   while(index_hints && (hint = iter++))
8809   {
8810 //    hint->print(thd, str);
8811     if (sql_type != SPIDER_SQL_TYPE_HANDLER)
8812     {
8813       switch(hint->type)
8814       {
8815       case INDEX_HINT_IGNORE:
8816         if (str->reserve(hint->key_name.length+ SPIDER_SQL_INDEX_IGNORE_LEN + SPIDER_SQL_OPEN_PAREN_LEN + SPIDER_SQL_CLOSE_PAREN_LEN))
8817           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
8818         str->q_append(SPIDER_SQL_INDEX_IGNORE_STR,SPIDER_SQL_INDEX_IGNORE_LEN);
8819         str->q_append(SPIDER_SQL_OPEN_PAREN_STR,SPIDER_SQL_OPEN_PAREN_LEN);
8820         str->q_append(hint->key_name.str, hint->key_name.length);
8821         str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,SPIDER_SQL_CLOSE_PAREN_LEN);
8822         break;
8823       case INDEX_HINT_USE:
8824         if (str->reserve(hint->key_name.length+ SPIDER_SQL_INDEX_USE_LEN + SPIDER_SQL_OPEN_PAREN_LEN + SPIDER_SQL_CLOSE_PAREN_LEN))
8825           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
8826         str->q_append(SPIDER_SQL_INDEX_USE_STR,SPIDER_SQL_INDEX_USE_LEN);
8827         str->q_append(SPIDER_SQL_OPEN_PAREN_STR,SPIDER_SQL_OPEN_PAREN_LEN);
8828         str->q_append(hint->key_name.str, hint->key_name.length);
8829         str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,SPIDER_SQL_CLOSE_PAREN_LEN);
8830         break;
8831       case INDEX_HINT_FORCE:
8832         if (str->reserve(hint->key_name.length+ SPIDER_SQL_INDEX_FORCE_LEN + SPIDER_SQL_OPEN_PAREN_LEN + SPIDER_SQL_CLOSE_PAREN_LEN))
8833           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
8834         str->q_append(SPIDER_SQL_INDEX_FORCE_STR,SPIDER_SQL_INDEX_FORCE_LEN);
8835         str->q_append(SPIDER_SQL_OPEN_PAREN_STR,SPIDER_SQL_OPEN_PAREN_LEN);
8836         str->q_append(hint->key_name.str, hint->key_name.length);
8837         str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,SPIDER_SQL_CLOSE_PAREN_LEN);
8838         break;
8839       default:
8840         //    SPIDER_SQL_COMMA_STR
8841         break;
8842       }
8843     }
8844   }
8845   DBUG_RETURN(error_num);
8846 }
8847 
append_table_name_with_adjusting(spider_string * str,int link_idx,ulong sql_type)8848 int spider_mbase_handler::append_table_name_with_adjusting(
8849   spider_string *str,
8850   int link_idx,
8851   ulong sql_type
8852 ) {
8853   int error_num = 0;
8854   DBUG_ENTER("spider_mbase_handler::append_table_name_with_adjusting");
8855   DBUG_PRINT("info",("spider this=%p", this));
8856   if (sql_type == SPIDER_SQL_TYPE_HANDLER)
8857   {
8858     str->q_append(spider->m_handler_cid[link_idx], SPIDER_SQL_HANDLER_CID_LEN);
8859   } else {
8860     error_num = mysql_share->append_table_name_with_adjusting(str,
8861       spider->conn_link_idx[link_idx]);
8862   }
8863   DBUG_RETURN(error_num);
8864 }
8865 
append_key_column_types(const key_range * start_key,spider_string * str)8866 int spider_mbase_handler::append_key_column_types(
8867   const key_range *start_key,
8868   spider_string *str
8869 ) {
8870   SPIDER_RESULT_LIST *result_list = &spider->result_list;
8871   KEY *key_info = result_list->key_info;
8872   uint key_name_length, key_count;
8873   key_part_map full_key_part_map =
8874     make_prev_keypart_map(spider_user_defined_key_parts(key_info));
8875   key_part_map start_key_part_map;
8876   KEY_PART_INFO *key_part;
8877   Field *field;
8878   char tmp_buf[MAX_FIELD_WIDTH];
8879   spider_string tmp_str(tmp_buf, sizeof(tmp_buf), system_charset_info);
8880   DBUG_ENTER("spider_mbase_handler::append_key_column_types");
8881   DBUG_PRINT("info",("spider this=%p", this));
8882   tmp_str.init_calc_mem(115);
8883 
8884   start_key_part_map = start_key->keypart_map & full_key_part_map;
8885   DBUG_PRINT("info", ("spider spider_user_defined_key_parts=%u",
8886     spider_user_defined_key_parts(key_info)));
8887   DBUG_PRINT("info", ("spider full_key_part_map=%lu", full_key_part_map));
8888   DBUG_PRINT("info", ("spider start_key_part_map=%lu", start_key_part_map));
8889 
8890   if (!start_key_part_map)
8891     DBUG_RETURN(0);
8892 
8893   for (
8894     key_part = key_info->key_part,
8895     key_count = 0;
8896     start_key_part_map;
8897     start_key_part_map >>= 1,
8898     key_part++,
8899     key_count++
8900   ) {
8901     field = key_part->field;
8902     key_name_length = my_sprintf(tmp_buf, (tmp_buf, "c%u", key_count));
8903     if (str->reserve(key_name_length + SPIDER_SQL_SPACE_LEN))
8904       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
8905     str->q_append(tmp_buf, key_name_length);
8906     str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
8907 
8908     if (tmp_str.ptr() != tmp_buf)
8909       tmp_str.set(tmp_buf, sizeof(tmp_buf), system_charset_info);
8910     else
8911       tmp_str.set_charset(system_charset_info);
8912     field->sql_type(*tmp_str.get_str());
8913     tmp_str.mem_calc();
8914     str->append(tmp_str);
8915     if (field->has_charset())
8916     {
8917       CHARSET_INFO *cs = field->charset();
8918       uint coll_length = strlen(cs->name);
8919       if (str->reserve(SPIDER_SQL_COLLATE_LEN + coll_length))
8920         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
8921       str->q_append(SPIDER_SQL_COLLATE_STR, SPIDER_SQL_COLLATE_LEN);
8922       str->q_append(cs->name, coll_length);
8923     }
8924 
8925     if (str->reserve(SPIDER_SQL_COMMA_LEN))
8926       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
8927     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
8928   }
8929   str->length(str->length() - SPIDER_SQL_COMMA_LEN);
8930 
8931   DBUG_RETURN(0);
8932 }
8933 
append_key_join_columns_for_bka(const key_range * start_key,spider_string * str,const char ** table_aliases,uint * table_alias_lengths)8934 int spider_mbase_handler::append_key_join_columns_for_bka(
8935   const key_range *start_key,
8936   spider_string *str,
8937   const char **table_aliases,
8938   uint *table_alias_lengths
8939 ) {
8940   KEY *key_info = spider->result_list.key_info;
8941   uint length, key_name_length, key_count;
8942   key_part_map full_key_part_map =
8943     make_prev_keypart_map(spider_user_defined_key_parts(key_info));
8944   key_part_map start_key_part_map;
8945   KEY_PART_INFO *key_part;
8946   Field *field;
8947   char tmp_buf[MAX_FIELD_WIDTH];
8948   bool start_where = ((int) str->length() == where_pos);
8949   DBUG_ENTER("spider_mbase_handler::append_key_join_columns_for_bka");
8950   DBUG_PRINT("info",("spider this=%p", this));
8951   start_key_part_map = start_key->keypart_map & full_key_part_map;
8952   DBUG_PRINT("info", ("spider spider_user_defined_key_parts=%u",
8953     spider_user_defined_key_parts(key_info)));
8954   DBUG_PRINT("info", ("spider full_key_part_map=%lu", full_key_part_map));
8955   DBUG_PRINT("info", ("spider start_key_part_map=%lu", start_key_part_map));
8956 
8957   if (!start_key_part_map)
8958     DBUG_RETURN(0);
8959 
8960   if (start_where)
8961   {
8962     if (str->reserve(SPIDER_SQL_WHERE_LEN))
8963       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
8964     str->q_append(SPIDER_SQL_WHERE_STR, SPIDER_SQL_WHERE_LEN);
8965   } else {
8966     if (str->reserve(SPIDER_SQL_AND_LEN))
8967       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
8968     str->q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN);
8969   }
8970 
8971   for (
8972     key_part = key_info->key_part,
8973     key_count = 0;
8974     start_key_part_map;
8975     start_key_part_map >>= 1,
8976     key_part++,
8977     key_count++
8978   ) {
8979     field = key_part->field;
8980     key_name_length =
8981       mysql_share->column_name_str[field->field_index].length();
8982     length = my_sprintf(tmp_buf, (tmp_buf, "c%u", key_count));
8983     if (str->reserve(length + table_alias_lengths[0] + key_name_length +
8984       /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
8985       table_alias_lengths[1] + SPIDER_SQL_PF_EQUAL_LEN + SPIDER_SQL_AND_LEN))
8986       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
8987     str->q_append(table_aliases[0], table_alias_lengths[0]);
8988     str->q_append(tmp_buf, length);
8989     str->q_append(SPIDER_SQL_PF_EQUAL_STR, SPIDER_SQL_PF_EQUAL_LEN);
8990     str->q_append(table_aliases[1], table_alias_lengths[1]);
8991     mysql_share->append_column_name(str, field->field_index);
8992     str->q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN);
8993   }
8994   str->length(str->length() - SPIDER_SQL_AND_LEN);
8995   DBUG_RETURN(0);
8996 }
8997 
append_tmp_table_and_sql_for_bka(const key_range * start_key)8998 int spider_mbase_handler::append_tmp_table_and_sql_for_bka(
8999   const key_range *start_key
9000 ) {
9001   int error_num;
9002   DBUG_ENTER("spider_mbase_handler::append_tmp_table_and_sql_for_bka");
9003   DBUG_PRINT("info",("spider this=%p", this));
9004   char tmp_table_name[MAX_FIELD_WIDTH * 2],
9005     tgt_table_name[MAX_FIELD_WIDTH * 2];
9006   int tmp_table_name_length;
9007   spider_string tgt_table_name_str(tgt_table_name, MAX_FIELD_WIDTH * 2,
9008     mysql_share->db_names_str[0].charset());
9009   const char *table_names[2], *table_aliases[2], *table_dot_aliases[2];
9010   uint table_name_lengths[2], table_alias_lengths[2],
9011     table_dot_alias_lengths[2];
9012   tgt_table_name_str.init_calc_mem(99);
9013   tgt_table_name_str.length(0);
9014   create_tmp_bka_table_name(tmp_table_name, &tmp_table_name_length,
9015     first_link_idx);
9016   if ((error_num = append_table_name_with_adjusting(&tgt_table_name_str,
9017     first_link_idx, SPIDER_SQL_TYPE_SELECT_SQL)))
9018   {
9019     DBUG_RETURN(error_num);
9020   }
9021   table_names[0] = tmp_table_name;
9022   table_names[1] = tgt_table_name_str.c_ptr_safe();
9023   table_name_lengths[0] = tmp_table_name_length;
9024   table_name_lengths[1] = tgt_table_name_str.length();
9025   table_aliases[0] = SPIDER_SQL_A_STR;
9026   table_aliases[1] = SPIDER_SQL_B_STR;
9027   table_alias_lengths[0] = SPIDER_SQL_A_LEN;
9028   table_alias_lengths[1] = SPIDER_SQL_B_LEN;
9029   table_dot_aliases[0] = SPIDER_SQL_A_DOT_STR;
9030   table_dot_aliases[1] = SPIDER_SQL_B_DOT_STR;
9031   table_dot_alias_lengths[0] = SPIDER_SQL_A_DOT_LEN;
9032   table_dot_alias_lengths[1] = SPIDER_SQL_B_DOT_LEN;
9033   if (
9034     (error_num = append_drop_tmp_bka_table(
9035       &tmp_sql, tmp_table_name, tmp_table_name_length,
9036       &tmp_sql_pos1, &tmp_sql_pos5, TRUE)) ||
9037     (error_num = append_create_tmp_bka_table(
9038       start_key,
9039       &tmp_sql, tmp_table_name,
9040       tmp_table_name_length,
9041       &tmp_sql_pos2, spider->share->table_share->table_charset)) ||
9042     (error_num = append_insert_tmp_bka_table(
9043       start_key,
9044       &tmp_sql, tmp_table_name,
9045       tmp_table_name_length, &tmp_sql_pos3))
9046   )
9047     DBUG_RETURN(error_num);
9048   tmp_sql_pos4 = tmp_sql.length();
9049   if ((error_num = spider_db_append_select(spider)))
9050     DBUG_RETURN(error_num);
9051   if (sql.reserve(SPIDER_SQL_A_DOT_LEN + SPIDER_SQL_ID_LEN +
9052     SPIDER_SQL_COMMA_LEN))
9053     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9054   sql.q_append(SPIDER_SQL_A_DOT_STR, SPIDER_SQL_A_DOT_LEN);
9055   sql.q_append(SPIDER_SQL_ID_STR, SPIDER_SQL_ID_LEN);
9056   sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
9057   if (
9058     (error_num = append_select_columns_with_alias(&sql,
9059       SPIDER_SQL_B_DOT_STR, SPIDER_SQL_B_DOT_LEN)) ||
9060     (error_num = spider_db_mbase_utility->append_from_with_alias(&sql,
9061       table_names, table_name_lengths,
9062       table_aliases, table_alias_lengths, 2,
9063       &table_name_pos, FALSE))
9064   )
9065     DBUG_RETURN(error_num);
9066   if (
9067     mysql_share->key_hint &&
9068     (error_num = spider_db_append_hint_after_table(spider,
9069       &sql, &mysql_share->key_hint[spider->active_index]))
9070   )
9071     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9072   where_pos = sql.length();
9073   if (
9074     (error_num = append_key_join_columns_for_bka(
9075       start_key, &sql,
9076       table_dot_aliases, table_dot_alias_lengths)) ||
9077     (error_num = append_condition_part(
9078       SPIDER_SQL_B_DOT_STR, SPIDER_SQL_B_DOT_LEN,
9079       SPIDER_SQL_TYPE_SELECT_SQL, FALSE))
9080   )
9081     DBUG_RETURN(error_num);
9082   if (spider->result_list.direct_order_limit)
9083   {
9084     if ((error_num = append_key_order_for_direct_order_limit_with_alias(&sql,
9085       SPIDER_SQL_B_DOT_STR, SPIDER_SQL_B_DOT_LEN)))
9086       DBUG_RETURN(error_num);
9087   }
9088 #ifdef HANDLER_HAS_DIRECT_AGGREGATE
9089   else if (spider->result_list.direct_aggregate)
9090   {
9091     if ((error_num =
9092       append_group_by(&sql, SPIDER_SQL_B_DOT_STR, SPIDER_SQL_B_DOT_LEN)))
9093       DBUG_RETURN(error_num);
9094   }
9095 #endif
9096 
9097   DBUG_RETURN(0);
9098 }
9099 
reuse_tmp_table_and_sql_for_bka()9100 int spider_mbase_handler::reuse_tmp_table_and_sql_for_bka()
9101 {
9102   DBUG_ENTER("spider_mbase_handler::reuse_tmp_table_and_sql_for_bka");
9103   DBUG_PRINT("info",("spider this=%p", this));
9104   tmp_sql.length(tmp_sql_pos4);
9105   sql.length(limit_pos);
9106   ha_sql.length(ha_limit_pos);
9107   DBUG_RETURN(0);
9108 }
9109 
create_tmp_bka_table_name(char * tmp_table_name,int * tmp_table_name_length,int link_idx)9110 void spider_mbase_handler::create_tmp_bka_table_name(
9111   char *tmp_table_name,
9112   int *tmp_table_name_length,
9113   int link_idx
9114 ) {
9115   uint adjust_length, length;
9116   DBUG_ENTER("spider_mbase_handler::create_tmp_bka_table_name");
9117   if (spider_param_bka_table_name_type(current_thd,
9118     mysql_share->spider_share->
9119       bka_table_name_types[spider->conn_link_idx[link_idx]]) == 1)
9120   {
9121     adjust_length =
9122       mysql_share->db_nm_max_length -
9123       mysql_share->db_names_str[spider->conn_link_idx[link_idx]].length() +
9124       mysql_share->table_nm_max_length -
9125       mysql_share->table_names_str[spider->conn_link_idx[link_idx]].length();
9126     *tmp_table_name_length = mysql_share->db_nm_max_length +
9127       mysql_share->table_nm_max_length;
9128     memset(tmp_table_name, ' ', adjust_length);
9129     tmp_table_name += adjust_length;
9130     memcpy(tmp_table_name, mysql_share->db_names_str[link_idx].c_ptr(),
9131       mysql_share->db_names_str[link_idx].length());
9132     tmp_table_name += mysql_share->db_names_str[link_idx].length();
9133     length = my_sprintf(tmp_table_name, (tmp_table_name,
9134       "%s%s%p%s", SPIDER_SQL_DOT_STR, SPIDER_SQL_TMP_BKA_STR, spider,
9135       SPIDER_SQL_UNDERSCORE_STR));
9136     *tmp_table_name_length += length;
9137     tmp_table_name += length;
9138     memcpy(tmp_table_name,
9139       mysql_share->table_names_str[spider->conn_link_idx[link_idx]].c_ptr(),
9140       mysql_share->table_names_str[spider->conn_link_idx[link_idx]].length());
9141   } else {
9142     adjust_length =
9143       mysql_share->db_nm_max_length -
9144       mysql_share->db_names_str[spider->conn_link_idx[link_idx]].length();
9145     *tmp_table_name_length = mysql_share->db_nm_max_length;
9146     memset(tmp_table_name, ' ', adjust_length);
9147     tmp_table_name += adjust_length;
9148     memcpy(tmp_table_name, mysql_share->db_names_str[link_idx].c_ptr(),
9149       mysql_share->db_names_str[link_idx].length());
9150     tmp_table_name += mysql_share->db_names_str[link_idx].length();
9151     length = my_sprintf(tmp_table_name, (tmp_table_name,
9152       "%s%s%p", SPIDER_SQL_DOT_STR, SPIDER_SQL_TMP_BKA_STR, spider));
9153     *tmp_table_name_length += length;
9154   }
9155   DBUG_VOID_RETURN;
9156 }
9157 
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)9158 int spider_mbase_handler::append_create_tmp_bka_table(
9159   const key_range *start_key,
9160   spider_string *str,
9161   char *tmp_table_name,
9162   int tmp_table_name_length,
9163   int *db_name_pos,
9164   CHARSET_INFO *table_charset
9165 ) {
9166   int error_num;
9167   SPIDER_SHARE *share = spider->share;
9168   THD *thd = spider->trx->thd;
9169   char *bka_engine = spider_param_bka_engine(thd, share->bka_engine);
9170   uint bka_engine_length = strlen(bka_engine),
9171     cset_length = strlen(table_charset->csname),
9172     coll_length = strlen(table_charset->name);
9173   DBUG_ENTER("spider_mbase_handler::append_create_tmp_bka_table");
9174   if (str->reserve(SPIDER_SQL_CREATE_TMP_LEN + tmp_table_name_length +
9175     SPIDER_SQL_OPEN_PAREN_LEN + SPIDER_SQL_ID_LEN + SPIDER_SQL_ID_TYPE_LEN +
9176     SPIDER_SQL_COMMA_LEN))
9177     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9178   str->q_append(SPIDER_SQL_CREATE_TMP_STR, SPIDER_SQL_CREATE_TMP_LEN);
9179   *db_name_pos = str->length();
9180   str->q_append(tmp_table_name, tmp_table_name_length);
9181   str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
9182   str->q_append(SPIDER_SQL_ID_STR, SPIDER_SQL_ID_LEN);
9183   str->q_append(SPIDER_SQL_ID_TYPE_STR, SPIDER_SQL_ID_TYPE_LEN);
9184   str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
9185   if ((error_num = append_key_column_types(start_key, str)))
9186     DBUG_RETURN(error_num);
9187   if (str->reserve(SPIDER_SQL_ENGINE_LEN + bka_engine_length +
9188     SPIDER_SQL_DEF_CHARSET_LEN + cset_length + SPIDER_SQL_COLLATE_LEN +
9189     coll_length + SPIDER_SQL_SEMICOLON_LEN))
9190     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9191   str->q_append(SPIDER_SQL_ENGINE_STR, SPIDER_SQL_ENGINE_LEN);
9192   str->q_append(bka_engine, bka_engine_length);
9193   str->q_append(SPIDER_SQL_DEF_CHARSET_STR, SPIDER_SQL_DEF_CHARSET_LEN);
9194   str->q_append(table_charset->csname, cset_length);
9195   str->q_append(SPIDER_SQL_COLLATE_STR, SPIDER_SQL_COLLATE_LEN);
9196   str->q_append(table_charset->name, coll_length);
9197   str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
9198   DBUG_RETURN(0);
9199 }
9200 
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)9201 int spider_mbase_handler::append_drop_tmp_bka_table(
9202   spider_string *str,
9203   char *tmp_table_name,
9204   int tmp_table_name_length,
9205   int *db_name_pos,
9206   int *drop_table_end_pos,
9207   bool with_semicolon
9208 ) {
9209   DBUG_ENTER("spider_mbase_handler::append_drop_tmp_bka_table");
9210   if (str->reserve(SPIDER_SQL_DROP_TMP_LEN + tmp_table_name_length +
9211     (with_semicolon ? SPIDER_SQL_SEMICOLON_LEN : 0)))
9212     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9213   str->q_append(SPIDER_SQL_DROP_TMP_STR, SPIDER_SQL_DROP_TMP_LEN);
9214   *db_name_pos = str->length();
9215   str->q_append(tmp_table_name, tmp_table_name_length);
9216   *drop_table_end_pos = str->length();
9217   if (with_semicolon)
9218     str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
9219   DBUG_RETURN(0);
9220 }
9221 
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)9222 int spider_mbase_handler::append_insert_tmp_bka_table(
9223   const key_range *start_key,
9224   spider_string *str,
9225   char *tmp_table_name,
9226   int tmp_table_name_length,
9227   int *db_name_pos
9228 ) {
9229   int error_num;
9230   DBUG_ENTER("spider_mbase_handler::append_insert_tmp_bka_table");
9231   if (str->reserve(SPIDER_SQL_INSERT_LEN + SPIDER_SQL_INTO_LEN +
9232     tmp_table_name_length + SPIDER_SQL_OPEN_PAREN_LEN + SPIDER_SQL_ID_LEN +
9233     SPIDER_SQL_COMMA_LEN))
9234     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9235   str->q_append(SPIDER_SQL_INSERT_STR, SPIDER_SQL_INSERT_LEN);
9236   str->q_append(SPIDER_SQL_INTO_STR, SPIDER_SQL_INTO_LEN);
9237   *db_name_pos = str->length();
9238   str->q_append(tmp_table_name, tmp_table_name_length);
9239   str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
9240   str->q_append(SPIDER_SQL_ID_STR, SPIDER_SQL_ID_LEN);
9241   str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
9242   if ((error_num = spider_db_append_key_columns(start_key, spider, str)))
9243     DBUG_RETURN(error_num);
9244   if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN + SPIDER_SQL_VALUES_LEN +
9245     SPIDER_SQL_OPEN_PAREN_LEN))
9246     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9247   str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
9248   str->q_append(SPIDER_SQL_VALUES_STR, SPIDER_SQL_VALUES_LEN);
9249   str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
9250   DBUG_RETURN(0);
9251 }
9252 
append_union_table_and_sql_for_bka(const key_range * start_key)9253 int spider_mbase_handler::append_union_table_and_sql_for_bka(
9254   const key_range *start_key
9255 ) {
9256   int error_num;
9257   DBUG_ENTER("spider_mbase_handler::append_union_table_and_sql_for_bka");
9258   DBUG_PRINT("info",("spider this=%p", this));
9259   char tgt_table_name[MAX_FIELD_WIDTH * 2];
9260   spider_string tgt_table_name_str(tgt_table_name, MAX_FIELD_WIDTH * 2,
9261     mysql_share->db_names_str[0].charset());
9262   const char *table_names[2], *table_aliases[2], *table_dot_aliases[2];
9263   uint table_name_lengths[2], table_alias_lengths[2],
9264     table_dot_alias_lengths[2];
9265   tgt_table_name_str.init_calc_mem(233);
9266   tgt_table_name_str.length(0);
9267   if ((error_num = append_table_name_with_adjusting(&tgt_table_name_str,
9268     first_link_idx, SPIDER_SQL_TYPE_SELECT_SQL)))
9269   {
9270     DBUG_RETURN(error_num);
9271   }
9272   table_names[0] = "";
9273   table_names[1] = tgt_table_name_str.c_ptr_safe();
9274   table_name_lengths[0] = 0;
9275   table_name_lengths[1] = tgt_table_name_str.length();
9276   table_aliases[0] = SPIDER_SQL_A_STR;
9277   table_aliases[1] = SPIDER_SQL_B_STR;
9278   table_alias_lengths[0] = SPIDER_SQL_A_LEN;
9279   table_alias_lengths[1] = SPIDER_SQL_B_LEN;
9280   table_dot_aliases[0] = SPIDER_SQL_A_DOT_STR;
9281   table_dot_aliases[1] = SPIDER_SQL_B_DOT_STR;
9282   table_dot_alias_lengths[0] = SPIDER_SQL_A_DOT_LEN;
9283   table_dot_alias_lengths[1] = SPIDER_SQL_B_DOT_LEN;
9284 
9285   if ((error_num = spider_db_append_select(spider)))
9286     DBUG_RETURN(error_num);
9287   if (sql.reserve(SPIDER_SQL_A_DOT_LEN + SPIDER_SQL_ID_LEN +
9288     SPIDER_SQL_COMMA_LEN))
9289     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9290   sql.q_append(SPIDER_SQL_A_DOT_STR, SPIDER_SQL_A_DOT_LEN);
9291   sql.q_append(SPIDER_SQL_ID_STR, SPIDER_SQL_ID_LEN);
9292   sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
9293   if ((error_num = append_select_columns_with_alias(&sql,
9294     SPIDER_SQL_B_DOT_STR, SPIDER_SQL_B_DOT_LEN)))
9295     DBUG_RETURN(error_num);
9296   if (sql.reserve(SPIDER_SQL_FROM_LEN + (SPIDER_SQL_OPEN_PAREN_LEN * 2)))
9297     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9298   sql.q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN);
9299   sql.q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
9300   sql.q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
9301   tmp_sql_pos1 = sql.length();
9302 
9303   if (
9304     (error_num = spider_db_mbase_utility->append_from_with_alias(&tmp_sql,
9305       table_names, table_name_lengths,
9306       table_aliases, table_alias_lengths, 2,
9307       &table_name_pos, FALSE))
9308   )
9309     DBUG_RETURN(error_num);
9310   if (
9311     mysql_share->key_hint &&
9312     (error_num = spider_db_append_hint_after_table(spider,
9313       &tmp_sql, &mysql_share->key_hint[spider->active_index]))
9314   )
9315     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9316   where_pos = tmp_sql.length();
9317   if (
9318     (error_num = append_key_join_columns_for_bka(
9319       start_key, &tmp_sql,
9320       table_dot_aliases, table_dot_alias_lengths)) ||
9321     (error_num = append_condition_part(
9322       SPIDER_SQL_B_DOT_STR, SPIDER_SQL_B_DOT_LEN,
9323       SPIDER_SQL_TYPE_TMP_SQL, FALSE))
9324   )
9325     DBUG_RETURN(error_num);
9326   if (spider->result_list.direct_order_limit)
9327   {
9328     if ((error_num =
9329       append_key_order_for_direct_order_limit_with_alias(&tmp_sql,
9330         SPIDER_SQL_B_DOT_STR, SPIDER_SQL_B_DOT_LEN))
9331     )
9332       DBUG_RETURN(error_num);
9333   }
9334 #ifdef HANDLER_HAS_DIRECT_AGGREGATE
9335   else if (spider->result_list.direct_aggregate)
9336   {
9337     if ((error_num =
9338       append_group_by(&tmp_sql, SPIDER_SQL_B_DOT_STR, SPIDER_SQL_B_DOT_LEN)))
9339       DBUG_RETURN(error_num);
9340   }
9341 #endif
9342 
9343   DBUG_RETURN(0);
9344 }
9345 
reuse_union_table_and_sql_for_bka()9346 int spider_mbase_handler::reuse_union_table_and_sql_for_bka()
9347 {
9348   DBUG_ENTER("spider_mbase_handler::reuse_union_table_and_sql_for_bka");
9349   DBUG_PRINT("info",("spider this=%p", this));
9350   sql.length(tmp_sql_pos1);
9351   DBUG_RETURN(0);
9352 }
9353 
append_insert_for_recovery(ulong sql_type,int link_idx)9354 int spider_mbase_handler::append_insert_for_recovery(
9355   ulong sql_type,
9356   int link_idx
9357 ) {
9358   const TABLE *table = spider->get_table();
9359   SPIDER_SHARE *share = spider->share;
9360   Field **field;
9361   uint field_name_length = 0;
9362   bool add_value = FALSE;
9363   spider_string *insert_sql;
9364   DBUG_ENTER("spider_mbase_handler::append_insert_for_recovery");
9365   DBUG_PRINT("info",("spider this=%p", this));
9366   if (sql_type == SPIDER_SQL_TYPE_INSERT_SQL)
9367   {
9368     insert_sql = &spider->result_list.insert_sqls[link_idx];
9369     insert_sql->length(0);
9370   } else {
9371     insert_sql = &spider->result_list.update_sqls[link_idx];
9372   }
9373   if (insert_sql->reserve(
9374     SPIDER_SQL_INSERT_LEN + SPIDER_SQL_SQL_IGNORE_LEN +
9375     SPIDER_SQL_INTO_LEN + mysql_share->db_nm_max_length +
9376     SPIDER_SQL_DOT_LEN + mysql_share->table_nm_max_length +
9377     /* SPIDER_SQL_NAME_QUOTE_LEN */ 4 + SPIDER_SQL_OPEN_PAREN_LEN))
9378     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9379   insert_sql->q_append(SPIDER_SQL_INSERT_STR, SPIDER_SQL_INSERT_LEN);
9380   insert_sql->q_append(SPIDER_SQL_SQL_IGNORE_STR, SPIDER_SQL_SQL_IGNORE_LEN);
9381   insert_sql->q_append(SPIDER_SQL_INTO_STR, SPIDER_SQL_INTO_LEN);
9382   mysql_share->append_table_name(insert_sql, spider->conn_link_idx[link_idx]);
9383   insert_sql->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
9384   for (field = table->field; *field; field++)
9385   {
9386     field_name_length =
9387       mysql_share->column_name_str[(*field)->field_index].length();
9388     if (insert_sql->reserve(field_name_length +
9389       /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
9390       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9391     mysql_share->append_column_name(insert_sql, (*field)->field_index);
9392     insert_sql->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
9393   }
9394   if (field_name_length)
9395     insert_sql->length(insert_sql->length() - SPIDER_SQL_COMMA_LEN);
9396   if (insert_sql->reserve(SPIDER_SQL_CLOSE_PAREN_LEN + SPIDER_SQL_VALUES_LEN +
9397     SPIDER_SQL_OPEN_PAREN_LEN))
9398     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9399   insert_sql->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
9400   insert_sql->q_append(SPIDER_SQL_VALUES_STR, SPIDER_SQL_VALUES_LEN);
9401   insert_sql->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
9402   for (field = table->field; *field; field++)
9403   {
9404     add_value = TRUE;
9405     if ((*field)->is_null())
9406     {
9407       if (insert_sql->reserve(SPIDER_SQL_NULL_LEN + SPIDER_SQL_COMMA_LEN))
9408         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9409       insert_sql->q_append(SPIDER_SQL_NULL_STR, SPIDER_SQL_NULL_LEN);
9410     } else {
9411       if (
9412         spider_db_mbase_utility->
9413           append_column_value(spider, insert_sql, *field, NULL,
9414             share->access_charset) ||
9415         insert_sql->reserve(SPIDER_SQL_COMMA_LEN)
9416       )
9417         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9418     }
9419     insert_sql->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
9420   }
9421   if (add_value)
9422     insert_sql->length(insert_sql->length() - SPIDER_SQL_COMMA_LEN);
9423   if (insert_sql->reserve(SPIDER_SQL_CLOSE_PAREN_LEN, SPIDER_SQL_COMMA_LEN))
9424     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9425   insert_sql->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
9426   if (sql_type == SPIDER_SQL_TYPE_INSERT_SQL)
9427   {
9428     exec_insert_sql = insert_sql;
9429   }
9430   DBUG_RETURN(0);
9431 }
9432 
append_update(const TABLE * table,my_ptrdiff_t ptr_diff)9433 int spider_mbase_handler::append_update(
9434   const TABLE *table,
9435   my_ptrdiff_t ptr_diff
9436 ) {
9437   int error_num;
9438   spider_string *str = &update_sql;
9439   DBUG_ENTER("spider_mbase_handler::append_update");
9440   DBUG_PRINT("info",("spider this=%p", this));
9441   if (str->length() > 0)
9442   {
9443     if (str->reserve(SPIDER_SQL_SEMICOLON_LEN))
9444       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9445     str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
9446   }
9447 
9448   if (
9449     (error_num = append_update(str, 0)) ||
9450     (error_num = append_update_set(str)) ||
9451     (error_num = append_update_where(str, table, ptr_diff))
9452   )
9453     DBUG_RETURN(error_num);
9454   filled_up = (str->length() >= (uint) spider->result_list.bulk_update_size);
9455   DBUG_RETURN(0);
9456 }
9457 
append_update(const TABLE * table,my_ptrdiff_t ptr_diff,int link_idx)9458 int spider_mbase_handler::append_update(
9459   const TABLE *table,
9460   my_ptrdiff_t ptr_diff,
9461   int link_idx
9462 ) {
9463   int error_num;
9464   SPIDER_SHARE *share = spider->share;
9465   spider_string *str = &spider->result_list.update_sqls[link_idx];
9466   DBUG_ENTER("spider_mbase_handler::append_update");
9467   DBUG_PRINT("info",("spider this=%p", this));
9468   if (str->length() > 0)
9469   {
9470     if (str->reserve(SPIDER_SQL_SEMICOLON_LEN))
9471       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9472     str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
9473   }
9474 
9475   if (
9476     (error_num = append_update(str, link_idx)) ||
9477     (error_num = append_update_set(str)) ||
9478     (error_num = append_update_where(str, table, ptr_diff))
9479   )
9480     DBUG_RETURN(error_num);
9481 
9482   if (
9483     spider->pk_update &&
9484     share->link_statuses[link_idx] == SPIDER_LINK_STATUS_RECOVERY
9485   ) {
9486     if (str->reserve(SPIDER_SQL_SEMICOLON_LEN))
9487       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9488     str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
9489     if ((error_num = append_insert_for_recovery(
9490       SPIDER_SQL_TYPE_UPDATE_SQL, link_idx)))
9491       DBUG_RETURN(error_num);
9492   }
9493 
9494   if (!filled_up)
9495     filled_up = (str->length() >= (uint) spider->result_list.bulk_update_size);
9496   DBUG_RETURN(0);
9497 }
9498 
append_delete(const TABLE * table,my_ptrdiff_t ptr_diff)9499 int spider_mbase_handler::append_delete(
9500   const TABLE *table,
9501   my_ptrdiff_t ptr_diff
9502 ) {
9503   int error_num;
9504   spider_string *str = &update_sql;
9505   DBUG_ENTER("spider_mbase_handler::append_delete");
9506   DBUG_PRINT("info",("spider this=%p", this));
9507   if (str->length() > 0)
9508   {
9509     if (str->reserve(SPIDER_SQL_SEMICOLON_LEN))
9510       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9511     str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
9512   }
9513 
9514   if (
9515     (error_num = append_delete(str)) ||
9516     (error_num = append_from(str, SPIDER_SQL_TYPE_DELETE_SQL,
9517       first_link_idx)) ||
9518     (error_num = append_update_where(str, table, ptr_diff))
9519   )
9520     DBUG_RETURN(error_num);
9521   filled_up = (str->length() >= (uint) spider->result_list.bulk_update_size);
9522   DBUG_RETURN(0);
9523 }
9524 
append_delete(const TABLE * table,my_ptrdiff_t ptr_diff,int link_idx)9525 int spider_mbase_handler::append_delete(
9526   const TABLE *table,
9527   my_ptrdiff_t ptr_diff,
9528   int link_idx
9529 ) {
9530   int error_num;
9531   spider_string *str = &spider->result_list.update_sqls[link_idx];
9532   DBUG_ENTER("spider_mbase_handler::append_delete");
9533   DBUG_PRINT("info",("spider this=%p", this));
9534   if (str->length() > 0)
9535   {
9536     if (str->reserve(SPIDER_SQL_SEMICOLON_LEN))
9537       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9538     str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
9539   }
9540 
9541   if (
9542     (error_num = append_delete(str)) ||
9543     (error_num = append_from(str, SPIDER_SQL_TYPE_DELETE_SQL, link_idx)) ||
9544     (error_num = append_update_where(str, table, ptr_diff))
9545   )
9546     DBUG_RETURN(error_num);
9547   if (!filled_up)
9548     filled_up = (str->length() >= (uint) spider->result_list.bulk_update_size);
9549   DBUG_RETURN(0);
9550 }
9551 
append_insert_part()9552 int spider_mbase_handler::append_insert_part()
9553 {
9554   int error_num;
9555   DBUG_ENTER("spider_mbase_handler::append_insert_part");
9556   DBUG_PRINT("info",("spider this=%p", this));
9557   error_num = append_insert(&insert_sql, 0);
9558   DBUG_RETURN(error_num);
9559 }
9560 
append_insert(spider_string * str,int link_idx)9561 int spider_mbase_handler::append_insert(
9562   spider_string *str,
9563   int link_idx
9564 ) {
9565   SPIDER_SHARE *share = spider->share;
9566   DBUG_ENTER("spider_mbase_handler::append_insert");
9567   direct_insert_kind = SPIDER_SQL_DIRECT_INSERT_KIND_INSERT;
9568   if (
9569     (
9570       spider->write_can_replace ||
9571       /* for direct_dup_insert without patch for partition */
9572       spider->sql_command == SQLCOM_REPLACE ||
9573       spider->sql_command == SQLCOM_REPLACE_SELECT
9574     ) &&
9575     spider->direct_dup_insert
9576   ) {
9577     direct_insert_kind = SPIDER_SQL_DIRECT_INSERT_KIND_REPLACE;
9578     if (str->reserve(SPIDER_SQL_REPLACE_LEN))
9579       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9580     str->q_append(SPIDER_SQL_REPLACE_STR, SPIDER_SQL_REPLACE_LEN);
9581   } else {
9582     if (str->reserve(SPIDER_SQL_INSERT_LEN))
9583       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9584     str->q_append(SPIDER_SQL_INSERT_STR, SPIDER_SQL_INSERT_LEN);
9585   }
9586   if (spider->low_priority)
9587   {
9588     if (str->reserve(SPIDER_SQL_LOW_PRIORITY_LEN))
9589       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9590     str->q_append(SPIDER_SQL_LOW_PRIORITY_STR, SPIDER_SQL_LOW_PRIORITY_LEN);
9591   }
9592   else if (spider->insert_delayed)
9593   {
9594     if (share->internal_delayed)
9595     {
9596       if (str->reserve(SPIDER_SQL_SQL_DELAYED_LEN))
9597         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9598       str->q_append(SPIDER_SQL_SQL_DELAYED_STR, SPIDER_SQL_SQL_DELAYED_LEN);
9599     }
9600   }
9601   else if (
9602     spider->lock_type >= TL_WRITE &&
9603     !spider->write_can_replace &&
9604     /* for direct_dup_insert without patch for partition */
9605     spider->sql_command != SQLCOM_REPLACE &&
9606     spider->sql_command != SQLCOM_REPLACE_SELECT
9607   ) {
9608     if (str->reserve(SPIDER_SQL_HIGH_PRIORITY_LEN))
9609       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9610     str->q_append(SPIDER_SQL_HIGH_PRIORITY_STR, SPIDER_SQL_HIGH_PRIORITY_LEN);
9611   }
9612   if (
9613     spider->ignore_dup_key &&
9614     spider->direct_dup_insert &&
9615     !spider->write_can_replace &&
9616 #ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
9617     (!spider->insert_with_update || !dup_update_sql.length()) &&
9618 #else
9619     !spider->insert_with_update &&
9620 #endif
9621     /* for direct_dup_insert without patch for partition */
9622     spider->sql_command != SQLCOM_REPLACE &&
9623     spider->sql_command != SQLCOM_REPLACE_SELECT
9624   ) {
9625     direct_insert_kind = SPIDER_SQL_DIRECT_INSERT_KIND_IGNORE;
9626     if (str->reserve(SPIDER_SQL_SQL_IGNORE_LEN))
9627       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9628     str->q_append(SPIDER_SQL_SQL_IGNORE_STR, SPIDER_SQL_SQL_IGNORE_LEN);
9629   }
9630   DBUG_RETURN(0);
9631 }
9632 
append_update_part()9633 int spider_mbase_handler::append_update_part()
9634 {
9635   int error_num;
9636   DBUG_ENTER("spider_mbase_handler::append_update_part");
9637   DBUG_PRINT("info",("spider this=%p", this));
9638   error_num = append_update(&update_sql, 0);
9639   DBUG_RETURN(error_num);
9640 }
9641 
append_update(spider_string * str,int link_idx)9642 int spider_mbase_handler::append_update(
9643   spider_string *str,
9644   int link_idx
9645 ) {
9646   DBUG_ENTER("spider_mbase_handler::append_update");
9647   if (str->reserve(SPIDER_SQL_UPDATE_LEN))
9648     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9649   str->q_append(SPIDER_SQL_UPDATE_STR, SPIDER_SQL_UPDATE_LEN);
9650   if (spider->low_priority)
9651   {
9652     if (str->reserve(SPIDER_SQL_LOW_PRIORITY_LEN))
9653       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9654     str->q_append(SPIDER_SQL_LOW_PRIORITY_STR, SPIDER_SQL_LOW_PRIORITY_LEN);
9655   }
9656   if (
9657     spider->ignore_dup_key &&
9658     !spider->insert_with_update
9659   ) {
9660     if (str->reserve(SPIDER_SQL_SQL_IGNORE_LEN))
9661       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9662     str->q_append(SPIDER_SQL_SQL_IGNORE_STR, SPIDER_SQL_SQL_IGNORE_LEN);
9663   }
9664   if (str->reserve(mysql_share->db_nm_max_length +
9665     SPIDER_SQL_DOT_LEN + mysql_share->table_nm_max_length +
9666     /* SPIDER_SQL_NAME_QUOTE_LEN */ 4))
9667     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9668   table_name_pos = str->length();
9669   append_table_name_with_adjusting(str, link_idx, SPIDER_SQL_TYPE_UPDATE_SQL);
9670   DBUG_RETURN(0);
9671 }
9672 
append_delete_part()9673 int spider_mbase_handler::append_delete_part()
9674 {
9675   int error_num;
9676   DBUG_ENTER("spider_mbase_handler::append_delete_part");
9677   DBUG_PRINT("info",("spider this=%p", this));
9678   error_num = append_delete(&update_sql);
9679   DBUG_RETURN(error_num);
9680 }
9681 
append_delete(spider_string * str)9682 int spider_mbase_handler::append_delete(
9683   spider_string *str
9684 ) {
9685   DBUG_ENTER("spider_mbase_handler::append_delete");
9686   if (str->reserve(SPIDER_SQL_DELETE_LEN))
9687     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9688   str->q_append(SPIDER_SQL_DELETE_STR, SPIDER_SQL_DELETE_LEN);
9689   if (spider->low_priority)
9690   {
9691     if (str->reserve(SPIDER_SQL_LOW_PRIORITY_LEN))
9692       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9693     str->q_append(SPIDER_SQL_LOW_PRIORITY_STR, SPIDER_SQL_LOW_PRIORITY_LEN);
9694   }
9695   if (spider->quick_mode)
9696   {
9697     if (str->reserve(SPIDER_SQL_SQL_QUICK_MODE_LEN))
9698       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9699     str->q_append(SPIDER_SQL_SQL_QUICK_MODE_STR,
9700       SPIDER_SQL_SQL_QUICK_MODE_LEN);
9701   }
9702   if (spider->ignore_dup_key)
9703   {
9704     if (str->reserve(SPIDER_SQL_SQL_IGNORE_LEN))
9705       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9706     str->q_append(SPIDER_SQL_SQL_IGNORE_STR, SPIDER_SQL_SQL_IGNORE_LEN);
9707   }
9708   str->length(str->length() - 1);
9709   DBUG_RETURN(0);
9710 }
9711 
9712 #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
9713 #ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
append_increment_update_set_part()9714 int spider_mbase_handler::append_increment_update_set_part()
9715 {
9716   int error_num;
9717   DBUG_ENTER("spider_mbase_handler::append_increment_update_set_part");
9718   DBUG_PRINT("info",("spider this=%p", this));
9719   error_num = append_increment_update_set(&update_sql);
9720   DBUG_RETURN(error_num);
9721 }
9722 
append_increment_update_set(spider_string * str)9723 int spider_mbase_handler::append_increment_update_set(
9724   spider_string *str
9725 ) {
9726   uint field_name_length;
9727   uint roop_count;
9728   Field *field;
9729   DBUG_ENTER("spider_mbase_handler::append_increment_update_set");
9730   if (str->reserve(SPIDER_SQL_SET_LEN))
9731     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9732   str->q_append(SPIDER_SQL_SET_STR, SPIDER_SQL_SET_LEN);
9733   const SPIDER_HS_STRING_REF *value = hs_upds.ptr();
9734   for (roop_count = 0; roop_count < hs_upds.size();
9735     roop_count++)
9736   {
9737     if (
9738       value[roop_count].size() == 1 &&
9739       *(value[roop_count].begin()) == '0'
9740     )
9741       continue;
9742 
9743     Field *top_table_field =
9744       spider->get_top_table_field(spider->hs_pushed_ret_fields[roop_count]);
9745     if (!(field = spider->field_exchange(top_table_field)))
9746       continue;
9747     field_name_length =
9748       mysql_share->column_name_str[field->field_index].length();
9749 
9750     if (str->reserve(field_name_length * 2 + /* SPIDER_SQL_NAME_QUOTE_LEN */
9751       4 + SPIDER_SQL_EQUAL_LEN + SPIDER_SQL_HS_INCREMENT_LEN +
9752       SPIDER_SQL_COMMA_LEN + value[roop_count].size()))
9753       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9754 
9755     mysql_share->append_column_name(str, field->field_index);
9756     str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
9757     mysql_share->append_column_name(str, field->field_index);
9758     if (spider->hs_increment)
9759       str->q_append(SPIDER_SQL_HS_INCREMENT_STR,
9760         SPIDER_SQL_HS_INCREMENT_LEN);
9761     else
9762       str->q_append(SPIDER_SQL_HS_DECREMENT_STR,
9763         SPIDER_SQL_HS_DECREMENT_LEN);
9764     str->q_append(value[roop_count].begin(), value[roop_count].size());
9765     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
9766   }
9767   str->length(str->length() - SPIDER_SQL_COMMA_LEN);
9768   DBUG_RETURN(0);
9769 }
9770 #endif
9771 #endif
9772 
append_update_set_part()9773 int spider_mbase_handler::append_update_set_part()
9774 {
9775   int error_num;
9776   DBUG_ENTER("spider_mbase_handler::append_update_set_part");
9777   DBUG_PRINT("info",("spider this=%p", this));
9778   error_num = append_update_set(&update_sql);
9779   where_pos = update_sql.length();
9780   DBUG_RETURN(error_num);
9781 }
9782 
append_update_set(spider_string * str)9783 int spider_mbase_handler::append_update_set(
9784   spider_string *str
9785 ) {
9786   uint field_name_length;
9787   SPIDER_SHARE *share = spider->share;
9788   TABLE *table = spider->get_table();
9789   Field **fields;
9790   DBUG_ENTER("spider_mbase_handler::append_update_set");
9791   if (str->reserve(SPIDER_SQL_SET_LEN))
9792     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9793   str->q_append(SPIDER_SQL_SET_STR, SPIDER_SQL_SET_LEN);
9794   for (fields = table->field; *fields; fields++)
9795   {
9796     if (bitmap_is_set(table->write_set, (*fields)->field_index))
9797     {
9798       field_name_length =
9799         mysql_share->column_name_str[(*fields)->field_index].length();
9800       if ((*fields)->is_null())
9801       {
9802         if (str->reserve(field_name_length + /* SPIDER_SQL_NAME_QUOTE_LEN */
9803           2 + SPIDER_SQL_EQUAL_LEN + SPIDER_SQL_NULL_LEN +
9804           SPIDER_SQL_COMMA_LEN))
9805           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9806         mysql_share->append_column_name(str, (*fields)->field_index);
9807         str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
9808         str->q_append(SPIDER_SQL_NULL_STR, SPIDER_SQL_NULL_LEN);
9809       } else {
9810         if (str->reserve(field_name_length + /* SPIDER_SQL_NAME_QUOTE_LEN */
9811           2 + SPIDER_SQL_EQUAL_LEN))
9812           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9813         mysql_share->append_column_name(str, (*fields)->field_index);
9814         str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
9815 #ifndef DBUG_OFF
9816         MY_BITMAP *tmp_map = dbug_tmp_use_all_columns(table, &table->read_set);
9817 #endif
9818         if (
9819           spider_db_mbase_utility->
9820             append_column_value(spider, str, *fields, NULL,
9821               share->access_charset) ||
9822           str->reserve(SPIDER_SQL_COMMA_LEN)
9823         ) {
9824 #ifndef DBUG_OFF
9825           dbug_tmp_restore_column_map(&table->read_set, tmp_map);
9826 #endif
9827           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9828         }
9829 #ifndef DBUG_OFF
9830         dbug_tmp_restore_column_map(&table->read_set, tmp_map);
9831 #endif
9832       }
9833       str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
9834     }
9835   }
9836   str->length(str->length() - SPIDER_SQL_COMMA_LEN);
9837   DBUG_RETURN(0);
9838 }
9839 
9840 #ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
append_direct_update_set_part()9841 int spider_mbase_handler::append_direct_update_set_part()
9842 {
9843   int error_num;
9844   DBUG_ENTER("spider_mbase_handler::append_direct_update_set_part");
9845   DBUG_PRINT("info",("spider this=%p", this));
9846   error_num = append_direct_update_set(&update_sql);
9847   where_pos = update_sql.length();
9848   DBUG_RETURN(error_num);
9849 }
9850 
append_direct_update_set(spider_string * str)9851 int spider_mbase_handler::append_direct_update_set(
9852   spider_string *str
9853 ) {
9854 #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
9855   uint field_name_length;
9856   SPIDER_SHARE *share = spider->share;
9857 #ifndef DBUG_OFF
9858   TABLE *table = spider->get_table();
9859 #endif
9860 #endif
9861   DBUG_ENTER("spider_mbase_handler::append_direct_update_set");
9862   if (
9863     spider->direct_update_kinds == SPIDER_SQL_KIND_SQL &&
9864     spider->direct_update_fields
9865   ) {
9866     if (str->reserve(SPIDER_SQL_SET_LEN))
9867       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9868     str->q_append(SPIDER_SQL_SET_STR, SPIDER_SQL_SET_LEN);
9869     DBUG_RETURN(spider_db_append_update_columns(spider, str, NULL, 0,
9870       dbton_id, FALSE, NULL));
9871   }
9872 
9873   if (
9874     (spider->direct_update_kinds & SPIDER_SQL_KIND_SQL)
9875   ) {
9876 #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
9877     size_t roop_count;
9878     Field *field;
9879     if (str->reserve(SPIDER_SQL_SET_LEN))
9880       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9881     str->q_append(SPIDER_SQL_SET_STR, SPIDER_SQL_SET_LEN);
9882     for (roop_count = 0; roop_count < spider->hs_pushed_ret_fields_num;
9883       roop_count++)
9884     {
9885       Field *top_table_field =
9886         spider->get_top_table_field(spider->hs_pushed_ret_fields[roop_count]);
9887       if (!(field = spider->field_exchange(top_table_field)))
9888         continue;
9889       field_name_length =
9890         mysql_share->column_name_str[field->field_index].length();
9891       if (top_table_field->is_null())
9892       {
9893         if (str->reserve(field_name_length + /* SPIDER_SQL_NAME_QUOTE_LEN */
9894           2 + SPIDER_SQL_EQUAL_LEN + SPIDER_SQL_NULL_LEN +
9895           SPIDER_SQL_COMMA_LEN))
9896           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9897         mysql_share->append_column_name(str, field->field_index);
9898         str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
9899         str->q_append(SPIDER_SQL_NULL_STR, SPIDER_SQL_NULL_LEN);
9900       } else {
9901         if (str->reserve(field_name_length + /* SPIDER_SQL_NAME_QUOTE_LEN */
9902           2 + SPIDER_SQL_EQUAL_LEN))
9903           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9904         mysql_share->append_column_name(str, field->field_index);
9905         str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
9906 #ifndef DBUG_OFF
9907         my_bitmap_map *tmp_map = dbug_tmp_use_all_columns(table,
9908           table->read_set);
9909 #endif
9910         if (
9911           spider_db_mbase_utility->
9912             append_column_value(spider, str, top_table_field, NULL,
9913               share->access_charset) ||
9914           str->reserve(SPIDER_SQL_COMMA_LEN)
9915         ) {
9916 #ifndef DBUG_OFF
9917           dbug_tmp_restore_column_map(table->read_set, tmp_map);
9918 #endif
9919           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9920         }
9921 #ifndef DBUG_OFF
9922         dbug_tmp_restore_column_map(table->read_set, tmp_map);
9923 #endif
9924       }
9925       str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
9926     }
9927     str->length(str->length() - SPIDER_SQL_COMMA_LEN);
9928 #else
9929     DBUG_ASSERT(0);
9930 #endif
9931   }
9932   DBUG_RETURN(0);
9933 }
9934 
append_dup_update_pushdown_part(const char * alias,uint alias_length)9935 int spider_mbase_handler::append_dup_update_pushdown_part(
9936   const char *alias,
9937   uint alias_length
9938 ) {
9939   int error_num;
9940   DBUG_ENTER("spider_mbase_handler::append_dup_update_pushdown_part");
9941   DBUG_PRINT("info",("spider this=%p", this));
9942   dup_update_sql.length(0);
9943   error_num = append_update_columns(&dup_update_sql, alias, alias_length);
9944   DBUG_RETURN(error_num);
9945 }
9946 
append_update_columns_part(const char * alias,uint alias_length)9947 int spider_mbase_handler::append_update_columns_part(
9948   const char *alias,
9949   uint alias_length
9950 ) {
9951   int error_num;
9952   DBUG_ENTER("spider_mbase_handler::append_update_columns_part");
9953   DBUG_PRINT("info",("spider this=%p", this));
9954   error_num = append_update_columns(&update_sql, alias, alias_length);
9955   DBUG_RETURN(error_num);
9956 }
9957 
check_update_columns_part()9958 int spider_mbase_handler::check_update_columns_part()
9959 {
9960   int error_num;
9961   DBUG_ENTER("spider_mbase_handler::check_update_columns_part");
9962   DBUG_PRINT("info",("spider this=%p", this));
9963   error_num = append_update_columns(NULL, NULL, 0);
9964   DBUG_RETURN(error_num);
9965 }
9966 
append_update_columns(spider_string * str,const char * alias,uint alias_length)9967 int spider_mbase_handler::append_update_columns(
9968   spider_string *str,
9969   const char *alias,
9970   uint alias_length
9971 ) {
9972   int error_num;
9973   DBUG_ENTER("spider_mbase_handler::append_update_columns");
9974   error_num = spider_db_append_update_columns(spider, str,
9975     alias, alias_length, dbton_id, FALSE, NULL);
9976   DBUG_RETURN(error_num);
9977 }
9978 #endif
9979 
append_select_part(ulong sql_type)9980 int spider_mbase_handler::append_select_part(
9981   ulong sql_type
9982 ) {
9983   int error_num;
9984   spider_string *str;
9985   DBUG_ENTER("spider_mbase_handler::append_select_part");
9986   DBUG_PRINT("info",("spider this=%p", this));
9987   switch (sql_type)
9988   {
9989     case SPIDER_SQL_TYPE_SELECT_SQL:
9990       str = &sql;
9991       break;
9992     case SPIDER_SQL_TYPE_HANDLER:
9993       str = &ha_sql;
9994       break;
9995     default:
9996       DBUG_RETURN(0);
9997   }
9998   error_num = append_select(str, sql_type);
9999   DBUG_RETURN(error_num);
10000 }
10001 
append_select(spider_string * str,ulong sql_type)10002 int spider_mbase_handler::append_select(
10003   spider_string *str,
10004   ulong sql_type
10005 ) {
10006   SPIDER_RESULT_LIST *result_list = &spider->result_list;
10007   DBUG_ENTER("spider_mbase_handler::append_select");
10008   if (sql_type == SPIDER_SQL_TYPE_HANDLER)
10009   {
10010     if (str->reserve(SPIDER_SQL_HANDLER_LEN))
10011       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10012     str->q_append(SPIDER_SQL_HANDLER_STR, SPIDER_SQL_HANDLER_LEN);
10013   } else {
10014     if (str->reserve(SPIDER_SQL_SELECT_LEN))
10015       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10016     str->q_append(SPIDER_SQL_SELECT_STR, SPIDER_SQL_SELECT_LEN);
10017     if (result_list->direct_distinct)
10018     {
10019       if (str->reserve(SPIDER_SQL_DISTINCT_LEN))
10020         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10021       str->q_append(SPIDER_SQL_DISTINCT_STR, SPIDER_SQL_DISTINCT_LEN);
10022     }
10023     if (result_list->lock_type != F_WRLCK && spider->lock_mode < 1)
10024     {
10025       /* no lock */
10026 #ifdef SPIDER_SQL_CACHE_IS_IN_LEX
10027       LEX *lex = spider->trx->thd->lex;
10028 #else
10029       st_select_lex *select_lex = &spider->trx->thd->lex->select_lex;
10030 #endif
10031       if (
10032 #ifdef SPIDER_SQL_CACHE_IS_IN_LEX
10033         lex->sql_cache == LEX::SQL_CACHE &&
10034 #else
10035         select_lex->sql_cache == SELECT_LEX::SQL_CACHE &&
10036 #endif
10037         (spider->share->query_cache_sync & 1)
10038       ) {
10039         if (str->reserve(SPIDER_SQL_SQL_CACHE_LEN))
10040           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10041         str->q_append(SPIDER_SQL_SQL_CACHE_STR, SPIDER_SQL_SQL_CACHE_LEN);
10042       } else if (
10043 #ifdef SPIDER_SQL_CACHE_IS_IN_LEX
10044         lex->sql_cache == LEX::SQL_NO_CACHE &&
10045 #else
10046         select_lex->sql_cache == SELECT_LEX::SQL_NO_CACHE &&
10047 #endif
10048         (spider->share->query_cache_sync & 2)
10049       ) {
10050         if (str->reserve(SPIDER_SQL_SQL_NO_CACHE_LEN))
10051           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10052         str->q_append(SPIDER_SQL_SQL_NO_CACHE_STR,
10053           SPIDER_SQL_SQL_NO_CACHE_LEN);
10054       } else if (spider->share->query_cache == 1)
10055       {
10056         if (str->reserve(SPIDER_SQL_SQL_CACHE_LEN))
10057           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10058         str->q_append(SPIDER_SQL_SQL_CACHE_STR, SPIDER_SQL_SQL_CACHE_LEN);
10059       } else if (spider->share->query_cache == 2)
10060       {
10061         if (str->reserve(SPIDER_SQL_SQL_NO_CACHE_LEN))
10062           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10063         str->q_append(SPIDER_SQL_SQL_NO_CACHE_STR,
10064           SPIDER_SQL_SQL_NO_CACHE_LEN);
10065       }
10066     }
10067     if (spider->high_priority)
10068     {
10069       if (str->reserve(SPIDER_SQL_HIGH_PRIORITY_LEN))
10070         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10071       str->q_append(SPIDER_SQL_HIGH_PRIORITY_STR,
10072         SPIDER_SQL_HIGH_PRIORITY_LEN);
10073     }
10074   }
10075   DBUG_RETURN(0);
10076 }
10077 
append_table_select_part(ulong sql_type)10078 int spider_mbase_handler::append_table_select_part(
10079   ulong sql_type
10080 ) {
10081   int error_num;
10082   spider_string *str;
10083   DBUG_ENTER("spider_mbase_handler::append_table_select_part");
10084   DBUG_PRINT("info",("spider this=%p", this));
10085   switch (sql_type)
10086   {
10087     case SPIDER_SQL_TYPE_SELECT_SQL:
10088       str = &sql;
10089       break;
10090     default:
10091       DBUG_RETURN(0);
10092   }
10093   error_num = append_table_select(str);
10094   DBUG_RETURN(error_num);
10095 }
10096 
append_table_select(spider_string * str)10097 int spider_mbase_handler::append_table_select(
10098   spider_string *str
10099 ) {
10100   DBUG_ENTER("spider_mbase_handler::append_table_select");
10101   table_name_pos = str->length() + mysql_share->table_select_pos;
10102   if (str->append(*(mysql_share->table_select)))
10103     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10104   DBUG_RETURN(0);
10105 }
10106 
append_key_select_part(ulong sql_type,uint idx)10107 int spider_mbase_handler::append_key_select_part(
10108   ulong sql_type,
10109   uint idx
10110 ) {
10111   int error_num;
10112   spider_string *str;
10113   DBUG_ENTER("spider_mbase_handler::append_key_select_part");
10114   DBUG_PRINT("info",("spider this=%p", this));
10115   switch (sql_type)
10116   {
10117     case SPIDER_SQL_TYPE_SELECT_SQL:
10118       str = &sql;
10119       break;
10120     default:
10121       DBUG_RETURN(0);
10122   }
10123   error_num = append_key_select(str, idx);
10124   DBUG_RETURN(error_num);
10125 }
10126 
append_key_select(spider_string * str,uint idx)10127 int spider_mbase_handler::append_key_select(
10128   spider_string *str,
10129   uint idx
10130 ) {
10131   DBUG_ENTER("spider_mbase_handler::append_key_select");
10132   table_name_pos = str->length() + mysql_share->key_select_pos[idx];
10133   if (str->append(mysql_share->key_select[idx]))
10134     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10135   DBUG_RETURN(0);
10136 }
10137 
append_minimum_select_part(ulong sql_type)10138 int spider_mbase_handler::append_minimum_select_part(
10139   ulong sql_type
10140 ) {
10141   int error_num;
10142   spider_string *str;
10143   DBUG_ENTER("spider_mbase_handler::append_minimum_select_part");
10144   DBUG_PRINT("info",("spider this=%p", this));
10145   switch (sql_type)
10146   {
10147     case SPIDER_SQL_TYPE_SELECT_SQL:
10148       str = &sql;
10149       break;
10150     default:
10151       DBUG_RETURN(0);
10152   }
10153   error_num = append_minimum_select(str, sql_type);
10154   DBUG_RETURN(error_num);
10155 }
10156 
append_minimum_select(spider_string * str,ulong sql_type)10157 int spider_mbase_handler::append_minimum_select(
10158   spider_string *str,
10159   ulong sql_type
10160 ) {
10161   TABLE *table = spider->get_table();
10162   Field **field;
10163   int field_length;
10164   bool appended = FALSE;
10165   DBUG_ENTER("spider_mbase_handler::append_minimum_select");
10166   minimum_select_bitmap_create();
10167   for (field = table->field; *field; field++)
10168   {
10169     if (minimum_select_bit_is_set((*field)->field_index))
10170     {
10171 /*
10172       spider_set_bit(minimum_select_bitmap, (*field)->field_index);
10173 */
10174       field_length =
10175         mysql_share->column_name_str[(*field)->field_index].length();
10176       if (str->reserve(field_length +
10177         /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
10178         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10179       mysql_share->append_column_name(str, (*field)->field_index);
10180       str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
10181       appended = TRUE;
10182     }
10183   }
10184   if (appended)
10185     str->length(str->length() - SPIDER_SQL_COMMA_LEN);
10186   else {
10187     if (str->reserve(SPIDER_SQL_ONE_LEN))
10188         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10189     str->q_append(SPIDER_SQL_ONE_STR, SPIDER_SQL_ONE_LEN);
10190   }
10191   DBUG_RETURN(append_from(str, sql_type, first_link_idx));
10192 }
10193 
append_table_select_with_alias(spider_string * str,const char * alias,uint alias_length)10194 int spider_mbase_handler::append_table_select_with_alias(
10195   spider_string *str,
10196   const char *alias,
10197   uint alias_length
10198 ) {
10199   TABLE *table = spider->get_table();
10200   Field **field;
10201   int field_length;
10202   DBUG_ENTER("spider_mbase_handler::append_table_select_with_alias");
10203   for (field = table->field; *field; field++)
10204   {
10205     field_length =
10206       mysql_share->column_name_str[(*field)->field_index].length();
10207     if (str->reserve(alias_length + field_length +
10208       /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
10209       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10210     str->q_append(alias, alias_length);
10211     mysql_share->append_column_name(str, (*field)->field_index);
10212     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
10213   }
10214   str->length(str->length() - SPIDER_SQL_COMMA_LEN);
10215   DBUG_RETURN(0);
10216 }
10217 
append_key_select_with_alias(spider_string * str,const KEY * key_info,const char * alias,uint alias_length)10218 int spider_mbase_handler::append_key_select_with_alias(
10219   spider_string *str,
10220   const KEY *key_info,
10221   const char *alias,
10222   uint alias_length
10223 ) {
10224   KEY_PART_INFO *key_part;
10225   Field *field;
10226   uint part_num;
10227   int field_length;
10228   DBUG_ENTER("spider_mbase_handler::append_key_select_with_alias");
10229   for (key_part = key_info->key_part, part_num = 0;
10230     part_num < spider_user_defined_key_parts(key_info); key_part++, part_num++)
10231   {
10232     field = key_part->field;
10233     field_length = mysql_share->column_name_str[field->field_index].length();
10234     if (str->reserve(alias_length + field_length +
10235       /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
10236       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10237     str->q_append(alias, alias_length);
10238     mysql_share->append_column_name(str, field->field_index);
10239     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
10240   }
10241   str->length(str->length() - SPIDER_SQL_COMMA_LEN);
10242   DBUG_RETURN(0);
10243 }
10244 
append_minimum_select_with_alias(spider_string * str,const char * alias,uint alias_length)10245 int spider_mbase_handler::append_minimum_select_with_alias(
10246   spider_string *str,
10247   const char *alias,
10248   uint alias_length
10249 ) {
10250   TABLE *table = spider->get_table();
10251   Field **field;
10252   int field_length;
10253   bool appended = FALSE;
10254   DBUG_ENTER("spider_mbase_handler::append_minimum_select_with_alias");
10255   minimum_select_bitmap_create();
10256   for (field = table->field; *field; field++)
10257   {
10258     if (minimum_select_bit_is_set((*field)->field_index))
10259     {
10260 /*
10261       spider_set_bit(minimum_select_bitmap, (*field)->field_index);
10262 */
10263       field_length =
10264         mysql_share->column_name_str[(*field)->field_index].length();
10265       if (str->reserve(alias_length + field_length +
10266         /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
10267         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10268       str->q_append(alias, alias_length);
10269       mysql_share->append_column_name(str, (*field)->field_index);
10270       str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
10271       appended = TRUE;
10272     }
10273   }
10274   if (appended)
10275     str->length(str->length() - SPIDER_SQL_COMMA_LEN);
10276   else {
10277     if (str->reserve(SPIDER_SQL_ONE_LEN))
10278       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10279     str->q_append(SPIDER_SQL_ONE_STR, SPIDER_SQL_ONE_LEN);
10280   }
10281   DBUG_RETURN(0);
10282 }
10283 
append_select_columns_with_alias(spider_string * str,const char * alias,uint alias_length)10284 int spider_mbase_handler::append_select_columns_with_alias(
10285   spider_string *str,
10286   const char *alias,
10287   uint alias_length
10288 ) {
10289   int error_num;
10290   SPIDER_RESULT_LIST *result_list = &spider->result_list;
10291   DBUG_ENTER("spider_mbase_handler::append_select_columns_with_alias");
10292 #ifdef HANDLER_HAS_DIRECT_AGGREGATE
10293   if (
10294     result_list->direct_aggregate &&
10295     (error_num = append_sum_select(str, alias, alias_length))
10296   )
10297     DBUG_RETURN(error_num);
10298 #endif
10299   if ((error_num = append_match_select(str, alias, alias_length)))
10300     DBUG_RETURN(error_num);
10301   if (!spider->select_column_mode)
10302   {
10303     if (result_list->keyread)
10304       DBUG_RETURN(append_key_select_with_alias(
10305         str, result_list->key_info, alias, alias_length));
10306     else
10307       DBUG_RETURN(append_table_select_with_alias(
10308         str, alias, alias_length));
10309   }
10310   DBUG_RETURN(append_minimum_select_with_alias(str, alias, alias_length));
10311 }
10312 
append_hint_after_table_part(ulong sql_type)10313 int spider_mbase_handler::append_hint_after_table_part(
10314   ulong sql_type
10315 ) {
10316   int error_num;
10317   spider_string *str;
10318   DBUG_ENTER("spider_mbase_handler::append_hint_after_table_part");
10319   DBUG_PRINT("info",("spider this=%p", this));
10320   switch (sql_type)
10321   {
10322     case SPIDER_SQL_TYPE_SELECT_SQL:
10323     case SPIDER_SQL_TYPE_TMP_SQL:
10324       str = &sql;
10325       break;
10326     case SPIDER_SQL_TYPE_INSERT_SQL:
10327     case SPIDER_SQL_TYPE_UPDATE_SQL:
10328     case SPIDER_SQL_TYPE_DELETE_SQL:
10329     case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
10330       str = &update_sql;
10331       break;
10332     case SPIDER_SQL_TYPE_HANDLER:
10333       str = &ha_sql;
10334       break;
10335     default:
10336       DBUG_RETURN(0);
10337   }
10338   error_num = append_hint_after_table(str);
10339   DBUG_RETURN(error_num);
10340 }
10341 
append_hint_after_table(spider_string * str)10342 int spider_mbase_handler::append_hint_after_table(
10343   spider_string *str
10344 ) {
10345   int error_num;
10346   DBUG_ENTER("spider_mbase_handler::append_hint_after_table");
10347   DBUG_PRINT("info",("spider this=%p", this));
10348   if (
10349     mysql_share->key_hint &&
10350     (error_num = spider_db_append_hint_after_table(spider,
10351       str, &mysql_share->key_hint[spider->active_index]))
10352   )
10353     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10354   DBUG_RETURN(0);
10355 }
10356 
set_where_pos(ulong sql_type)10357 void spider_mbase_handler::set_where_pos(
10358   ulong sql_type
10359 ) {
10360   DBUG_ENTER("spider_mbase_handler::set_where_pos");
10361   switch (sql_type)
10362   {
10363     case SPIDER_SQL_TYPE_SELECT_SQL:
10364     case SPIDER_SQL_TYPE_TMP_SQL:
10365       where_pos = sql.length();
10366       break;
10367     case SPIDER_SQL_TYPE_INSERT_SQL:
10368     case SPIDER_SQL_TYPE_UPDATE_SQL:
10369     case SPIDER_SQL_TYPE_DELETE_SQL:
10370     case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
10371       where_pos = update_sql.length();
10372       break;
10373     case SPIDER_SQL_TYPE_HANDLER:
10374       ha_read_pos = ha_sql.length();
10375       break;
10376     default:
10377       break;
10378   }
10379   DBUG_VOID_RETURN;
10380 }
10381 
set_where_to_pos(ulong sql_type)10382 void spider_mbase_handler::set_where_to_pos(
10383   ulong sql_type
10384 ) {
10385   DBUG_ENTER("spider_mbase_handler::set_where_to_pos");
10386   switch (sql_type)
10387   {
10388     case SPIDER_SQL_TYPE_SELECT_SQL:
10389     case SPIDER_SQL_TYPE_TMP_SQL:
10390       sql.length(where_pos);
10391       break;
10392     case SPIDER_SQL_TYPE_INSERT_SQL:
10393     case SPIDER_SQL_TYPE_UPDATE_SQL:
10394     case SPIDER_SQL_TYPE_DELETE_SQL:
10395     case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
10396       update_sql.length(where_pos);
10397       break;
10398     case SPIDER_SQL_TYPE_HANDLER:
10399       ha_sql.length(ha_read_pos);
10400       break;
10401     default:
10402       break;
10403   }
10404   DBUG_VOID_RETURN;
10405 }
10406 
check_item_type(Item * item)10407 int spider_mbase_handler::check_item_type(
10408   Item *item
10409 ) {
10410   int error_num;
10411   DBUG_ENTER("spider_mbase_handler::check_item_type");
10412   DBUG_PRINT("info",("spider this=%p", this));
10413   error_num = spider_db_print_item_type(item, NULL, spider, NULL, NULL, 0,
10414     dbton_id, FALSE, NULL);
10415   DBUG_RETURN(error_num);
10416 }
10417 
append_values_connector_part(ulong sql_type)10418 int spider_mbase_handler::append_values_connector_part(
10419   ulong sql_type
10420 ) {
10421   int error_num;
10422   spider_string *str;
10423   DBUG_ENTER("spider_mbase_handler::append_values_connector_part");
10424   DBUG_PRINT("info",("spider this=%p", this));
10425   switch (sql_type)
10426   {
10427     case SPIDER_SQL_TYPE_SELECT_SQL:
10428       str = &sql;
10429       break;
10430     case SPIDER_SQL_TYPE_TMP_SQL:
10431       str = &tmp_sql;
10432       break;
10433     default:
10434       DBUG_RETURN(0);
10435   }
10436   error_num = append_values_connector(str);
10437   DBUG_RETURN(error_num);
10438 }
10439 
append_values_connector(spider_string * str)10440 int spider_mbase_handler::append_values_connector(
10441   spider_string *str
10442 ) {
10443   DBUG_ENTER("spider_mbase_handler::append_values_connector");
10444   DBUG_PRINT("info",("spider this=%p", this));
10445   if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN +
10446     SPIDER_SQL_COMMA_LEN + SPIDER_SQL_OPEN_PAREN_LEN))
10447     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10448   str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
10449   str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
10450   str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
10451   DBUG_RETURN(0);
10452 }
10453 
append_values_terminator_part(ulong sql_type)10454 int spider_mbase_handler::append_values_terminator_part(
10455   ulong sql_type
10456 ) {
10457   int error_num;
10458   spider_string *str;
10459   DBUG_ENTER("spider_mbase_handler::append_values_terminator_part");
10460   DBUG_PRINT("info",("spider this=%p", this));
10461   switch (sql_type)
10462   {
10463     case SPIDER_SQL_TYPE_SELECT_SQL:
10464       str = &sql;
10465       break;
10466     case SPIDER_SQL_TYPE_TMP_SQL:
10467       str = &tmp_sql;
10468       break;
10469     default:
10470       DBUG_RETURN(0);
10471   }
10472   error_num = append_values_terminator(str);
10473   DBUG_RETURN(error_num);
10474 }
10475 
append_values_terminator(spider_string * str)10476 int spider_mbase_handler::append_values_terminator(
10477   spider_string *str
10478 ) {
10479   DBUG_ENTER("spider_mbase_handler::append_values_terminator");
10480   DBUG_PRINT("info",("spider this=%p", this));
10481   str->length(str->length() -
10482     SPIDER_SQL_COMMA_LEN - SPIDER_SQL_OPEN_PAREN_LEN);
10483   DBUG_RETURN(0);
10484 }
10485 
append_union_table_connector_part(ulong sql_type)10486 int spider_mbase_handler::append_union_table_connector_part(
10487   ulong sql_type
10488 ) {
10489   int error_num;
10490   spider_string *str;
10491   DBUG_ENTER("spider_mbase_handler::append_union_table_connector_part");
10492   DBUG_PRINT("info",("spider this=%p", this));
10493   switch (sql_type)
10494   {
10495     case SPIDER_SQL_TYPE_SELECT_SQL:
10496       str = &sql;
10497       break;
10498     case SPIDER_SQL_TYPE_TMP_SQL:
10499       str = &tmp_sql;
10500       break;
10501     default:
10502       DBUG_RETURN(0);
10503   }
10504   error_num = append_union_table_connector(str);
10505   DBUG_RETURN(error_num);
10506 }
10507 
append_union_table_connector(spider_string * str)10508 int spider_mbase_handler::append_union_table_connector(
10509   spider_string *str
10510 ) {
10511   DBUG_ENTER("spider_mbase_handler::append_union_table_connector");
10512   DBUG_PRINT("info",("spider this=%p", this));
10513   if (str->reserve((SPIDER_SQL_SPACE_LEN * 2) + SPIDER_SQL_UNION_ALL_LEN))
10514     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10515   str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
10516   str->q_append(SPIDER_SQL_UNION_ALL_STR, SPIDER_SQL_UNION_ALL_LEN);
10517   str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
10518   DBUG_RETURN(0);
10519 }
10520 
append_union_table_terminator_part(ulong sql_type)10521 int spider_mbase_handler::append_union_table_terminator_part(
10522   ulong sql_type
10523 ) {
10524   int error_num;
10525   spider_string *str;
10526   DBUG_ENTER("spider_mbase_handler::append_union_table_terminator_part");
10527   DBUG_PRINT("info",("spider this=%p", this));
10528   switch (sql_type)
10529   {
10530     case SPIDER_SQL_TYPE_SELECT_SQL:
10531       str = &sql;
10532       break;
10533     default:
10534       DBUG_RETURN(0);
10535   }
10536   error_num = append_union_table_terminator(str);
10537   DBUG_RETURN(error_num);
10538 }
10539 
append_union_table_terminator(spider_string * str)10540 int spider_mbase_handler::append_union_table_terminator(
10541   spider_string *str
10542 ) {
10543   DBUG_ENTER("spider_mbase_handler::append_union_table_terminator");
10544   DBUG_PRINT("info",("spider this=%p", this));
10545   str->length(str->length() -
10546     ((SPIDER_SQL_SPACE_LEN * 2) + SPIDER_SQL_UNION_ALL_LEN));
10547   str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
10548   str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
10549   table_name_pos = str->length() + SPIDER_SQL_SPACE_LEN + SPIDER_SQL_A_LEN +
10550     SPIDER_SQL_COMMA_LEN;
10551   if (str->reserve(tmp_sql.length() - SPIDER_SQL_FROM_LEN))
10552     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10553   str->q_append(tmp_sql.ptr() + SPIDER_SQL_FROM_LEN,
10554     tmp_sql.length() - SPIDER_SQL_FROM_LEN);
10555   DBUG_RETURN(0);
10556 }
10557 
append_key_column_values_part(const key_range * start_key,ulong sql_type)10558 int spider_mbase_handler::append_key_column_values_part(
10559   const key_range *start_key,
10560   ulong sql_type
10561 ) {
10562   int error_num;
10563   spider_string *str;
10564   DBUG_ENTER("spider_mbase_handler::append_key_column_values_part");
10565   switch (sql_type)
10566   {
10567     case SPIDER_SQL_TYPE_SELECT_SQL:
10568       str = &sql;
10569       break;
10570     case SPIDER_SQL_TYPE_TMP_SQL:
10571       str = &tmp_sql;
10572       break;
10573     default:
10574       DBUG_RETURN(0);
10575   }
10576   error_num = append_key_column_values(str, start_key);
10577   DBUG_RETURN(error_num);
10578 }
10579 
append_key_column_values(spider_string * str,const key_range * start_key)10580 int spider_mbase_handler::append_key_column_values(
10581   spider_string *str,
10582   const key_range *start_key
10583 ) {
10584   int error_num;
10585   const uchar *ptr;
10586   SPIDER_RESULT_LIST *result_list = &spider->result_list;
10587   SPIDER_SHARE *share = spider->share;
10588   KEY *key_info = result_list->key_info;
10589   uint length;
10590   uint store_length;
10591   key_part_map full_key_part_map =
10592     make_prev_keypart_map(spider_user_defined_key_parts(key_info));
10593   key_part_map start_key_part_map;
10594   KEY_PART_INFO *key_part;
10595   Field *field;
10596   DBUG_ENTER("spider_mbase_handler::append_key_column_values");
10597   start_key_part_map = start_key->keypart_map & full_key_part_map;
10598   DBUG_PRINT("info", ("spider spider_user_defined_key_parts=%u",
10599     spider_user_defined_key_parts(key_info)));
10600   DBUG_PRINT("info", ("spider full_key_part_map=%lu", full_key_part_map));
10601   DBUG_PRINT("info", ("spider start_key_part_map=%lu", start_key_part_map));
10602 
10603   if (!start_key_part_map)
10604     DBUG_RETURN(0);
10605 
10606   for (
10607     key_part = key_info->key_part,
10608     length = 0;
10609     start_key_part_map;
10610     start_key_part_map >>= 1,
10611     key_part++,
10612     length += store_length
10613   ) {
10614     store_length = key_part->store_length;
10615     ptr = start_key->key + length;
10616     field = key_part->field;
10617     if ((error_num = spider_db_append_null_value(str, key_part, &ptr)))
10618     {
10619       if (error_num > 0)
10620         DBUG_RETURN(error_num);
10621     } else {
10622       if (spider_db_mbase_utility->append_column_value(spider, str, field, ptr,
10623         share->access_charset))
10624         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10625     }
10626 
10627     if (str->reserve(SPIDER_SQL_COMMA_LEN))
10628       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10629     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
10630   }
10631   str->length(str->length() - SPIDER_SQL_COMMA_LEN);
10632   DBUG_RETURN(0);
10633 }
10634 
append_key_column_values_with_name_part(const key_range * start_key,ulong sql_type)10635 int spider_mbase_handler::append_key_column_values_with_name_part(
10636   const key_range *start_key,
10637   ulong sql_type
10638 ) {
10639   int error_num;
10640   spider_string *str;
10641   DBUG_ENTER("spider_mbase_handler::append_key_column_values_with_name_part");
10642   switch (sql_type)
10643   {
10644     case SPIDER_SQL_TYPE_SELECT_SQL:
10645       str = &sql;
10646       break;
10647     case SPIDER_SQL_TYPE_TMP_SQL:
10648       str = &tmp_sql;
10649       break;
10650     default:
10651       DBUG_RETURN(0);
10652   }
10653   error_num = append_key_column_values_with_name(str, start_key);
10654   DBUG_RETURN(error_num);
10655 }
10656 
append_key_column_values_with_name(spider_string * str,const key_range * start_key)10657 int spider_mbase_handler::append_key_column_values_with_name(
10658   spider_string *str,
10659   const key_range *start_key
10660 ) {
10661   int error_num;
10662   const uchar *ptr;
10663   SPIDER_RESULT_LIST *result_list = &spider->result_list;
10664   SPIDER_SHARE *share = spider->share;
10665   KEY *key_info = result_list->key_info;
10666   uint length;
10667   uint key_name_length, key_count;
10668   uint store_length;
10669   key_part_map full_key_part_map =
10670     make_prev_keypart_map(spider_user_defined_key_parts(key_info));
10671   key_part_map start_key_part_map;
10672   KEY_PART_INFO *key_part;
10673   Field *field;
10674   char tmp_buf[MAX_FIELD_WIDTH];
10675   DBUG_ENTER("spider_mbase_handler::append_key_column_values_with_name");
10676   start_key_part_map = start_key->keypart_map & full_key_part_map;
10677   DBUG_PRINT("info", ("spider spider_user_defined_key_parts=%u",
10678     spider_user_defined_key_parts(key_info)));
10679   DBUG_PRINT("info", ("spider full_key_part_map=%lu", full_key_part_map));
10680   DBUG_PRINT("info", ("spider start_key_part_map=%lu", start_key_part_map));
10681 
10682   if (!start_key_part_map)
10683     DBUG_RETURN(0);
10684 
10685   for (
10686     key_part = key_info->key_part,
10687     length = 0,
10688     key_count = 0;
10689     start_key_part_map;
10690     start_key_part_map >>= 1,
10691     key_part++,
10692     length += store_length,
10693     key_count++
10694   ) {
10695     store_length = key_part->store_length;
10696     ptr = start_key->key + length;
10697     field = key_part->field;
10698     if ((error_num = spider_db_append_null_value(str, key_part, &ptr)))
10699     {
10700       if (error_num > 0)
10701         DBUG_RETURN(error_num);
10702     } else {
10703       if (spider_db_mbase_utility->append_column_value(spider, str, field, ptr,
10704         share->access_charset))
10705         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10706     }
10707 
10708     key_name_length = my_sprintf(tmp_buf, (tmp_buf, "c%u", key_count));
10709     if (str->reserve(SPIDER_SQL_SPACE_LEN + key_name_length +
10710       SPIDER_SQL_COMMA_LEN))
10711       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10712     str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
10713     str->q_append(tmp_buf, key_name_length);
10714     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
10715   }
10716   str->length(str->length() - SPIDER_SQL_COMMA_LEN);
10717   DBUG_RETURN(0);
10718 }
10719 
append_key_where_part(const key_range * start_key,const key_range * end_key,ulong sql_type)10720 int spider_mbase_handler::append_key_where_part(
10721   const key_range *start_key,
10722   const key_range *end_key,
10723   ulong sql_type
10724 ) {
10725   int error_num;
10726   spider_string *str, *str_part = NULL, *str_part2 = NULL;
10727   bool set_order;
10728   DBUG_ENTER("spider_mbase_handler::append_key_where_part");
10729   switch (sql_type)
10730   {
10731     case SPIDER_SQL_TYPE_SELECT_SQL:
10732       str = &sql;
10733       set_order = FALSE;
10734       break;
10735     case SPIDER_SQL_TYPE_TMP_SQL:
10736       str = &tmp_sql;
10737       set_order = FALSE;
10738       break;
10739     case SPIDER_SQL_TYPE_INSERT_SQL:
10740     case SPIDER_SQL_TYPE_UPDATE_SQL:
10741     case SPIDER_SQL_TYPE_DELETE_SQL:
10742     case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
10743       str = &update_sql;
10744       set_order = FALSE;
10745       break;
10746     case SPIDER_SQL_TYPE_HANDLER:
10747       str = &ha_sql;
10748       ha_read_pos = str->length();
10749       str_part = &sql_part;
10750       str_part2 = &sql_part2;
10751       str_part->length(0);
10752       str_part2->length(0);
10753       set_order = TRUE;
10754       break;
10755     default:
10756       DBUG_RETURN(0);
10757   }
10758   error_num = append_key_where(str, str_part, str_part2, start_key, end_key,
10759     sql_type, set_order);
10760   DBUG_RETURN(error_num);
10761 }
10762 
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)10763 int spider_mbase_handler::append_key_where(
10764   spider_string *str,
10765   spider_string *str_part,
10766   spider_string *str_part2,
10767   const key_range *start_key,
10768   const key_range *end_key,
10769   ulong sql_type,
10770   bool set_order
10771 ) {
10772   int error_num;
10773   DBUG_ENTER("spider_mbase_handler::append_key_where");
10774   error_num = spider_db_append_key_where_internal(str, str_part, str_part2,
10775     start_key, end_key, spider, set_order, sql_type,
10776     dbton_id);
10777   DBUG_RETURN(error_num);
10778 }
10779 
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)10780 int spider_mbase_handler::append_is_null_part(
10781   ulong sql_type,
10782   KEY_PART_INFO *key_part,
10783   const key_range *key,
10784   const uchar **ptr,
10785   bool key_eq,
10786   bool tgt_final
10787 ) {
10788   int error_num;
10789   spider_string *str, *str_part = NULL, *str_part2 = NULL;
10790   DBUG_ENTER("spider_mbase_handler::append_is_null_part");
10791   DBUG_PRINT("info",("spider this=%p", this));
10792   switch (sql_type)
10793   {
10794     case SPIDER_SQL_TYPE_SELECT_SQL:
10795     case SPIDER_SQL_TYPE_TMP_SQL:
10796       str = &sql;
10797       break;
10798     case SPIDER_SQL_TYPE_INSERT_SQL:
10799     case SPIDER_SQL_TYPE_UPDATE_SQL:
10800     case SPIDER_SQL_TYPE_DELETE_SQL:
10801     case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
10802       str = &update_sql;
10803       break;
10804     case SPIDER_SQL_TYPE_HANDLER:
10805       str = &ha_sql;
10806       str_part = &sql_part;
10807       str_part2 = &sql_part2;
10808       break;
10809     default:
10810       DBUG_RETURN(0);
10811   }
10812   error_num = append_is_null(sql_type, str, str_part, str_part2,
10813     key_part, key, ptr, key_eq, tgt_final);
10814   DBUG_RETURN(error_num);
10815 }
10816 
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)10817 int spider_mbase_handler::append_is_null(
10818   ulong sql_type,
10819   spider_string *str,
10820   spider_string *str_part,
10821   spider_string *str_part2,
10822   KEY_PART_INFO *key_part,
10823   const key_range *key,
10824   const uchar **ptr,
10825   bool key_eq,
10826   bool tgt_final
10827 ) {
10828   DBUG_ENTER("spider_mbase_handler::append_is_null");
10829   DBUG_PRINT("info",("spider this=%p", this));
10830   DBUG_PRINT("info",("spider key_eq=%s", key_eq ? "TRUE" : "FALSE"));
10831   if (key_part->null_bit)
10832   {
10833     if (*(*ptr)++)
10834     {
10835       if (sql_type == SPIDER_SQL_TYPE_HANDLER)
10836       {
10837         if (
10838           key_eq ||
10839           key->flag == HA_READ_KEY_EXACT ||
10840           key->flag == HA_READ_KEY_OR_NEXT
10841         ) {
10842 #ifdef SPIDER_HANDLER_SUPPORT_MULTIPLE_KEY_PARTS
10843           if (tgt_final)
10844           {
10845             if (str->reserve(SPIDER_SQL_EQUAL_LEN))
10846               DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10847             str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
10848           }
10849           str = str_part;
10850           if (str->reserve(SPIDER_SQL_NULL_LEN))
10851             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10852           str->q_append(SPIDER_SQL_NULL_STR, SPIDER_SQL_NULL_LEN);
10853 #else
10854           if (str_part->length() == SPIDER_SQL_OPEN_PAREN_LEN)
10855           {
10856             if (str->reserve(SPIDER_SQL_EQUAL_LEN))
10857               DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10858             str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
10859             str = str_part;
10860             if (str->reserve(SPIDER_SQL_NULL_LEN))
10861               DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10862             str->q_append(SPIDER_SQL_NULL_STR, SPIDER_SQL_NULL_LEN);
10863           }
10864 #endif
10865         } else {
10866 #ifdef SPIDER_HANDLER_SUPPORT_MULTIPLE_KEY_PARTS
10867           if (str_part->length() == SPIDER_SQL_OPEN_PAREN_LEN)
10868           {
10869             str = str_part;
10870             str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
10871             ha_next_pos = str->length();
10872             if (str->reserve(SPIDER_SQL_FIRST_LEN))
10873               DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10874             str->q_append(SPIDER_SQL_FIRST_STR, SPIDER_SQL_FIRST_LEN);
10875             spider->result_list.ha_read_kind = 1;
10876           } else if (tgt_final)
10877           {
10878             if (str->reserve(SPIDER_SQL_GT_LEN))
10879               DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10880             str->q_append(SPIDER_SQL_GT_STR, SPIDER_SQL_GT_LEN);
10881             str = str_part;
10882             if (str->reserve(SPIDER_SQL_NULL_LEN))
10883               DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10884             str->q_append(SPIDER_SQL_NULL_STR, SPIDER_SQL_NULL_LEN);
10885           }
10886 #else
10887           if (str_part->length() == SPIDER_SQL_OPEN_PAREN_LEN)
10888           {
10889             str = str_part;
10890             /* first index column */
10891             str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
10892             ha_next_pos = str->length();
10893             if (str->reserve(SPIDER_SQL_FIRST_LEN))
10894               DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10895             str->q_append(SPIDER_SQL_FIRST_STR, SPIDER_SQL_FIRST_LEN);
10896             spider->result_list.ha_read_kind = 1;
10897           }
10898 #endif
10899         }
10900         str = str_part2;
10901       }
10902       if (
10903         key_eq ||
10904         key->flag == HA_READ_KEY_EXACT ||
10905         key->flag == HA_READ_KEY_OR_NEXT
10906       ) {
10907         if (str->reserve(SPIDER_SQL_IS_NULL_LEN +
10908           /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
10909           mysql_share->column_name_str[key_part->field->field_index].length()))
10910           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10911         mysql_share->append_column_name(str, key_part->field->field_index);
10912         str->q_append(SPIDER_SQL_IS_NULL_STR, SPIDER_SQL_IS_NULL_LEN);
10913       } else {
10914         if (str->reserve(SPIDER_SQL_IS_NOT_NULL_LEN +
10915           /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
10916           mysql_share->column_name_str[key_part->field->field_index].length()))
10917           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10918         mysql_share->append_column_name(str, key_part->field->field_index);
10919         str->q_append(SPIDER_SQL_IS_NOT_NULL_STR, SPIDER_SQL_IS_NOT_NULL_LEN);
10920       }
10921       DBUG_RETURN(-1);
10922     }
10923   }
10924   DBUG_RETURN(0);
10925 }
10926 
append_where_terminator_part(ulong sql_type,bool set_order,int key_count)10927 int spider_mbase_handler::append_where_terminator_part(
10928   ulong sql_type,
10929   bool set_order,
10930   int key_count
10931 ) {
10932   int error_num;
10933   spider_string *str, *str_part = NULL, *str_part2 = NULL;
10934   DBUG_ENTER("spider_mbase_handler::append_where_terminator_part");
10935   DBUG_PRINT("info",("spider this=%p", this));
10936   switch (sql_type)
10937   {
10938     case SPIDER_SQL_TYPE_SELECT_SQL:
10939     case SPIDER_SQL_TYPE_TMP_SQL:
10940       str = &sql;
10941       break;
10942     case SPIDER_SQL_TYPE_INSERT_SQL:
10943     case SPIDER_SQL_TYPE_UPDATE_SQL:
10944     case SPIDER_SQL_TYPE_DELETE_SQL:
10945     case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
10946       str = &update_sql;
10947       break;
10948     case SPIDER_SQL_TYPE_HANDLER:
10949       str = &ha_sql;
10950       str_part = &sql_part;
10951       str_part2 = &sql_part2;
10952       break;
10953     default:
10954       DBUG_RETURN(0);
10955   }
10956   error_num = append_where_terminator(sql_type, str, str_part, str_part2,
10957     set_order, key_count);
10958   DBUG_RETURN(error_num);
10959 }
10960 
append_where_terminator(ulong sql_type,spider_string * str,spider_string * str_part,spider_string * str_part2,bool set_order,int key_count)10961 int spider_mbase_handler::append_where_terminator(
10962   ulong sql_type,
10963   spider_string *str,
10964   spider_string *str_part,
10965   spider_string *str_part2,
10966   bool set_order,
10967   int key_count
10968 ) {
10969   SPIDER_RESULT_LIST *result_list = &spider->result_list;
10970   DBUG_ENTER("spider_mbase_handler::append_where_terminator");
10971   DBUG_PRINT("info",("spider this=%p", this));
10972   if (sql_type != SPIDER_SQL_TYPE_HANDLER)
10973   {
10974     str->length(str->length() - SPIDER_SQL_AND_LEN);
10975     if (!set_order)
10976       result_list->key_order = key_count;
10977   } else {
10978     str_part2->length(str_part2->length() - SPIDER_SQL_AND_LEN);
10979 
10980 #ifdef SPIDER_HANDLER_SUPPORT_MULTIPLE_KEY_PARTS
10981     str_part->length(str_part->length() - SPIDER_SQL_COMMA_LEN);
10982 #endif
10983     if (!result_list->ha_read_kind)
10984       str_part->q_append(SPIDER_SQL_CLOSE_PAREN_STR,
10985         SPIDER_SQL_CLOSE_PAREN_LEN);
10986     if (str->append(*str_part))
10987       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10988     uint clause_length = str->length() - ha_next_pos;
10989     if (clause_length < SPIDER_SQL_NEXT_LEN)
10990     {
10991       int roop_count;
10992       clause_length = SPIDER_SQL_NEXT_LEN - clause_length;
10993       if (str->reserve(clause_length))
10994         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10995       for (roop_count = 0; roop_count < (int) clause_length; roop_count++)
10996         str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
10997     }
10998   }
10999   DBUG_RETURN(0);
11000 }
11001 
append_match_where_part(ulong sql_type)11002 int spider_mbase_handler::append_match_where_part(
11003   ulong sql_type
11004 ) {
11005   int error_num;
11006   spider_string *str;
11007   DBUG_ENTER("spider_mbase_handler::append_match_where_part");
11008   switch (sql_type)
11009   {
11010     case SPIDER_SQL_TYPE_SELECT_SQL:
11011       str = &sql;
11012       break;
11013     default:
11014       DBUG_ASSERT(0);
11015       DBUG_RETURN(0);
11016   }
11017   error_num = append_match_where(str);
11018   DBUG_RETURN(error_num);
11019 }
11020 
append_match_where(spider_string * str)11021 int spider_mbase_handler::append_match_where(
11022   spider_string *str
11023 ) {
11024   int error_num;
11025   bool first = TRUE;
11026   st_spider_ft_info *ft_info = spider->ft_first;
11027   DBUG_ENTER("spider_mbase_handler::append_match_where");
11028   if (spider->ft_current)
11029   {
11030     while (TRUE)
11031     {
11032       if (ft_info->used_in_where)
11033       {
11034         if (first)
11035         {
11036           if (str->reserve(SPIDER_SQL_WHERE_LEN))
11037             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11038           str->q_append(SPIDER_SQL_WHERE_STR, SPIDER_SQL_WHERE_LEN);
11039           first = FALSE;
11040         }
11041         if ((error_num = append_match_against(str, ft_info, NULL, 0)))
11042           DBUG_RETURN(error_num);
11043         if (str->reserve(SPIDER_SQL_AND_LEN))
11044           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11045         str->q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN);
11046       }
11047 
11048       if (ft_info == spider->ft_current)
11049         break;
11050       ft_info = ft_info->next;
11051     }
11052     if (!first)
11053       str->length(str->length() - SPIDER_SQL_AND_LEN);
11054   }
11055   DBUG_RETURN(0);
11056 }
11057 
append_update_where(spider_string * str,const TABLE * table,my_ptrdiff_t ptr_diff)11058 int spider_mbase_handler::append_update_where(
11059   spider_string *str,
11060   const TABLE *table,
11061   my_ptrdiff_t ptr_diff
11062 ) {
11063   uint field_name_length;
11064   Field **field;
11065   THD *thd = spider->trx->thd;
11066   SPIDER_SHARE *share = spider->share;
11067   bool no_pk = (table->s->primary_key == MAX_KEY);
11068   DBUG_ENTER("spider_mbase_handler::append_update_where");
11069   DBUG_PRINT("info", ("spider table->s->primary_key=%s",
11070     table->s->primary_key != MAX_KEY ? "TRUE" : "FALSE"));
11071   uint str_len_bakup = str->length();
11072   if (str->reserve(SPIDER_SQL_WHERE_LEN))
11073     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11074   str->q_append(SPIDER_SQL_WHERE_STR, SPIDER_SQL_WHERE_LEN);
11075 
11076   if (
11077     no_pk ||
11078     spider_param_use_cond_other_than_pk_for_update(thd)
11079   ) {
11080     for (field = table->field; *field; field++)
11081     {
11082       if (
11083         no_pk ||
11084         bitmap_is_set(table->read_set, (*field)->field_index)
11085       ) {
11086         field_name_length =
11087           mysql_share->column_name_str[(*field)->field_index].length();
11088         if ((*field)->is_null(ptr_diff))
11089         {
11090           if (str->reserve(field_name_length +
11091             /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
11092             SPIDER_SQL_IS_NULL_LEN + SPIDER_SQL_AND_LEN))
11093             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11094           mysql_share->append_column_name(str, (*field)->field_index);
11095           str->q_append(SPIDER_SQL_IS_NULL_STR, SPIDER_SQL_IS_NULL_LEN);
11096         } else {
11097           if (str->reserve(field_name_length +
11098             /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
11099             SPIDER_SQL_EQUAL_LEN))
11100             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11101           mysql_share->append_column_name(str, (*field)->field_index);
11102           str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
11103           (*field)->move_field_offset(ptr_diff);
11104           if (
11105             spider_db_mbase_utility->
11106               append_column_value(spider, str, *field, NULL,
11107                 share->access_charset) ||
11108             str->reserve(SPIDER_SQL_AND_LEN)
11109           )
11110             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11111           (*field)->move_field_offset(-ptr_diff);
11112         }
11113         str->q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN);
11114       }
11115     }
11116   } else {
11117     KEY *key_info = &table->key_info[table->s->primary_key];
11118     KEY_PART_INFO *key_part;
11119     uint part_num;
11120     for (
11121       key_part = key_info->key_part, part_num = 0;
11122       part_num < spider_user_defined_key_parts(key_info);
11123       key_part++, part_num++
11124     ) {
11125       field = &key_part->field;
11126       field_name_length =
11127         mysql_share->column_name_str[(*field)->field_index].length();
11128       if ((*field)->is_null(ptr_diff))
11129       {
11130         if (str->reserve(field_name_length +
11131           /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
11132           SPIDER_SQL_IS_NULL_LEN + SPIDER_SQL_AND_LEN))
11133           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11134         mysql_share->append_column_name(str, (*field)->field_index);
11135         str->q_append(SPIDER_SQL_IS_NULL_STR, SPIDER_SQL_IS_NULL_LEN);
11136       } else {
11137         if (str->reserve(field_name_length +
11138           /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
11139           SPIDER_SQL_EQUAL_LEN))
11140           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11141         mysql_share->append_column_name(str, (*field)->field_index);
11142         str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
11143         (*field)->move_field_offset(ptr_diff);
11144         if (
11145           spider_db_mbase_utility->
11146             append_column_value(spider, str, *field, NULL,
11147               share->access_charset) ||
11148           str->reserve(SPIDER_SQL_AND_LEN)
11149         )
11150           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11151         (*field)->move_field_offset(-ptr_diff);
11152       }
11153       str->q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN);
11154     }
11155   }
11156   if (str->length() == str_len_bakup + SPIDER_SQL_WHERE_LEN)
11157   {
11158     /* no condition */
11159     str->length(str_len_bakup);
11160   } else {
11161     str->length(str->length() - SPIDER_SQL_AND_LEN);
11162   }
11163   if (str->reserve(SPIDER_SQL_LIMIT1_LEN))
11164     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11165   str->q_append(SPIDER_SQL_LIMIT1_STR, SPIDER_SQL_LIMIT1_LEN);
11166   DBUG_RETURN(0);
11167 }
11168 
append_condition_part(const char * alias,uint alias_length,ulong sql_type,bool test_flg)11169 int spider_mbase_handler::append_condition_part(
11170   const char *alias,
11171   uint alias_length,
11172   ulong sql_type,
11173   bool test_flg
11174 ) {
11175   int error_num;
11176   spider_string *str;
11177   bool start_where = FALSE;
11178   DBUG_ENTER("spider_mbase_handler::append_condition_part");
11179   switch (sql_type)
11180   {
11181     case SPIDER_SQL_TYPE_SELECT_SQL:
11182       if (test_flg)
11183       {
11184         str = NULL;
11185       } else {
11186         str = &sql;
11187         start_where = ((int) str->length() == where_pos);
11188       }
11189       break;
11190     case SPIDER_SQL_TYPE_TMP_SQL:
11191       if (test_flg)
11192       {
11193         str = NULL;
11194       } else {
11195         str = &tmp_sql;
11196         start_where = ((int) str->length() == where_pos);
11197       }
11198       break;
11199     case SPIDER_SQL_TYPE_INSERT_SQL:
11200     case SPIDER_SQL_TYPE_UPDATE_SQL:
11201     case SPIDER_SQL_TYPE_DELETE_SQL:
11202     case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
11203       if (test_flg)
11204       {
11205         str = NULL;
11206       } else {
11207         str = &update_sql;
11208         start_where = ((int) str->length() == where_pos);
11209       }
11210       break;
11211     case SPIDER_SQL_TYPE_HANDLER:
11212       if (test_flg)
11213       {
11214         str = NULL;
11215       } else {
11216         str = &ha_sql;
11217         start_where = TRUE;
11218         if (spider->active_index == MAX_KEY)
11219         {
11220           set_where_pos(SPIDER_SQL_TYPE_HANDLER);
11221           if (str->reserve(SPIDER_SQL_READ_LEN + SPIDER_SQL_FIRST_LEN))
11222             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11223           str->q_append(SPIDER_SQL_READ_STR, SPIDER_SQL_READ_LEN);
11224           ha_next_pos = str->length();
11225           str->q_append(SPIDER_SQL_FIRST_STR, SPIDER_SQL_FIRST_LEN);
11226           sql_part2.length(0);
11227         }
11228         ha_where_pos = str->length();
11229 
11230         if (
11231           spider->sql_command == SQLCOM_HA_READ ||
11232           !spider->result_list.use_both_key
11233         ) {
11234           if (sql_part2.length())
11235           {
11236             str->append(sql_part2);
11237             start_where = FALSE;
11238           }
11239         } else {
11240           DBUG_RETURN(0);
11241         }
11242       }
11243       break;
11244     default:
11245       DBUG_RETURN(0);
11246   }
11247   error_num = append_condition(str, alias, alias_length, start_where,
11248     sql_type);
11249   DBUG_RETURN(error_num);
11250 }
11251 
append_condition(spider_string * str,const char * alias,uint alias_length,bool start_where,ulong sql_type)11252 int spider_mbase_handler::append_condition(
11253   spider_string *str,
11254   const char *alias,
11255   uint alias_length,
11256   bool start_where,
11257   ulong sql_type
11258 ) {
11259   int error_num, restart_pos = 0, start_where_pos;
11260   SPIDER_CONDITION *tmp_cond = spider->condition;
11261   DBUG_ENTER("spider_mbase_handler::append_condition");
11262   if (str && start_where)
11263   {
11264     start_where_pos = str->length();
11265   } else {
11266     start_where_pos = 0;
11267   }
11268 
11269   if (spider->is_clone && !tmp_cond)
11270   {
11271     tmp_cond = spider->pt_clone_source_handler->condition;
11272   }
11273 
11274   while (tmp_cond)
11275   {
11276     if (str)
11277     {
11278       restart_pos = str->length();
11279       if (start_where)
11280       {
11281         if (str->reserve(SPIDER_SQL_WHERE_LEN))
11282           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11283         str->q_append(SPIDER_SQL_WHERE_STR, SPIDER_SQL_WHERE_LEN);
11284         start_where = FALSE;
11285       } else {
11286         if (str->reserve(SPIDER_SQL_AND_LEN))
11287           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11288         str->q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN);
11289       }
11290     }
11291     if ((error_num = spider_db_print_item_type(
11292       (Item *) tmp_cond->cond, NULL, spider, str, alias, alias_length,
11293       dbton_id, FALSE, NULL)))
11294     {
11295       if (str && error_num == ER_SPIDER_COND_SKIP_NUM)
11296       {
11297         DBUG_PRINT("info",("spider COND skip"));
11298         str->length(restart_pos);
11299         start_where = (restart_pos == start_where_pos);
11300       } else
11301         DBUG_RETURN(error_num);
11302     }
11303     tmp_cond = tmp_cond->next;
11304   }
11305   DBUG_RETURN(0);
11306 }
11307 
append_match_against_part(ulong sql_type,st_spider_ft_info * ft_info,const char * alias,uint alias_length)11308 int spider_mbase_handler::append_match_against_part(
11309   ulong sql_type,
11310   st_spider_ft_info *ft_info,
11311   const char *alias,
11312   uint alias_length
11313 ) {
11314   int error_num;
11315   spider_string *str;
11316   DBUG_ENTER("spider_mbase_handler::append_match_against_part");
11317   DBUG_PRINT("info",("spider this=%p", this));
11318   switch (sql_type)
11319   {
11320     case SPIDER_SQL_TYPE_SELECT_SQL:
11321       str = &sql;
11322       break;
11323     default:
11324       DBUG_RETURN(0);
11325   }
11326   error_num = append_match_against(str, ft_info, alias, alias_length);
11327   DBUG_RETURN(error_num);
11328 }
11329 
append_match_against(spider_string * str,st_spider_ft_info * ft_info,const char * alias,uint alias_length)11330 int spider_mbase_handler::append_match_against(
11331   spider_string *str,
11332   st_spider_ft_info  *ft_info,
11333   const char *alias,
11334   uint alias_length
11335 ) {
11336   SPIDER_SHARE *share = spider->share;
11337   TABLE *table = spider->get_table();
11338   String *ft_init_key;
11339   KEY *key_info;
11340   uint key_name_length;
11341   int key_count;
11342   KEY_PART_INFO *key_part;
11343   Field *field;
11344   DBUG_ENTER("spider_mbase_handler::append_match_against");
11345   DBUG_PRINT("info",("spider this=%p", this));
11346   if (str->reserve(SPIDER_SQL_MATCH_LEN))
11347     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11348   str->q_append(SPIDER_SQL_MATCH_STR, SPIDER_SQL_MATCH_LEN);
11349 
11350   ft_init_key = ft_info->key;
11351   key_info = &table->key_info[ft_info->inx];
11352   DBUG_PRINT("info", ("spider spider_user_defined_key_parts=%u",
11353     spider_user_defined_key_parts(key_info)));
11354 
11355   for (
11356     key_part = key_info->key_part,
11357     key_count = 0;
11358     key_count < (int) spider_user_defined_key_parts(key_info);
11359     key_part++,
11360     key_count++
11361   ) {
11362     field = key_part->field;
11363     key_name_length =
11364       mysql_share->column_name_str[field->field_index].length();
11365     if (alias_length)
11366     {
11367       if (str->reserve(alias_length + key_name_length +
11368         /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
11369         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11370       str->q_append(alias, alias_length);
11371     } else {
11372       if (str->reserve(key_name_length +
11373         /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
11374         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11375     }
11376     mysql_share->append_column_name(str, field->field_index);
11377     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
11378   }
11379   str->length(str->length() - SPIDER_SQL_COMMA_LEN);
11380   if (str->reserve(SPIDER_SQL_AGAINST_LEN + SPIDER_SQL_VALUE_QUOTE_LEN))
11381     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11382   str->q_append(SPIDER_SQL_AGAINST_STR, SPIDER_SQL_AGAINST_LEN);
11383   str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
11384 
11385   char buf[MAX_FIELD_WIDTH];
11386   spider_string tmp_str(buf, MAX_FIELD_WIDTH, share->access_charset);
11387   tmp_str.init_calc_mem(116);
11388   tmp_str.length(0);
11389   if (
11390     tmp_str.append(ft_init_key->ptr(), ft_init_key->length(),
11391       ft_init_key->charset()) ||
11392     str->reserve(tmp_str.length() * 2) ||
11393     spider_db_mbase_utility->append_escaped_util(str, tmp_str.get_str())
11394   )
11395     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11396   str->mem_calc();
11397 
11398   if (str->reserve(
11399     SPIDER_SQL_VALUE_QUOTE_LEN + SPIDER_SQL_CLOSE_PAREN_LEN +
11400     ((ft_info->flags & FT_BOOL) ? SPIDER_SQL_IN_BOOLEAN_MODE_LEN : 0) +
11401     ((ft_info->flags & FT_EXPAND) ?
11402       SPIDER_SQL_WITH_QUERY_EXPANSION_LEN : 0)
11403   ))
11404     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11405   str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
11406   if (ft_info->flags & FT_BOOL)
11407     str->q_append(SPIDER_SQL_IN_BOOLEAN_MODE_STR,
11408       SPIDER_SQL_IN_BOOLEAN_MODE_LEN);
11409   if (ft_info->flags & FT_EXPAND)
11410     str->q_append(SPIDER_SQL_WITH_QUERY_EXPANSION_STR,
11411       SPIDER_SQL_WITH_QUERY_EXPANSION_LEN);
11412   str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
11413   DBUG_RETURN(0);
11414 }
11415 
append_match_select_part(ulong sql_type,const char * alias,uint alias_length)11416 int spider_mbase_handler::append_match_select_part(
11417   ulong sql_type,
11418   const char *alias,
11419   uint alias_length
11420 ) {
11421   int error_num;
11422   spider_string *str;
11423   DBUG_ENTER("spider_mbase_handler::append_match_select_part");
11424   DBUG_PRINT("info",("spider this=%p", this));
11425   switch (sql_type)
11426   {
11427     case SPIDER_SQL_TYPE_SELECT_SQL:
11428       str = &sql;
11429       break;
11430     default:
11431       DBUG_RETURN(0);
11432   }
11433   error_num = append_match_select(str, alias, alias_length);
11434   DBUG_RETURN(error_num);
11435 }
11436 
append_match_select(spider_string * str,const char * alias,uint alias_length)11437 int spider_mbase_handler::append_match_select(
11438   spider_string *str,
11439   const char *alias,
11440   uint alias_length
11441 ) {
11442   int error_num;
11443   DBUG_ENTER("spider_mbase_handler::append_match_select");
11444   DBUG_PRINT("info",("spider this=%p", this));
11445   if (spider->ft_current)
11446   {
11447     st_spider_ft_info *ft_info = spider->ft_first;
11448     while (TRUE)
11449     {
11450       if ((error_num = append_match_against(str, ft_info,
11451         alias, alias_length)))
11452         DBUG_RETURN(error_num);
11453       if (str->reserve(SPIDER_SQL_COMMA_LEN))
11454         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11455       str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
11456       if (ft_info == spider->ft_current)
11457         break;
11458       ft_info = ft_info->next;
11459     }
11460   }
11461   DBUG_RETURN(0);
11462 }
11463 
11464 #ifdef HANDLER_HAS_DIRECT_AGGREGATE
append_sum_select_part(ulong sql_type,const char * alias,uint alias_length)11465 int spider_mbase_handler::append_sum_select_part(
11466   ulong sql_type,
11467   const char *alias,
11468   uint alias_length
11469 ) {
11470   int error_num;
11471   spider_string *str;
11472   DBUG_ENTER("spider_mbase_handler::append_sum_select_part");
11473   DBUG_PRINT("info",("spider this=%p", this));
11474   switch (sql_type)
11475   {
11476     case SPIDER_SQL_TYPE_SELECT_SQL:
11477       str = &sql;
11478       break;
11479     default:
11480       DBUG_RETURN(0);
11481   }
11482   error_num = append_sum_select(str, alias, alias_length);
11483   DBUG_RETURN(error_num);
11484 }
11485 
append_sum_select(spider_string * str,const char * alias,uint alias_length)11486 int spider_mbase_handler::append_sum_select(
11487   spider_string *str,
11488   const char *alias,
11489   uint alias_length
11490 ) {
11491   int error_num;
11492   st_select_lex *select_lex;
11493   DBUG_ENTER("spider_mbase_handler::append_sum_select");
11494   DBUG_PRINT("info",("spider this=%p", this));
11495   select_lex = spider_get_select_lex(spider);
11496   JOIN *join = select_lex->join;
11497   Item_sum **item_sum_ptr;
11498   for (item_sum_ptr = join->sum_funcs; *item_sum_ptr; ++item_sum_ptr)
11499   {
11500     if ((error_num = spider_db_mbase_utility->open_item_sum_func(*item_sum_ptr,
11501       spider, str, alias, alias_length, FALSE, NULL)))
11502     {
11503       DBUG_RETURN(error_num);
11504     }
11505     if (str->reserve(SPIDER_SQL_COMMA_LEN))
11506       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11507     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
11508   }
11509   DBUG_RETURN(0);
11510 }
11511 #endif
11512 
set_order_pos(ulong sql_type)11513 void spider_mbase_handler::set_order_pos(
11514   ulong sql_type
11515 ) {
11516   DBUG_ENTER("spider_mbase_handler::set_order_pos");
11517   switch (sql_type)
11518   {
11519     case SPIDER_SQL_TYPE_SELECT_SQL:
11520     case SPIDER_SQL_TYPE_TMP_SQL:
11521       order_pos = sql.length();
11522       break;
11523     case SPIDER_SQL_TYPE_INSERT_SQL:
11524     case SPIDER_SQL_TYPE_UPDATE_SQL:
11525     case SPIDER_SQL_TYPE_DELETE_SQL:
11526     case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
11527       order_pos = update_sql.length();
11528       break;
11529     case SPIDER_SQL_TYPE_HANDLER:
11530       ha_next_pos = ha_sql.length();
11531       break;
11532     default:
11533       DBUG_ASSERT(0);
11534       break;
11535   }
11536   DBUG_VOID_RETURN;
11537 }
11538 
set_order_to_pos(ulong sql_type)11539 void spider_mbase_handler::set_order_to_pos(
11540   ulong sql_type
11541 ) {
11542   DBUG_ENTER("spider_mbase_handler::set_order_to_pos");
11543   switch (sql_type)
11544   {
11545     case SPIDER_SQL_TYPE_SELECT_SQL:
11546     case SPIDER_SQL_TYPE_TMP_SQL:
11547       sql.length(order_pos);
11548       break;
11549     case SPIDER_SQL_TYPE_INSERT_SQL:
11550     case SPIDER_SQL_TYPE_UPDATE_SQL:
11551     case SPIDER_SQL_TYPE_DELETE_SQL:
11552     case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
11553       update_sql.length(order_pos);
11554       break;
11555     case SPIDER_SQL_TYPE_HANDLER:
11556       ha_sql.length(ha_next_pos);
11557       break;
11558     default:
11559       DBUG_ASSERT(0);
11560       break;
11561   }
11562   DBUG_VOID_RETURN;
11563 }
11564 
11565 #ifdef HANDLER_HAS_DIRECT_AGGREGATE
append_group_by_part(const char * alias,uint alias_length,ulong sql_type)11566 int spider_mbase_handler::append_group_by_part(
11567   const char *alias,
11568   uint alias_length,
11569   ulong sql_type
11570 ) {
11571   int error_num;
11572   spider_string *str;
11573   DBUG_ENTER("spider_mbase_handler::append_group_by_part");
11574   DBUG_PRINT("info",("spider this=%p", this));
11575   switch (sql_type)
11576   {
11577     case SPIDER_SQL_TYPE_SELECT_SQL:
11578     case SPIDER_SQL_TYPE_TMP_SQL:
11579       str = &sql;
11580       break;
11581     case SPIDER_SQL_TYPE_INSERT_SQL:
11582     case SPIDER_SQL_TYPE_UPDATE_SQL:
11583     case SPIDER_SQL_TYPE_DELETE_SQL:
11584     case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
11585       str = &update_sql;
11586       break;
11587     case SPIDER_SQL_TYPE_HANDLER:
11588       str = &ha_sql;
11589       break;
11590     default:
11591       DBUG_RETURN(0);
11592   }
11593   error_num = append_group_by(str, alias, alias_length);
11594   DBUG_RETURN(error_num);
11595 }
11596 
append_group_by(spider_string * str,const char * alias,uint alias_length)11597 int spider_mbase_handler::append_group_by(
11598   spider_string *str,
11599   const char *alias,
11600   uint alias_length
11601 ) {
11602   int error_num;
11603   st_select_lex *select_lex;
11604   DBUG_ENTER("spider_mbase_handler::append_group_by");
11605   DBUG_PRINT("info",("spider this=%p", this));
11606   select_lex = spider_get_select_lex(spider);
11607   ORDER *group = (ORDER *) select_lex->group_list.first;
11608   if (group)
11609   {
11610     if (str->reserve(SPIDER_SQL_GROUP_LEN))
11611       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11612     str->q_append(SPIDER_SQL_GROUP_STR, SPIDER_SQL_GROUP_LEN);
11613     for (; group; group = group->next)
11614     {
11615       if ((error_num = spider_db_print_item_type((*group->item), NULL, spider,
11616         str, alias, alias_length, dbton_id, FALSE, NULL)))
11617       {
11618         DBUG_RETURN(error_num);
11619       }
11620       if (str->reserve(SPIDER_SQL_COMMA_LEN))
11621         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11622       str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
11623     }
11624     str->length(str->length() - SPIDER_SQL_COMMA_LEN);
11625   }
11626   DBUG_RETURN(0);
11627 }
11628 #endif
11629 
append_key_order_for_merge_with_alias_part(const char * alias,uint alias_length,ulong sql_type)11630 int spider_mbase_handler::append_key_order_for_merge_with_alias_part(
11631   const char *alias,
11632   uint alias_length,
11633   ulong sql_type
11634 ) {
11635   int error_num;
11636   spider_string *str;
11637   DBUG_ENTER("spider_mbase_handler::append_key_order_for_merge_with_alias_part");
11638   DBUG_PRINT("info",("spider this=%p", this));
11639   switch (sql_type)
11640   {
11641     case SPIDER_SQL_TYPE_SELECT_SQL:
11642     case SPIDER_SQL_TYPE_TMP_SQL:
11643       str = &sql;
11644       break;
11645     case SPIDER_SQL_TYPE_INSERT_SQL:
11646     case SPIDER_SQL_TYPE_UPDATE_SQL:
11647     case SPIDER_SQL_TYPE_DELETE_SQL:
11648     case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
11649       str = &update_sql;
11650       break;
11651     case SPIDER_SQL_TYPE_HANDLER:
11652       str = &ha_sql;
11653       ha_limit_pos = ha_sql.length();
11654       break;
11655     default:
11656       DBUG_RETURN(0);
11657   }
11658   error_num = append_key_order_for_merge_with_alias(str, alias, alias_length);
11659   DBUG_RETURN(error_num);
11660 }
11661 
append_key_order_for_merge_with_alias(spider_string * str,const char * alias,uint alias_length)11662 int spider_mbase_handler::append_key_order_for_merge_with_alias(
11663   spider_string *str,
11664   const char *alias,
11665   uint alias_length
11666 ) {
11667   /* sort for index merge */
11668   TABLE *table = spider->get_table();
11669   int length;
11670   Field *field;
11671   uint key_name_length;
11672   DBUG_ENTER("spider_mbase_handler::append_key_order_for_merge_with_alias");
11673   DBUG_PRINT("info",("spider this=%p", this));
11674 #ifdef HANDLER_HAS_DIRECT_AGGREGATE
11675   if (spider->result_list.direct_aggregate)
11676   {
11677     int error_num;
11678     if ((error_num = append_group_by(str, alias, alias_length)))
11679       DBUG_RETURN(error_num);
11680   }
11681 #endif
11682   if (table->s->primary_key < MAX_KEY)
11683   {
11684     /* sort by primary key */
11685     KEY *key_info = &table->key_info[table->s->primary_key];
11686     KEY_PART_INFO *key_part;
11687     for (
11688       key_part = key_info->key_part,
11689       length = 1;
11690       length <= (int) spider_user_defined_key_parts(key_info);
11691       key_part++,
11692       length++
11693     ) {
11694       field = key_part->field;
11695       key_name_length =
11696         mysql_share->column_name_str[field->field_index].length();
11697       if (length == 1)
11698       {
11699         if (str->reserve(SPIDER_SQL_ORDER_LEN))
11700           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11701         str->q_append(SPIDER_SQL_ORDER_STR, SPIDER_SQL_ORDER_LEN);
11702       }
11703       if (str->reserve(alias_length + key_name_length +
11704         /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
11705         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11706       str->q_append(alias, alias_length);
11707       mysql_share->append_column_name(str, field->field_index);
11708       str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
11709     }
11710     if (length > 1)
11711     {
11712       str->length(str->length() - SPIDER_SQL_COMMA_LEN);
11713     }
11714   } else {
11715     /* sort by all columns */
11716     Field **fieldp;
11717     for (
11718       fieldp = table->field, length = 1;
11719       *fieldp;
11720       fieldp++, length++
11721     ) {
11722       key_name_length =
11723         mysql_share->column_name_str[(*fieldp)->field_index].length();
11724       if (length == 1)
11725       {
11726         if (str->reserve(SPIDER_SQL_ORDER_LEN))
11727           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11728         str->q_append(SPIDER_SQL_ORDER_STR, SPIDER_SQL_ORDER_LEN);
11729       }
11730       if (str->reserve(alias_length + key_name_length +
11731         /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
11732         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11733       str->q_append(alias, alias_length);
11734       mysql_share->append_column_name(str, (*fieldp)->field_index);
11735       str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
11736     }
11737     if (length > 1)
11738     {
11739       str->length(str->length() - SPIDER_SQL_COMMA_LEN);
11740     }
11741   }
11742   limit_pos = str->length();
11743   DBUG_RETURN(0);
11744 }
11745 
append_key_order_for_direct_order_limit_with_alias_part(const char * alias,uint alias_length,ulong sql_type)11746 int spider_mbase_handler::append_key_order_for_direct_order_limit_with_alias_part(
11747   const char *alias,
11748   uint alias_length,
11749   ulong sql_type
11750 ) {
11751   int error_num;
11752   spider_string *str;
11753   DBUG_ENTER("spider_mbase_handler::append_key_order_for_direct_order_limit_with_alias_part");
11754   DBUG_PRINT("info",("spider this=%p", this));
11755   switch (sql_type)
11756   {
11757     case SPIDER_SQL_TYPE_SELECT_SQL:
11758     case SPIDER_SQL_TYPE_TMP_SQL:
11759       str = &sql;
11760       break;
11761     case SPIDER_SQL_TYPE_INSERT_SQL:
11762     case SPIDER_SQL_TYPE_UPDATE_SQL:
11763     case SPIDER_SQL_TYPE_DELETE_SQL:
11764     case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
11765       str = &update_sql;
11766       break;
11767     case SPIDER_SQL_TYPE_HANDLER:
11768       str = &ha_sql;
11769       break;
11770     default:
11771       DBUG_RETURN(0);
11772   }
11773   error_num = append_key_order_for_direct_order_limit_with_alias(
11774     str, alias, alias_length);
11775   DBUG_RETURN(error_num);
11776 }
11777 
append_key_order_for_direct_order_limit_with_alias(spider_string * str,const char * alias,uint alias_length)11778 int spider_mbase_handler::append_key_order_for_direct_order_limit_with_alias(
11779   spider_string *str,
11780   const char *alias,
11781   uint alias_length
11782 ) {
11783   int error_num;
11784   ORDER *order;
11785   st_select_lex *select_lex;
11786   longlong select_limit;
11787   longlong offset_limit;
11788   DBUG_ENTER("spider_mbase_handler::append_key_order_for_direct_order_limit_with_alias");
11789   DBUG_PRINT("info",("spider this=%p", this));
11790 #ifdef HANDLER_HAS_DIRECT_AGGREGATE
11791   if (spider->result_list.direct_aggregate)
11792   {
11793     if ((error_num = append_group_by(str, alias, alias_length)))
11794       DBUG_RETURN(error_num);
11795   }
11796 #endif
11797   spider_get_select_limit(spider, &select_lex, &select_limit,
11798     &offset_limit);
11799   if (select_lex->order_list.first)
11800   {
11801     if (str->reserve(SPIDER_SQL_ORDER_LEN))
11802       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11803     str->q_append(SPIDER_SQL_ORDER_STR, SPIDER_SQL_ORDER_LEN);
11804     for (order = (ORDER *) select_lex->order_list.first; order;
11805       order = order->next)
11806     {
11807       if ((error_num =
11808         spider_db_print_item_type((*order->item), NULL, spider, str, alias,
11809           alias_length, dbton_id, FALSE, NULL)))
11810       {
11811         DBUG_PRINT("info",("spider error=%d", error_num));
11812         DBUG_RETURN(error_num);
11813       }
11814       if (SPIDER_order_direction_is_asc(order))
11815       {
11816         if (str->reserve(SPIDER_SQL_COMMA_LEN))
11817           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11818         str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
11819       } else {
11820         if (str->reserve(SPIDER_SQL_DESC_LEN + SPIDER_SQL_COMMA_LEN))
11821           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11822         str->q_append(SPIDER_SQL_DESC_STR, SPIDER_SQL_DESC_LEN);
11823         str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
11824       }
11825     }
11826     str->length(str->length() - SPIDER_SQL_COMMA_LEN);
11827   }
11828   limit_pos = str->length();
11829   DBUG_RETURN(0);
11830 }
11831 
append_key_order_with_alias_part(const char * alias,uint alias_length,ulong sql_type)11832 int spider_mbase_handler::append_key_order_with_alias_part(
11833   const char *alias,
11834   uint alias_length,
11835   ulong sql_type
11836 ) {
11837   int error_num;
11838   spider_string *str;
11839   DBUG_ENTER("spider_mbase_handler::append_key_order_with_alias_part");
11840   DBUG_PRINT("info",("spider this=%p", this));
11841   switch (sql_type)
11842   {
11843     case SPIDER_SQL_TYPE_SELECT_SQL:
11844     case SPIDER_SQL_TYPE_TMP_SQL:
11845       str = &sql;
11846       break;
11847     case SPIDER_SQL_TYPE_INSERT_SQL:
11848     case SPIDER_SQL_TYPE_UPDATE_SQL:
11849     case SPIDER_SQL_TYPE_DELETE_SQL:
11850     case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
11851       str = &update_sql;
11852       break;
11853     case SPIDER_SQL_TYPE_HANDLER:
11854       str = &ha_sql;
11855       error_num = append_key_order_for_handler(str, alias, alias_length);
11856       DBUG_RETURN(error_num);
11857     default:
11858       DBUG_RETURN(0);
11859   }
11860   error_num = append_key_order_with_alias(str, alias, alias_length);
11861   DBUG_RETURN(error_num);
11862 }
11863 
append_key_order_for_handler(spider_string * str,const char * alias,uint alias_length)11864 int spider_mbase_handler::append_key_order_for_handler(
11865   spider_string *str,
11866   const char *alias,
11867   uint alias_length
11868 ) {
11869   DBUG_ENTER("spider_mbase_handler::append_key_order_for_handler");
11870   DBUG_PRINT("info",("spider this=%p", this));
11871   DBUG_PRINT("info",("spider ha_next_pos=%d", ha_next_pos));
11872   DBUG_PRINT("info",("spider ha_where_pos=%d", ha_where_pos));
11873   str->q_append(alias, alias_length);
11874   memset((char *) str->ptr() + str->length(), ' ',
11875     ha_where_pos - ha_next_pos - alias_length);
11876   DBUG_RETURN(0);
11877 }
11878 
append_key_order_with_alias(spider_string * str,const char * alias,uint alias_length)11879 int spider_mbase_handler::append_key_order_with_alias(
11880   spider_string *str,
11881   const char *alias,
11882   uint alias_length
11883 ) {
11884   SPIDER_RESULT_LIST *result_list = &spider->result_list;
11885   KEY *key_info = result_list->key_info;
11886   int length;
11887   KEY_PART_INFO *key_part;
11888   Field *field;
11889   uint key_name_length;
11890   DBUG_ENTER("spider_mbase_handler::append_key_order_with_alias");
11891   DBUG_PRINT("info",("spider this=%p", this));
11892 #ifdef HANDLER_HAS_DIRECT_AGGREGATE
11893   if (spider->result_list.direct_aggregate)
11894   {
11895     int error_num;
11896     if ((error_num = append_group_by(str, alias, alias_length)))
11897       DBUG_RETURN(error_num);
11898   }
11899 #endif
11900   if (result_list->sorted == TRUE)
11901   {
11902     if (result_list->desc_flg == TRUE)
11903     {
11904       for (
11905         key_part = key_info->key_part + result_list->key_order,
11906         length = 1;
11907         length + result_list->key_order <
11908           (int) spider_user_defined_key_parts(key_info) &&
11909         length < result_list->max_order;
11910         key_part++,
11911         length++
11912       ) {
11913         field = key_part->field;
11914         key_name_length =
11915           mysql_share->column_name_str[field->field_index].length();
11916         if (length == 1)
11917         {
11918           if (str->reserve(SPIDER_SQL_ORDER_LEN))
11919             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11920           str->q_append(SPIDER_SQL_ORDER_STR, SPIDER_SQL_ORDER_LEN);
11921         }
11922         if (key_part->key_part_flag & HA_REVERSE_SORT)
11923         {
11924           if (str->reserve(alias_length + key_name_length +
11925             /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
11926             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11927           str->q_append(alias, alias_length);
11928           mysql_share->append_column_name(str, field->field_index);
11929           str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
11930         } else {
11931           if (str->reserve(alias_length + key_name_length +
11932             /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
11933             SPIDER_SQL_DESC_LEN + SPIDER_SQL_COMMA_LEN))
11934             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11935           str->q_append(alias, alias_length);
11936           mysql_share->append_column_name(str, field->field_index);
11937           str->q_append(SPIDER_SQL_DESC_STR, SPIDER_SQL_DESC_LEN);
11938           str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
11939         }
11940       }
11941       if (
11942         length + result_list->key_order <=
11943           (int) spider_user_defined_key_parts(key_info) &&
11944         length <= result_list->max_order
11945       ) {
11946         field = key_part->field;
11947         key_name_length =
11948           mysql_share->column_name_str[field->field_index].length();
11949         if (length == 1)
11950         {
11951           if (str->reserve(SPIDER_SQL_ORDER_LEN))
11952             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11953           str->q_append(SPIDER_SQL_ORDER_STR, SPIDER_SQL_ORDER_LEN);
11954         }
11955         if (key_part->key_part_flag & HA_REVERSE_SORT)
11956         {
11957           if (str->reserve(alias_length + key_name_length +
11958             /* SPIDER_SQL_NAME_QUOTE_LEN */ 2))
11959             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11960           str->q_append(alias, alias_length);
11961           mysql_share->append_column_name(str, field->field_index);
11962         } else {
11963           if (str->reserve(alias_length + key_name_length +
11964             /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_DESC_LEN))
11965             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11966           str->q_append(alias, alias_length);
11967           mysql_share->append_column_name(str, field->field_index);
11968           str->q_append(SPIDER_SQL_DESC_STR, SPIDER_SQL_DESC_LEN);
11969         }
11970       }
11971     } else {
11972       for (
11973         key_part = key_info->key_part + result_list->key_order,
11974         length = 1;
11975         length + result_list->key_order <
11976           (int) spider_user_defined_key_parts(key_info) &&
11977         length < result_list->max_order;
11978         key_part++,
11979         length++
11980       ) {
11981         field = key_part->field;
11982         key_name_length =
11983           mysql_share->column_name_str[field->field_index].length();
11984         if (length == 1)
11985         {
11986           if (str->reserve(SPIDER_SQL_ORDER_LEN))
11987             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11988           str->q_append(SPIDER_SQL_ORDER_STR, SPIDER_SQL_ORDER_LEN);
11989         }
11990         if (key_part->key_part_flag & HA_REVERSE_SORT)
11991         {
11992           if (str->reserve(alias_length + key_name_length +
11993             /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
11994             SPIDER_SQL_DESC_LEN + SPIDER_SQL_COMMA_LEN))
11995             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11996           str->q_append(alias, alias_length);
11997           mysql_share->append_column_name(str, field->field_index);
11998           str->q_append(SPIDER_SQL_DESC_STR, SPIDER_SQL_DESC_LEN);
11999           str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
12000         } else {
12001           if (str->reserve(alias_length + key_name_length +
12002             /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
12003             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12004           str->q_append(alias, alias_length);
12005           mysql_share->append_column_name(str, field->field_index);
12006           str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
12007         }
12008       }
12009       if (
12010         length + result_list->key_order <=
12011           (int) spider_user_defined_key_parts(key_info) &&
12012         length <= result_list->max_order
12013       ) {
12014         field = key_part->field;
12015         key_name_length =
12016           mysql_share->column_name_str[field->field_index].length();
12017         if (length == 1)
12018         {
12019           if (str->reserve(SPIDER_SQL_ORDER_LEN))
12020             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12021           str->q_append(SPIDER_SQL_ORDER_STR, SPIDER_SQL_ORDER_LEN);
12022         }
12023         if (key_part->key_part_flag & HA_REVERSE_SORT)
12024         {
12025           if (str->reserve(alias_length + key_name_length +
12026             /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_DESC_LEN))
12027             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12028           str->q_append(alias, alias_length);
12029           mysql_share->append_column_name(str, field->field_index);
12030           str->q_append(SPIDER_SQL_DESC_STR, SPIDER_SQL_DESC_LEN);
12031         } else {
12032           if (str->reserve(alias_length + key_name_length +
12033             /* SPIDER_SQL_NAME_QUOTE_LEN */ 2))
12034             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12035           str->q_append(alias, alias_length);
12036           mysql_share->append_column_name(str, field->field_index);
12037         }
12038       }
12039     }
12040   }
12041   limit_pos = str->length();
12042   DBUG_RETURN(0);
12043 }
12044 
append_limit_part(longlong offset,longlong limit,ulong sql_type)12045 int spider_mbase_handler::append_limit_part(
12046   longlong offset,
12047   longlong limit,
12048   ulong sql_type
12049 ) {
12050   int error_num;
12051   spider_string *str;
12052   DBUG_ENTER("spider_mbase_handler::append_limit_part");
12053   DBUG_PRINT("info",("spider this=%p", this));
12054   switch (sql_type)
12055   {
12056     case SPIDER_SQL_TYPE_SELECT_SQL:
12057       str = &sql;
12058       limit_pos = str->length();
12059       break;
12060     case SPIDER_SQL_TYPE_TMP_SQL:
12061       str = &tmp_sql;
12062       limit_pos = str->length();
12063       break;
12064     case SPIDER_SQL_TYPE_INSERT_SQL:
12065     case SPIDER_SQL_TYPE_UPDATE_SQL:
12066     case SPIDER_SQL_TYPE_DELETE_SQL:
12067     case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
12068       str = &update_sql;
12069       limit_pos = str->length();
12070       break;
12071     case SPIDER_SQL_TYPE_HANDLER:
12072       str = &ha_sql;
12073       ha_limit_pos = str->length();
12074       break;
12075     default:
12076       DBUG_RETURN(0);
12077   }
12078   error_num = append_limit(str, offset, limit);
12079   DBUG_RETURN(error_num);
12080 }
12081 
reappend_limit_part(longlong offset,longlong limit,ulong sql_type)12082 int spider_mbase_handler::reappend_limit_part(
12083   longlong offset,
12084   longlong limit,
12085   ulong sql_type
12086 ) {
12087   int error_num;
12088   spider_string *str;
12089   DBUG_ENTER("spider_mbase_handler::reappend_limit_part");
12090   DBUG_PRINT("info",("spider this=%p", this));
12091   switch (sql_type)
12092   {
12093     case SPIDER_SQL_TYPE_SELECT_SQL:
12094       str = &sql;
12095       str->length(limit_pos);
12096       break;
12097     case SPIDER_SQL_TYPE_TMP_SQL:
12098       str = &tmp_sql;
12099       str->length(limit_pos);
12100       break;
12101     case SPIDER_SQL_TYPE_INSERT_SQL:
12102     case SPIDER_SQL_TYPE_UPDATE_SQL:
12103     case SPIDER_SQL_TYPE_DELETE_SQL:
12104     case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
12105       str = &update_sql;
12106       str->length(limit_pos);
12107       break;
12108     case SPIDER_SQL_TYPE_HANDLER:
12109       str = &ha_sql;
12110       str->length(ha_limit_pos);
12111       break;
12112     default:
12113       DBUG_RETURN(0);
12114   }
12115   error_num = append_limit(str, offset, limit);
12116   DBUG_RETURN(error_num);
12117 }
12118 
append_limit(spider_string * str,longlong offset,longlong limit)12119 int spider_mbase_handler::append_limit(
12120   spider_string *str,
12121   longlong offset,
12122   longlong limit
12123 ) {
12124   char buf[SPIDER_LONGLONG_LEN + 1];
12125   uint32 length;
12126   DBUG_ENTER("spider_mbase_handler::append_limit");
12127   DBUG_PRINT("info",("spider this=%p", this));
12128   DBUG_PRINT("info", ("spider offset=%lld", offset));
12129   DBUG_PRINT("info", ("spider limit=%lld", limit));
12130   if (offset || limit < 9223372036854775807LL)
12131   {
12132     if (str->reserve(SPIDER_SQL_LIMIT_LEN + SPIDER_SQL_COMMA_LEN +
12133       ((SPIDER_LONGLONG_LEN) * 2)))
12134       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12135     str->q_append(SPIDER_SQL_LIMIT_STR, SPIDER_SQL_LIMIT_LEN);
12136     if (offset)
12137     {
12138       length = (uint32) (my_charset_bin.cset->longlong10_to_str)(
12139         &my_charset_bin, buf, SPIDER_LONGLONG_LEN + 1, -10, offset);
12140       str->q_append(buf, length);
12141       str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
12142     }
12143     length = (uint32) (my_charset_bin.cset->longlong10_to_str)(
12144       &my_charset_bin, buf, SPIDER_LONGLONG_LEN + 1, -10, limit);
12145     str->q_append(buf, length);
12146   }
12147   DBUG_RETURN(0);
12148 }
12149 
append_select_lock_part(ulong sql_type)12150 int spider_mbase_handler::append_select_lock_part(
12151   ulong sql_type
12152 ) {
12153   int error_num;
12154   spider_string *str;
12155   DBUG_ENTER("spider_mbase_handler::append_select_lock_part");
12156   DBUG_PRINT("info",("spider this=%p", this));
12157   switch (sql_type)
12158   {
12159     case SPIDER_SQL_TYPE_SELECT_SQL:
12160       str = &sql;
12161       break;
12162     default:
12163       DBUG_RETURN(0);
12164   }
12165   error_num = append_select_lock(str);
12166   DBUG_RETURN(error_num);
12167 }
12168 
append_select_lock(spider_string * str)12169 int spider_mbase_handler::append_select_lock(
12170   spider_string *str
12171 ) {
12172   int lock_mode = spider_conn_lock_mode(spider);
12173   DBUG_ENTER("spider_mbase_handler::append_select_lock");
12174   DBUG_PRINT("info",("spider this=%p", this));
12175   if (lock_mode == SPIDER_LOCK_MODE_EXCLUSIVE)
12176   {
12177     if (str->reserve(SPIDER_SQL_FOR_UPDATE_LEN))
12178       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12179     str->q_append(SPIDER_SQL_FOR_UPDATE_STR, SPIDER_SQL_FOR_UPDATE_LEN);
12180   } else if (lock_mode == SPIDER_LOCK_MODE_SHARED)
12181   {
12182     if (str->reserve(SPIDER_SQL_SHARED_LOCK_LEN))
12183       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12184     str->q_append(SPIDER_SQL_SHARED_LOCK_STR, SPIDER_SQL_SHARED_LOCK_LEN);
12185   }
12186   DBUG_RETURN(0);
12187 }
12188 
append_union_all_start_part(ulong sql_type)12189 int spider_mbase_handler::append_union_all_start_part(
12190   ulong sql_type
12191 ) {
12192   int error_num;
12193   spider_string *str;
12194   DBUG_ENTER("spider_mbase_handler::append_union_all_start_part");
12195   DBUG_PRINT("info",("spider this=%p", this));
12196   switch (sql_type)
12197   {
12198     case SPIDER_SQL_TYPE_SELECT_SQL:
12199       str = &sql;
12200       break;
12201     default:
12202       DBUG_RETURN(0);
12203   }
12204   error_num = append_union_all_start(str);
12205   DBUG_RETURN(error_num);
12206 }
12207 
append_union_all_start(spider_string * str)12208 int spider_mbase_handler::append_union_all_start(
12209   spider_string *str
12210 ) {
12211   DBUG_ENTER("spider_mbase_handler::append_union_all_start");
12212   DBUG_PRINT("info",("spider this=%p", this));
12213   if (str->reserve(SPIDER_SQL_OPEN_PAREN_LEN))
12214     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12215   str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
12216   DBUG_RETURN(0);
12217 }
12218 
append_union_all_part(ulong sql_type)12219 int spider_mbase_handler::append_union_all_part(
12220   ulong sql_type
12221 ) {
12222   int error_num;
12223   spider_string *str;
12224   DBUG_ENTER("spider_mbase_handler::append_union_all_part");
12225   DBUG_PRINT("info",("spider this=%p", this));
12226   switch (sql_type)
12227   {
12228     case SPIDER_SQL_TYPE_SELECT_SQL:
12229       str = &sql;
12230       break;
12231     default:
12232       DBUG_RETURN(0);
12233   }
12234   error_num = append_union_all(str);
12235   DBUG_RETURN(error_num);
12236 }
12237 
append_union_all(spider_string * str)12238 int spider_mbase_handler::append_union_all(
12239   spider_string *str
12240 ) {
12241   DBUG_ENTER("spider_mbase_handler::append_union_all");
12242   DBUG_PRINT("info",("spider this=%p", this));
12243   if (str->reserve(SPIDER_SQL_UNION_ALL_LEN))
12244     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12245   str->q_append(SPIDER_SQL_UNION_ALL_STR, SPIDER_SQL_UNION_ALL_LEN);
12246   DBUG_RETURN(0);
12247 }
12248 
append_union_all_end_part(ulong sql_type)12249 int spider_mbase_handler::append_union_all_end_part(
12250   ulong sql_type
12251 ) {
12252   int error_num;
12253   spider_string *str;
12254   DBUG_ENTER("spider_mbase_handler::append_union_all_end_part");
12255   DBUG_PRINT("info",("spider this=%p", this));
12256   switch (sql_type)
12257   {
12258     case SPIDER_SQL_TYPE_SELECT_SQL:
12259       str = &sql;
12260       break;
12261     default:
12262       DBUG_RETURN(0);
12263   }
12264   error_num = append_union_all_end(str);
12265   DBUG_RETURN(error_num);
12266 }
12267 
append_union_all_end(spider_string * str)12268 int spider_mbase_handler::append_union_all_end(
12269   spider_string *str
12270 ) {
12271   DBUG_ENTER("spider_mbase_handler::append_union_all_end");
12272   DBUG_PRINT("info",("spider this=%p", this));
12273   str->length(str->length() -
12274     SPIDER_SQL_UNION_ALL_LEN + SPIDER_SQL_CLOSE_PAREN_LEN);
12275   DBUG_RETURN(0);
12276 }
12277 
append_multi_range_cnt_part(ulong sql_type,uint multi_range_cnt,bool with_comma)12278 int spider_mbase_handler::append_multi_range_cnt_part(
12279   ulong sql_type,
12280   uint multi_range_cnt,
12281   bool with_comma
12282 ) {
12283   int error_num;
12284   spider_string *str;
12285   DBUG_ENTER("spider_mbase_handler::append_multi_range_cnt_part");
12286   DBUG_PRINT("info",("spider this=%p", this));
12287   switch (sql_type)
12288   {
12289     case SPIDER_SQL_TYPE_SELECT_SQL:
12290       str = &sql;
12291       break;
12292     case SPIDER_SQL_TYPE_TMP_SQL:
12293       str = &tmp_sql;
12294       break;
12295     default:
12296       DBUG_RETURN(0);
12297   }
12298   error_num = append_multi_range_cnt(str, multi_range_cnt, with_comma);
12299   DBUG_RETURN(error_num);
12300 }
12301 
append_multi_range_cnt(spider_string * str,uint multi_range_cnt,bool with_comma)12302 int spider_mbase_handler::append_multi_range_cnt(
12303   spider_string *str,
12304   uint multi_range_cnt,
12305   bool with_comma
12306 ) {
12307   int range_cnt_length;
12308   char range_cnt_str[SPIDER_SQL_INT_LEN];
12309   DBUG_ENTER("spider_mbase_handler::append_multi_range_cnt");
12310   DBUG_PRINT("info",("spider this=%p", this));
12311   range_cnt_length = my_sprintf(range_cnt_str, (range_cnt_str, "%u",
12312     multi_range_cnt));
12313   if (with_comma)
12314   {
12315     if (str->reserve(range_cnt_length + SPIDER_SQL_COMMA_LEN))
12316       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12317     str->q_append(range_cnt_str, range_cnt_length);
12318     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
12319   } else {
12320     if (str->reserve(range_cnt_length))
12321       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12322     str->q_append(range_cnt_str, range_cnt_length);
12323   }
12324   DBUG_RETURN(0);
12325 }
12326 
append_multi_range_cnt_with_name_part(ulong sql_type,uint multi_range_cnt)12327 int spider_mbase_handler::append_multi_range_cnt_with_name_part(
12328   ulong sql_type,
12329   uint multi_range_cnt
12330 ) {
12331   int error_num;
12332   spider_string *str;
12333   DBUG_ENTER("spider_mbase_handler::append_multi_range_cnt_with_name_part");
12334   DBUG_PRINT("info",("spider this=%p", this));
12335   switch (sql_type)
12336   {
12337     case SPIDER_SQL_TYPE_SELECT_SQL:
12338       str = &sql;
12339       break;
12340     case SPIDER_SQL_TYPE_TMP_SQL:
12341       str = &tmp_sql;
12342       break;
12343     default:
12344       DBUG_RETURN(0);
12345   }
12346   error_num = append_multi_range_cnt_with_name(str, multi_range_cnt);
12347   DBUG_RETURN(error_num);
12348 }
12349 
append_multi_range_cnt_with_name(spider_string * str,uint multi_range_cnt)12350 int spider_mbase_handler::append_multi_range_cnt_with_name(
12351   spider_string *str,
12352   uint multi_range_cnt
12353 ) {
12354   int range_cnt_length;
12355   char range_cnt_str[SPIDER_SQL_INT_LEN];
12356   DBUG_ENTER("spider_mbase_handler::append_multi_range_cnt_with_name");
12357   DBUG_PRINT("info",("spider this=%p", this));
12358   range_cnt_length = my_sprintf(range_cnt_str, (range_cnt_str, "%u",
12359     multi_range_cnt));
12360   if (str->reserve(range_cnt_length + SPIDER_SQL_SPACE_LEN +
12361     SPIDER_SQL_ID_LEN + SPIDER_SQL_COMMA_LEN))
12362     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12363   str->q_append(range_cnt_str, range_cnt_length);
12364   str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
12365   str->q_append(SPIDER_SQL_ID_STR, SPIDER_SQL_ID_LEN);
12366   str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
12367   DBUG_RETURN(0);
12368 }
12369 
append_open_handler_part(ulong sql_type,uint handler_id,SPIDER_CONN * conn,int link_idx)12370 int spider_mbase_handler::append_open_handler_part(
12371   ulong sql_type,
12372   uint handler_id,
12373   SPIDER_CONN *conn,
12374   int link_idx
12375 ) {
12376   int error_num;
12377   spider_string *str;
12378   DBUG_ENTER("spider_mbase_handler::append_open_handler_part");
12379   DBUG_PRINT("info",("spider this=%p", this));
12380   switch (sql_type)
12381   {
12382     case SPIDER_SQL_TYPE_HANDLER:
12383       str = &ha_sql;
12384       break;
12385     default:
12386       DBUG_RETURN(0);
12387   }
12388   error_num = append_open_handler(str, handler_id, conn, link_idx);
12389   exec_ha_sql = str;
12390   DBUG_RETURN(error_num);
12391 }
12392 
append_open_handler(spider_string * str,uint handler_id,SPIDER_CONN * conn,int link_idx)12393 int spider_mbase_handler::append_open_handler(
12394   spider_string *str,
12395   uint handler_id,
12396   SPIDER_CONN *conn,
12397   int link_idx
12398 ) {
12399   int error_num;
12400   DBUG_ENTER("spider_mbase_handler::append_open_handler");
12401   DBUG_PRINT("info",("spider this=%p", this));
12402   DBUG_PRINT("info",("spider link_idx=%d", link_idx));
12403   DBUG_PRINT("info",("spider m_handler_cid=%s",
12404     spider->m_handler_cid[link_idx]));
12405   if (str->reserve(SPIDER_SQL_HANDLER_LEN))
12406   {
12407     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12408   }
12409   str->q_append(SPIDER_SQL_HANDLER_STR, SPIDER_SQL_HANDLER_LEN);
12410   if ((error_num = mysql_share->append_table_name(str,
12411       spider->conn_link_idx[link_idx])))
12412     DBUG_RETURN(error_num);
12413   if (str->reserve(SPIDER_SQL_OPEN_LEN + SPIDER_SQL_AS_LEN +
12414     SPIDER_SQL_HANDLER_CID_LEN))
12415   {
12416     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12417   }
12418   str->q_append(SPIDER_SQL_OPEN_STR, SPIDER_SQL_OPEN_LEN);
12419   str->q_append(SPIDER_SQL_AS_STR, SPIDER_SQL_AS_LEN);
12420   str->q_append(spider->m_handler_cid[link_idx], SPIDER_SQL_HANDLER_CID_LEN);
12421   DBUG_RETURN(0);
12422 }
12423 
append_close_handler_part(ulong sql_type,int link_idx)12424 int spider_mbase_handler::append_close_handler_part(
12425   ulong sql_type,
12426   int link_idx
12427 ) {
12428   int error_num;
12429   spider_string *str;
12430   DBUG_ENTER("spider_mbase_handler::append_close_handler_part");
12431   DBUG_PRINT("info",("spider this=%p", this));
12432   switch (sql_type)
12433   {
12434     case SPIDER_SQL_TYPE_HANDLER:
12435       str = &ha_sql;
12436       break;
12437     default:
12438       DBUG_RETURN(0);
12439   }
12440   error_num = append_close_handler(str, link_idx);
12441   exec_ha_sql = str;
12442   DBUG_RETURN(error_num);
12443 }
12444 
append_close_handler(spider_string * str,int link_idx)12445 int spider_mbase_handler::append_close_handler(
12446   spider_string *str,
12447   int link_idx
12448 ) {
12449   DBUG_ENTER("spider_mbase_handler::append_close_handler");
12450   DBUG_PRINT("info",("spider this=%p", this));
12451   if (str->reserve(SPIDER_SQL_HANDLER_LEN + SPIDER_SQL_CLOSE_LEN +
12452     SPIDER_SQL_HANDLER_CID_LEN))
12453     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12454   str->q_append(SPIDER_SQL_HANDLER_STR, SPIDER_SQL_HANDLER_LEN);
12455   str->q_append(spider->m_handler_cid[link_idx],
12456     SPIDER_SQL_HANDLER_CID_LEN);
12457   str->q_append(SPIDER_SQL_CLOSE_STR, SPIDER_SQL_CLOSE_LEN);
12458   DBUG_RETURN(0);
12459 }
12460 
append_insert_terminator_part(ulong sql_type)12461 int spider_mbase_handler::append_insert_terminator_part(
12462   ulong sql_type
12463 ) {
12464   int error_num;
12465   spider_string *str;
12466   DBUG_ENTER("spider_mbase_handler::append_insert_terminator_part");
12467   DBUG_PRINT("info",("spider this=%p", this));
12468   switch (sql_type)
12469   {
12470     case SPIDER_SQL_TYPE_INSERT_SQL:
12471       str = &insert_sql;
12472       break;
12473     default:
12474       DBUG_RETURN(0);
12475   }
12476   error_num = append_insert_terminator(str);
12477   DBUG_RETURN(error_num);
12478 }
12479 
append_insert_terminator(spider_string * str)12480 int spider_mbase_handler::append_insert_terminator(
12481   spider_string *str
12482 ) {
12483   DBUG_ENTER("spider_mbase_handler::append_insert_terminator");
12484   DBUG_PRINT("info",("spider this=%p", this));
12485   DBUG_PRINT("info",("spider dup_update_sql.length=%u", dup_update_sql.length()));
12486   if (
12487     spider->result_list.insert_dup_update_pushdown &&
12488     dup_update_sql.length()
12489   ) {
12490     DBUG_PRINT("info",("spider add duplicate key update"));
12491     direct_insert_kind = SPIDER_SQL_DIRECT_INSERT_KIND_DUP_UPDATE;
12492     str->length(str->length() - SPIDER_SQL_COMMA_LEN);
12493     if (str->reserve(SPIDER_SQL_DUPLICATE_KEY_UPDATE_LEN +
12494       dup_update_sql.length()))
12495     {
12496       str->length(0);
12497       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12498     }
12499     str->q_append(SPIDER_SQL_DUPLICATE_KEY_UPDATE_STR,
12500       SPIDER_SQL_DUPLICATE_KEY_UPDATE_LEN);
12501     if (str->append(dup_update_sql))
12502       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12503   } else {
12504     str->length(str->length() - SPIDER_SQL_COMMA_LEN);
12505   }
12506   DBUG_RETURN(0);
12507 }
12508 
append_insert_values_part(ulong sql_type)12509 int spider_mbase_handler::append_insert_values_part(
12510   ulong sql_type
12511 ) {
12512   int error_num;
12513   spider_string *str;
12514   DBUG_ENTER("spider_mbase_handler::append_insert_values_part");
12515   DBUG_PRINT("info",("spider this=%p", this));
12516   switch (sql_type)
12517   {
12518     case SPIDER_SQL_TYPE_INSERT_SQL:
12519       str = &insert_sql;
12520       break;
12521     default:
12522       DBUG_RETURN(0);
12523   }
12524   error_num = append_insert_values(str);
12525   DBUG_RETURN(error_num);
12526 }
12527 
append_insert_values(spider_string * str)12528 int spider_mbase_handler::append_insert_values(
12529   spider_string *str
12530 ) {
12531   SPIDER_SHARE *share = spider->share;
12532   TABLE *table = spider->get_table();
12533   Field **field;
12534   bool add_value = FALSE;
12535   DBUG_ENTER("spider_mbase_handler::append_insert_values");
12536   DBUG_PRINT("info",("spider this=%p", this));
12537   if (str->reserve(SPIDER_SQL_OPEN_PAREN_LEN))
12538   {
12539     str->length(0);
12540     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12541   }
12542   str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
12543   for (field = table->field; *field; field++)
12544   {
12545     DBUG_PRINT("info",("spider field_index=%u", (*field)->field_index));
12546     if (
12547       bitmap_is_set(table->write_set, (*field)->field_index) ||
12548       bitmap_is_set(table->read_set, (*field)->field_index)
12549     ) {
12550 #ifndef DBUG_OFF
12551       MY_BITMAP *tmp_map =
12552         dbug_tmp_use_all_columns(table, &table->read_set);
12553 #endif
12554       add_value = TRUE;
12555       DBUG_PRINT("info",("spider is_null()=%s",
12556         (*field)->is_null() ? "TRUE" : "FALSE"));
12557       DBUG_PRINT("info",("spider table->next_number_field=%p",
12558         table->next_number_field));
12559       DBUG_PRINT("info",("spider *field=%p", *field));
12560       DBUG_PRINT("info",("spider force_auto_increment=%s",
12561         (table->next_number_field && spider->force_auto_increment) ?
12562         "TRUE" : "FALSE"));
12563       if (
12564         (*field)->is_null() ||
12565         (
12566           table->next_number_field == *field &&
12567           !table->auto_increment_field_not_null &&
12568           !spider->force_auto_increment
12569         )
12570       ) {
12571         if (str->reserve(SPIDER_SQL_NULL_LEN + SPIDER_SQL_COMMA_LEN))
12572         {
12573 #ifndef DBUG_OFF
12574           dbug_tmp_restore_column_map(&table->read_set, tmp_map);
12575 #endif
12576           str->length(0);
12577           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12578         }
12579         str->q_append(SPIDER_SQL_NULL_STR, SPIDER_SQL_NULL_LEN);
12580       } else {
12581         if (
12582           spider_db_mbase_utility->
12583             append_column_value(spider, str, *field, NULL,
12584               share->access_charset) ||
12585           str->reserve(SPIDER_SQL_COMMA_LEN)
12586         ) {
12587 #ifndef DBUG_OFF
12588           dbug_tmp_restore_column_map(&table->read_set, tmp_map);
12589 #endif
12590           str->length(0);
12591           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12592         }
12593       }
12594       str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
12595 #ifndef DBUG_OFF
12596       dbug_tmp_restore_column_map(&table->read_set, tmp_map);
12597 #endif
12598     }
12599   }
12600   if (add_value)
12601     str->length(str->length() - SPIDER_SQL_COMMA_LEN);
12602   if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN + SPIDER_SQL_COMMA_LEN))
12603   {
12604     str->length(0);
12605     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12606   }
12607   str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
12608   str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
12609   DBUG_RETURN(0);
12610 }
12611 
append_into_part(ulong sql_type)12612 int spider_mbase_handler::append_into_part(
12613   ulong sql_type
12614 ) {
12615   int error_num;
12616   spider_string *str;
12617   DBUG_ENTER("spider_mbase_handler::append_into_part");
12618   DBUG_PRINT("info",("spider this=%p", this));
12619   switch (sql_type)
12620   {
12621     case SPIDER_SQL_TYPE_INSERT_SQL:
12622       str = &insert_sql;
12623       break;
12624     default:
12625       DBUG_RETURN(0);
12626   }
12627   error_num = append_into(str);
12628   DBUG_RETURN(error_num);
12629 }
12630 
append_into(spider_string * str)12631 int spider_mbase_handler::append_into(
12632   spider_string *str
12633 ) {
12634   const TABLE *table = spider->get_table();
12635   Field **field;
12636   uint field_name_length = 0;
12637   DBUG_ENTER("spider_mbase_handler::append_into");
12638   DBUG_PRINT("info",("spider this=%p", this));
12639   if (str->reserve(SPIDER_SQL_INTO_LEN + mysql_share->db_nm_max_length +
12640     SPIDER_SQL_DOT_LEN + mysql_share->table_nm_max_length +
12641     /* SPIDER_SQL_NAME_QUOTE_LEN */ 4 + SPIDER_SQL_OPEN_PAREN_LEN))
12642     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12643   str->q_append(SPIDER_SQL_INTO_STR, SPIDER_SQL_INTO_LEN);
12644   insert_table_name_pos = str->length();
12645   append_table_name_with_adjusting(str, first_link_idx,
12646     SPIDER_SQL_TYPE_INSERT_SQL);
12647   str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
12648   for (field = table->field; *field; field++)
12649   {
12650     if (
12651       bitmap_is_set(table->write_set, (*field)->field_index) ||
12652       bitmap_is_set(table->read_set, (*field)->field_index)
12653     ) {
12654       field_name_length =
12655         mysql_share->column_name_str[(*field)->field_index].length();
12656       if (str->reserve(field_name_length +
12657         /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
12658         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12659       mysql_share->append_column_name(str, (*field)->field_index);
12660       str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
12661     }
12662   }
12663   if (field_name_length)
12664     str->length(str->length() - SPIDER_SQL_COMMA_LEN);
12665   if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN + SPIDER_SQL_VALUES_LEN))
12666     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12667   str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
12668   str->q_append(SPIDER_SQL_VALUES_STR, SPIDER_SQL_VALUES_LEN);
12669   insert_pos = str->length();
12670   DBUG_RETURN(0);
12671 }
12672 
set_insert_to_pos(ulong sql_type)12673 void spider_mbase_handler::set_insert_to_pos(
12674   ulong sql_type
12675 ) {
12676   DBUG_ENTER("spider_mbase_handler::set_insert_to_pos");
12677   switch (sql_type)
12678   {
12679     case SPIDER_SQL_TYPE_INSERT_SQL:
12680       insert_sql.length(insert_pos);
12681       break;
12682     default:
12683       DBUG_ASSERT(0);
12684       break;
12685   }
12686   DBUG_VOID_RETURN;
12687 }
12688 
append_from_part(ulong sql_type,int link_idx)12689 int spider_mbase_handler::append_from_part(
12690   ulong sql_type,
12691   int link_idx
12692 ) {
12693   int error_num;
12694   spider_string *str;
12695   DBUG_ENTER("spider_mbase_handler::append_from_part");
12696   DBUG_PRINT("info",("spider this=%p", this));
12697   switch (sql_type)
12698   {
12699     case SPIDER_SQL_TYPE_HANDLER:
12700       str = &ha_sql;
12701       break;
12702     case SPIDER_SQL_TYPE_UPDATE_SQL:
12703     case SPIDER_SQL_TYPE_DELETE_SQL:
12704     case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
12705       str = &update_sql;
12706       break;
12707     default:
12708       str = &sql;
12709       break;
12710   }
12711   error_num = append_from(str, sql_type, link_idx);
12712   DBUG_RETURN(error_num);
12713 }
12714 
append_from(spider_string * str,ulong sql_type,int link_idx)12715 int spider_mbase_handler::append_from(
12716   spider_string *str,
12717   ulong sql_type,
12718   int link_idx
12719 ) {
12720   DBUG_ENTER("spider_mbase_handler::append_from");
12721   DBUG_PRINT("info",("spider this=%p", this));
12722   DBUG_PRINT("info",("spider link_idx=%d", link_idx));
12723   int error_num = 0;
12724   if (sql_type == SPIDER_SQL_TYPE_HANDLER)
12725   {
12726     ha_table_name_pos = str->length();
12727     DBUG_PRINT("info",("spider ha_table_name_pos=%u", ha_table_name_pos));
12728     ha_sql_handler_id = spider->m_handler_id[link_idx];
12729     DBUG_PRINT("info",("spider ha_sql_handler_id=%u", ha_sql_handler_id));
12730     if (str->reserve(SPIDER_SQL_HANDLER_CID_LEN))
12731       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12732     str->q_append(spider->m_handler_cid[link_idx], SPIDER_SQL_HANDLER_CID_LEN);
12733     DBUG_PRINT("info",("spider m_handler_cid=%s",
12734       spider->m_handler_cid[link_idx]));
12735   } else {
12736     if (str->reserve(SPIDER_SQL_FROM_LEN + mysql_share->db_nm_max_length +
12737       SPIDER_SQL_DOT_LEN + mysql_share->table_nm_max_length +
12738       /* SPIDER_SQL_NAME_QUOTE_LEN */ 4 + SPIDER_SQL_OPEN_PAREN_LEN))
12739       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12740     str->q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN);
12741     table_name_pos = str->length();
12742     append_table_name_with_adjusting(str, link_idx, sql_type);
12743     if(spider_param_index_hint_pushdown(spider->trx->thd))
12744     {
12745       if((error_num = append_index_hint(str, link_idx, sql_type)))
12746       {
12747         DBUG_RETURN(error_num);
12748       }
12749     }
12750   }
12751   DBUG_RETURN(0);
12752 }
12753 
append_flush_tables_part(ulong sql_type,int link_idx,bool lock)12754 int spider_mbase_handler::append_flush_tables_part(
12755   ulong sql_type,
12756   int link_idx,
12757   bool lock
12758 ) {
12759   int error_num;
12760   spider_string *str;
12761   DBUG_ENTER("spider_mbase_handler::append_flush_tables_part");
12762   DBUG_PRINT("info",("spider this=%p", this));
12763   switch (sql_type)
12764   {
12765     case SPIDER_SQL_TYPE_OTHER_SQL:
12766       str = &spider->result_list.sqls[link_idx];
12767       break;
12768     default:
12769       DBUG_RETURN(0);
12770   }
12771   error_num = append_flush_tables(str, link_idx, lock);
12772   DBUG_RETURN(error_num);
12773 }
12774 
append_flush_tables(spider_string * str,int link_idx,bool lock)12775 int spider_mbase_handler::append_flush_tables(
12776   spider_string *str,
12777   int link_idx,
12778   bool lock
12779 ) {
12780   DBUG_ENTER("spider_mbase_handler::append_flush_tables");
12781   DBUG_PRINT("info",("spider this=%p", this));
12782   if (lock)
12783   {
12784     if (str->reserve(SPIDER_SQL_FLUSH_TABLES_LEN +
12785       SPIDER_SQL_WITH_READ_LOCK_LEN))
12786       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12787     str->q_append(SPIDER_SQL_FLUSH_TABLES_STR, SPIDER_SQL_FLUSH_TABLES_LEN);
12788     str->q_append(SPIDER_SQL_WITH_READ_LOCK_STR,
12789       SPIDER_SQL_WITH_READ_LOCK_LEN);
12790   } else {
12791     if (str->reserve(SPIDER_SQL_FLUSH_TABLES_LEN))
12792       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12793     str->q_append(SPIDER_SQL_FLUSH_TABLES_STR, SPIDER_SQL_FLUSH_TABLES_LEN);
12794   }
12795   DBUG_RETURN(0);
12796 }
12797 
append_optimize_table_part(ulong sql_type,int link_idx)12798 int spider_mbase_handler::append_optimize_table_part(
12799   ulong sql_type,
12800   int link_idx
12801 ) {
12802   int error_num;
12803   spider_string *str;
12804   DBUG_ENTER("spider_mbase_handler::append_optimize_table_part");
12805   DBUG_PRINT("info",("spider this=%p", this));
12806   switch (sql_type)
12807   {
12808     case SPIDER_SQL_TYPE_OTHER_SQL:
12809       str = &spider->result_list.sqls[link_idx];
12810       break;
12811     default:
12812       DBUG_RETURN(0);
12813   }
12814   error_num = append_optimize_table(str, link_idx);
12815   DBUG_RETURN(error_num);
12816 }
12817 
append_optimize_table(spider_string * str,int link_idx)12818 int spider_mbase_handler::append_optimize_table(
12819   spider_string *str,
12820   int link_idx
12821 ) {
12822   SPIDER_SHARE *share = spider->share;
12823   int conn_link_idx = spider->conn_link_idx[link_idx];
12824   int local_length = spider_param_internal_optimize_local(spider->trx->thd,
12825     share->internal_optimize_local) * SPIDER_SQL_SQL_LOCAL_LEN;
12826   DBUG_ENTER("spider_mbase_handler::append_optimize_table");
12827   DBUG_PRINT("info",("spider this=%p", this));
12828   if (str->reserve(SPIDER_SQL_SQL_OPTIMIZE_LEN + SPIDER_SQL_SQL_TABLE_LEN +
12829     local_length +
12830     mysql_share->db_names_str[conn_link_idx].length() +
12831     SPIDER_SQL_DOT_LEN +
12832     mysql_share->table_names_str[conn_link_idx].length() +
12833     /* SPIDER_SQL_NAME_QUOTE_LEN */ 4))
12834     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12835   str->q_append(SPIDER_SQL_SQL_OPTIMIZE_STR, SPIDER_SQL_SQL_OPTIMIZE_LEN);
12836   if (local_length)
12837     str->q_append(SPIDER_SQL_SQL_LOCAL_STR, SPIDER_SQL_SQL_LOCAL_LEN);
12838   str->q_append(SPIDER_SQL_SQL_TABLE_STR, SPIDER_SQL_SQL_TABLE_LEN);
12839   mysql_share->append_table_name(str, conn_link_idx);
12840   DBUG_RETURN(0);
12841 }
12842 
append_analyze_table_part(ulong sql_type,int link_idx)12843 int spider_mbase_handler::append_analyze_table_part(
12844   ulong sql_type,
12845   int link_idx
12846 ) {
12847   int error_num;
12848   spider_string *str;
12849   DBUG_ENTER("spider_mbase_handler::append_analyze_table_part");
12850   DBUG_PRINT("info",("spider this=%p", this));
12851   switch (sql_type)
12852   {
12853     case SPIDER_SQL_TYPE_OTHER_SQL:
12854       str = &spider->result_list.sqls[link_idx];
12855       break;
12856     default:
12857       DBUG_RETURN(0);
12858   }
12859   error_num = append_analyze_table(str, link_idx);
12860   DBUG_RETURN(error_num);
12861 }
12862 
append_analyze_table(spider_string * str,int link_idx)12863 int spider_mbase_handler::append_analyze_table(
12864   spider_string *str,
12865   int link_idx
12866 ) {
12867   SPIDER_SHARE *share = spider->share;
12868   int conn_link_idx = spider->conn_link_idx[link_idx];
12869   int local_length = spider_param_internal_optimize_local(spider->trx->thd,
12870     share->internal_optimize_local) * SPIDER_SQL_SQL_LOCAL_LEN;
12871   DBUG_ENTER("spider_mbase_handler::append_analyze_table");
12872   DBUG_PRINT("info",("spider this=%p", this));
12873   if (str->reserve(SPIDER_SQL_SQL_ANALYZE_LEN + SPIDER_SQL_SQL_TABLE_LEN +
12874     local_length +
12875     mysql_share->db_names_str[conn_link_idx].length() +
12876     SPIDER_SQL_DOT_LEN +
12877     mysql_share->table_names_str[conn_link_idx].length() +
12878     /* SPIDER_SQL_NAME_QUOTE_LEN */ 4))
12879     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12880   str->q_append(SPIDER_SQL_SQL_ANALYZE_STR, SPIDER_SQL_SQL_ANALYZE_LEN);
12881   if (local_length)
12882     str->q_append(SPIDER_SQL_SQL_LOCAL_STR, SPIDER_SQL_SQL_LOCAL_LEN);
12883   str->q_append(SPIDER_SQL_SQL_TABLE_STR, SPIDER_SQL_SQL_TABLE_LEN);
12884   mysql_share->append_table_name(str, conn_link_idx);
12885   DBUG_RETURN(0);
12886 }
12887 
append_repair_table_part(ulong sql_type,int link_idx,HA_CHECK_OPT * check_opt)12888 int spider_mbase_handler::append_repair_table_part(
12889   ulong sql_type,
12890   int link_idx,
12891   HA_CHECK_OPT* check_opt
12892 ) {
12893   int error_num;
12894   spider_string *str;
12895   DBUG_ENTER("spider_mbase_handler::append_repair_table_part");
12896   DBUG_PRINT("info",("spider this=%p", this));
12897   switch (sql_type)
12898   {
12899     case SPIDER_SQL_TYPE_OTHER_SQL:
12900       str = &spider->result_list.sqls[link_idx];
12901       break;
12902     default:
12903       DBUG_RETURN(0);
12904   }
12905   error_num = append_repair_table(str, link_idx, check_opt);
12906   DBUG_RETURN(error_num);
12907 }
12908 
append_repair_table(spider_string * str,int link_idx,HA_CHECK_OPT * check_opt)12909 int spider_mbase_handler::append_repair_table(
12910   spider_string *str,
12911   int link_idx,
12912   HA_CHECK_OPT* check_opt
12913 ) {
12914   SPIDER_SHARE *share = spider->share;
12915   int conn_link_idx = spider->conn_link_idx[link_idx];
12916   int local_length = spider_param_internal_optimize_local(spider->trx->thd,
12917     share->internal_optimize_local) * SPIDER_SQL_SQL_LOCAL_LEN;
12918   DBUG_ENTER("spider_mbase_handler::append_repair_table");
12919   DBUG_PRINT("info",("spider this=%p", this));
12920   if (str->reserve(SPIDER_SQL_SQL_REPAIR_LEN + SPIDER_SQL_SQL_TABLE_LEN +
12921     local_length +
12922     mysql_share->db_names_str[conn_link_idx].length() +
12923     SPIDER_SQL_DOT_LEN +
12924     mysql_share->table_names_str[conn_link_idx].length() +
12925     /* SPIDER_SQL_NAME_QUOTE_LEN */ 4))
12926     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12927   str->q_append(SPIDER_SQL_SQL_REPAIR_STR, SPIDER_SQL_SQL_REPAIR_LEN);
12928   if (local_length)
12929     str->q_append(SPIDER_SQL_SQL_LOCAL_STR, SPIDER_SQL_SQL_LOCAL_LEN);
12930   str->q_append(SPIDER_SQL_SQL_TABLE_STR, SPIDER_SQL_SQL_TABLE_LEN);
12931   mysql_share->append_table_name(str, conn_link_idx);
12932   if (check_opt->flags & T_QUICK)
12933   {
12934     if (str->reserve(SPIDER_SQL_SQL_QUICK_LEN))
12935       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12936     str->q_append(SPIDER_SQL_SQL_QUICK_STR, SPIDER_SQL_SQL_QUICK_LEN);
12937   }
12938   if (check_opt->flags & T_EXTEND)
12939   {
12940     if (str->reserve(SPIDER_SQL_SQL_EXTENDED_LEN))
12941       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12942     str->q_append(SPIDER_SQL_SQL_EXTENDED_STR, SPIDER_SQL_SQL_EXTENDED_LEN);
12943   }
12944   if (check_opt->sql_flags & TT_USEFRM)
12945   {
12946     if (str->reserve(SPIDER_SQL_SQL_USE_FRM_LEN))
12947       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12948     str->q_append(SPIDER_SQL_SQL_USE_FRM_STR, SPIDER_SQL_SQL_USE_FRM_LEN);
12949   }
12950   DBUG_RETURN(0);
12951 }
12952 
append_check_table_part(ulong sql_type,int link_idx,HA_CHECK_OPT * check_opt)12953 int spider_mbase_handler::append_check_table_part(
12954   ulong sql_type,
12955   int link_idx,
12956   HA_CHECK_OPT* check_opt
12957 ) {
12958   int error_num;
12959   spider_string *str;
12960   DBUG_ENTER("spider_mbase_handler::append_check_table_part");
12961   DBUG_PRINT("info",("spider this=%p", this));
12962   switch (sql_type)
12963   {
12964     case SPIDER_SQL_TYPE_OTHER_SQL:
12965       str = &spider->result_list.sqls[link_idx];
12966       break;
12967     default:
12968       DBUG_RETURN(0);
12969   }
12970   error_num = append_check_table(str, link_idx, check_opt);
12971   DBUG_RETURN(error_num);
12972 }
12973 
append_check_table(spider_string * str,int link_idx,HA_CHECK_OPT * check_opt)12974 int spider_mbase_handler::append_check_table(
12975   spider_string *str,
12976   int link_idx,
12977   HA_CHECK_OPT* check_opt
12978 ) {
12979   int conn_link_idx = spider->conn_link_idx[link_idx];
12980   DBUG_ENTER("spider_mbase_handler::append_check_table");
12981   DBUG_PRINT("info",("spider this=%p", this));
12982   if (str->reserve(SPIDER_SQL_SQL_CHECK_TABLE_LEN +
12983     mysql_share->db_names_str[conn_link_idx].length() +
12984     SPIDER_SQL_DOT_LEN +
12985     mysql_share->table_names_str[conn_link_idx].length() +
12986     /* SPIDER_SQL_NAME_QUOTE_LEN */ 4))
12987     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12988   str->q_append(SPIDER_SQL_SQL_CHECK_TABLE_STR,
12989     SPIDER_SQL_SQL_CHECK_TABLE_LEN);
12990   mysql_share->append_table_name(str, conn_link_idx);
12991   if (check_opt->flags & T_QUICK)
12992   {
12993     if (str->reserve(SPIDER_SQL_SQL_QUICK_LEN))
12994       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12995     str->q_append(SPIDER_SQL_SQL_QUICK_STR, SPIDER_SQL_SQL_QUICK_LEN);
12996   }
12997   if (check_opt->flags & T_FAST)
12998   {
12999     if (str->reserve(SPIDER_SQL_SQL_FAST_LEN))
13000       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13001     str->q_append(SPIDER_SQL_SQL_FAST_STR, SPIDER_SQL_SQL_FAST_LEN);
13002   }
13003   if (check_opt->flags & T_MEDIUM)
13004   {
13005     if (str->reserve(SPIDER_SQL_SQL_MEDIUM_LEN))
13006       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13007     str->q_append(SPIDER_SQL_SQL_MEDIUM_STR, SPIDER_SQL_SQL_MEDIUM_LEN);
13008   }
13009   if (check_opt->flags & T_EXTEND)
13010   {
13011     if (str->reserve(SPIDER_SQL_SQL_EXTENDED_LEN))
13012       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13013     str->q_append(SPIDER_SQL_SQL_EXTENDED_STR, SPIDER_SQL_SQL_EXTENDED_LEN);
13014   }
13015   DBUG_RETURN(0);
13016 }
13017 
append_enable_keys_part(ulong sql_type,int link_idx)13018 int spider_mbase_handler::append_enable_keys_part(
13019   ulong sql_type,
13020   int link_idx
13021 ) {
13022   int error_num;
13023   spider_string *str;
13024   DBUG_ENTER("spider_mbase_handler::append_enable_keys_part");
13025   DBUG_PRINT("info",("spider this=%p", this));
13026   switch (sql_type)
13027   {
13028     case SPIDER_SQL_TYPE_OTHER_SQL:
13029       str = &spider->result_list.sqls[link_idx];
13030       break;
13031     default:
13032       DBUG_RETURN(0);
13033   }
13034   error_num = append_enable_keys(str, link_idx);
13035   DBUG_RETURN(error_num);
13036 }
13037 
append_enable_keys(spider_string * str,int link_idx)13038 int spider_mbase_handler::append_enable_keys(
13039   spider_string *str,
13040   int link_idx
13041 ) {
13042   int conn_link_idx = spider->conn_link_idx[link_idx];
13043   DBUG_ENTER("spider_mbase_handler::append_enable_keys");
13044   DBUG_PRINT("info",("spider this=%p", this));
13045   if (str->reserve(SPIDER_SQL_SQL_ALTER_TABLE_LEN +
13046     mysql_share->db_names_str[conn_link_idx].length() +
13047     SPIDER_SQL_DOT_LEN +
13048     mysql_share->table_names_str[conn_link_idx].length() +
13049     /* SPIDER_SQL_NAME_QUOTE_LEN */ 4 + SPIDER_SQL_SQL_ENABLE_KEYS_LEN))
13050     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13051   str->q_append(SPIDER_SQL_SQL_ALTER_TABLE_STR,
13052     SPIDER_SQL_SQL_ALTER_TABLE_LEN);
13053   mysql_share->append_table_name(str, conn_link_idx);
13054   str->q_append(SPIDER_SQL_SQL_ENABLE_KEYS_STR,
13055     SPIDER_SQL_SQL_ENABLE_KEYS_LEN);
13056   DBUG_RETURN(0);
13057 }
13058 
append_disable_keys_part(ulong sql_type,int link_idx)13059 int spider_mbase_handler::append_disable_keys_part(
13060   ulong sql_type,
13061   int link_idx
13062 ) {
13063   int error_num;
13064   spider_string *str;
13065   DBUG_ENTER("spider_mbase_handler::append_disable_keys_part");
13066   DBUG_PRINT("info",("spider this=%p", this));
13067   switch (sql_type)
13068   {
13069     case SPIDER_SQL_TYPE_OTHER_SQL:
13070       str = &spider->result_list.sqls[link_idx];
13071       break;
13072     default:
13073       DBUG_RETURN(0);
13074   }
13075   error_num = append_disable_keys(str, link_idx);
13076   DBUG_RETURN(error_num);
13077 }
13078 
append_disable_keys(spider_string * str,int link_idx)13079 int spider_mbase_handler::append_disable_keys(
13080   spider_string *str,
13081   int link_idx
13082 ) {
13083   int conn_link_idx = spider->conn_link_idx[link_idx];
13084   DBUG_ENTER("spider_mbase_handler::append_disable_keys");
13085   DBUG_PRINT("info",("spider this=%p", this));
13086   if (str->reserve(SPIDER_SQL_SQL_ALTER_TABLE_LEN +
13087     mysql_share->db_names_str[conn_link_idx].length() +
13088     SPIDER_SQL_DOT_LEN +
13089     mysql_share->table_names_str[conn_link_idx].length() +
13090     /* SPIDER_SQL_NAME_QUOTE_LEN */ 4 + SPIDER_SQL_SQL_DISABLE_KEYS_LEN))
13091     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13092   str->q_append(SPIDER_SQL_SQL_ALTER_TABLE_STR,
13093     SPIDER_SQL_SQL_ALTER_TABLE_LEN);
13094   mysql_share->append_table_name(str, conn_link_idx);
13095   str->q_append(SPIDER_SQL_SQL_DISABLE_KEYS_STR,
13096     SPIDER_SQL_SQL_DISABLE_KEYS_LEN);
13097   DBUG_RETURN(0);
13098 }
13099 
append_delete_all_rows_part(ulong sql_type)13100 int spider_mbase_handler::append_delete_all_rows_part(
13101   ulong sql_type
13102 ) {
13103   int error_num;
13104   spider_string *str;
13105   DBUG_ENTER("spider_mbase_handler::append_delete_all_rows_part");
13106   DBUG_PRINT("info",("spider this=%p", this));
13107   switch (sql_type)
13108   {
13109     case SPIDER_SQL_TYPE_DELETE_SQL:
13110       str = &update_sql;
13111       break;
13112     default:
13113       DBUG_RETURN(0);
13114   }
13115   error_num = append_delete_all_rows(str, sql_type);
13116   DBUG_RETURN(error_num);
13117 }
13118 
append_delete_all_rows(spider_string * str,ulong sql_type)13119 int spider_mbase_handler::append_delete_all_rows(
13120   spider_string *str,
13121   ulong sql_type
13122 ) {
13123   int error_num;
13124   DBUG_ENTER("spider_mbase_handler::append_delete_all_rows");
13125   DBUG_PRINT("info",("spider this=%p", this));
13126   if (spider->sql_command == SQLCOM_TRUNCATE)
13127   {
13128     if ((error_num = append_truncate(str, sql_type, first_link_idx)))
13129       DBUG_RETURN(error_num);
13130   } else {
13131     if (
13132       (error_num = append_delete(str)) ||
13133       (error_num = append_from(str, sql_type, first_link_idx))
13134     )
13135       DBUG_RETURN(error_num);
13136   }
13137   DBUG_RETURN(0);
13138 }
13139 
append_truncate(spider_string * str,ulong sql_type,int link_idx)13140 int spider_mbase_handler::append_truncate(
13141   spider_string *str,
13142   ulong sql_type,
13143   int link_idx
13144 ) {
13145   DBUG_ENTER("spider_mbase_handler::append_truncate");
13146   if (str->reserve(SPIDER_SQL_TRUNCATE_TABLE_LEN +
13147     mysql_share->db_nm_max_length +
13148     SPIDER_SQL_DOT_LEN + mysql_share->table_nm_max_length +
13149     /* SPIDER_SQL_NAME_QUOTE_LEN */ 4 + SPIDER_SQL_OPEN_PAREN_LEN))
13150     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13151   str->q_append(SPIDER_SQL_TRUNCATE_TABLE_STR, SPIDER_SQL_TRUNCATE_TABLE_LEN);
13152   table_name_pos = str->length();
13153   append_table_name_with_adjusting(str, link_idx, sql_type);
13154   DBUG_RETURN(0);
13155 }
13156 
append_explain_select_part(key_range * start_key,key_range * end_key,ulong sql_type,int link_idx)13157 int spider_mbase_handler::append_explain_select_part(
13158   key_range *start_key,
13159   key_range *end_key,
13160   ulong sql_type,
13161   int link_idx
13162 ) {
13163   int error_num;
13164   spider_string *str;
13165   DBUG_ENTER("spider_mbase_handler::append_explain_select_part");
13166   DBUG_PRINT("info",("spider this=%p", this));
13167   switch (sql_type)
13168   {
13169     case SPIDER_SQL_TYPE_OTHER_SQL:
13170       str = &spider->result_list.sqls[link_idx];
13171       break;
13172     default:
13173       DBUG_RETURN(0);
13174   }
13175   error_num =
13176     append_explain_select(str, start_key, end_key, sql_type, link_idx);
13177   DBUG_RETURN(error_num);
13178 }
13179 
append_explain_select(spider_string * str,key_range * start_key,key_range * end_key,ulong sql_type,int link_idx)13180 int spider_mbase_handler::append_explain_select(
13181   spider_string *str,
13182   key_range *start_key,
13183   key_range *end_key,
13184   ulong sql_type,
13185   int link_idx
13186 ) {
13187   int error_num;
13188   DBUG_ENTER("spider_mbase_handler::append_explain_select");
13189   DBUG_PRINT("info",("spider this=%p", this));
13190   if (str->reserve(SPIDER_SQL_EXPLAIN_SELECT_LEN))
13191   {
13192     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13193   }
13194   str->q_append(SPIDER_SQL_EXPLAIN_SELECT_STR, SPIDER_SQL_EXPLAIN_SELECT_LEN);
13195   if (
13196     (error_num = append_from(str, sql_type, link_idx)) ||
13197     (error_num = append_key_where(str, NULL, NULL, start_key, end_key,
13198       sql_type, FALSE))
13199   ) {
13200     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13201   }
13202   DBUG_RETURN(0);
13203 }
13204 
13205 /********************************************************************
13206  * Determine whether the current query's projection list
13207  * consists solely of the specified column.
13208  *
13209  * Params   IN      - field_index:
13210  *                    Field index of the column of interest within
13211  *                    its table.
13212  *
13213  * Returns  TRUE    - if the query's projection list consists
13214  *                    solely of the specified column.
13215  *          FALSE   - otherwise.
13216  ********************************************************************/
is_sole_projection_field(uint16 field_index)13217 bool spider_mbase_handler::is_sole_projection_field(
13218   uint16 field_index
13219 ) {
13220   // Determine whether the projection list consists solely of the field of interest
13221   bool            is_field_in_projection_list = FALSE;
13222   TABLE*          table                       = spider->get_table();
13223   uint16          projection_field_count      = 0;
13224   uint16          projection_field_index;
13225   Field**         field;
13226   DBUG_ENTER( "spider_mbase_handler::is_sole_projection_field" );
13227 
13228   for ( field = table->field; *field ; field++ )
13229   {
13230     projection_field_index = ( *field )->field_index;
13231 
13232     if ( !( minimum_select_bit_is_set( projection_field_index ) ) )
13233     {
13234       // Current field is not in the projection list
13235       continue;
13236     }
13237 
13238     projection_field_count++;
13239 
13240     if ( !is_field_in_projection_list )
13241     {
13242       if ( field_index == projection_field_index )
13243       {
13244         // Field of interest is in the projection list
13245         is_field_in_projection_list = TRUE;
13246       }
13247     }
13248 
13249     if ( is_field_in_projection_list && ( projection_field_count != 1 ) )
13250     {
13251       // Field of interest is not the sole column in the projection list
13252       DBUG_RETURN( FALSE );
13253     }
13254   }
13255 
13256   if ( is_field_in_projection_list && ( projection_field_count == 1 ) )
13257   {
13258     // Field of interest is the only column in the projection list
13259     DBUG_RETURN( TRUE );
13260   }
13261 
13262   DBUG_RETURN( FALSE );
13263 }
13264 
is_bulk_insert_exec_period(bool bulk_end)13265 bool spider_mbase_handler::is_bulk_insert_exec_period(
13266   bool bulk_end
13267 ) {
13268   DBUG_ENTER("spider_mbase_handler::is_bulk_insert_exec_period");
13269   DBUG_PRINT("info",("spider this=%p", this));
13270   DBUG_PRINT("info",("spider insert_sql.length=%u", insert_sql.length()));
13271   DBUG_PRINT("info",("spider insert_pos=%d", insert_pos));
13272   DBUG_PRINT("info",("spider insert_sql=%s", insert_sql.c_ptr_safe()));
13273   if (
13274     (bulk_end || (int) insert_sql.length() >= spider->bulk_size) &&
13275     (int) insert_sql.length() > insert_pos
13276   ) {
13277     DBUG_RETURN(TRUE);
13278   }
13279   DBUG_RETURN(FALSE);
13280 }
13281 
sql_is_filled_up(ulong sql_type)13282 bool spider_mbase_handler::sql_is_filled_up(
13283   ulong sql_type
13284 ) {
13285   DBUG_ENTER("spider_mbase_handler::sql_is_filled_up");
13286   DBUG_PRINT("info",("spider this=%p", this));
13287   DBUG_RETURN(filled_up);
13288 }
13289 
sql_is_empty(ulong sql_type)13290 bool spider_mbase_handler::sql_is_empty(
13291   ulong sql_type
13292 ) {
13293   bool is_empty;
13294   DBUG_ENTER("spider_mbase_handler::sql_is_empty");
13295   DBUG_PRINT("info",("spider this=%p", this));
13296   switch (sql_type)
13297   {
13298     case SPIDER_SQL_TYPE_SELECT_SQL:
13299       is_empty = (sql.length() == 0);
13300       break;
13301     case SPIDER_SQL_TYPE_INSERT_SQL:
13302       is_empty = (insert_sql.length() == 0);
13303       break;
13304     case SPIDER_SQL_TYPE_UPDATE_SQL:
13305     case SPIDER_SQL_TYPE_DELETE_SQL:
13306     case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
13307       is_empty = (update_sql.length() == 0);
13308       break;
13309     case SPIDER_SQL_TYPE_TMP_SQL:
13310       is_empty = (tmp_sql.length() == 0);
13311       break;
13312     case SPIDER_SQL_TYPE_HANDLER:
13313       is_empty = (ha_sql.length() == 0);
13314       break;
13315     default:
13316       is_empty = TRUE;
13317       break;
13318   }
13319   DBUG_RETURN(is_empty);
13320 }
13321 
support_multi_split_read()13322 bool spider_mbase_handler::support_multi_split_read()
13323 {
13324   DBUG_ENTER("spider_mbase_handler::support_multi_split_read");
13325   DBUG_PRINT("info",("spider this=%p", this));
13326   DBUG_RETURN(TRUE);
13327 }
13328 
support_bulk_update()13329 bool spider_mbase_handler::support_bulk_update()
13330 {
13331   DBUG_ENTER("spider_mbase_handler::support_bulk_update");
13332   DBUG_PRINT("info",("spider this=%p", this));
13333   DBUG_RETURN(TRUE);
13334 }
13335 
bulk_tmp_table_insert()13336 int spider_mbase_handler::bulk_tmp_table_insert()
13337 {
13338   int error_num;
13339   DBUG_ENTER("spider_mbase_handler::bulk_tmp_table_insert");
13340   DBUG_PRINT("info",("spider this=%p", this));
13341   error_num = store_sql_to_bulk_tmp_table(&update_sql, upd_tmp_tbl);
13342   DBUG_RETURN(error_num);
13343 }
13344 
bulk_tmp_table_insert(int link_idx)13345 int spider_mbase_handler::bulk_tmp_table_insert(
13346   int link_idx
13347 ) {
13348   int error_num;
13349   DBUG_ENTER("spider_mbase_handler::bulk_tmp_table_insert");
13350   DBUG_PRINT("info",("spider this=%p", this));
13351   error_num = store_sql_to_bulk_tmp_table(
13352     &spider->result_list.update_sqls[link_idx],
13353     spider->result_list.upd_tmp_tbls[link_idx]);
13354   DBUG_RETURN(error_num);
13355 }
13356 
bulk_tmp_table_end_bulk_insert()13357 int spider_mbase_handler::bulk_tmp_table_end_bulk_insert()
13358 {
13359   int error_num;
13360   DBUG_ENTER("spider_mbase_handler::bulk_tmp_table_end_bulk_insert");
13361   DBUG_PRINT("info",("spider this=%p", this));
13362   if ((error_num = upd_tmp_tbl->file->ha_end_bulk_insert()))
13363   {
13364     DBUG_RETURN(error_num);
13365   }
13366   DBUG_RETURN(0);
13367 }
13368 
bulk_tmp_table_rnd_init()13369 int spider_mbase_handler::bulk_tmp_table_rnd_init()
13370 {
13371   int error_num;
13372   DBUG_ENTER("spider_mbase_handler::bulk_tmp_table_rnd_init");
13373   DBUG_PRINT("info",("spider this=%p", this));
13374   upd_tmp_tbl->file->extra(HA_EXTRA_CACHE);
13375   if ((error_num = upd_tmp_tbl->file->ha_rnd_init(TRUE)))
13376   {
13377     DBUG_RETURN(error_num);
13378   }
13379   reading_from_bulk_tmp_table = TRUE;
13380   DBUG_RETURN(0);
13381 }
13382 
bulk_tmp_table_rnd_next()13383 int spider_mbase_handler::bulk_tmp_table_rnd_next()
13384 {
13385   int error_num;
13386   DBUG_ENTER("spider_mbase_handler::bulk_tmp_table_rnd_next");
13387   DBUG_PRINT("info",("spider this=%p", this));
13388 #if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 50200
13389   error_num = upd_tmp_tbl->file->ha_rnd_next(upd_tmp_tbl->record[0]);
13390 #else
13391   error_num = upd_tmp_tbl->file->rnd_next(upd_tmp_tbl->record[0]);
13392 #endif
13393   if (!error_num)
13394   {
13395     error_num = restore_sql_from_bulk_tmp_table(&insert_sql, upd_tmp_tbl);
13396   }
13397   DBUG_RETURN(error_num);
13398 }
13399 
bulk_tmp_table_rnd_end()13400 int spider_mbase_handler::bulk_tmp_table_rnd_end()
13401 {
13402   int error_num;
13403   DBUG_ENTER("spider_mbase_handler::bulk_tmp_table_rnd_end");
13404   DBUG_PRINT("info",("spider this=%p", this));
13405   reading_from_bulk_tmp_table = FALSE;
13406   if ((error_num = upd_tmp_tbl->file->ha_rnd_end()))
13407   {
13408     DBUG_RETURN(error_num);
13409   }
13410   DBUG_RETURN(0);
13411 }
13412 
need_copy_for_update(int link_idx)13413 bool spider_mbase_handler::need_copy_for_update(
13414   int link_idx
13415 ) {
13416   int all_link_idx = spider->conn_link_idx[link_idx];
13417   DBUG_ENTER("spider_mbase_handler::need_copy_for_update");
13418   DBUG_PRINT("info",("spider this=%p", this));
13419   DBUG_RETURN(!mysql_share->same_db_table_name ||
13420     spider->share->link_statuses[all_link_idx] == SPIDER_LINK_STATUS_RECOVERY);
13421 }
13422 
bulk_tmp_table_created()13423 bool spider_mbase_handler::bulk_tmp_table_created()
13424 {
13425   DBUG_ENTER("spider_mbase_handler::bulk_tmp_table_created");
13426   DBUG_PRINT("info",("spider this=%p", this));
13427   DBUG_RETURN(upd_tmp_tbl);
13428 }
13429 
mk_bulk_tmp_table_and_bulk_start()13430 int spider_mbase_handler::mk_bulk_tmp_table_and_bulk_start()
13431 {
13432   THD *thd = spider->trx->thd;
13433   TABLE *table = spider->get_table();
13434   DBUG_ENTER("spider_mbase_handler::mk_bulk_tmp_table_and_bulk_start");
13435   DBUG_PRINT("info",("spider this=%p", this));
13436   if (!upd_tmp_tbl)
13437   {
13438 #ifdef SPIDER_use_LEX_CSTRING_for_Field_blob_constructor
13439     LEX_CSTRING field_name = {STRING_WITH_LEN("a")};
13440     if (!(upd_tmp_tbl = spider_mk_sys_tmp_table(
13441       thd, table, &upd_tmp_tbl_prm, &field_name, update_sql.charset())))
13442 #else
13443     if (!(upd_tmp_tbl = spider_mk_sys_tmp_table(
13444       thd, table, &upd_tmp_tbl_prm, "a", update_sql.charset())))
13445 #endif
13446     {
13447       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13448     }
13449     upd_tmp_tbl->file->extra(HA_EXTRA_WRITE_CACHE);
13450     upd_tmp_tbl->file->ha_start_bulk_insert((ha_rows) 0);
13451   }
13452   DBUG_RETURN(0);
13453 }
13454 
rm_bulk_tmp_table()13455 void spider_mbase_handler::rm_bulk_tmp_table()
13456 {
13457   DBUG_ENTER("spider_mbase_handler::rm_bulk_tmp_table");
13458   DBUG_PRINT("info",("spider this=%p", this));
13459   if (upd_tmp_tbl)
13460   {
13461     spider_rm_sys_tmp_table(spider->trx->thd, upd_tmp_tbl, &upd_tmp_tbl_prm);
13462     upd_tmp_tbl = NULL;
13463   }
13464   DBUG_VOID_RETURN;
13465 }
13466 
store_sql_to_bulk_tmp_table(spider_string * str,TABLE * tmp_table)13467 int spider_mbase_handler::store_sql_to_bulk_tmp_table(
13468   spider_string *str,
13469   TABLE *tmp_table
13470 ) {
13471   int error_num;
13472   DBUG_ENTER("spider_mbase_handler::store_sql_to_bulk_tmp_table");
13473   DBUG_PRINT("info",("spider this=%p", this));
13474   tmp_table->field[0]->set_notnull();
13475   tmp_table->field[0]->store(str->ptr(), str->length(), str->charset());
13476   if ((error_num = tmp_table->file->ha_write_row(tmp_table->record[0])))
13477     DBUG_RETURN(error_num);
13478   DBUG_RETURN(0);
13479 }
13480 
restore_sql_from_bulk_tmp_table(spider_string * str,TABLE * tmp_table)13481 int spider_mbase_handler::restore_sql_from_bulk_tmp_table(
13482   spider_string *str,
13483   TABLE *tmp_table
13484 ) {
13485   DBUG_ENTER("spider_mbase_handler::restore_sql_from_bulk_tmp_table");
13486   DBUG_PRINT("info",("spider this=%p", this));
13487   tmp_table->field[0]->val_str(str->get_str());
13488   str->mem_calc();
13489   DBUG_RETURN(0);
13490 }
13491 
insert_lock_tables_list(SPIDER_CONN * conn,int link_idx)13492 int spider_mbase_handler::insert_lock_tables_list(
13493   SPIDER_CONN *conn,
13494   int link_idx
13495 ) {
13496   spider_db_mbase *db_conn = (spider_db_mbase *) conn->db_conn;
13497   SPIDER_LINK_FOR_HASH *tmp_link_for_hash2 = &link_for_hash[link_idx];
13498   DBUG_ENTER("spider_mbase_handler::insert_lock_tables_list");
13499   DBUG_PRINT("info",("spider this=%p", this));
13500   uint old_elements =
13501     db_conn->lock_table_hash.array.max_element;
13502 #ifdef HASH_UPDATE_WITH_HASH_VALUE
13503   if (my_hash_insert_with_hash_value(
13504     &db_conn->lock_table_hash,
13505     tmp_link_for_hash2->db_table_str_hash_value,
13506     (uchar*) tmp_link_for_hash2))
13507 #else
13508   if (my_hash_insert(&db_conn->lock_table_hash,
13509     (uchar*) tmp_link_for_hash2))
13510 #endif
13511   {
13512     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13513   }
13514   if (db_conn->lock_table_hash.array.max_element > old_elements)
13515   {
13516     spider_alloc_calc_mem(spider_current_trx,
13517       db_conn->lock_table_hash,
13518       (db_conn->lock_table_hash.array.max_element - old_elements) *
13519       db_conn->lock_table_hash.array.size_of_element);
13520   }
13521   DBUG_RETURN(0);
13522 }
13523 
append_lock_tables_list(SPIDER_CONN * conn,int link_idx,int * appended)13524 int spider_mbase_handler::append_lock_tables_list(
13525   SPIDER_CONN *conn,
13526   int link_idx,
13527   int *appended
13528 ) {
13529   int error_num;
13530   SPIDER_LINK_FOR_HASH *tmp_link_for_hash, *tmp_link_for_hash2;
13531   int conn_link_idx = spider->conn_link_idx[link_idx];
13532   spider_db_mbase *db_conn = (spider_db_mbase *) conn->db_conn;
13533   DBUG_ENTER("spider_mbase_handler::append_lock_tables_list");
13534   DBUG_PRINT("info",("spider this=%p", this));
13535   tmp_link_for_hash2 = &link_for_hash[link_idx];
13536   tmp_link_for_hash2->db_table_str =
13537     &mysql_share->db_table_str[conn_link_idx];
13538 #ifdef SPIDER_HAS_HASH_VALUE_TYPE
13539   tmp_link_for_hash2->db_table_str_hash_value =
13540     mysql_share->db_table_str_hash_value[conn_link_idx];
13541   if (!(tmp_link_for_hash = (SPIDER_LINK_FOR_HASH *)
13542     my_hash_search_using_hash_value(
13543       &db_conn->lock_table_hash,
13544       tmp_link_for_hash2->db_table_str_hash_value,
13545       (uchar*) tmp_link_for_hash2->db_table_str->ptr(),
13546       tmp_link_for_hash2->db_table_str->length())))
13547 #else
13548   if (!(tmp_link_for_hash = (SPIDER_LINK_FOR_HASH *) my_hash_search(
13549     &db_conn->lock_table_hash,
13550     (uchar*) tmp_link_for_hash2->db_table_str->ptr(),
13551     tmp_link_for_hash2->db_table_str->length())))
13552 #endif
13553   {
13554     if ((error_num = insert_lock_tables_list(conn, link_idx)))
13555       DBUG_RETURN(error_num);
13556     *appended = 1;
13557   } else {
13558     if (tmp_link_for_hash->spider->lock_type < spider->lock_type)
13559     {
13560 #ifdef HASH_UPDATE_WITH_HASH_VALUE
13561       my_hash_delete_with_hash_value(
13562         &db_conn->lock_table_hash,
13563         tmp_link_for_hash->db_table_str_hash_value,
13564         (uchar*) tmp_link_for_hash);
13565 #else
13566       my_hash_delete(&db_conn->lock_table_hash,
13567         (uchar*) tmp_link_for_hash);
13568 #endif
13569       uint old_elements =
13570         db_conn->lock_table_hash.array.max_element;
13571 #ifdef HASH_UPDATE_WITH_HASH_VALUE
13572       if (my_hash_insert_with_hash_value(
13573         &db_conn->lock_table_hash,
13574         tmp_link_for_hash2->db_table_str_hash_value,
13575         (uchar*) tmp_link_for_hash2))
13576 #else
13577       if (my_hash_insert(&db_conn->lock_table_hash,
13578         (uchar*) tmp_link_for_hash2))
13579 #endif
13580       {
13581         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13582       }
13583       if (db_conn->lock_table_hash.array.max_element > old_elements)
13584       {
13585         spider_alloc_calc_mem(spider_current_trx,
13586           db_conn->lock_table_hash,
13587           (db_conn->lock_table_hash.array.max_element - old_elements) *
13588           db_conn->lock_table_hash.array.size_of_element);
13589       }
13590     }
13591   }
13592   DBUG_RETURN(0);
13593 }
13594 
realloc_sql(ulong * realloced)13595 int spider_mbase_handler::realloc_sql(
13596   ulong *realloced
13597 ) {
13598   THD *thd = spider->trx->thd;
13599   st_spider_share *share = spider->share;
13600   int init_sql_alloc_size =
13601     spider_param_init_sql_alloc_size(thd, share->init_sql_alloc_size);
13602   DBUG_ENTER("spider_mbase_handler::realloc_sql");
13603   DBUG_PRINT("info",("spider this=%p", this));
13604   if ((int) sql.alloced_length() > init_sql_alloc_size * 2)
13605   {
13606     sql.free();
13607     if (sql.real_alloc(init_sql_alloc_size))
13608       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13609     *realloced |= SPIDER_SQL_TYPE_SELECT_SQL;
13610   }
13611   if ((int) ha_sql.alloced_length() > init_sql_alloc_size * 2)
13612   {
13613     ha_sql.free();
13614     if (ha_sql.real_alloc(init_sql_alloc_size))
13615       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13616     *realloced |= SPIDER_SQL_TYPE_SELECT_SQL;
13617   }
13618   if ((int) dup_update_sql.alloced_length() > init_sql_alloc_size * 2)
13619   {
13620     dup_update_sql.free();
13621     if (dup_update_sql.real_alloc(init_sql_alloc_size))
13622       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13623   }
13624   if ((int) insert_sql.alloced_length() > init_sql_alloc_size * 2)
13625   {
13626     insert_sql.free();
13627     if (insert_sql.real_alloc(init_sql_alloc_size))
13628       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13629     *realloced |= SPIDER_SQL_TYPE_INSERT_SQL;
13630   }
13631   if ((int) update_sql.alloced_length() > init_sql_alloc_size * 2)
13632   {
13633     update_sql.free();
13634     if (update_sql.real_alloc(init_sql_alloc_size))
13635       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13636     *realloced |= (SPIDER_SQL_TYPE_UPDATE_SQL | SPIDER_SQL_TYPE_DELETE_SQL);
13637   }
13638   update_sql.length(0);
13639   if ((int) tmp_sql.alloced_length() > init_sql_alloc_size * 2)
13640   {
13641     tmp_sql.free();
13642     if (tmp_sql.real_alloc(init_sql_alloc_size))
13643       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13644     *realloced |= SPIDER_SQL_TYPE_TMP_SQL;
13645   }
13646   DBUG_RETURN(0);
13647 }
13648 
reset_sql(ulong sql_type)13649 int spider_mbase_handler::reset_sql(
13650   ulong sql_type
13651 ) {
13652   DBUG_ENTER("spider_mbase_handler::reset_sql");
13653   DBUG_PRINT("info",("spider this=%p", this));
13654   if (sql_type & SPIDER_SQL_TYPE_SELECT_SQL)
13655   {
13656     sql.length(0);
13657   }
13658   if (sql_type & SPIDER_SQL_TYPE_INSERT_SQL)
13659   {
13660     insert_sql.length(0);
13661   }
13662   if (sql_type & (SPIDER_SQL_TYPE_UPDATE_SQL | SPIDER_SQL_TYPE_DELETE_SQL |
13663     SPIDER_SQL_TYPE_BULK_UPDATE_SQL))
13664   {
13665     update_sql.length(0);
13666   }
13667   if (sql_type & SPIDER_SQL_TYPE_TMP_SQL)
13668   {
13669     tmp_sql.length(0);
13670   }
13671   if (sql_type & SPIDER_SQL_TYPE_HANDLER)
13672   {
13673     ha_sql.length(0);
13674   }
13675   DBUG_RETURN(0);
13676 }
13677 
13678 #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
reset_keys(ulong sql_type)13679 int spider_mbase_handler::reset_keys(
13680   ulong sql_type
13681 ) {
13682   DBUG_ENTER("spider_mbase_handler::reset_keys");
13683   DBUG_PRINT("info",("spider this=%p", this));
13684   DBUG_ASSERT(0);
13685   DBUG_RETURN(0);
13686 }
13687 
reset_upds(ulong sql_type)13688 int spider_mbase_handler::reset_upds(
13689   ulong sql_type
13690 ) {
13691   DBUG_ENTER("spider_mbase_handler::reset_upds");
13692   DBUG_PRINT("info",("spider this=%p", this));
13693   hs_upds.clear();
13694   DBUG_RETURN(0);
13695 }
13696 
reset_strs(ulong sql_type)13697 int spider_mbase_handler::reset_strs(
13698   ulong sql_type
13699 ) {
13700   DBUG_ENTER("spider_mbase_handler::reset_strs");
13701   DBUG_PRINT("info",("spider this=%p", this));
13702   DBUG_ASSERT(0);
13703   DBUG_RETURN(0);
13704 }
13705 
reset_strs_pos(ulong sql_type)13706 int spider_mbase_handler::reset_strs_pos(
13707   ulong sql_type
13708 ) {
13709   DBUG_ENTER("spider_mbase_handler::reset_strs_pos");
13710   DBUG_PRINT("info",("spider this=%p", this));
13711   DBUG_ASSERT(0);
13712   DBUG_RETURN(0);
13713 }
13714 
push_back_upds(SPIDER_HS_STRING_REF & info)13715 int spider_mbase_handler::push_back_upds(
13716   SPIDER_HS_STRING_REF &info
13717 ) {
13718   int error_num;
13719   DBUG_ENTER("spider_mbase_handler::push_back_upds");
13720   DBUG_PRINT("info",("spider this=%p", this));
13721   error_num = hs_upds.push_back(info);
13722   DBUG_RETURN(error_num);
13723 }
13724 #endif
13725 
need_lock_before_set_sql_for_exec(ulong sql_type)13726 bool spider_mbase_handler::need_lock_before_set_sql_for_exec(
13727   ulong sql_type
13728 ) {
13729   DBUG_ENTER("spider_mbase_handler::need_lock_before_set_sql_for_exec");
13730   DBUG_PRINT("info",("spider this=%p", this));
13731   DBUG_RETURN(FALSE);
13732 }
13733 
13734 #ifdef SPIDER_HAS_GROUP_BY_HANDLER
set_sql_for_exec(ulong sql_type,int link_idx,SPIDER_LINK_IDX_CHAIN * link_idx_chain)13735 int spider_mbase_handler::set_sql_for_exec(
13736   ulong sql_type,
13737   int link_idx,
13738   SPIDER_LINK_IDX_CHAIN *link_idx_chain
13739 ) {
13740   int error_num;
13741   DBUG_ENTER("spider_mbase_handler::set_sql_for_exec");
13742   DBUG_PRINT("info",("spider this=%p", this));
13743   if (sql_type & SPIDER_SQL_TYPE_SELECT_SQL)
13744   {
13745     if ((error_num = spider_db_mbase_utility->reappend_tables(
13746       spider->fields, link_idx_chain, &sql)))
13747       DBUG_RETURN(error_num);
13748     exec_sql = &sql;
13749   }
13750   DBUG_RETURN(0);
13751 }
13752 #endif
13753 
set_sql_for_exec(ulong sql_type,int link_idx)13754 int spider_mbase_handler::set_sql_for_exec(
13755   ulong sql_type,
13756   int link_idx
13757 ) {
13758   int error_num;
13759   uint tmp_pos;
13760   SPIDER_SHARE *share = spider->share;
13761   SPIDER_RESULT_LIST *result_list = &spider->result_list;
13762   int all_link_idx = spider->conn_link_idx[link_idx];
13763   DBUG_ENTER("spider_mbase_handler::set_sql_for_exec");
13764   DBUG_PRINT("info",("spider this=%p", this));
13765   if (sql_type & (SPIDER_SQL_TYPE_SELECT_SQL | SPIDER_SQL_TYPE_TMP_SQL))
13766   {
13767     if (mysql_share->same_db_table_name || link_idx == first_link_idx)
13768     {
13769       if (sql_type & SPIDER_SQL_TYPE_SELECT_SQL)
13770         exec_sql = &sql;
13771       if (sql_type & SPIDER_SQL_TYPE_TMP_SQL)
13772         exec_tmp_sql = &tmp_sql;
13773     } else {
13774       char tmp_table_name[MAX_FIELD_WIDTH * 2],
13775         tgt_table_name[MAX_FIELD_WIDTH * 2];
13776       int tmp_table_name_length;
13777       spider_string tgt_table_name_str(tgt_table_name,
13778         MAX_FIELD_WIDTH * 2,
13779         mysql_share->db_names_str[link_idx].charset());
13780       const char *table_names[2], *table_aliases[2];
13781       uint table_name_lengths[2], table_alias_lengths[2];
13782       tgt_table_name_str.init_calc_mem(104);
13783       tgt_table_name_str.length(0);
13784       if (result_list->tmp_table_join && spider->bka_mode != 2)
13785       {
13786         create_tmp_bka_table_name(tmp_table_name, &tmp_table_name_length,
13787           link_idx);
13788         append_table_name_with_adjusting(&tgt_table_name_str, link_idx,
13789           SPIDER_SQL_TYPE_TMP_SQL);
13790         table_names[0] = tmp_table_name;
13791         table_names[1] = tgt_table_name_str.ptr();
13792         table_name_lengths[0] = tmp_table_name_length;
13793         table_name_lengths[1] = tgt_table_name_str.length();
13794         table_aliases[0] = SPIDER_SQL_A_STR;
13795         table_aliases[1] = SPIDER_SQL_B_STR;
13796         table_alias_lengths[0] = SPIDER_SQL_A_LEN;
13797         table_alias_lengths[1] = SPIDER_SQL_B_LEN;
13798       }
13799       if (sql_type & SPIDER_SQL_TYPE_SELECT_SQL)
13800       {
13801         exec_sql = &result_list->sqls[link_idx];
13802         if (exec_sql->copy(sql))
13803           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13804         else if (result_list->use_union)
13805         {
13806           if ((error_num = reset_union_table_name(exec_sql, link_idx,
13807             SPIDER_SQL_TYPE_SELECT_SQL)))
13808             DBUG_RETURN(error_num);
13809         } else {
13810           tmp_pos = exec_sql->length();
13811           exec_sql->length(table_name_pos);
13812           if (result_list->tmp_table_join && spider->bka_mode != 2)
13813           {
13814             if ((error_num = spider_db_mbase_utility->append_from_with_alias(
13815               exec_sql, table_names, table_name_lengths,
13816               table_aliases, table_alias_lengths, 2,
13817               &table_name_pos, TRUE))
13818             )
13819               DBUG_RETURN(error_num);
13820             exec_sql->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
13821           } else {
13822             append_table_name_with_adjusting(exec_sql, link_idx,
13823               SPIDER_SQL_TYPE_SELECT_SQL);
13824           }
13825           exec_sql->length(tmp_pos);
13826         }
13827       }
13828       if (sql_type & SPIDER_SQL_TYPE_TMP_SQL)
13829       {
13830         exec_tmp_sql = &result_list->tmp_sqls[link_idx];
13831         if (result_list->tmp_table_join && spider->bka_mode != 2)
13832         {
13833           if (exec_tmp_sql->copy(tmp_sql))
13834             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13835           else {
13836             tmp_pos = exec_tmp_sql->length();
13837             exec_tmp_sql->length(tmp_sql_pos1);
13838             exec_tmp_sql->q_append(tmp_table_name, tmp_table_name_length);
13839             exec_tmp_sql->length(tmp_sql_pos2);
13840             exec_tmp_sql->q_append(tmp_table_name, tmp_table_name_length);
13841             exec_tmp_sql->length(tmp_sql_pos3);
13842             exec_tmp_sql->q_append(tmp_table_name, tmp_table_name_length);
13843             exec_tmp_sql->length(tmp_pos);
13844           }
13845         }
13846       }
13847     }
13848   }
13849   if (sql_type & SPIDER_SQL_TYPE_INSERT_SQL)
13850   {
13851     if (mysql_share->same_db_table_name || link_idx == first_link_idx)
13852       exec_insert_sql = &insert_sql;
13853     else {
13854       exec_insert_sql = &result_list->insert_sqls[link_idx];
13855       if (exec_insert_sql->copy(insert_sql))
13856         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13857       DBUG_PRINT("info",("spider exec_insert_sql=%s",
13858         exec_insert_sql->c_ptr_safe()));
13859       tmp_pos = exec_insert_sql->length();
13860       exec_insert_sql->length(insert_table_name_pos);
13861       append_table_name_with_adjusting(exec_insert_sql, link_idx,
13862         sql_type);
13863       exec_insert_sql->length(tmp_pos);
13864       DBUG_PRINT("info",("spider exec_insert_sql->length=%u",
13865         exec_insert_sql->length()));
13866       DBUG_PRINT("info",("spider exec_insert_sql=%s",
13867         exec_insert_sql->c_ptr_safe()));
13868     }
13869   }
13870   if (sql_type & SPIDER_SQL_TYPE_BULK_UPDATE_SQL)
13871   {
13872     if (reading_from_bulk_tmp_table)
13873     {
13874       if (
13875         mysql_share->same_db_table_name &&
13876         share->link_statuses[all_link_idx] != SPIDER_LINK_STATUS_RECOVERY
13877       ) {
13878         exec_update_sql = &insert_sql;
13879       } else if (!spider->result_list.upd_tmp_tbls[link_idx])
13880       {
13881         DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
13882       } else {
13883         exec_update_sql = &spider->result_list.insert_sqls[link_idx];
13884         if ((error_num = restore_sql_from_bulk_tmp_table(exec_update_sql,
13885           spider->result_list.upd_tmp_tbls[link_idx])))
13886         {
13887           DBUG_RETURN(error_num);
13888         }
13889       }
13890     } else {
13891       if (
13892         mysql_share->same_db_table_name &&
13893         share->link_statuses[all_link_idx] != SPIDER_LINK_STATUS_RECOVERY
13894       ) {
13895         exec_update_sql = &update_sql;
13896       } else {
13897         exec_update_sql = &spider->result_list.update_sqls[link_idx];
13898       }
13899     }
13900   } else if (sql_type &
13901     (SPIDER_SQL_TYPE_UPDATE_SQL | SPIDER_SQL_TYPE_DELETE_SQL))
13902   {
13903     if (mysql_share->same_db_table_name || link_idx == first_link_idx)
13904       exec_update_sql = &update_sql;
13905     else {
13906       exec_update_sql = &spider->result_list.update_sqls[link_idx];
13907       if (exec_update_sql->copy(update_sql))
13908         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13909       tmp_pos = exec_update_sql->length();
13910       exec_update_sql->length(table_name_pos);
13911       append_table_name_with_adjusting(exec_update_sql, link_idx,
13912         sql_type);
13913       exec_update_sql->length(tmp_pos);
13914     }
13915   }
13916   if (sql_type & SPIDER_SQL_TYPE_HANDLER)
13917   {
13918     if (spider->m_handler_id[link_idx] == ha_sql_handler_id)
13919       exec_ha_sql = &ha_sql;
13920     else {
13921       exec_ha_sql = &result_list->sqls[link_idx];
13922       if (exec_ha_sql->copy(ha_sql))
13923         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13924       else {
13925         tmp_pos = exec_ha_sql->length();
13926         exec_ha_sql->length(ha_table_name_pos);
13927         append_table_name_with_adjusting(exec_ha_sql, link_idx,
13928           SPIDER_SQL_TYPE_HANDLER);
13929         exec_ha_sql->length(tmp_pos);
13930       }
13931     }
13932   }
13933   DBUG_RETURN(0);
13934 }
13935 
set_sql_for_exec(spider_db_copy_table * tgt_ct,ulong sql_type)13936 int spider_mbase_handler::set_sql_for_exec(
13937   spider_db_copy_table *tgt_ct,
13938   ulong sql_type
13939 ) {
13940   spider_mbase_copy_table *mysql_ct = (spider_mbase_copy_table *) tgt_ct;
13941   DBUG_ENTER("spider_mbase_handler::set_sql_for_exec");
13942   DBUG_PRINT("info",("spider this=%p", this));
13943   switch (sql_type)
13944   {
13945     case SPIDER_SQL_TYPE_INSERT_SQL:
13946       exec_insert_sql = &mysql_ct->sql;
13947       break;
13948     default:
13949       DBUG_ASSERT(0);
13950       break;
13951   }
13952   DBUG_RETURN(0);
13953 }
13954 
execute_sql(ulong sql_type,SPIDER_CONN * conn,int quick_mode,int * need_mon)13955 int spider_mbase_handler::execute_sql(
13956   ulong sql_type,
13957   SPIDER_CONN *conn,
13958   int quick_mode,
13959   int *need_mon
13960 ) {
13961   spider_string *tgt_sql;
13962   uint tgt_length;
13963   DBUG_ENTER("spider_mbase_handler::execute_sql");
13964   DBUG_PRINT("info",("spider this=%p", this));
13965   switch (sql_type)
13966   {
13967     case SPIDER_SQL_TYPE_SELECT_SQL:
13968       DBUG_PRINT("info",("spider SPIDER_SQL_TYPE_SELECT_SQL"));
13969       tgt_sql = exec_sql;
13970       tgt_length = tgt_sql->length();
13971       break;
13972     case SPIDER_SQL_TYPE_INSERT_SQL:
13973       DBUG_PRINT("info",("spider SPIDER_SQL_TYPE_SELECT_SQL"));
13974       tgt_sql = exec_insert_sql;
13975       tgt_length = tgt_sql->length();
13976       break;
13977     case SPIDER_SQL_TYPE_UPDATE_SQL:
13978     case SPIDER_SQL_TYPE_DELETE_SQL:
13979     case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
13980       DBUG_PRINT("info",("spider %s",
13981         sql_type == SPIDER_SQL_TYPE_UPDATE_SQL ? "SPIDER_SQL_TYPE_UPDATE_SQL" :
13982         sql_type == SPIDER_SQL_TYPE_DELETE_SQL ? "SPIDER_SQL_TYPE_DELETE_SQL" :
13983         "SPIDER_SQL_TYPE_BULK_UPDATE_SQL"
13984       ));
13985       tgt_sql = exec_update_sql;
13986       tgt_length = tgt_sql->length();
13987       break;
13988     case SPIDER_SQL_TYPE_TMP_SQL:
13989       DBUG_PRINT("info",("spider SPIDER_SQL_TYPE_TMP_SQL"));
13990       tgt_sql = exec_tmp_sql;
13991       tgt_length = tgt_sql->length();
13992       break;
13993     case SPIDER_SQL_TYPE_DROP_TMP_TABLE_SQL:
13994       DBUG_PRINT("info",("spider SPIDER_SQL_TYPE_DROP_TMP_TABLE_SQL"));
13995       tgt_sql = exec_tmp_sql;
13996       tgt_length = tmp_sql_pos5;
13997       break;
13998     case SPIDER_SQL_TYPE_HANDLER:
13999       DBUG_PRINT("info",("spider SPIDER_SQL_TYPE_HANDLER"));
14000       tgt_sql = exec_ha_sql;
14001       tgt_length = tgt_sql->length();
14002       break;
14003     default:
14004       /* nothing to do */
14005       DBUG_PRINT("info",("spider default"));
14006       DBUG_RETURN(0);
14007   }
14008   DBUG_RETURN(spider_db_query(
14009     conn,
14010     tgt_sql->ptr(),
14011     tgt_length,
14012     quick_mode,
14013     need_mon
14014   ));
14015 }
14016 
reset()14017 int spider_mbase_handler::reset()
14018 {
14019   DBUG_ENTER("spider_mbase_handler::reset");
14020   DBUG_PRINT("info",("spider this=%p", this));
14021   update_sql.length(0);
14022   DBUG_RETURN(0);
14023 }
14024 
sts_mode_exchange(int sts_mode)14025 int spider_mbase_handler::sts_mode_exchange(
14026   int sts_mode
14027 ) {
14028   DBUG_ENTER("spider_mbase_handler::sts_mode_exchange");
14029   DBUG_PRINT("info",("spider sts_mode=%d", sts_mode));
14030   DBUG_RETURN(sts_mode);
14031 }
14032 
show_table_status(int link_idx,int sts_mode,uint flag)14033 int spider_mbase_handler::show_table_status(
14034   int link_idx,
14035   int sts_mode,
14036   uint flag
14037 ) {
14038   int error_num;
14039   SPIDER_CONN *conn = spider->conns[link_idx];
14040   SPIDER_DB_RESULT *res;
14041   SPIDER_SHARE *share = spider->share;
14042   uint pos = (2 * spider->conn_link_idx[link_idx]);
14043   ulonglong auto_increment_value = 0;
14044   DBUG_ENTER("spider_mbase_handler::show_table_status");
14045   DBUG_PRINT("info",("spider sts_mode=%d", sts_mode));
14046 
14047   if (sts_mode == 1)
14048   {
14049     pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
14050     pthread_mutex_lock(&conn->mta_conn_mutex);
14051     SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
14052     conn->need_mon = &spider->need_mons[link_idx];
14053     DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
14054     DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
14055     conn->mta_conn_mutex_lock_already = TRUE;
14056     conn->mta_conn_mutex_unlock_later = TRUE;
14057     conn->disable_connect_retry = TRUE;
14058     spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
14059       share);
14060     if (
14061       (error_num = spider_db_set_names(spider, conn, link_idx)) ||
14062       (
14063         spider_db_query(
14064           conn,
14065           mysql_share->show_table_status[0 + pos].ptr(),
14066           mysql_share->show_table_status[0 + pos].length(),
14067           -1,
14068           &spider->need_mons[link_idx]) &&
14069         (error_num = spider_db_errorno(conn))
14070       )
14071     ) {
14072       if (
14073         error_num == ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM &&
14074         !conn->disable_reconnect
14075       ) {
14076         /* retry */
14077         if ((error_num = spider_db_ping(spider, conn, link_idx)))
14078         {
14079           conn->disable_connect_retry = FALSE;
14080           DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14081           DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14082           conn->mta_conn_mutex_lock_already = FALSE;
14083           conn->mta_conn_mutex_unlock_later = FALSE;
14084           SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14085           pthread_mutex_unlock(&conn->mta_conn_mutex);
14086           DBUG_RETURN(error_num);
14087         }
14088         if ((error_num = spider_db_set_names(spider, conn, link_idx)))
14089         {
14090           conn->disable_connect_retry = FALSE;
14091           DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14092           DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14093           conn->mta_conn_mutex_lock_already = FALSE;
14094           conn->mta_conn_mutex_unlock_later = FALSE;
14095           SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14096           pthread_mutex_unlock(&conn->mta_conn_mutex);
14097           DBUG_RETURN(error_num);
14098         }
14099         spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
14100           share);
14101         if (spider_db_query(
14102           conn,
14103           mysql_share->show_table_status[0 + pos].ptr(),
14104           mysql_share->show_table_status[0 + pos].length(),
14105           -1,
14106           &spider->need_mons[link_idx])
14107         ) {
14108           conn->disable_connect_retry = FALSE;
14109           DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14110           DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14111           conn->mta_conn_mutex_lock_already = FALSE;
14112           conn->mta_conn_mutex_unlock_later = FALSE;
14113           DBUG_RETURN(spider_db_errorno(conn));
14114         }
14115       } else {
14116         conn->disable_connect_retry = FALSE;
14117         DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14118         DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14119         conn->mta_conn_mutex_lock_already = FALSE;
14120         conn->mta_conn_mutex_unlock_later = FALSE;
14121         SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14122         pthread_mutex_unlock(&conn->mta_conn_mutex);
14123         DBUG_RETURN(error_num);
14124       }
14125     }
14126     st_spider_db_request_key request_key;
14127     request_key.spider_thread_id = spider->trx->spider_thread_id;
14128     request_key.query_id = spider->trx->thd->query_id;
14129     request_key.handler = spider;
14130     request_key.request_id = 1;
14131     request_key.next = NULL;
14132     if (spider_param_dry_access())
14133     {
14134       conn->disable_connect_retry = FALSE;
14135       DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14136       DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14137       conn->mta_conn_mutex_lock_already = FALSE;
14138       conn->mta_conn_mutex_unlock_later = FALSE;
14139       SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14140       pthread_mutex_unlock(&conn->mta_conn_mutex);
14141       DBUG_RETURN(0);
14142     }
14143     if (!(res = conn->db_conn->store_result(NULL, &request_key, &error_num)))
14144     {
14145       conn->disable_connect_retry = FALSE;
14146       DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14147       DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14148       conn->mta_conn_mutex_lock_already = FALSE;
14149       conn->mta_conn_mutex_unlock_later = FALSE;
14150       if (error_num)
14151       {
14152         SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14153         pthread_mutex_unlock(&conn->mta_conn_mutex);
14154         DBUG_RETURN(error_num);
14155       }
14156       else if ((error_num = spider_db_errorno(conn)))
14157         DBUG_RETURN(error_num);
14158       else {
14159         my_printf_error(ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM,
14160           ER_SPIDER_REMOTE_TABLE_NOT_FOUND_STR, MYF(0),
14161           mysql_share->db_names_str[spider->conn_link_idx[link_idx]].ptr(),
14162           mysql_share->table_names_str[spider->conn_link_idx[
14163             link_idx]].ptr());
14164         DBUG_RETURN(ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM);
14165       }
14166     }
14167     conn->disable_connect_retry = FALSE;
14168     DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14169     DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14170     conn->mta_conn_mutex_lock_already = FALSE;
14171     conn->mta_conn_mutex_unlock_later = FALSE;
14172     SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14173     pthread_mutex_unlock(&conn->mta_conn_mutex);
14174     error_num = res->fetch_table_status(
14175       sts_mode,
14176       share->stat
14177     );
14178     auto_increment_value = share->stat.auto_increment_value;
14179     res->free_result();
14180     delete res;
14181     if (error_num)
14182     {
14183       switch (error_num)
14184       {
14185         case ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM:
14186           my_printf_error(ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM,
14187             ER_SPIDER_REMOTE_TABLE_NOT_FOUND_STR, MYF(0),
14188             mysql_share->db_names_str[spider->conn_link_idx[link_idx]].ptr(),
14189             mysql_share->table_names_str[spider->conn_link_idx[
14190               link_idx]].ptr());
14191           break;
14192         case ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM:
14193           my_printf_error(ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM,
14194             ER_SPIDER_INVALID_REMOTE_TABLE_INFO_STR, MYF(0),
14195             mysql_share->db_names_str[spider->conn_link_idx[link_idx]].ptr(),
14196             mysql_share->table_names_str[spider->conn_link_idx[
14197               link_idx]].ptr());
14198           break;
14199         default:
14200           break;
14201       }
14202       DBUG_RETURN(error_num);
14203     }
14204   } else {
14205     pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
14206     pthread_mutex_lock(&conn->mta_conn_mutex);
14207     SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
14208     conn->need_mon = &spider->need_mons[link_idx];
14209     DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
14210     DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
14211     conn->mta_conn_mutex_lock_already = TRUE;
14212     conn->mta_conn_mutex_unlock_later = TRUE;
14213     conn->disable_connect_retry = TRUE;
14214     spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
14215       share);
14216     if (
14217       (error_num = spider_db_set_names(spider, conn, link_idx)) ||
14218       (
14219         spider_db_query(
14220           conn,
14221           mysql_share->show_table_status[1 + pos].ptr(),
14222           mysql_share->show_table_status[1 + pos].length(),
14223           -1,
14224           &spider->need_mons[link_idx]) &&
14225         (error_num = spider_db_errorno(conn))
14226       )
14227     ) {
14228       if (
14229         error_num == ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM &&
14230         !conn->disable_reconnect
14231       ) {
14232         /* retry */
14233         if ((error_num = spider_db_ping(spider, conn, link_idx)))
14234         {
14235           conn->disable_connect_retry = FALSE;
14236           DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14237           DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14238           conn->mta_conn_mutex_lock_already = FALSE;
14239           conn->mta_conn_mutex_unlock_later = FALSE;
14240           SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14241           pthread_mutex_unlock(&conn->mta_conn_mutex);
14242           DBUG_RETURN(error_num);
14243         }
14244         if ((error_num = spider_db_set_names(spider, conn, link_idx)))
14245         {
14246           conn->disable_connect_retry = FALSE;
14247           DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14248           DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14249           conn->mta_conn_mutex_lock_already = FALSE;
14250           conn->mta_conn_mutex_unlock_later = FALSE;
14251           SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14252           pthread_mutex_unlock(&conn->mta_conn_mutex);
14253           DBUG_RETURN(error_num);
14254         }
14255         spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
14256           share);
14257         if (spider_db_query(
14258           conn,
14259           mysql_share->show_table_status[1 + pos].ptr(),
14260           mysql_share->show_table_status[1 + pos].length(),
14261           -1,
14262           &spider->need_mons[link_idx])
14263         ) {
14264           conn->disable_connect_retry = FALSE;
14265           DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14266           DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14267           conn->mta_conn_mutex_lock_already = FALSE;
14268           conn->mta_conn_mutex_unlock_later = FALSE;
14269           DBUG_RETURN(spider_db_errorno(conn));
14270         }
14271       } else {
14272         conn->disable_connect_retry = FALSE;
14273         DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14274         DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14275         conn->mta_conn_mutex_lock_already = FALSE;
14276         conn->mta_conn_mutex_unlock_later = FALSE;
14277         SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14278         pthread_mutex_unlock(&conn->mta_conn_mutex);
14279         DBUG_RETURN(error_num);
14280       }
14281     }
14282     st_spider_db_request_key request_key;
14283     request_key.spider_thread_id = spider->trx->spider_thread_id;
14284     request_key.query_id = spider->trx->thd->query_id;
14285     request_key.handler = spider;
14286     request_key.request_id = 1;
14287     request_key.next = NULL;
14288     if (spider_param_dry_access())
14289     {
14290       conn->disable_connect_retry = FALSE;
14291       DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14292       DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14293       conn->mta_conn_mutex_lock_already = FALSE;
14294       conn->mta_conn_mutex_unlock_later = FALSE;
14295       SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14296       pthread_mutex_unlock(&conn->mta_conn_mutex);
14297       DBUG_RETURN(0);
14298     }
14299     if (!(res = conn->db_conn->store_result(NULL, &request_key, &error_num)))
14300     {
14301       conn->disable_connect_retry = FALSE;
14302       DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14303       DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14304       conn->mta_conn_mutex_lock_already = FALSE;
14305       conn->mta_conn_mutex_unlock_later = FALSE;
14306       if (error_num || (error_num = spider_db_errorno(conn)))
14307         DBUG_RETURN(error_num);
14308       else
14309         DBUG_RETURN(ER_QUERY_ON_FOREIGN_DATA_SOURCE);
14310     }
14311     conn->disable_connect_retry = FALSE;
14312     DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14313     DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14314     conn->mta_conn_mutex_lock_already = FALSE;
14315     conn->mta_conn_mutex_unlock_later = FALSE;
14316     SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14317     pthread_mutex_unlock(&conn->mta_conn_mutex);
14318     error_num = res->fetch_table_status(
14319       sts_mode,
14320       share->stat
14321     );
14322     auto_increment_value = share->stat.auto_increment_value;
14323     res->free_result();
14324     delete res;
14325     if (error_num)
14326     {
14327       switch (error_num)
14328       {
14329         case ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM:
14330           my_printf_error(ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM,
14331             ER_SPIDER_REMOTE_TABLE_NOT_FOUND_STR, MYF(0),
14332             mysql_share->db_names_str[spider->conn_link_idx[link_idx]].ptr(),
14333             mysql_share->table_names_str[spider->conn_link_idx[
14334               link_idx]].ptr());
14335           break;
14336         case ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM:
14337           my_printf_error(ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM,
14338             ER_SPIDER_INVALID_REMOTE_TABLE_INFO_STR, MYF(0),
14339             mysql_share->db_names_str[spider->conn_link_idx[link_idx]].ptr(),
14340             mysql_share->table_names_str[spider->conn_link_idx[
14341               link_idx]].ptr());
14342           break;
14343         default:
14344           break;
14345       }
14346       DBUG_RETURN(error_num);
14347     }
14348   }
14349   if (share->static_records_for_status != -1)
14350   {
14351     share->stat.records = (ha_rows) share->static_records_for_status;
14352   }
14353   if (share->static_mean_rec_length != -1)
14354   {
14355     share->stat.mean_rec_length = (ulong) share->static_mean_rec_length;
14356   }
14357   if (auto_increment_value > share->lgtm_tblhnd_share->auto_increment_value)
14358   {
14359     share->lgtm_tblhnd_share->auto_increment_value = auto_increment_value;
14360     DBUG_PRINT("info",("spider auto_increment_value=%llu",
14361       share->lgtm_tblhnd_share->auto_increment_value));
14362   }
14363   DBUG_RETURN(0);
14364 }
14365 
crd_mode_exchange(int crd_mode)14366 int spider_mbase_handler::crd_mode_exchange(
14367   int crd_mode
14368 ) {
14369   DBUG_ENTER("spider_mbase_handler::crd_mode_exchange");
14370   DBUG_PRINT("info",("spider crd_mode=%d", crd_mode));
14371   DBUG_RETURN(crd_mode);
14372 }
14373 
show_index(int link_idx,int crd_mode)14374 int spider_mbase_handler::show_index(
14375   int link_idx,
14376   int crd_mode
14377 ) {
14378   int error_num;
14379   SPIDER_CONN *conn = spider->conns[link_idx];
14380   SPIDER_SHARE *share = spider->share;
14381   TABLE *table = spider->get_table();
14382   SPIDER_DB_RESULT *res;
14383   int roop_count;
14384   longlong *tmp_cardinality;
14385   uint pos = (2 * spider->conn_link_idx[link_idx]);
14386   DBUG_ENTER("spider_mbase_handler::show_index");
14387   DBUG_PRINT("info",("spider crd_mode=%d", crd_mode));
14388   if (crd_mode == 1)
14389   {
14390     pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
14391     pthread_mutex_lock(&conn->mta_conn_mutex);
14392     SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
14393     conn->need_mon = &spider->need_mons[link_idx];
14394     DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
14395     DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
14396     conn->mta_conn_mutex_lock_already = TRUE;
14397     conn->mta_conn_mutex_unlock_later = TRUE;
14398     spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
14399       share);
14400     if (
14401       (error_num = spider_db_set_names(spider, conn, link_idx)) ||
14402       (
14403         spider_db_query(
14404           conn,
14405           mysql_share->show_index[0 + pos].ptr(),
14406           mysql_share->show_index[0 + pos].length(),
14407           -1,
14408           &spider->need_mons[link_idx]) &&
14409         (error_num = spider_db_errorno(conn))
14410       )
14411     ) {
14412       if (
14413         error_num == ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM &&
14414         !conn->disable_reconnect
14415       ) {
14416         /* retry */
14417         if ((error_num = spider_db_ping(spider, conn, link_idx)))
14418         {
14419           DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14420           DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14421           conn->mta_conn_mutex_lock_already = FALSE;
14422           conn->mta_conn_mutex_unlock_later = FALSE;
14423           SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14424           pthread_mutex_unlock(&conn->mta_conn_mutex);
14425           DBUG_RETURN(error_num);
14426         }
14427         if ((error_num = spider_db_set_names(spider, conn, link_idx)))
14428         {
14429           DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14430           DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14431           conn->mta_conn_mutex_lock_already = FALSE;
14432           conn->mta_conn_mutex_unlock_later = FALSE;
14433           SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14434           pthread_mutex_unlock(&conn->mta_conn_mutex);
14435           DBUG_RETURN(error_num);
14436         }
14437         spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
14438           share);
14439         if (spider_db_query(
14440           conn,
14441           mysql_share->show_index[0 + pos].ptr(),
14442           mysql_share->show_index[0 + pos].length(),
14443           -1,
14444           &spider->need_mons[link_idx])
14445         ) {
14446           DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14447           DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14448           conn->mta_conn_mutex_lock_already = FALSE;
14449           conn->mta_conn_mutex_unlock_later = FALSE;
14450           DBUG_RETURN(spider_db_errorno(conn));
14451         }
14452       } else {
14453         DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14454         DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14455         conn->mta_conn_mutex_lock_already = FALSE;
14456         conn->mta_conn_mutex_unlock_later = FALSE;
14457         SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14458         pthread_mutex_unlock(&conn->mta_conn_mutex);
14459         DBUG_RETURN(error_num);
14460       }
14461     }
14462     st_spider_db_request_key request_key;
14463     request_key.spider_thread_id = spider->trx->spider_thread_id;
14464     request_key.query_id = spider->trx->thd->query_id;
14465     request_key.handler = spider;
14466     request_key.request_id = 1;
14467     request_key.next = NULL;
14468     if (!(res = conn->db_conn->store_result(NULL, &request_key, &error_num)))
14469     {
14470       if (error_num || (error_num = spider_db_errorno(conn)))
14471       {
14472         DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14473         DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14474         conn->mta_conn_mutex_lock_already = FALSE;
14475         conn->mta_conn_mutex_unlock_later = FALSE;
14476         SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14477         pthread_mutex_unlock(&conn->mta_conn_mutex);
14478         DBUG_RETURN(error_num);
14479       }
14480       /* no record is ok */
14481     }
14482     DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14483     DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14484     conn->mta_conn_mutex_lock_already = FALSE;
14485     conn->mta_conn_mutex_unlock_later = FALSE;
14486     SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14487     pthread_mutex_unlock(&conn->mta_conn_mutex);
14488     if (res)
14489     {
14490       error_num = res->fetch_table_cardinality(
14491         crd_mode,
14492         table,
14493         share->cardinality,
14494         share->cardinality_upd,
14495         share->bitmap_size
14496       );
14497     }
14498     for (roop_count = 0, tmp_cardinality = share->cardinality;
14499       roop_count < (int) table->s->fields;
14500       roop_count++, tmp_cardinality++)
14501     {
14502       if (!spider_bit_is_set(share->cardinality_upd, roop_count))
14503       {
14504         DBUG_PRINT("info",
14505           ("spider uninitialized column cardinality id=%d", roop_count));
14506         *tmp_cardinality = -1;
14507       }
14508     }
14509     if (res)
14510     {
14511       res->free_result();
14512       delete res;
14513     }
14514     if (error_num)
14515     {
14516       switch (error_num)
14517       {
14518         case ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM:
14519           my_printf_error(ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM,
14520             ER_SPIDER_REMOTE_TABLE_NOT_FOUND_STR, MYF(0),
14521             mysql_share->db_names_str[spider->conn_link_idx[link_idx]].ptr(),
14522             mysql_share->table_names_str[spider->conn_link_idx[
14523               link_idx]].ptr());
14524           break;
14525         case ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM:
14526           my_printf_error(ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM,
14527             ER_SPIDER_INVALID_REMOTE_TABLE_INFO_STR, MYF(0),
14528             mysql_share->db_names_str[spider->conn_link_idx[link_idx]].ptr(),
14529             mysql_share->table_names_str[spider->conn_link_idx[
14530               link_idx]].ptr());
14531           break;
14532         default:
14533           break;
14534       }
14535       DBUG_RETURN(error_num);
14536     }
14537   } else {
14538     pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
14539     pthread_mutex_lock(&conn->mta_conn_mutex);
14540     SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
14541     conn->need_mon = &spider->need_mons[link_idx];
14542     DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
14543     DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
14544     conn->mta_conn_mutex_lock_already = TRUE;
14545     conn->mta_conn_mutex_unlock_later = TRUE;
14546     spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
14547       share);
14548     if (
14549       (error_num = spider_db_set_names(spider, conn, link_idx)) ||
14550       (
14551         spider_db_query(
14552           conn,
14553           mysql_share->show_index[1 + pos].ptr(),
14554           mysql_share->show_index[1 + pos].length(),
14555           -1,
14556           &spider->need_mons[link_idx]) &&
14557         (error_num = spider_db_errorno(conn))
14558       )
14559     ) {
14560       if (
14561         error_num == ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM &&
14562         !conn->disable_reconnect
14563       ) {
14564         /* retry */
14565         if ((error_num = spider_db_ping(spider, conn, link_idx)))
14566         {
14567           DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14568           DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14569           conn->mta_conn_mutex_lock_already = FALSE;
14570           conn->mta_conn_mutex_unlock_later = FALSE;
14571           SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14572           pthread_mutex_unlock(&conn->mta_conn_mutex);
14573           DBUG_RETURN(error_num);
14574         }
14575         if ((error_num = spider_db_set_names(spider, conn, link_idx)))
14576         {
14577           DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14578           DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14579           conn->mta_conn_mutex_lock_already = FALSE;
14580           conn->mta_conn_mutex_unlock_later = FALSE;
14581           SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14582           pthread_mutex_unlock(&conn->mta_conn_mutex);
14583           DBUG_RETURN(error_num);
14584         }
14585         spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
14586           share);
14587         if (spider_db_query(
14588           conn,
14589           mysql_share->show_index[1 + pos].ptr(),
14590           mysql_share->show_index[1 + pos].length(),
14591           -1,
14592           &spider->need_mons[link_idx])
14593         ) {
14594           DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14595           DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14596           conn->mta_conn_mutex_lock_already = FALSE;
14597           conn->mta_conn_mutex_unlock_later = FALSE;
14598           DBUG_RETURN(spider_db_errorno(conn));
14599         }
14600       } else {
14601         DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14602         DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14603         conn->mta_conn_mutex_lock_already = FALSE;
14604         conn->mta_conn_mutex_unlock_later = FALSE;
14605         SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14606         pthread_mutex_unlock(&conn->mta_conn_mutex);
14607         DBUG_RETURN(error_num);
14608       }
14609     }
14610     st_spider_db_request_key request_key;
14611     request_key.spider_thread_id = spider->trx->spider_thread_id;
14612     request_key.query_id = spider->trx->thd->query_id;
14613     request_key.handler = spider;
14614     request_key.request_id = 1;
14615     request_key.next = NULL;
14616     if (!(res = conn->db_conn->store_result(NULL, &request_key, &error_num)))
14617     {
14618       if (error_num || (error_num = spider_db_errorno(conn)))
14619       {
14620         DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14621         DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14622         conn->mta_conn_mutex_lock_already = FALSE;
14623         conn->mta_conn_mutex_unlock_later = FALSE;
14624         SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14625         pthread_mutex_unlock(&conn->mta_conn_mutex);
14626         DBUG_RETURN(error_num);
14627       }
14628       /* no record is ok */
14629     }
14630     DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14631     DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14632     conn->mta_conn_mutex_lock_already = FALSE;
14633     conn->mta_conn_mutex_unlock_later = FALSE;
14634     SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14635     pthread_mutex_unlock(&conn->mta_conn_mutex);
14636     if (res)
14637     {
14638       error_num = res->fetch_table_cardinality(
14639         crd_mode,
14640         table,
14641         share->cardinality,
14642         share->cardinality_upd,
14643         share->bitmap_size
14644       );
14645     }
14646     for (roop_count = 0, tmp_cardinality = share->cardinality;
14647       roop_count < (int) table->s->fields;
14648       roop_count++, tmp_cardinality++)
14649     {
14650       if (!spider_bit_is_set(share->cardinality_upd, roop_count))
14651       {
14652         DBUG_PRINT("info",
14653           ("spider uninitialized column cardinality id=%d", roop_count));
14654         *tmp_cardinality = -1;
14655       }
14656     }
14657     if (res)
14658     {
14659       res->free_result();
14660       delete res;
14661     }
14662     if (error_num)
14663     {
14664       switch (error_num)
14665       {
14666         case ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM:
14667           my_printf_error(ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM,
14668             ER_SPIDER_REMOTE_TABLE_NOT_FOUND_STR, MYF(0),
14669             mysql_share->db_names_str[spider->conn_link_idx[link_idx]].ptr(),
14670             mysql_share->table_names_str[spider->conn_link_idx[
14671               link_idx]].ptr());
14672           break;
14673         case ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM:
14674           my_printf_error(ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM,
14675             ER_SPIDER_INVALID_REMOTE_TABLE_INFO_STR, MYF(0),
14676             mysql_share->db_names_str[spider->conn_link_idx[link_idx]].ptr(),
14677             mysql_share->table_names_str[spider->conn_link_idx[
14678               link_idx]].ptr());
14679           break;
14680         default:
14681           break;
14682       }
14683       DBUG_RETURN(error_num);
14684     }
14685   }
14686   DBUG_RETURN(0);
14687 }
14688 
simple_action(uint simple_action,int link_idx)14689 int spider_mbase_handler::simple_action(
14690   uint simple_action,
14691   int link_idx
14692 ) {
14693   int error_num;
14694   SPIDER_CONN *conn = spider->conns[link_idx];
14695   SPIDER_DB_RESULT *res;
14696   SPIDER_SHARE *share = spider->share;
14697   uint pos = spider->conn_link_idx[link_idx];
14698   spider_string *str = NULL;
14699   DBUG_ENTER("spider_mbase_handler::simple_action");
14700   switch (simple_action)
14701   {
14702     case SPIDER_SIMPLE_RECORDS:
14703       DBUG_PRINT("info",("spider simple records"));
14704       str = &mysql_share->show_records[pos];
14705       break;
14706 #ifdef HA_HAS_CHECKSUM_EXTENDED
14707     case SPIDER_SIMPLE_CHECKSUM_TABLE:
14708       DBUG_PRINT("info",("spider simple checksum_table"));
14709       str = &spider->result_list.sqls[link_idx];
14710       str->length(0);
14711       if (str->reserve(
14712         SPIDER_SQL_CHECKSUM_TABLE_LEN +
14713         mysql_share->db_nm_max_length +
14714         SPIDER_SQL_DOT_LEN +
14715         mysql_share->table_nm_max_length +
14716         /* SPIDER_SQL_NAME_QUOTE_LEN */ 4 +
14717         ((spider->action_flags & T_QUICK) ? SPIDER_SQL_SQL_QUICK_LEN : 0) +
14718         ((spider->action_flags & T_EXTEND) ? SPIDER_SQL_SQL_EXTENDED_LEN : 0)
14719       ))
14720       {
14721         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
14722       }
14723       str->q_append(SPIDER_SQL_CHECKSUM_TABLE_STR,
14724         SPIDER_SQL_CHECKSUM_TABLE_LEN);
14725       mysql_share->append_table_name(str, pos);
14726       if (spider->action_flags & T_QUICK)
14727       {
14728         str->q_append(SPIDER_SQL_SQL_QUICK_STR, SPIDER_SQL_SQL_QUICK_LEN);
14729       }
14730       if (spider->action_flags & T_EXTEND)
14731       {
14732         str->q_append(SPIDER_SQL_SQL_EXTENDED_STR,
14733           SPIDER_SQL_SQL_EXTENDED_LEN);
14734       }
14735       break;
14736 #endif
14737     default:
14738       DBUG_ASSERT(0);
14739       DBUG_RETURN(0);
14740   }
14741   pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
14742   pthread_mutex_lock(&conn->mta_conn_mutex);
14743   SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
14744   conn->need_mon = &spider->need_mons[link_idx];
14745   DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
14746   DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
14747   conn->mta_conn_mutex_lock_already = TRUE;
14748   conn->mta_conn_mutex_unlock_later = TRUE;
14749   spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
14750     share);
14751   if (
14752     (error_num = spider_db_set_names(spider, conn, link_idx)) ||
14753     (
14754       spider_db_query(
14755         conn,
14756         str->ptr(),
14757         str->length(),
14758         -1,
14759         &spider->need_mons[link_idx]) &&
14760       (error_num = spider_db_errorno(conn))
14761     )
14762   ) {
14763     if (
14764       error_num == ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM &&
14765       !conn->disable_reconnect
14766     ) {
14767       /* retry */
14768       if ((error_num = spider_db_ping(spider, conn, link_idx)))
14769       {
14770         DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14771         DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14772         conn->mta_conn_mutex_lock_already = FALSE;
14773         conn->mta_conn_mutex_unlock_later = FALSE;
14774         SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14775         pthread_mutex_unlock(&conn->mta_conn_mutex);
14776         DBUG_PRINT("info", ("spider error_num=%d 1", error_num));
14777         DBUG_RETURN(error_num);
14778       }
14779       if ((error_num = spider_db_set_names(spider, conn, link_idx)))
14780       {
14781         DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14782         DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14783         conn->mta_conn_mutex_lock_already = FALSE;
14784         conn->mta_conn_mutex_unlock_later = FALSE;
14785         SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14786         pthread_mutex_unlock(&conn->mta_conn_mutex);
14787         DBUG_PRINT("info", ("spider error_num=%d 2", error_num));
14788         DBUG_RETURN(error_num);
14789       }
14790       spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
14791         share);
14792       if (spider_db_query(
14793         conn,
14794         str->ptr(),
14795         str->length(),
14796         -1,
14797         &spider->need_mons[link_idx])
14798       ) {
14799         DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14800         DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14801         conn->mta_conn_mutex_lock_already = FALSE;
14802         conn->mta_conn_mutex_unlock_later = FALSE;
14803         DBUG_PRINT("info", ("spider error_num=%d 3", error_num));
14804         DBUG_RETURN(spider_db_errorno(conn));
14805       }
14806     } else {
14807       DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14808       DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14809       conn->mta_conn_mutex_lock_already = FALSE;
14810       conn->mta_conn_mutex_unlock_later = FALSE;
14811       SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14812       pthread_mutex_unlock(&conn->mta_conn_mutex);
14813       DBUG_PRINT("info", ("spider error_num=%d 4", error_num));
14814       DBUG_RETURN(error_num);
14815     }
14816   }
14817   st_spider_db_request_key request_key;
14818   request_key.spider_thread_id = spider->trx->spider_thread_id;
14819   request_key.query_id = spider->trx->thd->query_id;
14820   request_key.handler = spider;
14821   request_key.request_id = 1;
14822   request_key.next = NULL;
14823   if (!(res = conn->db_conn->store_result(NULL, &request_key, &error_num)))
14824   {
14825     DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14826     DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14827     conn->mta_conn_mutex_lock_already = FALSE;
14828     conn->mta_conn_mutex_unlock_later = FALSE;
14829     if (error_num)
14830     {
14831       SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14832       pthread_mutex_unlock(&conn->mta_conn_mutex);
14833       DBUG_PRINT("info", ("spider error_num=%d 5", error_num));
14834       DBUG_RETURN(error_num);
14835     }
14836     else if ((error_num = spider_db_errorno(conn)))
14837     {
14838       DBUG_PRINT("info", ("spider error_num=%d 6", error_num));
14839       DBUG_RETURN(error_num);
14840     } else {
14841       DBUG_PRINT("info", ("spider error_num=%d 7",
14842         ER_QUERY_ON_FOREIGN_DATA_SOURCE));
14843       DBUG_RETURN(ER_QUERY_ON_FOREIGN_DATA_SOURCE);
14844     }
14845   }
14846   DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14847   DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14848   conn->mta_conn_mutex_lock_already = FALSE;
14849   conn->mta_conn_mutex_unlock_later = FALSE;
14850   SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14851   pthread_mutex_unlock(&conn->mta_conn_mutex);
14852   switch (simple_action)
14853   {
14854     case SPIDER_SIMPLE_RECORDS:
14855       DBUG_PRINT("info",("spider simple records"));
14856       error_num = res->fetch_table_records(1, spider->table_rows);
14857       break;
14858 #ifdef HA_HAS_CHECKSUM_EXTENDED
14859     case SPIDER_SIMPLE_CHECKSUM_TABLE:
14860       DBUG_PRINT("info",("spider simple checksum_table"));
14861       error_num = res->fetch_table_checksum(spider);
14862       break;
14863 #endif
14864     default:
14865       DBUG_ASSERT(0);
14866       break;
14867   }
14868   res->free_result();
14869   delete res;
14870   if (error_num)
14871   {
14872     DBUG_PRINT("info", ("spider error_num=%d 7", error_num));
14873     DBUG_RETURN(error_num);
14874   }
14875   DBUG_RETURN(0);
14876 }
14877 
show_records(int link_idx)14878 int spider_mbase_handler::show_records(
14879   int link_idx
14880 ) {
14881   int error_num;
14882   DBUG_ENTER("spider_mbase_handler::show_records");
14883   error_num = simple_action(SPIDER_SIMPLE_RECORDS, link_idx);
14884   if (error_num)
14885   {
14886     DBUG_PRINT("info", ("spider error_num=%d", error_num));
14887     DBUG_RETURN(error_num);
14888   }
14889   spider->trx->direct_aggregate_count++;
14890   DBUG_RETURN(0);
14891 }
14892 
14893 #ifdef HA_HAS_CHECKSUM_EXTENDED
checksum_table(int link_idx)14894 int spider_mbase_handler::checksum_table(
14895   int link_idx
14896 ) {
14897   DBUG_ENTER("spider_mbase_handler::checksum_table");
14898   DBUG_RETURN(simple_action(SPIDER_SIMPLE_CHECKSUM_TABLE, link_idx));
14899   DBUG_RETURN(0);
14900 }
14901 #endif
14902 
show_last_insert_id(int link_idx,ulonglong & last_insert_id)14903 int spider_mbase_handler::show_last_insert_id(
14904   int link_idx,
14905   ulonglong &last_insert_id
14906 ) {
14907   SPIDER_CONN *conn = spider->conns[link_idx];
14908   DBUG_ENTER("spider_mbase_handler::show_last_insert_id");
14909   last_insert_id = conn->db_conn->last_insert_id();
14910   DBUG_RETURN(0);
14911 }
14912 
explain_select(key_range * start_key,key_range * end_key,int link_idx)14913 ha_rows spider_mbase_handler::explain_select(
14914   key_range *start_key,
14915   key_range *end_key,
14916   int link_idx
14917 ) {
14918   int error_num;
14919   SPIDER_CONN *conn = spider->conns[link_idx];
14920   SPIDER_RESULT_LIST *result_list = &spider->result_list;
14921   spider_string *str = &result_list->sqls[link_idx];
14922   SPIDER_DB_RESULT *res;
14923   ha_rows rows;
14924   spider_db_handler *dbton_hdl = spider->dbton_handler[conn->dbton_id];
14925   DBUG_ENTER("spider_mbase_handler::explain_select");
14926   if ((error_num = dbton_hdl->append_explain_select_part(
14927     start_key, end_key, SPIDER_SQL_TYPE_OTHER_SQL, link_idx)))
14928   {
14929     my_errno = error_num;
14930     DBUG_RETURN(HA_POS_ERROR);
14931   }
14932 
14933   pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
14934   pthread_mutex_lock(&conn->mta_conn_mutex);
14935   SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
14936   conn->need_mon = &spider->need_mons[link_idx];
14937   DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
14938   DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
14939   conn->mta_conn_mutex_lock_already = TRUE;
14940   conn->mta_conn_mutex_unlock_later = TRUE;
14941   spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
14942     spider->share);
14943   if (
14944     (error_num = spider_db_set_names(spider, conn, link_idx)) ||
14945     (
14946       spider_db_query(
14947         conn,
14948         str->ptr(),
14949         str->length(),
14950         -1,
14951         &spider->need_mons[link_idx]) &&
14952       (error_num = spider_db_errorno(conn))
14953     )
14954   ) {
14955     if (
14956       error_num == ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM &&
14957       !conn->disable_reconnect
14958     ) {
14959       /* retry */
14960       if ((error_num = spider_db_ping(spider, conn, link_idx)))
14961       {
14962         if (spider->check_error_mode(error_num))
14963           my_errno = error_num;
14964         DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14965         DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14966         conn->mta_conn_mutex_lock_already = FALSE;
14967         conn->mta_conn_mutex_unlock_later = FALSE;
14968         SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14969         pthread_mutex_unlock(&conn->mta_conn_mutex);
14970         DBUG_RETURN(HA_POS_ERROR);
14971       }
14972       if ((error_num = spider_db_set_names(spider, conn, link_idx)))
14973       {
14974         if (spider->check_error_mode(error_num))
14975           my_errno = error_num;
14976         DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14977         DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14978         conn->mta_conn_mutex_lock_already = FALSE;
14979         conn->mta_conn_mutex_unlock_later = FALSE;
14980         SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14981         pthread_mutex_unlock(&conn->mta_conn_mutex);
14982         DBUG_RETURN(HA_POS_ERROR);
14983       }
14984       spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
14985         spider->share);
14986       if (spider_db_query(
14987         conn,
14988         str->ptr(),
14989         str->length(),
14990         -1,
14991         &spider->need_mons[link_idx])
14992       ) {
14993         error_num = spider_db_errorno(conn);
14994         if (spider->check_error_mode(error_num))
14995           my_errno = error_num;
14996         DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14997         DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14998         conn->mta_conn_mutex_lock_already = FALSE;
14999         conn->mta_conn_mutex_unlock_later = FALSE;
15000         SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15001         pthread_mutex_unlock(&conn->mta_conn_mutex);
15002         DBUG_RETURN(HA_POS_ERROR);
15003       }
15004     } else {
15005       if (spider->check_error_mode(error_num))
15006         my_errno = error_num;
15007       DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15008       DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15009       conn->mta_conn_mutex_lock_already = FALSE;
15010       conn->mta_conn_mutex_unlock_later = FALSE;
15011       SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15012       pthread_mutex_unlock(&conn->mta_conn_mutex);
15013       DBUG_RETURN(HA_POS_ERROR);
15014     }
15015   }
15016   st_spider_db_request_key request_key;
15017   request_key.spider_thread_id = spider->trx->spider_thread_id;
15018   request_key.query_id = spider->trx->thd->query_id;
15019   request_key.handler = spider;
15020   request_key.request_id = 1;
15021   request_key.next = NULL;
15022   if (!(res = conn->db_conn->store_result(NULL, &request_key, &error_num)))
15023   {
15024     if (error_num || (error_num = spider_db_errorno(conn)))
15025     {
15026       if (spider->check_error_mode(error_num))
15027         my_errno = error_num;
15028       DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15029       DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15030       conn->mta_conn_mutex_lock_already = FALSE;
15031       conn->mta_conn_mutex_unlock_later = FALSE;
15032       SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15033       pthread_mutex_unlock(&conn->mta_conn_mutex);
15034       DBUG_RETURN(HA_POS_ERROR);
15035     } else {
15036       my_errno = ER_QUERY_ON_FOREIGN_DATA_SOURCE;
15037       DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15038       DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15039       conn->mta_conn_mutex_lock_already = FALSE;
15040       conn->mta_conn_mutex_unlock_later = FALSE;
15041       SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15042       pthread_mutex_unlock(&conn->mta_conn_mutex);
15043       DBUG_RETURN(HA_POS_ERROR);
15044     }
15045   }
15046   DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15047   DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15048   conn->mta_conn_mutex_lock_already = FALSE;
15049   conn->mta_conn_mutex_unlock_later = FALSE;
15050   SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15051   pthread_mutex_unlock(&conn->mta_conn_mutex);
15052   error_num = res->fetch_table_records(
15053     2,
15054     rows
15055   );
15056   res->free_result();
15057   delete res;
15058   if (error_num)
15059   {
15060     my_errno = error_num;
15061     DBUG_RETURN(HA_POS_ERROR);
15062   }
15063   DBUG_RETURN(rows);
15064 }
15065 
lock_tables(int link_idx)15066 int spider_mbase_handler::lock_tables(
15067   int link_idx
15068 ) {
15069   int error_num;
15070   SPIDER_CONN *conn = spider->conns[link_idx];
15071   spider_string *str = &sql;
15072   DBUG_ENTER("spider_mbase_handler::lock_tables");
15073   str->length(0);
15074   if ((error_num = conn->db_conn->append_lock_tables(str)))
15075   {
15076     DBUG_RETURN(error_num);
15077   }
15078   if (str->length())
15079   {
15080     pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
15081     pthread_mutex_lock(&conn->mta_conn_mutex);
15082     SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
15083     conn->need_mon = &spider->need_mons[link_idx];
15084     DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
15085     DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
15086     conn->mta_conn_mutex_lock_already = TRUE;
15087     conn->mta_conn_mutex_unlock_later = TRUE;
15088     if ((error_num = spider_db_set_names(spider, conn, link_idx)))
15089     {
15090       DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15091       DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15092       conn->mta_conn_mutex_lock_already = FALSE;
15093       conn->mta_conn_mutex_unlock_later = FALSE;
15094       SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15095       pthread_mutex_unlock(&conn->mta_conn_mutex);
15096       DBUG_RETURN(error_num);
15097     }
15098     spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
15099       spider->share);
15100     if (spider_db_query(
15101       conn,
15102       str->ptr(),
15103       str->length(),
15104       -1,
15105       &spider->need_mons[link_idx])
15106     ) {
15107       DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15108       DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15109       conn->mta_conn_mutex_lock_already = FALSE;
15110       conn->mta_conn_mutex_unlock_later = FALSE;
15111       DBUG_RETURN(spider_db_errorno(conn));
15112     }
15113     DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15114     DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15115     conn->mta_conn_mutex_lock_already = FALSE;
15116     conn->mta_conn_mutex_unlock_later = FALSE;
15117     SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15118     pthread_mutex_unlock(&conn->mta_conn_mutex);
15119   }
15120   if (!conn->table_locked)
15121   {
15122     conn->table_locked = TRUE;
15123     spider->trx->locked_connections++;
15124   }
15125   DBUG_RETURN(0);
15126 }
15127 
unlock_tables(int link_idx)15128 int spider_mbase_handler::unlock_tables(
15129   int link_idx
15130 ) {
15131   int error_num;
15132   SPIDER_CONN *conn = spider->conns[link_idx];
15133   DBUG_ENTER("spider_mbase_handler::unlock_tables");
15134   if (conn->table_locked)
15135   {
15136     spider_string *str = &sql;
15137     conn->table_locked = FALSE;
15138     spider->trx->locked_connections--;
15139 
15140     str->length(0);
15141     if ((error_num = conn->db_conn->append_unlock_tables(str)))
15142     {
15143       DBUG_RETURN(error_num);
15144     }
15145     if (str->length())
15146     {
15147       spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
15148         spider->share);
15149       pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
15150       pthread_mutex_lock(&conn->mta_conn_mutex);
15151       SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
15152       conn->need_mon = &spider->need_mons[link_idx];
15153       DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
15154       DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
15155       conn->mta_conn_mutex_lock_already = TRUE;
15156       conn->mta_conn_mutex_unlock_later = TRUE;
15157       if (spider_db_query(
15158         conn,
15159         str->ptr(),
15160         str->length(),
15161         -1,
15162         &spider->need_mons[link_idx])
15163       ) {
15164         DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15165         DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15166         conn->mta_conn_mutex_lock_already = FALSE;
15167         conn->mta_conn_mutex_unlock_later = FALSE;
15168         DBUG_RETURN(spider_db_errorno(conn));
15169       }
15170       DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15171       DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15172       conn->mta_conn_mutex_lock_already = FALSE;
15173       conn->mta_conn_mutex_unlock_later = FALSE;
15174       SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15175       pthread_mutex_unlock(&conn->mta_conn_mutex);
15176     }
15177   }
15178   DBUG_RETURN(0);
15179 }
15180 
disable_keys(SPIDER_CONN * conn,int link_idx)15181 int spider_mbase_handler::disable_keys(
15182   SPIDER_CONN *conn,
15183   int link_idx
15184 ) {
15185   int error_num;
15186   SPIDER_SHARE *share = spider->share;
15187   spider_string *str = &spider->result_list.sqls[link_idx];
15188   DBUG_ENTER("spider_mbase_handler::disable_keys");
15189   DBUG_PRINT("info",("spider this=%p", this));
15190   str->length(0);
15191   if ((error_num = append_disable_keys_part(SPIDER_SQL_TYPE_OTHER_HS,
15192     link_idx)))
15193   {
15194     DBUG_RETURN(error_num);
15195   }
15196   pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
15197   pthread_mutex_lock(&conn->mta_conn_mutex);
15198   SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
15199   conn->need_mon = &spider->need_mons[link_idx];
15200   DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
15201   DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
15202   conn->mta_conn_mutex_lock_already = TRUE;
15203   conn->mta_conn_mutex_unlock_later = TRUE;
15204   if ((error_num = spider_db_set_names(spider, conn, link_idx)))
15205   {
15206     DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15207     DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15208     conn->mta_conn_mutex_lock_already = FALSE;
15209     conn->mta_conn_mutex_unlock_later = FALSE;
15210     SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15211     pthread_mutex_unlock(&conn->mta_conn_mutex);
15212     DBUG_RETURN(error_num);
15213   }
15214   spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
15215     share);
15216   if (spider_db_query(
15217     conn,
15218     str->ptr(),
15219     str->length(),
15220     -1,
15221     &spider->need_mons[link_idx])
15222   ) {
15223     DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15224     DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15225     conn->mta_conn_mutex_lock_already = FALSE;
15226     conn->mta_conn_mutex_unlock_later = FALSE;
15227     error_num = spider_db_errorno(conn);
15228     DBUG_RETURN(error_num);
15229   }
15230   DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15231   DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15232   conn->mta_conn_mutex_lock_already = FALSE;
15233   conn->mta_conn_mutex_unlock_later = FALSE;
15234   SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15235   pthread_mutex_unlock(&conn->mta_conn_mutex);
15236   DBUG_RETURN(0);
15237 }
15238 
enable_keys(SPIDER_CONN * conn,int link_idx)15239 int spider_mbase_handler::enable_keys(
15240   SPIDER_CONN *conn,
15241   int link_idx
15242 ) {
15243   int error_num;
15244   SPIDER_SHARE *share = spider->share;
15245   spider_string *str = &spider->result_list.sqls[link_idx];
15246   DBUG_ENTER("spider_mbase_handler::enable_keys");
15247   DBUG_PRINT("info",("spider this=%p", this));
15248   str->length(0);
15249   if ((error_num = append_enable_keys_part(SPIDER_SQL_TYPE_OTHER_HS,
15250     link_idx)))
15251   {
15252     DBUG_RETURN(error_num);
15253   }
15254   pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
15255   pthread_mutex_lock(&conn->mta_conn_mutex);
15256   SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
15257   conn->need_mon = &spider->need_mons[link_idx];
15258   DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
15259   DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
15260   conn->mta_conn_mutex_lock_already = TRUE;
15261   conn->mta_conn_mutex_unlock_later = TRUE;
15262   if ((error_num = spider_db_set_names(spider, conn, link_idx)))
15263   {
15264     DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15265     DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15266     conn->mta_conn_mutex_lock_already = FALSE;
15267     conn->mta_conn_mutex_unlock_later = FALSE;
15268     SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15269     pthread_mutex_unlock(&conn->mta_conn_mutex);
15270     DBUG_RETURN(error_num);
15271   }
15272   spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
15273     share);
15274   if (spider_db_query(
15275     conn,
15276     str->ptr(),
15277     str->length(),
15278     -1,
15279     &spider->need_mons[link_idx])
15280   ) {
15281     DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15282     DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15283     conn->mta_conn_mutex_lock_already = FALSE;
15284     conn->mta_conn_mutex_unlock_later = FALSE;
15285     error_num = spider_db_errorno(conn);
15286     DBUG_RETURN(error_num);
15287   }
15288   DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15289   DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15290   conn->mta_conn_mutex_lock_already = FALSE;
15291   conn->mta_conn_mutex_unlock_later = FALSE;
15292   SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15293   pthread_mutex_unlock(&conn->mta_conn_mutex);
15294   DBUG_RETURN(0);
15295 }
15296 
check_table(SPIDER_CONN * conn,int link_idx,HA_CHECK_OPT * check_opt)15297 int spider_mbase_handler::check_table(
15298   SPIDER_CONN *conn,
15299   int link_idx,
15300   HA_CHECK_OPT* check_opt
15301 ) {
15302   int error_num;
15303   SPIDER_SHARE *share = spider->share;
15304   spider_string *str = &spider->result_list.sqls[link_idx];
15305   DBUG_ENTER("spider_mbase_handler::check_table");
15306   DBUG_PRINT("info",("spider this=%p", this));
15307   str->length(0);
15308   if ((error_num = append_check_table_part(SPIDER_SQL_TYPE_OTHER_HS,
15309     link_idx, check_opt)))
15310   {
15311     DBUG_RETURN(error_num);
15312   }
15313   pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
15314   pthread_mutex_lock(&conn->mta_conn_mutex);
15315   SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
15316   conn->need_mon = &spider->need_mons[link_idx];
15317   DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
15318   DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
15319   conn->mta_conn_mutex_lock_already = TRUE;
15320   conn->mta_conn_mutex_unlock_later = TRUE;
15321   if ((error_num = spider_db_set_names(spider, conn, link_idx)))
15322   {
15323     DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15324     DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15325     conn->mta_conn_mutex_lock_already = FALSE;
15326     conn->mta_conn_mutex_unlock_later = FALSE;
15327     SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15328     pthread_mutex_unlock(&conn->mta_conn_mutex);
15329     DBUG_RETURN(error_num);
15330   }
15331   spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
15332     share);
15333   if (spider_db_query(
15334     conn,
15335     str->ptr(),
15336     str->length(),
15337     -1,
15338     &spider->need_mons[link_idx])
15339   ) {
15340     DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15341     DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15342     conn->mta_conn_mutex_lock_already = FALSE;
15343     conn->mta_conn_mutex_unlock_later = FALSE;
15344     error_num = spider_db_errorno(conn);
15345     DBUG_RETURN(error_num);
15346   }
15347   DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15348   DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15349   conn->mta_conn_mutex_lock_already = FALSE;
15350   conn->mta_conn_mutex_unlock_later = FALSE;
15351   SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15352   pthread_mutex_unlock(&conn->mta_conn_mutex);
15353   DBUG_RETURN(0);
15354 }
15355 
repair_table(SPIDER_CONN * conn,int link_idx,HA_CHECK_OPT * check_opt)15356 int spider_mbase_handler::repair_table(
15357   SPIDER_CONN *conn,
15358   int link_idx,
15359   HA_CHECK_OPT* check_opt
15360 ) {
15361   int error_num;
15362   SPIDER_SHARE *share = spider->share;
15363   spider_string *str = &spider->result_list.sqls[link_idx];
15364   DBUG_ENTER("spider_mbase_handler::repair_table");
15365   DBUG_PRINT("info",("spider this=%p", this));
15366   str->length(0);
15367   if ((error_num = append_repair_table_part(SPIDER_SQL_TYPE_OTHER_HS,
15368     link_idx, check_opt)))
15369   {
15370     DBUG_RETURN(error_num);
15371   }
15372   pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
15373   pthread_mutex_lock(&conn->mta_conn_mutex);
15374   SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
15375   conn->need_mon = &spider->need_mons[link_idx];
15376   DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
15377   DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
15378   conn->mta_conn_mutex_lock_already = TRUE;
15379   conn->mta_conn_mutex_unlock_later = TRUE;
15380   if ((error_num = spider_db_set_names(spider, conn, link_idx)))
15381   {
15382     DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15383     DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15384     conn->mta_conn_mutex_lock_already = FALSE;
15385     conn->mta_conn_mutex_unlock_later = FALSE;
15386     SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15387     pthread_mutex_unlock(&conn->mta_conn_mutex);
15388     DBUG_RETURN(error_num);
15389   }
15390   spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
15391     share);
15392   if (spider_db_query(
15393     conn,
15394     str->ptr(),
15395     str->length(),
15396     -1,
15397     &spider->need_mons[link_idx])
15398   ) {
15399     DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15400     DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15401     conn->mta_conn_mutex_lock_already = FALSE;
15402     conn->mta_conn_mutex_unlock_later = FALSE;
15403     error_num = spider_db_errorno(conn);
15404     DBUG_RETURN(error_num);
15405   }
15406   DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15407   DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15408   conn->mta_conn_mutex_lock_already = FALSE;
15409   conn->mta_conn_mutex_unlock_later = FALSE;
15410   SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15411   pthread_mutex_unlock(&conn->mta_conn_mutex);
15412   DBUG_RETURN(0);
15413 }
15414 
analyze_table(SPIDER_CONN * conn,int link_idx)15415 int spider_mbase_handler::analyze_table(
15416   SPIDER_CONN *conn,
15417   int link_idx
15418 ) {
15419   int error_num;
15420   SPIDER_SHARE *share = spider->share;
15421   spider_string *str = &spider->result_list.sqls[link_idx];
15422   DBUG_ENTER("spider_mbase_handler::analyze_table");
15423   DBUG_PRINT("info",("spider this=%p", this));
15424   str->length(0);
15425   if ((error_num = append_analyze_table_part(SPIDER_SQL_TYPE_OTHER_HS,
15426     link_idx)))
15427   {
15428     DBUG_RETURN(error_num);
15429   }
15430   pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
15431   pthread_mutex_lock(&conn->mta_conn_mutex);
15432   SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
15433   conn->need_mon = &spider->need_mons[link_idx];
15434   DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
15435   DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
15436   conn->mta_conn_mutex_lock_already = TRUE;
15437   conn->mta_conn_mutex_unlock_later = TRUE;
15438   if ((error_num = spider_db_set_names(spider, conn, link_idx)))
15439   {
15440     DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15441     DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15442     conn->mta_conn_mutex_lock_already = FALSE;
15443     conn->mta_conn_mutex_unlock_later = FALSE;
15444     SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15445     pthread_mutex_unlock(&conn->mta_conn_mutex);
15446     DBUG_RETURN(error_num);
15447   }
15448   spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
15449     share);
15450   if (spider_db_query(
15451     conn,
15452     str->ptr(),
15453     str->length(),
15454     -1,
15455     &spider->need_mons[link_idx])
15456   ) {
15457     DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15458     DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15459     conn->mta_conn_mutex_lock_already = FALSE;
15460     conn->mta_conn_mutex_unlock_later = FALSE;
15461     error_num = spider_db_errorno(conn);
15462     DBUG_RETURN(error_num);
15463   }
15464   DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15465   DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15466   conn->mta_conn_mutex_lock_already = FALSE;
15467   conn->mta_conn_mutex_unlock_later = FALSE;
15468   SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15469   pthread_mutex_unlock(&conn->mta_conn_mutex);
15470   DBUG_RETURN(0);
15471 }
15472 
optimize_table(SPIDER_CONN * conn,int link_idx)15473 int spider_mbase_handler::optimize_table(
15474   SPIDER_CONN *conn,
15475   int link_idx
15476 ) {
15477   int error_num;
15478   SPIDER_SHARE *share = spider->share;
15479   spider_string *str = &spider->result_list.sqls[link_idx];
15480   DBUG_ENTER("spider_mbase_handler::optimize_table");
15481   DBUG_PRINT("info",("spider this=%p", this));
15482   str->length(0);
15483   if ((error_num = append_optimize_table_part(SPIDER_SQL_TYPE_OTHER_HS,
15484     link_idx)))
15485   {
15486     DBUG_RETURN(error_num);
15487   }
15488   pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
15489   pthread_mutex_lock(&conn->mta_conn_mutex);
15490   SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
15491   conn->need_mon = &spider->need_mons[link_idx];
15492   DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
15493   DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
15494   conn->mta_conn_mutex_lock_already = TRUE;
15495   conn->mta_conn_mutex_unlock_later = TRUE;
15496   if ((error_num = spider_db_set_names(spider, conn, link_idx)))
15497   {
15498     DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15499     DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15500     conn->mta_conn_mutex_lock_already = FALSE;
15501     conn->mta_conn_mutex_unlock_later = FALSE;
15502     SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15503     pthread_mutex_unlock(&conn->mta_conn_mutex);
15504     DBUG_RETURN(error_num);
15505   }
15506   spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
15507     share);
15508   if (spider_db_query(
15509     conn,
15510     str->ptr(),
15511     str->length(),
15512     -1,
15513     &spider->need_mons[link_idx])
15514   ) {
15515     DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15516     DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15517     conn->mta_conn_mutex_lock_already = FALSE;
15518     conn->mta_conn_mutex_unlock_later = FALSE;
15519     error_num = spider_db_errorno(conn);
15520     DBUG_RETURN(error_num);
15521   }
15522   DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15523   DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15524   conn->mta_conn_mutex_lock_already = FALSE;
15525   conn->mta_conn_mutex_unlock_later = FALSE;
15526   SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15527   pthread_mutex_unlock(&conn->mta_conn_mutex);
15528   DBUG_RETURN(0);
15529 }
15530 
flush_tables(SPIDER_CONN * conn,int link_idx,bool lock)15531 int spider_mbase_handler::flush_tables(
15532   SPIDER_CONN *conn,
15533   int link_idx,
15534   bool lock
15535 ) {
15536   int error_num;
15537   SPIDER_SHARE *share = spider->share;
15538   spider_string *str = &spider->result_list.sqls[link_idx];
15539   DBUG_ENTER("spider_mbase_handler::flush_tables");
15540   DBUG_PRINT("info",("spider this=%p", this));
15541   str->length(0);
15542   if ((error_num = append_flush_tables_part(SPIDER_SQL_TYPE_OTHER_HS,
15543     link_idx, lock)))
15544   {
15545     DBUG_RETURN(error_num);
15546   }
15547   spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
15548     share);
15549   pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
15550   pthread_mutex_lock(&conn->mta_conn_mutex);
15551   SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
15552   conn->need_mon = &spider->need_mons[link_idx];
15553   DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
15554   DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
15555   conn->mta_conn_mutex_lock_already = TRUE;
15556   conn->mta_conn_mutex_unlock_later = TRUE;
15557   if (spider_db_query(
15558     conn,
15559     str->ptr(),
15560     str->length(),
15561     -1,
15562     &spider->need_mons[link_idx])
15563   ) {
15564     DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15565     DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15566     conn->mta_conn_mutex_lock_already = FALSE;
15567     conn->mta_conn_mutex_unlock_later = FALSE;
15568     error_num = spider_db_errorno(conn);
15569     DBUG_RETURN(error_num);
15570   }
15571   DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15572   DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15573   conn->mta_conn_mutex_lock_already = FALSE;
15574   conn->mta_conn_mutex_unlock_later = FALSE;
15575   SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15576   pthread_mutex_unlock(&conn->mta_conn_mutex);
15577   DBUG_RETURN(0);
15578 }
15579 
flush_logs(SPIDER_CONN * conn,int link_idx)15580 int spider_mbase_handler::flush_logs(
15581   SPIDER_CONN *conn,
15582   int link_idx
15583 ) {
15584   int error_num;
15585   SPIDER_SHARE *share = spider->share;
15586   DBUG_ENTER("spider_mbase_handler::flush_logs");
15587   DBUG_PRINT("info",("spider this=%p", this));
15588   spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
15589     share);
15590   pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
15591   pthread_mutex_lock(&conn->mta_conn_mutex);
15592   SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
15593   conn->need_mon = &spider->need_mons[link_idx];
15594   DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
15595   DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
15596   conn->mta_conn_mutex_lock_already = TRUE;
15597   conn->mta_conn_mutex_unlock_later = TRUE;
15598   if (spider_db_query(
15599     conn,
15600     SPIDER_SQL_FLUSH_LOGS_STR,
15601     SPIDER_SQL_FLUSH_LOGS_LEN,
15602     -1,
15603     &spider->need_mons[link_idx])
15604   ) {
15605     DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15606     DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15607     conn->mta_conn_mutex_lock_already = FALSE;
15608     conn->mta_conn_mutex_unlock_later = FALSE;
15609     error_num = spider_db_errorno(conn);
15610     DBUG_RETURN(error_num);
15611   }
15612   DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15613   DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15614   conn->mta_conn_mutex_lock_already = FALSE;
15615   conn->mta_conn_mutex_unlock_later = FALSE;
15616   SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15617   pthread_mutex_unlock(&conn->mta_conn_mutex);
15618   DBUG_RETURN(0);
15619 }
15620 
insert_opened_handler(SPIDER_CONN * conn,int link_idx)15621 int spider_mbase_handler::insert_opened_handler(
15622   SPIDER_CONN *conn,
15623   int link_idx
15624 ) {
15625   spider_db_mbase *db_conn = (spider_db_mbase *) conn->db_conn;
15626   SPIDER_LINK_FOR_HASH *tmp_link_for_hash = &link_for_hash[link_idx];
15627   DBUG_ASSERT(tmp_link_for_hash->spider == spider);
15628   DBUG_ASSERT(tmp_link_for_hash->link_idx == link_idx);
15629   uint old_elements = db_conn->handler_open_array.max_element;
15630   DBUG_ENTER("spider_mbase_handler::insert_opened_handler");
15631   DBUG_PRINT("info",("spider this=%p", this));
15632   if (insert_dynamic(&db_conn->handler_open_array,
15633     (uchar*) &tmp_link_for_hash))
15634   {
15635     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
15636   }
15637   if (db_conn->handler_open_array.max_element > old_elements)
15638   {
15639     spider_alloc_calc_mem(spider_current_trx,
15640       db_conn->handler_open_array,
15641       (db_conn->handler_open_array.max_element - old_elements) *
15642       db_conn->handler_open_array.size_of_element);
15643   }
15644   DBUG_RETURN(0);
15645 }
15646 
delete_opened_handler(SPIDER_CONN * conn,int link_idx)15647 int spider_mbase_handler::delete_opened_handler(
15648   SPIDER_CONN *conn,
15649   int link_idx
15650 ) {
15651   spider_db_mbase *db_conn = (spider_db_mbase *) conn->db_conn;
15652   uint roop_count, elements = db_conn->handler_open_array.elements;
15653   SPIDER_LINK_FOR_HASH *tmp_link_for_hash;
15654   DBUG_ENTER("spider_mbase_handler::delete_opened_handler");
15655   DBUG_PRINT("info",("spider this=%p", this));
15656   for (roop_count = 0; roop_count < elements; roop_count++)
15657   {
15658     get_dynamic(&db_conn->handler_open_array, (uchar *) &tmp_link_for_hash,
15659       roop_count);
15660     if (tmp_link_for_hash == &link_for_hash[link_idx])
15661     {
15662       delete_dynamic_element(&db_conn->handler_open_array, roop_count);
15663       break;
15664     }
15665   }
15666   DBUG_ASSERT(roop_count < elements);
15667   DBUG_RETURN(0);
15668 }
15669 
sync_from_clone_source(spider_db_handler * dbton_hdl)15670 int spider_mbase_handler::sync_from_clone_source(
15671   spider_db_handler *dbton_hdl
15672 ) {
15673   DBUG_ENTER("spider_mbase_handler::sync_from_clone_source");
15674   DBUG_PRINT("info",("spider this=%p", this));
15675   DBUG_RETURN(0);
15676 }
15677 
support_use_handler(int use_handler)15678 bool spider_mbase_handler::support_use_handler(
15679   int use_handler
15680 ) {
15681   DBUG_ENTER("spider_mbase_handler::support_use_handler");
15682   DBUG_PRINT("info",("spider this=%p", this));
15683   DBUG_RETURN(TRUE);
15684 }
15685 
minimum_select_bitmap_create()15686 void spider_mbase_handler::minimum_select_bitmap_create()
15687 {
15688   TABLE *table = spider->get_table();
15689   Field **field_p;
15690   DBUG_ENTER("spider_mbase_handler::minimum_select_bitmap_create");
15691   DBUG_PRINT("info",("spider this=%p", this));
15692   memset(minimum_select_bitmap, 0, no_bytes_in_map(table->read_set));
15693   if (
15694     spider->use_index_merge ||
15695 #ifdef HA_CAN_BULK_ACCESS
15696     (spider->is_clone && !spider->is_bulk_access_clone)
15697 #else
15698     spider->is_clone
15699 #endif
15700   ) {
15701     /* need preparing for cmp_ref */
15702     TABLE_SHARE *table_share = table->s;
15703     if (
15704       table_share->primary_key == MAX_KEY
15705     ) {
15706       /* need all columns */
15707       memset(minimum_select_bitmap, 0xFF, no_bytes_in_map(table->read_set));
15708       DBUG_VOID_RETURN;
15709     } else {
15710       /* need primary key columns */
15711       uint roop_count;
15712       KEY *key_info;
15713       KEY_PART_INFO *key_part;
15714       Field *field;
15715       key_info = &table_share->key_info[table_share->primary_key];
15716       key_part = key_info->key_part;
15717       for (roop_count = 0;
15718         roop_count < spider_user_defined_key_parts(key_info);
15719         roop_count++)
15720       {
15721         field = key_part[roop_count].field;
15722         spider_set_bit(minimum_select_bitmap, field->field_index);
15723       }
15724     }
15725   }
15726   DBUG_PRINT("info",("spider searched_bitmap=%p", spider->searched_bitmap));
15727   for (field_p = table->field; *field_p; field_p++)
15728   {
15729     uint field_index = (*field_p)->field_index;
15730     DBUG_PRINT("info",("spider field_index=%u", field_index));
15731     DBUG_PRINT("info",("spider ft_discard_bitmap=%s",
15732       spider_bit_is_set(spider->ft_discard_bitmap, field_index) ?
15733         "TRUE" : "FALSE"));
15734     DBUG_PRINT("info",("spider searched_bitmap=%s",
15735       spider_bit_is_set(spider->searched_bitmap, field_index) ?
15736         "TRUE" : "FALSE"));
15737     DBUG_PRINT("info",("spider read_set=%s",
15738       bitmap_is_set(table->read_set, field_index) ?
15739         "TRUE" : "FALSE"));
15740     DBUG_PRINT("info",("spider write_set=%s",
15741       bitmap_is_set(table->write_set, field_index) ?
15742         "TRUE" : "FALSE"));
15743     if (
15744       spider_bit_is_set(spider->ft_discard_bitmap, field_index) &
15745       (
15746         spider_bit_is_set(spider->searched_bitmap, field_index) |
15747         bitmap_is_set(table->read_set, field_index) |
15748         bitmap_is_set(table->write_set, field_index)
15749       )
15750     ) {
15751       spider_set_bit(minimum_select_bitmap, field_index);
15752     }
15753   }
15754   DBUG_VOID_RETURN;
15755 }
15756 
minimum_select_bit_is_set(uint field_index)15757 bool spider_mbase_handler::minimum_select_bit_is_set(
15758   uint field_index
15759 ) {
15760   DBUG_ENTER("spider_mbase_handler::minimum_select_bit_is_set");
15761   DBUG_PRINT("info",("spider this=%p", this));
15762   DBUG_PRINT("info",("spider field_index=%u", field_index));
15763   DBUG_PRINT("info",("spider minimum_select_bitmap=%s",
15764     spider_bit_is_set(minimum_select_bitmap, field_index) ?
15765       "TRUE" : "FALSE"));
15766   DBUG_RETURN(spider_bit_is_set(minimum_select_bitmap, field_index));
15767 }
15768 
copy_minimum_select_bitmap(uchar * bitmap)15769 void spider_mbase_handler::copy_minimum_select_bitmap(
15770   uchar *bitmap
15771 ) {
15772   int roop_count;
15773   TABLE *table = spider->get_table();
15774   DBUG_ENTER("spider_mbase_handler::copy_minimum_select_bitmap");
15775   for (roop_count = 0;
15776     roop_count < (int) ((table->s->fields + 7) / 8);
15777     roop_count++)
15778   {
15779     bitmap[roop_count] =
15780       minimum_select_bitmap[roop_count];
15781     DBUG_PRINT("info",("spider roop_count=%d", roop_count));
15782     DBUG_PRINT("info",("spider bitmap=%d",
15783       bitmap[roop_count]));
15784   }
15785   DBUG_VOID_RETURN;
15786 }
15787 
init_union_table_name_pos()15788 int spider_mbase_handler::init_union_table_name_pos()
15789 {
15790   DBUG_ENTER("spider_mbase_handler::init_union_table_name_pos");
15791   DBUG_PRINT("info",("spider this=%p", this));
15792   if (!union_table_name_pos_first)
15793   {
15794     if (!spider_bulk_malloc(spider_current_trx, 236, MYF(MY_WME),
15795       &union_table_name_pos_first, sizeof(SPIDER_INT_HLD),
15796       NullS)
15797     ) {
15798       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
15799     }
15800     union_table_name_pos_first->next = NULL;
15801   }
15802   union_table_name_pos_current = union_table_name_pos_first;
15803   union_table_name_pos_current->tgt_num = 0;
15804   DBUG_RETURN(0);
15805 }
15806 
set_union_table_name_pos()15807 int spider_mbase_handler::set_union_table_name_pos()
15808 {
15809   DBUG_ENTER("spider_mbase_handler::set_union_table_name_pos");
15810   DBUG_PRINT("info",("spider this=%p", this));
15811   if (union_table_name_pos_current->tgt_num >= SPIDER_INT_HLD_TGT_SIZE)
15812   {
15813     if (!union_table_name_pos_current->next)
15814     {
15815       if (!spider_bulk_malloc(spider_current_trx, 237, MYF(MY_WME),
15816         &union_table_name_pos_current->next, sizeof(SPIDER_INT_HLD),
15817         NullS)
15818       ) {
15819         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
15820       }
15821       union_table_name_pos_current->next->next = NULL;
15822     }
15823     union_table_name_pos_current = union_table_name_pos_current->next;
15824     union_table_name_pos_current->tgt_num = 0;
15825   }
15826   union_table_name_pos_current->tgt[union_table_name_pos_current->tgt_num] =
15827     table_name_pos;
15828   ++union_table_name_pos_current->tgt_num;
15829   DBUG_RETURN(0);
15830 }
15831 
reset_union_table_name(spider_string * str,int link_idx,ulong sql_type)15832 int spider_mbase_handler::reset_union_table_name(
15833   spider_string *str,
15834   int link_idx,
15835   ulong sql_type
15836 ) {
15837   DBUG_ENTER("spider_mbase_handler::reset_union_table_name");
15838   DBUG_PRINT("info",("spider this=%p", this));
15839   if (!union_table_name_pos_current)
15840     DBUG_RETURN(0);
15841 
15842   SPIDER_INT_HLD *tmp_pos = union_table_name_pos_first;
15843   uint cur_num, pos_backup = str->length();
15844   while(TRUE)
15845   {
15846     for (cur_num = 0; cur_num < tmp_pos->tgt_num; ++cur_num)
15847     {
15848       str->length(tmp_pos->tgt[cur_num]);
15849       append_table_name_with_adjusting(str, link_idx, sql_type);
15850     }
15851     if (tmp_pos == union_table_name_pos_current)
15852       break;
15853     tmp_pos = tmp_pos->next;
15854   }
15855   str->length(pos_backup);
15856   DBUG_RETURN(0);
15857 }
15858 
15859 #ifdef SPIDER_HAS_GROUP_BY_HANDLER
append_from_and_tables_part(spider_fields * fields,ulong sql_type)15860 int spider_mbase_handler::append_from_and_tables_part(
15861   spider_fields *fields,
15862   ulong sql_type
15863 ) {
15864   int error_num;
15865   spider_string *str;
15866   SPIDER_TABLE_HOLDER *table_holder;
15867   TABLE_LIST *table_list;
15868   DBUG_ENTER("spider_mbase_handler::append_from_and_tables_part");
15869   DBUG_PRINT("info",("spider this=%p", this));
15870   switch (sql_type)
15871   {
15872     case SPIDER_SQL_TYPE_SELECT_SQL:
15873       str = &sql;
15874       break;
15875     default:
15876       DBUG_RETURN(0);
15877   }
15878   fields->set_pos_to_first_table_holder();
15879   table_holder = fields->get_next_table_holder();
15880   table_list = table_holder->table->pos_in_table_list;
15881   error_num = spider_db_mbase_utility->append_from_and_tables(
15882     table_holder->spider, fields, str,
15883     table_list, fields->get_table_count());
15884   DBUG_RETURN(error_num);
15885 }
15886 
reappend_tables_part(spider_fields * fields,ulong sql_type)15887 int spider_mbase_handler::reappend_tables_part(
15888   spider_fields *fields,
15889   ulong sql_type
15890 ) {
15891   int error_num;
15892   spider_string *str;
15893   DBUG_ENTER("spider_mbase_handler::reappend_tables_part");
15894   DBUG_PRINT("info",("spider this=%p", this));
15895   switch (sql_type)
15896   {
15897     case SPIDER_SQL_TYPE_SELECT_SQL:
15898       str = &sql;
15899       break;
15900     default:
15901       DBUG_RETURN(0);
15902   }
15903   error_num = spider_db_mbase_utility->reappend_tables(fields,
15904     link_idx_chain, str);
15905   DBUG_RETURN(error_num);
15906 }
15907 
append_where_part(ulong sql_type)15908 int spider_mbase_handler::append_where_part(
15909   ulong sql_type
15910 ) {
15911   int error_num;
15912   spider_string *str;
15913   DBUG_ENTER("spider_mbase_handler::append_where_part");
15914   DBUG_PRINT("info",("spider this=%p", this));
15915   switch (sql_type)
15916   {
15917     case SPIDER_SQL_TYPE_SELECT_SQL:
15918       str = &sql;
15919       break;
15920     default:
15921       DBUG_RETURN(0);
15922   }
15923   error_num = spider_db_mbase_utility->append_where(str);
15924   DBUG_RETURN(error_num);
15925 }
15926 
append_having_part(ulong sql_type)15927 int spider_mbase_handler::append_having_part(
15928   ulong sql_type
15929 ) {
15930   int error_num;
15931   spider_string *str;
15932   DBUG_ENTER("spider_mbase_handler::append_having_part");
15933   DBUG_PRINT("info",("spider this=%p", this));
15934   switch (sql_type)
15935   {
15936     case SPIDER_SQL_TYPE_SELECT_SQL:
15937       str = &sql;
15938       break;
15939     default:
15940       DBUG_RETURN(0);
15941   }
15942   error_num = spider_db_mbase_utility->append_having(str);
15943   DBUG_RETURN(error_num);
15944 }
15945 
append_item_type_part(Item * item,const char * alias,uint alias_length,bool use_fields,spider_fields * fields,ulong sql_type)15946 int spider_mbase_handler::append_item_type_part(
15947   Item *item,
15948   const char *alias,
15949   uint alias_length,
15950   bool use_fields,
15951   spider_fields *fields,
15952   ulong sql_type
15953 ) {
15954   int error_num;
15955   spider_string *str;
15956   DBUG_ENTER("spider_mbase_handler::append_item_type_part");
15957   DBUG_PRINT("info",("spider this=%p", this));
15958   switch (sql_type)
15959   {
15960     case SPIDER_SQL_TYPE_SELECT_SQL:
15961       str = &sql;
15962       break;
15963     default:
15964       DBUG_RETURN(0);
15965   }
15966   error_num = spider_db_print_item_type(item, NULL, spider, str,
15967     alias, alias_length, dbton_id, use_fields, fields);
15968   DBUG_RETURN(error_num);
15969 }
15970 
append_list_item_select_part(List<Item> * select,const char * alias,uint alias_length,bool use_fields,spider_fields * fields,ulong sql_type)15971 int spider_mbase_handler::append_list_item_select_part(
15972   List<Item> *select,
15973   const char *alias,
15974   uint alias_length,
15975   bool use_fields,
15976   spider_fields *fields,
15977   ulong sql_type
15978 ) {
15979   int error_num;
15980   spider_string *str;
15981   DBUG_ENTER("spider_mbase_handler::append_list_item_select_part");
15982   DBUG_PRINT("info",("spider this=%p", this));
15983   switch (sql_type)
15984   {
15985     case SPIDER_SQL_TYPE_SELECT_SQL:
15986       str = &sql;
15987       break;
15988     default:
15989       DBUG_RETURN(0);
15990   }
15991   error_num = append_list_item_select(select, str, alias, alias_length,
15992     use_fields, fields);
15993   DBUG_RETURN(error_num);
15994 }
15995 
append_list_item_select(List<Item> * select,spider_string * str,const char * alias,uint alias_length,bool use_fields,spider_fields * fields)15996 int spider_mbase_handler::append_list_item_select(
15997   List<Item> *select,
15998   spider_string *str,
15999   const char *alias,
16000   uint alias_length,
16001   bool use_fields,
16002   spider_fields *fields
16003 ) {
16004   int error_num;
16005   uint32 length, begin;
16006   List_iterator_fast<Item> it(*select);
16007   Item *item;
16008   Field *field;
16009   const char *item_name;
16010   DBUG_ENTER("spider_mbase_handler::append_list_item_select");
16011   DBUG_PRINT("info",("spider this=%p", this));
16012   begin = str->length();
16013   while ((item = it++))
16014   {
16015     if (item->const_item())
16016     {
16017       DBUG_PRINT("info",("spider const item"));
16018       continue;
16019     }
16020     if ((error_num = spider_db_print_item_type(item, NULL, spider, str,
16021       alias, alias_length, dbton_id, use_fields, fields)))
16022     {
16023       DBUG_RETURN(error_num);
16024     }
16025     field = *(fields->get_next_field_ptr());
16026     if (field)
16027     {
16028       item_name = SPIDER_field_name_str(field);
16029       length = SPIDER_field_name_length(field);
16030     } else {
16031       item_name = SPIDER_item_name_str(item);
16032       length = SPIDER_item_name_length(item);
16033     }
16034     if (str->reserve(
16035       SPIDER_SQL_COMMA_LEN + /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
16036       SPIDER_SQL_SPACE_LEN + length
16037     ))
16038       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16039     str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
16040     if ((error_num = spider_db_mbase_utility->append_escaped_name(str,
16041       item_name, length)))
16042     {
16043       DBUG_RETURN(error_num);
16044     }
16045     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
16046   }
16047   if (begin == str->length())
16048   {
16049     /* no columns */
16050     if (str->reserve(SPIDER_SQL_ONE_LEN))
16051     {
16052       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16053     }
16054     str->q_append(SPIDER_SQL_ONE_STR, SPIDER_SQL_ONE_LEN);
16055   } else {
16056     str->length(str->length() - SPIDER_SQL_COMMA_LEN);
16057   }
16058   DBUG_RETURN(0);
16059 }
16060 
append_group_by_part(ORDER * order,const char * alias,uint alias_length,bool use_fields,spider_fields * fields,ulong sql_type)16061 int spider_mbase_handler::append_group_by_part(
16062   ORDER *order,
16063   const char *alias,
16064   uint alias_length,
16065   bool use_fields,
16066   spider_fields *fields,
16067   ulong sql_type
16068 ) {
16069   int error_num;
16070   spider_string *str;
16071   DBUG_ENTER("spider_mbase_handler::append_group_by_part");
16072   DBUG_PRINT("info",("spider this=%p", this));
16073   switch (sql_type)
16074   {
16075     case SPIDER_SQL_TYPE_SELECT_SQL:
16076       str = &sql;
16077       break;
16078     default:
16079       DBUG_RETURN(0);
16080   }
16081   error_num = append_group_by(order, str, alias, alias_length,
16082     use_fields, fields);
16083   DBUG_RETURN(error_num);
16084 }
16085 
append_group_by(ORDER * order,spider_string * str,const char * alias,uint alias_length,bool use_fields,spider_fields * fields)16086 int spider_mbase_handler::append_group_by(
16087   ORDER *order,
16088   spider_string *str,
16089   const char *alias,
16090   uint alias_length,
16091   bool use_fields,
16092   spider_fields *fields
16093 ) {
16094   int error_num;
16095   DBUG_ENTER("spider_mbase_handler::append_group_by");
16096   DBUG_PRINT("info",("spider this=%p", this));
16097   if (order)
16098   {
16099     if (str->reserve(SPIDER_SQL_GROUP_LEN))
16100       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16101     str->q_append(SPIDER_SQL_GROUP_STR, SPIDER_SQL_GROUP_LEN);
16102     for (; order; order = order->next)
16103     {
16104       if ((error_num = spider_db_print_item_type((*order->item), NULL, spider,
16105         str, alias, alias_length, dbton_id, use_fields, fields)))
16106       {
16107         DBUG_RETURN(error_num);
16108       }
16109       if (str->reserve(SPIDER_SQL_COMMA_LEN))
16110         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16111       str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
16112     }
16113     str->length(str->length() - SPIDER_SQL_COMMA_LEN);
16114   }
16115   DBUG_RETURN(0);
16116 }
16117 
append_order_by_part(ORDER * order,const char * alias,uint alias_length,bool use_fields,spider_fields * fields,ulong sql_type)16118 int spider_mbase_handler::append_order_by_part(
16119   ORDER *order,
16120   const char *alias,
16121   uint alias_length,
16122   bool use_fields,
16123   spider_fields *fields,
16124   ulong sql_type
16125 ) {
16126   int error_num;
16127   spider_string *str;
16128   DBUG_ENTER("spider_mbase_handler::append_order_by_part");
16129   DBUG_PRINT("info",("spider this=%p", this));
16130   switch (sql_type)
16131   {
16132     case SPIDER_SQL_TYPE_SELECT_SQL:
16133       str = &sql;
16134       break;
16135     default:
16136       DBUG_RETURN(0);
16137   }
16138   error_num = append_order_by(order, str, alias, alias_length,
16139     use_fields, fields);
16140   DBUG_RETURN(error_num);
16141 }
16142 
append_order_by(ORDER * order,spider_string * str,const char * alias,uint alias_length,bool use_fields,spider_fields * fields)16143 int spider_mbase_handler::append_order_by(
16144   ORDER *order,
16145   spider_string *str,
16146   const char *alias,
16147   uint alias_length,
16148   bool use_fields,
16149   spider_fields *fields
16150 ) {
16151   int error_num;
16152   DBUG_ENTER("spider_mbase_handler::append_order_by");
16153   DBUG_PRINT("info",("spider this=%p", this));
16154   if (order)
16155   {
16156     if (str->reserve(SPIDER_SQL_ORDER_LEN))
16157       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16158     str->q_append(SPIDER_SQL_ORDER_STR, SPIDER_SQL_ORDER_LEN);
16159     for (; order; order = order->next)
16160     {
16161       if ((error_num = spider_db_print_item_type((*order->item), NULL, spider,
16162         str, alias, alias_length, dbton_id, use_fields, fields)))
16163       {
16164         DBUG_RETURN(error_num);
16165       }
16166       if (SPIDER_order_direction_is_asc(order))
16167       {
16168         if (str->reserve(SPIDER_SQL_COMMA_LEN))
16169           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16170         str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
16171       } else {
16172         if (str->reserve(SPIDER_SQL_COMMA_LEN + SPIDER_SQL_DESC_LEN))
16173           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16174         str->q_append(SPIDER_SQL_DESC_STR, SPIDER_SQL_DESC_LEN);
16175         str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
16176       }
16177     }
16178     str->length(str->length() - SPIDER_SQL_COMMA_LEN);
16179   }
16180   DBUG_RETURN(0);
16181 }
16182 #endif
16183 
spider_mbase_copy_table(spider_mbase_share * db_share)16184 spider_mbase_copy_table::spider_mbase_copy_table(
16185   spider_mbase_share *db_share
16186 ) : spider_db_copy_table(
16187   db_share
16188 ),
16189   mysql_share(db_share)
16190 {
16191   DBUG_ENTER("spider_mbase_copy_table::spider_mbase_copy_table");
16192   DBUG_PRINT("info",("spider this=%p", this));
16193   DBUG_VOID_RETURN;
16194 }
16195 
spider_mysql_copy_table(spider_mbase_share * db_share)16196 spider_mysql_copy_table::spider_mysql_copy_table(
16197   spider_mbase_share *db_share
16198 ) : spider_mbase_copy_table(
16199   db_share
16200 ) {
16201   DBUG_ENTER("spider_mysql_copy_table::spider_mysql_copy_table");
16202   DBUG_PRINT("info",("spider this=%p", this));
16203   DBUG_VOID_RETURN;
16204 }
16205 
spider_mariadb_copy_table(spider_mbase_share * db_share)16206 spider_mariadb_copy_table::spider_mariadb_copy_table(
16207   spider_mbase_share *db_share
16208 ) : spider_mbase_copy_table(
16209   db_share
16210 ) {
16211   DBUG_ENTER("spider_mariadb_copy_table::spider_mariadb_copy_table");
16212   DBUG_PRINT("info",("spider this=%p", this));
16213   DBUG_VOID_RETURN;
16214 }
16215 
~spider_mbase_copy_table()16216 spider_mbase_copy_table::~spider_mbase_copy_table()
16217 {
16218   DBUG_ENTER("spider_mbase_copy_table::~spider_mbase_copy_table");
16219   DBUG_PRINT("info",("spider this=%p", this));
16220   DBUG_VOID_RETURN;
16221 }
16222 
~spider_mysql_copy_table()16223 spider_mysql_copy_table::~spider_mysql_copy_table()
16224 {
16225   DBUG_ENTER("spider_mysql_copy_table::~spider_mysql_copy_table");
16226   DBUG_PRINT("info",("spider this=%p", this));
16227   DBUG_VOID_RETURN;
16228 }
16229 
~spider_mariadb_copy_table()16230 spider_mariadb_copy_table::~spider_mariadb_copy_table()
16231 {
16232   DBUG_ENTER("spider_mariadb_copy_table::~spider_mariadb_copy_table");
16233   DBUG_PRINT("info",("spider this=%p", this));
16234   DBUG_VOID_RETURN;
16235 }
16236 
init()16237 int spider_mbase_copy_table::init()
16238 {
16239   DBUG_ENTER("spider_mbase_copy_table::init");
16240   DBUG_PRINT("info",("spider this=%p", this));
16241   sql.init_calc_mem(78);
16242   DBUG_RETURN(0);
16243 }
16244 
set_sql_charset(CHARSET_INFO * cs)16245 void spider_mbase_copy_table::set_sql_charset(
16246   CHARSET_INFO *cs
16247 ) {
16248   DBUG_ENTER("spider_mbase_copy_table::set_sql_charset");
16249   DBUG_PRINT("info",("spider this=%p", this));
16250   sql.set_charset(cs);
16251   DBUG_VOID_RETURN;
16252 }
16253 
append_select_str()16254 int spider_mbase_copy_table::append_select_str()
16255 {
16256   DBUG_ENTER("spider_mbase_copy_table::append_select_str");
16257   DBUG_PRINT("info",("spider this=%p", this));
16258   if (sql.reserve(SPIDER_SQL_SELECT_LEN))
16259     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16260   sql.q_append(SPIDER_SQL_SELECT_STR, SPIDER_SQL_SELECT_LEN);
16261   DBUG_RETURN(0);
16262 }
16263 
append_insert_str(int insert_flg)16264 int spider_mbase_copy_table::append_insert_str(
16265   int insert_flg
16266 ) {
16267   DBUG_ENTER("spider_mbase_copy_table::append_insert_str");
16268   DBUG_PRINT("info",("spider this=%p", this));
16269   if (insert_flg & SPIDER_DB_INSERT_REPLACE)
16270   {
16271     if (sql.reserve(SPIDER_SQL_REPLACE_LEN))
16272       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16273     sql.q_append(SPIDER_SQL_REPLACE_STR, SPIDER_SQL_REPLACE_LEN);
16274   } else {
16275     if (sql.reserve(SPIDER_SQL_INSERT_LEN))
16276       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16277     sql.q_append(SPIDER_SQL_INSERT_STR, SPIDER_SQL_INSERT_LEN);
16278   }
16279   if (insert_flg & SPIDER_DB_INSERT_LOW_PRIORITY)
16280   {
16281     if (sql.reserve(SPIDER_SQL_LOW_PRIORITY_LEN))
16282       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16283     sql.q_append(SPIDER_SQL_LOW_PRIORITY_STR, SPIDER_SQL_LOW_PRIORITY_LEN);
16284   }
16285   else if (insert_flg & SPIDER_DB_INSERT_DELAYED)
16286   {
16287     if (sql.reserve(SPIDER_SQL_SQL_DELAYED_LEN))
16288       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16289     sql.q_append(SPIDER_SQL_SQL_DELAYED_STR, SPIDER_SQL_SQL_DELAYED_LEN);
16290   }
16291   else if (insert_flg & SPIDER_DB_INSERT_HIGH_PRIORITY)
16292   {
16293     if (sql.reserve(SPIDER_SQL_HIGH_PRIORITY_LEN))
16294       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16295     sql.q_append(SPIDER_SQL_HIGH_PRIORITY_STR, SPIDER_SQL_HIGH_PRIORITY_LEN);
16296   }
16297   if (insert_flg & SPIDER_DB_INSERT_IGNORE)
16298   {
16299     if (sql.reserve(SPIDER_SQL_SQL_IGNORE_LEN))
16300       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16301     sql.q_append(SPIDER_SQL_SQL_IGNORE_STR, SPIDER_SQL_SQL_IGNORE_LEN);
16302   }
16303   DBUG_RETURN(0);
16304 }
16305 
append_table_columns(TABLE_SHARE * table_share)16306 int spider_mbase_copy_table::append_table_columns(
16307   TABLE_SHARE *table_share
16308 ) {
16309   int error_num;
16310   Field **field;
16311   DBUG_ENTER("spider_mbase_copy_table::append_table_columns");
16312   DBUG_PRINT("info",("spider this=%p", this));
16313   for (field = table_share->field; *field; field++)
16314   {
16315     if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN))
16316       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16317     sql.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
16318     if ((error_num = spider_db_append_name_with_quote_str(&sql,
16319       (*field)->field_name, dbton_id)))
16320       DBUG_RETURN(error_num);
16321     if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN + SPIDER_SQL_COMMA_LEN))
16322       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16323     sql.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
16324     sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
16325   }
16326   sql.length(sql.length() - SPIDER_SQL_COMMA_LEN);
16327   DBUG_RETURN(0);
16328 }
16329 
append_from_str()16330 int spider_mbase_copy_table::append_from_str()
16331 {
16332   DBUG_ENTER("spider_mbase_copy_table::append_from_str");
16333   DBUG_PRINT("info",("spider this=%p", this));
16334   if (sql.reserve(SPIDER_SQL_FROM_LEN))
16335     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16336   sql.q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN);
16337   DBUG_RETURN(0);
16338 }
16339 
append_table_name(int link_idx)16340 int spider_mbase_copy_table::append_table_name(
16341   int link_idx
16342 ) {
16343   int error_num;
16344   DBUG_ENTER("spider_mbase_copy_table::append_table_name");
16345   DBUG_PRINT("info",("spider this=%p", this));
16346   error_num = mysql_share->append_table_name(&sql, link_idx);
16347   DBUG_RETURN(error_num);
16348 }
16349 
set_sql_pos()16350 void spider_mbase_copy_table::set_sql_pos()
16351 {
16352   DBUG_ENTER("spider_mbase_copy_table::set_sql_pos");
16353   DBUG_PRINT("info",("spider this=%p", this));
16354   pos = sql.length();
16355   DBUG_VOID_RETURN;
16356 }
16357 
set_sql_to_pos()16358 void spider_mbase_copy_table::set_sql_to_pos()
16359 {
16360   DBUG_ENTER("spider_mbase_copy_table::set_sql_to_pos");
16361   DBUG_PRINT("info",("spider this=%p", this));
16362   sql.length(pos);
16363   DBUG_VOID_RETURN;
16364 }
16365 
append_copy_where(spider_db_copy_table * source_ct,KEY * key_info,ulong * last_row_pos,ulong * last_lengths)16366 int spider_mbase_copy_table::append_copy_where(
16367   spider_db_copy_table *source_ct,
16368   KEY *key_info,
16369   ulong *last_row_pos,
16370   ulong *last_lengths
16371 ) {
16372   int error_num, roop_count, roop_count2;
16373   DBUG_ENTER("spider_mbase_copy_table::append_copy_where");
16374   DBUG_PRINT("info",("spider this=%p", this));
16375   if (sql.reserve(SPIDER_SQL_WHERE_LEN + SPIDER_SQL_OPEN_PAREN_LEN))
16376   {
16377     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16378   }
16379   sql.q_append(SPIDER_SQL_WHERE_STR, SPIDER_SQL_WHERE_LEN);
16380   sql.q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
16381   Field *field;
16382   KEY_PART_INFO *key_part = key_info->key_part;
16383   for (roop_count = spider_user_defined_key_parts(key_info) - 1;
16384     roop_count >= 0; roop_count--)
16385   {
16386     for (roop_count2 = 0; roop_count2 < roop_count; roop_count2++)
16387     {
16388       field = key_part[roop_count2].field;
16389       if ((error_num = copy_key_row(source_ct,
16390         field, &last_row_pos[field->field_index],
16391         &last_lengths[field->field_index],
16392         SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN)))
16393       {
16394         DBUG_RETURN(error_num);
16395       }
16396     }
16397     field = key_part[roop_count2].field;
16398     if ((error_num = copy_key_row(source_ct,
16399       field, &last_row_pos[field->field_index],
16400       &last_lengths[field->field_index],
16401       SPIDER_SQL_GT_STR, SPIDER_SQL_GT_LEN)))
16402     {
16403       DBUG_RETURN(error_num);
16404     }
16405     sql.length(sql.length() - SPIDER_SQL_AND_LEN);
16406     if (sql.reserve(SPIDER_SQL_CLOSE_PAREN_LEN +
16407       SPIDER_SQL_OR_LEN + SPIDER_SQL_OPEN_PAREN_LEN))
16408     {
16409       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16410     }
16411     sql.q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
16412     sql.q_append(SPIDER_SQL_OR_STR, SPIDER_SQL_OR_LEN);
16413     sql.q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
16414   }
16415   sql.length(sql.length() - SPIDER_SQL_OR_LEN - SPIDER_SQL_OPEN_PAREN_LEN);
16416   DBUG_RETURN(0);
16417 }
16418 
append_key_order_str(KEY * key_info,int start_pos,bool desc_flg)16419 int spider_mbase_copy_table::append_key_order_str(
16420   KEY *key_info,
16421   int start_pos,
16422   bool desc_flg
16423 ) {
16424   int length, error_num;
16425   KEY_PART_INFO *key_part;
16426   Field *field;
16427   DBUG_ENTER("spider_mbase_copy_table::append_key_order_str");
16428   DBUG_PRINT("info",("spider this=%p", this));
16429   if ((int) spider_user_defined_key_parts(key_info) > start_pos)
16430   {
16431     if (sql.reserve(SPIDER_SQL_ORDER_LEN))
16432       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16433     sql.q_append(SPIDER_SQL_ORDER_STR, SPIDER_SQL_ORDER_LEN);
16434     if (desc_flg == TRUE)
16435     {
16436       for (
16437         key_part = key_info->key_part + start_pos,
16438         length = 0;
16439         length + start_pos < (int) spider_user_defined_key_parts(key_info);
16440         key_part++,
16441         length++
16442       ) {
16443         field = key_part->field;
16444         if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN))
16445           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16446         sql.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
16447         if ((error_num = spider_db_append_name_with_quote_str(&sql,
16448           field->field_name, dbton_id)))
16449           DBUG_RETURN(error_num);
16450         if (key_part->key_part_flag & HA_REVERSE_SORT)
16451         {
16452           if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN + SPIDER_SQL_COMMA_LEN))
16453             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16454           sql.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
16455           sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
16456         } else {
16457           if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN + SPIDER_SQL_DESC_LEN +
16458             SPIDER_SQL_COMMA_LEN))
16459             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16460           sql.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
16461           sql.q_append(SPIDER_SQL_DESC_STR, SPIDER_SQL_DESC_LEN);
16462           sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
16463         }
16464       }
16465     } else {
16466       for (
16467         key_part = key_info->key_part + start_pos,
16468         length = 0;
16469         length + start_pos < (int) spider_user_defined_key_parts(key_info);
16470         key_part++,
16471         length++
16472       ) {
16473         field = key_part->field;
16474         if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN))
16475           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16476         sql.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
16477         if ((error_num = spider_db_append_name_with_quote_str(&sql,
16478           field->field_name, dbton_id)))
16479           DBUG_RETURN(error_num);
16480         if (key_part->key_part_flag & HA_REVERSE_SORT)
16481         {
16482           if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN + SPIDER_SQL_DESC_LEN +
16483             SPIDER_SQL_COMMA_LEN))
16484             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16485           sql.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
16486           sql.q_append(SPIDER_SQL_DESC_STR, SPIDER_SQL_DESC_LEN);
16487           sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
16488         } else {
16489           if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN + SPIDER_SQL_COMMA_LEN))
16490             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16491           sql.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
16492           sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
16493         }
16494       }
16495     }
16496     sql.length(sql.length() - SPIDER_SQL_COMMA_LEN);
16497   }
16498   DBUG_RETURN(0);
16499 }
16500 
append_limit(longlong offset,longlong limit)16501 int spider_mbase_copy_table::append_limit(
16502   longlong offset,
16503   longlong limit
16504 ) {
16505   char buf[SPIDER_LONGLONG_LEN + 1];
16506   uint32 length;
16507   DBUG_ENTER("spider_mbase_copy_table::append_limit");
16508   DBUG_PRINT("info",("spider this=%p", this));
16509   if (offset || limit < 9223372036854775807LL)
16510   {
16511     if (sql.reserve(SPIDER_SQL_LIMIT_LEN + SPIDER_SQL_COMMA_LEN +
16512       ((SPIDER_LONGLONG_LEN) * 2)))
16513       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16514     sql.q_append(SPIDER_SQL_LIMIT_STR, SPIDER_SQL_LIMIT_LEN);
16515     if (offset)
16516     {
16517       length = (uint32) (my_charset_bin.cset->longlong10_to_str)(
16518         &my_charset_bin, buf, SPIDER_LONGLONG_LEN + 1, -10, offset);
16519       sql.q_append(buf, length);
16520       sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
16521     }
16522     length = (uint32) (my_charset_bin.cset->longlong10_to_str)(
16523       &my_charset_bin, buf, SPIDER_LONGLONG_LEN + 1, -10, limit);
16524     sql.q_append(buf, length);
16525   }
16526   DBUG_RETURN(0);
16527 }
16528 
append_into_str()16529 int spider_mbase_copy_table::append_into_str()
16530 {
16531   DBUG_ENTER("spider_mbase_copy_table::append_into_str");
16532   DBUG_PRINT("info",("spider this=%p", this));
16533   if (sql.reserve(SPIDER_SQL_INTO_LEN))
16534     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16535   sql.q_append(SPIDER_SQL_INTO_STR, SPIDER_SQL_INTO_LEN);
16536   DBUG_RETURN(0);
16537 }
16538 
append_open_paren_str()16539 int spider_mbase_copy_table::append_open_paren_str()
16540 {
16541   DBUG_ENTER("spider_mbase_copy_table::append_open_paren_str");
16542   DBUG_PRINT("info",("spider this=%p", this));
16543   if (sql.reserve(SPIDER_SQL_OPEN_PAREN_LEN))
16544     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16545   sql.q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
16546   DBUG_RETURN(0);
16547 }
16548 
append_values_str()16549 int spider_mbase_copy_table::append_values_str()
16550 {
16551   DBUG_ENTER("spider_mbase_copy_table::append_values_str");
16552   DBUG_PRINT("info",("spider this=%p", this));
16553   if (sql.reserve(SPIDER_SQL_CLOSE_PAREN_LEN + SPIDER_SQL_VALUES_LEN +
16554     SPIDER_SQL_OPEN_PAREN_LEN))
16555     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16556   sql.q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
16557   sql.q_append(SPIDER_SQL_VALUES_STR, SPIDER_SQL_VALUES_LEN);
16558   sql.q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
16559   DBUG_RETURN(0);
16560 }
16561 
append_select_lock_str(int lock_mode)16562 int spider_mbase_copy_table::append_select_lock_str(
16563   int lock_mode
16564 ) {
16565   DBUG_ENTER("spider_mbase_copy_table::append_select_lock_str");
16566   DBUG_PRINT("info",("spider this=%p", this));
16567   if (lock_mode == SPIDER_LOCK_MODE_EXCLUSIVE)
16568   {
16569     if (sql.reserve(SPIDER_SQL_FOR_UPDATE_LEN))
16570       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16571     sql.q_append(SPIDER_SQL_FOR_UPDATE_STR, SPIDER_SQL_FOR_UPDATE_LEN);
16572   } else if (lock_mode == SPIDER_LOCK_MODE_SHARED)
16573   {
16574     if (sql.reserve(SPIDER_SQL_SHARED_LOCK_LEN))
16575       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16576     sql.q_append(SPIDER_SQL_SHARED_LOCK_STR, SPIDER_SQL_SHARED_LOCK_LEN);
16577   }
16578   DBUG_RETURN(0);
16579 }
16580 
exec_query(SPIDER_CONN * conn,int quick_mode,int * need_mon)16581 int spider_mbase_copy_table::exec_query(
16582   SPIDER_CONN *conn,
16583   int quick_mode,
16584   int *need_mon
16585 ) {
16586   int error_num;
16587   DBUG_ENTER("spider_mbase_copy_table::exec_query");
16588   DBUG_PRINT("info",("spider this=%p", this));
16589   error_num = spider_db_query(conn, sql.ptr(), sql.length(), quick_mode,
16590     need_mon);
16591   DBUG_RETURN(error_num);
16592 }
16593 
copy_key_row(spider_db_copy_table * source_ct,Field * field,ulong * row_pos,ulong * length,const char * joint_str,const int joint_length)16594 int spider_mbase_copy_table::copy_key_row(
16595   spider_db_copy_table *source_ct,
16596   Field *field,
16597   ulong *row_pos,
16598   ulong *length,
16599   const char *joint_str,
16600   const int joint_length
16601 ) {
16602   int error_num;
16603   spider_string *source_str = &((spider_mbase_copy_table *) source_ct)->sql;
16604   DBUG_ENTER("spider_mbase_copy_table::copy_key_row");
16605   DBUG_PRINT("info",("spider this=%p", this));
16606   if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN))
16607     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16608   sql.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
16609   if ((error_num = spider_db_append_name_with_quote_str(&sql,
16610     field->field_name, dbton_id)))
16611     DBUG_RETURN(error_num);
16612   if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN + joint_length + *length +
16613     SPIDER_SQL_AND_LEN))
16614     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16615   sql.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
16616   sql.q_append(joint_str, joint_length);
16617   sql.q_append(source_str->ptr() + *row_pos, *length);
16618   sql.q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN);
16619   DBUG_RETURN(0);
16620 }
16621 
copy_row(Field * field,SPIDER_DB_ROW * row)16622 int spider_mbase_copy_table::copy_row(
16623   Field *field,
16624   SPIDER_DB_ROW *row
16625 ) {
16626   int error_num;
16627   DBUG_ENTER("spider_mbase_copy_table::copy_row");
16628   DBUG_PRINT("info",("spider this=%p", this));
16629   if (row->is_null())
16630   {
16631     if (sql.reserve(SPIDER_SQL_NULL_LEN + SPIDER_SQL_COMMA_LEN))
16632       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16633     sql.q_append(SPIDER_SQL_NULL_STR, SPIDER_SQL_NULL_LEN);
16634   } else if (field->str_needs_quotes())
16635   {
16636     if (sql.reserve(SPIDER_SQL_VALUE_QUOTE_LEN))
16637       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16638     sql.q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
16639     if ((error_num = row->append_escaped_to_str(&sql,
16640       dbton_id)))
16641       DBUG_RETURN(error_num);
16642     if (sql.reserve(SPIDER_SQL_VALUE_QUOTE_LEN + SPIDER_SQL_COMMA_LEN))
16643       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16644     sql.q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
16645   } else {
16646     if ((error_num = row->append_to_str(&sql)))
16647       DBUG_RETURN(error_num);
16648     if (sql.reserve(SPIDER_SQL_COMMA_LEN))
16649       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16650   }
16651   sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
16652   DBUG_RETURN(0);
16653 }
16654 
copy_rows(TABLE * table,SPIDER_DB_ROW * row,ulong ** last_row_pos,ulong ** last_lengths)16655 int spider_mbase_copy_table::copy_rows(
16656   TABLE *table,
16657   SPIDER_DB_ROW *row,
16658   ulong **last_row_pos,
16659   ulong **last_lengths
16660 ) {
16661   int error_num;
16662   Field **field;
16663   ulong *lengths2, *row_pos2;
16664   DBUG_ENTER("spider_mbase_copy_table::copy_rows");
16665   DBUG_PRINT("info",("spider this=%p", this));
16666   row_pos2 = *last_row_pos;
16667   lengths2 = *last_lengths;
16668 
16669   for (
16670     field = table->field;
16671     *field;
16672     field++,
16673     lengths2++
16674   ) {
16675     *row_pos2 = sql.length();
16676     if ((error_num =
16677       copy_row(*field, row)))
16678       DBUG_RETURN(error_num);
16679     *lengths2 = sql.length() - *row_pos2 - SPIDER_SQL_COMMA_LEN;
16680     row->next();
16681     row_pos2++;
16682   }
16683   sql.length(sql.length() - SPIDER_SQL_COMMA_LEN);
16684   if (sql.reserve(SPIDER_SQL_CLOSE_PAREN_LEN +
16685     SPIDER_SQL_COMMA_LEN + SPIDER_SQL_OPEN_PAREN_LEN))
16686   {
16687     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16688   }
16689   sql.q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
16690   sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
16691   sql.q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
16692   DBUG_RETURN(0);
16693 }
16694 
copy_rows(TABLE * table,SPIDER_DB_ROW * row)16695 int spider_mbase_copy_table::copy_rows(
16696   TABLE *table,
16697   SPIDER_DB_ROW *row
16698 ) {
16699   int error_num;
16700   Field **field;
16701   DBUG_ENTER("spider_mbase_copy_table::copy_rows");
16702   DBUG_PRINT("info",("spider this=%p", this));
16703   for (
16704     field = table->field;
16705     *field;
16706     field++
16707   ) {
16708     if ((error_num =
16709       copy_row(*field, row)))
16710       DBUG_RETURN(error_num);
16711     row->next();
16712   }
16713   sql.length(sql.length() - SPIDER_SQL_COMMA_LEN);
16714   if (sql.reserve(SPIDER_SQL_CLOSE_PAREN_LEN +
16715     SPIDER_SQL_COMMA_LEN + SPIDER_SQL_OPEN_PAREN_LEN))
16716   {
16717     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16718   }
16719   sql.q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
16720   sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
16721   sql.q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
16722   DBUG_RETURN(0);
16723 }
16724 
append_insert_terminator()16725 int spider_mbase_copy_table::append_insert_terminator()
16726 {
16727   DBUG_ENTER("spider_mbase_copy_table::append_insert_terminator");
16728   DBUG_PRINT("info",("spider this=%p", this));
16729   sql.length(sql.length() - SPIDER_SQL_COMMA_LEN - SPIDER_SQL_OPEN_PAREN_LEN);
16730   DBUG_RETURN(0);
16731 }
16732 
copy_insert_values(spider_db_copy_table * source_ct)16733 int spider_mbase_copy_table::copy_insert_values(
16734   spider_db_copy_table *source_ct
16735 ) {
16736   spider_mbase_copy_table *tmp_ct = (spider_mbase_copy_table *) source_ct;
16737   spider_string *source_str = &tmp_ct->sql;
16738   int values_length = source_str->length() - tmp_ct->pos;
16739   const char *values_ptr = source_str->ptr() + tmp_ct->pos;
16740   DBUG_ENTER("spider_mbase_copy_table::copy_insert_values");
16741   DBUG_PRINT("info",("spider this=%p", this));
16742   if (sql.reserve(values_length))
16743   {
16744     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16745   }
16746   sql.q_append(values_ptr, values_length);
16747   DBUG_RETURN(0);
16748 }
16749