1 /* Copyright (C) 2012-2018 Kentoku Shiba
2    Copyright (c) 2020, MariaDB Corporation.
3 
4   This program is free software; you can redistribute it and/or modify
5   it under the terms of the GNU General Public License as published by
6   the Free Software Foundation; version 2 of the License.
7 
8   This program is distributed in the hope that it will be useful,
9   but WITHOUT ANY WARRANTY; without even the implied warranty of
10   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11   GNU General Public License for more details.
12 
13   You should have received a copy of the GNU General Public License
14   along with this program; if not, write to the Free Software
15   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */
16 
17 #define MYSQL_SERVER 1
18 #include <my_global.h>
19 #include "mysql_version.h"
20 #include "spd_environ.h"
21 #if MYSQL_VERSION_ID < 50500
22 #include "mysql_priv.h"
23 #include <mysql/plugin.h>
24 #else
25 #include "sql_priv.h"
26 #include "probes_mysql.h"
27 #include "sql_class.h"
28 #include "sql_partition.h"
29 #include "sql_analyse.h"
30 #include "sql_base.h"
31 #include "tztime.h"
32 #ifdef HANDLER_HAS_DIRECT_AGGREGATE
33 #include "sql_select.h"
34 #endif
35 #endif
36 #include "sql_common.h"
37 #include <mysql.h>
38 #include <errmsg.h>
39 #include "spd_err.h"
40 #include "spd_param.h"
41 #include "spd_db_include.h"
42 #include "spd_include.h"
43 #include "spd_db_mysql.h"
44 #include "ha_spider.h"
45 #include "spd_conn.h"
46 #include "spd_db_conn.h"
47 #include "spd_malloc.h"
48 #include "spd_sys_table.h"
49 #include "spd_table.h"
50 
51 extern struct charset_info_st *spd_charset_utf8mb3_bin;
52 extern bool volatile *spd_abort_loop;
53 
54 extern handlerton *spider_hton_ptr;
55 extern pthread_mutex_t spider_open_conn_mutex;
56 extern HASH spider_open_connections;
57 extern HASH spider_ipport_conns;
58 extern SPIDER_DBTON spider_dbton[SPIDER_DBTON_SIZE];
59 extern const char spider_dig_upper[];
60 extern const char **spd_mysqld_unix_port;
61 extern uint *spd_mysqld_port;
62 
63 spider_db_mysql_util spider_db_mysql_utility;
64 spider_db_mariadb_util spider_db_mariadb_utility;
65 
66 #define SPIDER_SQL_NAME_QUOTE_STR "`"
67 #define SPIDER_SQL_NAME_QUOTE_LEN (sizeof(SPIDER_SQL_NAME_QUOTE_STR) - 1)
68 static const char *name_quote_str = SPIDER_SQL_NAME_QUOTE_STR;
69 
70 #define SPIDER_SQL_ISO_READ_UNCOMMITTED_STR "set session transaction isolation level read uncommitted"
71 #define SPIDER_SQL_ISO_READ_UNCOMMITTED_LEN sizeof(SPIDER_SQL_ISO_READ_UNCOMMITTED_STR) - 1
72 #define SPIDER_SQL_ISO_READ_COMMITTED_STR "set session transaction isolation level read committed"
73 #define SPIDER_SQL_ISO_READ_COMMITTED_LEN sizeof(SPIDER_SQL_ISO_READ_COMMITTED_STR) - 1
74 #define SPIDER_SQL_ISO_REPEATABLE_READ_STR "set session transaction isolation level repeatable read"
75 #define SPIDER_SQL_ISO_REPEATABLE_READ_LEN sizeof(SPIDER_SQL_ISO_REPEATABLE_READ_STR) - 1
76 #define SPIDER_SQL_ISO_SERIALIZABLE_STR "set session transaction isolation level serializable"
77 #define SPIDER_SQL_ISO_SERIALIZABLE_LEN sizeof(SPIDER_SQL_ISO_SERIALIZABLE_STR) - 1
78 
79 #define SPIDER_SQL_START_CONSISTENT_SNAPSHOT_STR "start transaction with consistent snapshot"
80 #define SPIDER_SQL_START_CONSISTENT_SNAPSHOT_LEN sizeof(SPIDER_SQL_START_CONSISTENT_SNAPSHOT_STR) - 1
81 #define SPIDER_SQL_START_TRANSACTION_STR "start transaction"
82 #define SPIDER_SQL_START_TRANSACTION_LEN sizeof(SPIDER_SQL_START_TRANSACTION_STR) - 1
83 
84 #define SPIDER_SQL_AUTOCOMMIT_OFF_STR "set session autocommit = 0"
85 #define SPIDER_SQL_AUTOCOMMIT_OFF_LEN sizeof(SPIDER_SQL_AUTOCOMMIT_OFF_STR) - 1
86 #define SPIDER_SQL_AUTOCOMMIT_ON_STR "set session autocommit = 1"
87 #define SPIDER_SQL_AUTOCOMMIT_ON_LEN sizeof(SPIDER_SQL_AUTOCOMMIT_ON_STR) - 1
88 
89 #define SPIDER_SQL_SQL_LOG_OFF_STR "set session sql_log_off = 0"
90 #define SPIDER_SQL_SQL_LOG_OFF_LEN sizeof(SPIDER_SQL_SQL_LOG_OFF_STR) - 1
91 #define SPIDER_SQL_SQL_LOG_ON_STR "set session sql_log_off = 1"
92 #define SPIDER_SQL_SQL_LOG_ON_LEN sizeof(SPIDER_SQL_SQL_LOG_ON_STR) - 1
93 
94 #define SPIDER_SQL_WAIT_TIMEOUT_STR "set session wait_timeout = "
95 #define SPIDER_SQL_WAIT_TIMEOUT_LEN sizeof(SPIDER_SQL_WAIT_TIMEOUT_STR) - 1
96 
97 #define SPIDER_SQL_SQL_MODE_STR "set session sql_mode = '"
98 #define SPIDER_SQL_SQL_MODE_LEN sizeof(SPIDER_SQL_SQL_MODE_STR) - 1
99 
100 #define SPIDER_SQL_TIME_ZONE_STR "set session time_zone = '"
101 #define SPIDER_SQL_TIME_ZONE_LEN sizeof(SPIDER_SQL_TIME_ZONE_STR) - 1
102 
103 #define SPIDER_SQL_SET_USER_VAL_STR "set @`"
104 #define SPIDER_SQL_SET_USER_VAL_LEN sizeof(SPIDER_SQL_SET_USER_VAL_STR) - 1
105 
106 #define SPIDER_SQL_COMMIT_STR "commit"
107 #define SPIDER_SQL_COMMIT_LEN sizeof(SPIDER_SQL_COMMIT_STR) - 1
108 #define SPIDER_SQL_ROLLBACK_STR "rollback"
109 #define SPIDER_SQL_ROLLBACK_LEN sizeof(SPIDER_SQL_ROLLBACK_STR) - 1
110 
111 #define SPIDER_SQL_XA_START_STR "xa start "
112 #define SPIDER_SQL_XA_START_LEN sizeof(SPIDER_SQL_XA_START_STR) - 1
113 #define SPIDER_SQL_XA_END_STR "xa end "
114 #define SPIDER_SQL_XA_END_LEN sizeof(SPIDER_SQL_XA_END_STR) - 1
115 #define SPIDER_SQL_XA_PREPARE_STR "xa prepare "
116 #define SPIDER_SQL_XA_PREPARE_LEN sizeof(SPIDER_SQL_XA_PREPARE_STR) - 1
117 #define SPIDER_SQL_XA_COMMIT_STR "xa commit "
118 #define SPIDER_SQL_XA_COMMIT_LEN sizeof(SPIDER_SQL_XA_COMMIT_STR) - 1
119 #define SPIDER_SQL_XA_ROLLBACK_STR "xa rollback "
120 #define SPIDER_SQL_XA_ROLLBACK_LEN sizeof(SPIDER_SQL_XA_ROLLBACK_STR) - 1
121 
122 #define SPIDER_SQL_LOCK_TABLE_STR "lock tables "
123 #define SPIDER_SQL_LOCK_TABLE_LEN (sizeof(SPIDER_SQL_LOCK_TABLE_STR) - 1)
124 #define SPIDER_SQL_UNLOCK_TABLE_STR "unlock tables"
125 #define SPIDER_SQL_UNLOCK_TABLE_LEN (sizeof(SPIDER_SQL_UNLOCK_TABLE_STR) - 1)
126 
127 #define SPIDER_SQL_LEFT_JOIN_STR " left join "
128 #define SPIDER_SQL_LEFT_JOIN_LEN (sizeof(SPIDER_SQL_LEFT_JOIN_STR) - 1)
129 #define SPIDER_SQL_RIGHT_JOIN_STR " right join "
130 #define SPIDER_SQL_RIGHT_JOIN_LEN (sizeof(SPIDER_SQL_RIGHT_JOIN_STR) - 1)
131 #define SPIDER_SQL_JOIN_STR " join "
132 #define SPIDER_SQL_JOIN_LEN (sizeof(SPIDER_SQL_JOIN_STR) - 1)
133 #define SPIDER_SQL_ON_STR " on "
134 #define SPIDER_SQL_ON_LEN (sizeof(SPIDER_SQL_ON_STR) - 1)
135 
136 #define SPIDER_SQL_SHOW_TABLE_STATUS_STR "show table status from "
137 #define SPIDER_SQL_SHOW_TABLE_STATUS_LEN sizeof(SPIDER_SQL_SHOW_TABLE_STATUS_STR) - 1
138 #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` = "
139 #define SPIDER_SQL_SELECT_TABLES_STATUS_LEN sizeof(SPIDER_SQL_SELECT_TABLES_STATUS_STR) - 1
140 #define SPIDER_SQL_SHOW_WARNINGS_STR "show warnings"
141 #define SPIDER_SQL_SHOW_WARNINGS_LEN sizeof(SPIDER_SQL_SHOW_WARNINGS_STR) - 1
142 
143 #define SPIDER_SQL_SHOW_MASTER_STATUS_STR "show master status"
144 #define SPIDER_SQL_SHOW_MASTER_STATUS_LEN sizeof(SPIDER_SQL_SHOW_MASTER_STATUS_STR) - 1
145 #define SPIDER_SQL_BINLOG_GTID_POS_STR "select binlog_gtid_pos"
146 #define SPIDER_SQL_BINLOG_GTID_POS_LEN sizeof(SPIDER_SQL_BINLOG_GTID_POS_STR) - 1
147 
148 #ifdef SPIDER_HAS_DISCOVER_TABLE_STRUCTURE
149 #define SPIDER_SQL_SHOW_COLUMNS_STR "show columns from "
150 #define SPIDER_SQL_SHOW_COLUMNS_LEN sizeof(SPIDER_SQL_SHOW_COLUMNS_STR) - 1
151 #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` = "
152 #define SPIDER_SQL_SELECT_COLUMNS_LEN sizeof(SPIDER_SQL_SELECT_COLUMNS_STR) - 1
153 
154 #define SPIDER_SQL_AUTO_INCREMENT_STR " auto_increment"
155 #define SPIDER_SQL_AUTO_INCREMENT_LEN sizeof(SPIDER_SQL_AUTO_INCREMENT_STR) - 1
156 #define SPIDER_SQL_ORDINAL_POSITION_STR "ordinal_position"
157 #define SPIDER_SQL_ORDINAL_POSITION_LEN sizeof(SPIDER_SQL_ORDINAL_POSITION_STR) - 1
158 #define SPIDER_SQL_FULLTEXT_STR "fulltext"
159 #define SPIDER_SQL_FULLTEXT_LEN sizeof(SPIDER_SQL_FULLTEXT_STR) - 1
160 #define SPIDER_SQL_SPATIAL_STR "spatial"
161 #define SPIDER_SQL_SPATIAL_LEN sizeof(SPIDER_SQL_SPATIAL_STR) - 1
162 #define SPIDER_SQL_USING_HASH_STR " using hash"
163 #define SPIDER_SQL_USING_HASH_LEN sizeof(SPIDER_SQL_USING_HASH_STR) - 1
164 #endif
165 
166 #define SPIDER_SQL_SHOW_RECORDS_RECORDS_POS 0
167 #define SPIDER_SQL_EXPLAIN_SELECT_RECORDS_POS 8
168 
169 #ifdef HA_HAS_CHECKSUM_EXTENDED
170 #define SPIDER_SQL_CHECKSUM_CHECKSUM_POS 1
171 #define SPIDER_SQL_CHECKSUM_TABLE_STR "checksum table "
172 #define SPIDER_SQL_CHECKSUM_TABLE_LEN (sizeof(SPIDER_SQL_CHECKSUM_TABLE_STR) - 1)
173 #endif
174 
175 #define SPIDER_SQL_LIKE_STR " like "
176 #define SPIDER_SQL_LIKE_LEN (sizeof(SPIDER_SQL_LIKE_STR) - 1)
177 #define SPIDER_SQL_LIMIT1_STR " limit 1"
178 #define SPIDER_SQL_LIMIT1_LEN (sizeof(SPIDER_SQL_LIMIT1_STR) - 1)
179 #define SPIDER_SQL_COLLATE_STR " collate "
180 #define SPIDER_SQL_COLLATE_LEN (sizeof(SPIDER_SQL_COLLATE_STR) - 1)
181 
182 #define SPIDER_SQL_INTERVAL_STR " + interval "
183 #define SPIDER_SQL_INTERVAL_LEN (sizeof(SPIDER_SQL_INTERVAL_STR) - 1)
184 #define SPIDER_SQL_NEGINTERVAL_STR " - interval "
185 #define SPIDER_SQL_NEGINTERVAL_LEN (sizeof(SPIDER_SQL_NEGINTERVAL_STR) - 1)
186 
187 static uchar SPIDER_SQL_LINESTRING_HEAD_STR[] =
188   {0x00,0x00,0x00,0x00,0x01,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00};
189 #define SPIDER_SQL_LINESTRING_HEAD_LEN sizeof(SPIDER_SQL_LINESTRING_HEAD_STR)
190 
191 #define SPIDER_SQL_DIRECT_INSERT_KIND_INSERT     0
192 #define SPIDER_SQL_DIRECT_INSERT_KIND_REPLACE    1
193 #define SPIDER_SQL_DIRECT_INSERT_KIND_IGNORE     2
194 #define SPIDER_SQL_DIRECT_INSERT_KIND_DUP_UPDATE 3
195 
196 static const char *spider_db_table_lock_str[] =
197 {
198   " read local,",
199   " read,",
200   " low_priority write,",
201   " write,"
202 };
203 static const int spider_db_table_lock_len[] =
204 {
205   sizeof(" read local,") - 1,
206   sizeof(" read,") - 1,
207   sizeof(" low_priority write,") - 1,
208   sizeof(" write,") - 1
209 };
210 static const char *spider_db_timefunc_interval_str[] =
211 {
212   " year", " quarter", " month", " week", " day",
213   " hour", " minute", " second", " microsecond",
214   " year_month", " day_hour", " day_minute",
215   " day_second", " hour_minute", " hour_second",
216   " minute_second", " day_microsecond", " hour_microsecond",
217   " minute_microsecond", " second_microsecond"
218 };
219 
220 /* UTC time zone for timestamp columns */
221 extern Time_zone *UTC;
222 
spider_mysql_init()223 int spider_mysql_init()
224 {
225   DBUG_ENTER("spider_mysql_init");
226   DBUG_RETURN(0);
227 }
228 
spider_mariadb_init()229 int spider_mariadb_init()
230 {
231   DBUG_ENTER("spider_mariadb_init");
232   DBUG_RETURN(0);
233 }
234 
spider_mysql_deinit()235 int spider_mysql_deinit()
236 {
237   DBUG_ENTER("spider_mysql_deinit");
238   DBUG_RETURN(0);
239 }
240 
spider_mariadb_deinit()241 int spider_mariadb_deinit()
242 {
243   DBUG_ENTER("spider_mariadb_deinit");
244   DBUG_RETURN(0);
245 }
246 
spider_mysql_create_share(SPIDER_SHARE * share)247 spider_db_share *spider_mysql_create_share(
248   SPIDER_SHARE *share
249 ) {
250   DBUG_ENTER("spider_mysql_create_share");
251   DBUG_RETURN(new spider_mysql_share(share));
252 }
253 
spider_mariadb_create_share(SPIDER_SHARE * share)254 spider_db_share *spider_mariadb_create_share(
255   SPIDER_SHARE *share
256 ) {
257   DBUG_ENTER("spider_mariadb_create_share");
258   DBUG_RETURN(new spider_mariadb_share(share));
259 }
260 
spider_mysql_create_handler(ha_spider * spider,spider_db_share * db_share)261 spider_db_handler *spider_mysql_create_handler(
262   ha_spider *spider,
263   spider_db_share *db_share
264 ) {
265   DBUG_ENTER("spider_mysql_create_handler");
266   DBUG_RETURN(new spider_mysql_handler(spider,
267     (spider_mbase_share *) db_share));
268 }
269 
spider_mariadb_create_handler(ha_spider * spider,spider_db_share * db_share)270 spider_db_handler *spider_mariadb_create_handler(
271   ha_spider *spider,
272   spider_db_share *db_share
273 ) {
274   DBUG_ENTER("spider_mariadb_create_handler");
275   DBUG_RETURN(new spider_mariadb_handler(spider,
276     (spider_mbase_share *) db_share));
277 }
278 
spider_mysql_create_copy_table(spider_db_share * db_share)279 spider_db_copy_table *spider_mysql_create_copy_table(
280   spider_db_share *db_share
281 ) {
282   DBUG_ENTER("spider_mysql_create_copy_table");
283   DBUG_RETURN(new spider_mysql_copy_table(
284     (spider_mbase_share *) db_share));
285 }
286 
spider_mariadb_create_copy_table(spider_db_share * db_share)287 spider_db_copy_table *spider_mariadb_create_copy_table(
288   spider_db_share *db_share
289 ) {
290   DBUG_ENTER("spider_mariadb_create_copy_table");
291   DBUG_RETURN(new spider_mariadb_copy_table(
292     (spider_mbase_share *) db_share));
293 }
294 
spider_mysql_create_conn(SPIDER_CONN * conn)295 SPIDER_DB_CONN *spider_mysql_create_conn(
296   SPIDER_CONN *conn
297 ) {
298   DBUG_ENTER("spider_mysql_create_conn");
299   DBUG_RETURN(new spider_db_mysql(conn));
300 }
301 
spider_mariadb_create_conn(SPIDER_CONN * conn)302 SPIDER_DB_CONN *spider_mariadb_create_conn(
303   SPIDER_CONN *conn
304 ) {
305   DBUG_ENTER("spider_mariadb_create_conn");
306   DBUG_RETURN(new spider_db_mariadb(conn));
307 }
308 
spider_mysql_support_direct_join()309 bool spider_mysql_support_direct_join(
310 ) {
311   DBUG_ENTER("spider_mysql_support_direct_join");
312   DBUG_RETURN(TRUE);
313 }
314 
spider_mariadb_support_direct_join()315 bool spider_mariadb_support_direct_join(
316 ) {
317   DBUG_ENTER("spider_mariadb_support_direct_join");
318   DBUG_RETURN(TRUE);
319 }
320 
321 SPIDER_DBTON spider_dbton_mysql = {
322   0,
323   SPIDER_DB_WRAPPER_MYSQL,
324   SPIDER_DB_ACCESS_TYPE_SQL,
325   spider_mysql_init,
326   spider_mysql_deinit,
327   spider_mysql_create_share,
328   spider_mysql_create_handler,
329   spider_mysql_create_copy_table,
330   spider_mysql_create_conn,
331   spider_mysql_support_direct_join,
332   &spider_db_mysql_utility,
333   "For communicating to MySQL using native protocol",
334   "3.4.0",
335   SPIDER_MATURITY_STABLE
336 };
337 
338 SPIDER_DBTON spider_dbton_mariadb = {
339   0,
340   SPIDER_DB_WRAPPER_MARIADB,
341   SPIDER_DB_ACCESS_TYPE_SQL,
342   spider_mariadb_init,
343   spider_mariadb_deinit,
344   spider_mariadb_create_share,
345   spider_mariadb_create_handler,
346   spider_mariadb_create_copy_table,
347   spider_mariadb_create_conn,
348   spider_mariadb_support_direct_join,
349   &spider_db_mariadb_utility,
350   "For communicating to MariaDB using native protocol",
351   "3.4.0",
352   SPIDER_MATURITY_STABLE
353 };
354 
spider_db_mbase_row(uint dbton_id)355 spider_db_mbase_row::spider_db_mbase_row(
356   uint dbton_id
357 ) : spider_db_row(dbton_id),
358   row(NULL), lengths(NULL), cloned(FALSE)
359 {
360   DBUG_ENTER("spider_db_mbase_row::spider_db_mbase_row");
361   DBUG_PRINT("info",("spider this=%p", this));
362   DBUG_VOID_RETURN;
363 }
364 
spider_db_mysql_row()365 spider_db_mysql_row::spider_db_mysql_row() :
366   spider_db_mbase_row(spider_db_mysql_utility.dbton_id)
367 {
368   DBUG_ENTER("spider_db_mysql_row::spider_db_mysql_row");
369   DBUG_PRINT("info",("spider this=%p", this));
370   DBUG_VOID_RETURN;
371 }
372 
spider_db_mariadb_row()373 spider_db_mariadb_row::spider_db_mariadb_row() :
374   spider_db_mbase_row(spider_db_mariadb_utility.dbton_id)
375 {
376   DBUG_ENTER("spider_db_mariadb_row::spider_db_mariadb_row");
377   DBUG_PRINT("info",("spider this=%p", this));
378   DBUG_VOID_RETURN;
379 }
380 
~spider_db_mbase_row()381 spider_db_mbase_row::~spider_db_mbase_row()
382 {
383   DBUG_ENTER("spider_db_mbase_row::~spider_db_mbase_row");
384   DBUG_PRINT("info",("spider this=%p", this));
385   if (cloned)
386   {
387     spider_free(spider_current_trx, row_first, MYF(0));
388   }
389   DBUG_VOID_RETURN;
390 }
391 
~spider_db_mysql_row()392 spider_db_mysql_row::~spider_db_mysql_row()
393 {
394   DBUG_ENTER("spider_db_mysql_row::~spider_db_mysql_row");
395   DBUG_PRINT("info",("spider this=%p", this));
396   DBUG_VOID_RETURN;
397 }
398 
~spider_db_mariadb_row()399 spider_db_mariadb_row::~spider_db_mariadb_row()
400 {
401   DBUG_ENTER("spider_db_mariadb_row::~spider_db_mariadb_row");
402   DBUG_PRINT("info",("spider this=%p", this));
403   DBUG_VOID_RETURN;
404 }
405 
store_to_field(Field * field,CHARSET_INFO * access_charset)406 int spider_db_mbase_row::store_to_field(
407   Field *field,
408   CHARSET_INFO *access_charset
409 ) {
410   DBUG_ENTER("spider_db_mbase_row::store_to_field");
411   DBUG_PRINT("info",("spider this=%p", this));
412   if (!*row)
413   {
414     DBUG_PRINT("info", ("spider field is null"));
415     field->set_null();
416     field->reset();
417   } else {
418     field->set_notnull();
419     if (field->flags & BLOB_FLAG)
420     {
421       DBUG_PRINT("info", ("spider blob field"));
422       if (
423         field->charset() == &my_charset_bin ||
424         field->charset()->cset == access_charset->cset
425       )
426         ((Field_blob *)field)->set_ptr(*lengths, (uchar *) *row);
427       else {
428         DBUG_PRINT("info", ("spider blob convert"));
429         if (field->table->file->ht == spider_hton_ptr)
430         {
431           ha_spider *spider = (ha_spider *) field->table->file;
432           spider_string *str = &spider->blob_buff[field->field_index];
433           str->length(0);
434           if (str->append(*row, *lengths, access_charset))
435             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
436           ((Field_blob *)field)->set_ptr(str->length(), (uchar *) str->ptr());
437         } else {
438           field->store(*row, *lengths, access_charset);
439         }
440       }
441     } else
442       field->store(*row, *lengths, access_charset);
443   }
444   DBUG_RETURN(0);
445 }
446 
append_to_str(spider_string * str)447 int spider_db_mbase_row::append_to_str(
448   spider_string *str
449 ) {
450   DBUG_ENTER("spider_db_mbase_row::append_to_str");
451   DBUG_PRINT("info",("spider this=%p", this));
452   if (str->reserve(*lengths))
453     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
454   str->q_append(*row, *lengths);
455   DBUG_RETURN(0);
456 }
457 
append_escaped_to_str(spider_string * str,uint dbton_id)458 int spider_db_mbase_row::append_escaped_to_str(
459   spider_string *str,
460   uint dbton_id
461 ) {
462   DBUG_ENTER("spider_db_mbase_row::append_escaped_to_str");
463   DBUG_PRINT("info",("spider this=%p", this));
464   spider_string tmp_str(*row, *lengths + 1, str->charset());
465   tmp_str.init_calc_mem(133);
466   tmp_str.length(*lengths);
467   if (str->reserve(*lengths * 2 + 2))
468     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
469   spider_dbton[dbton_id].db_util->append_escaped_util(str, tmp_str.get_str());
470   DBUG_RETURN(0);
471 }
472 
first()473 void spider_db_mbase_row::first()
474 {
475   DBUG_ENTER("spider_db_mbase_row::first");
476   DBUG_PRINT("info",("spider this=%p", this));
477   row = row_first;
478   lengths = lengths_first;
479   DBUG_VOID_RETURN;
480 }
481 
next()482 void spider_db_mbase_row::next()
483 {
484   DBUG_ENTER("spider_db_mbase_row::next");
485   DBUG_PRINT("info",("spider this=%p", this));
486   row++;
487   lengths++;
488   DBUG_VOID_RETURN;
489 }
490 
is_null()491 bool spider_db_mbase_row::is_null()
492 {
493   DBUG_ENTER("spider_db_mbase_row::is_null");
494   DBUG_PRINT("info",("spider this=%p", this));
495   DBUG_RETURN(!(*row));
496 }
497 
val_int()498 int spider_db_mbase_row::val_int()
499 {
500   DBUG_ENTER("spider_db_mbase_row::val_int");
501   DBUG_PRINT("info",("spider this=%p", this));
502   DBUG_RETURN(*row ? atoi(*row) : 0);
503 }
504 
val_real()505 double spider_db_mbase_row::val_real()
506 {
507   DBUG_ENTER("spider_db_mbase_row::val_real");
508   DBUG_PRINT("info",("spider this=%p", this));
509   DBUG_RETURN(*row ? my_atof(*row) : 0.0);
510 }
511 
val_decimal(my_decimal * decimal_value,CHARSET_INFO * access_charset)512 my_decimal *spider_db_mbase_row::val_decimal(
513   my_decimal *decimal_value,
514   CHARSET_INFO *access_charset
515 ) {
516   DBUG_ENTER("spider_db_mbase_row::val_decimal");
517   DBUG_PRINT("info",("spider this=%p", this));
518   if (!*row)
519     DBUG_RETURN(NULL);
520 
521 #ifdef SPIDER_HAS_DECIMAL_OPERATION_RESULTS_VALUE_TYPE
522   decimal_operation_results(str2my_decimal(0, *row, *lengths, access_charset,
523     decimal_value), "", "");
524 #else
525   decimal_operation_results(str2my_decimal(0, *row, *lengths, access_charset,
526     decimal_value));
527 #endif
528 
529   DBUG_RETURN(decimal_value);
530 }
531 
clone()532 SPIDER_DB_ROW *spider_db_mbase_row::clone()
533 {
534   spider_db_mbase_row *clone_row;
535   char *tmp_char;
536   MYSQL_ROW tmp_row = row_first, ctmp_row;
537   ulong *tmp_lengths = lengths_first;
538   uint row_size, i;
539   DBUG_ENTER("spider_db_mbase_row::clone");
540   DBUG_PRINT("info",("spider this=%p", this));
541   if (!(clone_row = new spider_db_mbase_row(dbton_id)))
542   {
543     DBUG_RETURN(NULL);
544   }
545   if (!record_size)
546   {
547     row_size = field_count;
548     for (i = 0; i < field_count; i++)
549     {
550       row_size += *tmp_lengths;
551       tmp_lengths++;
552     }
553     record_size = row_size - field_count;
554   } else {
555     row_size = record_size + field_count;
556   }
557   if (!spider_bulk_malloc(spider_current_trx, 29, MYF(MY_WME),
558     &clone_row->row, (uint) (sizeof(char*) * field_count),
559     &tmp_char, (uint) (row_size),
560     &clone_row->lengths, (uint) (sizeof(ulong) * field_count),
561     NullS)
562   ) {
563     delete clone_row;
564     DBUG_RETURN(NULL);
565   }
566   memcpy(clone_row->lengths, lengths_first, sizeof(ulong) * field_count);
567   tmp_lengths = lengths_first;
568   ctmp_row = clone_row->row;
569   for (i = 0; i < field_count; i++)
570   {
571     DBUG_PRINT("info",("spider *lengths=%lu", *tmp_lengths));
572     if (*tmp_row == NULL)
573     {
574       *ctmp_row = NULL;
575       *tmp_char = 0;
576       tmp_char++;
577     } else {
578       *ctmp_row = tmp_char;
579       memcpy(tmp_char, *tmp_row, *tmp_lengths + 1);
580       tmp_char += *tmp_lengths + 1;
581     }
582     ctmp_row++;
583     tmp_lengths++;
584     tmp_row++;
585   }
586   clone_row->field_count = field_count;
587   clone_row->record_size = record_size;
588   clone_row->row_first = clone_row->row;
589   clone_row->lengths_first = clone_row->lengths;
590   clone_row->cloned = TRUE;
591   DBUG_RETURN((SPIDER_DB_ROW *) clone_row);
592 }
593 
store_to_tmp_table(TABLE * tmp_table,spider_string * str)594 int spider_db_mbase_row::store_to_tmp_table(
595   TABLE *tmp_table,
596   spider_string *str
597 ) {
598   uint i;
599   MYSQL_ROW tmp_row = row;
600   ulong *tmp_lengths = lengths;
601   DBUG_ENTER("spider_db_mbase_row::store_to_tmp_table");
602   DBUG_PRINT("info",("spider this=%p", this));
603   str->length(0);
604   for (i = 0; i < field_count; i++)
605   {
606     if (*tmp_row)
607     {
608       if (str->reserve(*tmp_lengths + 1))
609       {
610         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
611       }
612       str->q_append(*tmp_row, *tmp_lengths + 1);
613     }
614     tmp_lengths++;
615     tmp_row++;
616   }
617   tmp_table->field[0]->set_notnull();
618   tmp_table->field[0]->store(
619     (const char *) lengths,
620     sizeof(ulong) * field_count, &my_charset_bin);
621   tmp_table->field[1]->set_notnull();
622   tmp_table->field[1]->store(
623     str->ptr(), str->length(), &my_charset_bin);
624   tmp_table->field[2]->set_notnull();
625   tmp_table->field[2]->store(
626     (char *) row, (uint) (sizeof(char *) * field_count), &my_charset_bin);
627   DBUG_RETURN(tmp_table->file->ha_write_row(tmp_table->record[0]));
628 }
629 
get_byte_size()630 uint spider_db_mbase_row::get_byte_size()
631 {
632   ulong *tmp_lengths = lengths_first;
633   uint i;
634   DBUG_ENTER("spider_db_mbase_row::get_byte_size");
635   DBUG_PRINT("info",("spider this=%p", this));
636   if (!record_size)
637   {
638     for (i = 0; i < field_count; i++)
639     {
640       record_size += *tmp_lengths;
641       tmp_lengths++;
642     }
643   }
644   DBUG_RETURN(record_size);
645 }
646 
spider_db_mbase_result(SPIDER_DB_CONN * in_db_conn)647 spider_db_mbase_result::spider_db_mbase_result(
648   SPIDER_DB_CONN *in_db_conn
649 ) : spider_db_result(in_db_conn),
650   db_result(NULL), row(in_db_conn->dbton_id)
651 {
652   DBUG_ENTER("spider_db_mbase_result::spider_db_mbase_result");
653   DBUG_PRINT("info",("spider this=%p", this));
654   DBUG_VOID_RETURN;
655 }
656 
spider_db_mysql_result(SPIDER_DB_CONN * in_db_conn)657 spider_db_mysql_result::spider_db_mysql_result(
658   SPIDER_DB_CONN *in_db_conn
659 ) : spider_db_mbase_result(in_db_conn)
660 {
661   DBUG_ENTER("spider_db_mysql_result::spider_db_mysql_result");
662   DBUG_PRINT("info",("spider this=%p", this));
663   DBUG_VOID_RETURN;
664 }
665 
spider_db_mariadb_result(SPIDER_DB_CONN * in_db_conn)666 spider_db_mariadb_result::spider_db_mariadb_result(
667   SPIDER_DB_CONN *in_db_conn
668 ) : spider_db_mbase_result(in_db_conn)
669 {
670   DBUG_ENTER("spider_db_mariadb_result::spider_db_mariadb_result");
671   DBUG_PRINT("info",("spider this=%p", this));
672   DBUG_VOID_RETURN;
673 }
674 
~spider_db_mbase_result()675 spider_db_mbase_result::~spider_db_mbase_result()
676 {
677   DBUG_ENTER("spider_db_mbase_result::~spider_db_mbase_result");
678   DBUG_PRINT("info",("spider this=%p", this));
679   if (db_result)
680   {
681     free_result();
682   }
683   DBUG_VOID_RETURN;
684 }
685 
~spider_db_mysql_result()686 spider_db_mysql_result::~spider_db_mysql_result()
687 {
688   DBUG_ENTER("spider_db_mysql_result::~spider_db_mysql_result");
689   DBUG_PRINT("info",("spider this=%p", this));
690   DBUG_VOID_RETURN;
691 }
692 
~spider_db_mariadb_result()693 spider_db_mariadb_result::~spider_db_mariadb_result()
694 {
695   DBUG_ENTER("spider_db_mariadb_result::~spider_db_mariadb_result");
696   DBUG_PRINT("info",("spider this=%p", this));
697   DBUG_VOID_RETURN;
698 }
699 
has_result()700 bool spider_db_mbase_result::has_result()
701 {
702   DBUG_ENTER("spider_db_mbase_result::has_result");
703   DBUG_PRINT("info",("spider this=%p", this));
704   DBUG_RETURN(db_result);
705 }
706 
free_result()707 void spider_db_mbase_result::free_result()
708 {
709   DBUG_ENTER("spider_db_mbase_result::free_result");
710   DBUG_PRINT("info",("spider this=%p", this));
711   /* need 2 times execution design */
712   if (db_result)
713   {
714     mysql_free_result(db_result);
715     db_result = NULL;
716   }
717   DBUG_VOID_RETURN;
718 }
719 
current_row()720 SPIDER_DB_ROW *spider_db_mbase_result::current_row()
721 {
722   DBUG_ENTER("spider_db_mbase_result::current_row");
723   DBUG_PRINT("info",("spider this=%p", this));
724   DBUG_RETURN((SPIDER_DB_ROW *) row.clone());
725 }
726 
fetch_row()727 SPIDER_DB_ROW *spider_db_mbase_result::fetch_row()
728 {
729   DBUG_ENTER("spider_db_mbase_result::fetch_row");
730   DBUG_PRINT("info",("spider this=%p", this));
731   if (!(row.row = mysql_fetch_row(db_result)))
732   {
733     if (mysql_errno(((spider_db_mbase *) db_conn)->db_conn))
734     {
735       store_error_num = mysql_errno(((spider_db_mbase *) db_conn)->db_conn);
736       my_message(store_error_num,
737         mysql_error(((spider_db_mbase *) db_conn)->db_conn), MYF(0));
738     } else
739       store_error_num = HA_ERR_END_OF_FILE;
740     DBUG_RETURN(NULL);
741   }
742   row.lengths = mysql_fetch_lengths(db_result);
743   row.field_count = mysql_num_fields(db_result);
744   row.row_first = row.row;
745   row.lengths_first = row.lengths;
746   row.record_size = 0;
747   DBUG_RETURN((SPIDER_DB_ROW *) &row);
748 }
749 
fetch_row_from_result_buffer(spider_db_result_buffer * spider_res_buf)750 SPIDER_DB_ROW *spider_db_mbase_result::fetch_row_from_result_buffer(
751   spider_db_result_buffer *spider_res_buf
752 ) {
753   DBUG_ENTER("spider_db_mbase_result::fetch_row_from_result_buffer");
754   DBUG_PRINT("info",("spider this=%p", this));
755   if (!(row.row = mysql_fetch_row(db_result)))
756   {
757     if (mysql_errno(((spider_db_mbase *) db_conn)->db_conn))
758     {
759       store_error_num = mysql_errno(((spider_db_mbase *) db_conn)->db_conn);
760       my_message(store_error_num,
761         mysql_error(((spider_db_mbase *) db_conn)->db_conn), MYF(0));
762     } else
763       store_error_num = HA_ERR_END_OF_FILE;
764     DBUG_RETURN(NULL);
765   }
766   row.lengths = mysql_fetch_lengths(db_result);
767   row.field_count = mysql_num_fields(db_result);
768   row.row_first = row.row;
769   row.lengths_first = row.lengths;
770   row.record_size = 0;
771   DBUG_RETURN((SPIDER_DB_ROW *) &row);
772 }
773 
fetch_row_from_tmp_table(TABLE * tmp_table)774 SPIDER_DB_ROW *spider_db_mbase_result::fetch_row_from_tmp_table(
775   TABLE *tmp_table
776 ) {
777   uint i;
778   spider_string tmp_str1, tmp_str2, tmp_str3;
779   const char *row_ptr;
780   MYSQL_ROW tmp_row;
781   ulong *tmp_lengths;
782   uint field_count;
783   DBUG_ENTER("spider_db_mbase_result::fetch_row_from_tmp_table");
784   DBUG_PRINT("info",("spider this=%p", this));
785   tmp_str1.init_calc_mem(117);
786   tmp_str2.init_calc_mem(118);
787   tmp_str3.init_calc_mem(170);
788   tmp_table->field[0]->val_str(tmp_str1.get_str());
789   tmp_table->field[1]->val_str(tmp_str2.get_str());
790   tmp_table->field[2]->val_str(tmp_str3.get_str());
791   tmp_str1.mem_calc();
792   tmp_str2.mem_calc();
793   tmp_str3.mem_calc();
794   row_ptr = tmp_str2.ptr();
795   tmp_lengths = (ulong *) tmp_str1.ptr();
796   tmp_row = (MYSQL_ROW) tmp_str3.ptr();
797   field_count = tmp_str1.length() / sizeof(ulong);
798   row.row = tmp_row;
799   row.lengths = tmp_lengths;
800   row.field_count = field_count;
801   row.row_first = row.row;
802   row.lengths_first = row.lengths;
803   row.record_size = tmp_str2.length();
804   for (i = 0; i < field_count; i++)
805   {
806     if (*tmp_row)
807     {
808       *tmp_row = (char *) row_ptr;
809       row_ptr += *tmp_lengths + 1;
810     }
811     tmp_row++;
812     tmp_lengths++;
813   }
814   DBUG_RETURN((SPIDER_DB_ROW *) &row);
815 }
816 
fetch_table_status(int mode,ha_statistics & stat)817 int spider_db_mbase_result::fetch_table_status(
818   int mode,
819   ha_statistics &stat
820 ) {
821   int error_num;
822   MYSQL_ROW mysql_row;
823   MYSQL_TIME mysql_time;
824 #ifdef MARIADB_BASE_VERSION
825   uint not_used_uint;
826 #else
827   my_bool not_used_my_bool;
828 #endif
829 #ifdef SPIDER_HAS_TIME_STATUS
830   MYSQL_TIME_STATUS time_status;
831 #else
832   int time_status;
833 #endif
834   long not_used_long;
835   DBUG_ENTER("spider_db_mbase_result::fetch_table_status");
836   DBUG_PRINT("info",("spider this=%p", this));
837   if (!(mysql_row = mysql_fetch_row(db_result)))
838   {
839     DBUG_PRINT("info",("spider fetch row is null"));
840     if ((error_num = mysql_errno(((spider_db_mbase *) db_conn)->db_conn)))
841     {
842       my_message(error_num,
843         mysql_error(((spider_db_mbase *) db_conn)->db_conn), MYF(0));
844       DBUG_RETURN(error_num);
845     }
846     DBUG_RETURN(ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM);
847   }
848   if (mode == 1)
849   {
850     /* Ok to test for 18 fields as all new fields are added last */
851     if (num_fields() < 18)
852     {
853       DBUG_PRINT("info",("spider field_count < 18"));
854       DBUG_RETURN(ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM);
855     }
856 
857     if (mysql_row[4])
858       stat.records =
859         (ha_rows) my_strtoll10(mysql_row[4], (char**) NULL, &error_num);
860     else
861       stat.records = (ha_rows) 0;
862     DBUG_PRINT("info",
863       ("spider records=%lld", stat.records));
864     if (mysql_row[5])
865       stat.mean_rec_length =
866         (ulong) my_strtoll10(mysql_row[5], (char**) NULL, &error_num);
867     else
868       stat.mean_rec_length = 0;
869     DBUG_PRINT("info",
870       ("spider mean_rec_length=%lu", stat.mean_rec_length));
871     if (mysql_row[6])
872       stat.data_file_length =
873         (ulonglong) my_strtoll10(mysql_row[6], (char**) NULL, &error_num);
874     else
875       stat.data_file_length = 0;
876     DBUG_PRINT("info",
877       ("spider data_file_length=%lld", stat.data_file_length));
878     if (mysql_row[7])
879       stat.max_data_file_length =
880         (ulonglong) my_strtoll10(mysql_row[7], (char**) NULL, &error_num);
881     else
882       stat.max_data_file_length = 0;
883     DBUG_PRINT("info",
884       ("spider max_data_file_length=%lld", stat.max_data_file_length));
885     if (mysql_row[8])
886       stat.index_file_length =
887         (ulonglong) my_strtoll10(mysql_row[8], (char**) NULL, &error_num);
888     else
889       stat.index_file_length = 0;
890     DBUG_PRINT("info",
891       ("spider index_file_length=%lld", stat.index_file_length));
892     if (mysql_row[10])
893       stat.auto_increment_value =
894         (ulonglong) my_strtoll10(mysql_row[10], (char**) NULL, &error_num);
895     else
896       stat.auto_increment_value = 1;
897     DBUG_PRINT("info",
898       ("spider auto_increment_value=%lld", stat.auto_increment_value));
899     if (mysql_row[11])
900     {
901 #ifdef SPIDER_HAS_TIME_STATUS
902       my_time_status_init(&time_status);
903 #endif
904       SPIDER_str_to_datetime(mysql_row[11], strlen(mysql_row[11]),
905         &mysql_time, 0, &time_status);
906 #ifdef MARIADB_BASE_VERSION
907       stat.create_time = (time_t) my_system_gmt_sec(&mysql_time,
908         &not_used_long, &not_used_uint);
909 #else
910       stat.create_time = (time_t) my_system_gmt_sec(&mysql_time,
911         &not_used_long, &not_used_my_bool);
912 #endif
913     } else
914       stat.create_time = (time_t) 0;
915 #ifndef DBUG_OFF
916     {
917       struct tm *ts, tmp_ts;
918       char buf[80];
919       ts = localtime_r(&stat.create_time, &tmp_ts);
920       strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", ts);
921       DBUG_PRINT("info",("spider create_time=%s", buf));
922     }
923 #endif
924     if (mysql_row[12])
925     {
926 #ifdef SPIDER_HAS_TIME_STATUS
927       my_time_status_init(&time_status);
928 #endif
929       SPIDER_str_to_datetime(mysql_row[12], strlen(mysql_row[12]),
930         &mysql_time, 0, &time_status);
931 #ifdef MARIADB_BASE_VERSION
932       stat.update_time = (time_t) my_system_gmt_sec(&mysql_time,
933         &not_used_long, &not_used_uint);
934 #else
935       stat.update_time = (time_t) my_system_gmt_sec(&mysql_time,
936         &not_used_long, &not_used_my_bool);
937 #endif
938     } else
939       stat.update_time = (time_t) 0;
940 #ifndef DBUG_OFF
941     {
942       struct tm *ts, tmp_ts;
943       char buf[80];
944       ts = localtime_r(&stat.update_time, &tmp_ts);
945       strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", ts);
946       DBUG_PRINT("info",("spider update_time=%s", buf));
947     }
948 #endif
949     if (mysql_row[13])
950     {
951 #ifdef SPIDER_HAS_TIME_STATUS
952       my_time_status_init(&time_status);
953 #endif
954       SPIDER_str_to_datetime(mysql_row[13], strlen(mysql_row[13]),
955         &mysql_time, 0, &time_status);
956 #ifdef MARIADB_BASE_VERSION
957       stat.check_time = (time_t) my_system_gmt_sec(&mysql_time,
958         &not_used_long, &not_used_uint);
959 #else
960       stat.check_time = (time_t) my_system_gmt_sec(&mysql_time,
961         &not_used_long, &not_used_my_bool);
962 #endif
963     } else
964       stat.check_time = (time_t) 0;
965 #ifndef DBUG_OFF
966     {
967       struct tm *ts, tmp_ts;
968       char buf[80];
969       ts = localtime_r(&stat.check_time, &tmp_ts);
970       strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", ts);
971       DBUG_PRINT("info",("spider check_time=%s", buf));
972     }
973 #endif
974     if (mysql_row[15])
975     {
976       stat.checksum_null = FALSE;
977       stat.checksum =
978         (ha_checksum) my_strtoll10(mysql_row[15], (char**) NULL, &error_num);
979       DBUG_PRINT("info", ("spider checksum=%lu", (ulong) stat.checksum));
980     } else {
981       stat.checksum_null = TRUE;
982       stat.checksum = (ha_checksum) 0;
983       DBUG_PRINT("info", ("spider checksum is null"));
984     }
985   } else {
986     if (mysql_row[0])
987       stat.records =
988         (ha_rows) my_strtoll10(mysql_row[0], (char**) NULL, &error_num);
989     else
990       stat.records = (ha_rows) 0;
991     DBUG_PRINT("info",
992       ("spider records=%lld", stat.records));
993     if (mysql_row[1])
994       stat.mean_rec_length =
995         (ulong) my_strtoll10(mysql_row[1], (char**) NULL, &error_num);
996     else
997       stat.mean_rec_length = 0;
998     DBUG_PRINT("info",
999       ("spider mean_rec_length=%lu", stat.mean_rec_length));
1000     if (mysql_row[2])
1001       stat.data_file_length =
1002         (ulonglong) my_strtoll10(mysql_row[2], (char**) NULL, &error_num);
1003     else
1004       stat.data_file_length = 0;
1005     DBUG_PRINT("info",
1006       ("spider data_file_length=%lld", stat.data_file_length));
1007     if (mysql_row[3])
1008       stat.max_data_file_length =
1009         (ulonglong) my_strtoll10(mysql_row[3], (char**) NULL, &error_num);
1010     else
1011       stat.max_data_file_length = 0;
1012     DBUG_PRINT("info",
1013       ("spider max_data_file_length=%lld", stat.max_data_file_length));
1014     if (mysql_row[4])
1015       stat.index_file_length =
1016         (ulonglong) my_strtoll10(mysql_row[4], (char**) NULL, &error_num);
1017     else
1018       stat.index_file_length = 0;
1019     DBUG_PRINT("info",
1020       ("spider index_file_length=%lld", stat.index_file_length));
1021     if (mysql_row[5])
1022       stat.auto_increment_value =
1023         (ulonglong) my_strtoll10(mysql_row[5], (char**) NULL, &error_num);
1024     else
1025       stat.auto_increment_value = 1;
1026     DBUG_PRINT("info",
1027       ("spider auto_increment_value=%lld", stat.auto_increment_value));
1028     if (mysql_row[6])
1029     {
1030 #ifdef SPIDER_HAS_TIME_STATUS
1031       my_time_status_init(&time_status);
1032 #endif
1033       SPIDER_str_to_datetime(mysql_row[6], strlen(mysql_row[6]),
1034         &mysql_time, 0, &time_status);
1035 #ifdef MARIADB_BASE_VERSION
1036       stat.create_time = (time_t) my_system_gmt_sec(&mysql_time,
1037         &not_used_long, &not_used_uint);
1038 #else
1039       stat.create_time = (time_t) my_system_gmt_sec(&mysql_time,
1040         &not_used_long, &not_used_my_bool);
1041 #endif
1042     } else
1043       stat.create_time = (time_t) 0;
1044 #ifndef DBUG_OFF
1045     {
1046       struct tm *ts, tmp_ts;
1047       char buf[80];
1048       ts = localtime_r(&stat.create_time, &tmp_ts);
1049       strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", ts);
1050       DBUG_PRINT("info",("spider create_time=%s", buf));
1051     }
1052 #endif
1053     if (mysql_row[7])
1054     {
1055 #ifdef SPIDER_HAS_TIME_STATUS
1056       my_time_status_init(&time_status);
1057 #endif
1058       SPIDER_str_to_datetime(mysql_row[7], strlen(mysql_row[7]),
1059         &mysql_time, 0, &time_status);
1060 #ifdef MARIADB_BASE_VERSION
1061       stat.update_time = (time_t) my_system_gmt_sec(&mysql_time,
1062         &not_used_long, &not_used_uint);
1063 #else
1064       stat.update_time = (time_t) my_system_gmt_sec(&mysql_time,
1065         &not_used_long, &not_used_my_bool);
1066 #endif
1067     } else
1068       stat.update_time = (time_t) 0;
1069 #ifndef DBUG_OFF
1070     {
1071       struct tm *ts, tmp_ts;
1072       char buf[80];
1073       ts = localtime_r(&stat.update_time, &tmp_ts);
1074       strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", ts);
1075       DBUG_PRINT("info",("spider update_time=%s", buf));
1076     }
1077 #endif
1078     if (mysql_row[8])
1079     {
1080 #ifdef SPIDER_HAS_TIME_STATUS
1081       my_time_status_init(&time_status);
1082 #endif
1083       SPIDER_str_to_datetime(mysql_row[8], strlen(mysql_row[8]),
1084         &mysql_time, 0, &time_status);
1085 #ifdef MARIADB_BASE_VERSION
1086       stat.check_time = (time_t) my_system_gmt_sec(&mysql_time,
1087         &not_used_long, &not_used_uint);
1088 #else
1089       stat.check_time = (time_t) my_system_gmt_sec(&mysql_time,
1090         &not_used_long, &not_used_my_bool);
1091 #endif
1092     } else
1093       stat.check_time = (time_t) 0;
1094 #ifndef DBUG_OFF
1095     {
1096       struct tm *ts, tmp_ts;
1097       char buf[80];
1098       ts = localtime_r(&stat.check_time, &tmp_ts);
1099       strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", ts);
1100       DBUG_PRINT("info",("spider check_time=%s", buf));
1101     }
1102 #endif
1103     if (mysql_row[9])
1104     {
1105       stat.checksum_null = FALSE;
1106       stat.checksum =
1107         (ha_checksum) my_strtoll10(mysql_row[9], (char**) NULL, &error_num);
1108       DBUG_PRINT("info", ("spider checksum=%lu", (ulong) stat.checksum));
1109     } else {
1110       stat.checksum_null = TRUE;
1111       stat.checksum = (ha_checksum) 0;
1112       DBUG_PRINT("info", ("spider checksum is null"));
1113     }
1114   }
1115   DBUG_RETURN(0);
1116 }
1117 
fetch_simple_action(uint simple_action,uint position,void * param)1118 int spider_db_mbase_result::fetch_simple_action(
1119   uint simple_action,
1120   uint position,
1121   void *param
1122 ) {
1123   int error_num;
1124   MYSQL_ROW mysql_row;
1125   DBUG_ENTER("spider_db_mbase_result::fetch_simple_action");
1126   DBUG_PRINT("info",("spider this=%p", this));
1127   if (!(mysql_row = mysql_fetch_row(db_result)))
1128   {
1129     DBUG_PRINT("info",("spider fetch row is null"));
1130     if ((error_num = mysql_errno(((spider_db_mbase *) db_conn)->db_conn)))
1131     {
1132       my_message(error_num,
1133         mysql_error(((spider_db_mbase *) db_conn)->db_conn), MYF(0));
1134       DBUG_RETURN(error_num);
1135     }
1136     DBUG_RETURN(ER_QUERY_ON_FOREIGN_DATA_SOURCE);
1137   }
1138   if (num_fields() <= position)
1139   {
1140     DBUG_RETURN(ER_QUERY_ON_FOREIGN_DATA_SOURCE);
1141   }
1142   switch (simple_action)
1143   {
1144     case SPIDER_SIMPLE_RECORDS:
1145     {
1146       ha_rows *records = (ha_rows *) param;
1147       if (mysql_row[position])
1148       {
1149         *records =
1150           (ha_rows) my_strtoll10(mysql_row[position], (char**) NULL,
1151           &error_num);
1152       } else {
1153         *records = (ha_rows) 0;
1154       }
1155       DBUG_PRINT("info", ("spider records=%lld", *records));
1156       break;
1157     }
1158 #ifdef HA_HAS_CHECKSUM_EXTENDED
1159     case SPIDER_SIMPLE_CHECKSUM_TABLE:
1160     {
1161       ha_spider *spider = (ha_spider *) param;
1162       if (mysql_row[position])
1163       {
1164         spider->checksum_val =
1165           (ha_checksum) my_strtoll10(mysql_row[position], (char**) NULL,
1166           &error_num);
1167         DBUG_PRINT("info", ("spider checksum=%llu", (ulonglong)spider->checksum_val));
1168         spider->checksum_null = FALSE;
1169       } else {
1170         spider->checksum_null = TRUE;
1171         DBUG_PRINT("info", ("spider checksum is null"));
1172       }
1173       break;
1174     }
1175 #endif
1176     default:
1177       DBUG_ASSERT(0);
1178       break;
1179   }
1180   DBUG_RETURN(0);
1181 }
1182 
fetch_table_records(int mode,ha_rows & records)1183 int spider_db_mbase_result::fetch_table_records(
1184   int mode,
1185   ha_rows &records
1186 ) {
1187   DBUG_ENTER("spider_db_mbase_result::fetch_table_records");
1188   DBUG_PRINT("info",("spider this=%p", this));
1189   if (mode == 1)
1190   {
1191     DBUG_RETURN(fetch_simple_action(SPIDER_SIMPLE_RECORDS,
1192       SPIDER_SQL_SHOW_RECORDS_RECORDS_POS, &records));
1193   } else {
1194     DBUG_RETURN(fetch_simple_action(SPIDER_SIMPLE_RECORDS,
1195       SPIDER_SQL_EXPLAIN_SELECT_RECORDS_POS, &records));
1196   }
1197 }
1198 
1199 #ifdef HA_HAS_CHECKSUM_EXTENDED
fetch_table_checksum(ha_spider * spider)1200 int spider_db_mbase_result::fetch_table_checksum(
1201   ha_spider *spider
1202 ) {
1203   DBUG_ENTER("spider_db_mbase_result::fetch_table_checksum");
1204   DBUG_PRINT("info",("spider this=%p", this));
1205   DBUG_RETURN(fetch_simple_action(SPIDER_SIMPLE_CHECKSUM_TABLE,
1206     SPIDER_SQL_CHECKSUM_CHECKSUM_POS, spider));
1207 }
1208 #endif
1209 
fetch_table_cardinality(int mode,TABLE * table,longlong * cardinality,uchar * cardinality_upd,int bitmap_size)1210 int spider_db_mbase_result::fetch_table_cardinality(
1211   int mode,
1212   TABLE *table,
1213   longlong *cardinality,
1214   uchar *cardinality_upd,
1215   int bitmap_size
1216 ) {
1217   int error_num;
1218   MYSQL_ROW mysql_row;
1219   Field *field;
1220   DBUG_ENTER("spider_db_mbase_result::fetch_table_cardinality");
1221   DBUG_PRINT("info",("spider this=%p", this));
1222   memset((uchar *) cardinality_upd, 0, sizeof(uchar) * bitmap_size);
1223   if (!(mysql_row = mysql_fetch_row(db_result)))
1224   {
1225     DBUG_PRINT("info",("spider fetch row is null"));
1226     if ((error_num = mysql_errno(((spider_db_mbase *) db_conn)->db_conn)))
1227     {
1228       my_message(error_num,
1229         mysql_error(((spider_db_mbase *) db_conn)->db_conn), MYF(0));
1230       DBUG_RETURN(error_num);
1231     }
1232     /* no index */
1233     DBUG_RETURN(0);
1234   }
1235   if (mode == 1)
1236   {
1237     uint num_fields = this->num_fields();
1238     if (num_fields < 12 || num_fields > 13)
1239     {
1240       DBUG_PRINT("info",("spider num_fields < 12 || num_fields > 13"));
1241       DBUG_RETURN(ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM);
1242     }
1243 
1244     while (mysql_row)
1245     {
1246       if (
1247         mysql_row[4] &&
1248         mysql_row[6] &&
1249         (field = find_field_in_table_sef(table, mysql_row[4]))
1250       ) {
1251         if ((cardinality[field->field_index] =
1252           (longlong) my_strtoll10(mysql_row[6], (char**) NULL, &error_num))
1253         <= 0)
1254           cardinality[field->field_index] = 1;
1255         spider_set_bit(cardinality_upd, field->field_index);
1256         DBUG_PRINT("info",
1257           ("spider col_name=%s", mysql_row[4]));
1258         DBUG_PRINT("info",
1259           ("spider cardinality=%lld",
1260           cardinality[field->field_index]));
1261       } else if (mysql_row[4])
1262       {
1263         DBUG_PRINT("info",
1264           ("spider skip col_name=%s", mysql_row[4]));
1265       } else {
1266         DBUG_RETURN(ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM);
1267       }
1268       mysql_row = mysql_fetch_row(db_result);
1269     }
1270   } else {
1271     while (mysql_row)
1272     {
1273       if (
1274         mysql_row[0] &&
1275         mysql_row[1] &&
1276         (field = find_field_in_table_sef(table, mysql_row[0]))
1277       ) {
1278         if ((cardinality[field->field_index] =
1279           (longlong) my_strtoll10(mysql_row[1], (char**) NULL, &error_num))
1280         <= 0)
1281           cardinality[field->field_index] = 1;
1282         spider_set_bit(cardinality_upd, field->field_index);
1283         DBUG_PRINT("info",
1284           ("spider col_name=%s", mysql_row[0]));
1285         DBUG_PRINT("info",
1286           ("spider cardinality=%lld",
1287           cardinality[field->field_index]));
1288       } else if (mysql_row[0])
1289       {
1290         DBUG_PRINT("info",
1291           ("spider skip col_name=%s", mysql_row[0]));
1292       } else {
1293         DBUG_RETURN(ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM);
1294       }
1295       mysql_row = mysql_fetch_row(db_result);
1296     }
1297   }
1298   if ((error_num = mysql_errno(((spider_db_mbase *) db_conn)->db_conn)))
1299   {
1300     my_message(error_num,
1301       mysql_error(((spider_db_mbase *) db_conn)->db_conn), MYF(0));
1302     DBUG_RETURN(error_num);
1303   }
1304   DBUG_RETURN(0);
1305 }
1306 
fetch_table_mon_status(int & status)1307 int spider_db_mbase_result::fetch_table_mon_status(
1308   int &status
1309 ) {
1310   int error_num;
1311   MYSQL_ROW mysql_row;
1312   DBUG_ENTER("spider_db_mbase_result::fetch_table_mon_status");
1313   DBUG_PRINT("info",("spider this=%p", this));
1314   if (!(mysql_row = mysql_fetch_row(db_result)))
1315   {
1316     DBUG_PRINT("info",("spider fetch row is null"));
1317     if ((error_num = mysql_errno(((spider_db_mbase *) db_conn)->db_conn)))
1318     {
1319       my_message(error_num,
1320         mysql_error(((spider_db_mbase *) db_conn)->db_conn), MYF(0));
1321       DBUG_RETURN(error_num);
1322     }
1323     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1324   }
1325   if (num_fields() != 1)
1326   {
1327     DBUG_PRINT("info",("spider num_fields != 1"));
1328     my_printf_error(ER_SPIDER_UNKNOWN_NUM, ER_SPIDER_UNKNOWN_STR, MYF(0));
1329     DBUG_RETURN(ER_SPIDER_UNKNOWN_NUM);
1330   }
1331   if (mysql_row[0])
1332     status = atoi(mysql_row[0]);
1333   else
1334     status = SPIDER_LINK_MON_OK;
1335   DBUG_PRINT("info", ("spider status=%d", status));
1336   DBUG_RETURN(0);
1337 }
1338 
fetch_show_master_status(const char ** binlog_file_name,const char ** binlog_pos)1339 int spider_db_mbase_result::fetch_show_master_status(
1340   const char **binlog_file_name,
1341   const char **binlog_pos
1342 ) {
1343   int error_num;
1344   MYSQL_ROW mysql_row;
1345   DBUG_ENTER("spider_db_mbase_result::fetch_show_master_status");
1346   DBUG_PRINT("info",("spider this=%p", this));
1347   if (!(mysql_row = mysql_fetch_row(db_result)))
1348   {
1349     DBUG_PRINT("info",("spider fetch row is null"));
1350     if ((error_num = mysql_errno(((spider_db_mbase *) db_conn)->db_conn)))
1351     {
1352       my_message(error_num,
1353         mysql_error(((spider_db_mbase *) db_conn)->db_conn), MYF(0));
1354       DBUG_RETURN(error_num);
1355     }
1356     DBUG_RETURN(ER_QUERY_ON_FOREIGN_DATA_SOURCE);
1357   }
1358   if (num_fields() != 4)
1359   {
1360     DBUG_RETURN(ER_QUERY_ON_FOREIGN_DATA_SOURCE);
1361   }
1362 
1363   *binlog_file_name = mysql_row[0];
1364   DBUG_PRINT("info",("spider binlog_file_name=%s", *binlog_file_name));
1365   *binlog_pos = mysql_row[1];
1366   DBUG_PRINT("info",("spider binlog_pos=%s", *binlog_pos));
1367   DBUG_RETURN(0);
1368 }
1369 
fetch_select_binlog_gtid_pos(const char ** gtid_pos)1370 int spider_db_mbase_result::fetch_select_binlog_gtid_pos(
1371   const char **gtid_pos
1372 ) {
1373   int error_num;
1374   MYSQL_ROW mysql_row;
1375   DBUG_ENTER("spider_db_mbase_result::fetch_select_binlog_gtid_pos");
1376   DBUG_PRINT("info",("spider this=%p", this));
1377   if (!(mysql_row = mysql_fetch_row(db_result)))
1378   {
1379     DBUG_PRINT("info",("spider fetch row is null"));
1380     if ((error_num = mysql_errno(((spider_db_mbase *) db_conn)->db_conn)))
1381     {
1382       my_message(error_num,
1383         mysql_error(((spider_db_mbase *) db_conn)->db_conn), MYF(0));
1384       DBUG_RETURN(error_num);
1385     }
1386     DBUG_RETURN(ER_QUERY_ON_FOREIGN_DATA_SOURCE);
1387   }
1388   if (num_fields() != 1)
1389   {
1390     DBUG_RETURN(ER_QUERY_ON_FOREIGN_DATA_SOURCE);
1391   }
1392 
1393   *gtid_pos = mysql_row[0];
1394   DBUG_PRINT("info",("spider gtid_pos=%s", *gtid_pos));
1395   DBUG_RETURN(0);
1396 }
1397 
num_rows()1398 longlong spider_db_mbase_result::num_rows()
1399 {
1400   DBUG_ENTER("spider_db_mbase_result::num_rows");
1401   DBUG_PRINT("info",("spider this=%p", this));
1402   DBUG_RETURN((longlong) mysql_num_rows(db_result));
1403 }
1404 
num_fields()1405 uint spider_db_mbase_result::num_fields()
1406 {
1407   DBUG_ENTER("spider_db_mbase_result::num_fields");
1408   DBUG_PRINT("info",("spider this=%p", this));
1409   DBUG_RETURN(mysql_num_fields(db_result));
1410 }
1411 
move_to_pos(longlong pos)1412 void spider_db_mbase_result::move_to_pos(
1413   longlong pos
1414 ) {
1415   DBUG_ENTER("spider_db_mbase_result::move_to_pos");
1416   DBUG_PRINT("info",("spider this=%p", this));
1417   DBUG_PRINT("info",("spider pos=%lld", pos));
1418 /*
1419   DBUG_ASSERT(first_row);
1420 */
1421   db_result->data_cursor = first_row + pos;
1422   DBUG_VOID_RETURN;
1423 }
1424 
get_errno()1425 int spider_db_mbase_result::get_errno()
1426 {
1427   DBUG_ENTER("spider_db_mbase_result::get_errno");
1428   DBUG_PRINT("info",("spider this=%p", this));
1429   DBUG_PRINT("info",("spider store_error_num=%d", store_error_num));
1430   DBUG_RETURN(store_error_num);
1431 }
1432 
1433 #ifdef SPIDER_HAS_DISCOVER_TABLE_STRUCTURE
fetch_columns_for_discover_table_structure(spider_string * str,CHARSET_INFO * access_charset)1434 int spider_db_mbase_result::fetch_columns_for_discover_table_structure(
1435   spider_string *str,
1436   CHARSET_INFO *access_charset
1437 ) {
1438   int error_num;
1439   uint length;
1440   MYSQL_ROW mysql_row;
1441   DBUG_ENTER("spider_db_mbase_result::fetch_columns_for_discover_table_structure");
1442   DBUG_PRINT("info",("spider this=%p", this));
1443   if (!(mysql_row = mysql_fetch_row(db_result)))
1444   {
1445     DBUG_PRINT("info",("spider fetch row is null"));
1446     if ((error_num = mysql_errno(((spider_db_mbase *) db_conn)->db_conn)))
1447     {
1448       my_message(error_num,
1449         mysql_error(((spider_db_mbase *) db_conn)->db_conn), MYF(0));
1450       DBUG_RETURN(error_num);
1451     }
1452     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1453   }
1454   if (num_fields() != 7)
1455   {
1456     DBUG_PRINT("info",("spider num_fields != 7"));
1457     my_printf_error(ER_SPIDER_UNKNOWN_NUM, ER_SPIDER_UNKNOWN_STR, MYF(0));
1458     DBUG_RETURN(ER_SPIDER_UNKNOWN_NUM);
1459   }
1460   do {
1461     if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN))
1462     {
1463       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1464     }
1465     str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
1466     if (str->append(mysql_row[0], strlen(mysql_row[0]), access_charset))
1467     {
1468       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1469     }
1470     if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN + SPIDER_SQL_SPACE_LEN))
1471     {
1472       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1473     }
1474     str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
1475     str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
1476     if (str->append(mysql_row[5], strlen(mysql_row[5]), access_charset))
1477     {
1478       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1479     }
1480     if (mysql_row[3])
1481     {
1482       length = strlen(mysql_row[3]);
1483       if (str->reserve(SPIDER_SQL_CHARACTER_SET_LEN + length))
1484       {
1485         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1486       }
1487       str->q_append(SPIDER_SQL_CHARACTER_SET_STR, SPIDER_SQL_CHARACTER_SET_LEN);
1488       str->q_append(mysql_row[3], length);
1489     }
1490     if (mysql_row[4])
1491     {
1492       length = strlen(mysql_row[4]);
1493       if (str->reserve(SPIDER_SQL_COLLATE_LEN + length))
1494       {
1495         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1496       }
1497       str->q_append(SPIDER_SQL_COLLATE_STR, SPIDER_SQL_COLLATE_LEN);
1498       str->q_append(mysql_row[4], length);
1499     }
1500     if (!strcmp(mysql_row[2], "NO"))
1501     {
1502       if (str->reserve(SPIDER_SQL_NOT_NULL_LEN))
1503       {
1504         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1505       }
1506       str->q_append(SPIDER_SQL_NOT_NULL_STR, SPIDER_SQL_NOT_NULL_LEN);
1507       if (mysql_row[1])
1508       {
1509         if (str->reserve(SPIDER_SQL_DEFAULT_LEN))
1510         {
1511           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1512         }
1513         str->q_append(SPIDER_SQL_DEFAULT_STR, SPIDER_SQL_DEFAULT_LEN);
1514         if (str->append(mysql_row[1], strlen(mysql_row[1]), access_charset))
1515         {
1516           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1517         }
1518       }
1519     } else {
1520       if (str->reserve(SPIDER_SQL_DEFAULT_LEN))
1521       {
1522         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1523       }
1524       str->q_append(SPIDER_SQL_DEFAULT_STR, SPIDER_SQL_DEFAULT_LEN);
1525       if (mysql_row[1])
1526       {
1527         if (str->append(mysql_row[1], strlen(mysql_row[1]), access_charset))
1528         {
1529           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1530         }
1531       } else {
1532         if (str->reserve(SPIDER_SQL_NULL_LEN))
1533         {
1534           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1535         }
1536         str->q_append(SPIDER_SQL_NULL_STR, SPIDER_SQL_NULL_LEN);
1537       }
1538     }
1539     if (mysql_row[6] && !strcmp(mysql_row[6], "auto_increment"))
1540     {
1541       if (str->reserve(SPIDER_SQL_AUTO_INCREMENT_LEN))
1542         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1543       str->q_append(SPIDER_SQL_AUTO_INCREMENT_STR, SPIDER_SQL_AUTO_INCREMENT_LEN);
1544     }
1545     if (str->reserve(SPIDER_SQL_COMMA_LEN))
1546     {
1547       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1548     }
1549     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
1550   } while ((mysql_row = mysql_fetch_row(db_result)));
1551   if ((error_num = mysql_errno(((spider_db_mbase *) db_conn)->db_conn)))
1552   {
1553     my_message(error_num,
1554       mysql_error(((spider_db_mbase *) db_conn)->db_conn), MYF(0));
1555     DBUG_RETURN(error_num);
1556   }
1557   DBUG_RETURN(0);
1558 }
1559 
fetch_index_for_discover_table_structure(spider_string * str,CHARSET_INFO * access_charset)1560 int spider_db_mbase_result::fetch_index_for_discover_table_structure(
1561   spider_string *str,
1562   CHARSET_INFO *access_charset
1563 ) {
1564   int error_num;
1565   MYSQL_ROW mysql_row;
1566   DBUG_ENTER("spider_db_mbase_result::fetch_index_for_discover_table_structure");
1567   DBUG_PRINT("info",("spider this=%p", this));
1568   if (!(mysql_row = mysql_fetch_row(db_result)))
1569   {
1570     DBUG_PRINT("info",("spider fetch row is null"));
1571     if ((error_num = mysql_errno(((spider_db_mbase *) db_conn)->db_conn)))
1572     {
1573       my_message(error_num,
1574         mysql_error(((spider_db_mbase *) db_conn)->db_conn), MYF(0));
1575       DBUG_RETURN(error_num);
1576     }
1577     DBUG_RETURN(0);
1578   }
1579   if (num_fields() != 13)
1580   {
1581     DBUG_PRINT("info",("spider num_fields != 13"));
1582     my_printf_error(ER_SPIDER_UNKNOWN_NUM, ER_SPIDER_UNKNOWN_STR, MYF(0));
1583     DBUG_RETURN(ER_SPIDER_UNKNOWN_NUM);
1584   }
1585   bool first = TRUE;
1586   bool without_size = FALSE;
1587   bool using_hash = FALSE;
1588   do {
1589     if (!strcmp(mysql_row[3], "1"))
1590     {
1591       without_size = FALSE;
1592       if (first)
1593       {
1594         first = FALSE;
1595       } else {
1596         if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN + SPIDER_SQL_COMMA_LEN +
1597           (using_hash ? SPIDER_SQL_USING_HASH_LEN : 0)))
1598         {
1599           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1600         }
1601         str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
1602         if (using_hash)
1603           str->q_append(SPIDER_SQL_USING_HASH_STR, SPIDER_SQL_USING_HASH_LEN);
1604         str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
1605       }
1606       /* new index */
1607       if (!strcmp(mysql_row[2], SPIDER_DB_PK_NAME_STR))
1608       {
1609         /* primary key */
1610         if (str->reserve(SPIDER_DB_PK_NAME_LEN + SPIDER_SQL_SPACE_LEN))
1611         {
1612           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1613         }
1614         str->q_append(SPIDER_DB_PK_NAME_STR, SPIDER_DB_PK_NAME_LEN);
1615         str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
1616       } else if (!strcmp(mysql_row[1], "0"))
1617       {
1618         /* unique key */
1619         if (str->reserve(SPIDER_DB_UNIQUE_NAME_LEN + SPIDER_SQL_SPACE_LEN))
1620         {
1621           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1622         }
1623         str->q_append(SPIDER_DB_UNIQUE_NAME_STR, SPIDER_DB_UNIQUE_NAME_LEN);
1624         str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
1625       } else if (mysql_row[10] && !strcmp(mysql_row[10], "FULLTEXT"))
1626       {
1627         /* fulltext key */
1628         if (str->reserve(SPIDER_SQL_FULLTEXT_LEN + SPIDER_SQL_SPACE_LEN))
1629         {
1630           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1631         }
1632         str->q_append(SPIDER_SQL_FULLTEXT_STR, SPIDER_SQL_FULLTEXT_LEN);
1633         str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
1634       } else if (mysql_row[10] && !strcmp(mysql_row[10], "SPATIAL"))
1635       {
1636         /* spatial key */
1637         without_size = TRUE;
1638         if (str->reserve(SPIDER_SQL_SPATIAL_LEN + SPIDER_SQL_SPACE_LEN))
1639         {
1640           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1641         }
1642         str->q_append(SPIDER_SQL_SPATIAL_STR, SPIDER_SQL_SPATIAL_LEN);
1643         str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
1644       }
1645       if (str->reserve(SPIDER_DB_KEY_NAME_LEN + SPIDER_SQL_SPACE_LEN))
1646       {
1647         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1648       }
1649       str->q_append(SPIDER_DB_KEY_NAME_STR, SPIDER_DB_KEY_NAME_LEN);
1650       str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
1651       if (strcmp(mysql_row[2], SPIDER_DB_PK_NAME_STR))
1652       {
1653         if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN))
1654         {
1655           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1656         }
1657         str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
1658         if (str->append(mysql_row[2], strlen(mysql_row[2]), access_charset))
1659         {
1660           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1661         }
1662         if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN))
1663         {
1664           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1665         }
1666         str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
1667       }
1668       if (str->reserve(SPIDER_SQL_OPEN_PAREN_LEN))
1669       {
1670         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1671       }
1672       str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
1673       if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN))
1674       {
1675         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1676       }
1677       str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
1678       if (str->append(mysql_row[4], strlen(mysql_row[4]), access_charset))
1679       {
1680         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1681       }
1682       if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN))
1683       {
1684         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1685       }
1686       str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
1687       if (mysql_row[7] && !without_size)
1688       {
1689         if (str->reserve(SPIDER_SQL_OPEN_PAREN_LEN))
1690         {
1691           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1692         }
1693         str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
1694         if (str->append(mysql_row[7], strlen(mysql_row[7]), access_charset))
1695         {
1696           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1697         }
1698         if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN))
1699         {
1700           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1701         }
1702         str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
1703       }
1704     } else {
1705       if (str->reserve(SPIDER_SQL_COMMA_LEN + SPIDER_SQL_NAME_QUOTE_LEN))
1706       {
1707         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1708       }
1709       str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
1710       str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
1711       if (str->append(mysql_row[4], strlen(mysql_row[4]), access_charset))
1712       {
1713         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1714       }
1715       if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN))
1716       {
1717         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1718       }
1719       str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
1720       if (mysql_row[7] && !without_size)
1721       {
1722         if (str->reserve(SPIDER_SQL_OPEN_PAREN_LEN))
1723         {
1724           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1725         }
1726         str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
1727         if (str->append(mysql_row[7], strlen(mysql_row[7]), access_charset))
1728         {
1729           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1730         }
1731         if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN))
1732         {
1733           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1734         }
1735         str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
1736       }
1737     }
1738     if (mysql_row[10] && !strcmp(mysql_row[10], "HASH"))
1739       using_hash = TRUE;
1740     else
1741       using_hash = FALSE;
1742   } while ((mysql_row = mysql_fetch_row(db_result)));
1743   if ((error_num = mysql_errno(((spider_db_mbase *) db_conn)->db_conn)))
1744   {
1745     my_message(error_num,
1746       mysql_error(((spider_db_mbase *) db_conn)->db_conn), MYF(0));
1747     DBUG_RETURN(error_num);
1748   }
1749   if (!first)
1750   {
1751     if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN + SPIDER_SQL_COMMA_LEN +
1752       (using_hash ? SPIDER_SQL_USING_HASH_LEN : 0)))
1753     {
1754       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1755     }
1756     str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
1757     if (using_hash)
1758       str->q_append(SPIDER_SQL_USING_HASH_STR, SPIDER_SQL_USING_HASH_LEN);
1759     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
1760   }
1761   DBUG_RETURN(0);
1762 }
1763 
fetch_table_for_discover_table_structure(spider_string * str,SPIDER_SHARE * spider_share,CHARSET_INFO * access_charset)1764 int spider_db_mbase_result::fetch_table_for_discover_table_structure(
1765   spider_string *str,
1766   SPIDER_SHARE *spider_share,
1767   CHARSET_INFO *access_charset
1768 ) {
1769   int error_num;
1770   MYSQL_ROW mysql_row;
1771   DBUG_ENTER("spider_db_mbase_result::fetch_table_for_discover_table_structure");
1772   DBUG_PRINT("info",("spider this=%p", this));
1773   if (!(mysql_row = mysql_fetch_row(db_result)))
1774   {
1775     DBUG_PRINT("info",("spider fetch row is null"));
1776     if ((error_num = mysql_errno(((spider_db_mbase *) db_conn)->db_conn)))
1777     {
1778       my_message(error_num,
1779         mysql_error(((spider_db_mbase *) db_conn)->db_conn), MYF(0));
1780       DBUG_RETURN(error_num);
1781     }
1782     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1783   }
1784   if (num_fields() < 18)
1785   {
1786     DBUG_PRINT("info",("spider num_fields != 18"));
1787     my_printf_error(ER_SPIDER_UNKNOWN_NUM, ER_SPIDER_UNKNOWN_STR, MYF(0));
1788     DBUG_RETURN(ER_SPIDER_UNKNOWN_NUM);
1789   }
1790   if (!mysql_row[14])
1791   {
1792     DBUG_PRINT("info",("spider mysql_row[14] is null"));
1793     my_printf_error(ER_SPIDER_UNKNOWN_NUM, ER_SPIDER_UNKNOWN_STR, MYF(0));
1794     DBUG_RETURN(ER_SPIDER_UNKNOWN_NUM);
1795   }
1796   DBUG_PRINT("info",("spider mysql_row[14]=%s", mysql_row[14]));
1797   if (!spider_share->table_share->table_charset)
1798   {
1799     spider_share->table_share->table_charset = get_charset_by_name(mysql_row[14], MYF(MY_WME));
1800   }
1801   DBUG_RETURN(0);
1802 }
1803 #endif
1804 
spider_db_mbase(SPIDER_CONN * conn,spider_db_mbase_util * spider_db_mbase_utility)1805 spider_db_mbase::spider_db_mbase(
1806   SPIDER_CONN *conn,
1807   spider_db_mbase_util *spider_db_mbase_utility
1808 ) : spider_db_conn(conn), spider_db_mbase_utility(spider_db_mbase_utility),
1809   lock_table_hash_inited(FALSE), handler_open_array_inited(FALSE)
1810 {
1811   DBUG_ENTER("spider_db_mbase::spider_db_mbase");
1812   DBUG_PRINT("info",("spider this=%p", this));
1813   db_conn = NULL;
1814   DBUG_VOID_RETURN;
1815 }
1816 
spider_db_mysql(SPIDER_CONN * conn)1817 spider_db_mysql::spider_db_mysql(
1818   SPIDER_CONN *conn
1819 ) : spider_db_mbase(conn, &spider_db_mysql_utility)
1820 {
1821   DBUG_ENTER("spider_db_mysql::spider_db_mysql");
1822   DBUG_PRINT("info",("spider this=%p", this));
1823   DBUG_VOID_RETURN;
1824 }
1825 
spider_db_mariadb(SPIDER_CONN * conn)1826 spider_db_mariadb::spider_db_mariadb(
1827   SPIDER_CONN *conn
1828 ) : spider_db_mbase(conn, &spider_db_mariadb_utility)
1829 {
1830   DBUG_ENTER("spider_db_mariadb::spider_db_mariadb");
1831   DBUG_PRINT("info",("spider this=%p", this));
1832   DBUG_VOID_RETURN;
1833 }
1834 
~spider_db_mbase()1835 spider_db_mbase::~spider_db_mbase()
1836 {
1837   DBUG_ENTER("spider_db_mbase::~spider_db_mbase");
1838   DBUG_PRINT("info",("spider this=%p", this));
1839   if (handler_open_array_inited)
1840   {
1841     reset_opened_handler();
1842     spider_free_mem_calc(spider_current_trx,
1843       handler_open_array_id,
1844       handler_open_array.max_element *
1845       handler_open_array.size_of_element);
1846     delete_dynamic(&handler_open_array);
1847   }
1848   if (lock_table_hash_inited)
1849   {
1850     spider_free_mem_calc(spider_current_trx,
1851       lock_table_hash_id,
1852       lock_table_hash.array.max_element *
1853       lock_table_hash.array.size_of_element);
1854     my_hash_free(&lock_table_hash);
1855   }
1856   DBUG_VOID_RETURN;
1857 }
1858 
~spider_db_mysql()1859 spider_db_mysql::~spider_db_mysql()
1860 {
1861   DBUG_ENTER("spider_db_mysql::~spider_db_mysql");
1862   DBUG_PRINT("info",("spider this=%p", this));
1863   DBUG_VOID_RETURN;
1864 }
1865 
~spider_db_mariadb()1866 spider_db_mariadb::~spider_db_mariadb()
1867 {
1868   DBUG_ENTER("spider_db_mariadb::~spider_db_mariadb");
1869   DBUG_PRINT("info",("spider this=%p", this));
1870   DBUG_VOID_RETURN;
1871 }
1872 
init()1873 int spider_db_mbase::init()
1874 {
1875   DBUG_ENTER("spider_db_mbase::init");
1876   DBUG_PRINT("info",("spider this=%p", this));
1877   if (
1878     my_hash_init(PSI_INSTRUMENT_ME, &lock_table_hash, spd_charset_utf8mb3_bin, 32, 0, 0,
1879       (my_hash_get_key) spider_link_get_key, 0, 0)
1880   ) {
1881     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1882   }
1883   spider_alloc_calc_mem_init(lock_table_hash, 140);
1884   spider_alloc_calc_mem(spider_current_trx,
1885     lock_table_hash,
1886     lock_table_hash.array.max_element *
1887     lock_table_hash.array.size_of_element);
1888   lock_table_hash_inited = TRUE;
1889 
1890   if (
1891     SPD_INIT_DYNAMIC_ARRAY2(&handler_open_array,
1892       sizeof(SPIDER_LINK_FOR_HASH *), NULL, 16, 16, MYF(MY_WME))
1893   ) {
1894     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1895   }
1896   spider_alloc_calc_mem_init(handler_open_array, 162);
1897   spider_alloc_calc_mem(spider_current_trx,
1898     handler_open_array,
1899     handler_open_array.max_element *
1900     handler_open_array.size_of_element);
1901   handler_open_array_inited = TRUE;
1902   DBUG_RETURN(0);
1903 }
1904 
is_connected()1905 bool spider_db_mbase::is_connected()
1906 {
1907   DBUG_ENTER("spider_db_mbase::is_connected");
1908   DBUG_PRINT("info",("spider this=%p", this));
1909   DBUG_RETURN(db_conn);
1910 }
1911 
bg_connect()1912 void spider_db_mbase::bg_connect()
1913 {
1914   DBUG_ENTER("spider_db_mbase::bg_connect");
1915   DBUG_PRINT("info",("spider this=%p", this));
1916   DBUG_VOID_RETURN;
1917 }
1918 
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)1919 int spider_db_mbase::connect(
1920   char *tgt_host,
1921   char *tgt_username,
1922   char *tgt_password,
1923   long tgt_port,
1924   char *tgt_socket,
1925   char *server_name,
1926   int connect_retry_count,
1927   longlong connect_retry_interval
1928 ) {
1929   int error_num;
1930   my_bool connect_mutex = spider_param_connect_mutex();
1931   DBUG_ENTER("spider_db_mbase::connect");
1932   DBUG_PRINT("info",("spider this=%p", this));
1933   while (TRUE)
1934   {
1935     THD *thd = current_thd;
1936     DBUG_PRINT("info",("spider thd->killed=%s",
1937       thd ? (thd->killed ? "TRUE" : "FALSE") : "NULL"));
1938     DBUG_PRINT("info",("spider abort_loop=%s",
1939       *spd_abort_loop ? "TRUE" : "FALSE"));
1940     if (
1941       (thd && thd->killed) ||
1942       *spd_abort_loop
1943     ) {
1944       DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
1945     }
1946 
1947     if (!db_conn)
1948     {
1949       if (!(db_conn = mysql_init(NULL)))
1950         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1951     }
1952 
1953     mysql_options(db_conn, MYSQL_OPT_READ_TIMEOUT,
1954       &conn->net_read_timeout);
1955     mysql_options(db_conn, MYSQL_OPT_WRITE_TIMEOUT,
1956       &conn->net_write_timeout);
1957     mysql_options(db_conn, MYSQL_OPT_CONNECT_TIMEOUT,
1958       &conn->connect_timeout);
1959     mysql_options(db_conn, MYSQL_OPT_USE_REMOTE_CONNECTION,
1960       NULL);
1961 
1962     if (
1963       conn->tgt_ssl_ca_length |
1964       conn->tgt_ssl_capath_length |
1965       conn->tgt_ssl_cert_length |
1966       conn->tgt_ssl_key_length
1967     ) {
1968       mysql_ssl_set(db_conn, conn->tgt_ssl_key, conn->tgt_ssl_cert,
1969         conn->tgt_ssl_ca, conn->tgt_ssl_capath, conn->tgt_ssl_cipher);
1970       if (conn->tgt_ssl_vsc)
1971       {
1972         my_bool verify_flg = TRUE;
1973         mysql_options(db_conn, MYSQL_OPT_SSL_VERIFY_SERVER_CERT,
1974           &verify_flg);
1975       }
1976     }
1977 
1978     if (conn->tgt_default_file)
1979     {
1980       DBUG_PRINT("info",("spider tgt_default_file=%s",
1981         conn->tgt_default_file));
1982       mysql_options(db_conn, MYSQL_READ_DEFAULT_FILE,
1983         conn->tgt_default_file);
1984     }
1985     if (conn->tgt_default_group)
1986     {
1987       DBUG_PRINT("info",("spider tgt_default_group=%s",
1988         conn->tgt_default_group));
1989       mysql_options(db_conn, MYSQL_READ_DEFAULT_GROUP,
1990         conn->tgt_default_group);
1991     }
1992 
1993     if (!spider_param_same_server_link(thd))
1994     {
1995       if (!strcmp(tgt_host, my_localhost))
1996       {
1997         if (!strcmp(tgt_socket, *spd_mysqld_unix_port))
1998         {
1999           my_printf_error(ER_SPIDER_SAME_SERVER_LINK_NUM,
2000             ER_SPIDER_SAME_SERVER_LINK_STR1, MYF(0),
2001             tgt_host, tgt_socket);
2002           DBUG_RETURN(ER_SPIDER_SAME_SERVER_LINK_NUM);
2003         }
2004       } else if (!strcmp(tgt_host, "127.0.0.1") ||
2005         !strcmp(tgt_host, glob_hostname))
2006       {
2007         if (tgt_port == (long) *spd_mysqld_port)
2008         {
2009           my_printf_error(ER_SPIDER_SAME_SERVER_LINK_NUM,
2010             ER_SPIDER_SAME_SERVER_LINK_STR2, MYF(0),
2011             tgt_host, tgt_port);
2012           DBUG_RETURN(ER_SPIDER_SAME_SERVER_LINK_NUM);
2013         }
2014       }
2015     }
2016 
2017     if (connect_mutex)
2018       pthread_mutex_lock(&spider_open_conn_mutex);
2019     /* tgt_db not use */
2020     if (
2021       !spider_param_dry_access() &&
2022       !mysql_real_connect(
2023         db_conn,
2024         tgt_host,
2025         tgt_username,
2026         tgt_password,
2027         NULL,
2028         tgt_port,
2029         tgt_socket,
2030         CLIENT_MULTI_STATEMENTS
2031       )
2032     ) {
2033       if (connect_mutex)
2034         pthread_mutex_unlock(&spider_open_conn_mutex);
2035       error_num = mysql_errno(db_conn);
2036       disconnect();
2037       DBUG_PRINT("info",("spider thd->killed=%s",
2038         thd ? (thd->killed ? "TRUE" : "FALSE") : "NULL"));
2039       DBUG_PRINT("info",("spider abort_loop=%s",
2040         *spd_abort_loop ? "TRUE" : "FALSE"));
2041       if (
2042         (thd && thd->killed) ||
2043         *spd_abort_loop
2044       ) {
2045         DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
2046       }
2047       if (
2048         (
2049           error_num != CR_CONN_HOST_ERROR &&
2050           error_num != CR_CONNECTION_ERROR
2051         ) ||
2052         !connect_retry_count
2053       ) {
2054         if (error_num == ER_CON_COUNT_ERROR)
2055         {
2056           *conn->need_mon = 0;
2057           my_error(ER_CON_COUNT_ERROR, MYF(0));
2058           DBUG_RETURN(ER_CON_COUNT_ERROR);
2059         }
2060         *conn->need_mon = ER_CONNECT_TO_FOREIGN_DATA_SOURCE;
2061         my_error(ER_CONNECT_TO_FOREIGN_DATA_SOURCE, MYF(0),
2062           server_name ? server_name : tgt_host);
2063         DBUG_RETURN(ER_CONNECT_TO_FOREIGN_DATA_SOURCE);
2064       }
2065       connect_retry_count--;
2066       my_sleep((ulong) connect_retry_interval);
2067     } else {
2068 #ifdef SPIDER_NET_HAS_THD
2069       db_conn->net.thd = NULL;
2070 #endif
2071       if (connect_mutex)
2072         pthread_mutex_unlock(&spider_open_conn_mutex);
2073       break;
2074     }
2075   }
2076   DBUG_RETURN(0);
2077 }
2078 
ping()2079 int spider_db_mbase::ping(
2080 ) {
2081   DBUG_ENTER("spider_db_mbase::ping");
2082   DBUG_PRINT("info",("spider this=%p", this));
2083   if (spider_param_dry_access())
2084     DBUG_RETURN(0);
2085   DBUG_RETURN(simple_command(db_conn, COM_PING, 0, 0, 0));
2086 }
2087 
bg_disconnect()2088 void spider_db_mbase::bg_disconnect()
2089 {
2090   DBUG_ENTER("spider_db_mbase::bg_disconnect");
2091   DBUG_PRINT("info",("spider this=%p", this));
2092   DBUG_VOID_RETURN;
2093 }
2094 
disconnect()2095 void spider_db_mbase::disconnect()
2096 {
2097   DBUG_ENTER("spider_db_mbase::disconnect");
2098   DBUG_PRINT("info",("spider this=%p", this));
2099   DBUG_PRINT("info",("spider db_conn=%p", db_conn));
2100   if (db_conn)
2101   {
2102     mysql_close(db_conn);
2103     db_conn = NULL;
2104   }
2105   DBUG_VOID_RETURN;
2106 }
2107 
set_net_timeout()2108 int spider_db_mbase::set_net_timeout()
2109 {
2110   DBUG_ENTER("spider_db_mbase::set_net_timeout");
2111   DBUG_PRINT("info",("spider this=%p", this));
2112   DBUG_PRINT("info",("spider conn=%p", conn));
2113   my_net_set_read_timeout(&db_conn->net, conn->net_read_timeout);
2114   my_net_set_write_timeout(&db_conn->net, conn->net_write_timeout);
2115   DBUG_RETURN(0);
2116 }
2117 
exec_query(const char * query,uint length,int quick_mode)2118 int spider_db_mbase::exec_query(
2119   const char *query,
2120   uint length,
2121   int quick_mode
2122 ) {
2123   int error_num = 0;
2124   uint log_result_errors = spider_param_log_result_errors();
2125   DBUG_ENTER("spider_db_mbase::exec_query");
2126   DBUG_PRINT("info",("spider this=%p", this));
2127   if (spider_param_general_log())
2128   {
2129     const char *tgt_str = conn->tgt_host;
2130     uint32 tgt_len = conn->tgt_host_length;
2131     spider_string tmp_query_str;
2132     tmp_query_str.init_calc_mem(230);
2133     if (tmp_query_str.reserve(
2134       length + conn->tgt_wrapper_length +
2135       tgt_len + (SPIDER_SQL_SPACE_LEN * 2)))
2136       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
2137     tmp_query_str.q_append(conn->tgt_wrapper, conn->tgt_wrapper_length);
2138     tmp_query_str.q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
2139     tmp_query_str.q_append(tgt_str, tgt_len);
2140     tmp_query_str.q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
2141     tmp_query_str.q_append(query, length);
2142     general_log_write(current_thd, COM_QUERY, tmp_query_str.ptr(),
2143       tmp_query_str.length());
2144   }
2145   if (!spider_param_dry_access())
2146   {
2147     error_num = mysql_real_query(db_conn, query, length);
2148   }
2149   if (
2150     (error_num && log_result_errors >= 1) ||
2151     (log_result_errors >= 2 && db_conn->warning_count > 0) ||
2152     (log_result_errors >= 4)
2153   ) {
2154     THD *thd = current_thd;
2155     uint log_result_error_with_sql = spider_param_log_result_error_with_sql();
2156     if (log_result_error_with_sql)
2157     {
2158       time_t cur_time = (time_t) time((time_t*) 0);
2159       struct tm lt;
2160       struct tm *l_time = localtime_r(&cur_time, &lt);
2161       spider_string tmp_query_str;
2162       tmp_query_str.init_calc_mem(243);
2163       uint query_length = thd->query_length();
2164       if ((log_result_error_with_sql & 2) && query_length)
2165       {
2166         Security_context *security_ctx = thd->security_ctx;
2167         tmp_query_str.length(0);
2168         if (tmp_query_str.reserve(query_length + 1))
2169           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
2170         tmp_query_str.q_append(thd->query(), query_length);
2171         fprintf(stderr, "%04d%02d%02d %02d:%02d:%02d [RECV SPIDER SQL] "
2172           "from [%s][%s] to %ld:  "
2173           "sql: %s\n",
2174           l_time->tm_year + 1900, l_time->tm_mon + 1, l_time->tm_mday,
2175           l_time->tm_hour, l_time->tm_min, l_time->tm_sec,
2176           security_ctx->user ? security_ctx->user : "system user",
2177           security_ctx->host_or_ip,
2178           (ulong) thd->thread_id,
2179           tmp_query_str.c_ptr_safe());
2180       }
2181       if (log_result_error_with_sql & 1)
2182       {
2183         tmp_query_str.length(0);
2184         if (tmp_query_str.reserve(length + 1))
2185           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
2186         tmp_query_str.q_append(query, length);
2187         fprintf(stderr, "%04d%02d%02d %02d:%02d:%02d [SEND SPIDER SQL] "
2188           "from %ld to [%s] %ld:  "
2189           "sql: %s\n",
2190           l_time->tm_year + 1900, l_time->tm_mon + 1, l_time->tm_mday,
2191           l_time->tm_hour, l_time->tm_min, l_time->tm_sec,
2192           (ulong) thd->thread_id, conn->tgt_host, (ulong) db_conn->thread_id,
2193           tmp_query_str.c_ptr_safe());
2194       }
2195     }
2196     if (log_result_errors >= 2 && db_conn->warning_count > 0)
2197     {
2198       time_t cur_time = (time_t) time((time_t*) 0);
2199       struct tm lt;
2200       struct tm *l_time = localtime_r(&cur_time, &lt);
2201       fprintf(stderr, "%04d%02d%02d %02d:%02d:%02d [WARN SPIDER RESULT] "
2202         "from [%s] %ld to %ld:  "
2203         "affected_rows: %llu  id: %llu  status: %u  warning_count: %u\n",
2204         l_time->tm_year + 1900, l_time->tm_mon + 1, l_time->tm_mday,
2205         l_time->tm_hour, l_time->tm_min, l_time->tm_sec,
2206         conn->tgt_host, (ulong) db_conn->thread_id, (ulong) thd->thread_id,
2207         db_conn->affected_rows, db_conn->insert_id,
2208         db_conn->server_status, db_conn->warning_count);
2209       if (spider_param_log_result_errors() >= 3)
2210         print_warnings(l_time);
2211     } else if (log_result_errors >= 4)
2212     {
2213       time_t cur_time = (time_t) time((time_t*) 0);
2214       struct tm lt;
2215       struct tm *l_time = localtime_r(&cur_time, &lt);
2216       fprintf(stderr, "%04d%02d%02d %02d:%02d:%02d [INFO SPIDER RESULT] "
2217         "from [%s] %ld to %ld:  "
2218         "affected_rows: %llu  id: %llu  status: %u  warning_count: %u\n",
2219         l_time->tm_year + 1900, l_time->tm_mon + 1, l_time->tm_mday,
2220         l_time->tm_hour, l_time->tm_min, l_time->tm_sec,
2221         conn->tgt_host, (ulong) db_conn->thread_id, (ulong) thd->thread_id,
2222         db_conn->affected_rows, db_conn->insert_id,
2223         db_conn->server_status, db_conn->warning_count);
2224     }
2225   }
2226   DBUG_RETURN(error_num);
2227 }
2228 
get_errno()2229 int spider_db_mbase::get_errno()
2230 {
2231   DBUG_ENTER("spider_db_mbase::get_errno");
2232   DBUG_PRINT("info",("spider this=%p", this));
2233   stored_error = mysql_errno(db_conn);
2234   DBUG_PRINT("info",("spider stored_error=%d", stored_error));
2235   DBUG_RETURN(stored_error);
2236 }
2237 
get_error()2238 const char *spider_db_mbase::get_error()
2239 {
2240   const char *error_ptr;
2241   DBUG_ENTER("spider_db_mbase::get_error");
2242   DBUG_PRINT("info",("spider this=%p", this));
2243   error_ptr = mysql_error(db_conn);
2244   DBUG_PRINT("info",("spider error=%s", error_ptr));
2245   DBUG_RETURN(error_ptr);
2246 }
2247 
is_server_gone_error(int error_num)2248 bool spider_db_mbase::is_server_gone_error(
2249   int error_num
2250 ) {
2251   bool server_gone;
2252   DBUG_ENTER("spider_db_mbase::is_server_gone_error");
2253   DBUG_PRINT("info",("spider this=%p", this));
2254   server_gone =
2255     (error_num == CR_SERVER_GONE_ERROR || error_num == CR_SERVER_LOST);
2256   DBUG_PRINT("info",("spider server_gone=%s", server_gone ? "TRUE" : "FALSE"));
2257   DBUG_RETURN(server_gone);
2258 }
2259 
is_dup_entry_error(int error_num)2260 bool spider_db_mbase::is_dup_entry_error(
2261   int error_num
2262 ) {
2263   bool dup_entry;
2264   DBUG_ENTER("spider_db_mbase::is_dup_entry_error");
2265   DBUG_PRINT("info",("spider this=%p", this));
2266   dup_entry =
2267     (
2268       error_num == ER_DUP_ENTRY ||
2269       error_num == ER_DUP_KEY ||
2270       error_num == HA_ERR_FOUND_DUPP_KEY
2271     );
2272   DBUG_PRINT("info",("spider dup_entry=%s", dup_entry ? "TRUE" : "FALSE"));
2273   DBUG_RETURN(dup_entry);
2274 }
2275 
is_xa_nota_error(int error_num)2276 bool spider_db_mbase::is_xa_nota_error(
2277   int error_num
2278 ) {
2279   bool xa_nota;
2280   DBUG_ENTER("spider_db_mbase::is_xa_nota_error");
2281   DBUG_PRINT("info",("spider this=%p", this));
2282   xa_nota =
2283     (
2284       error_num == ER_XAER_NOTA ||
2285       error_num == ER_XA_RBTIMEOUT ||
2286       error_num == ER_XA_RBDEADLOCK
2287     );
2288   DBUG_PRINT("info",("spider xa_nota=%s", xa_nota ? "TRUE" : "FALSE"));
2289   DBUG_RETURN(xa_nota);
2290 }
2291 
print_warnings(struct tm * l_time)2292 int spider_db_mbase::print_warnings(
2293   struct tm *l_time
2294 ) {
2295   int error_num = 0;
2296   DBUG_ENTER("spider_db_mbase::print_warnings");
2297   DBUG_PRINT("info",("spider this=%p", this));
2298   if (db_conn->status == MYSQL_STATUS_READY)
2299   {
2300     if (
2301 #if MYSQL_VERSION_ID < 50500
2302       !(db_conn->last_used_con->server_status & SERVER_MORE_RESULTS_EXISTS) &&
2303       db_conn->last_used_con->warning_count
2304 #else
2305       !(db_conn->server_status & SERVER_MORE_RESULTS_EXISTS) &&
2306       db_conn->warning_count
2307 #endif
2308     ) {
2309       if (
2310         spider_param_dry_access() ||
2311         !mysql_real_query(db_conn, SPIDER_SQL_SHOW_WARNINGS_STR,
2312           SPIDER_SQL_SHOW_WARNINGS_LEN)
2313       ) {
2314         MYSQL_RES *res = NULL;
2315         MYSQL_ROW row = NULL;
2316         uint num_fields;
2317         if (
2318           spider_param_dry_access() ||
2319           !(res = mysql_store_result(db_conn)) ||
2320           !(row = mysql_fetch_row(res))
2321         ) {
2322           if (mysql_errno(db_conn))
2323           {
2324             if (res)
2325               mysql_free_result(res);
2326             DBUG_RETURN(0);
2327           }
2328           /* no record is ok */
2329         }
2330         num_fields = mysql_num_fields(res);
2331         if (num_fields != 3)
2332         {
2333           mysql_free_result(res);
2334           DBUG_RETURN(0);
2335         }
2336         if (l_time)
2337         {
2338           while (row)
2339           {
2340             fprintf(stderr, "%04d%02d%02d %02d:%02d:%02d [WARN SPIDER RESULT] "
2341               "from [%s] %ld to %ld: %s %s %s\n",
2342               l_time->tm_year + 1900, l_time->tm_mon + 1, l_time->tm_mday,
2343               l_time->tm_hour, l_time->tm_min, l_time->tm_sec,
2344               conn->tgt_host, (ulong) db_conn->thread_id,
2345               (ulong) current_thd->thread_id, row[0], row[1], row[2]);
2346             row = mysql_fetch_row(res);
2347           }
2348         } else {
2349           while (row)
2350           {
2351             DBUG_PRINT("info",("spider row[0]=%s", row[0]));
2352             DBUG_PRINT("info",("spider row[1]=%s", row[1]));
2353             DBUG_PRINT("info",("spider row[2]=%s", row[2]));
2354             longlong res_num =
2355               (longlong) my_strtoll10(row[1], (char**) NULL, &error_num);
2356             DBUG_PRINT("info",("spider res_num=%lld", res_num));
2357             my_printf_error((int) res_num, row[2], MYF(0));
2358             error_num = (int) res_num;
2359             row = mysql_fetch_row(res);
2360           }
2361         }
2362         if (res)
2363           mysql_free_result(res);
2364       }
2365     }
2366   }
2367   DBUG_RETURN(error_num);
2368 }
2369 
store_result(spider_db_result_buffer ** spider_res_buf,st_spider_db_request_key * request_key,int * error_num)2370 spider_db_result *spider_db_mbase::store_result(
2371   spider_db_result_buffer **spider_res_buf,
2372   st_spider_db_request_key *request_key,
2373   int *error_num
2374 ) {
2375   spider_db_mbase_result *result;
2376   DBUG_ENTER("spider_db_mbase::store_result");
2377   DBUG_PRINT("info",("spider this=%p", this));
2378   DBUG_ASSERT(!spider_res_buf);
2379   if ((result = new spider_db_mbase_result(this)))
2380   {
2381     *error_num = 0;
2382     if (
2383       spider_param_dry_access() ||
2384       !(result->db_result = mysql_store_result(db_conn))
2385     ) {
2386       delete result;
2387       result = NULL;
2388     } else {
2389       result->first_row = result->db_result->data_cursor;
2390       DBUG_PRINT("info",("spider result->first_row=%p", result->first_row));
2391     }
2392   } else {
2393     *error_num = HA_ERR_OUT_OF_MEM;
2394   }
2395   DBUG_RETURN(result);
2396 }
2397 
use_result(ha_spider * spider,st_spider_db_request_key * request_key,int * error_num)2398 spider_db_result *spider_db_mbase::use_result(
2399   ha_spider *spider,
2400   st_spider_db_request_key *request_key,
2401   int *error_num
2402 ) {
2403   spider_db_mbase_result *result;
2404   DBUG_ENTER("spider_db_mbase::use_result");
2405   DBUG_PRINT("info",("spider this=%p", this));
2406   if ((result = new spider_db_mbase_result(this)))
2407   {
2408     *error_num = 0;
2409     if (
2410       spider_param_dry_access() ||
2411       !(result->db_result = db_conn->methods->use_result(db_conn))
2412     ) {
2413       delete result;
2414       result = NULL;
2415     } else {
2416       result->first_row = NULL;
2417     }
2418   } else {
2419     *error_num = HA_ERR_OUT_OF_MEM;
2420   }
2421   DBUG_RETURN(result);
2422 }
2423 
next_result()2424 int spider_db_mbase::next_result()
2425 {
2426   int status;
2427   DBUG_ENTER("spider_db_mbase::next_result");
2428   DBUG_PRINT("info",("spider this=%p", this));
2429   if (db_conn->status != MYSQL_STATUS_READY)
2430   {
2431     my_message(ER_SPIDER_UNKNOWN_NUM, ER_SPIDER_UNKNOWN_STR, MYF(0));
2432     DBUG_RETURN(ER_SPIDER_UNKNOWN_NUM);
2433   }
2434 
2435   db_conn->net.last_errno = 0;
2436   db_conn->net.last_error[0] = '\0';
2437   strmov(db_conn->net.sqlstate, "00000");
2438   db_conn->affected_rows = ~(my_ulonglong) 0;
2439 
2440 #if MYSQL_VERSION_ID < 50500
2441   if (db_conn->last_used_con->server_status & SERVER_MORE_RESULTS_EXISTS)
2442 #else
2443   if (db_conn->server_status & SERVER_MORE_RESULTS_EXISTS)
2444 #endif
2445   {
2446     if ((status = db_conn->methods->read_query_result(db_conn)) > 0)
2447       DBUG_RETURN(spider_db_errorno(conn));
2448     DBUG_RETURN(status);
2449   }
2450   DBUG_RETURN(-1);
2451 }
2452 
affected_rows()2453 uint spider_db_mbase::affected_rows()
2454 {
2455   MYSQL *last_used_con;
2456   DBUG_ENTER("spider_db_mbase::affected_rows");
2457   DBUG_PRINT("info",("spider this=%p", this));
2458 #if MYSQL_VERSION_ID < 50500
2459   last_used_con = db_conn->last_used_con;
2460 #else
2461   last_used_con = db_conn;
2462 #endif
2463   DBUG_RETURN((uint) last_used_con->affected_rows);
2464 }
2465 
matched_rows()2466 uint spider_db_mbase::matched_rows()
2467 {
2468   MYSQL *last_used_con;
2469   DBUG_ENTER("spider_db_mysql::matched_rows");
2470   DBUG_PRINT("info", ("spider this=%p", this));
2471 #if MYSQL_VERSION_ID < 50500
2472   last_used_con = db_conn->last_used_con;
2473 #else
2474   last_used_con = db_conn;
2475 #endif
2476   /* Rows matched: 65 Changed: 65 Warnings: 0 */
2477   const char *info = last_used_con->info;
2478   if (!info)
2479     DBUG_RETURN(0);
2480   DBUG_PRINT("info", ("spider info=%s", info));
2481   const char *begin = strstr(info, "Rows matched: ");
2482   if (!begin)
2483     DBUG_RETURN(0);
2484   DBUG_RETURN(atoi(begin + strlen("Rows matched: ")));
2485 }
2486 
inserted_info(spider_db_handler * handler,ha_copy_info * copy_info)2487 bool spider_db_mbase::inserted_info(
2488   spider_db_handler *handler,
2489   ha_copy_info *copy_info
2490 ) {
2491   MYSQL *last_used_con;
2492   uchar direct_insert_kind =
2493     ((spider_mbase_handler *) handler)->direct_insert_kind;
2494   DBUG_ENTER("spider_db_mysql::inserted_info");
2495   DBUG_PRINT("info", ("spider this=%p", this));
2496   if (direct_insert_kind == SPIDER_SQL_DIRECT_INSERT_KIND_INSERT)
2497   {
2498     DBUG_RETURN(TRUE);
2499   }
2500 #if MYSQL_VERSION_ID < 50500
2501   last_used_con = db_conn->last_used_con;
2502 #else
2503   last_used_con = db_conn;
2504 #endif
2505   /* Records: 10  Duplicates: 4  Warnings: 0 */
2506   const char *info = last_used_con->info;
2507   if (!info)
2508     DBUG_RETURN(FALSE);
2509   DBUG_PRINT("info", ("spider info=%s", info));
2510   const char *begin = strstr(info, "Records: ");
2511   if (!begin)
2512     DBUG_RETURN(FALSE);
2513   begin += strlen("Records: ");
2514   uint records = atoi(begin);
2515   begin = strstr(begin, "Duplicates: ");
2516   if (!begin)
2517     DBUG_RETURN(FALSE);
2518   uint duplicates = atoi(begin + strlen("Duplicates: "));
2519   copy_info->records+= records;
2520   switch (direct_insert_kind)
2521   {
2522     case SPIDER_SQL_DIRECT_INSERT_KIND_IGNORE:
2523       copy_info->copied+= duplicates;
2524       break;
2525     case SPIDER_SQL_DIRECT_INSERT_KIND_REPLACE:
2526       copy_info->copied+= records;
2527       copy_info->deleted+= duplicates;
2528       break;
2529     case SPIDER_SQL_DIRECT_INSERT_KIND_DUP_UPDATE:
2530       copy_info->touched+= (last_used_con->affected_rows - (duplicates * 2));
2531       copy_info->copied+= (last_used_con->affected_rows - duplicates);
2532       copy_info->updated+= duplicates;
2533       break;
2534     default:
2535       DBUG_ASSERT(0);
2536       DBUG_RETURN(FALSE);
2537   }
2538   DBUG_RETURN(TRUE);
2539 }
2540 
last_insert_id()2541 ulonglong spider_db_mbase::last_insert_id()
2542 {
2543   MYSQL *last_used_con;
2544   DBUG_ENTER("spider_db_mbase::last_insert_id");
2545   DBUG_PRINT("info",("spider this=%p", this));
2546 #if MYSQL_VERSION_ID < 50500
2547   last_used_con = db_conn->last_used_con;
2548 #else
2549   last_used_con = db_conn;
2550 #endif
2551   DBUG_RETURN((uint) last_used_con->insert_id);
2552 }
2553 
set_character_set(const char * csname)2554 int spider_db_mbase::set_character_set(
2555   const char *csname
2556 ) {
2557   DBUG_ENTER("spider_db_mbase::set_character_set");
2558   DBUG_PRINT("info",("spider this=%p", this));
2559   if (spider_param_dry_access())
2560     DBUG_RETURN(0);
2561   DBUG_RETURN(mysql_set_character_set(db_conn, csname));
2562 }
2563 
select_db(const char * dbname)2564 int spider_db_mbase::select_db(
2565   const char *dbname
2566 ) {
2567   DBUG_ENTER("spider_db_mbase::select_db");
2568   DBUG_PRINT("info",("spider this=%p", this));
2569   if (spider_param_dry_access())
2570     DBUG_RETURN(0);
2571   DBUG_RETURN(mysql_select_db(db_conn, dbname));
2572 }
2573 
consistent_snapshot(int * need_mon)2574 int spider_db_mbase::consistent_snapshot(
2575   int *need_mon
2576 ) {
2577   DBUG_ENTER("spider_db_mbase::consistent_snapshot");
2578   DBUG_PRINT("info",("spider this=%p", this));
2579   pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
2580   pthread_mutex_lock(&conn->mta_conn_mutex);
2581   SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
2582   conn->need_mon = need_mon;
2583   DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
2584   DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
2585   conn->mta_conn_mutex_lock_already = TRUE;
2586   conn->mta_conn_mutex_unlock_later = TRUE;
2587   if (spider_db_query(
2588     conn,
2589     SPIDER_SQL_START_CONSISTENT_SNAPSHOT_STR,
2590     SPIDER_SQL_START_CONSISTENT_SNAPSHOT_LEN,
2591     -1,
2592     need_mon)
2593   ) {
2594     DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
2595     DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2596     conn->mta_conn_mutex_lock_already = FALSE;
2597     conn->mta_conn_mutex_unlock_later = FALSE;
2598     DBUG_RETURN(spider_db_errorno(conn));
2599   }
2600   DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
2601   DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2602   conn->mta_conn_mutex_lock_already = FALSE;
2603   conn->mta_conn_mutex_unlock_later = FALSE;
2604   SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
2605   pthread_mutex_unlock(&conn->mta_conn_mutex);
2606   DBUG_RETURN(0);
2607 }
2608 
trx_start_in_bulk_sql()2609 bool spider_db_mbase::trx_start_in_bulk_sql()
2610 {
2611   DBUG_ENTER("spider_db_mbase::trx_start_in_bulk_sql");
2612   DBUG_PRINT("info",("spider this=%p", this));
2613   DBUG_RETURN(TRUE);
2614 }
2615 
start_transaction(int * need_mon)2616 int spider_db_mbase::start_transaction(
2617   int *need_mon
2618 ) {
2619   DBUG_ENTER("spider_db_mbase::start_transaction");
2620   DBUG_PRINT("info",("spider this=%p", this));
2621   pthread_mutex_assert_owner(&conn->mta_conn_mutex);
2622   DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
2623   DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2624   if (spider_db_query(
2625     conn,
2626     SPIDER_SQL_START_TRANSACTION_STR,
2627     SPIDER_SQL_START_TRANSACTION_LEN,
2628     -1,
2629     need_mon)
2630   ) {
2631     DBUG_RETURN(spider_db_errorno(conn));
2632   }
2633   DBUG_RETURN(0);
2634 }
2635 
commit(int * need_mon)2636 int spider_db_mbase::commit(
2637   int *need_mon
2638 ) {
2639   DBUG_ENTER("spider_db_mbase::commit");
2640   DBUG_PRINT("info",("spider this=%p", this));
2641   pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
2642   pthread_mutex_lock(&conn->mta_conn_mutex);
2643   SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
2644   conn->need_mon = need_mon;
2645   DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
2646   DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
2647   conn->mta_conn_mutex_lock_already = TRUE;
2648   conn->mta_conn_mutex_unlock_later = TRUE;
2649   if (spider_db_query(
2650     conn,
2651     SPIDER_SQL_COMMIT_STR,
2652     SPIDER_SQL_COMMIT_LEN,
2653     -1,
2654     need_mon)
2655   ) {
2656     DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
2657     DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2658     conn->mta_conn_mutex_lock_already = FALSE;
2659     conn->mta_conn_mutex_unlock_later = FALSE;
2660     DBUG_RETURN(spider_db_errorno(conn));
2661   }
2662   DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
2663   DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2664   conn->mta_conn_mutex_lock_already = FALSE;
2665   conn->mta_conn_mutex_unlock_later = FALSE;
2666   SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
2667   pthread_mutex_unlock(&conn->mta_conn_mutex);
2668   DBUG_RETURN(0);
2669 }
2670 
rollback(int * need_mon)2671 int spider_db_mbase::rollback(
2672   int *need_mon
2673 ) {
2674   bool is_error;
2675   int error_num;
2676   DBUG_ENTER("spider_db_mbase::rollback");
2677   DBUG_PRINT("info",("spider this=%p", this));
2678   pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
2679   pthread_mutex_lock(&conn->mta_conn_mutex);
2680   SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
2681   conn->need_mon = need_mon;
2682   DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
2683   DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
2684   conn->mta_conn_mutex_lock_already = TRUE;
2685   conn->mta_conn_mutex_unlock_later = TRUE;
2686   if (spider_db_query(
2687     conn,
2688     SPIDER_SQL_ROLLBACK_STR,
2689     SPIDER_SQL_ROLLBACK_LEN,
2690     -1,
2691     need_mon)
2692   ) {
2693     is_error = conn->thd->is_error();
2694     error_num = spider_db_errorno(conn);
2695     if (
2696       error_num == ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM &&
2697       !is_error
2698     )
2699       conn->thd->clear_error();
2700     else {
2701       DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
2702       DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2703       conn->mta_conn_mutex_lock_already = FALSE;
2704       conn->mta_conn_mutex_unlock_later = FALSE;
2705       SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
2706       pthread_mutex_unlock(&conn->mta_conn_mutex);
2707       DBUG_RETURN(error_num);
2708     }
2709   }
2710   DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
2711   DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2712   conn->mta_conn_mutex_lock_already = FALSE;
2713   conn->mta_conn_mutex_unlock_later = FALSE;
2714   SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
2715   pthread_mutex_unlock(&conn->mta_conn_mutex);
2716   DBUG_RETURN(0);
2717 }
2718 
xa_start(XID * xid,int * need_mon)2719 int spider_db_mbase::xa_start(
2720   XID *xid,
2721   int *need_mon
2722 ) {
2723   DBUG_ENTER("spider_db_mbase::xa_start");
2724   DBUG_PRINT("info",("spider this=%p", this));
2725   DBUG_ASSERT(0);
2726   DBUG_RETURN(0);
2727 }
2728 
xa_start_in_bulk_sql()2729 bool spider_db_mbase::xa_start_in_bulk_sql()
2730 {
2731   DBUG_ENTER("spider_db_mbase::xa_start_in_bulk_sql");
2732   DBUG_PRINT("info",("spider this=%p", this));
2733   DBUG_RETURN(TRUE);
2734 }
2735 
xa_end(XID * xid,int * need_mon)2736 int spider_db_mbase::xa_end(
2737   XID *xid,
2738   int *need_mon
2739 ) {
2740   char sql_buf[SPIDER_SQL_XA_END_LEN + XIDDATASIZE + sizeof(long) + 9];
2741   spider_string sql_str(sql_buf, sizeof(sql_buf), &my_charset_bin);
2742   DBUG_ENTER("spider_db_mbase::xa_end");
2743   DBUG_PRINT("info",("spider this=%p", this));
2744   sql_str.init_calc_mem(108);
2745 
2746   sql_str.length(0);
2747   sql_str.q_append(SPIDER_SQL_XA_END_STR, SPIDER_SQL_XA_END_LEN);
2748   spider_db_append_xid_str(&sql_str, xid);
2749   pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
2750   pthread_mutex_lock(&conn->mta_conn_mutex);
2751   SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
2752   conn->need_mon = need_mon;
2753   DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
2754   DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
2755   conn->mta_conn_mutex_lock_already = TRUE;
2756   conn->mta_conn_mutex_unlock_later = TRUE;
2757   if (spider_db_query(
2758     conn,
2759     sql_str.ptr(),
2760     sql_str.length(),
2761     -1,
2762     need_mon)
2763   ) {
2764     DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
2765     DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2766     conn->mta_conn_mutex_lock_already = FALSE;
2767     conn->mta_conn_mutex_unlock_later = FALSE;
2768     DBUG_RETURN(spider_db_errorno(conn));
2769   }
2770   DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
2771   DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2772   conn->mta_conn_mutex_lock_already = FALSE;
2773   conn->mta_conn_mutex_unlock_later = FALSE;
2774   SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
2775   pthread_mutex_unlock(&conn->mta_conn_mutex);
2776   DBUG_RETURN(0);
2777 }
2778 
xa_prepare(XID * xid,int * need_mon)2779 int spider_db_mbase::xa_prepare(
2780   XID *xid,
2781   int *need_mon
2782 ) {
2783   char sql_buf[SPIDER_SQL_XA_PREPARE_LEN + XIDDATASIZE + sizeof(long) + 9];
2784   spider_string sql_str(sql_buf, sizeof(sql_buf), &my_charset_bin);
2785   DBUG_ENTER("spider_db_mbase::xa_prepare");
2786   DBUG_PRINT("info",("spider this=%p", this));
2787   sql_str.init_calc_mem(109);
2788 
2789   sql_str.length(0);
2790   sql_str.q_append(SPIDER_SQL_XA_PREPARE_STR, SPIDER_SQL_XA_PREPARE_LEN);
2791   spider_db_append_xid_str(&sql_str, xid);
2792   pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
2793   pthread_mutex_lock(&conn->mta_conn_mutex);
2794   SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
2795   conn->need_mon = need_mon;
2796   DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
2797   DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
2798   conn->mta_conn_mutex_lock_already = TRUE;
2799   conn->mta_conn_mutex_unlock_later = TRUE;
2800   if (spider_db_query(
2801     conn,
2802     sql_str.ptr(),
2803     sql_str.length(),
2804     -1,
2805     need_mon)
2806   ) {
2807     DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
2808     DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2809     conn->mta_conn_mutex_lock_already = FALSE;
2810     conn->mta_conn_mutex_unlock_later = FALSE;
2811     DBUG_RETURN(spider_db_errorno(conn));
2812   }
2813   DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
2814   DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2815   conn->mta_conn_mutex_lock_already = FALSE;
2816   conn->mta_conn_mutex_unlock_later = FALSE;
2817   SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
2818   pthread_mutex_unlock(&conn->mta_conn_mutex);
2819   DBUG_RETURN(0);
2820 }
2821 
xa_commit(XID * xid,int * need_mon)2822 int spider_db_mbase::xa_commit(
2823   XID *xid,
2824   int *need_mon
2825 ) {
2826   char sql_buf[SPIDER_SQL_XA_COMMIT_LEN + XIDDATASIZE + sizeof(long) + 9];
2827   spider_string sql_str(sql_buf, sizeof(sql_buf), &my_charset_bin);
2828   DBUG_ENTER("spider_db_mbase::xa_commit");
2829   DBUG_PRINT("info",("spider this=%p", this));
2830   sql_str.init_calc_mem(110);
2831 
2832   sql_str.length(0);
2833   sql_str.q_append(SPIDER_SQL_XA_COMMIT_STR, SPIDER_SQL_XA_COMMIT_LEN);
2834   spider_db_append_xid_str(&sql_str, xid);
2835   pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
2836   pthread_mutex_lock(&conn->mta_conn_mutex);
2837   SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
2838   conn->need_mon = need_mon;
2839   DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
2840   DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
2841   conn->mta_conn_mutex_lock_already = TRUE;
2842   conn->mta_conn_mutex_unlock_later = TRUE;
2843   if (spider_db_query(
2844     conn,
2845     sql_str.ptr(),
2846     sql_str.length(),
2847     -1,
2848     need_mon)
2849   ) {
2850     DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
2851     DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2852     conn->mta_conn_mutex_lock_already = FALSE;
2853     conn->mta_conn_mutex_unlock_later = FALSE;
2854     DBUG_RETURN(spider_db_errorno(conn));
2855   }
2856   DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
2857   DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2858   conn->mta_conn_mutex_lock_already = FALSE;
2859   conn->mta_conn_mutex_unlock_later = FALSE;
2860   SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
2861   pthread_mutex_unlock(&conn->mta_conn_mutex);
2862   DBUG_RETURN(0);
2863 }
2864 
xa_rollback(XID * xid,int * need_mon)2865 int spider_db_mbase::xa_rollback(
2866   XID *xid,
2867   int *need_mon
2868 ) {
2869   char sql_buf[SPIDER_SQL_XA_ROLLBACK_LEN + XIDDATASIZE + sizeof(long) + 9];
2870   spider_string sql_str(sql_buf, sizeof(sql_buf), &my_charset_bin);
2871   DBUG_ENTER("spider_db_mbase::xa_rollback");
2872   DBUG_PRINT("info",("spider this=%p", this));
2873   sql_str.init_calc_mem(111);
2874 
2875   sql_str.length(0);
2876   sql_str.q_append(SPIDER_SQL_XA_ROLLBACK_STR, SPIDER_SQL_XA_ROLLBACK_LEN);
2877   spider_db_append_xid_str(&sql_str, xid);
2878   pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
2879   pthread_mutex_lock(&conn->mta_conn_mutex);
2880   SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
2881   conn->need_mon = need_mon;
2882   DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
2883   DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
2884   conn->mta_conn_mutex_lock_already = TRUE;
2885   conn->mta_conn_mutex_unlock_later = TRUE;
2886   if (spider_db_query(
2887     conn,
2888     sql_str.ptr(),
2889     sql_str.length(),
2890     -1,
2891     need_mon)
2892   ) {
2893     DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
2894     DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2895     conn->mta_conn_mutex_lock_already = FALSE;
2896     conn->mta_conn_mutex_unlock_later = FALSE;
2897     DBUG_RETURN(spider_db_errorno(conn));
2898   }
2899   DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
2900   DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2901   conn->mta_conn_mutex_lock_already = FALSE;
2902   conn->mta_conn_mutex_unlock_later = FALSE;
2903   SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
2904   pthread_mutex_unlock(&conn->mta_conn_mutex);
2905   DBUG_RETURN(0);
2906 }
2907 
set_trx_isolation_in_bulk_sql()2908 bool spider_db_mbase::set_trx_isolation_in_bulk_sql()
2909 {
2910   DBUG_ENTER("spider_db_mbase::set_trx_isolation_in_bulk_sql");
2911   DBUG_PRINT("info",("spider this=%p", this));
2912   DBUG_RETURN(TRUE);
2913 }
2914 
set_trx_isolation(int trx_isolation,int * need_mon)2915 int spider_db_mbase::set_trx_isolation(
2916   int trx_isolation,
2917   int *need_mon
2918 ) {
2919   DBUG_ENTER("spider_db_mbase::set_trx_isolation");
2920   DBUG_PRINT("info",("spider this=%p", this));
2921   switch (trx_isolation)
2922   {
2923     case ISO_READ_UNCOMMITTED:
2924       pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
2925       pthread_mutex_lock(&conn->mta_conn_mutex);
2926       SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
2927       conn->need_mon = need_mon;
2928       DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
2929       DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
2930       conn->mta_conn_mutex_lock_already = TRUE;
2931       conn->mta_conn_mutex_unlock_later = TRUE;
2932       if (spider_db_query(
2933         conn,
2934         SPIDER_SQL_ISO_READ_UNCOMMITTED_STR,
2935         SPIDER_SQL_ISO_READ_UNCOMMITTED_LEN,
2936         -1,
2937         need_mon)
2938       ) {
2939         DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
2940         DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2941         conn->mta_conn_mutex_lock_already = FALSE;
2942         conn->mta_conn_mutex_unlock_later = FALSE;
2943         DBUG_RETURN(spider_db_errorno(conn));
2944       }
2945       DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
2946       DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2947       conn->mta_conn_mutex_lock_already = FALSE;
2948       conn->mta_conn_mutex_unlock_later = FALSE;
2949       SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
2950       pthread_mutex_unlock(&conn->mta_conn_mutex);
2951       break;
2952     case ISO_READ_COMMITTED:
2953       pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
2954       pthread_mutex_lock(&conn->mta_conn_mutex);
2955       SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
2956       conn->need_mon = need_mon;
2957       DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
2958       DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
2959       conn->mta_conn_mutex_lock_already = TRUE;
2960       conn->mta_conn_mutex_unlock_later = TRUE;
2961       if (spider_db_query(
2962         conn,
2963         SPIDER_SQL_ISO_READ_COMMITTED_STR,
2964         SPIDER_SQL_ISO_READ_COMMITTED_LEN,
2965         -1,
2966         need_mon)
2967       ) {
2968         DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
2969         DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2970         conn->mta_conn_mutex_lock_already = FALSE;
2971         conn->mta_conn_mutex_unlock_later = FALSE;
2972         DBUG_RETURN(spider_db_errorno(conn));
2973       }
2974       DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
2975       DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2976       conn->mta_conn_mutex_lock_already = FALSE;
2977       conn->mta_conn_mutex_unlock_later = FALSE;
2978       SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
2979       pthread_mutex_unlock(&conn->mta_conn_mutex);
2980       break;
2981     case ISO_REPEATABLE_READ:
2982       pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
2983       pthread_mutex_lock(&conn->mta_conn_mutex);
2984       SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
2985       conn->need_mon = need_mon;
2986       DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
2987       DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
2988       conn->mta_conn_mutex_lock_already = TRUE;
2989       conn->mta_conn_mutex_unlock_later = TRUE;
2990       if (spider_db_query(
2991         conn,
2992         SPIDER_SQL_ISO_REPEATABLE_READ_STR,
2993         SPIDER_SQL_ISO_REPEATABLE_READ_LEN,
2994         -1,
2995         need_mon)
2996       ) {
2997         DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
2998         DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2999         conn->mta_conn_mutex_lock_already = FALSE;
3000         conn->mta_conn_mutex_unlock_later = FALSE;
3001         DBUG_RETURN(spider_db_errorno(conn));
3002       }
3003       DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
3004       DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
3005       conn->mta_conn_mutex_lock_already = FALSE;
3006       conn->mta_conn_mutex_unlock_later = FALSE;
3007       SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
3008       pthread_mutex_unlock(&conn->mta_conn_mutex);
3009       break;
3010     case ISO_SERIALIZABLE:
3011       pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
3012       pthread_mutex_lock(&conn->mta_conn_mutex);
3013       SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
3014       conn->need_mon = need_mon;
3015       DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
3016       DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
3017       conn->mta_conn_mutex_lock_already = TRUE;
3018       conn->mta_conn_mutex_unlock_later = TRUE;
3019       if (spider_db_query(
3020         conn,
3021         SPIDER_SQL_ISO_SERIALIZABLE_STR,
3022         SPIDER_SQL_ISO_SERIALIZABLE_LEN,
3023         -1,
3024         need_mon)
3025       ) {
3026         DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
3027         DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
3028         conn->mta_conn_mutex_lock_already = FALSE;
3029         conn->mta_conn_mutex_unlock_later = FALSE;
3030         DBUG_RETURN(spider_db_errorno(conn));
3031       }
3032       DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
3033       DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
3034       conn->mta_conn_mutex_lock_already = FALSE;
3035       conn->mta_conn_mutex_unlock_later = FALSE;
3036       SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
3037       pthread_mutex_unlock(&conn->mta_conn_mutex);
3038       break;
3039     default:
3040       DBUG_RETURN(HA_ERR_UNSUPPORTED);
3041   }
3042   DBUG_RETURN(0);
3043 }
3044 
set_autocommit_in_bulk_sql()3045 bool spider_db_mbase::set_autocommit_in_bulk_sql()
3046 {
3047   DBUG_ENTER("spider_db_mbase::set_autocommit_in_bulk_sql");
3048   DBUG_PRINT("info",("spider this=%p", this));
3049   DBUG_RETURN(TRUE);
3050 }
3051 
set_autocommit(bool autocommit,int * need_mon)3052 int spider_db_mbase::set_autocommit(
3053   bool autocommit,
3054   int *need_mon
3055 ) {
3056   DBUG_ENTER("spider_db_mbase::set_autocommit");
3057   DBUG_PRINT("info",("spider this=%p", this));
3058   if (autocommit)
3059   {
3060     pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
3061     pthread_mutex_lock(&conn->mta_conn_mutex);
3062     SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
3063     conn->need_mon = need_mon;
3064     DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
3065     DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
3066     conn->mta_conn_mutex_lock_already = TRUE;
3067     conn->mta_conn_mutex_unlock_later = TRUE;
3068     if (spider_db_query(
3069       conn,
3070       SPIDER_SQL_AUTOCOMMIT_ON_STR,
3071       SPIDER_SQL_AUTOCOMMIT_ON_LEN,
3072       -1,
3073       need_mon)
3074     ) {
3075       DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
3076       DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
3077       conn->mta_conn_mutex_lock_already = FALSE;
3078       conn->mta_conn_mutex_unlock_later = FALSE;
3079       DBUG_RETURN(spider_db_errorno(conn));
3080     }
3081     DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
3082     DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
3083     conn->mta_conn_mutex_lock_already = FALSE;
3084     conn->mta_conn_mutex_unlock_later = FALSE;
3085     SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
3086     pthread_mutex_unlock(&conn->mta_conn_mutex);
3087   } else {
3088     pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
3089     pthread_mutex_lock(&conn->mta_conn_mutex);
3090     SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
3091     conn->need_mon = need_mon;
3092     DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
3093     DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
3094     conn->mta_conn_mutex_lock_already = TRUE;
3095     conn->mta_conn_mutex_unlock_later = TRUE;
3096     if (spider_db_query(
3097       conn,
3098       SPIDER_SQL_AUTOCOMMIT_OFF_STR,
3099       SPIDER_SQL_AUTOCOMMIT_OFF_LEN,
3100       -1,
3101       need_mon)
3102     ) {
3103       DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
3104       DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
3105       conn->mta_conn_mutex_lock_already = FALSE;
3106       conn->mta_conn_mutex_unlock_later = FALSE;
3107       DBUG_RETURN(spider_db_errorno(conn));
3108     }
3109     DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
3110     DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
3111     conn->mta_conn_mutex_lock_already = FALSE;
3112     conn->mta_conn_mutex_unlock_later = FALSE;
3113     SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
3114     pthread_mutex_unlock(&conn->mta_conn_mutex);
3115   }
3116   DBUG_RETURN(0);
3117 }
3118 
set_sql_log_off_in_bulk_sql()3119 bool spider_db_mbase::set_sql_log_off_in_bulk_sql()
3120 {
3121   DBUG_ENTER("spider_db_mbase::set_sql_log_off_in_bulk_sql");
3122   DBUG_PRINT("info",("spider this=%p", this));
3123   DBUG_RETURN(TRUE);
3124 }
3125 
set_sql_log_off(bool sql_log_off,int * need_mon)3126 int spider_db_mbase::set_sql_log_off(
3127   bool sql_log_off,
3128   int *need_mon
3129 ) {
3130   DBUG_ENTER("spider_db_mbase::set_sql_log_off");
3131   DBUG_PRINT("info",("spider this=%p", this));
3132   if (sql_log_off)
3133   {
3134     pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
3135     pthread_mutex_lock(&conn->mta_conn_mutex);
3136     SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
3137     conn->need_mon = need_mon;
3138     DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
3139     DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
3140     conn->mta_conn_mutex_lock_already = TRUE;
3141     conn->mta_conn_mutex_unlock_later = TRUE;
3142     if (spider_db_query(
3143       conn,
3144       SPIDER_SQL_SQL_LOG_ON_STR,
3145       SPIDER_SQL_SQL_LOG_ON_LEN,
3146       -1,
3147       need_mon)
3148     ) {
3149       DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
3150       DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
3151       conn->mta_conn_mutex_lock_already = FALSE;
3152       conn->mta_conn_mutex_unlock_later = FALSE;
3153       DBUG_RETURN(spider_db_errorno(conn));
3154     }
3155     DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
3156     DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
3157     conn->mta_conn_mutex_lock_already = FALSE;
3158     conn->mta_conn_mutex_unlock_later = FALSE;
3159     SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
3160     pthread_mutex_unlock(&conn->mta_conn_mutex);
3161   } else {
3162     pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
3163     pthread_mutex_lock(&conn->mta_conn_mutex);
3164     SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
3165     conn->need_mon = need_mon;
3166     DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
3167     DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
3168     conn->mta_conn_mutex_lock_already = TRUE;
3169     conn->mta_conn_mutex_unlock_later = TRUE;
3170     if (spider_db_query(
3171       conn,
3172       SPIDER_SQL_SQL_LOG_OFF_STR,
3173       SPIDER_SQL_SQL_LOG_OFF_LEN,
3174       -1,
3175       need_mon)
3176     ) {
3177       DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
3178       DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
3179       conn->mta_conn_mutex_lock_already = FALSE;
3180       conn->mta_conn_mutex_unlock_later = FALSE;
3181       DBUG_RETURN(spider_db_errorno(conn));
3182     }
3183     DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
3184     DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
3185     conn->mta_conn_mutex_lock_already = FALSE;
3186     conn->mta_conn_mutex_unlock_later = FALSE;
3187     SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
3188     pthread_mutex_unlock(&conn->mta_conn_mutex);
3189   }
3190   DBUG_RETURN(0);
3191 }
3192 
set_wait_timeout_in_bulk_sql()3193 bool spider_db_mbase::set_wait_timeout_in_bulk_sql()
3194 {
3195   DBUG_ENTER("spider_db_mbase::set_wait_timeout_in_bulk_sql");
3196   DBUG_PRINT("info",("spider this=%p", this));
3197   DBUG_RETURN(TRUE);
3198 }
3199 
set_wait_timeout(int wait_timeout,int * need_mon)3200 int spider_db_mbase::set_wait_timeout(
3201   int wait_timeout,
3202   int *need_mon
3203 ) {
3204   char sql_buf[MAX_FIELD_WIDTH];
3205   char timeout_str[SPIDER_SQL_INT_LEN];
3206   int timeout_str_length;
3207   spider_string sql_str(sql_buf, sizeof(sql_buf), &my_charset_bin);
3208   DBUG_ENTER("spider_db_mbase::set_wait_timeout");
3209   DBUG_PRINT("info",("spider this=%p", this));
3210   sql_str.init_calc_mem(264);
3211   sql_str.length(0);
3212   timeout_str_length =
3213     my_sprintf(timeout_str, (timeout_str, "%d", wait_timeout));
3214   if (sql_str.reserve(SPIDER_SQL_WAIT_TIMEOUT_LEN + timeout_str_length))
3215     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
3216   sql_str.q_append(SPIDER_SQL_WAIT_TIMEOUT_STR, SPIDER_SQL_WAIT_TIMEOUT_LEN);
3217   sql_str.q_append(timeout_str, timeout_str_length);
3218   pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
3219   pthread_mutex_lock(&conn->mta_conn_mutex);
3220   SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
3221   conn->need_mon = need_mon;
3222   DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
3223   DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
3224   conn->mta_conn_mutex_lock_already = TRUE;
3225   conn->mta_conn_mutex_unlock_later = TRUE;
3226   if (spider_db_query(
3227     conn,
3228     sql_str.ptr(),
3229     sql_str.length(),
3230     -1,
3231     need_mon)
3232   ) {
3233     DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
3234     DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
3235     conn->mta_conn_mutex_lock_already = FALSE;
3236     conn->mta_conn_mutex_unlock_later = FALSE;
3237     DBUG_RETURN(spider_db_errorno(conn));
3238   }
3239   DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
3240   DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
3241   conn->mta_conn_mutex_lock_already = FALSE;
3242   conn->mta_conn_mutex_unlock_later = FALSE;
3243   SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
3244   pthread_mutex_unlock(&conn->mta_conn_mutex);
3245   DBUG_RETURN(0);
3246 }
3247 
set_sql_mode_in_bulk_sql()3248 bool spider_db_mbase::set_sql_mode_in_bulk_sql()
3249 {
3250   DBUG_ENTER("spider_db_mbase::set_sql_mode_in_bulk_sql");
3251   DBUG_PRINT("info",("spider this=%p", this));
3252   DBUG_RETURN(TRUE);
3253 }
3254 
set_sql_mode(sql_mode_t sql_mode,int * need_mon)3255 int spider_db_mbase::set_sql_mode(
3256   sql_mode_t sql_mode,
3257   int *need_mon
3258 ) {
3259   int error_num;
3260   char sql_buf[MAX_FIELD_WIDTH];
3261   spider_string sql_str(sql_buf, sizeof(sql_buf), &my_charset_bin);
3262   DBUG_ENTER("spider_db_mbase::set_sql_mode");
3263   DBUG_PRINT("info",("spider this=%p", this));
3264   sql_str.init_calc_mem(265);
3265   sql_str.length(0);
3266   if (sql_str.reserve(SPIDER_SQL_SQL_MODE_LEN))
3267     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
3268   sql_str.q_append(SPIDER_SQL_SQL_MODE_STR, SPIDER_SQL_SQL_MODE_LEN);
3269   if ((error_num = spider_db_mbase_utility->append_sql_mode_internal(&sql_str, sql_mode)))
3270   {
3271     DBUG_RETURN(error_num);
3272   }
3273   if (sql_str.length() > SPIDER_SQL_SQL_MODE_LEN)
3274   {
3275     sql_str.length(sql_str.length() - SPIDER_SQL_COMMA_LEN);
3276   } else {
3277     if (sql_str.reserve(SPIDER_SQL_VALUE_QUOTE_LEN))
3278     {
3279       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
3280     }
3281   }
3282   sql_str.q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
3283   pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
3284   pthread_mutex_lock(&conn->mta_conn_mutex);
3285   SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
3286   conn->need_mon = need_mon;
3287   DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
3288   DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
3289   conn->mta_conn_mutex_lock_already = TRUE;
3290   conn->mta_conn_mutex_unlock_later = TRUE;
3291   if (spider_db_query(
3292     conn,
3293     sql_str.ptr(),
3294     sql_str.length(),
3295     -1,
3296     need_mon)
3297   ) {
3298     DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
3299     DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
3300     conn->mta_conn_mutex_lock_already = FALSE;
3301     conn->mta_conn_mutex_unlock_later = FALSE;
3302     DBUG_RETURN(spider_db_errorno(conn));
3303   }
3304   DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
3305   DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
3306   conn->mta_conn_mutex_lock_already = FALSE;
3307   conn->mta_conn_mutex_unlock_later = FALSE;
3308   SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
3309   pthread_mutex_unlock(&conn->mta_conn_mutex);
3310   DBUG_RETURN(0);
3311 }
3312 
set_time_zone_in_bulk_sql()3313 bool spider_db_mbase::set_time_zone_in_bulk_sql()
3314 {
3315   DBUG_ENTER("spider_db_mbase::set_time_zone_in_bulk_sql");
3316   DBUG_PRINT("info",("spider this=%p", this));
3317   DBUG_RETURN(TRUE);
3318 }
3319 
set_time_zone(Time_zone * time_zone,int * need_mon)3320 int spider_db_mbase::set_time_zone(
3321   Time_zone *time_zone,
3322   int *need_mon
3323 ) {
3324   const String *tz_str = time_zone->get_name();
3325   char sql_buf[MAX_FIELD_WIDTH];
3326   spider_string sql_str(sql_buf, sizeof(sql_buf), &my_charset_bin);
3327   DBUG_ENTER("spider_db_mbase::set_time_zone");
3328   DBUG_PRINT("info",("spider this=%p", this));
3329   sql_str.init_calc_mem(214);
3330   sql_str.length(0);
3331   if (sql_str.reserve(SPIDER_SQL_TIME_ZONE_LEN +
3332     tz_str->length() + SPIDER_SQL_VALUE_QUOTE_LEN))
3333     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
3334   sql_str.q_append(SPIDER_SQL_TIME_ZONE_STR, SPIDER_SQL_TIME_ZONE_LEN);
3335   sql_str.q_append(tz_str->ptr(), tz_str->length());
3336   sql_str.q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
3337   pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
3338   pthread_mutex_lock(&conn->mta_conn_mutex);
3339   SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
3340   conn->need_mon = need_mon;
3341   DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
3342   DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
3343   conn->mta_conn_mutex_lock_already = TRUE;
3344   conn->mta_conn_mutex_unlock_later = TRUE;
3345   if (spider_db_query(
3346     conn,
3347     sql_str.ptr(),
3348     sql_str.length(),
3349     -1,
3350     need_mon)
3351   ) {
3352     DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
3353     DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
3354     conn->mta_conn_mutex_lock_already = FALSE;
3355     conn->mta_conn_mutex_unlock_later = FALSE;
3356     DBUG_RETURN(spider_db_errorno(conn));
3357   }
3358   DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
3359   DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
3360   conn->mta_conn_mutex_lock_already = FALSE;
3361   conn->mta_conn_mutex_unlock_later = FALSE;
3362   SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
3363   pthread_mutex_unlock(&conn->mta_conn_mutex);
3364   DBUG_RETURN(0);
3365 }
3366 
set_loop_check_in_bulk_sql()3367 bool spider_db_mbase::set_loop_check_in_bulk_sql()
3368 {
3369   DBUG_ENTER("spider_db_mbase::set_loop_check_in_bulk_sql");
3370   DBUG_PRINT("info",("spider this=%p", this));
3371   DBUG_RETURN(TRUE);
3372 }
3373 
set_loop_check(int * need_mon)3374 int spider_db_mbase::set_loop_check(
3375   int *need_mon
3376 ) {
3377   SPIDER_CONN_LOOP_CHECK *lcptr;
3378   char sql_buf[MAX_FIELD_WIDTH];
3379   spider_string sql_str(sql_buf, sizeof(sql_buf), &my_charset_bin);
3380   DBUG_ENTER("spider_db_mbase::set_loop_check");
3381   DBUG_PRINT("info",("spider this=%p", this));
3382   sql_str.init_calc_mem(270);
3383   while ((lcptr = (SPIDER_CONN_LOOP_CHECK *) my_hash_element(
3384     &conn->loop_check_queue, 0)))
3385   {
3386     sql_str.length(0);
3387     if (sql_str.reserve(SPIDER_SQL_SET_USER_VAL_LEN +
3388       SPIDER_SQL_LOP_CHK_PRM_PRF_LEN + lcptr->to_name.length +
3389       SPIDER_SQL_NAME_QUOTE_LEN + SPIDER_SQL_EQUAL_LEN +
3390       SPIDER_SQL_VALUE_QUOTE_LEN +
3391       lcptr->merged_value.length + SPIDER_SQL_VALUE_QUOTE_LEN))
3392     {
3393       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
3394     }
3395     sql_str.q_append(SPIDER_SQL_SET_USER_VAL_STR, SPIDER_SQL_SET_USER_VAL_LEN);
3396     sql_str.q_append(SPIDER_SQL_LOP_CHK_PRM_PRF_STR,
3397       SPIDER_SQL_LOP_CHK_PRM_PRF_LEN);
3398     sql_str.q_append(lcptr->to_name.str, lcptr->to_name.length);
3399     sql_str.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
3400     sql_str.q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
3401     sql_str.q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
3402     sql_str.q_append(lcptr->merged_value.str, lcptr->merged_value.length);
3403     sql_str.q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
3404 
3405     pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
3406     pthread_mutex_lock(&conn->mta_conn_mutex);
3407     SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
3408     conn->need_mon = need_mon;
3409     DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
3410     DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
3411     conn->mta_conn_mutex_lock_already = TRUE;
3412     conn->mta_conn_mutex_unlock_later = TRUE;
3413     if (spider_db_query(
3414       conn,
3415       sql_str.ptr(),
3416       sql_str.length(),
3417       -1,
3418       need_mon)
3419     ) {
3420       DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
3421       DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
3422       conn->mta_conn_mutex_lock_already = FALSE;
3423       conn->mta_conn_mutex_unlock_later = FALSE;
3424       DBUG_RETURN(spider_db_errorno(conn));
3425     }
3426     DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
3427     DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
3428     conn->mta_conn_mutex_lock_already = FALSE;
3429     conn->mta_conn_mutex_unlock_later = FALSE;
3430     SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
3431     pthread_mutex_unlock(&conn->mta_conn_mutex);
3432 
3433 #ifdef HASH_UPDATE_WITH_HASH_VALUE
3434     my_hash_delete_with_hash_value(&conn->loop_check_queue,
3435       lcptr->hash_value, (uchar *) lcptr);
3436 #else
3437     my_hash_delete(&conn->loop_check_queue, (uchar*) lcptr);
3438 #endif
3439   }
3440   DBUG_RETURN(0);
3441 }
3442 
fin_loop_check()3443 int spider_db_mbase::fin_loop_check()
3444 {
3445   st_spider_conn_loop_check *lcptr;
3446   DBUG_ENTER("spider_db_mbase::fin_loop_check");
3447   DBUG_PRINT("info",("spider this=%p", this));
3448   if (conn->loop_check_queue.records)
3449   {
3450     uint l = 0;
3451     while ((lcptr = (SPIDER_CONN_LOOP_CHECK *) my_hash_element(
3452       &conn->loop_check_queue, l)))
3453     {
3454       lcptr->flag = 0;
3455       ++l;
3456     }
3457     my_hash_reset(&conn->loop_check_queue);
3458   }
3459   lcptr = conn->loop_check_ignored_first;
3460   while (lcptr)
3461   {
3462     lcptr->flag = 0;
3463     lcptr = lcptr->next;
3464   }
3465   conn->loop_check_ignored_first = NULL;
3466   lcptr = conn->loop_check_meraged_first;
3467   while (lcptr)
3468   {
3469     lcptr->flag = 0;
3470     lcptr = lcptr->next;
3471   }
3472   conn->loop_check_meraged_first = NULL;
3473   DBUG_RETURN(0);
3474 }
3475 
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)3476 int spider_db_mbase::exec_simple_sql_with_result(
3477   SPIDER_TRX *trx,
3478   SPIDER_SHARE *share,
3479   const char *sql,
3480   uint sql_length,
3481   int all_link_idx,
3482   int *need_mon,
3483   SPIDER_DB_RESULT **res
3484 ) {
3485   int error_num;
3486   DBUG_ENTER("spider_db_mbase::exec_simple_sql_with_result");
3487   pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
3488   pthread_mutex_lock(&conn->mta_conn_mutex);
3489   SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
3490   conn->need_mon = need_mon;
3491   DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
3492   DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
3493   conn->mta_conn_mutex_lock_already = TRUE;
3494   conn->mta_conn_mutex_unlock_later = TRUE;
3495   spider_conn_set_timeout_from_share(conn, all_link_idx, trx->thd,
3496     share);
3497   if (
3498     (error_num = spider_db_set_names_internal(trx, share, conn,
3499       all_link_idx, need_mon)) ||
3500     (
3501       spider_db_query(
3502         conn,
3503         sql,
3504         sql_length,
3505         -1,
3506         need_mon) &&
3507       (error_num = spider_db_errorno(conn))
3508     )
3509   ) {
3510     if (
3511       error_num == ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM &&
3512       !conn->disable_reconnect
3513     ) {
3514       /* retry */
3515       if ((error_num = spider_db_ping_internal(share, conn,
3516         all_link_idx, need_mon)))
3517       {
3518         DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
3519         DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
3520         conn->mta_conn_mutex_lock_already = FALSE;
3521         conn->mta_conn_mutex_unlock_later = FALSE;
3522         SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
3523         pthread_mutex_unlock(&conn->mta_conn_mutex);
3524         DBUG_PRINT("info", ("spider error_num=%d 1", error_num));
3525         DBUG_RETURN(error_num);
3526       }
3527       if ((error_num = spider_db_set_names_internal(trx, share, conn,
3528         all_link_idx, need_mon)))
3529       {
3530         DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
3531         DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
3532         conn->mta_conn_mutex_lock_already = FALSE;
3533         conn->mta_conn_mutex_unlock_later = FALSE;
3534         SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
3535         pthread_mutex_unlock(&conn->mta_conn_mutex);
3536         DBUG_PRINT("info", ("spider error_num=%d 2", error_num));
3537         DBUG_RETURN(error_num);
3538       }
3539       spider_conn_set_timeout_from_share(conn, all_link_idx, trx->thd,
3540         share);
3541       if (spider_db_query(
3542         conn,
3543         sql,
3544         sql_length,
3545         -1,
3546         need_mon)
3547       ) {
3548         DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
3549         DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
3550         conn->mta_conn_mutex_lock_already = FALSE;
3551         conn->mta_conn_mutex_unlock_later = FALSE;
3552         DBUG_PRINT("info", ("spider error_num=%d 3", error_num));
3553         DBUG_RETURN(spider_db_errorno(conn));
3554       }
3555     } else {
3556       DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
3557       DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
3558       conn->mta_conn_mutex_lock_already = FALSE;
3559       conn->mta_conn_mutex_unlock_later = FALSE;
3560       SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
3561       pthread_mutex_unlock(&conn->mta_conn_mutex);
3562       DBUG_PRINT("info", ("spider error_num=%d 4", error_num));
3563       DBUG_RETURN(error_num);
3564     }
3565   }
3566   if (!(*res = store_result(NULL, NULL, &error_num)))
3567   {
3568     DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
3569     DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
3570     conn->mta_conn_mutex_lock_already = FALSE;
3571     conn->mta_conn_mutex_unlock_later = FALSE;
3572     if (error_num)
3573     {
3574       SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
3575       pthread_mutex_unlock(&conn->mta_conn_mutex);
3576       DBUG_PRINT("info", ("spider error_num=%d 5", error_num));
3577       DBUG_RETURN(error_num);
3578     }
3579     else if ((error_num = spider_db_errorno(conn)))
3580     {
3581       DBUG_PRINT("info", ("spider error_num=%d 6", error_num));
3582       DBUG_RETURN(error_num);
3583     } else {
3584       DBUG_PRINT("info", ("spider error_num=%d 7",
3585         ER_QUERY_ON_FOREIGN_DATA_SOURCE));
3586       DBUG_RETURN(ER_QUERY_ON_FOREIGN_DATA_SOURCE);
3587     }
3588   }
3589   DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
3590   DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
3591   conn->mta_conn_mutex_lock_already = FALSE;
3592   conn->mta_conn_mutex_unlock_later = FALSE;
3593   SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
3594   pthread_mutex_unlock(&conn->mta_conn_mutex);
3595   DBUG_RETURN(0);
3596 }
3597 
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)3598 int spider_db_mbase::show_master_status(
3599   SPIDER_TRX *trx,
3600   SPIDER_SHARE *share,
3601   int all_link_idx,
3602   int *need_mon,
3603   TABLE *table,
3604   spider_string *str,
3605   int mode,
3606   SPIDER_DB_RESULT **res1,
3607   SPIDER_DB_RESULT **res2
3608 ) {
3609   int error_num;
3610   const char *binlog_file_name, *binlog_pos;
3611   uint binlog_file_name_length, binlog_pos_length;
3612   DBUG_ENTER("spider_db_mbase::show_master_status");
3613   if ((error_num = exec_simple_sql_with_result(trx, share,
3614     SPIDER_SQL_SHOW_MASTER_STATUS_STR, SPIDER_SQL_SHOW_MASTER_STATUS_LEN,
3615     all_link_idx, need_mon, res1))
3616   ) {
3617     DBUG_PRINT("info", ("spider error_num=%d 1", error_num));
3618     DBUG_RETURN(error_num);
3619   }
3620 
3621   if (!(error_num = ((spider_db_mbase_result *)*res1)->fetch_show_master_status(
3622     &binlog_file_name, &binlog_pos))
3623   ) {
3624     binlog_file_name_length = strlen(binlog_file_name);
3625     binlog_pos_length = strlen(binlog_pos);
3626     spider_store_binlog_pos_binlog_file(table,
3627       binlog_file_name, binlog_file_name_length,
3628       binlog_pos, binlog_pos_length, conn->access_charset);
3629     if (mode > 0)
3630     {
3631       error_num = select_binlog_gtid_pos(
3632         trx,
3633         share,
3634         all_link_idx,
3635         need_mon,
3636         table,
3637         str,
3638         binlog_file_name,
3639         binlog_file_name_length,
3640         binlog_pos,
3641         binlog_pos_length,
3642         res2
3643       );
3644     } else {
3645       spider_store_binlog_pos_gtid(table, NULL, 0, conn->access_charset);
3646     }
3647   }
3648 /*
3649   res->free_result();
3650   delete res;
3651 */
3652   if (error_num)
3653   {
3654     DBUG_PRINT("info", ("spider error_num=%d 2", error_num));
3655     DBUG_RETURN(error_num);
3656   }
3657   DBUG_RETURN(0);
3658 }
3659 
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)3660 int spider_db_mbase::select_binlog_gtid_pos(
3661   SPIDER_TRX *trx,
3662   SPIDER_SHARE *share,
3663   int all_link_idx,
3664   int *need_mon,
3665   TABLE *table,
3666   spider_string *str,
3667   const char *binlog_file_name,
3668   uint binlog_file_name_length,
3669   const char *binlog_pos,
3670   uint binlog_pos_length,
3671   SPIDER_DB_RESULT **res
3672 ) {
3673   int error_num;
3674   size_t length;
3675   const char *gtid_pos;
3676   DBUG_ENTER("spider_db_mbase::select_binlog_gtid_pos");
3677   str->length(0);
3678   if (str->reserve(
3679     SPIDER_SQL_BINLOG_GTID_POS_LEN +
3680     SPIDER_SQL_OPEN_PAREN_LEN +
3681     SPIDER_SQL_VALUE_QUOTE_LEN +
3682     binlog_file_name_length * 2 +
3683     SPIDER_SQL_VALUE_QUOTE_LEN +
3684     SPIDER_SQL_COMMA_LEN +
3685     SPIDER_SQL_VALUE_QUOTE_LEN +
3686     binlog_pos_length * 2 +
3687     SPIDER_SQL_VALUE_QUOTE_LEN +
3688     SPIDER_SQL_CLOSE_PAREN_LEN
3689   ))
3690     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
3691   str->q_append(SPIDER_SQL_BINLOG_GTID_POS_STR,
3692     SPIDER_SQL_BINLOG_GTID_POS_LEN);
3693   str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
3694   str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
3695   length = conn->db_conn->escape_string((char *)str->ptr() + str->length(),
3696      binlog_file_name, binlog_file_name_length);
3697   str->length(str->length() + length);
3698   str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
3699   str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
3700   str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
3701   length = conn->db_conn->escape_string((char *)str->ptr() + str->length(),
3702      binlog_pos, binlog_pos_length);
3703   str->length(str->length() + length);
3704   str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
3705   str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
3706 
3707   if ((error_num = exec_simple_sql_with_result(trx, share,
3708     str->ptr(), str->length(), all_link_idx, need_mon, res)))
3709   {
3710     DBUG_PRINT("info", ("spider error_num=%d 1", error_num));
3711     DBUG_RETURN(error_num);
3712   }
3713   if (!(error_num = ((spider_db_mbase_result *)*res)->fetch_select_binlog_gtid_pos(&gtid_pos)))
3714   {
3715     spider_store_binlog_pos_gtid(table, gtid_pos, strlen(gtid_pos), conn->access_charset);
3716   }
3717 /*
3718   res->free_result();
3719   delete res;
3720 */
3721   if (error_num)
3722   {
3723     DBUG_PRINT("info", ("spider error_num=%d 2", error_num));
3724     DBUG_RETURN(error_num);
3725   }
3726   DBUG_RETURN(0);
3727 }
3728 
3729 #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
append_sql(char * sql,ulong sql_length,st_spider_db_request_key * request_key)3730 int spider_db_mbase::append_sql(
3731   char *sql,
3732   ulong sql_length,
3733   st_spider_db_request_key *request_key
3734 ) {
3735   DBUG_ENTER("spider_db_mbase::append_sql");
3736   DBUG_PRINT("info",("spider this=%p", this));
3737   DBUG_ASSERT(0);
3738   DBUG_RETURN(0);
3739 }
3740 
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)3741 int spider_db_mbase::append_open_handler(
3742   uint handler_id,
3743   const char *db_name,
3744   const char *table_name,
3745   const char *index_name,
3746   const char *sql,
3747   st_spider_db_request_key *request_key
3748 ) {
3749   DBUG_ENTER("spider_db_mbase::append_open_handler");
3750   DBUG_PRINT("info",("spider this=%p", this));
3751   DBUG_ASSERT(0);
3752   DBUG_RETURN(0);
3753 }
3754 
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)3755 int spider_db_mbase::append_select(
3756   uint handler_id,
3757   spider_string *sql,
3758   SPIDER_DB_HS_STRING_REF_BUFFER *keys,
3759   int limit,
3760   int skip,
3761   st_spider_db_request_key *request_key
3762 ) {
3763   DBUG_ENTER("spider_db_mbase::append_select");
3764   DBUG_PRINT("info",("spider this=%p", this));
3765   DBUG_ASSERT(0);
3766   DBUG_RETURN(0);
3767 }
3768 
append_insert(uint handler_id,SPIDER_DB_HS_STRING_REF_BUFFER * upds,st_spider_db_request_key * request_key)3769 int spider_db_mbase::append_insert(
3770   uint handler_id,
3771   SPIDER_DB_HS_STRING_REF_BUFFER *upds,
3772   st_spider_db_request_key *request_key
3773 ) {
3774   DBUG_ENTER("spider_db_mbase::append_insert");
3775   DBUG_PRINT("info",("spider this=%p", this));
3776   DBUG_ASSERT(0);
3777   DBUG_RETURN(0);
3778 }
3779 
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)3780 int spider_db_mbase::append_update(
3781   uint handler_id,
3782   spider_string *sql,
3783   SPIDER_DB_HS_STRING_REF_BUFFER *keys,
3784   SPIDER_DB_HS_STRING_REF_BUFFER *upds,
3785   int limit,
3786   int skip,
3787   bool increment,
3788   bool decrement,
3789   st_spider_db_request_key *request_key
3790 ) {
3791   DBUG_ENTER("spider_db_mbase::append_update");
3792   DBUG_PRINT("info",("spider this=%p", this));
3793   DBUG_ASSERT(0);
3794   DBUG_RETURN(0);
3795 }
3796 
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)3797 int spider_db_mbase::append_delete(
3798   uint handler_id,
3799   spider_string *sql,
3800   SPIDER_DB_HS_STRING_REF_BUFFER *keys,
3801   int limit,
3802   int skip,
3803   st_spider_db_request_key *request_key
3804 ) {
3805   DBUG_ENTER("spider_db_mbase::append_delete");
3806   DBUG_PRINT("info",("spider this=%p", this));
3807   DBUG_ASSERT(0);
3808   DBUG_RETURN(0);
3809 }
3810 
reset_request_queue()3811 void spider_db_mbase::reset_request_queue()
3812 {
3813   DBUG_ENTER("spider_db_mbase::reset_request_queue");
3814   DBUG_PRINT("info",("spider this=%p", this));
3815   DBUG_ASSERT(0);
3816   DBUG_VOID_RETURN;
3817 }
3818 #endif
3819 
escape_string(char * to,const char * from,size_t from_length)3820 size_t spider_db_mbase::escape_string(
3821   char *to,
3822   const char *from,
3823   size_t from_length
3824 ) {
3825   DBUG_ENTER("spider_db_mbase::escape_string");
3826   DBUG_PRINT("info",("spider this=%p", this));
3827   if (db_conn->server_status & SERVER_STATUS_NO_BACKSLASH_ESCAPES)
3828     DBUG_RETURN(escape_quotes_for_mysql(db_conn->charset, to, 0,
3829       from, from_length));
3830   DBUG_RETURN(escape_string_for_mysql(db_conn->charset, to, 0,
3831     from, from_length));
3832 }
3833 
have_lock_table_list()3834 bool spider_db_mbase::have_lock_table_list()
3835 {
3836   DBUG_ENTER("spider_db_mbase::have_lock_table_list");
3837   DBUG_PRINT("info",("spider this=%p", this));
3838   DBUG_RETURN(lock_table_hash.records);
3839 }
3840 
append_lock_tables(spider_string * str)3841 int spider_db_mbase::append_lock_tables(
3842   spider_string *str
3843 ) {
3844   int error_num;
3845   ha_spider *tmp_spider;
3846   int lock_type;
3847   uint conn_link_idx;
3848   int tmp_link_idx;
3849   SPIDER_LINK_FOR_HASH *tmp_link_for_hash;
3850   const char *db_name;
3851   uint db_name_length;
3852   CHARSET_INFO *db_name_charset;
3853   const char *table_name;
3854   uint table_name_length;
3855   CHARSET_INFO *table_name_charset;
3856   DBUG_ENTER("spider_db_mbase::lock_tables");
3857   DBUG_PRINT("info",("spider this=%p", this));
3858   if ((error_num = spider_db_mbase_utility->append_lock_table_head(str)))
3859   {
3860     DBUG_RETURN(error_num);
3861   }
3862   while ((tmp_link_for_hash =
3863     (SPIDER_LINK_FOR_HASH *) my_hash_element(&lock_table_hash, 0)))
3864   {
3865     tmp_spider = tmp_link_for_hash->spider;
3866     tmp_link_idx = tmp_link_for_hash->link_idx;
3867     switch (tmp_spider->wide_handler->lock_type)
3868     {
3869       case TL_READ:
3870         lock_type = SPIDER_DB_TABLE_LOCK_READ_LOCAL;
3871         break;
3872       case TL_READ_NO_INSERT:
3873         lock_type = SPIDER_DB_TABLE_LOCK_READ;
3874         break;
3875       case TL_WRITE_LOW_PRIORITY:
3876         lock_type = SPIDER_DB_TABLE_LOCK_LOW_PRIORITY_WRITE;
3877         break;
3878       case TL_WRITE:
3879         lock_type = SPIDER_DB_TABLE_LOCK_WRITE;
3880         break;
3881       default:
3882         // no lock
3883         DBUG_PRINT("info",("spider lock_type=%d",
3884           tmp_spider->wide_handler->lock_type));
3885         DBUG_RETURN(0);
3886     }
3887     conn_link_idx = tmp_spider->conn_link_idx[tmp_link_idx];
3888     spider_mbase_share *db_share = (spider_mbase_share *)
3889       tmp_spider->share->dbton_share[conn->dbton_id];
3890     if (&db_share->db_names_str[conn_link_idx])
3891     {
3892       db_name = db_share->db_names_str[conn_link_idx].ptr();
3893       db_name_length = db_share->db_names_str[conn_link_idx].length();
3894       db_name_charset = tmp_spider->share->access_charset;
3895     } else {
3896       db_name = tmp_spider->share->tgt_dbs[conn_link_idx];
3897       db_name_length = tmp_spider->share->tgt_dbs_lengths[conn_link_idx];
3898       db_name_charset = system_charset_info;
3899     }
3900     if (&db_share->table_names_str[conn_link_idx])
3901     {
3902       table_name = db_share->table_names_str[conn_link_idx].ptr();
3903       table_name_length = db_share->table_names_str[conn_link_idx].length();
3904       table_name_charset = tmp_spider->share->access_charset;
3905     } else {
3906       table_name = tmp_spider->share->tgt_table_names[conn_link_idx];
3907       table_name_length =
3908         tmp_spider->share->tgt_table_names_lengths[conn_link_idx];
3909       table_name_charset = system_charset_info;
3910     }
3911     if ((error_num = spider_db_mbase_utility->
3912       append_lock_table_body(
3913         str,
3914         db_name,
3915         db_name_length,
3916         db_name_charset,
3917         table_name,
3918         table_name_length,
3919         table_name_charset,
3920         lock_type
3921       )
3922     )) {
3923       my_hash_reset(&lock_table_hash);
3924       DBUG_RETURN(error_num);
3925     }
3926 #ifdef HASH_UPDATE_WITH_HASH_VALUE
3927     my_hash_delete_with_hash_value(&lock_table_hash,
3928       tmp_link_for_hash->db_table_str_hash_value, (uchar*) tmp_link_for_hash);
3929 #else
3930     my_hash_delete(&lock_table_hash, (uchar*) tmp_link_for_hash);
3931 #endif
3932   }
3933   if ((error_num = spider_db_mbase_utility->append_lock_table_tail(str)))
3934   {
3935     DBUG_RETURN(error_num);
3936   }
3937   DBUG_RETURN(0);
3938 }
3939 
append_unlock_tables(spider_string * str)3940 int spider_db_mbase::append_unlock_tables(
3941   spider_string *str
3942 ) {
3943   int error_num;
3944   DBUG_ENTER("spider_db_mbase::append_unlock_tables");
3945   DBUG_PRINT("info",("spider this=%p", this));
3946   if ((error_num = spider_db_mbase_utility->append_unlock_table(str)))
3947   {
3948     DBUG_RETURN(error_num);
3949   }
3950   DBUG_RETURN(0);
3951 }
3952 
get_lock_table_hash_count()3953 uint spider_db_mbase::get_lock_table_hash_count()
3954 {
3955   DBUG_ENTER("spider_db_mbase::get_lock_table_hash_count");
3956   DBUG_PRINT("info",("spider this=%p", this));
3957   DBUG_RETURN(lock_table_hash.records);
3958 }
3959 
reset_lock_table_hash()3960 void spider_db_mbase::reset_lock_table_hash()
3961 {
3962   DBUG_ENTER("spider_db_mbase::reset_lock_table_hash");
3963   DBUG_PRINT("info",("spider this=%p", this));
3964   my_hash_reset(&lock_table_hash);
3965   DBUG_VOID_RETURN;
3966 }
3967 
get_opened_handler_count()3968 uint spider_db_mbase::get_opened_handler_count()
3969 {
3970   DBUG_ENTER("spider_db_mbase::get_opened_handler_count");
3971   DBUG_PRINT("info",("spider this=%p", this));
3972   DBUG_RETURN(handler_open_array.elements);
3973 }
3974 
reset_opened_handler()3975 void spider_db_mbase::reset_opened_handler()
3976 {
3977   ha_spider *tmp_spider;
3978   int tmp_link_idx;
3979   SPIDER_LINK_FOR_HASH **tmp_link_for_hash;
3980   DBUG_ENTER("spider_db_mbase::reset_opened_handler");
3981   DBUG_PRINT("info",("spider this=%p", this));
3982   while ((tmp_link_for_hash =
3983     (SPIDER_LINK_FOR_HASH **) pop_dynamic(&handler_open_array)))
3984   {
3985     tmp_spider = (*tmp_link_for_hash)->spider;
3986     tmp_link_idx = (*tmp_link_for_hash)->link_idx;
3987     tmp_spider->clear_handler_opened(tmp_link_idx, conn->conn_kind);
3988   }
3989   DBUG_VOID_RETURN;
3990 }
3991 
set_dup_key_idx(ha_spider * spider,int link_idx)3992 void spider_db_mbase::set_dup_key_idx(
3993   ha_spider *spider,
3994   int link_idx
3995 ) {
3996   TABLE *table = spider->get_table();
3997   uint roop_count, pk_idx = table->s->primary_key;
3998   int key_name_length;
3999   int max_length = 0;
4000   const char *key_name;
4001   DBUG_ENTER("spider_db_mbase::set_dup_key_idx");
4002   DBUG_PRINT("info",("spider this=%p", this));
4003   DBUG_PRINT("info",("spider error_str=%s", conn->error_str));
4004   for (roop_count = 0; roop_count < table->s->keys; roop_count++)
4005   {
4006     if (roop_count == pk_idx)
4007     {
4008       DBUG_PRINT("info",("spider pk_idx=%u", roop_count));
4009       int all_link_idx = spider->conn_link_idx[link_idx];
4010       key_name = spider->share->tgt_pk_names[all_link_idx];
4011       key_name_length = spider->share->tgt_pk_names_lengths[all_link_idx];
4012     } else {
4013 #ifdef SPIDER_use_LEX_CSTRING_for_KEY_Field_name
4014       key_name = table->key_info[roop_count].name.str;
4015       key_name_length = table->key_info[roop_count].name.length;
4016 #else
4017       key_name = table->key_info[roop_count].name;
4018       key_name_length = strlen(key_name);
4019 #endif
4020     }
4021     DBUG_PRINT("info",("spider key_name=%s", key_name));
4022     if (
4023       max_length < key_name_length &&
4024       conn->error_length - 1 >= key_name_length &&
4025       *(conn->error_str + conn->error_length - 2 -
4026         key_name_length) == '\'' &&
4027       !strncasecmp(conn->error_str +
4028         conn->error_length - 1 - key_name_length,
4029         key_name, key_name_length)
4030     ) {
4031       max_length = key_name_length;
4032       spider->dup_key_idx = roop_count;
4033     }
4034   }
4035   if (max_length == 0)
4036     spider->dup_key_idx = (uint) -1;
4037   DBUG_PRINT("info",("spider dup_key_idx=%d", spider->dup_key_idx));
4038   DBUG_VOID_RETURN;
4039 }
4040 
cmp_request_key_to_snd(st_spider_db_request_key * request_key)4041 bool spider_db_mbase::cmp_request_key_to_snd(
4042   st_spider_db_request_key *request_key
4043 ) {
4044   DBUG_ENTER("spider_db_mbase::cmp_request_key_to_snd");
4045   DBUG_PRINT("info",("spider this=%p", this));
4046   DBUG_RETURN(TRUE);
4047 }
4048 
spider_db_mbase_util()4049 spider_db_mbase_util::spider_db_mbase_util() : spider_db_util()
4050 {
4051   DBUG_ENTER("spider_db_mbase_util::spider_db_mbase_util");
4052   DBUG_PRINT("info",("spider this=%p", this));
4053   DBUG_VOID_RETURN;
4054 }
4055 
spider_db_mysql_util()4056 spider_db_mysql_util::spider_db_mysql_util() : spider_db_mbase_util()
4057 {
4058   DBUG_ENTER("spider_db_mysql_util::spider_db_mysql_util");
4059   DBUG_PRINT("info",("spider this=%p", this));
4060   DBUG_VOID_RETURN;
4061 }
4062 
spider_db_mariadb_util()4063 spider_db_mariadb_util::spider_db_mariadb_util() : spider_db_mbase_util()
4064 {
4065   DBUG_ENTER("spider_db_mariadb_util::spider_db_mariadb_util");
4066   DBUG_PRINT("info",("spider this=%p", this));
4067   DBUG_VOID_RETURN;
4068 }
4069 
~spider_db_mbase_util()4070 spider_db_mbase_util::~spider_db_mbase_util()
4071 {
4072   DBUG_ENTER("spider_db_mbase_util::~spider_db_mbase_util");
4073   DBUG_PRINT("info",("spider this=%p", this));
4074   DBUG_VOID_RETURN;
4075 }
4076 
~spider_db_mysql_util()4077 spider_db_mysql_util::~spider_db_mysql_util()
4078 {
4079   DBUG_ENTER("spider_db_mysql_util::~spider_db_mysql_util");
4080   DBUG_PRINT("info",("spider this=%p", this));
4081   DBUG_VOID_RETURN;
4082 }
4083 
~spider_db_mariadb_util()4084 spider_db_mariadb_util::~spider_db_mariadb_util()
4085 {
4086   DBUG_ENTER("spider_db_mariadb_util::~spider_db_mariadb_util");
4087   DBUG_PRINT("info",("spider this=%p", this));
4088   DBUG_VOID_RETURN;
4089 }
4090 
append_name(spider_string * str,const char * name,uint name_length)4091 int spider_db_mbase_util::append_name(
4092   spider_string *str,
4093   const char *name,
4094   uint name_length
4095 ) {
4096   DBUG_ENTER("spider_db_mbase_util::append_name");
4097   str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
4098   str->q_append(name, name_length);
4099   str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
4100   DBUG_RETURN(0);
4101 }
4102 
append_name_with_charset(spider_string * str,const char * name,uint name_length,CHARSET_INFO * name_charset)4103 int spider_db_mbase_util::append_name_with_charset(
4104   spider_string *str,
4105   const char *name,
4106   uint name_length,
4107   CHARSET_INFO *name_charset
4108 ) {
4109   DBUG_ENTER("spider_db_mbase_util::append_name_with_charset");
4110   if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN * 2 + name_length * 2))
4111     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4112   str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
4113   str->append(name, name_length, name_charset);
4114   if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN))
4115     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4116   str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
4117   DBUG_RETURN(0);
4118 }
4119 
append_escaped_name(spider_string * str,const char * name,uint name_length)4120 int spider_db_mbase_util::append_escaped_name(
4121   spider_string *str,
4122   const char *name,
4123   uint name_length
4124 ) {
4125   int error_num;
4126   DBUG_ENTER("spider_db_mbase_util::append_name");
4127   if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN * 2 + name_length * 2))
4128   {
4129     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4130   }
4131   str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
4132   if ((error_num = spider_db_append_name_with_quote_str_internal(
4133     str, name, name_length, dbton_id)))
4134   {
4135     DBUG_RETURN(error_num);
4136   }
4137   if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN))
4138   {
4139     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4140   }
4141   str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
4142   DBUG_RETURN(0);
4143 }
4144 
append_escaped_name_with_charset(spider_string * str,const char * name,uint name_length,CHARSET_INFO * name_charset)4145 int spider_db_mbase_util::append_escaped_name_with_charset(
4146   spider_string *str,
4147   const char *name,
4148   uint name_length,
4149   CHARSET_INFO *name_charset
4150 ) {
4151   int error_num;
4152   DBUG_ENTER("spider_db_mbase_util::append_name_with_charset");
4153   if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN * 2 + name_length * 2))
4154   {
4155     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4156   }
4157   str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
4158   if ((error_num = spider_db_append_name_with_quote_str_internal(
4159     str, name, name_length, name_charset, dbton_id)))
4160   {
4161     DBUG_RETURN(error_num);
4162   }
4163   if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN))
4164   {
4165     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4166   }
4167   str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
4168   DBUG_RETURN(0);
4169 }
4170 
is_name_quote(const char head_code)4171 bool spider_db_mbase_util::is_name_quote(
4172   const char head_code
4173 ) {
4174   DBUG_ENTER("spider_db_mbase_util::is_name_quote");
4175   DBUG_RETURN(head_code == *name_quote_str);
4176 }
4177 
append_escaped_name_quote(spider_string * str)4178 int spider_db_mbase_util::append_escaped_name_quote(
4179   spider_string *str
4180 ) {
4181   DBUG_ENTER("spider_db_mbase_util::append_escaped_name_quote");
4182   if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN * 2))
4183     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4184   str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
4185   str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
4186   DBUG_RETURN(0);
4187 }
4188 
append_column_value(ha_spider * spider,spider_string * str,Field * field,const uchar * new_ptr,CHARSET_INFO * access_charset)4189 int spider_db_mariadb_util::append_column_value(
4190   ha_spider *spider,
4191   spider_string *str,
4192   Field *field,
4193   const uchar *new_ptr,
4194   CHARSET_INFO *access_charset
4195 ) {
4196   bool float_value = FALSE;
4197   int error_num;
4198   char buf[MAX_FIELD_WIDTH];
4199   spider_string tmp_str(buf, MAX_FIELD_WIDTH, field->charset());
4200   String *ptr;
4201   uint length;
4202   THD *thd = field->table->in_use;
4203   Time_zone *saved_time_zone = thd->variables.time_zone;
4204   DBUG_ENTER("spider_db_mariadb_util::append_column_value");
4205   tmp_str.init_calc_mem(113);
4206 
4207   thd->variables.time_zone = UTC;
4208 
4209   if (new_ptr)
4210   {
4211     if (
4212       field->type() == MYSQL_TYPE_BLOB ||
4213       field->real_type() == MYSQL_TYPE_VARCHAR
4214     ) {
4215       length = uint2korr(new_ptr);
4216       tmp_str.set_quick((char *) new_ptr + HA_KEY_BLOB_LENGTH, length,
4217         field->charset());
4218       ptr = tmp_str.get_str();
4219     } else if (field->type() == MYSQL_TYPE_GEOMETRY)
4220     {
4221 /*
4222       uint mlength = SIZEOF_STORED_DOUBLE, lcnt;
4223       uchar *dest = (uchar *) buf;
4224       const uchar *source;
4225       for (lcnt = 0; lcnt < 4; lcnt++)
4226       {
4227         mlength = SIZEOF_STORED_DOUBLE;
4228         source = new_ptr + mlength + SIZEOF_STORED_DOUBLE * lcnt;
4229         while (mlength--)
4230           *dest++ = *--source;
4231       }
4232       tmp_str.length(SIZEOF_STORED_DOUBLE * lcnt);
4233 */
4234 #ifndef DBUG_OFF
4235       double xmin, xmax, ymin, ymax;
4236 /*
4237       float8store(buf,xmin);
4238       float8store(buf+8,xmax);
4239       float8store(buf+16,ymin);
4240       float8store(buf+24,ymax);
4241       memcpy(&xmin,new_ptr,sizeof(xmin));
4242       memcpy(&xmax,new_ptr + 8,sizeof(xmax));
4243       memcpy(&ymin,new_ptr + 16,sizeof(ymin));
4244       memcpy(&ymax,new_ptr + 24,sizeof(ymax));
4245       float8get(xmin, buf);
4246       float8get(xmax, buf + 8);
4247       float8get(ymin, buf + 16);
4248       float8get(ymax, buf + 24);
4249       DBUG_PRINT("info", ("spider geo is %f %f %f %f",
4250         xmin, xmax, ymin, ymax));
4251       DBUG_PRINT("info", ("spider geo is %.14g %.14g %.14g %.14g",
4252         xmin, xmax, ymin, ymax));
4253 */
4254       float8get(xmin, new_ptr);
4255       float8get(xmax, new_ptr + 8);
4256       float8get(ymin, new_ptr + 16);
4257       float8get(ymax, new_ptr + 24);
4258       DBUG_PRINT("info", ("spider geo is %f %f %f %f",
4259         xmin, xmax, ymin, ymax));
4260 /*
4261       float8get(xmin, new_ptr + SIZEOF_STORED_DOUBLE * 4);
4262       float8get(xmax, new_ptr + SIZEOF_STORED_DOUBLE * 5);
4263       float8get(ymin, new_ptr + SIZEOF_STORED_DOUBLE * 6);
4264       float8get(ymax, new_ptr + SIZEOF_STORED_DOUBLE * 7);
4265       DBUG_PRINT("info", ("spider geo is %f %f %f %f",
4266         xmin, xmax, ymin, ymax));
4267       float8get(xmin, new_ptr + SIZEOF_STORED_DOUBLE * 8);
4268       float8get(xmax, new_ptr + SIZEOF_STORED_DOUBLE * 9);
4269       float8get(ymin, new_ptr + SIZEOF_STORED_DOUBLE * 10);
4270       float8get(ymax, new_ptr + SIZEOF_STORED_DOUBLE * 11);
4271       DBUG_PRINT("info", ("spider geo is %f %f %f %f",
4272         xmin, xmax, ymin, ymax));
4273       float8get(xmin, new_ptr + SIZEOF_STORED_DOUBLE * 12);
4274       float8get(xmax, new_ptr + SIZEOF_STORED_DOUBLE * 13);
4275       float8get(ymin, new_ptr + SIZEOF_STORED_DOUBLE * 14);
4276       float8get(ymax, new_ptr + SIZEOF_STORED_DOUBLE * 15);
4277       DBUG_PRINT("info", ("spider geo is %f %f %f %f",
4278         xmin, xmax, ymin, ymax));
4279 */
4280 #endif
4281 /*
4282       tmp_str.set_quick((char *) new_ptr, SIZEOF_STORED_DOUBLE * 4,
4283         &my_charset_bin);
4284 */
4285       tmp_str.length(0);
4286       tmp_str.q_append((char *) SPIDER_SQL_LINESTRING_HEAD_STR,
4287         SPIDER_SQL_LINESTRING_HEAD_LEN);
4288       tmp_str.q_append((char *) new_ptr, SIZEOF_STORED_DOUBLE);
4289       tmp_str.q_append((char *) new_ptr + SIZEOF_STORED_DOUBLE * 2,
4290         SIZEOF_STORED_DOUBLE);
4291       tmp_str.q_append((char *) new_ptr + SIZEOF_STORED_DOUBLE,
4292         SIZEOF_STORED_DOUBLE);
4293       tmp_str.q_append((char *) new_ptr + SIZEOF_STORED_DOUBLE * 3,
4294         SIZEOF_STORED_DOUBLE);
4295       ptr = tmp_str.get_str();
4296     } else {
4297       ptr = field->val_str(tmp_str.get_str(), new_ptr);
4298       tmp_str.mem_calc();
4299     }
4300   } else {
4301     ptr = field->val_str(tmp_str.get_str());
4302     tmp_str.mem_calc();
4303     if (field->type() == MYSQL_TYPE_FLOAT)
4304     {
4305       float_value = TRUE;
4306     }
4307   }
4308 
4309   thd->variables.time_zone = saved_time_zone;
4310 
4311   DBUG_PRINT("info", ("spider field->type() is %d", field->type()));
4312   DBUG_PRINT("info", ("spider ptr->length() is %d", ptr->length()));
4313 /*
4314   if (
4315     field->type() == MYSQL_TYPE_BIT ||
4316     (field->type() >= MYSQL_TYPE_TINY_BLOB &&
4317       field->type() <= MYSQL_TYPE_BLOB)
4318   ) {
4319     uchar *hex_ptr = (uchar *) ptr->ptr(), *end_ptr;
4320     char *str_ptr;
4321     DBUG_PRINT("info", ("spider HEX"));
4322     if (str->reserve(SPIDER_SQL_HEX_LEN + ptr->length() * 2))
4323       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4324     str->q_append(SPIDER_SQL_HEX_STR, SPIDER_SQL_HEX_LEN);
4325     str_ptr = (char *) str->ptr() + str->length();
4326     for (end_ptr = hex_ptr + ptr->length(); hex_ptr < end_ptr; hex_ptr++)
4327     {
4328       *str_ptr++ = spider_dig_upper[(*hex_ptr) >> 4];
4329       *str_ptr++ = spider_dig_upper[(*hex_ptr) & 0x0F];
4330     }
4331     str->length(str->length() + ptr->length() * 2);
4332   } else
4333 */
4334   if (field->result_type() == STRING_RESULT)
4335   {
4336     DBUG_PRINT("info", ("spider STRING_RESULT"));
4337     if (str->charset() != field->charset())
4338     {
4339       if ((error_num = spider_db_append_charset_name_before_string(str,
4340         field->charset())))
4341       {
4342         DBUG_RETURN(error_num);
4343       }
4344     }
4345     if (str->reserve(SPIDER_SQL_VALUE_QUOTE_LEN))
4346       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4347     str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
4348     if (
4349       field->type() == MYSQL_TYPE_VARCHAR ||
4350       (field->type() >= MYSQL_TYPE_ENUM &&
4351         field->type() <= MYSQL_TYPE_GEOMETRY)
4352     ) {
4353       DBUG_PRINT("info", ("spider append_escaped"));
4354       char buf2[MAX_FIELD_WIDTH];
4355       spider_string tmp_str2(buf2, MAX_FIELD_WIDTH, field->charset());
4356       tmp_str2.init_calc_mem(114);
4357       tmp_str2.length(0);
4358       if (
4359         tmp_str2.append(ptr->ptr(), ptr->length(), field->charset()) ||
4360         str->reserve(tmp_str2.length() * 2) ||
4361         append_escaped_util(str, tmp_str2.get_str())
4362       )
4363         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4364     } else if (str->append(*ptr))
4365       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4366     if (str->reserve(SPIDER_SQL_VALUE_QUOTE_LEN))
4367       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4368     str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
4369   } else if (field->str_needs_quotes())
4370   {
4371     if (str->charset() != field->charset())
4372     {
4373       if ((error_num = spider_db_append_charset_name_before_string(str,
4374         field->charset())))
4375       {
4376         DBUG_RETURN(error_num);
4377       }
4378     }
4379     if (str->reserve(SPIDER_SQL_VALUE_QUOTE_LEN * 2 + ptr->length() * 2 + 2))
4380       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4381     str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
4382     append_escaped_util(str, ptr);
4383     str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
4384   } else if (float_value)
4385   {
4386     if (str->reserve(SPIDER_SQL_CAST_LEN + ptr->length() +
4387                      SPIDER_SQL_AS_FLOAT_LEN + SPIDER_SQL_CLOSE_PAREN_LEN))
4388     {
4389       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4390     }
4391     str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
4392     str->q_append(ptr->ptr(), ptr->length());
4393     str->q_append(SPIDER_SQL_AS_FLOAT_STR, SPIDER_SQL_AS_FLOAT_LEN);
4394     str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
4395   } else if (str->append(*ptr))
4396   {
4397     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4398   }
4399   DBUG_RETURN(0);
4400 }
4401 
append_column_value(ha_spider * spider,spider_string * str,Field * field,const uchar * new_ptr,CHARSET_INFO * access_charset)4402 int spider_db_mysql_util::append_column_value(
4403   ha_spider *spider,
4404   spider_string *str,
4405   Field *field,
4406   const uchar *new_ptr,
4407   CHARSET_INFO *access_charset
4408 ) {
4409   bool float_value = FALSE;
4410   int error_num;
4411   char buf[MAX_FIELD_WIDTH];
4412   spider_string tmp_str(buf, MAX_FIELD_WIDTH, field->charset());
4413   String *ptr;
4414   uint length;
4415   THD *thd = field->table->in_use;
4416   Time_zone *saved_time_zone = thd->variables.time_zone;
4417   DBUG_ENTER("spider_db_mysql_util::append_column_value");
4418   tmp_str.init_calc_mem(266);
4419 
4420   thd->variables.time_zone = UTC;
4421 
4422   if (new_ptr)
4423   {
4424     if (
4425       field->type() == MYSQL_TYPE_BLOB ||
4426       field->real_type() == MYSQL_TYPE_VARCHAR
4427     ) {
4428       length = uint2korr(new_ptr);
4429       tmp_str.set_quick((char *) new_ptr + HA_KEY_BLOB_LENGTH, length,
4430         field->charset());
4431       ptr = tmp_str.get_str();
4432     } else if (field->type() == MYSQL_TYPE_GEOMETRY)
4433     {
4434 /*
4435       uint mlength = SIZEOF_STORED_DOUBLE, lcnt;
4436       uchar *dest = (uchar *) buf;
4437       const uchar *source;
4438       for (lcnt = 0; lcnt < 4; lcnt++)
4439       {
4440         mlength = SIZEOF_STORED_DOUBLE;
4441         source = new_ptr + mlength + SIZEOF_STORED_DOUBLE * lcnt;
4442         while (mlength--)
4443           *dest++ = *--source;
4444       }
4445       tmp_str.length(SIZEOF_STORED_DOUBLE * lcnt);
4446 */
4447 #ifndef DBUG_OFF
4448       double xmin, xmax, ymin, ymax;
4449 /*
4450       float8store(buf,xmin);
4451       float8store(buf+8,xmax);
4452       float8store(buf+16,ymin);
4453       float8store(buf+24,ymax);
4454       memcpy(&xmin,new_ptr,sizeof(xmin));
4455       memcpy(&xmax,new_ptr + 8,sizeof(xmax));
4456       memcpy(&ymin,new_ptr + 16,sizeof(ymin));
4457       memcpy(&ymax,new_ptr + 24,sizeof(ymax));
4458       float8get(xmin, buf);
4459       float8get(xmax, buf + 8);
4460       float8get(ymin, buf + 16);
4461       float8get(ymax, buf + 24);
4462       DBUG_PRINT("info", ("spider geo is %f %f %f %f",
4463         xmin, xmax, ymin, ymax));
4464       DBUG_PRINT("info", ("spider geo is %.14g %.14g %.14g %.14g",
4465         xmin, xmax, ymin, ymax));
4466 */
4467       float8get(xmin, new_ptr);
4468       float8get(xmax, new_ptr + 8);
4469       float8get(ymin, new_ptr + 16);
4470       float8get(ymax, new_ptr + 24);
4471       DBUG_PRINT("info", ("spider geo is %f %f %f %f",
4472         xmin, xmax, ymin, ymax));
4473 /*
4474       float8get(xmin, new_ptr + SIZEOF_STORED_DOUBLE * 4);
4475       float8get(xmax, new_ptr + SIZEOF_STORED_DOUBLE * 5);
4476       float8get(ymin, new_ptr + SIZEOF_STORED_DOUBLE * 6);
4477       float8get(ymax, new_ptr + SIZEOF_STORED_DOUBLE * 7);
4478       DBUG_PRINT("info", ("spider geo is %f %f %f %f",
4479         xmin, xmax, ymin, ymax));
4480       float8get(xmin, new_ptr + SIZEOF_STORED_DOUBLE * 8);
4481       float8get(xmax, new_ptr + SIZEOF_STORED_DOUBLE * 9);
4482       float8get(ymin, new_ptr + SIZEOF_STORED_DOUBLE * 10);
4483       float8get(ymax, new_ptr + SIZEOF_STORED_DOUBLE * 11);
4484       DBUG_PRINT("info", ("spider geo is %f %f %f %f",
4485         xmin, xmax, ymin, ymax));
4486       float8get(xmin, new_ptr + SIZEOF_STORED_DOUBLE * 12);
4487       float8get(xmax, new_ptr + SIZEOF_STORED_DOUBLE * 13);
4488       float8get(ymin, new_ptr + SIZEOF_STORED_DOUBLE * 14);
4489       float8get(ymax, new_ptr + SIZEOF_STORED_DOUBLE * 15);
4490       DBUG_PRINT("info", ("spider geo is %f %f %f %f",
4491         xmin, xmax, ymin, ymax));
4492 */
4493 #endif
4494 /*
4495       tmp_str.set_quick((char *) new_ptr, SIZEOF_STORED_DOUBLE * 4,
4496         &my_charset_bin);
4497 */
4498       tmp_str.length(0);
4499       tmp_str.q_append((char *) SPIDER_SQL_LINESTRING_HEAD_STR,
4500         SPIDER_SQL_LINESTRING_HEAD_LEN);
4501       tmp_str.q_append((char *) new_ptr, SIZEOF_STORED_DOUBLE);
4502       tmp_str.q_append((char *) new_ptr + SIZEOF_STORED_DOUBLE * 2,
4503         SIZEOF_STORED_DOUBLE);
4504       tmp_str.q_append((char *) new_ptr + SIZEOF_STORED_DOUBLE,
4505         SIZEOF_STORED_DOUBLE);
4506       tmp_str.q_append((char *) new_ptr + SIZEOF_STORED_DOUBLE * 3,
4507         SIZEOF_STORED_DOUBLE);
4508       ptr = tmp_str.get_str();
4509     } else {
4510       ptr = field->val_str(tmp_str.get_str(), new_ptr);
4511       tmp_str.mem_calc();
4512     }
4513   } else {
4514     ptr = field->val_str(tmp_str.get_str());
4515     tmp_str.mem_calc();
4516     if (field->type() == MYSQL_TYPE_FLOAT)
4517     {
4518       float_value = TRUE;
4519     }
4520   }
4521 
4522   thd->variables.time_zone = saved_time_zone;
4523 
4524   DBUG_PRINT("info", ("spider field->type() is %d", field->type()));
4525   DBUG_PRINT("info", ("spider ptr->length() is %d", ptr->length()));
4526 /*
4527   if (
4528     field->type() == MYSQL_TYPE_BIT ||
4529     (field->type() >= MYSQL_TYPE_TINY_BLOB &&
4530       field->type() <= MYSQL_TYPE_BLOB)
4531   ) {
4532     uchar *hex_ptr = (uchar *) ptr->ptr(), *end_ptr;
4533     char *str_ptr;
4534     DBUG_PRINT("info", ("spider HEX"));
4535     if (str->reserve(SPIDER_SQL_HEX_LEN + ptr->length() * 2))
4536       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4537     str->q_append(SPIDER_SQL_HEX_STR, SPIDER_SQL_HEX_LEN);
4538     str_ptr = (char *) str->ptr() + str->length();
4539     for (end_ptr = hex_ptr + ptr->length(); hex_ptr < end_ptr; hex_ptr++)
4540     {
4541       *str_ptr++ = spider_dig_upper[(*hex_ptr) >> 4];
4542       *str_ptr++ = spider_dig_upper[(*hex_ptr) & 0x0F];
4543     }
4544     str->length(str->length() + ptr->length() * 2);
4545   } else
4546 */
4547   if (field->result_type() == STRING_RESULT)
4548   {
4549     DBUG_PRINT("info", ("spider STRING_RESULT"));
4550     if (str->charset() != field->charset())
4551     {
4552       if ((error_num = spider_db_append_charset_name_before_string(str,
4553         field->charset())))
4554       {
4555         DBUG_RETURN(error_num);
4556       }
4557     }
4558     if (str->reserve(SPIDER_SQL_VALUE_QUOTE_LEN))
4559       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4560     str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
4561     if (
4562       field->type() == MYSQL_TYPE_VARCHAR ||
4563       (field->type() >= MYSQL_TYPE_ENUM &&
4564         field->type() <= MYSQL_TYPE_GEOMETRY)
4565     ) {
4566       DBUG_PRINT("info", ("spider append_escaped"));
4567       char buf2[MAX_FIELD_WIDTH];
4568       spider_string tmp_str2(buf2, MAX_FIELD_WIDTH, field->charset());
4569       tmp_str2.init_calc_mem(267);
4570       tmp_str2.length(0);
4571       if (
4572         tmp_str2.append(ptr->ptr(), ptr->length(), field->charset()) ||
4573         str->reserve(tmp_str2.length() * 2) ||
4574         append_escaped_util(str, tmp_str2.get_str())
4575       )
4576         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4577     } else if (str->append(*ptr))
4578       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4579     if (str->reserve(SPIDER_SQL_VALUE_QUOTE_LEN))
4580       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4581     str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
4582   } else if (field->str_needs_quotes())
4583   {
4584     if (str->charset() != field->charset())
4585     {
4586       if ((error_num = spider_db_append_charset_name_before_string(str,
4587         field->charset())))
4588       {
4589         DBUG_RETURN(error_num);
4590       }
4591     }
4592     if (str->reserve(SPIDER_SQL_VALUE_QUOTE_LEN * 2 + ptr->length() * 2 + 2))
4593       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4594     str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
4595     append_escaped_util(str, ptr);
4596     str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
4597   } else if (float_value)
4598   {
4599     if (str->reserve(SPIDER_SQL_TO_FLOAT_LEN + ptr->length() +
4600       SPIDER_SQL_CLOSE_PAREN_LEN))
4601     {
4602       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4603     }
4604     str->q_append(SPIDER_SQL_TO_FLOAT_STR, SPIDER_SQL_TO_FLOAT_LEN);
4605     str->q_append(ptr->ptr(), ptr->length());
4606     str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
4607   } else if (str->append(*ptr))
4608   {
4609     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4610   }
4611   DBUG_RETURN(0);
4612 }
4613 
append_column_value(ha_spider * spider,spider_string * str,Field * field,const uchar * new_ptr,CHARSET_INFO * access_charset)4614 int spider_db_mbase_util::append_column_value(
4615   ha_spider *spider,
4616   spider_string *str,
4617   Field *field,
4618   const uchar *new_ptr,
4619   CHARSET_INFO *access_charset
4620 ) {
4621   DBUG_ENTER("spider_db_mbase_util::append_column_value");
4622   DBUG_ASSERT(0);
4623   DBUG_RETURN(0);
4624 }
4625 
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)4626 int spider_db_mbase_util::append_from_with_alias(
4627   spider_string *str,
4628   const char **table_names,
4629   uint *table_name_lengths,
4630   const char **table_aliases,
4631   uint *table_alias_lengths,
4632   uint table_count,
4633   int *table_name_pos,
4634   bool over_write
4635 ) {
4636   uint roop_count, length = 0;
4637   DBUG_ENTER("spider_db_mbase_util::append_from_with_alias");
4638   DBUG_PRINT("info",("spider this=%p", this));
4639   if (!over_write)
4640   {
4641     for (roop_count = 0; roop_count < table_count; roop_count++)
4642       length += table_name_lengths[roop_count] + SPIDER_SQL_SPACE_LEN +
4643         table_alias_lengths[roop_count] + SPIDER_SQL_COMMA_LEN;
4644     if (str->reserve(SPIDER_SQL_FROM_LEN + length))
4645       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4646     str->q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN);
4647     *table_name_pos = str->length();
4648   }
4649   for (roop_count = 0; roop_count < table_count; roop_count++)
4650   {
4651     str->q_append(table_names[roop_count], table_name_lengths[roop_count]);
4652     str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
4653     str->q_append(table_aliases[roop_count], table_alias_lengths[roop_count]);
4654     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
4655   }
4656   str->length(str->length() - SPIDER_SQL_COMMA_LEN);
4657   DBUG_RETURN(0);
4658 }
4659 
append_trx_isolation(spider_string * str,int trx_isolation)4660 int spider_db_mbase_util::append_trx_isolation(
4661   spider_string *str,
4662   int trx_isolation
4663 ) {
4664   DBUG_ENTER("spider_db_mbase_util::append_trx_isolation");
4665   DBUG_PRINT("info",("spider this=%p", this));
4666   if (str->reserve(SPIDER_SQL_SEMICOLON_LEN +
4667     SPIDER_SQL_ISO_READ_UNCOMMITTED_LEN))
4668     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4669   if (str->length())
4670   {
4671     str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
4672   }
4673   switch (trx_isolation)
4674   {
4675     case ISO_READ_UNCOMMITTED:
4676       str->q_append(SPIDER_SQL_ISO_READ_UNCOMMITTED_STR,
4677         SPIDER_SQL_ISO_READ_UNCOMMITTED_LEN);
4678       break;
4679     case ISO_READ_COMMITTED:
4680       str->q_append(SPIDER_SQL_ISO_READ_COMMITTED_STR,
4681         SPIDER_SQL_ISO_READ_COMMITTED_LEN);
4682       break;
4683     case ISO_REPEATABLE_READ:
4684       str->q_append(SPIDER_SQL_ISO_REPEATABLE_READ_STR,
4685         SPIDER_SQL_ISO_REPEATABLE_READ_LEN);
4686       break;
4687     case ISO_SERIALIZABLE:
4688       str->q_append(SPIDER_SQL_ISO_SERIALIZABLE_STR,
4689         SPIDER_SQL_ISO_SERIALIZABLE_LEN);
4690       break;
4691     default:
4692       DBUG_RETURN(HA_ERR_UNSUPPORTED);
4693   }
4694   DBUG_RETURN(0);
4695 }
4696 
append_autocommit(spider_string * str,bool autocommit)4697 int spider_db_mbase_util::append_autocommit(
4698   spider_string *str,
4699   bool autocommit
4700 ) {
4701   DBUG_ENTER("spider_db_mbase_util::append_autocommit");
4702   DBUG_PRINT("info",("spider this=%p", this));
4703   if (str->reserve(SPIDER_SQL_SEMICOLON_LEN + SPIDER_SQL_AUTOCOMMIT_OFF_LEN))
4704     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4705   if (str->length())
4706   {
4707     str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
4708   }
4709   if (autocommit)
4710   {
4711     str->q_append(SPIDER_SQL_AUTOCOMMIT_ON_STR,
4712       SPIDER_SQL_AUTOCOMMIT_ON_LEN);
4713   } else {
4714     str->q_append(SPIDER_SQL_AUTOCOMMIT_OFF_STR,
4715       SPIDER_SQL_AUTOCOMMIT_OFF_LEN);
4716   }
4717   DBUG_RETURN(0);
4718 }
4719 
append_sql_log_off(spider_string * str,bool sql_log_off)4720 int spider_db_mbase_util::append_sql_log_off(
4721   spider_string *str,
4722   bool sql_log_off
4723 ) {
4724   DBUG_ENTER("spider_db_mbase_util::append_sql_log_off");
4725   DBUG_PRINT("info",("spider this=%p", this));
4726   if (str->reserve(SPIDER_SQL_SEMICOLON_LEN + SPIDER_SQL_SQL_LOG_OFF_LEN))
4727     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4728   if (str->length())
4729   {
4730     str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
4731   }
4732   if (sql_log_off)
4733   {
4734     str->q_append(SPIDER_SQL_SQL_LOG_ON_STR, SPIDER_SQL_SQL_LOG_ON_LEN);
4735   } else {
4736     str->q_append(SPIDER_SQL_SQL_LOG_OFF_STR, SPIDER_SQL_SQL_LOG_OFF_LEN);
4737   }
4738   DBUG_RETURN(0);
4739 }
4740 
append_wait_timeout(spider_string * str,int wait_timeout)4741 int spider_db_mbase_util::append_wait_timeout(
4742   spider_string *str,
4743   int wait_timeout
4744 ) {
4745   char timeout_str[SPIDER_SQL_INT_LEN];
4746   int timeout_str_length;
4747   DBUG_ENTER("spider_db_mbase_util::append_wait_timeout");
4748   DBUG_PRINT("info",("spider this=%p", this));
4749   timeout_str_length =
4750     my_sprintf(timeout_str, (timeout_str, "%d", wait_timeout));
4751   if (str->reserve(SPIDER_SQL_SEMICOLON_LEN + SPIDER_SQL_WAIT_TIMEOUT_LEN +
4752     timeout_str_length))
4753   {
4754     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4755   }
4756   if (str->length())
4757   {
4758     str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
4759   }
4760   str->q_append(SPIDER_SQL_WAIT_TIMEOUT_STR, SPIDER_SQL_WAIT_TIMEOUT_LEN);
4761   str->q_append(timeout_str, timeout_str_length);
4762   DBUG_RETURN(0);
4763 }
4764 
4765 #define SPIDER_REAL_AS_FLOAT_STR              "real_as_float"
4766 #define SPIDER_REAL_AS_FLOAT_LEN              (sizeof(SPIDER_REAL_AS_FLOAT_STR) - 1)
4767 #define SPIDER_PIPES_AS_CONCAT_STR            "pipes_as_concat"
4768 #define SPIDER_PIPES_AS_CONCAT_LEN            (sizeof(SPIDER_PIPES_AS_CONCAT_STR) - 1)
4769 #define SPIDER_ANSI_QUOTES_STR                "ansi_quotes"
4770 #define SPIDER_ANSI_QUOTES_LEN                (sizeof(SPIDER_ANSI_QUOTES_STR) - 1)
4771 #define SPIDER_IGNORE_SPACE_STR               "ignore_space"
4772 #define SPIDER_IGNORE_SPACE_LEN               (sizeof(SPIDER_IGNORE_SPACE_STR) - 1)
4773 #define SPIDER_IGNORE_BAD_TABLE_OPTIONS_STR   "ignore_bad_table_options"
4774 #define SPIDER_IGNORE_BAD_TABLE_OPTIONS_LEN   (sizeof(SPIDER_IGNORE_BAD_TABLE_OPTIONS_STR) - 1)
4775 #define SPIDER_ONLY_FULL_GROUP_BY_STR         "only_full_group_by"
4776 #define SPIDER_ONLY_FULL_GROUP_BY_LEN         (sizeof(SPIDER_ONLY_FULL_GROUP_BY_STR) - 1)
4777 #define SPIDER_NO_UNSIGNED_SUBTRACTION_STR    "no_unsigned_subtraction"
4778 #define SPIDER_NO_UNSIGNED_SUBTRACTION_LEN    (sizeof(SPIDER_NO_UNSIGNED_SUBTRACTION_STR) - 1)
4779 #define SPIDER_NO_DIR_IN_CREATE_STR           "no_dir_in_create"
4780 #define SPIDER_NO_DIR_IN_CREATE_LEN           (sizeof(SPIDER_NO_DIR_IN_CREATE_STR) - 1)
4781 #define SPIDER_POSTGRESQL_STR                 "postgresql"
4782 #define SPIDER_POSTGRESQL_LEN                 (sizeof(SPIDER_POSTGRESQL_STR) - 1)
4783 #define SPIDER_ORACLE_STR                     "oracle"
4784 #define SPIDER_ORACLE_LEN                     (sizeof(SPIDER_ORACLE_STR) - 1)
4785 #define SPIDER_MSSQL_STR                      "mssql"
4786 #define SPIDER_MSSQL_LEN                      (sizeof(SPIDER_MSSQL_STR) - 1)
4787 #define SPIDER_DB2_STR                        "db2"
4788 #define SPIDER_DB2_LEN                        (sizeof(SPIDER_DB2_STR) - 1)
4789 #define SPIDER_MAXDB_STR                      "maxdb"
4790 #define SPIDER_MAXDB_LEN                      (sizeof(SPIDER_MAXDB_STR) - 1)
4791 #define SPIDER_NO_KEY_OPTIONS_STR             "no_key_options"
4792 #define SPIDER_NO_KEY_OPTIONS_LEN             (sizeof(SPIDER_NO_KEY_OPTIONS_STR) - 1)
4793 #define SPIDER_NO_TABLE_OPTIONS_STR           "no_table_options"
4794 #define SPIDER_NO_TABLE_OPTIONS_LEN           (sizeof(SPIDER_NO_TABLE_OPTIONS_STR) - 1)
4795 #define SPIDER_NO_FIELD_OPTIONS_STR           "no_field_options"
4796 #define SPIDER_NO_FIELD_OPTIONS_LEN           (sizeof(SPIDER_NO_FIELD_OPTIONS_STR) - 1)
4797 #define SPIDER_MYSQL323_STR                   "mysql323"
4798 #define SPIDER_MYSQL323_LEN                   (sizeof(SPIDER_MYSQL323_STR) - 1)
4799 #define SPIDER_MYSQL40_STR                    "mysql40"
4800 #define SPIDER_MYSQL40_LEN                    (sizeof(SPIDER_MYSQL40_STR) - 1)
4801 #define SPIDER_ANSI_STR                       "ansi"
4802 #define SPIDER_ANSI_LEN                       (sizeof(SPIDER_ANSI_STR) - 1)
4803 #define SPIDER_NO_AUTO_VALUE_ON_ZERO_STR      "no_auto_value_on_zero"
4804 #define SPIDER_NO_AUTO_VALUE_ON_ZERO_LEN      (sizeof(SPIDER_NO_AUTO_VALUE_ON_ZERO_STR) - 1)
4805 #define SPIDER_NO_BACKSLASH_ESCAPES_STR       "no_backslash_escapes"
4806 #define SPIDER_NO_BACKSLASH_ESCAPES_LEN       (sizeof(SPIDER_NO_BACKSLASH_ESCAPES_STR) - 1)
4807 #define SPIDER_STRICT_TRANS_TABLES_STR        "strict_trans_tables"
4808 #define SPIDER_STRICT_TRANS_TABLES_LEN        (sizeof(SPIDER_STRICT_TRANS_TABLES_STR) - 1)
4809 #define SPIDER_STRICT_ALL_TABLES_STR          "strict_all_tables"
4810 #define SPIDER_STRICT_ALL_TABLES_LEN          (sizeof(SPIDER_STRICT_ALL_TABLES_STR) - 1)
4811 #define SPIDER_NO_ZERO_IN_DATE_STR            "no_zero_in_date"
4812 #define SPIDER_NO_ZERO_IN_DATE_LEN            (sizeof(SPIDER_NO_ZERO_IN_DATE_STR) - 1)
4813 #define SPIDER_NO_ZERO_DATE_STR               "no_zero_date"
4814 #define SPIDER_NO_ZERO_DATE_LEN               (sizeof(SPIDER_NO_ZERO_DATE_STR) - 1)
4815 #define SPIDER_INVALID_DATES_STR              "allow_invalid_dates"
4816 #define SPIDER_INVALID_DATES_LEN              (sizeof(SPIDER_INVALID_DATES_STR) - 1)
4817 #define SPIDER_ERROR_FOR_DIVISION_BY_ZERO_STR "error_for_division_by_zero"
4818 #define SPIDER_ERROR_FOR_DIVISION_BY_ZERO_LEN (sizeof(SPIDER_ERROR_FOR_DIVISION_BY_ZERO_STR) - 1)
4819 #define SPIDER_TRADITIONAL_STR                "traditional"
4820 #define SPIDER_TRADITIONAL_LEN                (sizeof(SPIDER_TRADITIONAL_STR) - 1)
4821 #define SPIDER_NO_AUTO_CREATE_USER_STR        "no_auto_create_user"
4822 #define SPIDER_NO_AUTO_CREATE_USER_LEN        (sizeof(SPIDER_NO_AUTO_CREATE_USER_STR) - 1)
4823 #define SPIDER_HIGH_NOT_PRECEDENCE_STR        "high_not_precedence"
4824 #define SPIDER_HIGH_NOT_PRECEDENCE_LEN        (sizeof(SPIDER_HIGH_NOT_PRECEDENCE_STR) - 1)
4825 #define SPIDER_NO_ENGINE_SUBSTITUTION_STR     "no_engine_substitution"
4826 #define SPIDER_NO_ENGINE_SUBSTITUTION_LEN     (sizeof(SPIDER_NO_ENGINE_SUBSTITUTION_STR) - 1)
4827 #define SPIDER_PAD_CHAR_TO_FULL_LENGTH_STR    "pad_char_to_full_length"
4828 #define SPIDER_PAD_CHAR_TO_FULL_LENGTH_LEN    (sizeof(SPIDER_PAD_CHAR_TO_FULL_LENGTH_STR) - 1)
4829 #define SPIDER_EMPTY_STRING_IS_NULL_STR       "empty_string_is_null"
4830 #define SPIDER_EMPTY_STRING_IS_NULL_LEN       (sizeof(SPIDER_EMPTY_STRING_IS_NULL_STR) - 1)
4831 #define SPIDER_SIMULTANEOUS_ASSIGNMENT_STR    "simultaneous_assignment"
4832 #define SPIDER_SIMULTANEOUS_ASSIGNMENT_LEN    (sizeof(SPIDER_SIMULTANEOUS_ASSIGNMENT_STR) - 1)
4833 #define SPIDER_TIME_ROUND_FRACTIONAL_STR      "time_round_fractional"
4834 #define SPIDER_TIME_ROUND_FRACTIONAL_LEN      (sizeof(SPIDER_TIME_ROUND_FRACTIONAL_STR) - 1)
4835 
4836 sql_mode_t full_sql_mode =
4837 #ifdef MODE_REAL_AS_FLOAT
4838   MODE_REAL_AS_FLOAT |
4839 #endif
4840 #ifdef MODE_PIPES_AS_CONCAT
4841   MODE_PIPES_AS_CONCAT |
4842 #endif
4843 #ifdef MODE_ANSI_QUOTES
4844   MODE_ANSI_QUOTES |
4845 #endif
4846 #ifdef MODE_IGNORE_SPACE
4847   MODE_IGNORE_SPACE |
4848 #endif
4849 #ifdef MODE_IGNORE_BAD_TABLE_OPTIONS
4850   MODE_IGNORE_BAD_TABLE_OPTIONS |
4851 #endif
4852 #ifdef MODE_ONLY_FULL_GROUP_BY
4853   MODE_ONLY_FULL_GROUP_BY |
4854 #endif
4855 #ifdef MODE_NO_UNSIGNED_SUBTRACTION
4856   MODE_NO_UNSIGNED_SUBTRACTION |
4857 #endif
4858 #ifdef MODE_NO_DIR_IN_CREATE
4859   MODE_NO_DIR_IN_CREATE |
4860 #endif
4861 #ifdef MODE_POSTGRESQL
4862   MODE_POSTGRESQL |
4863 #endif
4864 #ifdef MODE_ORACLE
4865   MODE_ORACLE |
4866 #endif
4867 #ifdef MODE_MSSQL
4868   MODE_MSSQL |
4869 #endif
4870 #ifdef MODE_DB2
4871   MODE_DB2 |
4872 #endif
4873 #ifdef MODE_MAXDB
4874   MODE_MAXDB |
4875 #endif
4876 #ifdef MODE_NO_KEY_OPTIONS
4877   MODE_NO_KEY_OPTIONS |
4878 #endif
4879 #ifdef MODE_NO_TABLE_OPTIONS
4880   MODE_NO_TABLE_OPTIONS |
4881 #endif
4882 #ifdef MODE_NO_FIELD_OPTIONS
4883   MODE_NO_FIELD_OPTIONS |
4884 #endif
4885 #ifdef MODE_MYSQL323
4886   MODE_MYSQL323 |
4887 #endif
4888 #ifdef MODE_MYSQL40
4889   MODE_MYSQL40 |
4890 #endif
4891 #ifdef MODE_ANSI
4892   MODE_ANSI |
4893 #endif
4894 #ifdef MODE_NO_AUTO_VALUE_ON_ZERO
4895   MODE_NO_AUTO_VALUE_ON_ZERO |
4896 #endif
4897 #ifdef MODE_NO_BACKSLASH_ESCAPES
4898   MODE_NO_BACKSLASH_ESCAPES |
4899 #endif
4900 #ifdef MODE_STRICT_TRANS_TABLES
4901   MODE_STRICT_TRANS_TABLES |
4902 #endif
4903 #ifdef MODE_STRICT_ALL_TABLES
4904   MODE_STRICT_ALL_TABLES |
4905 #endif
4906 #ifdef MODE_NO_ZERO_IN_DATE
4907   MODE_NO_ZERO_IN_DATE |
4908 #endif
4909 #ifdef MODE_NO_ZERO_DATE
4910   MODE_NO_ZERO_DATE |
4911 #endif
4912 #ifdef MODE_INVALID_DATES
4913   MODE_INVALID_DATES |
4914 #endif
4915 #ifdef MODE_ERROR_FOR_DIVISION_BY_ZERO
4916   MODE_ERROR_FOR_DIVISION_BY_ZERO |
4917 #endif
4918 #ifdef MODE_TRADITIONAL
4919   MODE_TRADITIONAL |
4920 #endif
4921 #ifdef MODE_NO_AUTO_CREATE_USER
4922   MODE_NO_AUTO_CREATE_USER |
4923 #endif
4924 #ifdef MODE_HIGH_NOT_PRECEDENCE
4925   MODE_HIGH_NOT_PRECEDENCE |
4926 #endif
4927 #ifdef MODE_NO_ENGINE_SUBSTITUTION
4928   MODE_NO_ENGINE_SUBSTITUTION |
4929 #endif
4930 #ifdef MODE_PAD_CHAR_TO_FULL_LENGTH
4931   MODE_PAD_CHAR_TO_FULL_LENGTH |
4932 #endif
4933 #ifdef MODE_EMPTY_STRING_IS_NULL
4934   MODE_EMPTY_STRING_IS_NULL |
4935 #endif
4936 #ifdef MODE_SIMULTANEOUS_ASSIGNMENT
4937   MODE_SIMULTANEOUS_ASSIGNMENT |
4938 #endif
4939 #ifdef MODE_TIME_ROUND_FRACTIONAL
4940   MODE_TIME_ROUND_FRACTIONAL |
4941 #endif
4942   0;
4943 
4944 #ifdef MODE_REAL_AS_FLOAT
4945 /* pushdown */
4946 #define SPIDER_SQL_MODE_REAL_AS_FLOAT
4947 #endif
4948 #ifdef MODE_PIPES_AS_CONCAT
4949 /* no pushdown */
4950 #endif
4951 #ifdef MODE_ANSI_QUOTES
4952 /* no pushdown */
4953 #endif
4954 #ifdef MODE_IGNORE_SPACE
4955 /* no pushdown */
4956 #endif
4957 #ifdef MODE_IGNORE_BAD_TABLE_OPTIONS
4958 /* pushdown */
4959 #define SPIDER_SQL_MODE_IGNORE_BAD_TABLE_OPTIONS
4960 #endif
4961 #ifdef MODE_ONLY_FULL_GROUP_BY
4962 /* no pushdown */
4963 #endif
4964 #ifdef MODE_NO_UNSIGNED_SUBTRACTION
4965 /* pushdown */
4966 #define SPIDER_SQL_MODE_NO_UNSIGNED_SUBTRACTION
4967 #endif
4968 #ifdef MODE_NO_DIR_IN_CREATE
4969 /* pushdown */
4970 #define SPIDER_SQL_MODE_NO_DIR_IN_CREATE
4971 #endif
4972 #ifdef MODE_POSTGRESQL
4973 /* no pushdown */
4974 #endif
4975 #ifdef MODE_ORACLE
4976 /* no pushdown */
4977 #endif
4978 #ifdef MODE_MSSQL
4979 /* no pushdown */
4980 #endif
4981 #ifdef MODE_DB2
4982 /* no pushdown */
4983 #endif
4984 #ifdef MODE_MAXDB
4985 /* no pushdown */
4986 #endif
4987 #ifdef MODE_NO_KEY_OPTIONS
4988 /* no pushdown */
4989 #endif
4990 #ifdef MODE_NO_TABLE_OPTIONS
4991 /* no pushdown */
4992 #endif
4993 #ifdef MODE_NO_FIELD_OPTIONS
4994 /* no pushdown */
4995 #endif
4996 #ifdef MODE_MYSQL323
4997 /* no pushdown */
4998 #endif
4999 #ifdef MODE_MYSQL40
5000 /* no pushdown */
5001 #endif
5002 #ifdef MODE_ANSI
5003 /* no pushdown */
5004 #endif
5005 #ifdef MODE_NO_AUTO_VALUE_ON_ZERO
5006 /* pushdown */
5007 #define SPIDER_SQL_MODE_NO_AUTO_VALUE_ON_ZERO
5008 #endif
5009 #ifdef MODE_NO_BACKSLASH_ESCAPES
5010 /* no pushdown */
5011 #endif
5012 #ifdef MODE_STRICT_TRANS_TABLES
5013 /* pushdown */
5014 #define SPIDER_SQL_MODE_STRICT_TRANS_TABLES
5015 #endif
5016 #ifdef MODE_STRICT_ALL_TABLES
5017 /* pushdown */
5018 #define SPIDER_SQL_MODE_STRICT_ALL_TABLES
5019 #endif
5020 #ifdef MODE_NO_ZERO_IN_DATE
5021 /* pushdown */
5022 #define SPIDER_SQL_MODE_NO_ZERO_IN_DATE
5023 #endif
5024 #ifdef MODE_NO_ZERO_DATE
5025 /* pushdown */
5026 #define SPIDER_SQL_MODE_NO_ZERO_DATE
5027 #endif
5028 #ifdef MODE_INVALID_DATES
5029 /* pushdown */
5030 #define SPIDER_SQL_MODE_INVALID_DATES
5031 #endif
5032 #ifdef MODE_ERROR_FOR_DIVISION_BY_ZERO
5033 /* pushdown */
5034 #define SPIDER_SQL_MODE_ERROR_FOR_DIVISION_BY_ZERO
5035 #endif
5036 #ifdef MODE_TRADITIONAL
5037 /* no pushdown */
5038 #endif
5039 #ifdef MODE_NO_AUTO_CREATE_USER
5040 /* pushdown */
5041 #define SPIDER_SQL_MODE_NO_AUTO_CREATE_USER
5042 #endif
5043 #ifdef MODE_HIGH_NOT_PRECEDENCE
5044 /* pushdown */
5045 #define SPIDER_SQL_MODE_HIGH_NOT_PRECEDENCE
5046 #endif
5047 #ifdef MODE_NO_ENGINE_SUBSTITUTION
5048 /* pushdown */
5049 #define SPIDER_SQL_MODE_NO_ENGINE_SUBSTITUTION
5050 #endif
5051 #ifdef MODE_PAD_CHAR_TO_FULL_LENGTH
5052 /* pushdown */
5053 #define SPIDER_SQL_MODE_PAD_CHAR_TO_FULL_LENGTH
5054 #endif
5055 #ifdef MODE_EMPTY_STRING_IS_NULL
5056 /* pushdown */
5057 #define SPIDER_SQL_MODE_EMPTY_STRING_IS_NULL
5058 #endif
5059 #ifdef MODE_SIMULTANEOUS_ASSIGNMENT
5060 /* pushdown */
5061 #define SPIDER_SQL_MODE_SIMULTANEOUS_ASSIGNMENT
5062 #endif
5063 #ifdef MODE_TIME_ROUND_FRACTIONAL
5064 /* pushdown */
5065 #define SPIDER_SQL_MODE_TIME_ROUND_FRACTIONAL
5066 #endif
5067 
5068 sql_mode_t pushdown_sql_mode =
5069 #ifdef SPIDER_SQL_MODE_REAL_AS_FLOAT
5070   MODE_REAL_AS_FLOAT |
5071 #endif
5072 #ifdef SPIDER_SQL_MODE_PIPES_AS_CONCAT
5073   MODE_PIPES_AS_CONCAT |
5074 #endif
5075 #ifdef SPIDER_SQL_MODE_ANSI_QUOTES
5076   MODE_ANSI_QUOTES |
5077 #endif
5078 #ifdef SPIDER_SQL_MODE_IGNORE_SPACE
5079   MODE_IGNORE_SPACE |
5080 #endif
5081 #ifdef SPIDER_SQL_MODE_IGNORE_BAD_TABLE_OPTIONS
5082   MODE_IGNORE_BAD_TABLE_OPTIONS |
5083 #endif
5084 #ifdef SPIDER_SQL_MODE_ONLY_FULL_GROUP_BY
5085   MODE_ONLY_FULL_GROUP_BY |
5086 #endif
5087 #ifdef SPIDER_SQL_MODE_NO_UNSIGNED_SUBTRACTION
5088   MODE_NO_UNSIGNED_SUBTRACTION |
5089 #endif
5090 #ifdef SPIDER_SQL_MODE_NO_DIR_IN_CREATE
5091   MODE_NO_DIR_IN_CREATE |
5092 #endif
5093 #ifdef SPIDER_SQL_MODE_POSTGRESQL
5094   MODE_POSTGRESQL |
5095 #endif
5096 #ifdef SPIDER_SQL_MODE_ORACLE
5097   MODE_ORACLE |
5098 #endif
5099 #ifdef SPIDER_SQL_MODE_MSSQL
5100   MODE_MSSQL |
5101 #endif
5102 #ifdef SPIDER_SQL_MODE_DB2
5103   MODE_DB2 |
5104 #endif
5105 #ifdef SPIDER_SQL_MODE_MAXDB
5106   MODE_MAXDB |
5107 #endif
5108 #ifdef SPIDER_SQL_MODE_NO_KEY_OPTIONS
5109   MODE_NO_KEY_OPTIONS |
5110 #endif
5111 #ifdef SPIDER_SQL_MODE_NO_TABLE_OPTIONS
5112   MODE_NO_TABLE_OPTIONS |
5113 #endif
5114 #ifdef SPIDER_SQL_MODE_NO_FIELD_OPTIONS
5115   MODE_NO_FIELD_OPTIONS |
5116 #endif
5117 #ifdef SPIDER_SQL_MODE_MYSQL323
5118   MODE_MYSQL323 |
5119 #endif
5120 #ifdef SPIDER_SQL_MODE_MYSQL40
5121   MODE_MYSQL40 |
5122 #endif
5123 #ifdef SPIDER_SQL_MODE_ANSI
5124   MODE_ANSI |
5125 #endif
5126 #ifdef SPIDER_SQL_MODE_NO_AUTO_VALUE_ON_ZERO
5127   MODE_NO_AUTO_VALUE_ON_ZERO |
5128 #endif
5129 #ifdef SPIDER_SQL_MODE_NO_BACKSLASH_ESCAPES
5130   MODE_NO_BACKSLASH_ESCAPES |
5131 #endif
5132 #ifdef SPIDER_SQL_MODE_STRICT_TRANS_TABLES
5133   MODE_STRICT_TRANS_TABLES |
5134 #endif
5135 #ifdef SPIDER_SQL_MODE_STRICT_ALL_TABLES
5136   MODE_STRICT_ALL_TABLES |
5137 #endif
5138 #ifdef SPIDER_SQL_MODE_NO_ZERO_IN_DATE
5139   MODE_NO_ZERO_IN_DATE |
5140 #endif
5141 #ifdef SPIDER_SQL_MODE_NO_ZERO_DATE
5142   MODE_NO_ZERO_DATE |
5143 #endif
5144 #ifdef SPIDER_SQL_MODE_INVALID_DATES
5145   MODE_INVALID_DATES |
5146 #endif
5147 #ifdef SPIDER_SQL_MODE_ERROR_FOR_DIVISION_BY_ZERO
5148   MODE_ERROR_FOR_DIVISION_BY_ZERO |
5149 #endif
5150 #ifdef SPIDER_SQL_MODE_TRADITIONAL
5151   MODE_TRADITIONAL |
5152 #endif
5153 #ifdef SPIDER_SQL_MODE_NO_AUTO_CREATE_USER
5154   MODE_NO_AUTO_CREATE_USER |
5155 #endif
5156 #ifdef SPIDER_SQL_MODE_HIGH_NOT_PRECEDENCE
5157   MODE_HIGH_NOT_PRECEDENCE |
5158 #endif
5159 #ifdef SPIDER_SQL_MODE_NO_ENGINE_SUBSTITUTION
5160   MODE_NO_ENGINE_SUBSTITUTION |
5161 #endif
5162 #ifdef SPIDER_SQL_MODE_PAD_CHAR_TO_FULL_LENGTH
5163   MODE_PAD_CHAR_TO_FULL_LENGTH |
5164 #endif
5165 #ifdef SPIDER_SQL_MODE_EMPTY_STRING_IS_NULL
5166   MODE_EMPTY_STRING_IS_NULL |
5167 #endif
5168 #ifdef SPIDER_SQL_MODE_SIMULTANEOUS_ASSIGNMENT
5169   MODE_SIMULTANEOUS_ASSIGNMENT |
5170 #endif
5171 #ifdef SPIDER_SQL_MODE_TIME_ROUND_FRACTIONAL
5172   MODE_TIME_ROUND_FRACTIONAL |
5173 #endif
5174   0;
5175 
append_sql_mode_internal(spider_string * str,sql_mode_t sql_mode)5176 int spider_db_mbase_util::append_sql_mode_internal(
5177   spider_string *str,
5178   sql_mode_t sql_mode
5179 ) {
5180   DBUG_ENTER("spider_db_mbase_util::append_sql_mode_internal");
5181   DBUG_PRINT("info",("spider this=%p", this));
5182 #ifdef SPIDER_SQL_MODE_REAL_AS_FLOAT
5183   if (sql_mode & MODE_REAL_AS_FLOAT)
5184   {
5185     if (str->reserve(SPIDER_REAL_AS_FLOAT_LEN + SPIDER_SQL_COMMA_LEN))
5186     {
5187       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5188     }
5189     str->q_append(SPIDER_REAL_AS_FLOAT_STR, SPIDER_REAL_AS_FLOAT_LEN);
5190     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5191   }
5192 #endif
5193 #ifdef SPIDER_SQL_MODE_PIPES_AS_CONCAT
5194   if (sql_mode & MODE_PIPES_AS_CONCAT)
5195   {
5196     if (str->reserve(SPIDER_PIPES_AS_CONCAT_LEN + SPIDER_SQL_COMMA_LEN))
5197     {
5198       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5199     }
5200     str->q_append(SPIDER_PIPES_AS_CONCAT_STR, SPIDER_PIPES_AS_CONCAT_LEN);
5201     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5202   }
5203 #endif
5204 #ifdef SPIDER_SQL_MODE_ANSI_QUOTES
5205   if (sql_mode & MODE_ANSI_QUOTES)
5206   {
5207     if (str->reserve(SPIDER_ANSI_QUOTES_LEN + SPIDER_SQL_COMMA_LEN))
5208     {
5209       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5210     }
5211     str->q_append(SPIDER_ANSI_QUOTES_STR, SPIDER_ANSI_QUOTES_LEN);
5212     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5213   }
5214 #endif
5215 #ifdef SPIDER_SQL_MODE_IGNORE_SPACE
5216   if (sql_mode & MODE_IGNORE_SPACE)
5217   {
5218     if (str->reserve(SPIDER_IGNORE_SPACE_LEN + SPIDER_SQL_COMMA_LEN))
5219     {
5220       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5221     }
5222     str->q_append(SPIDER_IGNORE_SPACE_STR, SPIDER_IGNORE_SPACE_LEN);
5223     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5224   }
5225 #endif
5226 #ifdef SPIDER_SQL_MODE_IGNORE_BAD_TABLE_OPTIONS
5227   if (sql_mode & MODE_IGNORE_BAD_TABLE_OPTIONS)
5228   {
5229     if (str->reserve(SPIDER_IGNORE_BAD_TABLE_OPTIONS_LEN + SPIDER_SQL_COMMA_LEN))
5230     {
5231       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5232     }
5233     str->q_append(SPIDER_IGNORE_BAD_TABLE_OPTIONS_STR, SPIDER_IGNORE_BAD_TABLE_OPTIONS_LEN);
5234     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5235   }
5236 #endif
5237 #ifdef SPIDER_SQL_MODE_ONLY_FULL_GROUP_BY
5238   if (sql_mode & MODE_ONLY_FULL_GROUP_BY)
5239   {
5240     if (str->reserve(SPIDER_ONLY_FULL_GROUP_BY_LEN + SPIDER_SQL_COMMA_LEN))
5241     {
5242       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5243     }
5244     str->q_append(SPIDER_ONLY_FULL_GROUP_BY_STR, SPIDER_ONLY_FULL_GROUP_BY_LEN);
5245     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5246   }
5247 #endif
5248 #ifdef SPIDER_SQL_MODE_NO_UNSIGNED_SUBTRACTION
5249   if (sql_mode & MODE_NO_UNSIGNED_SUBTRACTION)
5250   {
5251     if (str->reserve(SPIDER_NO_UNSIGNED_SUBTRACTION_LEN + SPIDER_SQL_COMMA_LEN))
5252     {
5253       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5254     }
5255     str->q_append(SPIDER_NO_UNSIGNED_SUBTRACTION_STR, SPIDER_NO_UNSIGNED_SUBTRACTION_LEN);
5256     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5257   }
5258 #endif
5259 #ifdef SPIDER_SQL_MODE_NO_DIR_IN_CREATE
5260   if (sql_mode & MODE_NO_DIR_IN_CREATE)
5261   {
5262     if (str->reserve(SPIDER_NO_DIR_IN_CREATE_LEN + SPIDER_SQL_COMMA_LEN))
5263     {
5264       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5265     }
5266     str->q_append(SPIDER_NO_DIR_IN_CREATE_STR, SPIDER_NO_DIR_IN_CREATE_LEN);
5267     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5268   }
5269 #endif
5270 #ifdef SPIDER_SQL_MODE_POSTGRESQL
5271   if (sql_mode & MODE_POSTGRESQL)
5272   {
5273     if (str->reserve(SPIDER_POSTGRESQL_LEN + SPIDER_SQL_COMMA_LEN))
5274     {
5275       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5276     }
5277     str->q_append(SPIDER_POSTGRESQL_STR, SPIDER_POSTGRESQL_LEN);
5278     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5279   }
5280 #endif
5281 #ifdef SPIDER_SQL_MODE_ORACLE
5282   if (sql_mode & MODE_ORACLE)
5283   {
5284     if (str->reserve(SPIDER_ORACLE_LEN + SPIDER_SQL_COMMA_LEN))
5285     {
5286       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5287     }
5288     str->q_append(SPIDER_ORACLE_STR, SPIDER_ORACLE_LEN);
5289     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5290   }
5291 #endif
5292 #ifdef SPIDER_SQL_MODE_MSSQL
5293   if (sql_mode & MODE_MSSQL)
5294   {
5295     if (str->reserve(SPIDER_MSSQL_LEN + SPIDER_SQL_COMMA_LEN))
5296     {
5297       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5298     }
5299     str->q_append(SPIDER_MSSQL_STR, SPIDER_MSSQL_LEN);
5300     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5301   }
5302 #endif
5303 #ifdef SPIDER_SQL_MODE_DB2
5304   if (sql_mode & MODE_DB2)
5305   {
5306     if (str->reserve(SPIDER_DB2_LEN + SPIDER_SQL_COMMA_LEN))
5307     {
5308       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5309     }
5310     str->q_append(SPIDER_DB2_STR, SPIDER_DB2_LEN);
5311     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5312   }
5313 #endif
5314 #ifdef SPIDER_SQL_MODE_MAXDB
5315   if (sql_mode & MODE_MAXDB)
5316   {
5317     if (str->reserve(SPIDER_MAXDB_LEN + SPIDER_SQL_COMMA_LEN))
5318     {
5319       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5320     }
5321     str->q_append(SPIDER_MAXDB_STR, SPIDER_MAXDB_LEN);
5322     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5323   }
5324 #endif
5325 #ifdef SPIDER_SQL_MODE_NO_KEY_OPTIONS
5326   if (sql_mode & MODE_NO_KEY_OPTIONS)
5327   {
5328     if (str->reserve(SPIDER_NO_KEY_OPTIONS_LEN + SPIDER_SQL_COMMA_LEN))
5329     {
5330       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5331     }
5332     str->q_append(SPIDER_NO_KEY_OPTIONS_STR, SPIDER_NO_KEY_OPTIONS_LEN);
5333     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5334   }
5335 #endif
5336 #ifdef SPIDER_SQL_MODE_NO_TABLE_OPTIONS
5337   if (sql_mode & MODE_NO_TABLE_OPTIONS)
5338   {
5339     if (str->reserve(SPIDER_NO_TABLE_OPTIONS_LEN + SPIDER_SQL_COMMA_LEN))
5340     {
5341       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5342     }
5343     str->q_append(SPIDER_NO_TABLE_OPTIONS_STR, SPIDER_NO_TABLE_OPTIONS_LEN);
5344     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5345   }
5346 #endif
5347 #ifdef SPIDER_SQL_MODE_NO_FIELD_OPTIONS
5348   if (sql_mode & MODE_NO_FIELD_OPTIONS)
5349   {
5350     if (str->reserve(SPIDER_NO_FIELD_OPTIONS_LEN + SPIDER_SQL_COMMA_LEN))
5351     {
5352       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5353     }
5354     str->q_append(SPIDER_NO_FIELD_OPTIONS_STR, SPIDER_NO_FIELD_OPTIONS_LEN);
5355     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5356   }
5357 #endif
5358 #ifdef SPIDER_SQL_MODE_MYSQL323
5359   if (sql_mode & MODE_MYSQL323)
5360   {
5361     if (str->reserve(SPIDER_MYSQL323_LEN + SPIDER_SQL_COMMA_LEN))
5362     {
5363       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5364     }
5365     str->q_append(SPIDER_MYSQL323_STR, SPIDER_MYSQL323_LEN);
5366     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5367   }
5368 #endif
5369 #ifdef SPIDER_SQL_MODE_MYSQL40
5370   if (sql_mode & MODE_MYSQL40)
5371   {
5372     if (str->reserve(SPIDER_MYSQL40_LEN + SPIDER_SQL_COMMA_LEN))
5373     {
5374       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5375     }
5376     str->q_append(SPIDER_MYSQL40_STR, SPIDER_MYSQL40_LEN);
5377     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5378   }
5379 #endif
5380 #ifdef SPIDER_SQL_MODE_ANSI
5381   if (sql_mode & MODE_ANSI)
5382   {
5383     if (str->reserve(SPIDER_ANSI_LEN + SPIDER_SQL_COMMA_LEN))
5384     {
5385       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5386     }
5387     str->q_append(SPIDER_ANSI_STR, SPIDER_ANSI_LEN);
5388     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5389   }
5390 #endif
5391 #ifdef SPIDER_SQL_MODE_NO_AUTO_VALUE_ON_ZERO
5392   if (sql_mode & MODE_NO_AUTO_VALUE_ON_ZERO)
5393   {
5394     if (str->reserve(SPIDER_NO_AUTO_VALUE_ON_ZERO_LEN + SPIDER_SQL_COMMA_LEN))
5395     {
5396       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5397     }
5398     str->q_append(SPIDER_NO_AUTO_VALUE_ON_ZERO_STR, SPIDER_NO_AUTO_VALUE_ON_ZERO_LEN);
5399     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5400   }
5401 #endif
5402 #ifdef SPIDER_SQL_MODE_NO_BACKSLASH_ESCAPES
5403   if (sql_mode & MODE_NO_BACKSLASH_ESCAPES)
5404   {
5405     if (str->reserve(SPIDER_NO_BACKSLASH_ESCAPES_LEN + SPIDER_SQL_COMMA_LEN))
5406     {
5407       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5408     }
5409     str->q_append(SPIDER_NO_BACKSLASH_ESCAPES_STR, SPIDER_NO_BACKSLASH_ESCAPES_LEN);
5410     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5411   }
5412 #endif
5413 #ifdef SPIDER_SQL_MODE_STRICT_TRANS_TABLES
5414   if (sql_mode & MODE_STRICT_TRANS_TABLES)
5415   {
5416     if (str->reserve(SPIDER_STRICT_TRANS_TABLES_LEN + SPIDER_SQL_COMMA_LEN))
5417     {
5418       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5419     }
5420     str->q_append(SPIDER_STRICT_TRANS_TABLES_STR, SPIDER_STRICT_TRANS_TABLES_LEN);
5421     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5422   }
5423 #endif
5424 #ifdef SPIDER_SQL_MODE_STRICT_ALL_TABLES
5425   if (sql_mode & MODE_STRICT_ALL_TABLES)
5426   {
5427     if (str->reserve(SPIDER_STRICT_ALL_TABLES_LEN + SPIDER_SQL_COMMA_LEN))
5428     {
5429       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5430     }
5431     str->q_append(SPIDER_STRICT_ALL_TABLES_STR, SPIDER_STRICT_ALL_TABLES_LEN);
5432     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5433   }
5434 #endif
5435 #ifdef SPIDER_SQL_MODE_NO_ZERO_IN_DATE
5436   if (sql_mode & MODE_NO_ZERO_IN_DATE)
5437   {
5438     if (str->reserve(SPIDER_NO_ZERO_IN_DATE_LEN + SPIDER_SQL_COMMA_LEN))
5439     {
5440       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5441     }
5442     str->q_append(SPIDER_NO_ZERO_IN_DATE_STR, SPIDER_NO_ZERO_IN_DATE_LEN);
5443     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5444   }
5445 #endif
5446 #ifdef SPIDER_SQL_MODE_NO_ZERO_DATE
5447   if (sql_mode & MODE_NO_ZERO_DATE)
5448   {
5449     if (str->reserve(SPIDER_NO_ZERO_DATE_LEN + SPIDER_SQL_COMMA_LEN))
5450     {
5451       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5452     }
5453     str->q_append(SPIDER_NO_ZERO_DATE_STR, SPIDER_NO_ZERO_DATE_LEN);
5454     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5455   }
5456 #endif
5457 #ifdef SPIDER_SQL_MODE_INVALID_DATES
5458   if (sql_mode & MODE_INVALID_DATES)
5459   {
5460     if (str->reserve(SPIDER_INVALID_DATES_LEN + SPIDER_SQL_COMMA_LEN))
5461     {
5462       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5463     }
5464     str->q_append(SPIDER_INVALID_DATES_STR, SPIDER_INVALID_DATES_LEN);
5465     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5466   }
5467 #endif
5468 #ifdef SPIDER_SQL_MODE_ERROR_FOR_DIVISION_BY_ZERO
5469   if (sql_mode & MODE_ERROR_FOR_DIVISION_BY_ZERO)
5470   {
5471     if (str->reserve(SPIDER_ERROR_FOR_DIVISION_BY_ZERO_LEN + SPIDER_SQL_COMMA_LEN))
5472     {
5473       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5474     }
5475     str->q_append(SPIDER_ERROR_FOR_DIVISION_BY_ZERO_STR, SPIDER_ERROR_FOR_DIVISION_BY_ZERO_LEN);
5476     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5477   }
5478 #endif
5479 #ifdef SPIDER_SQL_MODE_TRADITIONAL
5480   if (sql_mode & MODE_TRADITIONAL)
5481   {
5482     if (str->reserve(SPIDER_TRADITIONAL_LEN + SPIDER_SQL_COMMA_LEN))
5483     {
5484       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5485     }
5486     str->q_append(SPIDER_TRADITIONAL_STR, SPIDER_TRADITIONAL_LEN);
5487     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5488   }
5489 #endif
5490 #ifdef SPIDER_SQL_MODE_NO_AUTO_CREATE_USER
5491   if (sql_mode & MODE_NO_AUTO_CREATE_USER)
5492   {
5493     if (str->reserve(SPIDER_NO_AUTO_CREATE_USER_LEN + SPIDER_SQL_COMMA_LEN))
5494     {
5495       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5496     }
5497     str->q_append(SPIDER_NO_AUTO_CREATE_USER_STR, SPIDER_NO_AUTO_CREATE_USER_LEN);
5498     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5499   }
5500 #endif
5501 #ifdef SPIDER_SQL_MODE_HIGH_NOT_PRECEDENCE
5502   if (sql_mode & MODE_HIGH_NOT_PRECEDENCE)
5503   {
5504     if (str->reserve(SPIDER_HIGH_NOT_PRECEDENCE_LEN + SPIDER_SQL_COMMA_LEN))
5505     {
5506       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5507     }
5508     str->q_append(SPIDER_HIGH_NOT_PRECEDENCE_STR, SPIDER_HIGH_NOT_PRECEDENCE_LEN);
5509     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5510   }
5511 #endif
5512 #ifdef SPIDER_SQL_MODE_NO_ENGINE_SUBSTITUTION
5513   if (sql_mode & MODE_NO_ENGINE_SUBSTITUTION)
5514   {
5515     if (str->reserve(SPIDER_NO_ENGINE_SUBSTITUTION_LEN + SPIDER_SQL_COMMA_LEN))
5516     {
5517       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5518     }
5519     str->q_append(SPIDER_NO_ENGINE_SUBSTITUTION_STR, SPIDER_NO_ENGINE_SUBSTITUTION_LEN);
5520     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5521   }
5522 #endif
5523 #ifdef SPIDER_SQL_MODE_PAD_CHAR_TO_FULL_LENGTH
5524   if (sql_mode & MODE_PAD_CHAR_TO_FULL_LENGTH)
5525   {
5526     if (str->reserve(SPIDER_PAD_CHAR_TO_FULL_LENGTH_LEN + SPIDER_SQL_COMMA_LEN))
5527     {
5528       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5529     }
5530     str->q_append(SPIDER_PAD_CHAR_TO_FULL_LENGTH_STR, SPIDER_PAD_CHAR_TO_FULL_LENGTH_LEN);
5531     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5532   }
5533 #endif
5534   DBUG_RETURN(0);
5535 }
5536 
append_sql_mode_internal(spider_string * str,sql_mode_t sql_mode)5537 int spider_db_mariadb_util::append_sql_mode_internal(
5538   spider_string *str,
5539   sql_mode_t sql_mode
5540 ) {
5541   int error_num;
5542   DBUG_ENTER("spider_db_mbase_util::append_sql_mode_internal");
5543   DBUG_PRINT("info",("spider this=%p", this));
5544   if ((error_num = spider_db_mbase_util::append_sql_mode_internal(
5545     str, sql_mode)))
5546   {
5547     DBUG_RETURN(error_num);
5548   }
5549 #ifdef SPIDER_SQL_MODE_EMPTY_STRING_IS_NULL
5550   if (sql_mode & MODE_EMPTY_STRING_IS_NULL)
5551   {
5552     if (str->reserve(SPIDER_EMPTY_STRING_IS_NULL_LEN + SPIDER_SQL_COMMA_LEN))
5553     {
5554       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5555     }
5556     str->q_append(SPIDER_EMPTY_STRING_IS_NULL_STR, SPIDER_EMPTY_STRING_IS_NULL_LEN);
5557     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5558   }
5559 #endif
5560 #ifdef SPIDER_SQL_MODE_SIMULTANEOUS_ASSIGNMENT
5561   if (sql_mode & MODE_SIMULTANEOUS_ASSIGNMENT)
5562   {
5563     if (str->reserve(SPIDER_SIMULTANEOUS_ASSIGNMENT_LEN + SPIDER_SQL_COMMA_LEN))
5564     {
5565       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5566     }
5567     str->q_append(SPIDER_SIMULTANEOUS_ASSIGNMENT_STR, SPIDER_SIMULTANEOUS_ASSIGNMENT_LEN);
5568     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5569   }
5570 #endif
5571 #ifdef SPIDER_SQL_MODE_TIME_ROUND_FRACTIONAL
5572   if (sql_mode & MODE_TIME_ROUND_FRACTIONAL)
5573   {
5574     if (str->reserve(SPIDER_TIME_ROUND_FRACTIONAL_LEN + SPIDER_SQL_COMMA_LEN))
5575     {
5576       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5577     }
5578     str->q_append(SPIDER_TIME_ROUND_FRACTIONAL_STR, SPIDER_TIME_ROUND_FRACTIONAL_LEN);
5579     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5580   }
5581 #endif
5582   DBUG_RETURN(0);
5583 }
5584 
append_sql_mode(spider_string * str,sql_mode_t sql_mode)5585 int spider_db_mbase_util::append_sql_mode(
5586   spider_string *str,
5587   sql_mode_t sql_mode
5588 ) {
5589   int error_num;
5590   uint length;
5591   DBUG_ENTER("spider_db_mbase_util::append_sql_mode");
5592   DBUG_PRINT("info",("spider this=%p", this));
5593   if (str->reserve(SPIDER_SQL_SEMICOLON_LEN + SPIDER_SQL_SQL_MODE_LEN))
5594   {
5595     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5596   }
5597   if (str->length())
5598   {
5599     str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
5600   }
5601   str->q_append(SPIDER_SQL_SQL_MODE_STR, SPIDER_SQL_SQL_MODE_LEN);
5602   length = str->length();
5603   if ((error_num = append_sql_mode_internal(str, sql_mode)))
5604   {
5605     DBUG_RETURN(error_num);
5606   }
5607   if (str->length() > length)
5608   {
5609     str->length(str->length() - SPIDER_SQL_COMMA_LEN);
5610   } else {
5611     if (str->reserve(SPIDER_SQL_VALUE_QUOTE_LEN))
5612     {
5613       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5614     }
5615   }
5616   str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
5617   DBUG_RETURN(0);
5618 }
5619 
append_time_zone(spider_string * str,Time_zone * time_zone)5620 int spider_db_mbase_util::append_time_zone(
5621   spider_string *str,
5622   Time_zone *time_zone
5623 ) {
5624   const String *tz_str = time_zone->get_name();
5625   DBUG_ENTER("spider_db_mbase_util::append_time_zone");
5626   DBUG_PRINT("info",("spider this=%p", this));
5627   if (str->reserve(SPIDER_SQL_SEMICOLON_LEN + SPIDER_SQL_TIME_ZONE_LEN +
5628     tz_str->length() + SPIDER_SQL_VALUE_QUOTE_LEN))
5629     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5630   if (str->length())
5631     str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
5632   str->q_append(SPIDER_SQL_TIME_ZONE_STR, SPIDER_SQL_TIME_ZONE_LEN);
5633   str->q_append(tz_str->ptr(), tz_str->length());
5634   str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
5635   DBUG_RETURN(0);
5636 }
5637 
append_loop_check(spider_string * str,SPIDER_CONN * conn)5638 int spider_db_mbase_util::append_loop_check(
5639   spider_string *str,
5640   SPIDER_CONN *conn
5641 ) {
5642   SPIDER_CONN_LOOP_CHECK *lcptr;
5643   DBUG_ENTER("spider_db_mbase_util::append_loop_check");
5644   DBUG_PRINT("info",("spider this=%p", this));
5645   DBUG_PRINT("info",("spider str=%s", str->c_ptr_safe()));
5646   uint l = 0;
5647   while ((lcptr = (SPIDER_CONN_LOOP_CHECK *) my_hash_element(
5648     &conn->loop_check_queue, l)))
5649   {
5650     DBUG_PRINT("info",("spider lcptr=%p", lcptr));
5651     if (str->reserve(SPIDER_SQL_SEMICOLON_LEN + SPIDER_SQL_SET_USER_VAL_LEN +
5652       SPIDER_SQL_LOP_CHK_PRM_PRF_LEN + lcptr->to_name.length +
5653       SPIDER_SQL_NAME_QUOTE_LEN + SPIDER_SQL_EQUAL_LEN +
5654       SPIDER_SQL_VALUE_QUOTE_LEN +
5655       lcptr->merged_value.length + SPIDER_SQL_VALUE_QUOTE_LEN))
5656     {
5657       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5658     }
5659     if (str->length())
5660     {
5661       str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
5662     }
5663     str->q_append(SPIDER_SQL_SET_USER_VAL_STR, SPIDER_SQL_SET_USER_VAL_LEN);
5664     str->q_append(SPIDER_SQL_LOP_CHK_PRM_PRF_STR,
5665       SPIDER_SQL_LOP_CHK_PRM_PRF_LEN);
5666     str->q_append(lcptr->to_name.str, lcptr->to_name.length);
5667     str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
5668     str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
5669     str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
5670     str->q_append(lcptr->merged_value.str, lcptr->merged_value.length);
5671     str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
5672 
5673     ++l;
5674     DBUG_PRINT("info",("spider str=%s", str->c_ptr_safe()));
5675   }
5676   DBUG_RETURN(0);
5677 }
5678 
append_start_transaction(spider_string * str)5679 int spider_db_mbase_util::append_start_transaction(
5680   spider_string *str
5681 ) {
5682   DBUG_ENTER("spider_db_mbase_util::append_start_transaction");
5683   DBUG_PRINT("info",("spider this=%p", this));
5684   if (str->reserve(SPIDER_SQL_SEMICOLON_LEN +
5685     SPIDER_SQL_START_TRANSACTION_LEN))
5686     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5687   if (str->length())
5688   {
5689     str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
5690   }
5691   str->q_append(SPIDER_SQL_START_TRANSACTION_STR,
5692     SPIDER_SQL_START_TRANSACTION_LEN);
5693   DBUG_RETURN(0);
5694 }
5695 
append_xa_start(spider_string * str,XID * xid)5696 int spider_db_mbase_util::append_xa_start(
5697   spider_string *str,
5698   XID *xid
5699 ) {
5700   DBUG_ENTER("spider_db_mbase_util::append_xa_start");
5701   DBUG_PRINT("info",("spider this=%p", this));
5702   if (str->reserve(SPIDER_SQL_SEMICOLON_LEN +
5703     SPIDER_SQL_XA_START_LEN + XIDDATASIZE + sizeof(long) + 9))
5704     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5705   if (str->length())
5706   {
5707     str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
5708   }
5709   str->q_append(SPIDER_SQL_XA_START_STR, SPIDER_SQL_XA_START_LEN);
5710   spider_db_append_xid_str(str, xid);
5711   DBUG_RETURN(0);
5712 }
5713 
append_lock_table_head(spider_string * str)5714 int spider_db_mbase_util::append_lock_table_head(
5715   spider_string *str
5716 ) {
5717   DBUG_ENTER("spider_db_mbase_util::append_lock_table_head");
5718   DBUG_PRINT("info",("spider this=%p", this));
5719   if (str->reserve(SPIDER_SQL_LOCK_TABLE_LEN))
5720     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5721   str->q_append(SPIDER_SQL_LOCK_TABLE_STR, SPIDER_SQL_LOCK_TABLE_LEN);
5722   DBUG_RETURN(0);
5723 }
5724 
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)5725 int spider_db_mbase_util::append_lock_table_body(
5726   spider_string *str,
5727   const char *db_name,
5728   uint db_name_length,
5729   CHARSET_INFO *db_name_charset,
5730   const char *table_name,
5731   uint table_name_length,
5732   CHARSET_INFO *table_name_charset,
5733   int lock_type
5734 ) {
5735   DBUG_ENTER("spider_db_mbase_util::append_lock_table_body");
5736   DBUG_PRINT("info",("spider this=%p", this));
5737   if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN))
5738   {
5739     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5740   }
5741   str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
5742   if (
5743     str->append(db_name, db_name_length, db_name_charset) ||
5744     str->reserve((SPIDER_SQL_NAME_QUOTE_LEN) * 2 + SPIDER_SQL_DOT_LEN)
5745   ) {
5746     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5747   }
5748   str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
5749   str->q_append(SPIDER_SQL_DOT_STR, SPIDER_SQL_DOT_LEN);
5750   str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
5751   if (
5752     str->append(table_name, table_name_length, table_name_charset) ||
5753     str->reserve(SPIDER_SQL_NAME_QUOTE_LEN +
5754       spider_db_table_lock_len[lock_type])
5755   ) {
5756     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5757   }
5758   str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
5759   str->q_append(spider_db_table_lock_str[lock_type],
5760     spider_db_table_lock_len[lock_type]);
5761   DBUG_RETURN(0);
5762 }
5763 
append_lock_table_tail(spider_string * str)5764 int spider_db_mbase_util::append_lock_table_tail(
5765   spider_string *str
5766 ) {
5767   DBUG_ENTER("spider_db_mbase_util::append_lock_table_tail");
5768   DBUG_PRINT("info",("spider this=%p", this));
5769   str->length(str->length() - SPIDER_SQL_COMMA_LEN);
5770   DBUG_RETURN(0);
5771 }
5772 
append_unlock_table(spider_string * str)5773 int spider_db_mbase_util::append_unlock_table(
5774   spider_string *str
5775 ) {
5776   DBUG_ENTER("spider_db_mbase_util::append_unlock_table");
5777   DBUG_PRINT("info",("spider this=%p", this));
5778   if (str->reserve(SPIDER_SQL_UNLOCK_TABLE_LEN))
5779   {
5780     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5781   }
5782   str->q_append(SPIDER_SQL_UNLOCK_TABLE_STR, SPIDER_SQL_UNLOCK_TABLE_LEN);
5783   DBUG_RETURN(0);
5784 }
5785 
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)5786 int spider_db_mbase_util::open_item_func(
5787   Item_func *item_func,
5788   ha_spider *spider,
5789   spider_string *str,
5790   const char *alias,
5791   uint alias_length,
5792   bool use_fields,
5793   spider_fields *fields
5794 ) {
5795   int error_num;
5796   Item *item, **item_list = item_func->arguments();
5797   Field *field;
5798   uint roop_count, item_count = item_func->argument_count(), start_item = 0;
5799   const char *func_name = SPIDER_SQL_NULL_CHAR_STR,
5800     *separator_str = SPIDER_SQL_NULL_CHAR_STR,
5801     *last_str = SPIDER_SQL_NULL_CHAR_STR;
5802   int func_name_length = SPIDER_SQL_NULL_CHAR_LEN,
5803     separator_str_length = SPIDER_SQL_NULL_CHAR_LEN,
5804     last_str_length = SPIDER_SQL_NULL_CHAR_LEN;
5805   int use_pushdown_udf;
5806   bool merge_func = FALSE;
5807   DBUG_ENTER("spider_db_mbase_util::open_item_func");
5808   if (str)
5809   {
5810     if (str->reserve(SPIDER_SQL_OPEN_PAREN_LEN))
5811       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5812     str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
5813   }
5814   DBUG_PRINT("info",("spider functype = %d", item_func->functype()));
5815   switch (item_func->functype())
5816   {
5817     case Item_func::ISNULL_FUNC:
5818       last_str = SPIDER_SQL_IS_NULL_STR;
5819       last_str_length = SPIDER_SQL_IS_NULL_LEN;
5820       break;
5821     case Item_func::ISNOTNULL_FUNC:
5822       last_str = SPIDER_SQL_IS_NOT_NULL_STR;
5823       last_str_length = SPIDER_SQL_IS_NOT_NULL_LEN;
5824       break;
5825     case Item_func::UNKNOWN_FUNC:
5826       func_name = (char*) item_func->func_name();
5827       func_name_length = strlen(func_name);
5828       DBUG_PRINT("info",("spider func_name = %s", func_name));
5829       DBUG_PRINT("info",("spider func_name_length = %d", func_name_length));
5830       if (func_name_length == 1 &&
5831         (
5832           !strncasecmp("+", func_name, func_name_length) ||
5833           !strncasecmp("-", func_name, func_name_length) ||
5834           !strncasecmp("*", func_name, func_name_length) ||
5835           !strncasecmp("/", func_name, func_name_length) ||
5836           !strncasecmp("%", func_name, func_name_length) ||
5837           !strncasecmp("&", func_name, func_name_length) ||
5838           !strncasecmp("|", func_name, func_name_length) ||
5839           !strncasecmp("^", func_name, func_name_length)
5840         )
5841       ) {
5842         /* no action */
5843         break;
5844       } else if (func_name_length == 2 &&
5845         (
5846           !strncasecmp("<<", func_name, func_name_length) ||
5847           !strncasecmp(">>", func_name, func_name_length)
5848         )
5849       ) {
5850         /* no action */
5851         break;
5852       } else if (func_name_length == 3 &&
5853         !strncasecmp("div", func_name, func_name_length)
5854       ) {
5855         /* no action */
5856         break;
5857       } else if (func_name_length == 4)
5858       {
5859         if (
5860           !strncasecmp("rand", func_name, func_name_length) &&
5861 #ifdef SPIDER_Item_args_arg_count_IS_PROTECTED
5862           !item_func->argument_count()
5863 #else
5864           !item_func->arg_count
5865 #endif
5866         ) {
5867           if (str)
5868             str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
5869           DBUG_RETURN(spider_db_open_item_int(item_func, NULL, spider, str,
5870             alias, alias_length, dbton_id, use_fields, fields));
5871         } else if (
5872           !strncasecmp("trim", func_name, func_name_length) &&
5873           item_count == 2
5874         ) {
5875           /* item_count == 1 means this TRIM() is without a remove_str */
5876           item = item_list[0];
5877           Item *item_tmp = item_list[1];
5878           if (str)
5879           {
5880             if (item_tmp->is_of_type(Item::CONST_ITEM, STRING_RESULT))
5881             {
5882               /* 1. append 'TRIM(BOTH ' */
5883               if (str->reserve(SPIDER_SQL_TRIM_LEN + SPIDER_SQL_OPEN_PAREN_LEN +
5884                                SPIDER_SQL_TRIM_BOTH_LEN))
5885                 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5886               str->q_append(SPIDER_SQL_TRIM_STR, SPIDER_SQL_TRIM_LEN);
5887               str->q_append(SPIDER_SQL_OPEN_PAREN_STR,
5888                             SPIDER_SQL_OPEN_PAREN_LEN);
5889               str->q_append(SPIDER_SQL_TRIM_BOTH_STR, SPIDER_SQL_TRIM_BOTH_LEN);
5890               /* 2. append "remove_str"*/
5891               if ((error_num = spider_db_print_item_type(
5892                       item_tmp, NULL, spider, str, alias, alias_length, dbton_id,
5893                       use_fields, fields)))
5894                 DBUG_RETURN(error_num);
5895               /* 3. append ' FROM ' */
5896               if (str->reserve(SPIDER_SQL_FROM_LEN))
5897                 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5898               str->q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN);
5899               /* 4. append `field` */
5900               if ((error_num = spider_db_print_item_type(
5901                       item, NULL, spider, str, alias, alias_length, dbton_id,
5902                       use_fields, fields)))
5903                 DBUG_RETURN(error_num);
5904               /* 5. append ')' */
5905               if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN))
5906                 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5907               str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,
5908                             SPIDER_SQL_CLOSE_PAREN_LEN);
5909             }
5910           }
5911           item_count -= 2;
5912           break;
5913         }
5914       } else if (func_name_length == 5)
5915       {
5916         if (
5917           (!strncasecmp("ltrim", func_name, func_name_length) ||
5918            !strncasecmp("rtrim", func_name, func_name_length)) &&
5919           (item_count == 2)
5920         ) {
5921           /* the func_name for TRIM(LEADING ...) is LTRIM, for TRIM(TRAILING) is RTRIM */
5922           /* item_count == 2 means this TRIM(LEADING/TRAILING ...) is with a remove_str */
5923           item = item_list[0];
5924           Item *item_tmp = item_list[1];
5925           if (str)
5926           {
5927             if (item_tmp->is_of_type(Item::CONST_ITEM, STRING_RESULT))
5928             {
5929               /* 1. append 'TRIM(LEADING ' or 'TRIM(TRAILING ' */
5930               if (func_name[0] == 'l' || func_name[0] == 'L')
5931               { /* ltrim */
5932                 if (str->reserve(SPIDER_SQL_TRIM_LEN + SPIDER_SQL_OPEN_PAREN_LEN +
5933                                  SPIDER_SQL_TRIM_LEADING_LEN))
5934                   DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5935                 str->q_append(SPIDER_SQL_TRIM_STR, SPIDER_SQL_TRIM_LEN);
5936                 str->q_append(SPIDER_SQL_OPEN_PAREN_STR,
5937                               SPIDER_SQL_OPEN_PAREN_LEN);
5938                 str->q_append(SPIDER_SQL_TRIM_LEADING_STR, SPIDER_SQL_TRIM_LEADING_LEN);
5939               } else
5940               { /* rtrim */
5941                 if (str->reserve(SPIDER_SQL_TRIM_LEN + SPIDER_SQL_OPEN_PAREN_LEN +
5942                                  SPIDER_SQL_TRIM_TRAILING_LEN))
5943                   DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5944                 str->q_append(SPIDER_SQL_TRIM_STR, SPIDER_SQL_TRIM_LEN);
5945                 str->q_append(SPIDER_SQL_OPEN_PAREN_STR,
5946                               SPIDER_SQL_OPEN_PAREN_LEN);
5947                 str->q_append(SPIDER_SQL_TRIM_TRAILING_STR, SPIDER_SQL_TRIM_TRAILING_LEN);
5948               }
5949               /* 2. append "remove_str"*/
5950               if ((error_num = spider_db_print_item_type(
5951                   item_tmp, NULL, spider, str, alias, alias_length, dbton_id,
5952                   use_fields, fields)))
5953                 DBUG_RETURN(error_num);
5954               /* 3. append ' FROM ' */
5955               if (str->reserve(SPIDER_SQL_FROM_LEN))
5956                 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5957               str->q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN);
5958               /* 4. append `field` */
5959               if ((error_num = spider_db_print_item_type(
5960                   item, NULL, spider, str, alias, alias_length, dbton_id,
5961                   use_fields, fields)))
5962                 DBUG_RETURN(error_num);
5963               /* 5. append ')' */
5964               if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN))
5965                 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5966               str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,
5967                             SPIDER_SQL_CLOSE_PAREN_LEN);
5968             }
5969           }
5970           item_count -= 2;
5971           break;
5972         }
5973       } else if (func_name_length == 6 &&
5974         !strncasecmp("istrue", func_name, func_name_length)
5975       ) {
5976         last_str = SPIDER_SQL_IS_TRUE_STR;
5977         last_str_length = SPIDER_SQL_IS_TRUE_LEN;
5978         break;
5979       } else if (func_name_length == 7)
5980       {
5981         if (!strncasecmp("isfalse", func_name, func_name_length))
5982         {
5983           last_str = SPIDER_SQL_IS_FALSE_STR;
5984           last_str_length = SPIDER_SQL_IS_FALSE_LEN;
5985           break;
5986         } else if (
5987           !strncasecmp("sysdate", func_name, func_name_length) ||
5988           !strncasecmp("curdate", func_name, func_name_length) ||
5989           !strncasecmp("curtime", func_name, func_name_length)
5990         ) {
5991           if (str)
5992             str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
5993           DBUG_RETURN(spider_db_open_item_string(item_func, NULL, spider, str,
5994             alias, alias_length, dbton_id, use_fields, fields));
5995         } else if (
5996           !strncasecmp("convert", func_name, func_name_length)
5997         ) {
5998           if (str)
5999           {
6000             if (str->reserve(func_name_length * 2 + SPIDER_SQL_OPEN_PAREN_LEN))
6001               DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6002             str->q_append(func_name, func_name_length);
6003             str->q_append(SPIDER_SQL_OPEN_PAREN_STR,
6004               SPIDER_SQL_OPEN_PAREN_LEN);
6005             last_str = SPIDER_SQL_CLOSE_PAREN_STR;
6006             last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
6007           }
6008           break;
6009         }
6010       } else if (func_name_length == 8 &&
6011         (
6012           !strncasecmp("utc_date", func_name, func_name_length) ||
6013           !strncasecmp("utc_time", func_name, func_name_length)
6014         )
6015       ) {
6016         if (str)
6017           str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
6018         DBUG_RETURN(spider_db_open_item_string(item_func, NULL, spider, str,
6019           alias, alias_length, dbton_id, use_fields, fields));
6020       } else if (func_name_length == 9 &&
6021         !strncasecmp("isnottrue", func_name, func_name_length)
6022       ) {
6023         last_str = SPIDER_SQL_IS_NOT_TRUE_STR;
6024         last_str_length = SPIDER_SQL_IS_NOT_TRUE_LEN;
6025         break;
6026       } else if (func_name_length == 10)
6027       {
6028         if (!strncasecmp("isnotfalse", func_name, func_name_length))
6029         {
6030           last_str = SPIDER_SQL_IS_NOT_FALSE_STR;
6031           last_str_length = SPIDER_SQL_IS_NOT_FALSE_LEN;
6032           break;
6033         } else if (!strncasecmp("column_get", func_name, func_name_length))
6034         {
6035           if (str)
6036           {
6037             str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
6038             if (str->reserve(func_name_length + SPIDER_SQL_OPEN_PAREN_LEN))
6039               DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6040             str->q_append(func_name, func_name_length);
6041             str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
6042           }
6043           func_name = SPIDER_SQL_COMMA_STR;
6044           func_name_length = SPIDER_SQL_COMMA_LEN;
6045           separator_str = SPIDER_SQL_COMMA_STR;
6046           separator_str_length = SPIDER_SQL_COMMA_LEN;
6047           break;
6048         }
6049       } else if (func_name_length == 12)
6050       {
6051         if (!strncasecmp("cast_as_date", func_name, func_name_length))
6052         {
6053           item = item_list[0];
6054           if (item->type() == Item::FUNC_ITEM)
6055           {
6056             DBUG_PRINT("info",("spider child is FUNC_ITEM"));
6057             Item_func *ifunc = (Item_func *) item;
6058             if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
6059             {
6060               const char *child_func_name;
6061               int child_func_name_length;
6062               DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
6063               child_func_name = (char*) ifunc->func_name();
6064               child_func_name_length = strlen(child_func_name);
6065               DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
6066               if (
6067                 child_func_name_length == 10 &&
6068                 !strncasecmp("column_get", child_func_name, child_func_name_length)
6069               ) {
6070                 DBUG_PRINT("info",("spider this is merge func"));
6071                 merge_func = TRUE;
6072               }
6073             }
6074           }
6075 
6076           if (str)
6077           {
6078             str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
6079             if (!merge_func)
6080             {
6081               if (str->reserve(SPIDER_SQL_CAST_LEN))
6082                 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6083               str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
6084             }
6085           }
6086           last_str = SPIDER_SQL_AS_DATE_STR;
6087           last_str_length = SPIDER_SQL_AS_DATE_LEN;
6088           break;
6089         } else if (!strncasecmp("cast_as_time", func_name, func_name_length))
6090         {
6091           item = item_list[0];
6092           if (item->type() == Item::FUNC_ITEM)
6093           {
6094             DBUG_PRINT("info",("spider child is FUNC_ITEM"));
6095             Item_func *ifunc = (Item_func *) item;
6096             if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
6097             {
6098               const char *child_func_name;
6099               int child_func_name_length;
6100               DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
6101               child_func_name = (char*) ifunc->func_name();
6102               child_func_name_length = strlen(child_func_name);
6103               DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
6104               if (
6105                 child_func_name_length == 10 &&
6106                 !strncasecmp("column_get", child_func_name, child_func_name_length)
6107               ) {
6108                 DBUG_PRINT("info",("spider this is merge func"));
6109                 merge_func = TRUE;
6110               }
6111             }
6112           }
6113 
6114           if (str)
6115           {
6116             str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
6117             if (!merge_func)
6118             {
6119               if (str->reserve(SPIDER_SQL_CAST_LEN))
6120                 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6121               str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
6122             }
6123           }
6124           last_str = SPIDER_SQL_AS_TIME_STR;
6125           last_str_length = SPIDER_SQL_AS_TIME_LEN;
6126           break;
6127         }
6128       } else if (func_name_length == 13)
6129       {
6130         if (!strncasecmp("utc_timestamp", func_name, func_name_length))
6131         {
6132           if (str)
6133             str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
6134           DBUG_RETURN(spider_db_open_item_string(item_func, NULL, spider, str,
6135             alias, alias_length, dbton_id, use_fields, fields));
6136         } else if (!strncasecmp("timestampdiff", func_name, func_name_length))
6137         {
6138 #ifdef ITEM_FUNC_TIMESTAMPDIFF_ARE_PUBLIC
6139           Item_func_timestamp_diff *item_func_timestamp_diff =
6140             (Item_func_timestamp_diff *) item_func;
6141           if (str)
6142           {
6143             const char *interval_str;
6144             uint interval_len;
6145             switch (item_func_timestamp_diff->int_type)
6146             {
6147               case INTERVAL_YEAR:
6148                 interval_str = SPIDER_SQL_YEAR_STR;
6149                 interval_len = SPIDER_SQL_YEAR_LEN;
6150                 break;
6151               case INTERVAL_QUARTER:
6152                 interval_str = SPIDER_SQL_QUARTER_STR;
6153                 interval_len = SPIDER_SQL_QUARTER_LEN;
6154                 break;
6155               case INTERVAL_MONTH:
6156                 interval_str = SPIDER_SQL_MONTH_STR;
6157                 interval_len = SPIDER_SQL_MONTH_LEN;
6158                 break;
6159               case INTERVAL_WEEK:
6160                 interval_str = SPIDER_SQL_WEEK_STR;
6161                 interval_len = SPIDER_SQL_WEEK_LEN;
6162                 break;
6163               case INTERVAL_DAY:
6164                 interval_str = SPIDER_SQL_DAY_STR;
6165                 interval_len = SPIDER_SQL_DAY_LEN;
6166                 break;
6167               case INTERVAL_HOUR:
6168                 interval_str = SPIDER_SQL_HOUR_STR;
6169                 interval_len = SPIDER_SQL_HOUR_LEN;
6170                 break;
6171               case INTERVAL_MINUTE:
6172                 interval_str = SPIDER_SQL_MINUTE_STR;
6173                 interval_len = SPIDER_SQL_MINUTE_LEN;
6174                 break;
6175               case INTERVAL_SECOND:
6176                 interval_str = SPIDER_SQL_SECOND_STR;
6177                 interval_len = SPIDER_SQL_SECOND_LEN;
6178                 break;
6179               case INTERVAL_MICROSECOND:
6180                 interval_str = SPIDER_SQL_MICROSECOND_STR;
6181                 interval_len = SPIDER_SQL_MICROSECOND_LEN;
6182                 break;
6183               default:
6184                 interval_str = "";
6185                 interval_len = 0;
6186                 break;
6187             }
6188             str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
6189             if (str->reserve(func_name_length + SPIDER_SQL_OPEN_PAREN_LEN +
6190               interval_len + SPIDER_SQL_COMMA_LEN))
6191               DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6192             str->q_append(func_name, func_name_length);
6193             str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
6194             str->q_append(interval_str, interval_len);
6195             str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
6196           }
6197           if ((error_num = spider_db_print_item_type(item_list[0], NULL, spider,
6198             str, alias, alias_length, dbton_id, use_fields, fields)))
6199             DBUG_RETURN(error_num);
6200           if (str)
6201           {
6202             if (str->reserve(SPIDER_SQL_COMMA_LEN))
6203               DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6204             str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
6205           }
6206           if ((error_num = spider_db_print_item_type(item_list[1], NULL, spider,
6207             str, alias, alias_length, dbton_id, use_fields, fields)))
6208             DBUG_RETURN(error_num);
6209           if (str)
6210           {
6211             if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN))
6212               DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6213             str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,
6214               SPIDER_SQL_CLOSE_PAREN_LEN);
6215           }
6216           DBUG_RETURN(0);
6217 #else
6218           DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
6219 #endif
6220         }
6221       } else if (func_name_length == 14)
6222       {
6223         if (!strncasecmp("cast_as_binary", func_name, func_name_length))
6224         {
6225           item = item_list[0];
6226           if (item->type() == Item::FUNC_ITEM)
6227           {
6228             DBUG_PRINT("info",("spider child is FUNC_ITEM"));
6229             Item_func *ifunc = (Item_func *) item;
6230             if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
6231             {
6232               const char *child_func_name;
6233               int child_func_name_length;
6234               DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
6235               child_func_name = (char*) ifunc->func_name();
6236               child_func_name_length = strlen(child_func_name);
6237               DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
6238               if (
6239                 child_func_name_length == 10 &&
6240                 !strncasecmp("column_get", child_func_name, child_func_name_length)
6241               ) {
6242                 DBUG_PRINT("info",("spider this is merge func"));
6243                 merge_func = TRUE;
6244               }
6245             }
6246           }
6247 
6248           if (str)
6249           {
6250             char tmp_buf[MAX_FIELD_WIDTH], *tmp_ptr, *tmp_ptr2;
6251             spider_string tmp_str(tmp_buf, MAX_FIELD_WIDTH, str->charset());
6252             tmp_str.init_calc_mem(123);
6253             tmp_str.length(0);
6254             str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
6255             if (!merge_func)
6256             {
6257               if (str->reserve(SPIDER_SQL_CAST_LEN))
6258                 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6259               str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
6260             }
6261 #if MYSQL_VERSION_ID < 50500
6262             item_func->print(tmp_str.get_str(), QT_IS);
6263 #else
6264             item_func->print(tmp_str.get_str(), QT_TO_SYSTEM_CHARSET);
6265 #endif
6266             tmp_str.mem_calc();
6267             if (tmp_str.reserve(1))
6268               DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6269             tmp_ptr = tmp_str.c_ptr_quick();
6270             DBUG_PRINT("info",("spider tmp_ptr = %s", tmp_ptr));
6271             while ((tmp_ptr2 = strstr(tmp_ptr, SPIDER_SQL_AS_BINARY_STR)))
6272               tmp_ptr = tmp_ptr2 + 1;
6273             last_str = tmp_ptr - 1;
6274             last_str_length = strlen(last_str) - SPIDER_SQL_CLOSE_PAREN_LEN;
6275           }
6276           break;
6277         } else if (!strncasecmp("cast_as_signed", func_name, func_name_length))
6278         {
6279           item = item_list[0];
6280           if (item->type() == Item::FUNC_ITEM)
6281           {
6282             DBUG_PRINT("info",("spider child is FUNC_ITEM"));
6283             Item_func *ifunc = (Item_func *) item;
6284             if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
6285             {
6286               const char *child_func_name;
6287               int child_func_name_length;
6288               DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
6289               child_func_name = (char*) ifunc->func_name();
6290               child_func_name_length = strlen(child_func_name);
6291               DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
6292               if (
6293                 child_func_name_length == 10 &&
6294                 !strncasecmp("column_get", child_func_name, child_func_name_length)
6295               ) {
6296                 DBUG_PRINT("info",("spider this is merge func"));
6297                 merge_func = TRUE;
6298               }
6299             }
6300           }
6301 
6302           if (str)
6303           {
6304             str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
6305             if (!merge_func)
6306             {
6307               if (str->reserve(SPIDER_SQL_CAST_LEN))
6308                 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6309               str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
6310             }
6311           }
6312           last_str = SPIDER_SQL_AS_SIGNED_STR;
6313           last_str_length = SPIDER_SQL_AS_SIGNED_LEN;
6314           break;
6315         }
6316       } else if (func_name_length == 16)
6317       {
6318         if (!strncasecmp("cast_as_unsigned", func_name, func_name_length))
6319         {
6320           item = item_list[0];
6321           if (item->type() == Item::FUNC_ITEM)
6322           {
6323             DBUG_PRINT("info",("spider child is FUNC_ITEM"));
6324             Item_func *ifunc = (Item_func *) item;
6325             if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
6326             {
6327               const char *child_func_name;
6328               int child_func_name_length;
6329               DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
6330               child_func_name = (char*) ifunc->func_name();
6331               child_func_name_length = strlen(child_func_name);
6332               DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
6333               if (
6334                 child_func_name_length == 10 &&
6335                 !strncasecmp("column_get", child_func_name, child_func_name_length)
6336               ) {
6337                 DBUG_PRINT("info",("spider this is merge func"));
6338                 merge_func = TRUE;
6339               }
6340             }
6341           }
6342 
6343           if (str)
6344           {
6345             str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
6346             if (!merge_func)
6347             {
6348               if (str->reserve(SPIDER_SQL_CAST_LEN))
6349                 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6350               str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
6351             }
6352           }
6353           last_str = SPIDER_SQL_AS_UNSIGNED_STR;
6354           last_str_length = SPIDER_SQL_AS_UNSIGNED_LEN;
6355           break;
6356         } else if (!strncasecmp("decimal_typecast", func_name,
6357           func_name_length))
6358         {
6359           item = item_list[0];
6360           if (item->type() == Item::FUNC_ITEM)
6361           {
6362             DBUG_PRINT("info",("spider child is FUNC_ITEM"));
6363             Item_func *ifunc = (Item_func *) item;
6364             if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
6365             {
6366               const char *child_func_name;
6367               int child_func_name_length;
6368               DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
6369               child_func_name = (char*) ifunc->func_name();
6370               child_func_name_length = strlen(child_func_name);
6371               DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
6372               if (
6373                 child_func_name_length == 10 &&
6374                 !strncasecmp("column_get", child_func_name, child_func_name_length)
6375               ) {
6376                 DBUG_PRINT("info",("spider this is merge func"));
6377                 merge_func = TRUE;
6378               }
6379             }
6380           }
6381 
6382           if (str)
6383           {
6384             char tmp_buf[MAX_FIELD_WIDTH], *tmp_ptr, *tmp_ptr2;
6385             spider_string tmp_str(tmp_buf, MAX_FIELD_WIDTH, str->charset());
6386             tmp_str.init_calc_mem(124);
6387             tmp_str.length(0);
6388             str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
6389             if (!merge_func)
6390             {
6391               if (str->reserve(SPIDER_SQL_CAST_LEN))
6392                 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6393               str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
6394             }
6395 #if MYSQL_VERSION_ID < 50500
6396             item_func->print(tmp_str.get_str(), QT_IS);
6397 #else
6398             item_func->print(tmp_str.get_str(), QT_TO_SYSTEM_CHARSET);
6399 #endif
6400             tmp_str.mem_calc();
6401             if (tmp_str.reserve(1))
6402               DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6403             tmp_ptr = tmp_str.c_ptr_quick();
6404             DBUG_PRINT("info",("spider tmp_ptr = %s", tmp_ptr));
6405             while ((tmp_ptr2 = strstr(tmp_ptr, SPIDER_SQL_AS_DECIMAL_STR)))
6406               tmp_ptr = tmp_ptr2 + 1;
6407             last_str = tmp_ptr - 1;
6408             last_str_length = strlen(last_str) - SPIDER_SQL_CLOSE_PAREN_LEN;
6409           }
6410           break;
6411         } else if (!strncasecmp("cast_as_datetime", func_name,
6412           func_name_length))
6413         {
6414           item = item_list[0];
6415           if (item->type() == Item::FUNC_ITEM)
6416           {
6417             DBUG_PRINT("info",("spider child is FUNC_ITEM"));
6418             Item_func *ifunc = (Item_func *) item;
6419             if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
6420             {
6421               const char *child_func_name;
6422               int child_func_name_length;
6423               DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
6424               child_func_name = (char*) ifunc->func_name();
6425               child_func_name_length = strlen(child_func_name);
6426               DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
6427               if (
6428                 child_func_name_length == 10 &&
6429                 !strncasecmp("column_get", child_func_name, child_func_name_length)
6430               ) {
6431                 DBUG_PRINT("info",("spider this is merge func"));
6432                 merge_func = TRUE;
6433               }
6434             }
6435           }
6436 
6437           if (str)
6438           {
6439             str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
6440             if (!merge_func)
6441             {
6442               if (str->reserve(SPIDER_SQL_CAST_LEN))
6443                 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6444               str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
6445             }
6446           }
6447           last_str = SPIDER_SQL_AS_DATETIME_STR;
6448           last_str_length = SPIDER_SQL_AS_DATETIME_LEN;
6449           break;
6450         }
6451       } else if (func_name_length == 17)
6452       {
6453         if (!strncasecmp("date_add_interval", func_name, func_name_length))
6454         {
6455           Item_date_add_interval *item_date_add_interval =
6456             (Item_date_add_interval *) item_func;
6457           func_name = spider_db_timefunc_interval_str[
6458             item_date_add_interval->int_type];
6459           func_name_length = strlen(func_name);
6460           if ((error_num = spider_db_print_item_type(item_list[0], NULL, spider,
6461             str, alias, alias_length, dbton_id, use_fields, fields)))
6462             DBUG_RETURN(error_num);
6463           if (str)
6464           {
6465             if (item_date_add_interval->date_sub_interval)
6466             {
6467               if (str->reserve(SPIDER_SQL_NEGINTERVAL_LEN))
6468                 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6469               str->q_append(SPIDER_SQL_NEGINTERVAL_STR,
6470                 SPIDER_SQL_NEGINTERVAL_LEN);
6471             } else {
6472               if (str->reserve(SPIDER_SQL_INTERVAL_LEN))
6473                 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6474               str->q_append(SPIDER_SQL_INTERVAL_STR, SPIDER_SQL_INTERVAL_LEN);
6475             }
6476           }
6477           if ((error_num = spider_db_print_item_type(item_list[1], NULL, spider,
6478             str, alias, alias_length, dbton_id, use_fields, fields)))
6479             DBUG_RETURN(error_num);
6480           if (str)
6481           {
6482             if (str->reserve(func_name_length + SPIDER_SQL_CLOSE_PAREN_LEN))
6483               DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6484             str->q_append(func_name, func_name_length);
6485             str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,
6486               SPIDER_SQL_CLOSE_PAREN_LEN);
6487           }
6488           DBUG_RETURN(0);
6489         }
6490       }
6491       if (str)
6492       {
6493         if (str->reserve(func_name_length + SPIDER_SQL_OPEN_PAREN_LEN))
6494           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6495         str->q_append(func_name, func_name_length);
6496         str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
6497       }
6498       func_name = SPIDER_SQL_COMMA_STR;
6499       func_name_length = SPIDER_SQL_COMMA_LEN;
6500       separator_str = SPIDER_SQL_COMMA_STR;
6501       separator_str_length = SPIDER_SQL_COMMA_LEN;
6502       last_str = SPIDER_SQL_CLOSE_PAREN_STR;
6503       last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
6504       break;
6505     case Item_func::NOW_FUNC:
6506       if (str)
6507         str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
6508       DBUG_RETURN(spider_db_open_item_string(item_func, NULL, spider,
6509         str, alias, alias_length, dbton_id, use_fields, fields));
6510     case Item_func::CHAR_TYPECAST_FUNC:
6511       DBUG_PRINT("info",("spider CHAR_TYPECAST_FUNC"));
6512       {
6513         item = item_list[0];
6514         if (item->type() == Item::FUNC_ITEM)
6515         {
6516           DBUG_PRINT("info",("spider child is FUNC_ITEM"));
6517           Item_func *ifunc = (Item_func *) item;
6518           if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
6519           {
6520             const char *child_func_name;
6521             int child_func_name_length;
6522             DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
6523             child_func_name = (char*) ifunc->func_name();
6524             child_func_name_length = strlen(child_func_name);
6525             DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
6526             if (
6527               child_func_name_length == 10 &&
6528               !strncasecmp("column_get", child_func_name, child_func_name_length)
6529             ) {
6530               DBUG_PRINT("info",("spider this is merge func"));
6531               merge_func = TRUE;
6532             }
6533           }
6534         }
6535 
6536         if (str)
6537         {
6538           char tmp_buf[MAX_FIELD_WIDTH], *tmp_ptr, *tmp_ptr2;
6539           spider_string tmp_str(tmp_buf, MAX_FIELD_WIDTH, str->charset());
6540           tmp_str.init_calc_mem(125);
6541           tmp_str.length(0);
6542           str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
6543           if (!merge_func)
6544           {
6545             if (str->reserve(SPIDER_SQL_CAST_LEN))
6546               DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6547             str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
6548           }
6549 #if MYSQL_VERSION_ID < 50500
6550           item_func->print(tmp_str.get_str(), QT_IS);
6551 #else
6552           item_func->print(tmp_str.get_str(), QT_TO_SYSTEM_CHARSET);
6553 #endif
6554           tmp_str.mem_calc();
6555           if (tmp_str.reserve(1))
6556             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6557           tmp_ptr = tmp_str.c_ptr_quick();
6558           DBUG_PRINT("info",("spider tmp_ptr = %s", tmp_ptr));
6559           while ((tmp_ptr2 = strstr(tmp_ptr, SPIDER_SQL_AS_CHAR_STR)))
6560             tmp_ptr = tmp_ptr2 + 1;
6561           last_str = tmp_ptr - 1;
6562           last_str_length = strlen(last_str) - SPIDER_SQL_CLOSE_PAREN_LEN;
6563         }
6564       }
6565       break;
6566     case Item_func::NOT_FUNC:
6567       DBUG_PRINT("info",("spider NOT_FUNC"));
6568       if (item_list[0]->type() == Item::COND_ITEM)
6569       {
6570         DBUG_PRINT("info",("spider item_list[0] is COND_ITEM"));
6571         Item_cond *item_cond = (Item_cond *) item_list[0];
6572         if (item_cond->functype() == Item_func::COND_AND_FUNC)
6573         {
6574           DBUG_PRINT("info",("spider item_cond is COND_AND_FUNC"));
6575           List_iterator_fast<Item> lif(*(item_cond->argument_list()));
6576           bool has_expr_cache_item = FALSE;
6577           bool has_isnotnull_func = FALSE;
6578           bool has_other_item = FALSE;
6579           while((item = lif++))
6580           {
6581 #ifdef SPIDER_HAS_EXPR_CACHE_ITEM
6582             if (
6583               item->type() == Item::EXPR_CACHE_ITEM
6584             ) {
6585               DBUG_PRINT("info",("spider EXPR_CACHE_ITEM"));
6586               has_expr_cache_item = TRUE;
6587             } else
6588 #endif
6589             if (
6590               item->type() == Item::FUNC_ITEM &&
6591               ((Item_func *) item)->functype() == Item_func::ISNOTNULL_FUNC
6592             ) {
6593               DBUG_PRINT("info",("spider ISNOTNULL_FUNC"));
6594               has_isnotnull_func = TRUE;
6595             } else {
6596               DBUG_PRINT("info",("spider has other item"));
6597               DBUG_PRINT("info",("spider COND type=%d", item->type()));
6598               has_other_item = TRUE;
6599             }
6600           }
6601           if (has_expr_cache_item && has_isnotnull_func && !has_other_item)
6602           {
6603             DBUG_PRINT("info",("spider NOT EXISTS skip"));
6604             DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
6605           }
6606         }
6607       }
6608       if (str)
6609       {
6610         func_name = (char*) item_func->func_name();
6611         func_name_length = strlen(func_name);
6612         if (str->reserve(func_name_length + SPIDER_SQL_SPACE_LEN))
6613           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6614         str->q_append(func_name, func_name_length);
6615         str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
6616       }
6617       break;
6618     case Item_func::NEG_FUNC:
6619       if (str)
6620       {
6621         func_name = (char*) item_func->func_name();
6622         func_name_length = strlen(func_name);
6623         if (str->reserve(func_name_length + SPIDER_SQL_SPACE_LEN))
6624           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6625         str->q_append(func_name, func_name_length);
6626         str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
6627       }
6628       break;
6629     case Item_func::IN_FUNC:
6630       if (((Item_func_opt_neg *) item_func)->negated)
6631       {
6632         func_name = SPIDER_SQL_NOT_IN_STR;
6633         func_name_length = SPIDER_SQL_NOT_IN_LEN;
6634         separator_str = SPIDER_SQL_COMMA_STR;
6635         separator_str_length = SPIDER_SQL_COMMA_LEN;
6636         last_str = SPIDER_SQL_CLOSE_PAREN_STR;
6637         last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
6638       } else {
6639         func_name = SPIDER_SQL_IN_STR;
6640         func_name_length = SPIDER_SQL_IN_LEN;
6641         separator_str = SPIDER_SQL_COMMA_STR;
6642         separator_str_length = SPIDER_SQL_COMMA_LEN;
6643         last_str = SPIDER_SQL_CLOSE_PAREN_STR;
6644         last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
6645       }
6646       break;
6647     case Item_func::BETWEEN:
6648       if (((Item_func_opt_neg *) item_func)->negated)
6649       {
6650         func_name = SPIDER_SQL_NOT_BETWEEN_STR;
6651         func_name_length = SPIDER_SQL_NOT_BETWEEN_LEN;
6652         separator_str = SPIDER_SQL_AND_STR;
6653         separator_str_length = SPIDER_SQL_AND_LEN;
6654       } else {
6655         func_name = (char*) item_func->func_name();
6656         func_name_length = strlen(func_name);
6657         separator_str = SPIDER_SQL_AND_STR;
6658         separator_str_length = SPIDER_SQL_AND_LEN;
6659       }
6660       break;
6661     case Item_func::FUNC_SP:
6662     case Item_func::UDF_FUNC:
6663       use_pushdown_udf = spider_param_use_pushdown_udf(
6664         spider->wide_handler->trx->thd,
6665         spider->share->use_pushdown_udf);
6666       if (!use_pushdown_udf)
6667         /*
6668           This is the default behavior because the remote nodes may deal with
6669           the function in an unexpected way (e.g. not having the same
6670           definition). Users can turn it on if they know what they are doing.
6671         */
6672         DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
6673       if (str)
6674       {
6675         func_name = (char*) item_func->func_name();
6676         func_name_length = strlen(func_name);
6677         DBUG_PRINT("info",("spider func_name = %s", func_name));
6678         DBUG_PRINT("info",("spider func_name_length = %d", func_name_length));
6679         if (str->reserve(func_name_length + SPIDER_SQL_OPEN_PAREN_LEN))
6680           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6681         str->q_append(func_name, func_name_length);
6682         str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
6683       }
6684       func_name = SPIDER_SQL_COMMA_STR;
6685       func_name_length = SPIDER_SQL_COMMA_LEN;
6686       separator_str = SPIDER_SQL_COMMA_STR;
6687       separator_str_length = SPIDER_SQL_COMMA_LEN;
6688       last_str = SPIDER_SQL_CLOSE_PAREN_STR;
6689       last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
6690       break;
6691 #ifdef MARIADB_BASE_VERSION
6692     case Item_func::XOR_FUNC:
6693 #else
6694     case Item_func::COND_XOR_FUNC:
6695 #endif
6696       if (str)
6697         str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
6698       DBUG_RETURN(
6699         spider_db_open_item_cond((Item_cond *) item_func, spider, str,
6700           alias, alias_length, dbton_id, use_fields, fields));
6701     case Item_func::TRIG_COND_FUNC:
6702       DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
6703     case Item_func::GUSERVAR_FUNC:
6704       if (str)
6705         str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
6706       if (item_func->result_type() == STRING_RESULT)
6707         DBUG_RETURN(spider_db_open_item_string(item_func, NULL, spider, str,
6708           alias, alias_length, dbton_id, use_fields, fields));
6709       else
6710         DBUG_RETURN(spider_db_open_item_int(item_func, NULL, spider, str,
6711           alias, alias_length, dbton_id, use_fields, fields));
6712     case Item_func::FT_FUNC:
6713       if (spider_db_check_ft_idx(item_func, spider) == MAX_KEY)
6714         DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
6715       start_item = 1;
6716       if (str)
6717       {
6718         if (str->reserve(SPIDER_SQL_MATCH_LEN))
6719           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6720         str->q_append(SPIDER_SQL_MATCH_STR, SPIDER_SQL_MATCH_LEN);
6721       }
6722       separator_str = SPIDER_SQL_COMMA_STR;
6723       separator_str_length = SPIDER_SQL_COMMA_LEN;
6724       last_str = SPIDER_SQL_CLOSE_PAREN_STR;
6725       last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
6726       break;
6727     case Item_func::SP_EQUALS_FUNC:
6728       if (str)
6729       {
6730         func_name = SPIDER_SQL_MBR_EQUAL_STR;
6731         func_name_length = SPIDER_SQL_MBR_EQUAL_LEN;
6732         DBUG_PRINT("info",("spider func_name = %s", func_name));
6733         DBUG_PRINT("info",("spider func_name_length = %d", func_name_length));
6734         if (str->reserve(func_name_length))
6735           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6736         str->q_append(func_name, func_name_length);
6737       }
6738       func_name = SPIDER_SQL_COMMA_STR;
6739       func_name_length = SPIDER_SQL_COMMA_LEN;
6740       separator_str = SPIDER_SQL_COMMA_STR;
6741       separator_str_length = SPIDER_SQL_COMMA_LEN;
6742       last_str = SPIDER_SQL_CLOSE_PAREN_STR;
6743       last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
6744       break;
6745     case Item_func::SP_DISJOINT_FUNC:
6746     case Item_func::SP_INTERSECTS_FUNC:
6747     case Item_func::SP_TOUCHES_FUNC:
6748     case Item_func::SP_CROSSES_FUNC:
6749     case Item_func::SP_WITHIN_FUNC:
6750     case Item_func::SP_CONTAINS_FUNC:
6751     case Item_func::SP_OVERLAPS_FUNC:
6752       if (str)
6753       {
6754         func_name = (char*) item_func->func_name();
6755         func_name_length = strlen(func_name);
6756         DBUG_PRINT("info",("spider func_name = %s", func_name));
6757         DBUG_PRINT("info",("spider func_name_length = %d", func_name_length));
6758         if (str->reserve(
6759 #ifndef SPIDER_ITEM_GEOFUNC_NAME_HAS_MBR
6760           SPIDER_SQL_MBR_LEN +
6761 #endif
6762           func_name_length + SPIDER_SQL_OPEN_PAREN_LEN))
6763           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6764 #ifndef SPIDER_ITEM_GEOFUNC_NAME_HAS_MBR
6765         str->q_append(SPIDER_SQL_MBR_STR, SPIDER_SQL_MBR_LEN);
6766 #endif
6767         str->q_append(func_name, func_name_length);
6768         str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
6769       }
6770       func_name = SPIDER_SQL_COMMA_STR;
6771       func_name_length = SPIDER_SQL_COMMA_LEN;
6772       separator_str = SPIDER_SQL_COMMA_STR;
6773       separator_str_length = SPIDER_SQL_COMMA_LEN;
6774       last_str = SPIDER_SQL_CLOSE_PAREN_STR;
6775       last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
6776       break;
6777     case Item_func::EQ_FUNC:
6778     case Item_func::EQUAL_FUNC:
6779     case Item_func::NE_FUNC:
6780     case Item_func::LT_FUNC:
6781     case Item_func::LE_FUNC:
6782     case Item_func::GE_FUNC:
6783     case Item_func::GT_FUNC:
6784       if (str)
6785       {
6786         func_name = (char*) item_func->func_name();
6787         func_name_length = strlen(func_name);
6788       }
6789       break;
6790     case Item_func::LIKE_FUNC:
6791 #ifdef SPIDER_LIKE_FUNC_HAS_GET_NEGATED
6792       if (str)
6793       {
6794          if (((Item_func_like *)item_func)->get_negated())
6795          {
6796             func_name = SPIDER_SQL_NOT_LIKE_STR;
6797             func_name_length = SPIDER_SQL_NOT_LIKE_LEN;
6798          }
6799          else
6800          {
6801             func_name = (char*)item_func->func_name();
6802             func_name_length = strlen(func_name);
6803          }
6804       }
6805       break;
6806 #else
6807       DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
6808 #endif
6809     case Item_func::CASE_SEARCHED_FUNC:
6810     case Item_func::CASE_SIMPLE_FUNC:
6811 #ifdef ITEM_FUNC_CASE_PARAMS_ARE_PUBLIC
6812       Item_func_case *item_func_case = (Item_func_case *) item_func;
6813       if (str)
6814       {
6815         if (str->reserve(SPIDER_SQL_CASE_LEN))
6816           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6817         str->q_append(SPIDER_SQL_CASE_STR, SPIDER_SQL_CASE_LEN);
6818       }
6819       if (item_func_case->first_expr_num != -1)
6820       {
6821         if ((error_num = spider_db_print_item_type(
6822           item_list[item_func_case->first_expr_num], NULL, spider, str,
6823           alias, alias_length, dbton_id, use_fields, fields)))
6824           DBUG_RETURN(error_num);
6825       }
6826       for (roop_count = 0; roop_count < item_func_case->ncases;
6827         roop_count += 2)
6828       {
6829         if (str)
6830         {
6831           if (str->reserve(SPIDER_SQL_WHEN_LEN))
6832             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6833           str->q_append(SPIDER_SQL_WHEN_STR, SPIDER_SQL_WHEN_LEN);
6834         }
6835         if ((error_num = spider_db_print_item_type(
6836           item_list[roop_count], NULL, spider, str,
6837           alias, alias_length, dbton_id, use_fields, fields)))
6838           DBUG_RETURN(error_num);
6839         if (str)
6840         {
6841           if (str->reserve(SPIDER_SQL_THEN_LEN))
6842             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6843           str->q_append(SPIDER_SQL_THEN_STR, SPIDER_SQL_THEN_LEN);
6844         }
6845         if ((error_num = spider_db_print_item_type(
6846           item_list[roop_count + 1], NULL, spider, str,
6847           alias, alias_length, dbton_id, use_fields, fields)))
6848           DBUG_RETURN(error_num);
6849       }
6850       if (item_func_case->else_expr_num != -1)
6851       {
6852         if (str)
6853         {
6854           if (str->reserve(SPIDER_SQL_ELSE_LEN))
6855             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6856           str->q_append(SPIDER_SQL_ELSE_STR, SPIDER_SQL_ELSE_LEN);
6857         }
6858         if ((error_num = spider_db_print_item_type(
6859           item_list[item_func_case->else_expr_num], NULL, spider, str,
6860           alias, alias_length, dbton_id, use_fields, fields)))
6861           DBUG_RETURN(error_num);
6862       }
6863       if (str)
6864       {
6865         if (str->reserve(SPIDER_SQL_END_LEN + SPIDER_SQL_CLOSE_PAREN_LEN))
6866           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6867         str->q_append(SPIDER_SQL_END_STR, SPIDER_SQL_END_LEN);
6868         str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,
6869           SPIDER_SQL_CLOSE_PAREN_LEN);
6870       }
6871       DBUG_RETURN(0);
6872 #else
6873       DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
6874 #endif
6875     case Item_func::JSON_EXTRACT_FUNC:
6876       func_name = (char*) item_func->func_name();
6877       func_name_length = strlen(func_name);
6878       if (str)
6879       {
6880         if (str->reserve(func_name_length + SPIDER_SQL_OPEN_PAREN_LEN))
6881           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6882         str->q_append(func_name, func_name_length);
6883         str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
6884       }
6885       func_name = SPIDER_SQL_COMMA_STR;
6886       func_name_length = SPIDER_SQL_COMMA_LEN;
6887       separator_str = SPIDER_SQL_COMMA_STR;
6888       separator_str_length = SPIDER_SQL_COMMA_LEN;
6889       last_str = SPIDER_SQL_CLOSE_PAREN_STR;
6890       last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
6891       break;
6892     default:
6893       THD *thd = spider->wide_handler->trx->thd;
6894       SPIDER_SHARE *share = spider->share;
6895       if (spider_param_skip_default_condition(thd,
6896         share->skip_default_condition))
6897         DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
6898       if (str)
6899       {
6900         func_name = (char*) item_func->func_name();
6901         func_name_length = strlen(func_name);
6902       }
6903       break;
6904   }
6905   DBUG_PRINT("info",("spider func_name = %s", func_name));
6906   DBUG_PRINT("info",("spider func_name_length = %d", func_name_length));
6907   DBUG_PRINT("info",("spider separator_str = %s", separator_str));
6908   DBUG_PRINT("info",("spider separator_str_length = %d", separator_str_length));
6909   DBUG_PRINT("info",("spider last_str = %s", last_str));
6910   DBUG_PRINT("info",("spider last_str_length = %d", last_str_length));
6911   if (item_count)
6912   {
6913     /* Find the field in the list of items of the expression tree */
6914     field = spider_db_find_field_in_item_list(item_list,
6915                                               item_count, start_item,
6916                                               str,
6917                                               func_name, func_name_length);
6918     item_count--;
6919     /*
6920       Loop through the items of the current function expression to
6921       print its portion of the statement
6922     */
6923     for (roop_count = start_item; roop_count < item_count; roop_count++)
6924     {
6925       item = item_list[roop_count];
6926       if ((error_num = spider_db_print_item_type(item, field, spider, str,
6927         alias, alias_length, dbton_id, use_fields, fields)))
6928         DBUG_RETURN(error_num);
6929       if (roop_count == 1)
6930       {
6931         /* Remaining operands need to be preceded by the separator */
6932         func_name = separator_str;
6933         func_name_length = separator_str_length;
6934       }
6935       if (str)
6936       {
6937         if (str->reserve(func_name_length + SPIDER_SQL_SPACE_LEN * 2))
6938           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6939         str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
6940         str->q_append(func_name, func_name_length);
6941         str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
6942       }
6943     }
6944 
6945     /* Print the last operand value */
6946     item = item_list[roop_count];
6947     if ((error_num = spider_db_print_item_type(item, field, spider, str,
6948       alias, alias_length, dbton_id, use_fields, fields)))
6949       DBUG_RETURN(error_num);
6950   }
6951 
6952   if (item_func->functype() == Item_func::FT_FUNC)
6953   {
6954     Item_func_match *item_func_match = (Item_func_match *)item_func;
6955     if (str)
6956     {
6957       if (str->reserve(SPIDER_SQL_AGAINST_LEN))
6958         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6959       str->q_append(SPIDER_SQL_AGAINST_STR, SPIDER_SQL_AGAINST_LEN);
6960     }
6961     item = item_list[0];
6962     if ((error_num = spider_db_print_item_type(item, NULL, spider, str,
6963       alias, alias_length, dbton_id, use_fields, fields)))
6964       DBUG_RETURN(error_num);
6965     if (str)
6966     {
6967       if (str->reserve(
6968         ((item_func_match->flags & FT_BOOL) ?
6969           SPIDER_SQL_IN_BOOLEAN_MODE_LEN : 0) +
6970         ((item_func_match->flags & FT_EXPAND) ?
6971           SPIDER_SQL_WITH_QUERY_EXPANSION_LEN : 0)
6972       ))
6973         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6974       if (item_func_match->flags & FT_BOOL)
6975         str->q_append(SPIDER_SQL_IN_BOOLEAN_MODE_STR,
6976           SPIDER_SQL_IN_BOOLEAN_MODE_LEN);
6977       if (item_func_match->flags & FT_EXPAND)
6978         str->q_append(SPIDER_SQL_WITH_QUERY_EXPANSION_STR,
6979           SPIDER_SQL_WITH_QUERY_EXPANSION_LEN);
6980     }
6981   } else if (item_func->functype() == Item_func::UNKNOWN_FUNC)
6982   {
6983     if (
6984       func_name_length == 7 &&
6985       !strncasecmp("convert", func_name, func_name_length)
6986     ) {
6987       if (str)
6988       {
6989         Item_func_conv_charset *item_func_conv_charset =
6990           (Item_func_conv_charset *)item_func;
6991         CHARSET_INFO *conv_charset =
6992           item_func_conv_charset->SPIDER_Item_func_conv_charset_conv_charset;
6993         uint cset_length = strlen(conv_charset->csname);
6994         if (str->reserve(SPIDER_SQL_USING_LEN + cset_length))
6995           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6996         str->q_append(SPIDER_SQL_USING_STR, SPIDER_SQL_USING_LEN);
6997         str->q_append(conv_charset->csname, cset_length);
6998       }
6999     }
7000   }
7001   if (str)
7002   {
7003     if (merge_func)
7004       str->length(str->length() - SPIDER_SQL_CLOSE_PAREN_LEN);
7005     if (str->reserve(last_str_length + SPIDER_SQL_CLOSE_PAREN_LEN))
7006       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7007     str->q_append(last_str, last_str_length);
7008     str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
7009   }
7010   DBUG_RETURN(0);
7011 }
7012 
7013 #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)7014 int spider_db_mbase_util::open_item_sum_func(
7015   Item_sum *item_sum,
7016   ha_spider *spider,
7017   spider_string *str,
7018   const char *alias,
7019   uint alias_length,
7020   bool use_fields,
7021   spider_fields *fields
7022 ) {
7023   uint roop_count, item_count = item_sum->get_arg_count();
7024   int error_num;
7025   DBUG_ENTER("spider_db_mbase_util::open_item_sum_func");
7026   DBUG_PRINT("info",("spider Sumfunctype = %d", item_sum->sum_func()));
7027   switch (item_sum->sum_func())
7028   {
7029     case Item_sum::COUNT_FUNC:
7030     case Item_sum::SUM_FUNC:
7031     case Item_sum::MIN_FUNC:
7032     case Item_sum::MAX_FUNC:
7033       {
7034         const char *func_name = item_sum->func_name();
7035         uint func_name_length = strlen(func_name);
7036         Item *item, **args = item_sum->get_args();
7037         if (str)
7038         {
7039           if (str->reserve(func_name_length))
7040             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7041           str->q_append(func_name, func_name_length);
7042         }
7043         if (item_count)
7044         {
7045           item_count--;
7046           for (roop_count = 0; roop_count < item_count; roop_count++)
7047           {
7048             item = args[roop_count];
7049             if ((error_num = spider_db_print_item_type(item, NULL, spider, str,
7050               alias, alias_length, dbton_id, use_fields, fields)))
7051               DBUG_RETURN(error_num);
7052             if (str)
7053             {
7054               if (str->reserve(SPIDER_SQL_COMMA_LEN))
7055                 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7056               str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
7057             }
7058           }
7059           item = args[roop_count];
7060           if ((error_num = spider_db_print_item_type(item, NULL, spider, str,
7061             alias, alias_length, dbton_id, use_fields, fields)))
7062             DBUG_RETURN(error_num);
7063         }
7064         if (str)
7065         {
7066           if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN))
7067             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7068           str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,
7069             SPIDER_SQL_CLOSE_PAREN_LEN);
7070         }
7071       }
7072       break;
7073     case Item_sum::COUNT_DISTINCT_FUNC:
7074     case Item_sum::SUM_DISTINCT_FUNC:
7075     case Item_sum::AVG_FUNC:
7076     case Item_sum::AVG_DISTINCT_FUNC:
7077       {
7078         if (!use_fields)
7079           DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
7080         const char *func_name = item_sum->func_name();
7081         uint func_name_length = strlen(func_name);
7082         Item *item, **args = item_sum->get_args();
7083         if (str)
7084         {
7085           if (str->reserve(func_name_length))
7086             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7087           str->q_append(func_name, func_name_length);
7088         }
7089         if (item_count)
7090         {
7091           item_count--;
7092           for (roop_count = 0; roop_count < item_count; roop_count++)
7093           {
7094             item = args[roop_count];
7095             if ((error_num = spider_db_print_item_type(item, NULL, spider, str,
7096               alias, alias_length, dbton_id, use_fields, fields)))
7097               DBUG_RETURN(error_num);
7098             if (str)
7099             {
7100               if (str->reserve(SPIDER_SQL_COMMA_LEN))
7101                 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7102               str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
7103             }
7104           }
7105           item = args[roop_count];
7106           if ((error_num = spider_db_print_item_type(item, NULL, spider, str,
7107             alias, alias_length, dbton_id, use_fields, fields)))
7108             DBUG_RETURN(error_num);
7109         }
7110         if (str)
7111         {
7112           if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN))
7113             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7114           str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,
7115             SPIDER_SQL_CLOSE_PAREN_LEN);
7116         }
7117       }
7118       break;
7119     case Item_sum::STD_FUNC:
7120     case Item_sum::VARIANCE_FUNC:
7121     case Item_sum::SUM_BIT_FUNC:
7122     case Item_sum::UDF_SUM_FUNC:
7123     case Item_sum::GROUP_CONCAT_FUNC:
7124     default:
7125       DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
7126   }
7127   DBUG_RETURN(0);
7128 }
7129 #endif
7130 
append_escaped_util(spider_string * to,String * from)7131 int spider_db_mbase_util::append_escaped_util(
7132   spider_string *to,
7133   String *from
7134 ) {
7135   DBUG_ENTER("spider_db_mbase_util::append_escaped_util");
7136   DBUG_PRINT("info",("spider this=%p", this));
7137   DBUG_PRINT("info",("spider from=%s", from->charset()->csname));
7138   DBUG_PRINT("info",("spider to=%s", to->charset()->csname));
7139   to->append_escape_string(from->ptr(), from->length());
7140   DBUG_RETURN(0);
7141 }
7142 
7143 #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)7144 int spider_db_mbase_util::append_table(
7145   ha_spider *spider,
7146   spider_fields *fields,
7147   spider_string *str,
7148   TABLE_LIST *table_list,
7149   TABLE_LIST **used_table_list,
7150   uint *current_pos,
7151   TABLE_LIST **cond_table_list_ptr,
7152   bool top_down,
7153   bool first
7154 ) {
7155   int error_num;
7156   bool use_cond_table_list = FALSE;
7157   spider_mbase_share *db_share;
7158   spider_mbase_handler *dbton_hdl;
7159   SPIDER_TABLE_HOLDER *table_holder;
7160   TABLE_LIST *cond_table_list = *cond_table_list_ptr;
7161   ha_spider *spd;
7162   DBUG_ENTER("spider_db_mbase_util::append_table");
7163   DBUG_PRINT("info",("spider table_list=%p", table_list));
7164   DBUG_PRINT("info",("spider table_list->outer_join=%u",
7165     table_list->outer_join));
7166   DBUG_PRINT("info",("spider table_list->on_expr=%p",
7167     table_list->on_expr));
7168   DBUG_PRINT("info",("spider table_list->join_using_fields=%p",
7169     table_list->join_using_fields));
7170   DBUG_PRINT("info",("spider table_list->table=%p",
7171     table_list->table));
7172   if (!top_down && table_list->embedding)
7173   {
7174     if ((error_num = append_embedding_tables(spider, fields, str,
7175       table_list->embedding, used_table_list, current_pos,
7176       cond_table_list_ptr)))
7177       DBUG_RETURN(error_num);
7178   } else if (!table_list->table)
7179   {
7180     if ((error_num = append_tables_top_down(spider, fields, str, table_list,
7181       used_table_list, current_pos, cond_table_list_ptr)))
7182       DBUG_RETURN(error_num);
7183   } else {
7184     if (
7185       table_list->outer_join ||
7186       table_list->on_expr ||
7187       table_list->join_using_fields
7188     ) {
7189       DBUG_PRINT("info",("spider use table_list"));
7190       if (table_list->outer_join & JOIN_TYPE_LEFT)
7191       {
7192         if (str)
7193         {
7194           if (str->reserve(SPIDER_SQL_LEFT_JOIN_LEN))
7195           {
7196             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7197           }
7198           str->q_append(SPIDER_SQL_LEFT_JOIN_STR, SPIDER_SQL_LEFT_JOIN_LEN);
7199         }
7200       } else {
7201         if (str)
7202         {
7203           if (str->reserve(SPIDER_SQL_JOIN_LEN))
7204           {
7205             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7206           }
7207           str->q_append(SPIDER_SQL_JOIN_STR, SPIDER_SQL_JOIN_LEN);
7208         }
7209       }
7210     } else if (
7211       cond_table_list &&
7212       (
7213         cond_table_list->outer_join ||
7214         cond_table_list->on_expr ||
7215         cond_table_list->join_using_fields
7216       )
7217     ) {
7218       DBUG_PRINT("info",("spider use cond_table_list"));
7219       if (cond_table_list->outer_join & (JOIN_TYPE_LEFT | JOIN_TYPE_RIGHT))
7220       {
7221         if (str)
7222         {
7223           if (str->reserve(SPIDER_SQL_LEFT_JOIN_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         }
7229       } else {
7230         if (str)
7231         {
7232           if (str->reserve(SPIDER_SQL_JOIN_LEN))
7233           {
7234             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7235           }
7236           str->q_append(SPIDER_SQL_JOIN_STR, SPIDER_SQL_JOIN_LEN);
7237         }
7238       }
7239       use_cond_table_list = TRUE;
7240     } else if (*current_pos > 0 && !first)
7241     {
7242       DBUG_PRINT("info",("spider no condition"));
7243       if (top_down)
7244       {
7245         if (str)
7246         {
7247           if (str->reserve(SPIDER_SQL_JOIN_LEN))
7248           {
7249             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7250           }
7251           str->q_append(SPIDER_SQL_JOIN_STR, SPIDER_SQL_JOIN_LEN);
7252         }
7253       } else {
7254         if (str)
7255         {
7256           if (str->reserve(SPIDER_SQL_COMMA_LEN))
7257           {
7258             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7259           }
7260           str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
7261         }
7262       }
7263     }
7264 
7265     if (str)
7266     {
7267       table_holder = fields->get_table_holder(table_list->table);
7268       spd = table_holder->spider;
7269       db_share = (spider_mbase_share *)
7270         spd->share->dbton_share[dbton_id];
7271       dbton_hdl = (spider_mbase_handler *)
7272         spd->dbton_handler[dbton_id];
7273 
7274       dbton_hdl->table_name_pos = str->length();
7275 
7276       if (str->reserve(
7277         db_share->db_nm_max_length +
7278         SPIDER_SQL_DOT_LEN + /* SPIDER_SQL_NAME_QUOTE_LEN */ 4 +
7279         db_share->table_nm_max_length + SPIDER_SQL_SPACE_LEN +
7280         table_holder->alias->length() - SPIDER_SQL_DOT_LEN
7281       )) {
7282         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7283       }
7284 
7285       if ((error_num = db_share->append_table_name_with_adjusting(str,
7286         spd->conn_link_idx[dbton_hdl->first_link_idx])))
7287       {
7288         DBUG_RETURN(error_num);
7289       }
7290       str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
7291       str->q_append(table_holder->alias->ptr(),
7292         table_holder->alias->length() - SPIDER_SQL_DOT_LEN);
7293     }
7294     used_table_list[(*current_pos)++] = table_list;
7295 
7296     if (str)
7297     {
7298       List<String> *join_using_fields = table_list->join_using_fields;
7299       if (!join_using_fields && cond_table_list)
7300       {
7301         join_using_fields = cond_table_list->join_using_fields;
7302       }
7303 
7304       if (join_using_fields)
7305       {
7306         if (str->reserve(SPIDER_SQL_USING_LEN + SPIDER_SQL_OPEN_PAREN_LEN))
7307         {
7308           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7309         }
7310         str->q_append(SPIDER_SQL_USING_STR, SPIDER_SQL_USING_LEN);
7311         str->q_append(SPIDER_SQL_OPEN_PAREN_STR,
7312           SPIDER_SQL_OPEN_PAREN_LEN);
7313         List_iterator_fast<String> it2(*join_using_fields);
7314         String *ptr;
7315         while ((ptr = it2++))
7316         {
7317           if (str->reserve(ptr->length() + SPIDER_SQL_COMMA_LEN))
7318           {
7319             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7320           }
7321           str->q_append(ptr->ptr(), ptr->length());
7322           str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
7323         }
7324         str->length(str->length() - SPIDER_SQL_COMMA_LEN);
7325         if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN))
7326         {
7327           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7328         }
7329         str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,
7330           SPIDER_SQL_CLOSE_PAREN_LEN);
7331       }
7332     }
7333 
7334     Item *on_expr = table_list->on_expr;
7335     if (!on_expr && cond_table_list)
7336     {
7337       on_expr = cond_table_list->on_expr;
7338     }
7339 
7340     if (on_expr)
7341     {
7342       if (str)
7343       {
7344         if (str->reserve(SPIDER_SQL_ON_LEN))
7345         {
7346           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7347         }
7348         str->q_append(SPIDER_SQL_ON_STR, SPIDER_SQL_ON_LEN);
7349       }
7350       if ((error_num = spider_db_print_item_type(on_expr, NULL,
7351         spider, str, NULL, 0, dbton_id, TRUE, fields)))
7352       {
7353         DBUG_RETURN(error_num);
7354       }
7355     }
7356 
7357     if (use_cond_table_list)
7358     {
7359       (*cond_table_list_ptr) = NULL;
7360       DBUG_PRINT("info",("spider cond_table_list=%p", (*cond_table_list_ptr)));
7361     }
7362   }
7363   DBUG_RETURN(0);
7364 }
7365 
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)7366 int spider_db_mbase_util::append_tables_top_down(
7367   ha_spider *spider,
7368   spider_fields *fields,
7369   spider_string *str,
7370   TABLE_LIST *table_list,
7371   TABLE_LIST **used_table_list,
7372   uint *current_pos,
7373   TABLE_LIST **cond_table_list_ptr
7374 ) {
7375   int error_num;
7376   uint outer_join_backup;
7377   TABLE_LIST *cur_table_list, *prev_table_list = NULL, *cond_table_list = NULL;
7378   bool first = TRUE;
7379   DBUG_ENTER("spider_db_mbase_util::append_tables_top_down");
7380   DBUG_PRINT("info",("spider this=%p", this));
7381   if (
7382     table_list->outer_join ||
7383     table_list->on_expr ||
7384     table_list->join_using_fields
7385   ) {
7386     DBUG_ASSERT(!(*cond_table_list_ptr));
7387     (*cond_table_list_ptr) = table_list;
7388     DBUG_PRINT("info",("spider cond_table_list=%p", table_list));
7389   }
7390   List_iterator_fast<TABLE_LIST> it1(table_list->nested_join->join_list);
7391   cur_table_list = it1++;
7392   if (cur_table_list->outer_join & JOIN_TYPE_RIGHT)
7393   {
7394     first = FALSE;
7395     prev_table_list = cur_table_list;
7396     cur_table_list = it1++;
7397   } else if (*cond_table_list_ptr)
7398   {
7399     first = TRUE;
7400     cond_table_list = (*cond_table_list_ptr);
7401     (*cond_table_list_ptr) = NULL;
7402     if (cond_table_list->outer_join & JOIN_TYPE_LEFT)
7403     {
7404       if (str)
7405       {
7406         if (str->reserve(SPIDER_SQL_LEFT_JOIN_LEN + SPIDER_SQL_OPEN_PAREN_LEN))
7407         {
7408           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7409         }
7410         str->q_append(SPIDER_SQL_LEFT_JOIN_STR, SPIDER_SQL_LEFT_JOIN_LEN);
7411         str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
7412       }
7413     } else {
7414       if (str)
7415       {
7416         if (str->reserve(SPIDER_SQL_JOIN_LEN + SPIDER_SQL_OPEN_PAREN_LEN))
7417         {
7418           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7419         }
7420         str->q_append(SPIDER_SQL_JOIN_STR, SPIDER_SQL_JOIN_LEN);
7421         str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
7422       }
7423     }
7424   }
7425 
7426   do {
7427     if (cur_table_list->outer_join & JOIN_TYPE_RIGHT)
7428     {
7429       prev_table_list = cur_table_list;
7430     } else {
7431       if ((error_num = append_table(spider, fields, str, cur_table_list,
7432         used_table_list, current_pos, cond_table_list_ptr, TRUE, first)))
7433         DBUG_RETURN(error_num);
7434       first = FALSE;
7435       if (prev_table_list)
7436       {
7437         outer_join_backup = prev_table_list->outer_join;
7438         prev_table_list->outer_join = JOIN_TYPE_LEFT;
7439         if ((error_num = append_table(spider, fields, str, prev_table_list,
7440           used_table_list, current_pos, cond_table_list_ptr, TRUE, FALSE)))
7441         {
7442           prev_table_list->outer_join = outer_join_backup;
7443           DBUG_RETURN(error_num);
7444         }
7445         prev_table_list->outer_join = outer_join_backup;
7446         prev_table_list = NULL;
7447       }
7448     }
7449   } while ((cur_table_list = it1++));
7450 
7451   if (cond_table_list)
7452   {
7453     if (str)
7454     {
7455       if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN))
7456       {
7457         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7458       }
7459       str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,
7460         SPIDER_SQL_CLOSE_PAREN_LEN);
7461 
7462       List<String> *join_using_fields = cond_table_list->join_using_fields;
7463       if (join_using_fields)
7464       {
7465         if (str->reserve(SPIDER_SQL_USING_LEN + SPIDER_SQL_OPEN_PAREN_LEN))
7466         {
7467           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7468         }
7469         str->q_append(SPIDER_SQL_USING_STR, SPIDER_SQL_USING_LEN);
7470         str->q_append(SPIDER_SQL_OPEN_PAREN_STR,
7471           SPIDER_SQL_OPEN_PAREN_LEN);
7472         List_iterator_fast<String> it2(*join_using_fields);
7473         String *ptr;
7474         while ((ptr = it2++))
7475         {
7476           if (str->reserve(ptr->length() + SPIDER_SQL_COMMA_LEN))
7477           {
7478             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7479           }
7480           str->q_append(ptr->ptr(), ptr->length());
7481           str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
7482         }
7483         str->length(str->length() - SPIDER_SQL_COMMA_LEN);
7484         if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN))
7485         {
7486           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7487         }
7488         str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,
7489           SPIDER_SQL_CLOSE_PAREN_LEN);
7490       }
7491     }
7492 
7493     Item *on_expr = cond_table_list->on_expr;
7494     if (on_expr)
7495     {
7496       if (str)
7497       {
7498         if (str->reserve(SPIDER_SQL_ON_LEN))
7499         {
7500           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7501         }
7502         str->q_append(SPIDER_SQL_ON_STR, SPIDER_SQL_ON_LEN);
7503       }
7504       if ((error_num = spider_db_print_item_type(on_expr, NULL,
7505         spider, str, NULL, 0, dbton_id, TRUE, fields)))
7506       {
7507         DBUG_RETURN(error_num);
7508       }
7509     }
7510   }
7511   DBUG_RETURN(0);
7512 }
7513 
append_tables_top_down_check(TABLE_LIST * table_list,TABLE_LIST ** used_table_list,uint * current_pos)7514 int spider_db_mbase_util::append_tables_top_down_check(
7515   TABLE_LIST *table_list,
7516   TABLE_LIST **used_table_list,
7517   uint *current_pos
7518 ) {
7519   int error_num;
7520   TABLE_LIST *cur_table_list;
7521   DBUG_ENTER("spider_db_mbase_util::append_tables_top_down_check");
7522   DBUG_PRINT("info",("spider this=%p", this));
7523   List_iterator_fast<TABLE_LIST> it1(table_list->nested_join->join_list);
7524   while ((cur_table_list = it1++))
7525   {
7526     if (!cur_table_list->table)
7527     {
7528       if ((error_num = append_tables_top_down_check(
7529         cur_table_list, used_table_list, current_pos)))
7530         DBUG_RETURN(error_num);
7531     } else {
7532       used_table_list[(*current_pos)++] = cur_table_list;
7533     }
7534   }
7535   DBUG_RETURN(0);
7536 }
7537 
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)7538 int spider_db_mbase_util::append_embedding_tables(
7539   ha_spider *spider,
7540   spider_fields *fields,
7541   spider_string *str,
7542   TABLE_LIST *table_list,
7543   TABLE_LIST **used_table_list,
7544   uint *current_pos,
7545   TABLE_LIST **cond_table_list_ptr
7546 ) {
7547   int error_num;
7548   TABLE_LIST *embedding = table_list->embedding;
7549   DBUG_ENTER("spider_db_mbase_util::append_embedding_tables");
7550   DBUG_PRINT("info",("spider this=%p", this));
7551   if (embedding)
7552   {
7553     DBUG_PRINT("info",("spider embedding=%p", embedding));
7554     DBUG_PRINT("info",("spider embedding->outer_join=%u",
7555       embedding->outer_join));
7556     DBUG_PRINT("info",("spider embedding->on_expr=%p",
7557       embedding->on_expr));
7558     DBUG_PRINT("info",("spider embedding->join_using_fields=%p",
7559       embedding->join_using_fields));
7560     DBUG_PRINT("info",("spider embedding->table=%p",
7561       embedding->table));
7562     if ((error_num = append_embedding_tables(spider, fields, str, embedding,
7563       used_table_list, current_pos, cond_table_list_ptr)))
7564       DBUG_RETURN(error_num);
7565   } else {
7566     DBUG_PRINT("info",("spider table_list=%p", table_list));
7567     DBUG_PRINT("info",("spider table_list->outer_join=%u",
7568       table_list->outer_join));
7569     DBUG_PRINT("info",("spider table_list->on_expr=%p",
7570       table_list->on_expr));
7571     DBUG_PRINT("info",("spider table_list->join_using_fields=%p",
7572       table_list->join_using_fields));
7573     DBUG_PRINT("info",("spider table_list->table=%p",
7574       table_list->table));
7575     if (table_list->outer_join & JOIN_TYPE_RIGHT)
7576     {
7577       if ((error_num = append_tables_top_down_check(table_list,
7578         used_table_list, current_pos)))
7579         DBUG_RETURN(error_num);
7580       DBUG_ASSERT(!(*cond_table_list_ptr));
7581       (*cond_table_list_ptr) = table_list;
7582       DBUG_PRINT("info",("spider cond_table_list=%p", table_list));
7583     } else {
7584       if ((error_num = append_tables_top_down(spider, fields, str, table_list,
7585         used_table_list, current_pos, cond_table_list_ptr)))
7586         DBUG_RETURN(error_num);
7587     }
7588   }
7589   DBUG_RETURN(0);
7590 }
7591 
append_from_and_tables(ha_spider * spider,spider_fields * fields,spider_string * str,TABLE_LIST * table_list,uint table_count)7592 int spider_db_mbase_util::append_from_and_tables(
7593   ha_spider *spider,
7594   spider_fields *fields,
7595   spider_string *str,
7596   TABLE_LIST *table_list,
7597   uint table_count
7598 ) {
7599   int error_num;
7600   uint current_pos = 0, roop_count, backup_pos, outer_join_backup;
7601   TABLE *table;
7602   TABLE_LIST **used_table_list, *prev_table_list = NULL,
7603     *cond_table_list = NULL;
7604   DBUG_ENTER("spider_db_mbase_util::append_from_and_tables");
7605   DBUG_PRINT("info",("spider this=%p", this));
7606   used_table_list = (TABLE_LIST **)
7607     my_alloca(sizeof(TABLE_LIST *) * table_count);
7608   if (!used_table_list)
7609     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7610 
7611   if (str)
7612   {
7613     if (str->reserve(SPIDER_SQL_FROM_LEN))
7614     {
7615       my_afree(used_table_list);
7616       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7617     }
7618     str->q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN);
7619   }
7620 
7621   do {
7622     table = table_list->table;
7623     if (table->const_table)
7624       continue;
7625 
7626     for (roop_count = 0; roop_count < current_pos; ++roop_count)
7627     {
7628       if (used_table_list[roop_count] == table_list)
7629         break;
7630     }
7631     if (roop_count < current_pos)
7632       continue;
7633 
7634     if (prev_table_list)
7635       current_pos = backup_pos;
7636     else
7637       backup_pos = current_pos;
7638     if ((error_num = append_table(spider, fields, str, table_list, used_table_list,
7639       &current_pos, &cond_table_list, FALSE, FALSE)))
7640     {
7641       my_afree(used_table_list);
7642       DBUG_RETURN(error_num);
7643     }
7644     if (prev_table_list)
7645     {
7646       outer_join_backup = prev_table_list->outer_join;
7647       prev_table_list->outer_join = JOIN_TYPE_LEFT;
7648       if ((error_num = append_table(spider, fields, str, prev_table_list,
7649         used_table_list, &current_pos, &cond_table_list, FALSE, FALSE)))
7650       {
7651         prev_table_list->outer_join = outer_join_backup;
7652         my_afree(used_table_list);
7653         DBUG_RETURN(error_num);
7654       }
7655       prev_table_list->outer_join = outer_join_backup;
7656       prev_table_list = NULL;
7657     }
7658     if (cond_table_list && (cond_table_list->outer_join & JOIN_TYPE_RIGHT))
7659     {
7660       prev_table_list = cond_table_list;
7661       cond_table_list = NULL;
7662       DBUG_PRINT("info",("spider cond_table_list=%p", cond_table_list));
7663     }
7664   } while ((table_list = table_list->next_local));
7665   my_afree(used_table_list);
7666   DBUG_RETURN(0);
7667 }
7668 
reappend_tables(spider_fields * fields,SPIDER_LINK_IDX_CHAIN * link_idx_chain,spider_string * str)7669 int spider_db_mbase_util::reappend_tables(
7670   spider_fields *fields,
7671   SPIDER_LINK_IDX_CHAIN *link_idx_chain,
7672   spider_string *str
7673 ) {
7674   int error_num;
7675   uint32 length;
7676   ha_spider *spider;
7677   spider_mbase_share *db_share;
7678   spider_mbase_handler *dbton_hdl;
7679   SPIDER_TABLE_HOLDER *table_holder;
7680   SPIDER_LINK_IDX_HOLDER *link_idx_holder;
7681   DBUG_ENTER("spider_db_mbase_util::reappend_tables");
7682   DBUG_PRINT("info",("spider this=%p", this));
7683   length = str->length();
7684   fields->set_pos_to_first_table_on_link_idx_chain(link_idx_chain);
7685   fields->set_pos_to_first_table_holder();
7686   while ((table_holder = fields->get_next_table_holder()))
7687   {
7688     link_idx_holder =
7689       fields->get_next_table_on_link_idx_chain(link_idx_chain);
7690     spider = table_holder->spider;
7691     db_share = (spider_mbase_share *)
7692       spider->share->dbton_share[dbton_id];
7693     if (!db_share->same_db_table_name)
7694     {
7695       dbton_hdl = (spider_mbase_handler *) spider->dbton_handler[dbton_id];
7696       str->length(dbton_hdl->table_name_pos);
7697       if ((error_num = db_share->append_table_name_with_adjusting(str,
7698         spider->conn_link_idx[link_idx_holder->link_idx])))
7699       {
7700         DBUG_RETURN(error_num);
7701       }
7702     }
7703   }
7704   str->length(length);
7705   DBUG_RETURN(0);
7706 }
7707 
append_where(spider_string * str)7708 int spider_db_mbase_util::append_where(
7709   spider_string *str
7710 ) {
7711   DBUG_ENTER("spider_db_mbase_util::append_where");
7712   DBUG_PRINT("info",("spider this=%p", this));
7713   if (str->reserve(SPIDER_SQL_WHERE_LEN))
7714     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7715   str->q_append(SPIDER_SQL_WHERE_STR, SPIDER_SQL_WHERE_LEN);
7716   DBUG_RETURN(0);
7717 }
7718 
append_having(spider_string * str)7719 int spider_db_mbase_util::append_having(
7720   spider_string *str
7721 ) {
7722   DBUG_ENTER("spider_db_mbase_util::append_having");
7723   DBUG_PRINT("info",("spider this=%p", this));
7724   if (str->reserve(SPIDER_SQL_HAVING_LEN))
7725     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7726   str->q_append(SPIDER_SQL_HAVING_STR, SPIDER_SQL_HAVING_LEN);
7727   DBUG_RETURN(0);
7728 }
7729 #endif
7730 
append_charset_name_before_string()7731 bool spider_db_mbase_util::append_charset_name_before_string()
7732 {
7733   DBUG_ENTER("spider_db_mbase_util::append_charset_name_before_string");
7734   DBUG_PRINT("info",("spider this=%p", this));
7735   DBUG_RETURN(TRUE);
7736 }
7737 
spider_mbase_share(st_spider_share * share,uint dbton_id,spider_db_mbase_util * spider_db_mbase_utility)7738 spider_mbase_share::spider_mbase_share(
7739   st_spider_share *share,
7740   uint dbton_id,
7741   spider_db_mbase_util *spider_db_mbase_utility
7742 ) : spider_db_share(
7743   share,
7744   dbton_id
7745 ),
7746   spider_db_mbase_utility(spider_db_mbase_utility),
7747   table_select(NULL),
7748   table_select_pos(0),
7749   key_select(NULL),
7750   key_select_pos(NULL),
7751   key_hint(NULL),
7752   show_table_status(NULL),
7753   show_records(NULL),
7754   show_index(NULL),
7755   table_names_str(NULL),
7756   db_names_str(NULL),
7757   db_table_str(NULL),
7758 #ifdef SPIDER_HAS_HASH_VALUE_TYPE
7759   db_table_str_hash_value(NULL),
7760 #endif
7761   table_nm_max_length(0),
7762   db_nm_max_length(0),
7763   column_name_str(NULL),
7764   same_db_table_name(TRUE),
7765   first_all_link_idx(-1)
7766 {
7767   DBUG_ENTER("spider_mbase_share::spider_mbase_share");
7768   DBUG_PRINT("info",("spider this=%p", this));
7769   spider_alloc_calc_mem_init(mem_calc, 71);
7770   spider_alloc_calc_mem(spider_current_trx, mem_calc, sizeof(*this));
7771   DBUG_VOID_RETURN;
7772 }
7773 
spider_mysql_share(st_spider_share * share)7774 spider_mysql_share::spider_mysql_share(
7775   st_spider_share *share
7776 ) : spider_mbase_share(
7777   share,
7778   spider_db_mysql_utility.dbton_id,
7779   &spider_db_mysql_utility
7780 ) {
7781   DBUG_ENTER("spider_mysql_share::spider_mysql_share");
7782   DBUG_PRINT("info",("spider this=%p", this));
7783   DBUG_VOID_RETURN;
7784 }
spider_mariadb_share(st_spider_share * share)7785 spider_mariadb_share::spider_mariadb_share(
7786   st_spider_share *share
7787 ) : spider_mbase_share(
7788   share,
7789   spider_db_mariadb_utility.dbton_id,
7790   &spider_db_mariadb_utility
7791 ) {
7792   DBUG_ENTER("spider_mariadb_share::spider_mariadb_share");
7793   DBUG_PRINT("info",("spider this=%p", this));
7794   DBUG_VOID_RETURN;
7795 }
7796 
~spider_mbase_share()7797 spider_mbase_share::~spider_mbase_share()
7798 {
7799   DBUG_ENTER("spider_mbase_share::~spider_mbase_share");
7800   DBUG_PRINT("info",("spider this=%p", this));
7801   if (table_select)
7802     delete [] table_select;
7803   if (key_select)
7804     delete [] key_select;
7805   if (key_hint)
7806     delete [] key_hint;
7807   free_show_table_status();
7808   free_show_records();
7809   free_show_index();
7810   free_column_name_str();
7811   free_table_names_str();
7812   if (key_select_pos)
7813   {
7814     spider_free(spider_current_trx, key_select_pos, MYF(0));
7815   }
7816   spider_free_mem_calc(spider_current_trx, mem_calc_id, sizeof(*this));
7817   DBUG_VOID_RETURN;
7818 }
7819 
~spider_mysql_share()7820 spider_mysql_share::~spider_mysql_share()
7821 {
7822   DBUG_ENTER("spider_mysql_share::~spider_mysql_share");
7823   DBUG_PRINT("info",("spider this=%p", this));
7824   DBUG_VOID_RETURN;
7825 }
7826 
~spider_mariadb_share()7827 spider_mariadb_share::~spider_mariadb_share()
7828 {
7829   DBUG_ENTER("spider_mariadb_share::~spider_mariadb_share");
7830   DBUG_PRINT("info",("spider this=%p", this));
7831   DBUG_VOID_RETURN;
7832 }
7833 
init()7834 int spider_mbase_share::init()
7835 {
7836   int error_num;
7837   uint roop_count;
7838   TABLE_SHARE *table_share = spider_share->table_share;
7839   uint keys = table_share ? table_share->keys : 0;
7840   DBUG_ENTER("spider_mbase_share::init");
7841   DBUG_PRINT("info",("spider this=%p", this));
7842   if (!(key_select_pos = (int *)
7843     spider_bulk_alloc_mem(spider_current_trx, 112,
7844       __func__, __FILE__, __LINE__, MYF(MY_WME | MY_ZEROFILL),
7845       &key_select_pos,
7846         sizeof(int) * keys,
7847 #ifdef SPIDER_HAS_HASH_VALUE_TYPE
7848       &db_table_str_hash_value,
7849         sizeof(my_hash_value_type) * spider_share->all_link_count,
7850 #endif
7851       NullS))
7852   ) {
7853     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7854   }
7855 
7856   if (keys > 0 &&
7857     !(key_hint = new spider_string[keys])
7858   ) {
7859     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7860   }
7861   for (roop_count = 0; roop_count < keys; roop_count++)
7862   {
7863     key_hint[roop_count].init_calc_mem(189);
7864     key_hint[roop_count].set_charset(spider_share->access_charset);
7865   }
7866   DBUG_PRINT("info",("spider key_hint=%p", key_hint));
7867 
7868   if (
7869     !(table_select = new spider_string[1]) ||
7870     (keys > 0 &&
7871       !(key_select = new spider_string[keys])
7872     ) ||
7873     (error_num = create_table_names_str()) ||
7874     (table_share &&
7875       (
7876         (error_num = create_column_name_str()) ||
7877         (error_num = convert_key_hint_str()) ||
7878         (error_num = append_show_table_status()) ||
7879         (error_num = append_show_records()) ||
7880         (error_num = append_show_index())
7881       )
7882     )
7883   ) {
7884     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7885   }
7886 
7887   table_select->init_calc_mem(96);
7888   if (table_share && (error_num = append_table_select()))
7889     DBUG_RETURN(error_num);
7890 
7891   for (roop_count = 0; roop_count < keys; roop_count++)
7892   {
7893     key_select[roop_count].init_calc_mem(97);
7894     if ((error_num = append_key_select(roop_count)))
7895       DBUG_RETURN(error_num);
7896   }
7897 
7898   DBUG_RETURN(error_num);
7899 }
7900 
get_column_name_length(uint field_index)7901 uint spider_mbase_share::get_column_name_length(
7902   uint field_index
7903 ) {
7904   DBUG_ENTER("spider_mbase_share::get_column_name_length");
7905   DBUG_PRINT("info",("spider this=%p", this));
7906   DBUG_RETURN(column_name_str[field_index].length());
7907 }
7908 
append_column_name(spider_string * str,uint field_index)7909 int spider_mbase_share::append_column_name(
7910   spider_string *str,
7911   uint field_index
7912 ) {
7913   int error_num;
7914   DBUG_ENTER("spider_mbase_share::append_column_name");
7915   DBUG_PRINT("info",("spider this=%p", this));
7916   error_num = spider_db_mbase_utility->append_name(str,
7917     column_name_str[field_index].ptr(), column_name_str[field_index].length());
7918   DBUG_RETURN(error_num);
7919 }
7920 
append_column_name_with_alias(spider_string * str,uint field_index,const char * alias,uint alias_length)7921 int spider_mbase_share::append_column_name_with_alias(
7922   spider_string *str,
7923   uint field_index,
7924   const char *alias,
7925   uint alias_length
7926 ) {
7927   DBUG_ENTER("spider_mbase_share::append_column_name_with_alias");
7928   DBUG_PRINT("info",("spider this=%p", this));
7929   if (str->reserve(
7930     alias_length +
7931     column_name_str[field_index].length() +
7932     /* SPIDER_SQL_NAME_QUOTE_LEN */ 2))
7933     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7934   str->q_append(alias, alias_length);
7935   append_column_name(str, field_index);
7936   DBUG_RETURN(0);
7937 }
7938 
append_table_name(spider_string * str,int all_link_idx)7939 int spider_mbase_share::append_table_name(
7940   spider_string *str,
7941   int all_link_idx
7942 ) {
7943   const char *db_nm = db_names_str[all_link_idx].ptr();
7944   uint db_nm_len = db_names_str[all_link_idx].length();
7945   const char *table_nm = table_names_str[all_link_idx].ptr();
7946   uint table_nm_len = table_names_str[all_link_idx].length();
7947   DBUG_ENTER("spider_mbase_share::append_table_name");
7948   DBUG_PRINT("info",("spider this=%p", this));
7949   if (str->reserve(db_nm_len + SPIDER_SQL_DOT_LEN + table_nm_len +
7950     /* SPIDER_SQL_NAME_QUOTE_LEN */ 4))
7951   {
7952     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7953   }
7954   spider_db_mbase_utility->append_name(str, db_nm, db_nm_len);
7955   str->q_append(SPIDER_SQL_DOT_STR, SPIDER_SQL_DOT_LEN);
7956   spider_db_mbase_utility->append_name(str, table_nm, table_nm_len);
7957   DBUG_RETURN(0);
7958 }
7959 
append_table_name_with_adjusting(spider_string * str,int all_link_idx)7960 int spider_mbase_share::append_table_name_with_adjusting(
7961   spider_string *str,
7962   int all_link_idx
7963 ) {
7964   const char *db_nm = db_names_str[all_link_idx].ptr();
7965   uint db_nm_len = db_names_str[all_link_idx].length();
7966   uint db_nm_max_len = db_nm_max_length;
7967   const char *table_nm = table_names_str[all_link_idx].ptr();
7968   uint table_nm_len = table_names_str[all_link_idx].length();
7969   uint table_nm_max_len = table_nm_max_length;
7970   DBUG_ENTER("spider_mbase_share::append_table_name_with_adjusting");
7971   DBUG_PRINT("info",("spider this=%p", this));
7972   spider_db_mbase_utility->append_name(str, db_nm, db_nm_len);
7973   str->q_append(SPIDER_SQL_DOT_STR, SPIDER_SQL_DOT_LEN);
7974   spider_db_mbase_utility->append_name(str, table_nm, table_nm_len);
7975   uint length =
7976     db_nm_max_len - db_nm_len +
7977     table_nm_max_len - table_nm_len;
7978   memset((char *) str->ptr() + str->length(), ' ', length);
7979   str->length(str->length() + length);
7980   DBUG_RETURN(0);
7981 }
7982 
append_from_with_adjusted_table_name(spider_string * str,int * table_name_pos)7983 int spider_mbase_share::append_from_with_adjusted_table_name(
7984   spider_string *str,
7985   int *table_name_pos
7986 ) {
7987   const char *db_nm = db_names_str[0].ptr();
7988   uint db_nm_len = db_names_str[0].length();
7989   uint db_nm_max_len = db_nm_max_length;
7990   const char *table_nm = table_names_str[0].ptr();
7991   uint table_nm_len = table_names_str[0].length();
7992   uint table_nm_max_len = table_nm_max_length;
7993   DBUG_ENTER("spider_mbase_share::append_from_with_adjusted_table_name");
7994   DBUG_PRINT("info",("spider this=%p", this));
7995   if (str->reserve(SPIDER_SQL_FROM_LEN + db_nm_max_length +
7996     SPIDER_SQL_DOT_LEN + table_nm_max_length +
7997     /* SPIDER_SQL_NAME_QUOTE_LEN */ 4))
7998   {
7999     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
8000   }
8001   str->q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN);
8002   *table_name_pos = str->length();
8003   spider_db_mbase_utility->append_name(str, db_nm, db_nm_len);
8004   str->q_append(SPIDER_SQL_DOT_STR, SPIDER_SQL_DOT_LEN);
8005   spider_db_mbase_utility->append_name(str, table_nm, table_nm_len);
8006   uint length =
8007     db_nm_max_len - db_nm_len +
8008     table_nm_max_len - table_nm_len;
8009   memset((char *) str->ptr() + str->length(), ' ', length);
8010   str->length(str->length() + length);
8011   DBUG_RETURN(0);
8012 }
8013 
create_table_names_str()8014 int spider_mbase_share::create_table_names_str()
8015 {
8016   int error_num, roop_count;
8017   uint table_nm_len, db_nm_len;
8018   spider_string *str, *first_tbl_nm_str, *first_db_nm_str, *first_db_tbl_str;
8019   char *first_tbl_nm, *first_db_nm;
8020   DBUG_ENTER("spider_mbase_share::create_table_names_str");
8021   table_names_str = NULL;
8022   db_names_str = NULL;
8023   db_table_str = NULL;
8024   if (
8025     !(table_names_str = new spider_string[spider_share->all_link_count]) ||
8026     !(db_names_str = new spider_string[spider_share->all_link_count]) ||
8027     !(db_table_str = new spider_string[spider_share->all_link_count])
8028   ) {
8029     error_num = HA_ERR_OUT_OF_MEM;
8030     goto error;
8031   }
8032 
8033   same_db_table_name = TRUE;
8034   first_tbl_nm = spider_share->tgt_table_names[0];
8035   first_db_nm = spider_share->tgt_dbs[0];
8036   table_nm_len = spider_share->tgt_table_names_lengths[0];
8037   db_nm_len = spider_share->tgt_dbs_lengths[0];
8038   first_tbl_nm_str = &table_names_str[0];
8039   first_db_nm_str = &db_names_str[0];
8040   first_db_tbl_str = &db_table_str[0];
8041   for (roop_count = 0; roop_count < (int) spider_share->all_link_count;
8042     roop_count++)
8043   {
8044     table_names_str[roop_count].init_calc_mem(86);
8045     db_names_str[roop_count].init_calc_mem(87);
8046     db_table_str[roop_count].init_calc_mem(88);
8047     if (spider_share->sql_dbton_ids[roop_count] != dbton_id)
8048       continue;
8049     if (first_all_link_idx == -1)
8050       first_all_link_idx = roop_count;
8051 
8052     str = &table_names_str[roop_count];
8053     if (
8054       roop_count != 0 &&
8055       same_db_table_name &&
8056       spider_share->tgt_table_names_lengths[roop_count] == table_nm_len &&
8057       !memcmp(first_tbl_nm, spider_share->tgt_table_names[roop_count],
8058         table_nm_len)
8059     ) {
8060       if (str->copy(*first_tbl_nm_str))
8061       {
8062         error_num = HA_ERR_OUT_OF_MEM;
8063         goto error;
8064       }
8065     } else {
8066       str->set_charset(spider_share->access_charset);
8067       if ((error_num = spider_db_append_name_with_quote_str(str,
8068         spider_share->tgt_table_names[roop_count], dbton_id)))
8069         goto error;
8070       if (roop_count)
8071       {
8072         same_db_table_name = FALSE;
8073         DBUG_PRINT("info", ("spider found different table name %s",
8074           spider_share->tgt_table_names[roop_count]));
8075         if (str->length() > table_nm_max_length)
8076           table_nm_max_length = str->length();
8077       } else
8078         table_nm_max_length = str->length();
8079     }
8080 
8081     str = &db_names_str[roop_count];
8082     if (
8083       roop_count != 0 &&
8084       same_db_table_name &&
8085       spider_share->tgt_dbs_lengths[roop_count] == db_nm_len &&
8086       !memcmp(first_db_nm, spider_share->tgt_dbs[roop_count],
8087         db_nm_len)
8088     ) {
8089       if (str->copy(*first_db_nm_str))
8090       {
8091         error_num = HA_ERR_OUT_OF_MEM;
8092         goto error;
8093       }
8094     } else {
8095       str->set_charset(spider_share->access_charset);
8096       if ((error_num = spider_db_append_name_with_quote_str(str,
8097         spider_share->tgt_dbs[roop_count], dbton_id)))
8098         goto error;
8099       if (roop_count)
8100       {
8101         same_db_table_name = FALSE;
8102         DBUG_PRINT("info", ("spider found different db name %s",
8103           spider_share->tgt_dbs[roop_count]));
8104         if (str->length() > db_nm_max_length)
8105           db_nm_max_length = str->length();
8106       } else
8107         db_nm_max_length = str->length();
8108     }
8109 
8110     str = &db_table_str[roop_count];
8111     if (
8112       roop_count != 0 &&
8113       same_db_table_name
8114     ) {
8115       if (str->copy(*first_db_tbl_str))
8116       {
8117         error_num = HA_ERR_OUT_OF_MEM;
8118         goto error;
8119       }
8120     } else {
8121       str->set_charset(spider_share->access_charset);
8122       if ((error_num = append_table_name(str, roop_count)))
8123         goto error;
8124     }
8125 #ifdef SPIDER_HAS_HASH_VALUE_TYPE
8126     db_table_str_hash_value[roop_count] = my_calc_hash(
8127       &spider_open_connections, (uchar*) str->ptr(), str->length());
8128 #endif
8129   }
8130   DBUG_RETURN(0);
8131 
8132 error:
8133   if (db_table_str)
8134   {
8135     delete [] db_table_str;
8136     db_table_str = NULL;
8137   }
8138   if (db_names_str)
8139   {
8140     delete [] db_names_str;
8141     db_names_str = NULL;
8142   }
8143   if (table_names_str)
8144   {
8145     delete [] table_names_str;
8146     table_names_str = NULL;
8147   }
8148   DBUG_RETURN(error_num);
8149 }
8150 
free_table_names_str()8151 void spider_mbase_share::free_table_names_str()
8152 {
8153   DBUG_ENTER("spider_mbase_share::free_table_names_str");
8154   if (db_table_str)
8155   {
8156     delete [] db_table_str;
8157     db_table_str = NULL;
8158   }
8159   if (db_names_str)
8160   {
8161     delete [] db_names_str;
8162     db_names_str = NULL;
8163   }
8164   if (table_names_str)
8165   {
8166     delete [] table_names_str;
8167     table_names_str = NULL;
8168   }
8169   DBUG_VOID_RETURN;
8170 }
8171 
create_column_name_str()8172 int spider_mbase_share::create_column_name_str()
8173 {
8174   spider_string *str;
8175   int error_num;
8176   Field **field;
8177   TABLE_SHARE *table_share = spider_share->table_share;
8178   DBUG_ENTER("spider_mbase_share::create_column_name_str");
8179   if (
8180     table_share->fields &&
8181     !(column_name_str = new spider_string[table_share->fields])
8182   )
8183     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
8184   for (field = table_share->field, str = column_name_str;
8185    *field; field++, str++)
8186   {
8187     str->init_calc_mem(89);
8188     str->set_charset(spider_share->access_charset);
8189     if ((error_num = spider_db_append_name_with_quote_str(str,
8190       (*field)->field_name, dbton_id)))
8191       goto error;
8192   }
8193   DBUG_RETURN(0);
8194 
8195 error:
8196   if (column_name_str)
8197   {
8198     delete [] column_name_str;
8199     column_name_str = NULL;
8200   }
8201   DBUG_RETURN(error_num);
8202 }
8203 
free_column_name_str()8204 void spider_mbase_share::free_column_name_str()
8205 {
8206   DBUG_ENTER("spider_mbase_share::free_column_name_str");
8207   if (column_name_str)
8208   {
8209     delete [] column_name_str;
8210     column_name_str = NULL;
8211   }
8212   DBUG_VOID_RETURN;
8213 }
8214 
convert_key_hint_str()8215 int spider_mbase_share::convert_key_hint_str()
8216 {
8217   spider_string *tmp_key_hint;
8218   int roop_count;
8219   TABLE_SHARE *table_share = spider_share->table_share;
8220   DBUG_ENTER("spider_mbase_share::convert_key_hint_str");
8221   if (spider_share->access_charset->cset != system_charset_info->cset)
8222   {
8223     /* need conversion */
8224     for (roop_count = 0, tmp_key_hint = key_hint;
8225       roop_count < (int) table_share->keys; roop_count++, tmp_key_hint++)
8226     {
8227       tmp_key_hint->length(0);
8228       if (tmp_key_hint->append(spider_share->key_hint->ptr(),
8229         spider_share->key_hint->length(), system_charset_info))
8230         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
8231     }
8232   } else {
8233     for (roop_count = 0, tmp_key_hint = key_hint;
8234       roop_count < (int) table_share->keys; roop_count++, tmp_key_hint++)
8235     {
8236       if (tmp_key_hint->copy(spider_share->key_hint[roop_count]))
8237         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
8238     }
8239   }
8240   DBUG_RETURN(0);
8241 }
8242 
append_show_table_status()8243 int spider_mbase_share::append_show_table_status()
8244 {
8245   int roop_count;
8246   spider_string *str;
8247   DBUG_ENTER("spider_mysql_append_show_table_status");
8248   if (!(show_table_status =
8249     new spider_string[2 * spider_share->all_link_count]))
8250     goto error;
8251 
8252   for (roop_count = 0; roop_count < (int) spider_share->all_link_count;
8253     roop_count++)
8254   {
8255     show_table_status[0 + (2 * roop_count)].init_calc_mem(90);
8256     show_table_status[1 + (2 * roop_count)].init_calc_mem(91);
8257     if (spider_share->sql_dbton_ids[roop_count] != dbton_id)
8258       continue;
8259 
8260     if (
8261       show_table_status[0 + (2 * roop_count)].reserve(
8262         SPIDER_SQL_SHOW_TABLE_STATUS_LEN +
8263         db_names_str[roop_count].length() +
8264         SPIDER_SQL_LIKE_LEN + table_names_str[roop_count].length() +
8265         ((SPIDER_SQL_NAME_QUOTE_LEN) * 2) +
8266         ((SPIDER_SQL_VALUE_QUOTE_LEN) * 2)) ||
8267       show_table_status[1 + (2 * roop_count)].reserve(
8268         SPIDER_SQL_SELECT_TABLES_STATUS_LEN +
8269         db_names_str[roop_count].length() +
8270         SPIDER_SQL_AND_LEN + SPIDER_SQL_TABLE_NAME_LEN + SPIDER_SQL_EQUAL_LEN +
8271         table_names_str[roop_count].length() +
8272         ((SPIDER_SQL_VALUE_QUOTE_LEN) * 4))
8273     )
8274       goto error;
8275     str = &show_table_status[0 + (2 * roop_count)];
8276     str->q_append(
8277       SPIDER_SQL_SHOW_TABLE_STATUS_STR, SPIDER_SQL_SHOW_TABLE_STATUS_LEN);
8278     str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
8279     str->q_append(db_names_str[roop_count].ptr(),
8280       db_names_str[roop_count].length());
8281     str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
8282     str->q_append(SPIDER_SQL_LIKE_STR, SPIDER_SQL_LIKE_LEN);
8283     str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
8284     str->q_append(table_names_str[roop_count].ptr(),
8285       table_names_str[roop_count].length());
8286     str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
8287     str = &show_table_status[1 + (2 * roop_count)];
8288     str->q_append(
8289       SPIDER_SQL_SELECT_TABLES_STATUS_STR,
8290       SPIDER_SQL_SELECT_TABLES_STATUS_LEN);
8291     str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
8292     str->q_append(db_names_str[roop_count].ptr(),
8293       db_names_str[roop_count].length());
8294     str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
8295     str->q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN);
8296     str->q_append(SPIDER_SQL_TABLE_NAME_STR, SPIDER_SQL_TABLE_NAME_LEN);
8297     str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
8298     str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
8299     str->q_append(table_names_str[roop_count].ptr(),
8300       table_names_str[roop_count].length());
8301     str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
8302   }
8303   DBUG_RETURN(0);
8304 
8305 error:
8306   if (show_table_status)
8307   {
8308     delete [] show_table_status;
8309     show_table_status = NULL;
8310   }
8311   DBUG_RETURN(HA_ERR_OUT_OF_MEM);
8312 }
8313 
free_show_table_status()8314 void spider_mbase_share::free_show_table_status()
8315 {
8316   DBUG_ENTER("spider_mysql_free_show_table_status");
8317   if (show_table_status)
8318   {
8319     delete [] show_table_status;
8320     show_table_status = NULL;
8321   }
8322   DBUG_VOID_RETURN;
8323 }
8324 
append_show_records()8325 int spider_mbase_share::append_show_records()
8326 {
8327   int roop_count;
8328   spider_string *str;
8329   DBUG_ENTER("spider_mbase_share::append_show_records");
8330   if (!(show_records = new spider_string[spider_share->all_link_count]))
8331     goto error;
8332 
8333   for (roop_count = 0; roop_count < (int) spider_share->all_link_count;
8334     roop_count++)
8335   {
8336     show_records[roop_count].init_calc_mem(92);
8337     if (spider_share->sql_dbton_ids[roop_count] != dbton_id)
8338       continue;
8339 
8340     if (
8341       show_records[roop_count].reserve(
8342         SPIDER_SQL_SHOW_RECORDS_LEN +
8343         db_names_str[roop_count].length() +
8344         SPIDER_SQL_DOT_LEN +
8345         table_names_str[roop_count].length() +
8346         /* SPIDER_SQL_NAME_QUOTE_LEN */ 4)
8347     )
8348       goto error;
8349     str = &show_records[roop_count];
8350     str->q_append(SPIDER_SQL_SHOW_RECORDS_STR, SPIDER_SQL_SHOW_RECORDS_LEN);
8351     append_table_name(str, roop_count);
8352   }
8353   DBUG_RETURN(0);
8354 
8355 error:
8356   if (show_records)
8357   {
8358     delete [] show_records;
8359     show_records = NULL;
8360   }
8361   DBUG_RETURN(HA_ERR_OUT_OF_MEM);
8362 }
8363 
free_show_records()8364 void spider_mbase_share::free_show_records()
8365 {
8366   DBUG_ENTER("spider_mbase_share::free_show_records");
8367   if (show_records)
8368   {
8369     delete [] show_records;
8370     show_records = NULL;
8371   }
8372   DBUG_VOID_RETURN;
8373 }
8374 
append_show_index()8375 int spider_mbase_share::append_show_index()
8376 {
8377   int roop_count;
8378   spider_string *str;
8379   DBUG_ENTER("spider_mbase_share::append_show_index");
8380   if (!(show_index = new spider_string[2 * spider_share->all_link_count]))
8381     goto error;
8382 
8383   for (roop_count = 0; roop_count < (int) spider_share->all_link_count;
8384     roop_count++)
8385   {
8386     show_index[0 + (2 * roop_count)].init_calc_mem(93);
8387     show_index[1 + (2 * roop_count)].init_calc_mem(94);
8388     if (spider_share->sql_dbton_ids[roop_count] != dbton_id)
8389       continue;
8390 
8391     if (
8392       show_index[0 + (2 * roop_count)].reserve(
8393         SPIDER_SQL_SHOW_INDEX_LEN + db_names_str[roop_count].length() +
8394         SPIDER_SQL_DOT_LEN +
8395         table_names_str[roop_count].length() +
8396         /* SPIDER_SQL_NAME_QUOTE_LEN */ 4) ||
8397       show_index[1 + (2 * roop_count)].reserve(
8398         SPIDER_SQL_SELECT_STATISTICS_LEN +
8399         db_names_str[roop_count].length() +
8400         SPIDER_SQL_AND_LEN + SPIDER_SQL_TABLE_NAME_LEN + SPIDER_SQL_EQUAL_LEN +
8401         table_names_str[roop_count].length() +
8402         ((SPIDER_SQL_VALUE_QUOTE_LEN) * 4) +
8403         SPIDER_SQL_GROUP_LEN + SPIDER_SQL_COLUMN_NAME_LEN)
8404     )
8405       goto error;
8406     str = &show_index[0 + (2 * roop_count)];
8407     str->q_append(
8408       SPIDER_SQL_SHOW_INDEX_STR, SPIDER_SQL_SHOW_INDEX_LEN);
8409     append_table_name(str, roop_count);
8410     str = &show_index[1 + (2 * roop_count)];
8411     str->q_append(
8412       SPIDER_SQL_SELECT_STATISTICS_STR, SPIDER_SQL_SELECT_STATISTICS_LEN);
8413     str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
8414     str->q_append(db_names_str[roop_count].ptr(),
8415       db_names_str[roop_count].length());
8416     str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
8417     str->q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN);
8418     str->q_append(SPIDER_SQL_TABLE_NAME_STR, SPIDER_SQL_TABLE_NAME_LEN);
8419     str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
8420     str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
8421     str->q_append(table_names_str[roop_count].ptr(),
8422       table_names_str[roop_count].length());
8423     str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
8424     str->q_append(SPIDER_SQL_GROUP_STR, SPIDER_SQL_GROUP_LEN);
8425     str->q_append(SPIDER_SQL_COLUMN_NAME_STR, SPIDER_SQL_COLUMN_NAME_LEN);
8426   }
8427   DBUG_RETURN(0);
8428 
8429 error:
8430   if (show_index)
8431   {
8432     delete [] show_index;
8433     show_index = NULL;
8434   }
8435   DBUG_RETURN(HA_ERR_OUT_OF_MEM);
8436 }
8437 
free_show_index()8438 void spider_mbase_share::free_show_index()
8439 {
8440   DBUG_ENTER("spider_mbase_share::free_show_index");
8441   if (show_index)
8442   {
8443     delete [] show_index;
8444     show_index = NULL;
8445   }
8446   DBUG_VOID_RETURN;
8447 }
8448 
append_table_select()8449 int spider_mbase_share::append_table_select()
8450 {
8451   Field **field;
8452   uint field_length;
8453   spider_string *str = table_select;
8454   TABLE_SHARE *table_share = spider_share->table_share;
8455   DBUG_ENTER("spider_mbase_share::append_table_select");
8456 
8457   if (!*table_share->field)
8458     DBUG_RETURN(0);
8459 
8460   for (field = table_share->field; *field; field++)
8461   {
8462     field_length = column_name_str[(*field)->field_index].length();
8463     if (str->reserve(field_length +
8464       /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
8465       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
8466     append_column_name(str, (*field)->field_index);
8467     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
8468   }
8469   str->length(str->length() - SPIDER_SQL_COMMA_LEN);
8470   DBUG_RETURN(append_from_with_adjusted_table_name(str, &table_select_pos));
8471 }
8472 
append_key_select(uint idx)8473 int spider_mbase_share::append_key_select(
8474   uint idx
8475 ) {
8476   KEY_PART_INFO *key_part;
8477   Field *field;
8478   uint part_num;
8479   uint field_length;
8480   spider_string *str = &key_select[idx];
8481   TABLE_SHARE *table_share = spider_share->table_share;
8482   const KEY *key_info = &table_share->key_info[idx];
8483   DBUG_ENTER("spider_mbase_share::append_key_select");
8484 
8485   if (!spider_user_defined_key_parts(key_info))
8486     DBUG_RETURN(0);
8487 
8488   for (key_part = key_info->key_part, part_num = 0;
8489     part_num < spider_user_defined_key_parts(key_info); key_part++, part_num++)
8490   {
8491     field = key_part->field;
8492     field_length = column_name_str[field->field_index].length();
8493     if (str->reserve(field_length +
8494       /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
8495       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
8496     append_column_name(str, field->field_index);
8497     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
8498   }
8499   str->length(str->length() - SPIDER_SQL_COMMA_LEN);
8500   DBUG_RETURN(append_from_with_adjusted_table_name(str, &key_select_pos[idx]));
8501 }
8502 
need_change_db_table_name()8503 bool spider_mbase_share::need_change_db_table_name()
8504 {
8505   DBUG_ENTER("spider_mbase_share::need_change_db_table_name");
8506   DBUG_RETURN(!same_db_table_name);
8507 }
8508 
8509 #ifdef SPIDER_HAS_DISCOVER_TABLE_STRUCTURE
discover_table_structure(SPIDER_TRX * trx,SPIDER_SHARE * spider_share,spider_string * str)8510 int spider_mbase_share::discover_table_structure(
8511   SPIDER_TRX *trx,
8512   SPIDER_SHARE *spider_share,
8513   spider_string *str
8514 ) {
8515   int roop_count, error_num = HA_ERR_WRONG_COMMAND;
8516   char sql_buf[MAX_FIELD_WIDTH];
8517   spider_string sql_str(sql_buf, sizeof(sql_buf), system_charset_info);
8518   uint strlen = str->length();
8519   DBUG_ENTER("spider_mbase_share::discover_table_structure");
8520   DBUG_PRINT("info",("spider this=%p", this));
8521   sql_str.init_calc_mem(228);
8522   for (roop_count = 0; roop_count < (int) spider_share->all_link_count;
8523     roop_count++)
8524   {
8525     if (spider_share->sql_dbton_ids[roop_count] != dbton_id)
8526     {
8527       DBUG_PRINT("info",("spider spider_share->sql_dbton_ids[%d]=%u",
8528         roop_count, spider_share->sql_dbton_ids[roop_count]));
8529       DBUG_PRINT("info",("spider dbton_id=%u", dbton_id));
8530       continue;
8531     }
8532 
8533     str->length(strlen);
8534     sql_str.length(0);
8535     if (sql_str.reserve(
8536       SPIDER_SQL_SELECT_COLUMNS_LEN + db_names_str[roop_count].length() +
8537       SPIDER_SQL_AND_LEN + SPIDER_SQL_TABLE_NAME_LEN + SPIDER_SQL_EQUAL_LEN +
8538       table_names_str[roop_count].length() + SPIDER_SQL_ORDER_LEN +
8539       SPIDER_SQL_ORDINAL_POSITION_LEN +
8540       /* SPIDER_SQL_VALUE_QUOTE_LEN */ 8 +
8541       SPIDER_SQL_SEMICOLON_LEN +
8542       SPIDER_SQL_SHOW_INDEX_LEN + db_names_str[roop_count].length() +
8543       SPIDER_SQL_DOT_LEN + table_names_str[roop_count].length() +
8544       /* SPIDER_SQL_NAME_QUOTE_LEN */ 4 +
8545       SPIDER_SQL_SEMICOLON_LEN +
8546       SPIDER_SQL_SHOW_TABLE_STATUS_LEN + db_names_str[roop_count].length() +
8547       SPIDER_SQL_LIKE_LEN + table_names_str[roop_count].length() +
8548       /* SPIDER_SQL_NAME_QUOTE_LEN */ 4
8549     )) {
8550       DBUG_PRINT("info",("spider alloc sql_str error"));
8551       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
8552     }
8553     sql_str.q_append(SPIDER_SQL_SELECT_COLUMNS_STR,
8554       SPIDER_SQL_SELECT_COLUMNS_LEN);
8555     sql_str.q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
8556     sql_str.q_append(db_names_str[roop_count].ptr(),
8557       db_names_str[roop_count].length());
8558     sql_str.q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
8559     sql_str.q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN);
8560     sql_str.q_append(SPIDER_SQL_TABLE_NAME_STR, SPIDER_SQL_TABLE_NAME_LEN);
8561     sql_str.q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
8562     sql_str.q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
8563     sql_str.q_append(table_names_str[roop_count].ptr(),
8564       table_names_str[roop_count].length());
8565     sql_str.q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
8566     sql_str.q_append(SPIDER_SQL_ORDER_STR, SPIDER_SQL_ORDER_LEN);
8567     sql_str.q_append(SPIDER_SQL_ORDINAL_POSITION_STR,
8568       SPIDER_SQL_ORDINAL_POSITION_LEN);
8569     sql_str.q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
8570     sql_str.q_append(SPIDER_SQL_SHOW_INDEX_STR, SPIDER_SQL_SHOW_INDEX_LEN);
8571     append_table_name(&sql_str, roop_count);
8572     sql_str.q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
8573     sql_str.q_append(
8574       SPIDER_SQL_SHOW_TABLE_STATUS_STR, SPIDER_SQL_SHOW_TABLE_STATUS_LEN);
8575     sql_str.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
8576     sql_str.q_append(db_names_str[roop_count].ptr(),
8577       db_names_str[roop_count].length());
8578     sql_str.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
8579     sql_str.q_append(SPIDER_SQL_LIKE_STR, SPIDER_SQL_LIKE_LEN);
8580     sql_str.q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
8581     sql_str.q_append(table_names_str[roop_count].ptr(),
8582       table_names_str[roop_count].length());
8583     sql_str.q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
8584 
8585     SPIDER_CONN *conn;
8586     int need_mon;
8587     if (!(conn = spider_get_conn(
8588       spider_share, 0, spider_share->conn_keys[roop_count], trx, NULL, FALSE,
8589       FALSE, SPIDER_CONN_KIND_MYSQL, &error_num))
8590     ) {
8591       DBUG_RETURN(error_num);
8592     }
8593     pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
8594     pthread_mutex_lock(&conn->mta_conn_mutex);
8595     SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
8596     conn->need_mon = &need_mon;
8597     DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
8598     DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
8599     conn->mta_conn_mutex_lock_already = TRUE;
8600     conn->mta_conn_mutex_unlock_later = TRUE;
8601     if (!conn->disable_reconnect)
8602     {
8603       ha_spider tmp_spider;
8604       SPIDER_WIDE_HANDLER wide_handler;
8605       int need_mon = 0;
8606       uint tmp_conn_link_idx = 0;
8607       tmp_spider.wide_handler = &wide_handler;
8608       wide_handler.trx = trx;
8609       tmp_spider.share = spider_share;
8610       tmp_spider.need_mons = &need_mon;
8611       tmp_spider.conn_link_idx = &tmp_conn_link_idx;
8612       if ((error_num = spider_db_ping(&tmp_spider, conn, 0)))
8613       {
8614         DBUG_PRINT("info",("spider spider_db_ping error"));
8615         DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
8616         DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
8617         conn->mta_conn_mutex_lock_already = FALSE;
8618         conn->mta_conn_mutex_unlock_later = FALSE;
8619         SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
8620         pthread_mutex_unlock(&conn->mta_conn_mutex);
8621         continue;
8622       }
8623     }
8624     spider_conn_set_timeout_from_share(conn, roop_count, trx->thd,
8625       spider_share);
8626     if (
8627       (error_num = spider_db_set_names_internal(trx, spider_share, conn,
8628         roop_count, &need_mon)) ||
8629       (
8630         spider_db_query(
8631           conn,
8632           sql_str.ptr(),
8633           sql_str.length(),
8634           -1,
8635           &need_mon) &&
8636         (error_num = spider_db_errorno(conn))
8637       )
8638     ) {
8639       DBUG_PRINT("info",("spider spider_get_trx error"));
8640       DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
8641       DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
8642       conn->mta_conn_mutex_lock_already = FALSE;
8643       conn->mta_conn_mutex_unlock_later = FALSE;
8644       SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
8645       pthread_mutex_unlock(&conn->mta_conn_mutex);
8646       continue;
8647     }
8648     st_spider_db_request_key request_key;
8649     request_key.spider_thread_id = trx->spider_thread_id;
8650     request_key.query_id = trx->thd->query_id;
8651     request_key.handler = NULL;
8652     request_key.request_id = 1;
8653     request_key.next = NULL;
8654     spider_db_result *res;
8655     /* get column list */
8656     if (!(res = conn->db_conn->store_result(NULL, &request_key, &error_num)))
8657     {
8658       if (error_num || (error_num = spider_db_errorno(conn)))
8659       {
8660         DBUG_PRINT("info",("spider column store error"));
8661         DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
8662         DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
8663         conn->mta_conn_mutex_lock_already = FALSE;
8664         conn->mta_conn_mutex_unlock_later = FALSE;
8665         SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
8666         pthread_mutex_unlock(&conn->mta_conn_mutex);
8667         continue;
8668       }
8669       /* no record */
8670       DBUG_PRINT("info",("spider column no record error"));
8671       DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
8672       DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
8673       conn->mta_conn_mutex_lock_already = FALSE;
8674       conn->mta_conn_mutex_unlock_later = FALSE;
8675       SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
8676       pthread_mutex_unlock(&conn->mta_conn_mutex);
8677       continue;
8678     }
8679     if ((error_num = res->fetch_columns_for_discover_table_structure(str,
8680       spider_share->access_charset)))
8681     {
8682       DBUG_PRINT("info",("spider column fetch error"));
8683       res->free_result();
8684       delete res;
8685       DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
8686       DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
8687       conn->mta_conn_mutex_lock_already = FALSE;
8688       conn->mta_conn_mutex_unlock_later = FALSE;
8689       SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
8690       pthread_mutex_unlock(&conn->mta_conn_mutex);
8691       my_printf_error(ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM,
8692         ER_SPIDER_REMOTE_TABLE_NOT_FOUND_STR, MYF(0),
8693         db_names_str[roop_count].ptr(),
8694         table_names_str[roop_count].ptr());
8695       error_num = ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM;
8696       continue;
8697     }
8698     res->free_result();
8699     delete res;
8700     if (conn->db_conn->next_result())
8701     {
8702       DBUG_PRINT("info",("spider single result error"));
8703       DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
8704       DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
8705       conn->mta_conn_mutex_lock_already = FALSE;
8706       conn->mta_conn_mutex_unlock_later = FALSE;
8707       SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
8708       pthread_mutex_unlock(&conn->mta_conn_mutex);
8709       continue;
8710     }
8711     /* get index list */
8712     if (!(res = conn->db_conn->store_result(NULL, &request_key, &error_num)))
8713     {
8714       if (error_num || (error_num = spider_db_errorno(conn)))
8715       {
8716         DBUG_PRINT("info",("spider index store error"));
8717         DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
8718         DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
8719         conn->mta_conn_mutex_lock_already = FALSE;
8720         conn->mta_conn_mutex_unlock_later = FALSE;
8721         SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
8722         pthread_mutex_unlock(&conn->mta_conn_mutex);
8723         continue;
8724       }
8725       /* no record */
8726       DBUG_PRINT("info",("spider index no record error"));
8727       DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
8728       DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
8729       conn->mta_conn_mutex_lock_already = FALSE;
8730       conn->mta_conn_mutex_unlock_later = FALSE;
8731       SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
8732       pthread_mutex_unlock(&conn->mta_conn_mutex);
8733       continue;
8734     }
8735     if ((error_num = res->fetch_index_for_discover_table_structure(str,
8736       spider_share->access_charset)))
8737     {
8738       DBUG_PRINT("info",("spider index fetch error"));
8739       res->free_result();
8740       delete res;
8741       DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
8742       DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
8743       conn->mta_conn_mutex_lock_already = FALSE;
8744       conn->mta_conn_mutex_unlock_later = FALSE;
8745       SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
8746       pthread_mutex_unlock(&conn->mta_conn_mutex);
8747       continue;
8748     }
8749     res->free_result();
8750     delete res;
8751     if (conn->db_conn->next_result())
8752     {
8753       DBUG_PRINT("info",("spider dual result error"));
8754       DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
8755       DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
8756       conn->mta_conn_mutex_lock_already = FALSE;
8757       conn->mta_conn_mutex_unlock_later = FALSE;
8758       SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
8759       pthread_mutex_unlock(&conn->mta_conn_mutex);
8760       continue;
8761     }
8762     /* get table info */
8763     if (!(res = conn->db_conn->store_result(NULL, &request_key, &error_num)))
8764     {
8765       if (error_num || (error_num = spider_db_errorno(conn)))
8766       {
8767         DBUG_PRINT("info",("spider table store error"));
8768         DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
8769         DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
8770         conn->mta_conn_mutex_lock_already = FALSE;
8771         conn->mta_conn_mutex_unlock_later = FALSE;
8772         SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
8773         pthread_mutex_unlock(&conn->mta_conn_mutex);
8774         continue;
8775       }
8776       /* no record */
8777       DBUG_PRINT("info",("spider table no record error"));
8778       DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
8779       DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
8780       conn->mta_conn_mutex_lock_already = FALSE;
8781       conn->mta_conn_mutex_unlock_later = FALSE;
8782       SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
8783       pthread_mutex_unlock(&conn->mta_conn_mutex);
8784       continue;
8785     }
8786     if ((error_num = res->fetch_table_for_discover_table_structure(str,
8787       spider_share, spider_share->access_charset)))
8788     {
8789       DBUG_PRINT("info",("spider table fetch error"));
8790       res->free_result();
8791       delete res;
8792       DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
8793       DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
8794       conn->mta_conn_mutex_lock_already = FALSE;
8795       conn->mta_conn_mutex_unlock_later = FALSE;
8796       SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
8797       pthread_mutex_unlock(&conn->mta_conn_mutex);
8798       continue;
8799     }
8800     res->free_result();
8801     delete res;
8802     DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
8803     DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
8804     conn->mta_conn_mutex_lock_already = FALSE;
8805     conn->mta_conn_mutex_unlock_later = FALSE;
8806     SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
8807     pthread_mutex_unlock(&conn->mta_conn_mutex);
8808     if (!error_num)
8809       break;
8810   }
8811   DBUG_RETURN(error_num);
8812 }
8813 #endif
8814 
8815 #ifdef HA_HAS_CHECKSUM_EXTENDED
checksum_support()8816 bool spider_mbase_share::checksum_support()
8817 {
8818   DBUG_ENTER("spider_mbase_share::checksum_support");
8819   DBUG_PRINT("info",("spider this=%p", this));
8820   DBUG_RETURN(TRUE);
8821 }
8822 #endif
8823 
spider_mbase_handler(ha_spider * spider,spider_mbase_share * db_share,spider_db_mbase_util * spider_db_mbase_utility)8824 spider_mbase_handler::spider_mbase_handler(
8825   ha_spider *spider,
8826   spider_mbase_share *db_share,
8827   spider_db_mbase_util *spider_db_mbase_utility
8828 ) : spider_db_handler(
8829   spider,
8830   db_share
8831 ),
8832   spider_db_mbase_utility(spider_db_mbase_utility),
8833   where_pos(0),
8834   order_pos(0),
8835   limit_pos(0),
8836   table_name_pos(0),
8837   ha_read_pos(0),
8838   ha_next_pos(0),
8839   ha_where_pos(0),
8840   ha_limit_pos(0),
8841   ha_table_name_pos(0),
8842   insert_pos(0),
8843   insert_table_name_pos(0),
8844   upd_tmp_tbl(NULL),
8845   tmp_sql_pos1(0),
8846   tmp_sql_pos2(0),
8847   tmp_sql_pos3(0),
8848   tmp_sql_pos4(0),
8849   tmp_sql_pos5(0),
8850   reading_from_bulk_tmp_table(FALSE),
8851   union_table_name_pos_first(NULL),
8852   union_table_name_pos_current(NULL),
8853   mysql_share(db_share),
8854   link_for_hash(NULL)
8855 {
8856   DBUG_ENTER("spider_mbase_handler::spider_mbase_handler");
8857   DBUG_PRINT("info",("spider this=%p", this));
8858   spider_alloc_calc_mem_init(mem_calc, 183);
8859   spider_alloc_calc_mem(spider_current_trx, mem_calc, sizeof(*this));
8860   DBUG_VOID_RETURN;
8861 }
8862 
spider_mysql_handler(ha_spider * spider,spider_mbase_share * db_share)8863 spider_mysql_handler::spider_mysql_handler(
8864   ha_spider *spider,
8865   spider_mbase_share *db_share
8866 ) : spider_mbase_handler(
8867   spider,
8868   db_share,
8869   &spider_db_mysql_utility
8870 ) {
8871   DBUG_ENTER("spider_mysql_handler::spider_mysql_handler");
8872   DBUG_PRINT("info",("spider this=%p", this));
8873   DBUG_VOID_RETURN;
8874 }
8875 
spider_mariadb_handler(ha_spider * spider,spider_mbase_share * db_share)8876 spider_mariadb_handler::spider_mariadb_handler(
8877   ha_spider *spider,
8878   spider_mbase_share *db_share
8879 ) : spider_mbase_handler(
8880   spider,
8881   db_share,
8882   &spider_db_mariadb_utility
8883 ) {
8884   DBUG_ENTER("spider_mariadb_handler::spider_mariadb_handler");
8885   DBUG_PRINT("info",("spider this=%p", this));
8886   DBUG_VOID_RETURN;
8887 }
8888 
~spider_mbase_handler()8889 spider_mbase_handler::~spider_mbase_handler()
8890 {
8891   DBUG_ENTER("spider_mbase_handler::~spider_mbase_handler");
8892   DBUG_PRINT("info",("spider this=%p", this));
8893   while (union_table_name_pos_first)
8894   {
8895     SPIDER_INT_HLD *tmp_pos = union_table_name_pos_first;
8896     union_table_name_pos_first = tmp_pos->next;
8897     spider_free(spider_current_trx, tmp_pos, MYF(0));
8898   }
8899   if (link_for_hash)
8900   {
8901     spider_free(spider_current_trx, link_for_hash, MYF(0));
8902   }
8903   spider_free_mem_calc(spider_current_trx, mem_calc_id, sizeof(*this));
8904   DBUG_VOID_RETURN;
8905 }
8906 
~spider_mysql_handler()8907 spider_mysql_handler::~spider_mysql_handler()
8908 {
8909   DBUG_ENTER("spider_mysql_handler::~spider_mysql_handler");
8910   DBUG_PRINT("info",("spider this=%p", this));
8911   DBUG_VOID_RETURN;
8912 }
8913 
~spider_mariadb_handler()8914 spider_mariadb_handler::~spider_mariadb_handler()
8915 {
8916   DBUG_ENTER("spider_mariadb_handler::~spider_mariadb_handler");
8917   DBUG_PRINT("info",("spider this=%p", this));
8918   DBUG_VOID_RETURN;
8919 }
8920 
init()8921 int spider_mbase_handler::init()
8922 {
8923   uint roop_count;
8924   THD *thd = spider->wide_handler->trx->thd;
8925   st_spider_share *share = spider->share;
8926   int init_sql_alloc_size =
8927     spider_param_init_sql_alloc_size(thd, share->init_sql_alloc_size);
8928   TABLE *table = spider->get_table();
8929   DBUG_ENTER("spider_mbase_handler::init");
8930   DBUG_PRINT("info",("spider this=%p", this));
8931   sql.init_calc_mem(59);
8932   sql_part.init_calc_mem(60);
8933   sql_part2.init_calc_mem(61);
8934   ha_sql.init_calc_mem(62);
8935   insert_sql.init_calc_mem(64);
8936   update_sql.init_calc_mem(65);
8937   tmp_sql.init_calc_mem(66);
8938   dup_update_sql.init_calc_mem(166);
8939   if (
8940     (sql.real_alloc(init_sql_alloc_size)) ||
8941     (insert_sql.real_alloc(init_sql_alloc_size)) ||
8942     (update_sql.real_alloc(init_sql_alloc_size)) ||
8943     (tmp_sql.real_alloc(init_sql_alloc_size))
8944   ) {
8945     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
8946   }
8947   sql.set_charset(share->access_charset);
8948   sql_part.set_charset(share->access_charset);
8949   sql_part2.set_charset(share->access_charset);
8950   ha_sql.set_charset(share->access_charset);
8951   insert_sql.set_charset(share->access_charset);
8952   update_sql.set_charset(share->access_charset);
8953   tmp_sql.set_charset(share->access_charset);
8954   dup_update_sql.set_charset(share->access_charset);
8955   upd_tmp_tbl_prm.init();
8956   upd_tmp_tbl_prm.field_count = 1;
8957   if (!(link_for_hash = (SPIDER_LINK_FOR_HASH *)
8958     spider_bulk_alloc_mem(spider_current_trx, 141,
8959       __func__, __FILE__, __LINE__, MYF(MY_WME | MY_ZEROFILL),
8960       &link_for_hash,
8961         sizeof(SPIDER_LINK_FOR_HASH) * share->link_count,
8962       &minimum_select_bitmap,
8963         table ? sizeof(uchar) * no_bytes_in_map(table->read_set) : 0,
8964       NullS))
8965   ) {
8966     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
8967   }
8968   for (roop_count = 0; roop_count < share->link_count; roop_count++)
8969   {
8970     link_for_hash[roop_count].spider = spider;
8971     link_for_hash[roop_count].link_idx = roop_count;
8972     link_for_hash[roop_count].db_table_str =
8973       &mysql_share->db_table_str[roop_count];
8974 #ifdef SPIDER_HAS_HASH_VALUE_TYPE
8975     link_for_hash[roop_count].db_table_str_hash_value =
8976       mysql_share->db_table_str_hash_value[roop_count];
8977 #endif
8978   }
8979 #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
8980   hs_upds.init();
8981 #endif
8982   DBUG_RETURN(0);
8983 }
8984 
8985 
append_index_hint(spider_string * str,int link_idx,ulong sql_type)8986 int spider_mbase_handler::append_index_hint(
8987   spider_string *str,
8988   int link_idx,
8989   ulong sql_type
8990   )
8991 {
8992   List<Index_hint> *index_hints = spider_get_index_hints(spider);
8993   List_iterator <Index_hint> iter(*index_hints);
8994   Index_hint *hint;
8995 //  THD *thd = current_thd;
8996   int error_num = 0;
8997   DBUG_ENTER("spider_mbase_handler::append_index_hint");
8998   DBUG_PRINT("info",("spider this=%p", this));
8999 
9000   while(index_hints && (hint = iter++))
9001   {
9002 //    hint->print(thd, str);
9003     if (sql_type != SPIDER_SQL_TYPE_HANDLER)
9004     {
9005       switch(hint->type)
9006       {
9007       case INDEX_HINT_IGNORE:
9008         if (str->reserve(hint->key_name.length+ SPIDER_SQL_INDEX_IGNORE_LEN + SPIDER_SQL_OPEN_PAREN_LEN + SPIDER_SQL_CLOSE_PAREN_LEN))
9009           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9010         str->q_append(SPIDER_SQL_INDEX_IGNORE_STR,SPIDER_SQL_INDEX_IGNORE_LEN);
9011         str->q_append(SPIDER_SQL_OPEN_PAREN_STR,SPIDER_SQL_OPEN_PAREN_LEN);
9012         str->q_append(hint->key_name.str, hint->key_name.length);
9013         str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,SPIDER_SQL_CLOSE_PAREN_LEN);
9014         break;
9015       case INDEX_HINT_USE:
9016         if (str->reserve(hint->key_name.length+ SPIDER_SQL_INDEX_USE_LEN + SPIDER_SQL_OPEN_PAREN_LEN + SPIDER_SQL_CLOSE_PAREN_LEN))
9017           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9018         str->q_append(SPIDER_SQL_INDEX_USE_STR,SPIDER_SQL_INDEX_USE_LEN);
9019         str->q_append(SPIDER_SQL_OPEN_PAREN_STR,SPIDER_SQL_OPEN_PAREN_LEN);
9020         str->q_append(hint->key_name.str, hint->key_name.length);
9021         str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,SPIDER_SQL_CLOSE_PAREN_LEN);
9022         break;
9023       case INDEX_HINT_FORCE:
9024         if (str->reserve(hint->key_name.length+ SPIDER_SQL_INDEX_FORCE_LEN + SPIDER_SQL_OPEN_PAREN_LEN + SPIDER_SQL_CLOSE_PAREN_LEN))
9025           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9026         str->q_append(SPIDER_SQL_INDEX_FORCE_STR,SPIDER_SQL_INDEX_FORCE_LEN);
9027         str->q_append(SPIDER_SQL_OPEN_PAREN_STR,SPIDER_SQL_OPEN_PAREN_LEN);
9028         str->q_append(hint->key_name.str, hint->key_name.length);
9029         str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,SPIDER_SQL_CLOSE_PAREN_LEN);
9030         break;
9031       default:
9032         //    SPIDER_SQL_COMMA_STR
9033         break;
9034       }
9035     }
9036   }
9037   DBUG_RETURN(error_num);
9038 }
9039 
append_table_name_with_adjusting(spider_string * str,int link_idx,ulong sql_type)9040 int spider_mbase_handler::append_table_name_with_adjusting(
9041   spider_string *str,
9042   int link_idx,
9043   ulong sql_type
9044 ) {
9045   int error_num = 0;
9046   DBUG_ENTER("spider_mbase_handler::append_table_name_with_adjusting");
9047   DBUG_PRINT("info",("spider this=%p", this));
9048   if (sql_type == SPIDER_SQL_TYPE_HANDLER)
9049   {
9050     str->q_append(spider->m_handler_cid[link_idx], SPIDER_SQL_HANDLER_CID_LEN);
9051   } else {
9052     error_num = mysql_share->append_table_name_with_adjusting(str,
9053       spider->conn_link_idx[link_idx]);
9054   }
9055   DBUG_RETURN(error_num);
9056 }
9057 
append_key_column_types(const key_range * start_key,spider_string * str)9058 int spider_mbase_handler::append_key_column_types(
9059   const key_range *start_key,
9060   spider_string *str
9061 ) {
9062   SPIDER_RESULT_LIST *result_list = &spider->result_list;
9063   KEY *key_info = result_list->key_info;
9064   uint key_name_length, key_count;
9065   key_part_map full_key_part_map =
9066     make_prev_keypart_map(spider_user_defined_key_parts(key_info));
9067   key_part_map start_key_part_map;
9068   KEY_PART_INFO *key_part;
9069   Field *field;
9070   char tmp_buf[MAX_FIELD_WIDTH];
9071   spider_string tmp_str(tmp_buf, sizeof(tmp_buf), system_charset_info);
9072   DBUG_ENTER("spider_mbase_handler::append_key_column_types");
9073   DBUG_PRINT("info",("spider this=%p", this));
9074   tmp_str.init_calc_mem(115);
9075 
9076   start_key_part_map = start_key->keypart_map & full_key_part_map;
9077   DBUG_PRINT("info", ("spider spider_user_defined_key_parts=%u",
9078     spider_user_defined_key_parts(key_info)));
9079   DBUG_PRINT("info", ("spider full_key_part_map=%lu", full_key_part_map));
9080   DBUG_PRINT("info", ("spider start_key_part_map=%lu", start_key_part_map));
9081 
9082   if (!start_key_part_map)
9083     DBUG_RETURN(0);
9084 
9085   for (
9086     key_part = key_info->key_part,
9087     key_count = 0;
9088     start_key_part_map;
9089     start_key_part_map >>= 1,
9090     key_part++,
9091     key_count++
9092   ) {
9093     field = key_part->field;
9094     key_name_length = my_sprintf(tmp_buf, (tmp_buf, "c%u", key_count));
9095     if (str->reserve(key_name_length + SPIDER_SQL_SPACE_LEN))
9096       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9097     str->q_append(tmp_buf, key_name_length);
9098     str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
9099 
9100     if (tmp_str.ptr() != tmp_buf)
9101       tmp_str.set(tmp_buf, sizeof(tmp_buf), system_charset_info);
9102     else
9103       tmp_str.set_charset(system_charset_info);
9104     field->sql_type(*tmp_str.get_str());
9105     tmp_str.mem_calc();
9106     str->append(tmp_str);
9107     if (field->has_charset())
9108     {
9109       CHARSET_INFO *cs = field->charset();
9110       uint coll_length = strlen(cs->name);
9111       if (str->reserve(SPIDER_SQL_COLLATE_LEN + coll_length))
9112         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9113       str->q_append(SPIDER_SQL_COLLATE_STR, SPIDER_SQL_COLLATE_LEN);
9114       str->q_append(cs->name, coll_length);
9115     }
9116 
9117     if (str->reserve(SPIDER_SQL_COMMA_LEN))
9118       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9119     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
9120   }
9121   str->length(str->length() - SPIDER_SQL_COMMA_LEN);
9122 
9123   DBUG_RETURN(0);
9124 }
9125 
append_key_join_columns_for_bka(const key_range * start_key,spider_string * str,const char ** table_aliases,uint * table_alias_lengths)9126 int spider_mbase_handler::append_key_join_columns_for_bka(
9127   const key_range *start_key,
9128   spider_string *str,
9129   const char **table_aliases,
9130   uint *table_alias_lengths
9131 ) {
9132   KEY *key_info = spider->result_list.key_info;
9133   uint length, key_name_length, key_count;
9134   key_part_map full_key_part_map =
9135     make_prev_keypart_map(spider_user_defined_key_parts(key_info));
9136   key_part_map start_key_part_map;
9137   KEY_PART_INFO *key_part;
9138   Field *field;
9139   char tmp_buf[MAX_FIELD_WIDTH];
9140   bool start_where = ((int) str->length() == where_pos);
9141   DBUG_ENTER("spider_mbase_handler::append_key_join_columns_for_bka");
9142   DBUG_PRINT("info",("spider this=%p", this));
9143   start_key_part_map = start_key->keypart_map & full_key_part_map;
9144   DBUG_PRINT("info", ("spider spider_user_defined_key_parts=%u",
9145     spider_user_defined_key_parts(key_info)));
9146   DBUG_PRINT("info", ("spider full_key_part_map=%lu", full_key_part_map));
9147   DBUG_PRINT("info", ("spider start_key_part_map=%lu", start_key_part_map));
9148 
9149   if (!start_key_part_map)
9150     DBUG_RETURN(0);
9151 
9152   if (start_where)
9153   {
9154     if (str->reserve(SPIDER_SQL_WHERE_LEN))
9155       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9156     str->q_append(SPIDER_SQL_WHERE_STR, SPIDER_SQL_WHERE_LEN);
9157   } else {
9158     if (str->reserve(SPIDER_SQL_AND_LEN))
9159       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9160     str->q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN);
9161   }
9162 
9163   for (
9164     key_part = key_info->key_part,
9165     key_count = 0;
9166     start_key_part_map;
9167     start_key_part_map >>= 1,
9168     key_part++,
9169     key_count++
9170   ) {
9171     field = key_part->field;
9172     key_name_length =
9173       mysql_share->column_name_str[field->field_index].length();
9174     length = my_sprintf(tmp_buf, (tmp_buf, "c%u", key_count));
9175     if (str->reserve(length + table_alias_lengths[0] + key_name_length +
9176       /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
9177       table_alias_lengths[1] + SPIDER_SQL_PF_EQUAL_LEN + SPIDER_SQL_AND_LEN))
9178       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9179     str->q_append(table_aliases[0], table_alias_lengths[0]);
9180     str->q_append(tmp_buf, length);
9181     str->q_append(SPIDER_SQL_PF_EQUAL_STR, SPIDER_SQL_PF_EQUAL_LEN);
9182     str->q_append(table_aliases[1], table_alias_lengths[1]);
9183     mysql_share->append_column_name(str, field->field_index);
9184     str->q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN);
9185   }
9186   str->length(str->length() - SPIDER_SQL_AND_LEN);
9187   DBUG_RETURN(0);
9188 }
9189 
append_tmp_table_and_sql_for_bka(const key_range * start_key)9190 int spider_mbase_handler::append_tmp_table_and_sql_for_bka(
9191   const key_range *start_key
9192 ) {
9193   int error_num;
9194   DBUG_ENTER("spider_mbase_handler::append_tmp_table_and_sql_for_bka");
9195   DBUG_PRINT("info",("spider this=%p", this));
9196   char tmp_table_name[MAX_FIELD_WIDTH * 2],
9197     tgt_table_name[MAX_FIELD_WIDTH * 2];
9198   int tmp_table_name_length;
9199   spider_string tgt_table_name_str(tgt_table_name, MAX_FIELD_WIDTH * 2,
9200     mysql_share->db_names_str[0].charset());
9201   const char *table_names[2], *table_aliases[2], *table_dot_aliases[2];
9202   uint table_name_lengths[2], table_alias_lengths[2],
9203     table_dot_alias_lengths[2];
9204   tgt_table_name_str.init_calc_mem(99);
9205   tgt_table_name_str.length(0);
9206   create_tmp_bka_table_name(tmp_table_name, &tmp_table_name_length,
9207     first_link_idx);
9208   if ((error_num = append_table_name_with_adjusting(&tgt_table_name_str,
9209     first_link_idx, SPIDER_SQL_TYPE_SELECT_SQL)))
9210   {
9211     DBUG_RETURN(error_num);
9212   }
9213   table_names[0] = tmp_table_name;
9214   table_names[1] = tgt_table_name_str.c_ptr_safe();
9215   table_name_lengths[0] = tmp_table_name_length;
9216   table_name_lengths[1] = tgt_table_name_str.length();
9217   table_aliases[0] = SPIDER_SQL_A_STR;
9218   table_aliases[1] = SPIDER_SQL_B_STR;
9219   table_alias_lengths[0] = SPIDER_SQL_A_LEN;
9220   table_alias_lengths[1] = SPIDER_SQL_B_LEN;
9221   table_dot_aliases[0] = SPIDER_SQL_A_DOT_STR;
9222   table_dot_aliases[1] = SPIDER_SQL_B_DOT_STR;
9223   table_dot_alias_lengths[0] = SPIDER_SQL_A_DOT_LEN;
9224   table_dot_alias_lengths[1] = SPIDER_SQL_B_DOT_LEN;
9225   if (
9226     (error_num = append_drop_tmp_bka_table(
9227       &tmp_sql, tmp_table_name, tmp_table_name_length,
9228       &tmp_sql_pos1, &tmp_sql_pos5, TRUE)) ||
9229     (error_num = append_create_tmp_bka_table(
9230       start_key,
9231       &tmp_sql, tmp_table_name,
9232       tmp_table_name_length,
9233       &tmp_sql_pos2, spider->share->table_share->table_charset)) ||
9234     (error_num = append_insert_tmp_bka_table(
9235       start_key,
9236       &tmp_sql, tmp_table_name,
9237       tmp_table_name_length, &tmp_sql_pos3))
9238   )
9239     DBUG_RETURN(error_num);
9240   tmp_sql_pos4 = tmp_sql.length();
9241   if ((error_num = spider_db_append_select(spider)))
9242     DBUG_RETURN(error_num);
9243   if (sql.reserve(SPIDER_SQL_A_DOT_LEN + SPIDER_SQL_ID_LEN +
9244     SPIDER_SQL_COMMA_LEN))
9245     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9246   sql.q_append(SPIDER_SQL_A_DOT_STR, SPIDER_SQL_A_DOT_LEN);
9247   sql.q_append(SPIDER_SQL_ID_STR, SPIDER_SQL_ID_LEN);
9248   sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
9249   if (
9250     (error_num = append_select_columns_with_alias(&sql,
9251       SPIDER_SQL_B_DOT_STR, SPIDER_SQL_B_DOT_LEN)) ||
9252     (error_num = spider_db_mbase_utility->append_from_with_alias(&sql,
9253       table_names, table_name_lengths,
9254       table_aliases, table_alias_lengths, 2,
9255       &table_name_pos, FALSE))
9256   )
9257     DBUG_RETURN(error_num);
9258   if (
9259     mysql_share->key_hint &&
9260     (error_num = spider_db_append_hint_after_table(spider,
9261       &sql, &mysql_share->key_hint[spider->active_index]))
9262   )
9263     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9264   where_pos = sql.length();
9265   if (
9266     (error_num = append_key_join_columns_for_bka(
9267       start_key, &sql,
9268       table_dot_aliases, table_dot_alias_lengths)) ||
9269     (error_num = append_condition_part(
9270       SPIDER_SQL_B_DOT_STR, SPIDER_SQL_B_DOT_LEN,
9271       SPIDER_SQL_TYPE_SELECT_SQL, FALSE))
9272   )
9273     DBUG_RETURN(error_num);
9274   if (spider->result_list.direct_order_limit)
9275   {
9276     if ((error_num = append_key_order_for_direct_order_limit_with_alias(&sql,
9277       SPIDER_SQL_B_DOT_STR, SPIDER_SQL_B_DOT_LEN)))
9278       DBUG_RETURN(error_num);
9279   }
9280 #ifdef HANDLER_HAS_DIRECT_AGGREGATE
9281   else if (spider->result_list.direct_aggregate)
9282   {
9283     if ((error_num =
9284       append_group_by(&sql, SPIDER_SQL_B_DOT_STR, SPIDER_SQL_B_DOT_LEN)))
9285       DBUG_RETURN(error_num);
9286   }
9287 #endif
9288 
9289   DBUG_RETURN(0);
9290 }
9291 
reuse_tmp_table_and_sql_for_bka()9292 int spider_mbase_handler::reuse_tmp_table_and_sql_for_bka()
9293 {
9294   DBUG_ENTER("spider_mbase_handler::reuse_tmp_table_and_sql_for_bka");
9295   DBUG_PRINT("info",("spider this=%p", this));
9296   tmp_sql.length(tmp_sql_pos4);
9297   sql.length(limit_pos);
9298   ha_sql.length(ha_limit_pos);
9299   DBUG_RETURN(0);
9300 }
9301 
create_tmp_bka_table_name(char * tmp_table_name,int * tmp_table_name_length,int link_idx)9302 void spider_mbase_handler::create_tmp_bka_table_name(
9303   char *tmp_table_name,
9304   int *tmp_table_name_length,
9305   int link_idx
9306 ) {
9307   uint adjust_length, length;
9308   DBUG_ENTER("spider_mbase_handler::create_tmp_bka_table_name");
9309   if (spider_param_bka_table_name_type(current_thd,
9310     mysql_share->spider_share->
9311       bka_table_name_types[spider->conn_link_idx[link_idx]]) == 1)
9312   {
9313     adjust_length =
9314       mysql_share->db_nm_max_length -
9315       mysql_share->db_names_str[spider->conn_link_idx[link_idx]].length() +
9316       mysql_share->table_nm_max_length -
9317       mysql_share->table_names_str[spider->conn_link_idx[link_idx]].length();
9318     *tmp_table_name_length = mysql_share->db_nm_max_length +
9319       mysql_share->table_nm_max_length;
9320     memset(tmp_table_name, ' ', adjust_length);
9321     tmp_table_name += adjust_length;
9322     memcpy(tmp_table_name, mysql_share->db_names_str[link_idx].c_ptr(),
9323       mysql_share->db_names_str[link_idx].length());
9324     tmp_table_name += mysql_share->db_names_str[link_idx].length();
9325     length = my_sprintf(tmp_table_name, (tmp_table_name,
9326       "%s%s%p%s", SPIDER_SQL_DOT_STR, SPIDER_SQL_TMP_BKA_STR, spider,
9327       SPIDER_SQL_UNDERSCORE_STR));
9328     *tmp_table_name_length += length;
9329     tmp_table_name += length;
9330     memcpy(tmp_table_name,
9331       mysql_share->table_names_str[spider->conn_link_idx[link_idx]].c_ptr(),
9332       mysql_share->table_names_str[spider->conn_link_idx[link_idx]].length());
9333   } else {
9334     adjust_length =
9335       mysql_share->db_nm_max_length -
9336       mysql_share->db_names_str[spider->conn_link_idx[link_idx]].length();
9337     *tmp_table_name_length = mysql_share->db_nm_max_length;
9338     memset(tmp_table_name, ' ', adjust_length);
9339     tmp_table_name += adjust_length;
9340     memcpy(tmp_table_name, mysql_share->db_names_str[link_idx].c_ptr(),
9341       mysql_share->db_names_str[link_idx].length());
9342     tmp_table_name += mysql_share->db_names_str[link_idx].length();
9343     length = my_sprintf(tmp_table_name, (tmp_table_name,
9344       "%s%s%p", SPIDER_SQL_DOT_STR, SPIDER_SQL_TMP_BKA_STR, spider));
9345     *tmp_table_name_length += length;
9346   }
9347   DBUG_VOID_RETURN;
9348 }
9349 
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)9350 int spider_mbase_handler::append_create_tmp_bka_table(
9351   const key_range *start_key,
9352   spider_string *str,
9353   char *tmp_table_name,
9354   int tmp_table_name_length,
9355   int *db_name_pos,
9356   CHARSET_INFO *table_charset
9357 ) {
9358   int error_num;
9359   SPIDER_SHARE *share = spider->share;
9360   THD *thd = spider->wide_handler->trx->thd;
9361   char *bka_engine = spider_param_bka_engine(thd, share->bka_engine);
9362   uint bka_engine_length = strlen(bka_engine),
9363     cset_length = strlen(table_charset->csname),
9364     coll_length = strlen(table_charset->name);
9365   DBUG_ENTER("spider_mbase_handler::append_create_tmp_bka_table");
9366   if (str->reserve(SPIDER_SQL_CREATE_TMP_LEN + tmp_table_name_length +
9367     SPIDER_SQL_OPEN_PAREN_LEN + SPIDER_SQL_ID_LEN + SPIDER_SQL_ID_TYPE_LEN +
9368     SPIDER_SQL_COMMA_LEN))
9369     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9370   str->q_append(SPIDER_SQL_CREATE_TMP_STR, SPIDER_SQL_CREATE_TMP_LEN);
9371   *db_name_pos = str->length();
9372   str->q_append(tmp_table_name, tmp_table_name_length);
9373   str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
9374   str->q_append(SPIDER_SQL_ID_STR, SPIDER_SQL_ID_LEN);
9375   str->q_append(SPIDER_SQL_ID_TYPE_STR, SPIDER_SQL_ID_TYPE_LEN);
9376   str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
9377   if ((error_num = append_key_column_types(start_key, str)))
9378     DBUG_RETURN(error_num);
9379   if (str->reserve(SPIDER_SQL_ENGINE_LEN + bka_engine_length +
9380     SPIDER_SQL_DEF_CHARSET_LEN + cset_length + SPIDER_SQL_COLLATE_LEN +
9381     coll_length + SPIDER_SQL_SEMICOLON_LEN))
9382     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9383   str->q_append(SPIDER_SQL_ENGINE_STR, SPIDER_SQL_ENGINE_LEN);
9384   str->q_append(bka_engine, bka_engine_length);
9385   str->q_append(SPIDER_SQL_DEF_CHARSET_STR, SPIDER_SQL_DEF_CHARSET_LEN);
9386   str->q_append(table_charset->csname, cset_length);
9387   str->q_append(SPIDER_SQL_COLLATE_STR, SPIDER_SQL_COLLATE_LEN);
9388   str->q_append(table_charset->name, coll_length);
9389   str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
9390   DBUG_RETURN(0);
9391 }
9392 
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)9393 int spider_mbase_handler::append_drop_tmp_bka_table(
9394   spider_string *str,
9395   char *tmp_table_name,
9396   int tmp_table_name_length,
9397   int *db_name_pos,
9398   int *drop_table_end_pos,
9399   bool with_semicolon
9400 ) {
9401   DBUG_ENTER("spider_mbase_handler::append_drop_tmp_bka_table");
9402   if (str->reserve(SPIDER_SQL_DROP_TMP_LEN + tmp_table_name_length +
9403     (with_semicolon ? SPIDER_SQL_SEMICOLON_LEN : 0)))
9404     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9405   str->q_append(SPIDER_SQL_DROP_TMP_STR, SPIDER_SQL_DROP_TMP_LEN);
9406   *db_name_pos = str->length();
9407   str->q_append(tmp_table_name, tmp_table_name_length);
9408   *drop_table_end_pos = str->length();
9409   if (with_semicolon)
9410     str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
9411   DBUG_RETURN(0);
9412 }
9413 
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)9414 int spider_mbase_handler::append_insert_tmp_bka_table(
9415   const key_range *start_key,
9416   spider_string *str,
9417   char *tmp_table_name,
9418   int tmp_table_name_length,
9419   int *db_name_pos
9420 ) {
9421   int error_num;
9422   DBUG_ENTER("spider_mbase_handler::append_insert_tmp_bka_table");
9423   if (str->reserve(SPIDER_SQL_INSERT_LEN + SPIDER_SQL_INTO_LEN +
9424     tmp_table_name_length + SPIDER_SQL_OPEN_PAREN_LEN + SPIDER_SQL_ID_LEN +
9425     SPIDER_SQL_COMMA_LEN))
9426     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9427   str->q_append(SPIDER_SQL_INSERT_STR, SPIDER_SQL_INSERT_LEN);
9428   str->q_append(SPIDER_SQL_INTO_STR, SPIDER_SQL_INTO_LEN);
9429   *db_name_pos = str->length();
9430   str->q_append(tmp_table_name, tmp_table_name_length);
9431   str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
9432   str->q_append(SPIDER_SQL_ID_STR, SPIDER_SQL_ID_LEN);
9433   str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
9434   if ((error_num = spider_db_append_key_columns(start_key, spider, str)))
9435     DBUG_RETURN(error_num);
9436   if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN + SPIDER_SQL_VALUES_LEN +
9437     SPIDER_SQL_OPEN_PAREN_LEN))
9438     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9439   str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
9440   str->q_append(SPIDER_SQL_VALUES_STR, SPIDER_SQL_VALUES_LEN);
9441   str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
9442   DBUG_RETURN(0);
9443 }
9444 
append_union_table_and_sql_for_bka(const key_range * start_key)9445 int spider_mbase_handler::append_union_table_and_sql_for_bka(
9446   const key_range *start_key
9447 ) {
9448   int error_num;
9449   DBUG_ENTER("spider_mbase_handler::append_union_table_and_sql_for_bka");
9450   DBUG_PRINT("info",("spider this=%p", this));
9451   char tgt_table_name[MAX_FIELD_WIDTH * 2];
9452   spider_string tgt_table_name_str(tgt_table_name, MAX_FIELD_WIDTH * 2,
9453     mysql_share->db_names_str[0].charset());
9454   const char *table_names[2], *table_aliases[2], *table_dot_aliases[2];
9455   uint table_name_lengths[2], table_alias_lengths[2],
9456     table_dot_alias_lengths[2];
9457   tgt_table_name_str.init_calc_mem(233);
9458   tgt_table_name_str.length(0);
9459   if ((error_num = append_table_name_with_adjusting(&tgt_table_name_str,
9460     first_link_idx, SPIDER_SQL_TYPE_SELECT_SQL)))
9461   {
9462     DBUG_RETURN(error_num);
9463   }
9464   table_names[0] = "";
9465   table_names[1] = tgt_table_name_str.c_ptr_safe();
9466   table_name_lengths[0] = 0;
9467   table_name_lengths[1] = tgt_table_name_str.length();
9468   table_aliases[0] = SPIDER_SQL_A_STR;
9469   table_aliases[1] = SPIDER_SQL_B_STR;
9470   table_alias_lengths[0] = SPIDER_SQL_A_LEN;
9471   table_alias_lengths[1] = SPIDER_SQL_B_LEN;
9472   table_dot_aliases[0] = SPIDER_SQL_A_DOT_STR;
9473   table_dot_aliases[1] = SPIDER_SQL_B_DOT_STR;
9474   table_dot_alias_lengths[0] = SPIDER_SQL_A_DOT_LEN;
9475   table_dot_alias_lengths[1] = SPIDER_SQL_B_DOT_LEN;
9476 
9477   if ((error_num = spider_db_append_select(spider)))
9478     DBUG_RETURN(error_num);
9479   if (sql.reserve(SPIDER_SQL_A_DOT_LEN + SPIDER_SQL_ID_LEN +
9480     SPIDER_SQL_COMMA_LEN))
9481     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9482   sql.q_append(SPIDER_SQL_A_DOT_STR, SPIDER_SQL_A_DOT_LEN);
9483   sql.q_append(SPIDER_SQL_ID_STR, SPIDER_SQL_ID_LEN);
9484   sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
9485   if ((error_num = append_select_columns_with_alias(&sql,
9486     SPIDER_SQL_B_DOT_STR, SPIDER_SQL_B_DOT_LEN)))
9487     DBUG_RETURN(error_num);
9488   if (sql.reserve(SPIDER_SQL_FROM_LEN + (SPIDER_SQL_OPEN_PAREN_LEN * 2)))
9489     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9490   sql.q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN);
9491   sql.q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
9492   sql.q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
9493   tmp_sql_pos1 = sql.length();
9494 
9495   if (
9496     (error_num = spider_db_mbase_utility->append_from_with_alias(&tmp_sql,
9497       table_names, table_name_lengths,
9498       table_aliases, table_alias_lengths, 2,
9499       &table_name_pos, FALSE))
9500   )
9501     DBUG_RETURN(error_num);
9502   if (
9503     mysql_share->key_hint &&
9504     (error_num = spider_db_append_hint_after_table(spider,
9505       &tmp_sql, &mysql_share->key_hint[spider->active_index]))
9506   )
9507     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9508   where_pos = tmp_sql.length();
9509   if (
9510     (error_num = append_key_join_columns_for_bka(
9511       start_key, &tmp_sql,
9512       table_dot_aliases, table_dot_alias_lengths)) ||
9513     (error_num = append_condition_part(
9514       SPIDER_SQL_B_DOT_STR, SPIDER_SQL_B_DOT_LEN,
9515       SPIDER_SQL_TYPE_TMP_SQL, FALSE))
9516   )
9517     DBUG_RETURN(error_num);
9518   if (spider->result_list.direct_order_limit)
9519   {
9520     if ((error_num =
9521       append_key_order_for_direct_order_limit_with_alias(&tmp_sql,
9522         SPIDER_SQL_B_DOT_STR, SPIDER_SQL_B_DOT_LEN))
9523     )
9524       DBUG_RETURN(error_num);
9525   }
9526 #ifdef HANDLER_HAS_DIRECT_AGGREGATE
9527   else if (spider->result_list.direct_aggregate)
9528   {
9529     if ((error_num =
9530       append_group_by(&tmp_sql, SPIDER_SQL_B_DOT_STR, SPIDER_SQL_B_DOT_LEN)))
9531       DBUG_RETURN(error_num);
9532   }
9533 #endif
9534 
9535   DBUG_RETURN(0);
9536 }
9537 
reuse_union_table_and_sql_for_bka()9538 int spider_mbase_handler::reuse_union_table_and_sql_for_bka()
9539 {
9540   DBUG_ENTER("spider_mbase_handler::reuse_union_table_and_sql_for_bka");
9541   DBUG_PRINT("info",("spider this=%p", this));
9542   sql.length(tmp_sql_pos1);
9543   DBUG_RETURN(0);
9544 }
9545 
append_insert_for_recovery(ulong sql_type,int link_idx)9546 int spider_mbase_handler::append_insert_for_recovery(
9547   ulong sql_type,
9548   int link_idx
9549 ) {
9550   const TABLE *table = spider->get_table();
9551   SPIDER_SHARE *share = spider->share;
9552   Field **field;
9553   uint field_name_length = 0;
9554   bool add_value = FALSE;
9555   spider_string *insert_sql;
9556   DBUG_ENTER("spider_mbase_handler::append_insert_for_recovery");
9557   DBUG_PRINT("info",("spider this=%p", this));
9558   if (sql_type == SPIDER_SQL_TYPE_INSERT_SQL)
9559   {
9560     insert_sql = &spider->result_list.insert_sqls[link_idx];
9561     insert_sql->length(0);
9562   } else {
9563     insert_sql = &spider->result_list.update_sqls[link_idx];
9564   }
9565   if (insert_sql->reserve(
9566     SPIDER_SQL_INSERT_LEN + SPIDER_SQL_SQL_IGNORE_LEN +
9567     SPIDER_SQL_INTO_LEN + mysql_share->db_nm_max_length +
9568     SPIDER_SQL_DOT_LEN + mysql_share->table_nm_max_length +
9569     /* SPIDER_SQL_NAME_QUOTE_LEN */ 4 + SPIDER_SQL_OPEN_PAREN_LEN))
9570     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9571   insert_sql->q_append(SPIDER_SQL_INSERT_STR, SPIDER_SQL_INSERT_LEN);
9572   insert_sql->q_append(SPIDER_SQL_SQL_IGNORE_STR, SPIDER_SQL_SQL_IGNORE_LEN);
9573   insert_sql->q_append(SPIDER_SQL_INTO_STR, SPIDER_SQL_INTO_LEN);
9574   mysql_share->append_table_name(insert_sql, spider->conn_link_idx[link_idx]);
9575   insert_sql->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
9576   for (field = table->field; *field; field++)
9577   {
9578     field_name_length =
9579       mysql_share->column_name_str[(*field)->field_index].length();
9580     if (insert_sql->reserve(field_name_length +
9581       /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
9582       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9583     mysql_share->append_column_name(insert_sql, (*field)->field_index);
9584     insert_sql->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
9585   }
9586   if (field_name_length)
9587     insert_sql->length(insert_sql->length() - SPIDER_SQL_COMMA_LEN);
9588   if (insert_sql->reserve(SPIDER_SQL_CLOSE_PAREN_LEN + SPIDER_SQL_VALUES_LEN +
9589     SPIDER_SQL_OPEN_PAREN_LEN))
9590     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9591   insert_sql->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
9592   insert_sql->q_append(SPIDER_SQL_VALUES_STR, SPIDER_SQL_VALUES_LEN);
9593   insert_sql->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
9594   for (field = table->field; *field; field++)
9595   {
9596     add_value = TRUE;
9597     if ((*field)->is_null())
9598     {
9599       if (insert_sql->reserve(SPIDER_SQL_NULL_LEN + SPIDER_SQL_COMMA_LEN))
9600         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9601       insert_sql->q_append(SPIDER_SQL_NULL_STR, SPIDER_SQL_NULL_LEN);
9602     } else {
9603       if (
9604         spider_db_mbase_utility->
9605           append_column_value(spider, insert_sql, *field, NULL,
9606             share->access_charset) ||
9607         insert_sql->reserve(SPIDER_SQL_COMMA_LEN)
9608       )
9609         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9610     }
9611     insert_sql->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
9612   }
9613   if (add_value)
9614     insert_sql->length(insert_sql->length() - SPIDER_SQL_COMMA_LEN);
9615   if (insert_sql->reserve(SPIDER_SQL_CLOSE_PAREN_LEN, SPIDER_SQL_COMMA_LEN))
9616     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9617   insert_sql->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
9618   if (sql_type == SPIDER_SQL_TYPE_INSERT_SQL)
9619   {
9620     exec_insert_sql = insert_sql;
9621   }
9622   DBUG_RETURN(0);
9623 }
9624 
append_update(const TABLE * table,my_ptrdiff_t ptr_diff)9625 int spider_mbase_handler::append_update(
9626   const TABLE *table,
9627   my_ptrdiff_t ptr_diff
9628 ) {
9629   int error_num;
9630   spider_string *str = &update_sql;
9631   DBUG_ENTER("spider_mbase_handler::append_update");
9632   DBUG_PRINT("info",("spider this=%p", this));
9633   if (str->length() > 0)
9634   {
9635     if (str->reserve(SPIDER_SQL_SEMICOLON_LEN))
9636       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9637     str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
9638   }
9639 
9640   if (
9641     (error_num = append_update(str, 0)) ||
9642     (error_num = append_update_set(str)) ||
9643     (error_num = append_update_where(str, table, ptr_diff))
9644   )
9645     DBUG_RETURN(error_num);
9646   filled_up = (str->length() >= (uint) spider->result_list.bulk_update_size);
9647   DBUG_RETURN(0);
9648 }
9649 
append_update(const TABLE * table,my_ptrdiff_t ptr_diff,int link_idx)9650 int spider_mbase_handler::append_update(
9651   const TABLE *table,
9652   my_ptrdiff_t ptr_diff,
9653   int link_idx
9654 ) {
9655   int error_num;
9656   SPIDER_SHARE *share = spider->share;
9657   spider_string *str = &spider->result_list.update_sqls[link_idx];
9658   DBUG_ENTER("spider_mbase_handler::append_update");
9659   DBUG_PRINT("info",("spider this=%p", this));
9660   if (str->length() > 0)
9661   {
9662     if (str->reserve(SPIDER_SQL_SEMICOLON_LEN))
9663       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9664     str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
9665   }
9666 
9667   if (
9668     (error_num = append_update(str, link_idx)) ||
9669     (error_num = append_update_set(str)) ||
9670     (error_num = append_update_where(str, table, ptr_diff))
9671   )
9672     DBUG_RETURN(error_num);
9673 
9674   if (
9675     spider->pk_update &&
9676     share->link_statuses[link_idx] == SPIDER_LINK_STATUS_RECOVERY
9677   ) {
9678     if (str->reserve(SPIDER_SQL_SEMICOLON_LEN))
9679       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9680     str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
9681     if ((error_num = append_insert_for_recovery(
9682       SPIDER_SQL_TYPE_UPDATE_SQL, link_idx)))
9683       DBUG_RETURN(error_num);
9684   }
9685 
9686   if (!filled_up)
9687     filled_up = (str->length() >= (uint) spider->result_list.bulk_update_size);
9688   DBUG_RETURN(0);
9689 }
9690 
append_delete(const TABLE * table,my_ptrdiff_t ptr_diff)9691 int spider_mbase_handler::append_delete(
9692   const TABLE *table,
9693   my_ptrdiff_t ptr_diff
9694 ) {
9695   int error_num;
9696   spider_string *str = &update_sql;
9697   DBUG_ENTER("spider_mbase_handler::append_delete");
9698   DBUG_PRINT("info",("spider this=%p", this));
9699   if (str->length() > 0)
9700   {
9701     if (str->reserve(SPIDER_SQL_SEMICOLON_LEN))
9702       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9703     str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
9704   }
9705 
9706   if (
9707     (error_num = append_delete(str)) ||
9708     (error_num = append_from(str, SPIDER_SQL_TYPE_DELETE_SQL,
9709       first_link_idx)) ||
9710     (error_num = append_update_where(str, table, ptr_diff))
9711   )
9712     DBUG_RETURN(error_num);
9713   filled_up = (str->length() >= (uint) spider->result_list.bulk_update_size);
9714   DBUG_RETURN(0);
9715 }
9716 
append_delete(const TABLE * table,my_ptrdiff_t ptr_diff,int link_idx)9717 int spider_mbase_handler::append_delete(
9718   const TABLE *table,
9719   my_ptrdiff_t ptr_diff,
9720   int link_idx
9721 ) {
9722   int error_num;
9723   spider_string *str = &spider->result_list.update_sqls[link_idx];
9724   DBUG_ENTER("spider_mbase_handler::append_delete");
9725   DBUG_PRINT("info",("spider this=%p", this));
9726   if (str->length() > 0)
9727   {
9728     if (str->reserve(SPIDER_SQL_SEMICOLON_LEN))
9729       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9730     str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
9731   }
9732 
9733   if (
9734     (error_num = append_delete(str)) ||
9735     (error_num = append_from(str, SPIDER_SQL_TYPE_DELETE_SQL, link_idx)) ||
9736     (error_num = append_update_where(str, table, ptr_diff))
9737   )
9738     DBUG_RETURN(error_num);
9739   if (!filled_up)
9740     filled_up = (str->length() >= (uint) spider->result_list.bulk_update_size);
9741   DBUG_RETURN(0);
9742 }
9743 
append_insert_part()9744 int spider_mbase_handler::append_insert_part()
9745 {
9746   int error_num;
9747   DBUG_ENTER("spider_mbase_handler::append_insert_part");
9748   DBUG_PRINT("info",("spider this=%p", this));
9749   error_num = append_insert(&insert_sql, 0);
9750   DBUG_RETURN(error_num);
9751 }
9752 
append_insert(spider_string * str,int link_idx)9753 int spider_mbase_handler::append_insert(
9754   spider_string *str,
9755   int link_idx
9756 ) {
9757   SPIDER_SHARE *share = spider->share;
9758   DBUG_ENTER("spider_mbase_handler::append_insert");
9759   direct_insert_kind = SPIDER_SQL_DIRECT_INSERT_KIND_INSERT;
9760   if (
9761     (
9762       spider->wide_handler->write_can_replace ||
9763       /* for direct_dup_insert without patch for partition */
9764       spider->wide_handler->sql_command == SQLCOM_REPLACE ||
9765       spider->wide_handler->sql_command == SQLCOM_REPLACE_SELECT
9766     ) &&
9767     spider->direct_dup_insert
9768   ) {
9769     direct_insert_kind = SPIDER_SQL_DIRECT_INSERT_KIND_REPLACE;
9770     if (str->reserve(SPIDER_SQL_REPLACE_LEN))
9771       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9772     str->q_append(SPIDER_SQL_REPLACE_STR, SPIDER_SQL_REPLACE_LEN);
9773   } else {
9774     if (str->reserve(SPIDER_SQL_INSERT_LEN))
9775       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9776     str->q_append(SPIDER_SQL_INSERT_STR, SPIDER_SQL_INSERT_LEN);
9777   }
9778   if (spider->wide_handler->low_priority)
9779   {
9780     if (str->reserve(SPIDER_SQL_LOW_PRIORITY_LEN))
9781       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9782     str->q_append(SPIDER_SQL_LOW_PRIORITY_STR, SPIDER_SQL_LOW_PRIORITY_LEN);
9783   }
9784   else if (spider->wide_handler->insert_delayed)
9785   {
9786     if (share->internal_delayed)
9787     {
9788       if (str->reserve(SPIDER_SQL_SQL_DELAYED_LEN))
9789         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9790       str->q_append(SPIDER_SQL_SQL_DELAYED_STR, SPIDER_SQL_SQL_DELAYED_LEN);
9791     }
9792   }
9793   else if (
9794     spider->wide_handler->lock_type >= TL_WRITE &&
9795     !spider->wide_handler->write_can_replace &&
9796     /* for direct_dup_insert without patch for partition */
9797     spider->wide_handler->sql_command != SQLCOM_REPLACE &&
9798     spider->wide_handler->sql_command != SQLCOM_REPLACE_SELECT
9799   ) {
9800     if (str->reserve(SPIDER_SQL_HIGH_PRIORITY_LEN))
9801       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9802     str->q_append(SPIDER_SQL_HIGH_PRIORITY_STR, SPIDER_SQL_HIGH_PRIORITY_LEN);
9803   }
9804   if (
9805     spider->wide_handler->ignore_dup_key &&
9806     spider->direct_dup_insert &&
9807     !spider->wide_handler->write_can_replace &&
9808 #ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
9809     (!spider->wide_handler->insert_with_update || !dup_update_sql.length()) &&
9810 #else
9811     !spider->wide_handler->insert_with_update &&
9812 #endif
9813     /* for direct_dup_insert without patch for partition */
9814     spider->wide_handler->sql_command != SQLCOM_REPLACE &&
9815     spider->wide_handler->sql_command != SQLCOM_REPLACE_SELECT
9816   ) {
9817     direct_insert_kind = SPIDER_SQL_DIRECT_INSERT_KIND_IGNORE;
9818     if (str->reserve(SPIDER_SQL_SQL_IGNORE_LEN))
9819       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9820     str->q_append(SPIDER_SQL_SQL_IGNORE_STR, SPIDER_SQL_SQL_IGNORE_LEN);
9821   }
9822   DBUG_RETURN(0);
9823 }
9824 
append_update_part()9825 int spider_mbase_handler::append_update_part()
9826 {
9827   int error_num;
9828   DBUG_ENTER("spider_mbase_handler::append_update_part");
9829   DBUG_PRINT("info",("spider this=%p", this));
9830   error_num = append_update(&update_sql, 0);
9831   DBUG_RETURN(error_num);
9832 }
9833 
append_update(spider_string * str,int link_idx)9834 int spider_mbase_handler::append_update(
9835   spider_string *str,
9836   int link_idx
9837 ) {
9838   DBUG_ENTER("spider_mbase_handler::append_update");
9839   if (str->reserve(SPIDER_SQL_UPDATE_LEN))
9840     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9841   str->q_append(SPIDER_SQL_UPDATE_STR, SPIDER_SQL_UPDATE_LEN);
9842   if (spider->wide_handler->low_priority)
9843   {
9844     if (str->reserve(SPIDER_SQL_LOW_PRIORITY_LEN))
9845       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9846     str->q_append(SPIDER_SQL_LOW_PRIORITY_STR, SPIDER_SQL_LOW_PRIORITY_LEN);
9847   }
9848   if (
9849     spider->wide_handler->ignore_dup_key &&
9850     !spider->wide_handler->insert_with_update
9851   ) {
9852     if (str->reserve(SPIDER_SQL_SQL_IGNORE_LEN))
9853       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9854     str->q_append(SPIDER_SQL_SQL_IGNORE_STR, SPIDER_SQL_SQL_IGNORE_LEN);
9855   }
9856   if (str->reserve(mysql_share->db_nm_max_length +
9857     SPIDER_SQL_DOT_LEN + mysql_share->table_nm_max_length +
9858     /* SPIDER_SQL_NAME_QUOTE_LEN */ 4))
9859     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9860   table_name_pos = str->length();
9861   append_table_name_with_adjusting(str, link_idx, SPIDER_SQL_TYPE_UPDATE_SQL);
9862   DBUG_RETURN(0);
9863 }
9864 
append_delete_part()9865 int spider_mbase_handler::append_delete_part()
9866 {
9867   int error_num;
9868   DBUG_ENTER("spider_mbase_handler::append_delete_part");
9869   DBUG_PRINT("info",("spider this=%p", this));
9870   error_num = append_delete(&update_sql);
9871   DBUG_RETURN(error_num);
9872 }
9873 
append_delete(spider_string * str)9874 int spider_mbase_handler::append_delete(
9875   spider_string *str
9876 ) {
9877   DBUG_ENTER("spider_mbase_handler::append_delete");
9878   if (str->reserve(SPIDER_SQL_DELETE_LEN))
9879     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9880   str->q_append(SPIDER_SQL_DELETE_STR, SPIDER_SQL_DELETE_LEN);
9881   if (spider->wide_handler->low_priority)
9882   {
9883     if (str->reserve(SPIDER_SQL_LOW_PRIORITY_LEN))
9884       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9885     str->q_append(SPIDER_SQL_LOW_PRIORITY_STR, SPIDER_SQL_LOW_PRIORITY_LEN);
9886   }
9887   if (spider->wide_handler->quick_mode)
9888   {
9889     if (str->reserve(SPIDER_SQL_SQL_QUICK_MODE_LEN))
9890       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9891     str->q_append(SPIDER_SQL_SQL_QUICK_MODE_STR,
9892       SPIDER_SQL_SQL_QUICK_MODE_LEN);
9893   }
9894   if (spider->wide_handler->ignore_dup_key)
9895   {
9896     if (str->reserve(SPIDER_SQL_SQL_IGNORE_LEN))
9897       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9898     str->q_append(SPIDER_SQL_SQL_IGNORE_STR, SPIDER_SQL_SQL_IGNORE_LEN);
9899   }
9900   str->length(str->length() - 1);
9901   DBUG_RETURN(0);
9902 }
9903 
9904 #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
9905 #ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
append_increment_update_set_part()9906 int spider_mbase_handler::append_increment_update_set_part()
9907 {
9908   int error_num;
9909   DBUG_ENTER("spider_mbase_handler::append_increment_update_set_part");
9910   DBUG_PRINT("info",("spider this=%p", this));
9911   error_num = append_increment_update_set(&update_sql);
9912   DBUG_RETURN(error_num);
9913 }
9914 
append_increment_update_set(spider_string * str)9915 int spider_mbase_handler::append_increment_update_set(
9916   spider_string *str
9917 ) {
9918   uint field_name_length;
9919   uint roop_count;
9920   Field *field;
9921   DBUG_ENTER("spider_mbase_handler::append_increment_update_set");
9922   if (str->reserve(SPIDER_SQL_SET_LEN))
9923     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9924   str->q_append(SPIDER_SQL_SET_STR, SPIDER_SQL_SET_LEN);
9925   const SPIDER_HS_STRING_REF *value = hs_upds.ptr();
9926   for (roop_count = 0; roop_count < hs_upds.size();
9927     roop_count++)
9928   {
9929     if (
9930       value[roop_count].size() == 1 &&
9931       *(value[roop_count].begin()) == '0'
9932     )
9933       continue;
9934 
9935     Field *top_table_field =
9936       spider->get_top_table_field(spider->hs_pushed_ret_fields[roop_count]);
9937     if (!(field = spider->field_exchange(top_table_field)))
9938       continue;
9939     field_name_length =
9940       mysql_share->column_name_str[field->field_index].length();
9941 
9942     if (str->reserve(field_name_length * 2 + /* SPIDER_SQL_NAME_QUOTE_LEN */
9943       4 + SPIDER_SQL_EQUAL_LEN + SPIDER_SQL_HS_INCREMENT_LEN +
9944       SPIDER_SQL_COMMA_LEN + value[roop_count].size()))
9945       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9946 
9947     mysql_share->append_column_name(str, field->field_index);
9948     str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
9949     mysql_share->append_column_name(str, field->field_index);
9950     if (spider->hs_increment)
9951       str->q_append(SPIDER_SQL_HS_INCREMENT_STR,
9952         SPIDER_SQL_HS_INCREMENT_LEN);
9953     else
9954       str->q_append(SPIDER_SQL_HS_DECREMENT_STR,
9955         SPIDER_SQL_HS_DECREMENT_LEN);
9956     str->q_append(value[roop_count].begin(), value[roop_count].size());
9957     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
9958   }
9959   str->length(str->length() - SPIDER_SQL_COMMA_LEN);
9960   DBUG_RETURN(0);
9961 }
9962 #endif
9963 #endif
9964 
append_update_set_part()9965 int spider_mbase_handler::append_update_set_part()
9966 {
9967   int error_num;
9968   DBUG_ENTER("spider_mbase_handler::append_update_set_part");
9969   DBUG_PRINT("info",("spider this=%p", this));
9970   error_num = append_update_set(&update_sql);
9971   where_pos = update_sql.length();
9972   DBUG_RETURN(error_num);
9973 }
9974 
append_update_set(spider_string * str)9975 int spider_mbase_handler::append_update_set(
9976   spider_string *str
9977 ) {
9978   uint field_name_length;
9979   SPIDER_SHARE *share = spider->share;
9980   TABLE *table = spider->get_table();
9981   Field **fields;
9982   DBUG_ENTER("spider_mbase_handler::append_update_set");
9983   if (str->reserve(SPIDER_SQL_SET_LEN))
9984     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9985   str->q_append(SPIDER_SQL_SET_STR, SPIDER_SQL_SET_LEN);
9986   for (fields = table->field; *fields; fields++)
9987   {
9988     if (bitmap_is_set(table->write_set, (*fields)->field_index))
9989     {
9990       field_name_length =
9991         mysql_share->column_name_str[(*fields)->field_index].length();
9992       if ((*fields)->is_null())
9993       {
9994         if (str->reserve(field_name_length + /* SPIDER_SQL_NAME_QUOTE_LEN */
9995           2 + SPIDER_SQL_EQUAL_LEN + SPIDER_SQL_NULL_LEN +
9996           SPIDER_SQL_COMMA_LEN))
9997           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9998         mysql_share->append_column_name(str, (*fields)->field_index);
9999         str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
10000         str->q_append(SPIDER_SQL_NULL_STR, SPIDER_SQL_NULL_LEN);
10001       } else {
10002         if (str->reserve(field_name_length + /* SPIDER_SQL_NAME_QUOTE_LEN */
10003           2 + SPIDER_SQL_EQUAL_LEN))
10004           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10005         mysql_share->append_column_name(str, (*fields)->field_index);
10006         str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
10007 #ifndef DBUG_OFF
10008         MY_BITMAP *tmp_map = dbug_tmp_use_all_columns(table, &table->read_set);
10009 #endif
10010         if (
10011           spider_db_mbase_utility->
10012             append_column_value(spider, str, *fields, NULL,
10013               share->access_charset) ||
10014           str->reserve(SPIDER_SQL_COMMA_LEN)
10015         ) {
10016 #ifndef DBUG_OFF
10017           dbug_tmp_restore_column_map(&table->read_set, tmp_map);
10018 #endif
10019           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10020         }
10021 #ifndef DBUG_OFF
10022         dbug_tmp_restore_column_map(&table->read_set, tmp_map);
10023 #endif
10024       }
10025       str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
10026     }
10027   }
10028   str->length(str->length() - SPIDER_SQL_COMMA_LEN);
10029   DBUG_RETURN(0);
10030 }
10031 
10032 #ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
append_direct_update_set_part()10033 int spider_mbase_handler::append_direct_update_set_part()
10034 {
10035   int error_num;
10036   DBUG_ENTER("spider_mbase_handler::append_direct_update_set_part");
10037   DBUG_PRINT("info",("spider this=%p", this));
10038   error_num = append_direct_update_set(&update_sql);
10039   where_pos = update_sql.length();
10040   DBUG_RETURN(error_num);
10041 }
10042 
append_direct_update_set(spider_string * str)10043 int spider_mbase_handler::append_direct_update_set(
10044   spider_string *str
10045 ) {
10046 #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
10047   uint field_name_length;
10048   SPIDER_SHARE *share = spider->share;
10049 #ifndef DBUG_OFF
10050   TABLE *table = spider->get_table();
10051 #endif
10052 #endif
10053   DBUG_ENTER("spider_mbase_handler::append_direct_update_set");
10054   if (
10055     spider->direct_update_kinds == SPIDER_SQL_KIND_SQL &&
10056     spider->wide_handler->direct_update_fields
10057   ) {
10058     if (str->reserve(SPIDER_SQL_SET_LEN))
10059       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10060     str->q_append(SPIDER_SQL_SET_STR, SPIDER_SQL_SET_LEN);
10061     DBUG_RETURN(spider_db_append_update_columns(spider, str, NULL, 0,
10062       dbton_id, FALSE, NULL));
10063   }
10064 
10065   if (
10066     (spider->direct_update_kinds & SPIDER_SQL_KIND_SQL)
10067   ) {
10068 #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
10069     size_t roop_count;
10070     Field *field;
10071     if (str->reserve(SPIDER_SQL_SET_LEN))
10072       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10073     str->q_append(SPIDER_SQL_SET_STR, SPIDER_SQL_SET_LEN);
10074     for (roop_count = 0; roop_count < spider->hs_pushed_ret_fields_num;
10075       roop_count++)
10076     {
10077       Field *top_table_field =
10078         spider->get_top_table_field(spider->hs_pushed_ret_fields[roop_count]);
10079       if (!(field = spider->field_exchange(top_table_field)))
10080         continue;
10081       field_name_length =
10082         mysql_share->column_name_str[field->field_index].length();
10083       if (top_table_field->is_null())
10084       {
10085         if (str->reserve(field_name_length + /* SPIDER_SQL_NAME_QUOTE_LEN */
10086           2 + SPIDER_SQL_EQUAL_LEN + SPIDER_SQL_NULL_LEN +
10087           SPIDER_SQL_COMMA_LEN))
10088           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10089         mysql_share->append_column_name(str, field->field_index);
10090         str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
10091         str->q_append(SPIDER_SQL_NULL_STR, SPIDER_SQL_NULL_LEN);
10092       } else {
10093         if (str->reserve(field_name_length + /* SPIDER_SQL_NAME_QUOTE_LEN */
10094           2 + SPIDER_SQL_EQUAL_LEN))
10095           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10096         mysql_share->append_column_name(str, field->field_index);
10097         str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
10098 #ifndef DBUG_OFF
10099         my_bitmap_map *tmp_map = dbug_tmp_use_all_columns(table,
10100           table->read_set);
10101 #endif
10102         if (
10103           spider_db_mbase_utility->
10104             append_column_value(spider, str, top_table_field, NULL,
10105               share->access_charset) ||
10106           str->reserve(SPIDER_SQL_COMMA_LEN)
10107         ) {
10108 #ifndef DBUG_OFF
10109           dbug_tmp_restore_column_map(table->read_set, tmp_map);
10110 #endif
10111           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10112         }
10113 #ifndef DBUG_OFF
10114         dbug_tmp_restore_column_map(table->read_set, tmp_map);
10115 #endif
10116       }
10117       str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
10118     }
10119     str->length(str->length() - SPIDER_SQL_COMMA_LEN);
10120 #else
10121     DBUG_ASSERT(0);
10122 #endif
10123   }
10124   DBUG_RETURN(0);
10125 }
10126 
append_dup_update_pushdown_part(const char * alias,uint alias_length)10127 int spider_mbase_handler::append_dup_update_pushdown_part(
10128   const char *alias,
10129   uint alias_length
10130 ) {
10131   int error_num;
10132   DBUG_ENTER("spider_mbase_handler::append_dup_update_pushdown_part");
10133   DBUG_PRINT("info",("spider this=%p", this));
10134   dup_update_sql.length(0);
10135   error_num = append_update_columns(&dup_update_sql, alias, alias_length);
10136   DBUG_RETURN(error_num);
10137 }
10138 
append_update_columns_part(const char * alias,uint alias_length)10139 int spider_mbase_handler::append_update_columns_part(
10140   const char *alias,
10141   uint alias_length
10142 ) {
10143   int error_num;
10144   DBUG_ENTER("spider_mbase_handler::append_update_columns_part");
10145   DBUG_PRINT("info",("spider this=%p", this));
10146   error_num = append_update_columns(&update_sql, alias, alias_length);
10147   DBUG_RETURN(error_num);
10148 }
10149 
check_update_columns_part()10150 int spider_mbase_handler::check_update_columns_part()
10151 {
10152   int error_num;
10153   DBUG_ENTER("spider_mbase_handler::check_update_columns_part");
10154   DBUG_PRINT("info",("spider this=%p", this));
10155   error_num = append_update_columns(NULL, NULL, 0);
10156   DBUG_RETURN(error_num);
10157 }
10158 
append_update_columns(spider_string * str,const char * alias,uint alias_length)10159 int spider_mbase_handler::append_update_columns(
10160   spider_string *str,
10161   const char *alias,
10162   uint alias_length
10163 ) {
10164   int error_num;
10165   DBUG_ENTER("spider_mbase_handler::append_update_columns");
10166   error_num = spider_db_append_update_columns(spider, str,
10167     alias, alias_length, dbton_id, FALSE, NULL);
10168   DBUG_RETURN(error_num);
10169 }
10170 #endif
10171 
append_select_part(ulong sql_type)10172 int spider_mbase_handler::append_select_part(
10173   ulong sql_type
10174 ) {
10175   int error_num;
10176   spider_string *str;
10177   DBUG_ENTER("spider_mbase_handler::append_select_part");
10178   DBUG_PRINT("info",("spider this=%p", this));
10179   switch (sql_type)
10180   {
10181     case SPIDER_SQL_TYPE_SELECT_SQL:
10182       str = &sql;
10183       break;
10184     case SPIDER_SQL_TYPE_HANDLER:
10185       str = &ha_sql;
10186       break;
10187     default:
10188       DBUG_RETURN(0);
10189   }
10190   error_num = append_select(str, sql_type);
10191   DBUG_RETURN(error_num);
10192 }
10193 
append_select(spider_string * str,ulong sql_type)10194 int spider_mbase_handler::append_select(
10195   spider_string *str,
10196   ulong sql_type
10197 ) {
10198   SPIDER_RESULT_LIST *result_list = &spider->result_list;
10199   SPIDER_WIDE_HANDLER *wide_handler = spider->wide_handler;
10200   DBUG_ENTER("spider_mbase_handler::append_select");
10201   if (sql_type == SPIDER_SQL_TYPE_HANDLER)
10202   {
10203     if (str->reserve(SPIDER_SQL_HANDLER_LEN))
10204       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10205     str->q_append(SPIDER_SQL_HANDLER_STR, SPIDER_SQL_HANDLER_LEN);
10206   } else {
10207     if (str->reserve(SPIDER_SQL_SELECT_LEN))
10208       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10209     str->q_append(SPIDER_SQL_SELECT_STR, SPIDER_SQL_SELECT_LEN);
10210     if (result_list->direct_distinct)
10211     {
10212       if (str->reserve(SPIDER_SQL_DISTINCT_LEN))
10213         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10214       str->q_append(SPIDER_SQL_DISTINCT_STR, SPIDER_SQL_DISTINCT_LEN);
10215     }
10216     if (wide_handler->external_lock_type != F_WRLCK &&
10217       wide_handler->lock_mode < 1)
10218     {
10219       /* no lock */
10220 #ifdef SPIDER_SQL_CACHE_IS_IN_LEX
10221       LEX *lex = wide_handler->trx->thd->lex;
10222 #else
10223       st_select_lex *select_lex =
10224         &wide_handler->trx->thd->lex->select_lex;
10225 #endif
10226       if (
10227 #ifdef SPIDER_SQL_CACHE_IS_IN_LEX
10228         lex->sql_cache == LEX::SQL_CACHE &&
10229 #else
10230         select_lex->sql_cache == SELECT_LEX::SQL_CACHE &&
10231 #endif
10232         (spider->share->query_cache_sync & 1)
10233       ) {
10234         if (str->reserve(SPIDER_SQL_SQL_CACHE_LEN))
10235           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10236         str->q_append(SPIDER_SQL_SQL_CACHE_STR, SPIDER_SQL_SQL_CACHE_LEN);
10237       } else if (
10238 #ifdef SPIDER_SQL_CACHE_IS_IN_LEX
10239         lex->sql_cache == LEX::SQL_NO_CACHE &&
10240 #else
10241         select_lex->sql_cache == SELECT_LEX::SQL_NO_CACHE &&
10242 #endif
10243         (spider->share->query_cache_sync & 2)
10244       ) {
10245         if (str->reserve(SPIDER_SQL_SQL_NO_CACHE_LEN))
10246           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10247         str->q_append(SPIDER_SQL_SQL_NO_CACHE_STR,
10248           SPIDER_SQL_SQL_NO_CACHE_LEN);
10249       } else if (spider->share->query_cache == 1)
10250       {
10251         if (str->reserve(SPIDER_SQL_SQL_CACHE_LEN))
10252           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10253         str->q_append(SPIDER_SQL_SQL_CACHE_STR, SPIDER_SQL_SQL_CACHE_LEN);
10254       } else if (spider->share->query_cache == 2)
10255       {
10256         if (str->reserve(SPIDER_SQL_SQL_NO_CACHE_LEN))
10257           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10258         str->q_append(SPIDER_SQL_SQL_NO_CACHE_STR,
10259           SPIDER_SQL_SQL_NO_CACHE_LEN);
10260       }
10261     }
10262     if (wide_handler->high_priority)
10263     {
10264       if (str->reserve(SPIDER_SQL_HIGH_PRIORITY_LEN))
10265         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10266       str->q_append(SPIDER_SQL_HIGH_PRIORITY_STR,
10267         SPIDER_SQL_HIGH_PRIORITY_LEN);
10268     }
10269   }
10270   DBUG_RETURN(0);
10271 }
10272 
append_table_select_part(ulong sql_type)10273 int spider_mbase_handler::append_table_select_part(
10274   ulong sql_type
10275 ) {
10276   int error_num;
10277   spider_string *str;
10278   DBUG_ENTER("spider_mbase_handler::append_table_select_part");
10279   DBUG_PRINT("info",("spider this=%p", this));
10280   switch (sql_type)
10281   {
10282     case SPIDER_SQL_TYPE_SELECT_SQL:
10283       str = &sql;
10284       break;
10285     default:
10286       DBUG_RETURN(0);
10287   }
10288   error_num = append_table_select(str);
10289   DBUG_RETURN(error_num);
10290 }
10291 
append_table_select(spider_string * str)10292 int spider_mbase_handler::append_table_select(
10293   spider_string *str
10294 ) {
10295 #ifdef HANDLER_HAS_DIRECT_AGGREGATE
10296   st_select_lex *select_lex = NULL;
10297   bool sgb = (spider->result_list.direct_aggregate &&
10298     spider_param_strict_group_by(current_thd, (strict_group_by ? 1 : 0)) == 1);
10299 #endif
10300   DBUG_ENTER("spider_mbase_handler::append_table_select");
10301 #ifdef HANDLER_HAS_DIRECT_AGGREGATE
10302   if (sgb)
10303   {
10304     select_lex = spider_get_select_lex(spider);
10305     JOIN *join = select_lex->join;
10306     if (!(*join->sum_funcs) && !select_lex->group_list.elements)
10307     {
10308       select_lex = NULL;
10309     }
10310   }
10311   if (select_lex)
10312   {
10313     TABLE *table = spider->get_table();
10314     Field **field;
10315     int field_length;
10316     for (field = table->field; *field; field++)
10317     {
10318       field_length =
10319         mysql_share->column_name_str[(*field)->field_index].length();
10320       if (!spider_db_check_select_colum_in_group(select_lex, *field))
10321       {
10322         if (str->reserve(SPIDER_SQL_MIN_LEN + SPIDER_SQL_OPEN_PAREN_LEN +
10323           field_length + /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
10324           SPIDER_SQL_CLOSE_PAREN_LEN + SPIDER_SQL_COMMA_LEN))
10325           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10326         str->q_append(SPIDER_SQL_MIN_STR, SPIDER_SQL_MIN_LEN);
10327         str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
10328         mysql_share->append_column_name(str, (*field)->field_index);
10329         str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
10330       } else {
10331         if (str->reserve(field_length + /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
10332           SPIDER_SQL_COMMA_LEN))
10333           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10334         mysql_share->append_column_name(str, (*field)->field_index);
10335       }
10336       str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
10337     }
10338     str->length(str->length() - SPIDER_SQL_COMMA_LEN);
10339   } else {
10340 #endif
10341     table_name_pos = str->length() + mysql_share->table_select_pos;
10342     if (str->append(*(mysql_share->table_select)))
10343       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10344 #ifdef HANDLER_HAS_DIRECT_AGGREGATE
10345   }
10346 #endif
10347   DBUG_RETURN(0);
10348 }
10349 
append_key_select_part(ulong sql_type,uint idx)10350 int spider_mbase_handler::append_key_select_part(
10351   ulong sql_type,
10352   uint idx
10353 ) {
10354   int error_num;
10355   spider_string *str;
10356   DBUG_ENTER("spider_mbase_handler::append_key_select_part");
10357   DBUG_PRINT("info",("spider this=%p", this));
10358   switch (sql_type)
10359   {
10360     case SPIDER_SQL_TYPE_SELECT_SQL:
10361       str = &sql;
10362       break;
10363     default:
10364       DBUG_RETURN(0);
10365   }
10366   error_num = append_key_select(str, idx);
10367   DBUG_RETURN(error_num);
10368 }
10369 
append_key_select(spider_string * str,uint idx)10370 int spider_mbase_handler::append_key_select(
10371   spider_string *str,
10372   uint idx
10373 ) {
10374 #ifdef HANDLER_HAS_DIRECT_AGGREGATE
10375   st_select_lex *select_lex = NULL;
10376   bool sgb = (spider->result_list.direct_aggregate &&
10377     spider_param_strict_group_by(current_thd, (strict_group_by ? 1 : 0)) == 1);
10378 #endif
10379   DBUG_ENTER("spider_mbase_handler::append_key_select");
10380 #ifdef HANDLER_HAS_DIRECT_AGGREGATE
10381   if (sgb)
10382   {
10383     select_lex = spider_get_select_lex(spider);
10384     JOIN *join = select_lex->join;
10385     if (!(*join->sum_funcs) && !select_lex->group_list.elements)
10386     {
10387       select_lex = NULL;
10388     }
10389   }
10390   if (select_lex)
10391   {
10392     TABLE *table = spider->get_table();
10393     KEY *key_info = &table->key_info[idx];
10394     KEY_PART_INFO *key_part;
10395     Field *field;
10396     uint part_num;
10397     int field_length;
10398     for (key_part = key_info->key_part, part_num = 0;
10399       part_num < spider_user_defined_key_parts(key_info);
10400       key_part++, part_num++)
10401     {
10402       field = key_part->field;
10403       field_length = mysql_share->column_name_str[field->field_index].length();
10404       if (!spider_db_check_select_colum_in_group(select_lex, field))
10405       {
10406         if (str->reserve(SPIDER_SQL_MIN_LEN + SPIDER_SQL_OPEN_PAREN_LEN +
10407           field_length + /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
10408           SPIDER_SQL_CLOSE_PAREN_LEN + SPIDER_SQL_COMMA_LEN))
10409           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10410         str->q_append(SPIDER_SQL_MIN_STR, SPIDER_SQL_MIN_LEN);
10411         str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
10412         mysql_share->append_column_name(str, field->field_index);
10413         str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
10414       } else {
10415         if (str->reserve(field_length + /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
10416           SPIDER_SQL_COMMA_LEN))
10417           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10418         mysql_share->append_column_name(str, field->field_index);
10419       }
10420       str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
10421     }
10422     str->length(str->length() - SPIDER_SQL_COMMA_LEN);
10423   } else {
10424 #endif
10425     table_name_pos = str->length() + mysql_share->key_select_pos[idx];
10426     if (str->append(mysql_share->key_select[idx]))
10427       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10428 #ifdef HANDLER_HAS_DIRECT_AGGREGATE
10429   }
10430 #endif
10431   DBUG_RETURN(0);
10432 }
10433 
append_minimum_select_part(ulong sql_type)10434 int spider_mbase_handler::append_minimum_select_part(
10435   ulong sql_type
10436 ) {
10437   int error_num;
10438   spider_string *str;
10439   DBUG_ENTER("spider_mbase_handler::append_minimum_select_part");
10440   DBUG_PRINT("info",("spider this=%p", this));
10441   switch (sql_type)
10442   {
10443     case SPIDER_SQL_TYPE_SELECT_SQL:
10444       str = &sql;
10445       break;
10446     default:
10447       DBUG_RETURN(0);
10448   }
10449   error_num = append_minimum_select(str, sql_type);
10450   DBUG_RETURN(error_num);
10451 }
10452 
append_minimum_select(spider_string * str,ulong sql_type)10453 int spider_mbase_handler::append_minimum_select(
10454   spider_string *str,
10455   ulong sql_type
10456 ) {
10457   TABLE *table = spider->get_table();
10458   Field **field;
10459   int field_length;
10460   bool appended = FALSE;
10461 #ifdef HANDLER_HAS_DIRECT_AGGREGATE
10462   st_select_lex *select_lex = NULL;
10463   bool sgb = (spider->result_list.direct_aggregate &&
10464     spider_param_strict_group_by(current_thd, (strict_group_by ? 1 : 0)) == 1);
10465 #endif
10466   DBUG_ENTER("spider_mbase_handler::append_minimum_select");
10467 #ifdef HANDLER_HAS_DIRECT_AGGREGATE
10468   if (sgb)
10469   {
10470     select_lex = spider_get_select_lex(spider);
10471     JOIN *join = select_lex->join;
10472     if (!(*join->sum_funcs) && !select_lex->group_list.elements)
10473     {
10474       select_lex = NULL;
10475     }
10476   }
10477 #endif
10478   minimum_select_bitmap_create();
10479   for (field = table->field; *field; field++)
10480   {
10481     if (minimum_select_bit_is_set((*field)->field_index))
10482     {
10483 /*
10484       spider_set_bit(minimum_select_bitmap, (*field)->field_index);
10485 */
10486       field_length =
10487         mysql_share->column_name_str[(*field)->field_index].length();
10488 #ifdef HANDLER_HAS_DIRECT_AGGREGATE
10489       if (select_lex &&
10490         !spider_db_check_select_colum_in_group(select_lex, *field))
10491       {
10492         if (str->reserve(SPIDER_SQL_MIN_LEN + SPIDER_SQL_OPEN_PAREN_LEN +
10493           field_length + /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
10494           SPIDER_SQL_CLOSE_PAREN_LEN + SPIDER_SQL_COMMA_LEN))
10495           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10496         str->q_append(SPIDER_SQL_MIN_STR, SPIDER_SQL_MIN_LEN);
10497         str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
10498         mysql_share->append_column_name(str, (*field)->field_index);
10499         str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
10500       } else {
10501 #endif
10502         if (str->reserve(field_length +
10503           /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
10504           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10505         mysql_share->append_column_name(str, (*field)->field_index);
10506 #ifdef HANDLER_HAS_DIRECT_AGGREGATE
10507       }
10508 #endif
10509       str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
10510       appended = TRUE;
10511     }
10512   }
10513   if (appended)
10514     str->length(str->length() - SPIDER_SQL_COMMA_LEN);
10515   else {
10516     if (str->reserve(SPIDER_SQL_ONE_LEN))
10517         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10518     str->q_append(SPIDER_SQL_ONE_STR, SPIDER_SQL_ONE_LEN);
10519   }
10520   DBUG_RETURN(append_from(str, sql_type, first_link_idx));
10521 }
10522 
append_table_select_with_alias(spider_string * str,const char * alias,uint alias_length)10523 int spider_mbase_handler::append_table_select_with_alias(
10524   spider_string *str,
10525   const char *alias,
10526   uint alias_length
10527 ) {
10528   TABLE *table = spider->get_table();
10529   Field **field;
10530   int field_length;
10531 #ifdef HANDLER_HAS_DIRECT_AGGREGATE
10532   st_select_lex *select_lex = NULL;
10533   bool sgb = (spider->result_list.direct_aggregate &&
10534     spider_param_strict_group_by(current_thd, (strict_group_by ? 1 : 0)) == 1);
10535 #endif
10536   DBUG_ENTER("spider_mbase_handler::append_table_select_with_alias");
10537 #ifdef HANDLER_HAS_DIRECT_AGGREGATE
10538   if (sgb)
10539   {
10540     select_lex = spider_get_select_lex(spider);
10541     JOIN *join = select_lex->join;
10542     if (!(*join->sum_funcs) && !select_lex->group_list.elements)
10543     {
10544       select_lex = NULL;
10545     }
10546   }
10547 #endif
10548   for (field = table->field; *field; field++)
10549   {
10550     field_length =
10551       mysql_share->column_name_str[(*field)->field_index].length();
10552 #ifdef HANDLER_HAS_DIRECT_AGGREGATE
10553     if (select_lex &&
10554       !spider_db_check_select_colum_in_group(select_lex, *field))
10555     {
10556       if (str->reserve(SPIDER_SQL_MIN_LEN + SPIDER_SQL_OPEN_PAREN_LEN +
10557         alias_length + field_length + /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
10558         SPIDER_SQL_CLOSE_PAREN_LEN + SPIDER_SQL_COMMA_LEN))
10559         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10560       str->q_append(SPIDER_SQL_MIN_STR, SPIDER_SQL_MIN_LEN);
10561       str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
10562       str->q_append(alias, alias_length);
10563       mysql_share->append_column_name(str, (*field)->field_index);
10564       str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
10565     } else {
10566 #endif
10567       if (str->reserve(alias_length + field_length +
10568         /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
10569         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10570       str->q_append(alias, alias_length);
10571       mysql_share->append_column_name(str, (*field)->field_index);
10572 #ifdef HANDLER_HAS_DIRECT_AGGREGATE
10573     }
10574 #endif
10575     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
10576   }
10577   str->length(str->length() - SPIDER_SQL_COMMA_LEN);
10578   DBUG_RETURN(0);
10579 }
10580 
append_key_select_with_alias(spider_string * str,const KEY * key_info,const char * alias,uint alias_length)10581 int spider_mbase_handler::append_key_select_with_alias(
10582   spider_string *str,
10583   const KEY *key_info,
10584   const char *alias,
10585   uint alias_length
10586 ) {
10587   KEY_PART_INFO *key_part;
10588   Field *field;
10589   uint part_num;
10590   int field_length;
10591 #ifdef HANDLER_HAS_DIRECT_AGGREGATE
10592   st_select_lex *select_lex = NULL;
10593   bool sgb = (spider->result_list.direct_aggregate &&
10594     spider_param_strict_group_by(current_thd, (strict_group_by ? 1 : 0)) == 1);
10595 #endif
10596   DBUG_ENTER("spider_mbase_handler::append_key_select_with_alias");
10597 #ifdef HANDLER_HAS_DIRECT_AGGREGATE
10598   if (sgb)
10599   {
10600     select_lex = spider_get_select_lex(spider);
10601     JOIN *join = select_lex->join;
10602     if (!(*join->sum_funcs) && !select_lex->group_list.elements)
10603     {
10604       select_lex = NULL;
10605     }
10606   }
10607 #endif
10608   for (key_part = key_info->key_part, part_num = 0;
10609     part_num < spider_user_defined_key_parts(key_info); key_part++, part_num++)
10610   {
10611     field = key_part->field;
10612     field_length = mysql_share->column_name_str[field->field_index].length();
10613 #ifdef HANDLER_HAS_DIRECT_AGGREGATE
10614     if (select_lex &&
10615       !spider_db_check_select_colum_in_group(select_lex, field))
10616     {
10617       if (str->reserve(SPIDER_SQL_MIN_LEN + SPIDER_SQL_OPEN_PAREN_LEN +
10618         alias_length + field_length + /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
10619         SPIDER_SQL_CLOSE_PAREN_LEN + SPIDER_SQL_COMMA_LEN))
10620         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10621       str->q_append(SPIDER_SQL_MIN_STR, SPIDER_SQL_MIN_LEN);
10622       str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
10623       str->q_append(alias, alias_length);
10624       mysql_share->append_column_name(str, field->field_index);
10625       str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
10626     } else {
10627 #endif
10628       if (str->reserve(alias_length + field_length +
10629         /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
10630         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10631       str->q_append(alias, alias_length);
10632       mysql_share->append_column_name(str, field->field_index);
10633 #ifdef HANDLER_HAS_DIRECT_AGGREGATE
10634     }
10635 #endif
10636     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
10637   }
10638   str->length(str->length() - SPIDER_SQL_COMMA_LEN);
10639   DBUG_RETURN(0);
10640 }
10641 
append_minimum_select_with_alias(spider_string * str,const char * alias,uint alias_length)10642 int spider_mbase_handler::append_minimum_select_with_alias(
10643   spider_string *str,
10644   const char *alias,
10645   uint alias_length
10646 ) {
10647   TABLE *table = spider->get_table();
10648   Field **field;
10649   int field_length;
10650   bool appended = FALSE;
10651 #ifdef HANDLER_HAS_DIRECT_AGGREGATE
10652   st_select_lex *select_lex = NULL;
10653   bool sgb = (spider->result_list.direct_aggregate &&
10654     spider_param_strict_group_by(current_thd, (strict_group_by ? 1 : 0)) == 1);
10655 #endif
10656   DBUG_ENTER("spider_mbase_handler::append_minimum_select_with_alias");
10657 #ifdef HANDLER_HAS_DIRECT_AGGREGATE
10658   if (sgb)
10659   {
10660     select_lex = spider_get_select_lex(spider);
10661     JOIN *join = select_lex->join;
10662     if (!(*join->sum_funcs) && !select_lex->group_list.elements)
10663     {
10664       select_lex = NULL;
10665     }
10666   }
10667 #endif
10668   minimum_select_bitmap_create();
10669   for (field = table->field; *field; field++)
10670   {
10671     if (minimum_select_bit_is_set((*field)->field_index))
10672     {
10673 /*
10674       spider_set_bit(minimum_select_bitmap, (*field)->field_index);
10675 */
10676       field_length =
10677         mysql_share->column_name_str[(*field)->field_index].length();
10678 #ifdef HANDLER_HAS_DIRECT_AGGREGATE
10679       if (select_lex &&
10680         !spider_db_check_select_colum_in_group(select_lex, *field))
10681       {
10682         if (str->reserve(SPIDER_SQL_MIN_LEN + SPIDER_SQL_OPEN_PAREN_LEN +
10683           alias_length + field_length + /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
10684           SPIDER_SQL_CLOSE_PAREN_LEN + SPIDER_SQL_COMMA_LEN))
10685           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10686         str->q_append(SPIDER_SQL_MIN_STR, SPIDER_SQL_MIN_LEN);
10687         str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
10688         str->q_append(alias, alias_length);
10689         mysql_share->append_column_name(str, (*field)->field_index);
10690         str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
10691       } else {
10692 #endif
10693         if (str->reserve(alias_length + field_length +
10694           /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
10695           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10696         str->q_append(alias, alias_length);
10697         mysql_share->append_column_name(str, (*field)->field_index);
10698 #ifdef HANDLER_HAS_DIRECT_AGGREGATE
10699       }
10700 #endif
10701       str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
10702       appended = TRUE;
10703     }
10704   }
10705   if (appended)
10706     str->length(str->length() - SPIDER_SQL_COMMA_LEN);
10707   else {
10708     if (str->reserve(SPIDER_SQL_ONE_LEN))
10709       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10710     str->q_append(SPIDER_SQL_ONE_STR, SPIDER_SQL_ONE_LEN);
10711   }
10712   DBUG_RETURN(0);
10713 }
10714 
append_select_columns_with_alias(spider_string * str,const char * alias,uint alias_length)10715 int spider_mbase_handler::append_select_columns_with_alias(
10716   spider_string *str,
10717   const char *alias,
10718   uint alias_length
10719 ) {
10720   int error_num;
10721   SPIDER_RESULT_LIST *result_list = &spider->result_list;
10722   DBUG_ENTER("spider_mbase_handler::append_select_columns_with_alias");
10723 #ifdef HANDLER_HAS_DIRECT_AGGREGATE
10724   if (
10725     result_list->direct_aggregate &&
10726     (error_num = append_sum_select(str, alias, alias_length))
10727   )
10728     DBUG_RETURN(error_num);
10729 #endif
10730   if ((error_num = append_match_select(str, alias, alias_length)))
10731     DBUG_RETURN(error_num);
10732   if (!spider->select_column_mode)
10733   {
10734     if (result_list->keyread)
10735       DBUG_RETURN(append_key_select_with_alias(
10736         str, result_list->key_info, alias, alias_length));
10737     else
10738       DBUG_RETURN(append_table_select_with_alias(
10739         str, alias, alias_length));
10740   }
10741   DBUG_RETURN(append_minimum_select_with_alias(str, alias, alias_length));
10742 }
10743 
append_hint_after_table_part(ulong sql_type)10744 int spider_mbase_handler::append_hint_after_table_part(
10745   ulong sql_type
10746 ) {
10747   int error_num;
10748   spider_string *str;
10749   DBUG_ENTER("spider_mbase_handler::append_hint_after_table_part");
10750   DBUG_PRINT("info",("spider this=%p", this));
10751   switch (sql_type)
10752   {
10753     case SPIDER_SQL_TYPE_SELECT_SQL:
10754     case SPIDER_SQL_TYPE_TMP_SQL:
10755       str = &sql;
10756       break;
10757     case SPIDER_SQL_TYPE_INSERT_SQL:
10758     case SPIDER_SQL_TYPE_UPDATE_SQL:
10759     case SPIDER_SQL_TYPE_DELETE_SQL:
10760     case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
10761       str = &update_sql;
10762       break;
10763     case SPIDER_SQL_TYPE_HANDLER:
10764       str = &ha_sql;
10765       break;
10766     default:
10767       DBUG_RETURN(0);
10768   }
10769   error_num = append_hint_after_table(str);
10770   DBUG_RETURN(error_num);
10771 }
10772 
append_hint_after_table(spider_string * str)10773 int spider_mbase_handler::append_hint_after_table(
10774   spider_string *str
10775 ) {
10776   int error_num;
10777   DBUG_ENTER("spider_mbase_handler::append_hint_after_table");
10778   DBUG_PRINT("info",("spider this=%p", this));
10779   if (
10780     mysql_share->key_hint &&
10781     (error_num = spider_db_append_hint_after_table(spider,
10782       str, &mysql_share->key_hint[spider->active_index]))
10783   )
10784     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10785   DBUG_RETURN(0);
10786 }
10787 
set_where_pos(ulong sql_type)10788 void spider_mbase_handler::set_where_pos(
10789   ulong sql_type
10790 ) {
10791   DBUG_ENTER("spider_mbase_handler::set_where_pos");
10792   switch (sql_type)
10793   {
10794     case SPIDER_SQL_TYPE_SELECT_SQL:
10795     case SPIDER_SQL_TYPE_TMP_SQL:
10796       where_pos = sql.length();
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       where_pos = update_sql.length();
10803       break;
10804     case SPIDER_SQL_TYPE_HANDLER:
10805       ha_read_pos = ha_sql.length();
10806       break;
10807     default:
10808       break;
10809   }
10810   DBUG_VOID_RETURN;
10811 }
10812 
set_where_to_pos(ulong sql_type)10813 void spider_mbase_handler::set_where_to_pos(
10814   ulong sql_type
10815 ) {
10816   DBUG_ENTER("spider_mbase_handler::set_where_to_pos");
10817   switch (sql_type)
10818   {
10819     case SPIDER_SQL_TYPE_SELECT_SQL:
10820     case SPIDER_SQL_TYPE_TMP_SQL:
10821       sql.length(where_pos);
10822       break;
10823     case SPIDER_SQL_TYPE_INSERT_SQL:
10824     case SPIDER_SQL_TYPE_UPDATE_SQL:
10825     case SPIDER_SQL_TYPE_DELETE_SQL:
10826     case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
10827       update_sql.length(where_pos);
10828       break;
10829     case SPIDER_SQL_TYPE_HANDLER:
10830       ha_sql.length(ha_read_pos);
10831       break;
10832     default:
10833       break;
10834   }
10835   DBUG_VOID_RETURN;
10836 }
10837 
check_item_type(Item * item)10838 int spider_mbase_handler::check_item_type(
10839   Item *item
10840 ) {
10841   int error_num;
10842   DBUG_ENTER("spider_mbase_handler::check_item_type");
10843   DBUG_PRINT("info",("spider this=%p", this));
10844   error_num = spider_db_print_item_type(item, NULL, spider, NULL, NULL, 0,
10845     dbton_id, FALSE, NULL);
10846   DBUG_RETURN(error_num);
10847 }
10848 
append_values_connector_part(ulong sql_type)10849 int spider_mbase_handler::append_values_connector_part(
10850   ulong sql_type
10851 ) {
10852   int error_num;
10853   spider_string *str;
10854   DBUG_ENTER("spider_mbase_handler::append_values_connector_part");
10855   DBUG_PRINT("info",("spider this=%p", this));
10856   switch (sql_type)
10857   {
10858     case SPIDER_SQL_TYPE_SELECT_SQL:
10859       str = &sql;
10860       break;
10861     case SPIDER_SQL_TYPE_TMP_SQL:
10862       str = &tmp_sql;
10863       break;
10864     default:
10865       DBUG_RETURN(0);
10866   }
10867   error_num = append_values_connector(str);
10868   DBUG_RETURN(error_num);
10869 }
10870 
append_values_connector(spider_string * str)10871 int spider_mbase_handler::append_values_connector(
10872   spider_string *str
10873 ) {
10874   DBUG_ENTER("spider_mbase_handler::append_values_connector");
10875   DBUG_PRINT("info",("spider this=%p", this));
10876   if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN +
10877     SPIDER_SQL_COMMA_LEN + SPIDER_SQL_OPEN_PAREN_LEN))
10878     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10879   str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
10880   str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
10881   str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
10882   DBUG_RETURN(0);
10883 }
10884 
append_values_terminator_part(ulong sql_type)10885 int spider_mbase_handler::append_values_terminator_part(
10886   ulong sql_type
10887 ) {
10888   int error_num;
10889   spider_string *str;
10890   DBUG_ENTER("spider_mbase_handler::append_values_terminator_part");
10891   DBUG_PRINT("info",("spider this=%p", this));
10892   switch (sql_type)
10893   {
10894     case SPIDER_SQL_TYPE_SELECT_SQL:
10895       str = &sql;
10896       break;
10897     case SPIDER_SQL_TYPE_TMP_SQL:
10898       str = &tmp_sql;
10899       break;
10900     default:
10901       DBUG_RETURN(0);
10902   }
10903   error_num = append_values_terminator(str);
10904   DBUG_RETURN(error_num);
10905 }
10906 
append_values_terminator(spider_string * str)10907 int spider_mbase_handler::append_values_terminator(
10908   spider_string *str
10909 ) {
10910   DBUG_ENTER("spider_mbase_handler::append_values_terminator");
10911   DBUG_PRINT("info",("spider this=%p", this));
10912   str->length(str->length() -
10913     SPIDER_SQL_COMMA_LEN - SPIDER_SQL_OPEN_PAREN_LEN);
10914   DBUG_RETURN(0);
10915 }
10916 
append_union_table_connector_part(ulong sql_type)10917 int spider_mbase_handler::append_union_table_connector_part(
10918   ulong sql_type
10919 ) {
10920   int error_num;
10921   spider_string *str;
10922   DBUG_ENTER("spider_mbase_handler::append_union_table_connector_part");
10923   DBUG_PRINT("info",("spider this=%p", this));
10924   switch (sql_type)
10925   {
10926     case SPIDER_SQL_TYPE_SELECT_SQL:
10927       str = &sql;
10928       break;
10929     case SPIDER_SQL_TYPE_TMP_SQL:
10930       str = &tmp_sql;
10931       break;
10932     default:
10933       DBUG_RETURN(0);
10934   }
10935   error_num = append_union_table_connector(str);
10936   DBUG_RETURN(error_num);
10937 }
10938 
append_union_table_connector(spider_string * str)10939 int spider_mbase_handler::append_union_table_connector(
10940   spider_string *str
10941 ) {
10942   DBUG_ENTER("spider_mbase_handler::append_union_table_connector");
10943   DBUG_PRINT("info",("spider this=%p", this));
10944   if (str->reserve((SPIDER_SQL_SPACE_LEN * 2) + SPIDER_SQL_UNION_ALL_LEN))
10945     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10946   str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
10947   str->q_append(SPIDER_SQL_UNION_ALL_STR, SPIDER_SQL_UNION_ALL_LEN);
10948   str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
10949   DBUG_RETURN(0);
10950 }
10951 
append_union_table_terminator_part(ulong sql_type)10952 int spider_mbase_handler::append_union_table_terminator_part(
10953   ulong sql_type
10954 ) {
10955   int error_num;
10956   spider_string *str;
10957   DBUG_ENTER("spider_mbase_handler::append_union_table_terminator_part");
10958   DBUG_PRINT("info",("spider this=%p", this));
10959   switch (sql_type)
10960   {
10961     case SPIDER_SQL_TYPE_SELECT_SQL:
10962       str = &sql;
10963       break;
10964     default:
10965       DBUG_RETURN(0);
10966   }
10967   error_num = append_union_table_terminator(str);
10968   DBUG_RETURN(error_num);
10969 }
10970 
append_union_table_terminator(spider_string * str)10971 int spider_mbase_handler::append_union_table_terminator(
10972   spider_string *str
10973 ) {
10974   DBUG_ENTER("spider_mbase_handler::append_union_table_terminator");
10975   DBUG_PRINT("info",("spider this=%p", this));
10976   str->length(str->length() -
10977     ((SPIDER_SQL_SPACE_LEN * 2) + SPIDER_SQL_UNION_ALL_LEN));
10978   str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
10979   str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
10980   table_name_pos = str->length() + SPIDER_SQL_SPACE_LEN + SPIDER_SQL_A_LEN +
10981     SPIDER_SQL_COMMA_LEN;
10982   if (str->reserve(tmp_sql.length() - SPIDER_SQL_FROM_LEN))
10983     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10984   str->q_append(tmp_sql.ptr() + SPIDER_SQL_FROM_LEN,
10985     tmp_sql.length() - SPIDER_SQL_FROM_LEN);
10986   DBUG_RETURN(0);
10987 }
10988 
append_key_column_values_part(const key_range * start_key,ulong sql_type)10989 int spider_mbase_handler::append_key_column_values_part(
10990   const key_range *start_key,
10991   ulong sql_type
10992 ) {
10993   int error_num;
10994   spider_string *str;
10995   DBUG_ENTER("spider_mbase_handler::append_key_column_values_part");
10996   switch (sql_type)
10997   {
10998     case SPIDER_SQL_TYPE_SELECT_SQL:
10999       str = &sql;
11000       break;
11001     case SPIDER_SQL_TYPE_TMP_SQL:
11002       str = &tmp_sql;
11003       break;
11004     default:
11005       DBUG_RETURN(0);
11006   }
11007   error_num = append_key_column_values(str, start_key);
11008   DBUG_RETURN(error_num);
11009 }
11010 
append_key_column_values(spider_string * str,const key_range * start_key)11011 int spider_mbase_handler::append_key_column_values(
11012   spider_string *str,
11013   const key_range *start_key
11014 ) {
11015   int error_num;
11016   const uchar *ptr;
11017   SPIDER_RESULT_LIST *result_list = &spider->result_list;
11018   SPIDER_SHARE *share = spider->share;
11019   KEY *key_info = result_list->key_info;
11020   uint length;
11021   uint store_length;
11022   key_part_map full_key_part_map =
11023     make_prev_keypart_map(spider_user_defined_key_parts(key_info));
11024   key_part_map start_key_part_map;
11025   KEY_PART_INFO *key_part;
11026   Field *field;
11027   DBUG_ENTER("spider_mbase_handler::append_key_column_values");
11028   start_key_part_map = start_key->keypart_map & full_key_part_map;
11029   DBUG_PRINT("info", ("spider spider_user_defined_key_parts=%u",
11030     spider_user_defined_key_parts(key_info)));
11031   DBUG_PRINT("info", ("spider full_key_part_map=%lu", full_key_part_map));
11032   DBUG_PRINT("info", ("spider start_key_part_map=%lu", start_key_part_map));
11033 
11034   if (!start_key_part_map)
11035     DBUG_RETURN(0);
11036 
11037   for (
11038     key_part = key_info->key_part,
11039     length = 0;
11040     start_key_part_map;
11041     start_key_part_map >>= 1,
11042     key_part++,
11043     length += store_length
11044   ) {
11045     store_length = key_part->store_length;
11046     ptr = start_key->key + length;
11047     field = key_part->field;
11048     if ((error_num = spider_db_append_null_value(str, key_part, &ptr)))
11049     {
11050       if (error_num > 0)
11051         DBUG_RETURN(error_num);
11052     } else {
11053       if (spider_db_mbase_utility->append_column_value(spider, str, field, ptr,
11054         share->access_charset))
11055         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11056     }
11057 
11058     if (str->reserve(SPIDER_SQL_COMMA_LEN))
11059       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11060     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
11061   }
11062   str->length(str->length() - SPIDER_SQL_COMMA_LEN);
11063   DBUG_RETURN(0);
11064 }
11065 
append_key_column_values_with_name_part(const key_range * start_key,ulong sql_type)11066 int spider_mbase_handler::append_key_column_values_with_name_part(
11067   const key_range *start_key,
11068   ulong sql_type
11069 ) {
11070   int error_num;
11071   spider_string *str;
11072   DBUG_ENTER("spider_mbase_handler::append_key_column_values_with_name_part");
11073   switch (sql_type)
11074   {
11075     case SPIDER_SQL_TYPE_SELECT_SQL:
11076       str = &sql;
11077       break;
11078     case SPIDER_SQL_TYPE_TMP_SQL:
11079       str = &tmp_sql;
11080       break;
11081     default:
11082       DBUG_RETURN(0);
11083   }
11084   error_num = append_key_column_values_with_name(str, start_key);
11085   DBUG_RETURN(error_num);
11086 }
11087 
append_key_column_values_with_name(spider_string * str,const key_range * start_key)11088 int spider_mbase_handler::append_key_column_values_with_name(
11089   spider_string *str,
11090   const key_range *start_key
11091 ) {
11092   int error_num;
11093   const uchar *ptr;
11094   SPIDER_RESULT_LIST *result_list = &spider->result_list;
11095   SPIDER_SHARE *share = spider->share;
11096   KEY *key_info = result_list->key_info;
11097   uint length;
11098   uint key_name_length, key_count;
11099   uint store_length;
11100   key_part_map full_key_part_map =
11101     make_prev_keypart_map(spider_user_defined_key_parts(key_info));
11102   key_part_map start_key_part_map;
11103   KEY_PART_INFO *key_part;
11104   Field *field;
11105   char tmp_buf[MAX_FIELD_WIDTH];
11106   DBUG_ENTER("spider_mbase_handler::append_key_column_values_with_name");
11107   start_key_part_map = start_key->keypart_map & full_key_part_map;
11108   DBUG_PRINT("info", ("spider spider_user_defined_key_parts=%u",
11109     spider_user_defined_key_parts(key_info)));
11110   DBUG_PRINT("info", ("spider full_key_part_map=%lu", full_key_part_map));
11111   DBUG_PRINT("info", ("spider start_key_part_map=%lu", start_key_part_map));
11112 
11113   if (!start_key_part_map)
11114     DBUG_RETURN(0);
11115 
11116   for (
11117     key_part = key_info->key_part,
11118     length = 0,
11119     key_count = 0;
11120     start_key_part_map;
11121     start_key_part_map >>= 1,
11122     key_part++,
11123     length += store_length,
11124     key_count++
11125   ) {
11126     store_length = key_part->store_length;
11127     ptr = start_key->key + length;
11128     field = key_part->field;
11129     if ((error_num = spider_db_append_null_value(str, key_part, &ptr)))
11130     {
11131       if (error_num > 0)
11132         DBUG_RETURN(error_num);
11133     } else {
11134       if (spider_db_mbase_utility->append_column_value(spider, str, field, ptr,
11135         share->access_charset))
11136         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11137     }
11138 
11139     key_name_length = my_sprintf(tmp_buf, (tmp_buf, "c%u", key_count));
11140     if (str->reserve(SPIDER_SQL_SPACE_LEN + key_name_length +
11141       SPIDER_SQL_COMMA_LEN))
11142       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11143     str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
11144     str->q_append(tmp_buf, key_name_length);
11145     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
11146   }
11147   str->length(str->length() - SPIDER_SQL_COMMA_LEN);
11148   DBUG_RETURN(0);
11149 }
11150 
append_key_where_part(const key_range * start_key,const key_range * end_key,ulong sql_type)11151 int spider_mbase_handler::append_key_where_part(
11152   const key_range *start_key,
11153   const key_range *end_key,
11154   ulong sql_type
11155 ) {
11156   int error_num;
11157   spider_string *str, *str_part = NULL, *str_part2 = NULL;
11158   bool set_order;
11159   DBUG_ENTER("spider_mbase_handler::append_key_where_part");
11160   switch (sql_type)
11161   {
11162     case SPIDER_SQL_TYPE_SELECT_SQL:
11163       str = &sql;
11164       set_order = FALSE;
11165       break;
11166     case SPIDER_SQL_TYPE_TMP_SQL:
11167       str = &tmp_sql;
11168       set_order = FALSE;
11169       break;
11170     case SPIDER_SQL_TYPE_INSERT_SQL:
11171     case SPIDER_SQL_TYPE_UPDATE_SQL:
11172     case SPIDER_SQL_TYPE_DELETE_SQL:
11173     case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
11174       str = &update_sql;
11175       set_order = FALSE;
11176       break;
11177     case SPIDER_SQL_TYPE_HANDLER:
11178       str = &ha_sql;
11179       ha_read_pos = str->length();
11180       str_part = &sql_part;
11181       str_part2 = &sql_part2;
11182       str_part->length(0);
11183       str_part2->length(0);
11184       set_order = TRUE;
11185       break;
11186     default:
11187       DBUG_RETURN(0);
11188   }
11189   error_num = append_key_where(str, str_part, str_part2, start_key, end_key,
11190     sql_type, set_order);
11191   DBUG_RETURN(error_num);
11192 }
11193 
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)11194 int spider_mbase_handler::append_key_where(
11195   spider_string *str,
11196   spider_string *str_part,
11197   spider_string *str_part2,
11198   const key_range *start_key,
11199   const key_range *end_key,
11200   ulong sql_type,
11201   bool set_order
11202 ) {
11203   int error_num;
11204   DBUG_ENTER("spider_mbase_handler::append_key_where");
11205   error_num = spider_db_append_key_where_internal(str, str_part, str_part2,
11206     start_key, end_key, spider, set_order, sql_type,
11207     dbton_id);
11208   DBUG_RETURN(error_num);
11209 }
11210 
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)11211 int spider_mbase_handler::append_is_null_part(
11212   ulong sql_type,
11213   KEY_PART_INFO *key_part,
11214   const key_range *key,
11215   const uchar **ptr,
11216   bool key_eq,
11217   bool tgt_final
11218 ) {
11219   int error_num;
11220   spider_string *str, *str_part = NULL, *str_part2 = NULL;
11221   DBUG_ENTER("spider_mbase_handler::append_is_null_part");
11222   DBUG_PRINT("info",("spider this=%p", this));
11223   switch (sql_type)
11224   {
11225     case SPIDER_SQL_TYPE_SELECT_SQL:
11226     case SPIDER_SQL_TYPE_TMP_SQL:
11227       str = &sql;
11228       break;
11229     case SPIDER_SQL_TYPE_INSERT_SQL:
11230     case SPIDER_SQL_TYPE_UPDATE_SQL:
11231     case SPIDER_SQL_TYPE_DELETE_SQL:
11232     case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
11233       str = &update_sql;
11234       break;
11235     case SPIDER_SQL_TYPE_HANDLER:
11236       str = &ha_sql;
11237       str_part = &sql_part;
11238       str_part2 = &sql_part2;
11239       break;
11240     default:
11241       DBUG_RETURN(0);
11242   }
11243   error_num = append_is_null(sql_type, str, str_part, str_part2,
11244     key_part, key, ptr, key_eq, tgt_final);
11245   DBUG_RETURN(error_num);
11246 }
11247 
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)11248 int spider_mbase_handler::append_is_null(
11249   ulong sql_type,
11250   spider_string *str,
11251   spider_string *str_part,
11252   spider_string *str_part2,
11253   KEY_PART_INFO *key_part,
11254   const key_range *key,
11255   const uchar **ptr,
11256   bool key_eq,
11257   bool tgt_final
11258 ) {
11259   DBUG_ENTER("spider_mbase_handler::append_is_null");
11260   DBUG_PRINT("info",("spider this=%p", this));
11261   DBUG_PRINT("info",("spider key_eq=%s", key_eq ? "TRUE" : "FALSE"));
11262   if (key_part->null_bit)
11263   {
11264     if (*(*ptr)++)
11265     {
11266       if (sql_type == SPIDER_SQL_TYPE_HANDLER)
11267       {
11268         if (
11269           key_eq ||
11270           key->flag == HA_READ_KEY_EXACT ||
11271           key->flag == HA_READ_KEY_OR_NEXT
11272         ) {
11273 #ifdef SPIDER_HANDLER_SUPPORT_MULTIPLE_KEY_PARTS
11274           if (tgt_final)
11275           {
11276             if (str->reserve(SPIDER_SQL_EQUAL_LEN))
11277               DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11278             str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
11279           }
11280           str = str_part;
11281           if (str->reserve(SPIDER_SQL_NULL_LEN))
11282             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11283           str->q_append(SPIDER_SQL_NULL_STR, SPIDER_SQL_NULL_LEN);
11284 #else
11285           if (str_part->length() == SPIDER_SQL_OPEN_PAREN_LEN)
11286           {
11287             if (str->reserve(SPIDER_SQL_EQUAL_LEN))
11288               DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11289             str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
11290             str = str_part;
11291             if (str->reserve(SPIDER_SQL_NULL_LEN))
11292               DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11293             str->q_append(SPIDER_SQL_NULL_STR, SPIDER_SQL_NULL_LEN);
11294           }
11295 #endif
11296         } else {
11297 #ifdef SPIDER_HANDLER_SUPPORT_MULTIPLE_KEY_PARTS
11298           if (str_part->length() == SPIDER_SQL_OPEN_PAREN_LEN)
11299           {
11300             str = str_part;
11301             str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
11302             ha_next_pos = str->length();
11303             if (str->reserve(SPIDER_SQL_FIRST_LEN))
11304               DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11305             str->q_append(SPIDER_SQL_FIRST_STR, SPIDER_SQL_FIRST_LEN);
11306             spider->result_list.ha_read_kind = 1;
11307           } else if (tgt_final)
11308           {
11309             if (str->reserve(SPIDER_SQL_GT_LEN))
11310               DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11311             str->q_append(SPIDER_SQL_GT_STR, SPIDER_SQL_GT_LEN);
11312             str = str_part;
11313             if (str->reserve(SPIDER_SQL_NULL_LEN))
11314               DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11315             str->q_append(SPIDER_SQL_NULL_STR, SPIDER_SQL_NULL_LEN);
11316           }
11317 #else
11318           if (str_part->length() == SPIDER_SQL_OPEN_PAREN_LEN)
11319           {
11320             str = str_part;
11321             /* first index column */
11322             str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
11323             ha_next_pos = str->length();
11324             if (str->reserve(SPIDER_SQL_FIRST_LEN))
11325               DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11326             str->q_append(SPIDER_SQL_FIRST_STR, SPIDER_SQL_FIRST_LEN);
11327             spider->result_list.ha_read_kind = 1;
11328           }
11329 #endif
11330         }
11331         str = str_part2;
11332       }
11333       if (
11334         key_eq ||
11335         key->flag == HA_READ_KEY_EXACT ||
11336         key->flag == HA_READ_KEY_OR_NEXT
11337       ) {
11338         if (str->reserve(SPIDER_SQL_IS_NULL_LEN +
11339           /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
11340           mysql_share->column_name_str[key_part->field->field_index].length()))
11341           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11342         mysql_share->append_column_name(str, key_part->field->field_index);
11343         str->q_append(SPIDER_SQL_IS_NULL_STR, SPIDER_SQL_IS_NULL_LEN);
11344       } else {
11345         if (str->reserve(SPIDER_SQL_IS_NOT_NULL_LEN +
11346           /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
11347           mysql_share->column_name_str[key_part->field->field_index].length()))
11348           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11349         mysql_share->append_column_name(str, key_part->field->field_index);
11350         str->q_append(SPIDER_SQL_IS_NOT_NULL_STR, SPIDER_SQL_IS_NOT_NULL_LEN);
11351       }
11352       DBUG_RETURN(-1);
11353     }
11354   }
11355   DBUG_RETURN(0);
11356 }
11357 
append_where_terminator_part(ulong sql_type,bool set_order,int key_count)11358 int spider_mbase_handler::append_where_terminator_part(
11359   ulong sql_type,
11360   bool set_order,
11361   int key_count
11362 ) {
11363   int error_num;
11364   spider_string *str, *str_part = NULL, *str_part2 = NULL;
11365   DBUG_ENTER("spider_mbase_handler::append_where_terminator_part");
11366   DBUG_PRINT("info",("spider this=%p", this));
11367   switch (sql_type)
11368   {
11369     case SPIDER_SQL_TYPE_SELECT_SQL:
11370     case SPIDER_SQL_TYPE_TMP_SQL:
11371       str = &sql;
11372       break;
11373     case SPIDER_SQL_TYPE_INSERT_SQL:
11374     case SPIDER_SQL_TYPE_UPDATE_SQL:
11375     case SPIDER_SQL_TYPE_DELETE_SQL:
11376     case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
11377       str = &update_sql;
11378       break;
11379     case SPIDER_SQL_TYPE_HANDLER:
11380       str = &ha_sql;
11381       str_part = &sql_part;
11382       str_part2 = &sql_part2;
11383       break;
11384     default:
11385       DBUG_RETURN(0);
11386   }
11387   error_num = append_where_terminator(sql_type, str, str_part, str_part2,
11388     set_order, key_count);
11389   DBUG_RETURN(error_num);
11390 }
11391 
append_where_terminator(ulong sql_type,spider_string * str,spider_string * str_part,spider_string * str_part2,bool set_order,int key_count)11392 int spider_mbase_handler::append_where_terminator(
11393   ulong sql_type,
11394   spider_string *str,
11395   spider_string *str_part,
11396   spider_string *str_part2,
11397   bool set_order,
11398   int key_count
11399 ) {
11400   SPIDER_RESULT_LIST *result_list = &spider->result_list;
11401   DBUG_ENTER("spider_mbase_handler::append_where_terminator");
11402   DBUG_PRINT("info",("spider this=%p", this));
11403   if (sql_type != SPIDER_SQL_TYPE_HANDLER)
11404   {
11405     str->length(str->length() - SPIDER_SQL_AND_LEN);
11406     if (!set_order)
11407       result_list->key_order = key_count;
11408   } else {
11409     str_part2->length(str_part2->length() - SPIDER_SQL_AND_LEN);
11410 
11411 #ifdef SPIDER_HANDLER_SUPPORT_MULTIPLE_KEY_PARTS
11412     str_part->length(str_part->length() - SPIDER_SQL_COMMA_LEN);
11413 #endif
11414     if (!result_list->ha_read_kind)
11415       str_part->q_append(SPIDER_SQL_CLOSE_PAREN_STR,
11416         SPIDER_SQL_CLOSE_PAREN_LEN);
11417     if (str->append(*str_part))
11418       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11419     uint clause_length = str->length() - ha_next_pos;
11420     if (clause_length < SPIDER_SQL_NEXT_LEN)
11421     {
11422       int roop_count;
11423       clause_length = SPIDER_SQL_NEXT_LEN - clause_length;
11424       if (str->reserve(clause_length))
11425         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11426       for (roop_count = 0; roop_count < (int) clause_length; roop_count++)
11427         str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
11428     }
11429   }
11430   DBUG_RETURN(0);
11431 }
11432 
append_match_where_part(ulong sql_type)11433 int spider_mbase_handler::append_match_where_part(
11434   ulong sql_type
11435 ) {
11436   int error_num;
11437   spider_string *str;
11438   DBUG_ENTER("spider_mbase_handler::append_match_where_part");
11439   switch (sql_type)
11440   {
11441     case SPIDER_SQL_TYPE_SELECT_SQL:
11442       str = &sql;
11443       break;
11444     default:
11445       DBUG_ASSERT(0);
11446       DBUG_RETURN(0);
11447   }
11448   error_num = append_match_where(str);
11449   DBUG_RETURN(error_num);
11450 }
11451 
append_match_where(spider_string * str)11452 int spider_mbase_handler::append_match_where(
11453   spider_string *str
11454 ) {
11455   int error_num;
11456   bool first = TRUE;
11457   st_spider_ft_info *ft_info = spider->ft_first;
11458   DBUG_ENTER("spider_mbase_handler::append_match_where");
11459   if (spider->ft_current)
11460   {
11461     while (TRUE)
11462     {
11463       if (ft_info->used_in_where)
11464       {
11465         if (first)
11466         {
11467           if (str->reserve(SPIDER_SQL_WHERE_LEN))
11468             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11469           str->q_append(SPIDER_SQL_WHERE_STR, SPIDER_SQL_WHERE_LEN);
11470           first = FALSE;
11471         }
11472         if ((error_num = append_match_against(str, ft_info, NULL, 0)))
11473           DBUG_RETURN(error_num);
11474         if (str->reserve(SPIDER_SQL_AND_LEN))
11475           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11476         str->q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN);
11477       }
11478 
11479       if (ft_info == spider->ft_current)
11480         break;
11481       ft_info = ft_info->next;
11482     }
11483     if (!first)
11484       str->length(str->length() - SPIDER_SQL_AND_LEN);
11485   }
11486   DBUG_RETURN(0);
11487 }
11488 
append_update_where(spider_string * str,const TABLE * table,my_ptrdiff_t ptr_diff)11489 int spider_mbase_handler::append_update_where(
11490   spider_string *str,
11491   const TABLE *table,
11492   my_ptrdiff_t ptr_diff
11493 ) {
11494   uint field_name_length;
11495   Field **field;
11496   THD *thd = spider->wide_handler->trx->thd;
11497   SPIDER_SHARE *share = spider->share;
11498   bool no_pk = (table->s->primary_key == MAX_KEY);
11499   DBUG_ENTER("spider_mbase_handler::append_update_where");
11500   DBUG_PRINT("info", ("spider table->s->primary_key=%s",
11501     table->s->primary_key != MAX_KEY ? "TRUE" : "FALSE"));
11502   uint str_len_bakup = str->length();
11503   if (str->reserve(SPIDER_SQL_WHERE_LEN))
11504     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11505   str->q_append(SPIDER_SQL_WHERE_STR, SPIDER_SQL_WHERE_LEN);
11506 
11507   if (
11508     no_pk ||
11509     spider_param_use_cond_other_than_pk_for_update(thd)
11510   ) {
11511     for (field = table->field; *field; field++)
11512     {
11513       if (
11514         no_pk ||
11515         bitmap_is_set(table->read_set, (*field)->field_index)
11516       ) {
11517         field_name_length =
11518           mysql_share->column_name_str[(*field)->field_index].length();
11519         if ((*field)->is_null(ptr_diff))
11520         {
11521           if (str->reserve(field_name_length +
11522             /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
11523             SPIDER_SQL_IS_NULL_LEN + SPIDER_SQL_AND_LEN))
11524             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11525           mysql_share->append_column_name(str, (*field)->field_index);
11526           str->q_append(SPIDER_SQL_IS_NULL_STR, SPIDER_SQL_IS_NULL_LEN);
11527         } else {
11528           if (str->reserve(field_name_length +
11529             /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
11530             SPIDER_SQL_EQUAL_LEN))
11531             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11532           mysql_share->append_column_name(str, (*field)->field_index);
11533           str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
11534           (*field)->move_field_offset(ptr_diff);
11535           if (
11536             spider_db_mbase_utility->
11537               append_column_value(spider, str, *field, NULL,
11538                 share->access_charset) ||
11539             str->reserve(SPIDER_SQL_AND_LEN)
11540           )
11541             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11542           (*field)->move_field_offset(-ptr_diff);
11543         }
11544         str->q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN);
11545       }
11546     }
11547   } else {
11548     KEY *key_info = &table->key_info[table->s->primary_key];
11549     KEY_PART_INFO *key_part;
11550     uint part_num;
11551     for (
11552       key_part = key_info->key_part, part_num = 0;
11553       part_num < spider_user_defined_key_parts(key_info);
11554       key_part++, part_num++
11555     ) {
11556       field = &key_part->field;
11557       field_name_length =
11558         mysql_share->column_name_str[(*field)->field_index].length();
11559       if ((*field)->is_null(ptr_diff))
11560       {
11561         if (str->reserve(field_name_length +
11562           /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
11563           SPIDER_SQL_IS_NULL_LEN + SPIDER_SQL_AND_LEN))
11564           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11565         mysql_share->append_column_name(str, (*field)->field_index);
11566         str->q_append(SPIDER_SQL_IS_NULL_STR, SPIDER_SQL_IS_NULL_LEN);
11567       } else {
11568         if (str->reserve(field_name_length +
11569           /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
11570           SPIDER_SQL_EQUAL_LEN))
11571           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11572         mysql_share->append_column_name(str, (*field)->field_index);
11573         str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
11574         (*field)->move_field_offset(ptr_diff);
11575         if (
11576           spider_db_mbase_utility->
11577             append_column_value(spider, str, *field, NULL,
11578               share->access_charset) ||
11579           str->reserve(SPIDER_SQL_AND_LEN)
11580         )
11581           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11582         (*field)->move_field_offset(-ptr_diff);
11583       }
11584       str->q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN);
11585     }
11586   }
11587   if (str->length() == str_len_bakup + SPIDER_SQL_WHERE_LEN)
11588   {
11589     /* no condition */
11590     str->length(str_len_bakup);
11591   } else {
11592     str->length(str->length() - SPIDER_SQL_AND_LEN);
11593   }
11594   if (str->reserve(SPIDER_SQL_LIMIT1_LEN))
11595     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11596   str->q_append(SPIDER_SQL_LIMIT1_STR, SPIDER_SQL_LIMIT1_LEN);
11597   DBUG_RETURN(0);
11598 }
11599 
append_condition_part(const char * alias,uint alias_length,ulong sql_type,bool test_flg)11600 int spider_mbase_handler::append_condition_part(
11601   const char *alias,
11602   uint alias_length,
11603   ulong sql_type,
11604   bool test_flg
11605 ) {
11606   int error_num;
11607   spider_string *str;
11608   bool start_where = FALSE;
11609   DBUG_ENTER("spider_mbase_handler::append_condition_part");
11610   switch (sql_type)
11611   {
11612     case SPIDER_SQL_TYPE_SELECT_SQL:
11613       if (test_flg)
11614       {
11615         str = NULL;
11616       } else {
11617         str = &sql;
11618         start_where = ((int) str->length() == where_pos);
11619       }
11620       break;
11621     case SPIDER_SQL_TYPE_TMP_SQL:
11622       if (test_flg)
11623       {
11624         str = NULL;
11625       } else {
11626         str = &tmp_sql;
11627         start_where = ((int) str->length() == where_pos);
11628       }
11629       break;
11630     case SPIDER_SQL_TYPE_INSERT_SQL:
11631     case SPIDER_SQL_TYPE_UPDATE_SQL:
11632     case SPIDER_SQL_TYPE_DELETE_SQL:
11633     case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
11634       if (test_flg)
11635       {
11636         str = NULL;
11637       } else {
11638         str = &update_sql;
11639         start_where = ((int) str->length() == where_pos);
11640       }
11641       break;
11642     case SPIDER_SQL_TYPE_HANDLER:
11643       if (test_flg)
11644       {
11645         str = NULL;
11646       } else {
11647         str = &ha_sql;
11648         start_where = TRUE;
11649         if (spider->active_index == MAX_KEY)
11650         {
11651           set_where_pos(SPIDER_SQL_TYPE_HANDLER);
11652           if (str->reserve(SPIDER_SQL_READ_LEN + SPIDER_SQL_FIRST_LEN))
11653             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11654           str->q_append(SPIDER_SQL_READ_STR, SPIDER_SQL_READ_LEN);
11655           ha_next_pos = str->length();
11656           str->q_append(SPIDER_SQL_FIRST_STR, SPIDER_SQL_FIRST_LEN);
11657           sql_part2.length(0);
11658         }
11659         ha_where_pos = str->length();
11660 
11661         if (
11662           spider->wide_handler->sql_command == SQLCOM_HA_READ ||
11663           !spider->result_list.use_both_key
11664         ) {
11665           if (sql_part2.length())
11666           {
11667             str->append(sql_part2);
11668             start_where = FALSE;
11669           }
11670         } else {
11671           DBUG_RETURN(0);
11672         }
11673       }
11674       break;
11675     default:
11676       DBUG_RETURN(0);
11677   }
11678   error_num = append_condition(str, alias, alias_length, start_where,
11679     sql_type);
11680   DBUG_RETURN(error_num);
11681 }
11682 
append_condition(spider_string * str,const char * alias,uint alias_length,bool start_where,ulong sql_type)11683 int spider_mbase_handler::append_condition(
11684   spider_string *str,
11685   const char *alias,
11686   uint alias_length,
11687   bool start_where,
11688   ulong sql_type
11689 ) {
11690   int error_num, restart_pos = 0, start_where_pos;
11691   SPIDER_CONDITION *tmp_cond = spider->wide_handler->condition;
11692   DBUG_ENTER("spider_mbase_handler::append_condition");
11693   if (str && start_where)
11694   {
11695     start_where_pos = str->length();
11696   } else {
11697     start_where_pos = 0;
11698   }
11699 
11700   if (spider->is_clone && !tmp_cond)
11701   {
11702     tmp_cond = spider->pt_clone_source_handler->wide_handler->condition;
11703   }
11704 
11705   while (tmp_cond)
11706   {
11707     if (str)
11708     {
11709       restart_pos = str->length();
11710       if (start_where)
11711       {
11712         if (str->reserve(SPIDER_SQL_WHERE_LEN))
11713           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11714         str->q_append(SPIDER_SQL_WHERE_STR, SPIDER_SQL_WHERE_LEN);
11715         start_where = FALSE;
11716       } else {
11717         if (str->reserve(SPIDER_SQL_AND_LEN))
11718           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11719         str->q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN);
11720       }
11721     }
11722     if ((error_num = spider_db_print_item_type(
11723       (Item *) tmp_cond->cond, NULL, spider, str, alias, alias_length,
11724       dbton_id, FALSE, NULL)))
11725     {
11726       if (str && error_num == ER_SPIDER_COND_SKIP_NUM)
11727       {
11728         DBUG_PRINT("info",("spider COND skip"));
11729         str->length(restart_pos);
11730         start_where = (restart_pos == start_where_pos);
11731       } else
11732         DBUG_RETURN(error_num);
11733     }
11734     tmp_cond = tmp_cond->next;
11735   }
11736   DBUG_RETURN(0);
11737 }
11738 
append_match_against_part(ulong sql_type,st_spider_ft_info * ft_info,const char * alias,uint alias_length)11739 int spider_mbase_handler::append_match_against_part(
11740   ulong sql_type,
11741   st_spider_ft_info *ft_info,
11742   const char *alias,
11743   uint alias_length
11744 ) {
11745   int error_num;
11746   spider_string *str;
11747   DBUG_ENTER("spider_mbase_handler::append_match_against_part");
11748   DBUG_PRINT("info",("spider this=%p", this));
11749   switch (sql_type)
11750   {
11751     case SPIDER_SQL_TYPE_SELECT_SQL:
11752       str = &sql;
11753       break;
11754     default:
11755       DBUG_RETURN(0);
11756   }
11757   error_num = append_match_against(str, ft_info, alias, alias_length);
11758   DBUG_RETURN(error_num);
11759 }
11760 
append_match_against(spider_string * str,st_spider_ft_info * ft_info,const char * alias,uint alias_length)11761 int spider_mbase_handler::append_match_against(
11762   spider_string *str,
11763   st_spider_ft_info  *ft_info,
11764   const char *alias,
11765   uint alias_length
11766 ) {
11767   SPIDER_SHARE *share = spider->share;
11768   TABLE *table = spider->get_table();
11769   String *ft_init_key;
11770   KEY *key_info;
11771   uint key_name_length;
11772   int key_count;
11773   KEY_PART_INFO *key_part;
11774   Field *field;
11775   DBUG_ENTER("spider_mbase_handler::append_match_against");
11776   DBUG_PRINT("info",("spider this=%p", this));
11777   if (str->reserve(SPIDER_SQL_MATCH_LEN))
11778     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11779   str->q_append(SPIDER_SQL_MATCH_STR, SPIDER_SQL_MATCH_LEN);
11780 
11781   ft_init_key = ft_info->key;
11782   key_info = &table->key_info[ft_info->inx];
11783   DBUG_PRINT("info", ("spider spider_user_defined_key_parts=%u",
11784     spider_user_defined_key_parts(key_info)));
11785 
11786   for (
11787     key_part = key_info->key_part,
11788     key_count = 0;
11789     key_count < (int) spider_user_defined_key_parts(key_info);
11790     key_part++,
11791     key_count++
11792   ) {
11793     field = key_part->field;
11794     key_name_length =
11795       mysql_share->column_name_str[field->field_index].length();
11796     if (alias_length)
11797     {
11798       if (str->reserve(alias_length + key_name_length +
11799         /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
11800         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11801       str->q_append(alias, alias_length);
11802     } else {
11803       if (str->reserve(key_name_length +
11804         /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
11805         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11806     }
11807     mysql_share->append_column_name(str, field->field_index);
11808     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
11809   }
11810   str->length(str->length() - SPIDER_SQL_COMMA_LEN);
11811   if (str->reserve(SPIDER_SQL_AGAINST_LEN + SPIDER_SQL_VALUE_QUOTE_LEN))
11812     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11813   str->q_append(SPIDER_SQL_AGAINST_STR, SPIDER_SQL_AGAINST_LEN);
11814   str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
11815 
11816   char buf[MAX_FIELD_WIDTH];
11817   spider_string tmp_str(buf, MAX_FIELD_WIDTH, share->access_charset);
11818   tmp_str.init_calc_mem(116);
11819   tmp_str.length(0);
11820   if (
11821     tmp_str.append(ft_init_key->ptr(), ft_init_key->length(),
11822       ft_init_key->charset()) ||
11823     str->reserve(tmp_str.length() * 2) ||
11824     spider_db_mbase_utility->append_escaped_util(str, tmp_str.get_str())
11825   )
11826     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11827   str->mem_calc();
11828 
11829   if (str->reserve(
11830     SPIDER_SQL_VALUE_QUOTE_LEN + SPIDER_SQL_CLOSE_PAREN_LEN +
11831     ((ft_info->flags & FT_BOOL) ? SPIDER_SQL_IN_BOOLEAN_MODE_LEN : 0) +
11832     ((ft_info->flags & FT_EXPAND) ?
11833       SPIDER_SQL_WITH_QUERY_EXPANSION_LEN : 0)
11834   ))
11835     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11836   str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
11837   if (ft_info->flags & FT_BOOL)
11838     str->q_append(SPIDER_SQL_IN_BOOLEAN_MODE_STR,
11839       SPIDER_SQL_IN_BOOLEAN_MODE_LEN);
11840   if (ft_info->flags & FT_EXPAND)
11841     str->q_append(SPIDER_SQL_WITH_QUERY_EXPANSION_STR,
11842       SPIDER_SQL_WITH_QUERY_EXPANSION_LEN);
11843   str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
11844   DBUG_RETURN(0);
11845 }
11846 
append_match_select_part(ulong sql_type,const char * alias,uint alias_length)11847 int spider_mbase_handler::append_match_select_part(
11848   ulong sql_type,
11849   const char *alias,
11850   uint alias_length
11851 ) {
11852   int error_num;
11853   spider_string *str;
11854   DBUG_ENTER("spider_mbase_handler::append_match_select_part");
11855   DBUG_PRINT("info",("spider this=%p", this));
11856   switch (sql_type)
11857   {
11858     case SPIDER_SQL_TYPE_SELECT_SQL:
11859       str = &sql;
11860       break;
11861     default:
11862       DBUG_RETURN(0);
11863   }
11864   error_num = append_match_select(str, alias, alias_length);
11865   DBUG_RETURN(error_num);
11866 }
11867 
append_match_select(spider_string * str,const char * alias,uint alias_length)11868 int spider_mbase_handler::append_match_select(
11869   spider_string *str,
11870   const char *alias,
11871   uint alias_length
11872 ) {
11873   int error_num;
11874   DBUG_ENTER("spider_mbase_handler::append_match_select");
11875   DBUG_PRINT("info",("spider this=%p", this));
11876   if (spider->ft_current)
11877   {
11878     st_spider_ft_info *ft_info = spider->ft_first;
11879     while (TRUE)
11880     {
11881       if ((error_num = append_match_against(str, ft_info,
11882         alias, alias_length)))
11883         DBUG_RETURN(error_num);
11884       if (str->reserve(SPIDER_SQL_COMMA_LEN))
11885         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11886       str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
11887       if (ft_info == spider->ft_current)
11888         break;
11889       ft_info = ft_info->next;
11890     }
11891   }
11892   DBUG_RETURN(0);
11893 }
11894 
11895 #ifdef HANDLER_HAS_DIRECT_AGGREGATE
append_sum_select_part(ulong sql_type,const char * alias,uint alias_length)11896 int spider_mbase_handler::append_sum_select_part(
11897   ulong sql_type,
11898   const char *alias,
11899   uint alias_length
11900 ) {
11901   int error_num;
11902   spider_string *str;
11903   DBUG_ENTER("spider_mbase_handler::append_sum_select_part");
11904   DBUG_PRINT("info",("spider this=%p", this));
11905   switch (sql_type)
11906   {
11907     case SPIDER_SQL_TYPE_SELECT_SQL:
11908       str = &sql;
11909       break;
11910     default:
11911       DBUG_RETURN(0);
11912   }
11913   error_num = append_sum_select(str, alias, alias_length);
11914   DBUG_RETURN(error_num);
11915 }
11916 
append_sum_select(spider_string * str,const char * alias,uint alias_length)11917 int spider_mbase_handler::append_sum_select(
11918   spider_string *str,
11919   const char *alias,
11920   uint alias_length
11921 ) {
11922   int error_num;
11923   st_select_lex *select_lex;
11924   DBUG_ENTER("spider_mbase_handler::append_sum_select");
11925   DBUG_PRINT("info",("spider this=%p", this));
11926   select_lex = spider_get_select_lex(spider);
11927   JOIN *join = select_lex->join;
11928   Item_sum **item_sum_ptr;
11929   for (item_sum_ptr = join->sum_funcs; *item_sum_ptr; ++item_sum_ptr)
11930   {
11931     if ((error_num = spider_db_mbase_utility->open_item_sum_func(*item_sum_ptr,
11932       spider, str, alias, alias_length, FALSE, NULL)))
11933     {
11934       DBUG_RETURN(error_num);
11935     }
11936     if (str->reserve(SPIDER_SQL_COMMA_LEN))
11937       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11938     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
11939   }
11940   DBUG_RETURN(0);
11941 }
11942 #endif
11943 
set_order_pos(ulong sql_type)11944 void spider_mbase_handler::set_order_pos(
11945   ulong sql_type
11946 ) {
11947   DBUG_ENTER("spider_mbase_handler::set_order_pos");
11948   switch (sql_type)
11949   {
11950     case SPIDER_SQL_TYPE_SELECT_SQL:
11951     case SPIDER_SQL_TYPE_TMP_SQL:
11952       order_pos = sql.length();
11953       break;
11954     case SPIDER_SQL_TYPE_INSERT_SQL:
11955     case SPIDER_SQL_TYPE_UPDATE_SQL:
11956     case SPIDER_SQL_TYPE_DELETE_SQL:
11957     case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
11958       order_pos = update_sql.length();
11959       break;
11960     case SPIDER_SQL_TYPE_HANDLER:
11961       ha_next_pos = ha_sql.length();
11962       break;
11963     default:
11964       DBUG_ASSERT(0);
11965       break;
11966   }
11967   DBUG_VOID_RETURN;
11968 }
11969 
set_order_to_pos(ulong sql_type)11970 void spider_mbase_handler::set_order_to_pos(
11971   ulong sql_type
11972 ) {
11973   DBUG_ENTER("spider_mbase_handler::set_order_to_pos");
11974   switch (sql_type)
11975   {
11976     case SPIDER_SQL_TYPE_SELECT_SQL:
11977     case SPIDER_SQL_TYPE_TMP_SQL:
11978       sql.length(order_pos);
11979       break;
11980     case SPIDER_SQL_TYPE_INSERT_SQL:
11981     case SPIDER_SQL_TYPE_UPDATE_SQL:
11982     case SPIDER_SQL_TYPE_DELETE_SQL:
11983     case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
11984       update_sql.length(order_pos);
11985       break;
11986     case SPIDER_SQL_TYPE_HANDLER:
11987       ha_sql.length(ha_next_pos);
11988       break;
11989     default:
11990       DBUG_ASSERT(0);
11991       break;
11992   }
11993   DBUG_VOID_RETURN;
11994 }
11995 
11996 #ifdef HANDLER_HAS_DIRECT_AGGREGATE
append_group_by_part(const char * alias,uint alias_length,ulong sql_type)11997 int spider_mbase_handler::append_group_by_part(
11998   const char *alias,
11999   uint alias_length,
12000   ulong sql_type
12001 ) {
12002   int error_num;
12003   spider_string *str;
12004   DBUG_ENTER("spider_mbase_handler::append_group_by_part");
12005   DBUG_PRINT("info",("spider this=%p", this));
12006   switch (sql_type)
12007   {
12008     case SPIDER_SQL_TYPE_SELECT_SQL:
12009     case SPIDER_SQL_TYPE_TMP_SQL:
12010       str = &sql;
12011       break;
12012     case SPIDER_SQL_TYPE_INSERT_SQL:
12013     case SPIDER_SQL_TYPE_UPDATE_SQL:
12014     case SPIDER_SQL_TYPE_DELETE_SQL:
12015     case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
12016       str = &update_sql;
12017       break;
12018     case SPIDER_SQL_TYPE_HANDLER:
12019       str = &ha_sql;
12020       break;
12021     default:
12022       DBUG_RETURN(0);
12023   }
12024   error_num = append_group_by(str, alias, alias_length);
12025   DBUG_RETURN(error_num);
12026 }
12027 
append_group_by(spider_string * str,const char * alias,uint alias_length)12028 int spider_mbase_handler::append_group_by(
12029   spider_string *str,
12030   const char *alias,
12031   uint alias_length
12032 ) {
12033   int error_num;
12034   st_select_lex *select_lex;
12035   DBUG_ENTER("spider_mbase_handler::append_group_by");
12036   DBUG_PRINT("info",("spider this=%p", this));
12037   select_lex = spider_get_select_lex(spider);
12038   ORDER *group = (ORDER *) select_lex->group_list.first;
12039   if (group)
12040   {
12041     if (str->reserve(SPIDER_SQL_GROUP_LEN))
12042       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12043     str->q_append(SPIDER_SQL_GROUP_STR, SPIDER_SQL_GROUP_LEN);
12044     for (; group; group = group->next)
12045     {
12046       if ((error_num = spider_db_print_item_type((*group->item), NULL, spider,
12047         str, alias, alias_length, dbton_id, FALSE, NULL)))
12048       {
12049         DBUG_RETURN(error_num);
12050       }
12051       if (str->reserve(SPIDER_SQL_COMMA_LEN))
12052         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12053       str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
12054     }
12055     str->length(str->length() - SPIDER_SQL_COMMA_LEN);
12056   }
12057   DBUG_RETURN(0);
12058 }
12059 #endif
12060 
append_key_order_for_merge_with_alias_part(const char * alias,uint alias_length,ulong sql_type)12061 int spider_mbase_handler::append_key_order_for_merge_with_alias_part(
12062   const char *alias,
12063   uint alias_length,
12064   ulong sql_type
12065 ) {
12066   int error_num;
12067   spider_string *str;
12068   DBUG_ENTER("spider_mbase_handler::append_key_order_for_merge_with_alias_part");
12069   DBUG_PRINT("info",("spider this=%p", this));
12070   switch (sql_type)
12071   {
12072     case SPIDER_SQL_TYPE_SELECT_SQL:
12073     case SPIDER_SQL_TYPE_TMP_SQL:
12074       str = &sql;
12075       break;
12076     case SPIDER_SQL_TYPE_INSERT_SQL:
12077     case SPIDER_SQL_TYPE_UPDATE_SQL:
12078     case SPIDER_SQL_TYPE_DELETE_SQL:
12079     case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
12080       str = &update_sql;
12081       break;
12082     case SPIDER_SQL_TYPE_HANDLER:
12083       str = &ha_sql;
12084       ha_limit_pos = ha_sql.length();
12085       break;
12086     default:
12087       DBUG_RETURN(0);
12088   }
12089   error_num = append_key_order_for_merge_with_alias(str, alias, alias_length);
12090   DBUG_RETURN(error_num);
12091 }
12092 
append_key_order_for_merge_with_alias(spider_string * str,const char * alias,uint alias_length)12093 int spider_mbase_handler::append_key_order_for_merge_with_alias(
12094   spider_string *str,
12095   const char *alias,
12096   uint alias_length
12097 ) {
12098   /* sort for index merge */
12099   TABLE *table = spider->get_table();
12100   int length;
12101   Field *field;
12102   uint key_name_length;
12103   DBUG_ENTER("spider_mbase_handler::append_key_order_for_merge_with_alias");
12104   DBUG_PRINT("info",("spider this=%p", this));
12105 #ifdef HANDLER_HAS_DIRECT_AGGREGATE
12106   if (spider->result_list.direct_aggregate)
12107   {
12108     int error_num;
12109     if ((error_num = append_group_by(str, alias, alias_length)))
12110       DBUG_RETURN(error_num);
12111   }
12112 #endif
12113   if (table->s->primary_key < MAX_KEY)
12114   {
12115     /* sort by primary key */
12116     KEY *key_info = &table->key_info[table->s->primary_key];
12117     KEY_PART_INFO *key_part;
12118     for (
12119       key_part = key_info->key_part,
12120       length = 1;
12121       length <= (int) spider_user_defined_key_parts(key_info);
12122       key_part++,
12123       length++
12124     ) {
12125       field = key_part->field;
12126       key_name_length =
12127         mysql_share->column_name_str[field->field_index].length();
12128       if (length == 1)
12129       {
12130         if (str->reserve(SPIDER_SQL_ORDER_LEN))
12131           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12132         str->q_append(SPIDER_SQL_ORDER_STR, SPIDER_SQL_ORDER_LEN);
12133       }
12134       if (str->reserve(alias_length + key_name_length +
12135         /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
12136         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12137       str->q_append(alias, alias_length);
12138       mysql_share->append_column_name(str, field->field_index);
12139       str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
12140     }
12141     if (length > 1)
12142     {
12143       str->length(str->length() - SPIDER_SQL_COMMA_LEN);
12144     }
12145   } else {
12146     /* sort by all columns */
12147     Field **fieldp;
12148     for (
12149       fieldp = table->field, length = 1;
12150       *fieldp;
12151       fieldp++, length++
12152     ) {
12153       key_name_length =
12154         mysql_share->column_name_str[(*fieldp)->field_index].length();
12155       if (length == 1)
12156       {
12157         if (str->reserve(SPIDER_SQL_ORDER_LEN))
12158           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12159         str->q_append(SPIDER_SQL_ORDER_STR, SPIDER_SQL_ORDER_LEN);
12160       }
12161       if (str->reserve(alias_length + key_name_length +
12162         /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
12163         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12164       str->q_append(alias, alias_length);
12165       mysql_share->append_column_name(str, (*fieldp)->field_index);
12166       str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
12167     }
12168     if (length > 1)
12169     {
12170       str->length(str->length() - SPIDER_SQL_COMMA_LEN);
12171     }
12172   }
12173   limit_pos = str->length();
12174   DBUG_RETURN(0);
12175 }
12176 
append_key_order_for_direct_order_limit_with_alias_part(const char * alias,uint alias_length,ulong sql_type)12177 int spider_mbase_handler::append_key_order_for_direct_order_limit_with_alias_part(
12178   const char *alias,
12179   uint alias_length,
12180   ulong sql_type
12181 ) {
12182   int error_num;
12183   spider_string *str;
12184   DBUG_ENTER("spider_mbase_handler::append_key_order_for_direct_order_limit_with_alias_part");
12185   DBUG_PRINT("info",("spider this=%p", this));
12186   switch (sql_type)
12187   {
12188     case SPIDER_SQL_TYPE_SELECT_SQL:
12189     case SPIDER_SQL_TYPE_TMP_SQL:
12190       str = &sql;
12191       break;
12192     case SPIDER_SQL_TYPE_INSERT_SQL:
12193     case SPIDER_SQL_TYPE_UPDATE_SQL:
12194     case SPIDER_SQL_TYPE_DELETE_SQL:
12195     case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
12196       str = &update_sql;
12197       break;
12198     case SPIDER_SQL_TYPE_HANDLER:
12199       str = &ha_sql;
12200       break;
12201     default:
12202       DBUG_RETURN(0);
12203   }
12204   error_num = append_key_order_for_direct_order_limit_with_alias(
12205     str, alias, alias_length);
12206   DBUG_RETURN(error_num);
12207 }
12208 
append_key_order_for_direct_order_limit_with_alias(spider_string * str,const char * alias,uint alias_length)12209 int spider_mbase_handler::append_key_order_for_direct_order_limit_with_alias(
12210   spider_string *str,
12211   const char *alias,
12212   uint alias_length
12213 ) {
12214   int error_num;
12215   ORDER *order;
12216   st_select_lex *select_lex;
12217   longlong select_limit;
12218   longlong offset_limit;
12219   DBUG_ENTER("spider_mbase_handler::append_key_order_for_direct_order_limit_with_alias");
12220   DBUG_PRINT("info",("spider this=%p", this));
12221 #ifdef HANDLER_HAS_DIRECT_AGGREGATE
12222   if (spider->result_list.direct_aggregate)
12223   {
12224     if ((error_num = append_group_by(str, alias, alias_length)))
12225       DBUG_RETURN(error_num);
12226   }
12227 #endif
12228   spider_get_select_limit(spider, &select_lex, &select_limit,
12229     &offset_limit);
12230   if (select_lex->order_list.first)
12231   {
12232     if (str->reserve(SPIDER_SQL_ORDER_LEN))
12233       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12234     str->q_append(SPIDER_SQL_ORDER_STR, SPIDER_SQL_ORDER_LEN);
12235     for (order = (ORDER *) select_lex->order_list.first; order;
12236       order = order->next)
12237     {
12238       if ((error_num =
12239         spider_db_print_item_type((*order->item), NULL, spider, str, alias,
12240           alias_length, dbton_id, FALSE, NULL)))
12241       {
12242         DBUG_PRINT("info",("spider error=%d", error_num));
12243         DBUG_RETURN(error_num);
12244       }
12245       if (SPIDER_order_direction_is_asc(order))
12246       {
12247         if (str->reserve(SPIDER_SQL_COMMA_LEN))
12248           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12249         str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
12250       } else {
12251         if (str->reserve(SPIDER_SQL_DESC_LEN + SPIDER_SQL_COMMA_LEN))
12252           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12253         str->q_append(SPIDER_SQL_DESC_STR, SPIDER_SQL_DESC_LEN);
12254         str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
12255       }
12256     }
12257     str->length(str->length() - SPIDER_SQL_COMMA_LEN);
12258   }
12259   limit_pos = str->length();
12260   DBUG_RETURN(0);
12261 }
12262 
append_key_order_with_alias_part(const char * alias,uint alias_length,ulong sql_type)12263 int spider_mbase_handler::append_key_order_with_alias_part(
12264   const char *alias,
12265   uint alias_length,
12266   ulong sql_type
12267 ) {
12268   int error_num;
12269   spider_string *str;
12270   DBUG_ENTER("spider_mbase_handler::append_key_order_with_alias_part");
12271   DBUG_PRINT("info",("spider this=%p", this));
12272   switch (sql_type)
12273   {
12274     case SPIDER_SQL_TYPE_SELECT_SQL:
12275     case SPIDER_SQL_TYPE_TMP_SQL:
12276       str = &sql;
12277       break;
12278     case SPIDER_SQL_TYPE_INSERT_SQL:
12279     case SPIDER_SQL_TYPE_UPDATE_SQL:
12280     case SPIDER_SQL_TYPE_DELETE_SQL:
12281     case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
12282       str = &update_sql;
12283       break;
12284     case SPIDER_SQL_TYPE_HANDLER:
12285       str = &ha_sql;
12286       error_num = append_key_order_for_handler(str, alias, alias_length);
12287       DBUG_RETURN(error_num);
12288     default:
12289       DBUG_RETURN(0);
12290   }
12291   error_num = append_key_order_with_alias(str, alias, alias_length);
12292   DBUG_RETURN(error_num);
12293 }
12294 
append_key_order_for_handler(spider_string * str,const char * alias,uint alias_length)12295 int spider_mbase_handler::append_key_order_for_handler(
12296   spider_string *str,
12297   const char *alias,
12298   uint alias_length
12299 ) {
12300   DBUG_ENTER("spider_mbase_handler::append_key_order_for_handler");
12301   DBUG_PRINT("info",("spider this=%p", this));
12302   DBUG_PRINT("info",("spider ha_next_pos=%d", ha_next_pos));
12303   DBUG_PRINT("info",("spider ha_where_pos=%d", ha_where_pos));
12304   str->q_append(alias, alias_length);
12305   memset((char *) str->ptr() + str->length(), ' ',
12306     ha_where_pos - ha_next_pos - alias_length);
12307   DBUG_RETURN(0);
12308 }
12309 
append_key_order_with_alias(spider_string * str,const char * alias,uint alias_length)12310 int spider_mbase_handler::append_key_order_with_alias(
12311   spider_string *str,
12312   const char *alias,
12313   uint alias_length
12314 ) {
12315   SPIDER_RESULT_LIST *result_list = &spider->result_list;
12316   KEY *key_info = result_list->key_info;
12317   int length;
12318   KEY_PART_INFO *key_part;
12319   Field *field;
12320   uint key_name_length;
12321   DBUG_ENTER("spider_mbase_handler::append_key_order_with_alias");
12322   DBUG_PRINT("info",("spider this=%p", this));
12323 #ifdef HANDLER_HAS_DIRECT_AGGREGATE
12324   if (spider->result_list.direct_aggregate)
12325   {
12326     int error_num;
12327     if ((error_num = append_group_by(str, alias, alias_length)))
12328       DBUG_RETURN(error_num);
12329   }
12330 #endif
12331   if (result_list->sorted == TRUE)
12332   {
12333     if (result_list->desc_flg == TRUE)
12334     {
12335       for (
12336         key_part = key_info->key_part + result_list->key_order,
12337         length = 1;
12338         length + result_list->key_order <
12339           (int) spider_user_defined_key_parts(key_info) &&
12340         length < result_list->max_order;
12341         key_part++,
12342         length++
12343       ) {
12344         field = key_part->field;
12345         key_name_length =
12346           mysql_share->column_name_str[field->field_index].length();
12347         if (length == 1)
12348         {
12349           if (str->reserve(SPIDER_SQL_ORDER_LEN))
12350             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12351           str->q_append(SPIDER_SQL_ORDER_STR, SPIDER_SQL_ORDER_LEN);
12352         }
12353         if (key_part->key_part_flag & HA_REVERSE_SORT)
12354         {
12355           if (str->reserve(alias_length + key_name_length +
12356             /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
12357             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12358           str->q_append(alias, alias_length);
12359           mysql_share->append_column_name(str, field->field_index);
12360           str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
12361         } else {
12362           if (str->reserve(alias_length + key_name_length +
12363             /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
12364             SPIDER_SQL_DESC_LEN + SPIDER_SQL_COMMA_LEN))
12365             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12366           str->q_append(alias, alias_length);
12367           mysql_share->append_column_name(str, field->field_index);
12368           str->q_append(SPIDER_SQL_DESC_STR, SPIDER_SQL_DESC_LEN);
12369           str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
12370         }
12371       }
12372       if (
12373         length + result_list->key_order <=
12374           (int) spider_user_defined_key_parts(key_info) &&
12375         length <= result_list->max_order
12376       ) {
12377         field = key_part->field;
12378         key_name_length =
12379           mysql_share->column_name_str[field->field_index].length();
12380         if (length == 1)
12381         {
12382           if (str->reserve(SPIDER_SQL_ORDER_LEN))
12383             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12384           str->q_append(SPIDER_SQL_ORDER_STR, SPIDER_SQL_ORDER_LEN);
12385         }
12386         if (key_part->key_part_flag & HA_REVERSE_SORT)
12387         {
12388           if (str->reserve(alias_length + key_name_length +
12389             /* SPIDER_SQL_NAME_QUOTE_LEN */ 2))
12390             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12391           str->q_append(alias, alias_length);
12392           mysql_share->append_column_name(str, field->field_index);
12393         } else {
12394           if (str->reserve(alias_length + key_name_length +
12395             /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_DESC_LEN))
12396             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12397           str->q_append(alias, alias_length);
12398           mysql_share->append_column_name(str, field->field_index);
12399           str->q_append(SPIDER_SQL_DESC_STR, SPIDER_SQL_DESC_LEN);
12400         }
12401       }
12402     } else {
12403       for (
12404         key_part = key_info->key_part + result_list->key_order,
12405         length = 1;
12406         length + result_list->key_order <
12407           (int) spider_user_defined_key_parts(key_info) &&
12408         length < result_list->max_order;
12409         key_part++,
12410         length++
12411       ) {
12412         field = key_part->field;
12413         key_name_length =
12414           mysql_share->column_name_str[field->field_index].length();
12415         if (length == 1)
12416         {
12417           if (str->reserve(SPIDER_SQL_ORDER_LEN))
12418             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12419           str->q_append(SPIDER_SQL_ORDER_STR, SPIDER_SQL_ORDER_LEN);
12420         }
12421         if (key_part->key_part_flag & HA_REVERSE_SORT)
12422         {
12423           if (str->reserve(alias_length + key_name_length +
12424             /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
12425             SPIDER_SQL_DESC_LEN + SPIDER_SQL_COMMA_LEN))
12426             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12427           str->q_append(alias, alias_length);
12428           mysql_share->append_column_name(str, field->field_index);
12429           str->q_append(SPIDER_SQL_DESC_STR, SPIDER_SQL_DESC_LEN);
12430           str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
12431         } else {
12432           if (str->reserve(alias_length + key_name_length +
12433             /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
12434             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12435           str->q_append(alias, alias_length);
12436           mysql_share->append_column_name(str, field->field_index);
12437           str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
12438         }
12439       }
12440       if (
12441         length + result_list->key_order <=
12442           (int) spider_user_defined_key_parts(key_info) &&
12443         length <= result_list->max_order
12444       ) {
12445         field = key_part->field;
12446         key_name_length =
12447           mysql_share->column_name_str[field->field_index].length();
12448         if (length == 1)
12449         {
12450           if (str->reserve(SPIDER_SQL_ORDER_LEN))
12451             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12452           str->q_append(SPIDER_SQL_ORDER_STR, SPIDER_SQL_ORDER_LEN);
12453         }
12454         if (key_part->key_part_flag & HA_REVERSE_SORT)
12455         {
12456           if (str->reserve(alias_length + key_name_length +
12457             /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_DESC_LEN))
12458             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12459           str->q_append(alias, alias_length);
12460           mysql_share->append_column_name(str, field->field_index);
12461           str->q_append(SPIDER_SQL_DESC_STR, SPIDER_SQL_DESC_LEN);
12462         } else {
12463           if (str->reserve(alias_length + key_name_length +
12464             /* SPIDER_SQL_NAME_QUOTE_LEN */ 2))
12465             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12466           str->q_append(alias, alias_length);
12467           mysql_share->append_column_name(str, field->field_index);
12468         }
12469       }
12470     }
12471   }
12472   limit_pos = str->length();
12473   DBUG_RETURN(0);
12474 }
12475 
append_limit_part(longlong offset,longlong limit,ulong sql_type)12476 int spider_mbase_handler::append_limit_part(
12477   longlong offset,
12478   longlong limit,
12479   ulong sql_type
12480 ) {
12481   int error_num;
12482   spider_string *str;
12483   DBUG_ENTER("spider_mbase_handler::append_limit_part");
12484   DBUG_PRINT("info",("spider this=%p", this));
12485   switch (sql_type)
12486   {
12487     case SPIDER_SQL_TYPE_SELECT_SQL:
12488       str = &sql;
12489       limit_pos = str->length();
12490       break;
12491     case SPIDER_SQL_TYPE_TMP_SQL:
12492       str = &tmp_sql;
12493       limit_pos = str->length();
12494       break;
12495     case SPIDER_SQL_TYPE_INSERT_SQL:
12496     case SPIDER_SQL_TYPE_UPDATE_SQL:
12497     case SPIDER_SQL_TYPE_DELETE_SQL:
12498     case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
12499       str = &update_sql;
12500       limit_pos = str->length();
12501       break;
12502     case SPIDER_SQL_TYPE_HANDLER:
12503       str = &ha_sql;
12504       ha_limit_pos = str->length();
12505       break;
12506     default:
12507       DBUG_RETURN(0);
12508   }
12509   error_num = append_limit(str, offset, limit);
12510   DBUG_RETURN(error_num);
12511 }
12512 
reappend_limit_part(longlong offset,longlong limit,ulong sql_type)12513 int spider_mbase_handler::reappend_limit_part(
12514   longlong offset,
12515   longlong limit,
12516   ulong sql_type
12517 ) {
12518   int error_num;
12519   spider_string *str;
12520   DBUG_ENTER("spider_mbase_handler::reappend_limit_part");
12521   DBUG_PRINT("info",("spider this=%p", this));
12522   switch (sql_type)
12523   {
12524     case SPIDER_SQL_TYPE_SELECT_SQL:
12525       str = &sql;
12526       str->length(limit_pos);
12527       break;
12528     case SPIDER_SQL_TYPE_TMP_SQL:
12529       str = &tmp_sql;
12530       str->length(limit_pos);
12531       break;
12532     case SPIDER_SQL_TYPE_INSERT_SQL:
12533     case SPIDER_SQL_TYPE_UPDATE_SQL:
12534     case SPIDER_SQL_TYPE_DELETE_SQL:
12535     case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
12536       str = &update_sql;
12537       str->length(limit_pos);
12538       break;
12539     case SPIDER_SQL_TYPE_HANDLER:
12540       str = &ha_sql;
12541       str->length(ha_limit_pos);
12542       break;
12543     default:
12544       DBUG_RETURN(0);
12545   }
12546   error_num = append_limit(str, offset, limit);
12547   DBUG_RETURN(error_num);
12548 }
12549 
append_limit(spider_string * str,longlong offset,longlong limit)12550 int spider_mbase_handler::append_limit(
12551   spider_string *str,
12552   longlong offset,
12553   longlong limit
12554 ) {
12555   char buf[SPIDER_LONGLONG_LEN + 1];
12556   uint32 length;
12557   DBUG_ENTER("spider_mbase_handler::append_limit");
12558   DBUG_PRINT("info",("spider this=%p", this));
12559   DBUG_PRINT("info", ("spider offset=%lld", offset));
12560   DBUG_PRINT("info", ("spider limit=%lld", limit));
12561   if (offset || limit < 9223372036854775807LL)
12562   {
12563     if (str->reserve(SPIDER_SQL_LIMIT_LEN + SPIDER_SQL_COMMA_LEN +
12564       ((SPIDER_LONGLONG_LEN) * 2)))
12565       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12566     str->q_append(SPIDER_SQL_LIMIT_STR, SPIDER_SQL_LIMIT_LEN);
12567     if (offset)
12568     {
12569       length = (uint32) (my_charset_bin.longlong10_to_str)(
12570         buf, SPIDER_LONGLONG_LEN + 1, -10, offset);
12571       str->q_append(buf, length);
12572       str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
12573     }
12574     length = (uint32) (my_charset_bin.longlong10_to_str)(
12575       buf, SPIDER_LONGLONG_LEN + 1, -10, limit);
12576     str->q_append(buf, length);
12577   }
12578   DBUG_RETURN(0);
12579 }
12580 
append_select_lock_part(ulong sql_type)12581 int spider_mbase_handler::append_select_lock_part(
12582   ulong sql_type
12583 ) {
12584   int error_num;
12585   spider_string *str;
12586   DBUG_ENTER("spider_mbase_handler::append_select_lock_part");
12587   DBUG_PRINT("info",("spider this=%p", this));
12588   switch (sql_type)
12589   {
12590     case SPIDER_SQL_TYPE_SELECT_SQL:
12591       str = &sql;
12592       break;
12593     default:
12594       DBUG_RETURN(0);
12595   }
12596   error_num = append_select_lock(str);
12597   DBUG_RETURN(error_num);
12598 }
12599 
append_select_lock(spider_string * str)12600 int spider_mbase_handler::append_select_lock(
12601   spider_string *str
12602 ) {
12603   int lock_mode = spider_conn_lock_mode(spider);
12604   DBUG_ENTER("spider_mbase_handler::append_select_lock");
12605   DBUG_PRINT("info",("spider this=%p", this));
12606   if (lock_mode == SPIDER_LOCK_MODE_EXCLUSIVE)
12607   {
12608     if (str->reserve(SPIDER_SQL_FOR_UPDATE_LEN))
12609       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12610     str->q_append(SPIDER_SQL_FOR_UPDATE_STR, SPIDER_SQL_FOR_UPDATE_LEN);
12611   } else if (lock_mode == SPIDER_LOCK_MODE_SHARED)
12612   {
12613     if (str->reserve(SPIDER_SQL_SHARED_LOCK_LEN))
12614       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12615     str->q_append(SPIDER_SQL_SHARED_LOCK_STR, SPIDER_SQL_SHARED_LOCK_LEN);
12616   }
12617   DBUG_RETURN(0);
12618 }
12619 
append_union_all_start_part(ulong sql_type)12620 int spider_mbase_handler::append_union_all_start_part(
12621   ulong sql_type
12622 ) {
12623   int error_num;
12624   spider_string *str;
12625   DBUG_ENTER("spider_mbase_handler::append_union_all_start_part");
12626   DBUG_PRINT("info",("spider this=%p", this));
12627   switch (sql_type)
12628   {
12629     case SPIDER_SQL_TYPE_SELECT_SQL:
12630       str = &sql;
12631       break;
12632     default:
12633       DBUG_RETURN(0);
12634   }
12635   error_num = append_union_all_start(str);
12636   DBUG_RETURN(error_num);
12637 }
12638 
append_union_all_start(spider_string * str)12639 int spider_mbase_handler::append_union_all_start(
12640   spider_string *str
12641 ) {
12642   DBUG_ENTER("spider_mbase_handler::append_union_all_start");
12643   DBUG_PRINT("info",("spider this=%p", this));
12644   if (str->reserve(SPIDER_SQL_OPEN_PAREN_LEN))
12645     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12646   str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
12647   DBUG_RETURN(0);
12648 }
12649 
append_union_all_part(ulong sql_type)12650 int spider_mbase_handler::append_union_all_part(
12651   ulong sql_type
12652 ) {
12653   int error_num;
12654   spider_string *str;
12655   DBUG_ENTER("spider_mbase_handler::append_union_all_part");
12656   DBUG_PRINT("info",("spider this=%p", this));
12657   switch (sql_type)
12658   {
12659     case SPIDER_SQL_TYPE_SELECT_SQL:
12660       str = &sql;
12661       break;
12662     default:
12663       DBUG_RETURN(0);
12664   }
12665   error_num = append_union_all(str);
12666   DBUG_RETURN(error_num);
12667 }
12668 
append_union_all(spider_string * str)12669 int spider_mbase_handler::append_union_all(
12670   spider_string *str
12671 ) {
12672   DBUG_ENTER("spider_mbase_handler::append_union_all");
12673   DBUG_PRINT("info",("spider this=%p", this));
12674   if (str->reserve(SPIDER_SQL_UNION_ALL_LEN))
12675     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12676   str->q_append(SPIDER_SQL_UNION_ALL_STR, SPIDER_SQL_UNION_ALL_LEN);
12677   DBUG_RETURN(0);
12678 }
12679 
append_union_all_end_part(ulong sql_type)12680 int spider_mbase_handler::append_union_all_end_part(
12681   ulong sql_type
12682 ) {
12683   int error_num;
12684   spider_string *str;
12685   DBUG_ENTER("spider_mbase_handler::append_union_all_end_part");
12686   DBUG_PRINT("info",("spider this=%p", this));
12687   switch (sql_type)
12688   {
12689     case SPIDER_SQL_TYPE_SELECT_SQL:
12690       str = &sql;
12691       break;
12692     default:
12693       DBUG_RETURN(0);
12694   }
12695   error_num = append_union_all_end(str);
12696   DBUG_RETURN(error_num);
12697 }
12698 
append_union_all_end(spider_string * str)12699 int spider_mbase_handler::append_union_all_end(
12700   spider_string *str
12701 ) {
12702   DBUG_ENTER("spider_mbase_handler::append_union_all_end");
12703   DBUG_PRINT("info",("spider this=%p", this));
12704   str->length(str->length() -
12705     SPIDER_SQL_UNION_ALL_LEN + SPIDER_SQL_CLOSE_PAREN_LEN);
12706   DBUG_RETURN(0);
12707 }
12708 
append_multi_range_cnt_part(ulong sql_type,uint multi_range_cnt,bool with_comma)12709 int spider_mbase_handler::append_multi_range_cnt_part(
12710   ulong sql_type,
12711   uint multi_range_cnt,
12712   bool with_comma
12713 ) {
12714   int error_num;
12715   spider_string *str;
12716   DBUG_ENTER("spider_mbase_handler::append_multi_range_cnt_part");
12717   DBUG_PRINT("info",("spider this=%p", this));
12718   switch (sql_type)
12719   {
12720     case SPIDER_SQL_TYPE_SELECT_SQL:
12721       str = &sql;
12722       break;
12723     case SPIDER_SQL_TYPE_TMP_SQL:
12724       str = &tmp_sql;
12725       break;
12726     default:
12727       DBUG_RETURN(0);
12728   }
12729   error_num = append_multi_range_cnt(str, multi_range_cnt, with_comma);
12730   DBUG_RETURN(error_num);
12731 }
12732 
append_multi_range_cnt(spider_string * str,uint multi_range_cnt,bool with_comma)12733 int spider_mbase_handler::append_multi_range_cnt(
12734   spider_string *str,
12735   uint multi_range_cnt,
12736   bool with_comma
12737 ) {
12738   int range_cnt_length;
12739   char range_cnt_str[SPIDER_SQL_INT_LEN];
12740   DBUG_ENTER("spider_mbase_handler::append_multi_range_cnt");
12741   DBUG_PRINT("info",("spider this=%p", this));
12742   range_cnt_length = my_sprintf(range_cnt_str, (range_cnt_str, "%u",
12743     multi_range_cnt));
12744   if (with_comma)
12745   {
12746     if (str->reserve(range_cnt_length + SPIDER_SQL_COMMA_LEN))
12747       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12748     str->q_append(range_cnt_str, range_cnt_length);
12749     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
12750   } else {
12751     if (str->reserve(range_cnt_length))
12752       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12753     str->q_append(range_cnt_str, range_cnt_length);
12754   }
12755   DBUG_RETURN(0);
12756 }
12757 
append_multi_range_cnt_with_name_part(ulong sql_type,uint multi_range_cnt)12758 int spider_mbase_handler::append_multi_range_cnt_with_name_part(
12759   ulong sql_type,
12760   uint multi_range_cnt
12761 ) {
12762   int error_num;
12763   spider_string *str;
12764   DBUG_ENTER("spider_mbase_handler::append_multi_range_cnt_with_name_part");
12765   DBUG_PRINT("info",("spider this=%p", this));
12766   switch (sql_type)
12767   {
12768     case SPIDER_SQL_TYPE_SELECT_SQL:
12769       str = &sql;
12770       break;
12771     case SPIDER_SQL_TYPE_TMP_SQL:
12772       str = &tmp_sql;
12773       break;
12774     default:
12775       DBUG_RETURN(0);
12776   }
12777   error_num = append_multi_range_cnt_with_name(str, multi_range_cnt);
12778   DBUG_RETURN(error_num);
12779 }
12780 
append_multi_range_cnt_with_name(spider_string * str,uint multi_range_cnt)12781 int spider_mbase_handler::append_multi_range_cnt_with_name(
12782   spider_string *str,
12783   uint multi_range_cnt
12784 ) {
12785   int range_cnt_length;
12786   char range_cnt_str[SPIDER_SQL_INT_LEN];
12787   DBUG_ENTER("spider_mbase_handler::append_multi_range_cnt_with_name");
12788   DBUG_PRINT("info",("spider this=%p", this));
12789   range_cnt_length = my_sprintf(range_cnt_str, (range_cnt_str, "%u",
12790     multi_range_cnt));
12791   if (str->reserve(range_cnt_length + SPIDER_SQL_SPACE_LEN +
12792     SPIDER_SQL_ID_LEN + SPIDER_SQL_COMMA_LEN))
12793     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12794   str->q_append(range_cnt_str, range_cnt_length);
12795   str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
12796   str->q_append(SPIDER_SQL_ID_STR, SPIDER_SQL_ID_LEN);
12797   str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
12798   DBUG_RETURN(0);
12799 }
12800 
append_open_handler_part(ulong sql_type,uint handler_id,SPIDER_CONN * conn,int link_idx)12801 int spider_mbase_handler::append_open_handler_part(
12802   ulong sql_type,
12803   uint handler_id,
12804   SPIDER_CONN *conn,
12805   int link_idx
12806 ) {
12807   int error_num;
12808   spider_string *str;
12809   DBUG_ENTER("spider_mbase_handler::append_open_handler_part");
12810   DBUG_PRINT("info",("spider this=%p", this));
12811   switch (sql_type)
12812   {
12813     case SPIDER_SQL_TYPE_HANDLER:
12814       str = &ha_sql;
12815       break;
12816     default:
12817       DBUG_RETURN(0);
12818   }
12819   error_num = append_open_handler(str, handler_id, conn, link_idx);
12820   exec_ha_sql = str;
12821   DBUG_RETURN(error_num);
12822 }
12823 
append_open_handler(spider_string * str,uint handler_id,SPIDER_CONN * conn,int link_idx)12824 int spider_mbase_handler::append_open_handler(
12825   spider_string *str,
12826   uint handler_id,
12827   SPIDER_CONN *conn,
12828   int link_idx
12829 ) {
12830   int error_num;
12831   DBUG_ENTER("spider_mbase_handler::append_open_handler");
12832   DBUG_PRINT("info",("spider this=%p", this));
12833   DBUG_PRINT("info",("spider link_idx=%d", link_idx));
12834   DBUG_PRINT("info",("spider m_handler_cid=%s",
12835     spider->m_handler_cid[link_idx]));
12836   if (str->reserve(SPIDER_SQL_HANDLER_LEN))
12837   {
12838     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12839   }
12840   str->q_append(SPIDER_SQL_HANDLER_STR, SPIDER_SQL_HANDLER_LEN);
12841   if ((error_num = mysql_share->append_table_name(str,
12842       spider->conn_link_idx[link_idx])))
12843     DBUG_RETURN(error_num);
12844   if (str->reserve(SPIDER_SQL_OPEN_LEN + SPIDER_SQL_AS_LEN +
12845     SPIDER_SQL_HANDLER_CID_LEN))
12846   {
12847     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12848   }
12849   str->q_append(SPIDER_SQL_OPEN_STR, SPIDER_SQL_OPEN_LEN);
12850   str->q_append(SPIDER_SQL_AS_STR, SPIDER_SQL_AS_LEN);
12851   str->q_append(spider->m_handler_cid[link_idx], SPIDER_SQL_HANDLER_CID_LEN);
12852   DBUG_RETURN(0);
12853 }
12854 
append_close_handler_part(ulong sql_type,int link_idx)12855 int spider_mbase_handler::append_close_handler_part(
12856   ulong sql_type,
12857   int link_idx
12858 ) {
12859   int error_num;
12860   spider_string *str;
12861   DBUG_ENTER("spider_mbase_handler::append_close_handler_part");
12862   DBUG_PRINT("info",("spider this=%p", this));
12863   switch (sql_type)
12864   {
12865     case SPIDER_SQL_TYPE_HANDLER:
12866       str = &ha_sql;
12867       break;
12868     default:
12869       DBUG_RETURN(0);
12870   }
12871   error_num = append_close_handler(str, link_idx);
12872   exec_ha_sql = str;
12873   DBUG_RETURN(error_num);
12874 }
12875 
append_close_handler(spider_string * str,int link_idx)12876 int spider_mbase_handler::append_close_handler(
12877   spider_string *str,
12878   int link_idx
12879 ) {
12880   DBUG_ENTER("spider_mbase_handler::append_close_handler");
12881   DBUG_PRINT("info",("spider this=%p", this));
12882   if (str->reserve(SPIDER_SQL_HANDLER_LEN + SPIDER_SQL_CLOSE_LEN +
12883     SPIDER_SQL_HANDLER_CID_LEN))
12884     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12885   str->q_append(SPIDER_SQL_HANDLER_STR, SPIDER_SQL_HANDLER_LEN);
12886   str->q_append(spider->m_handler_cid[link_idx],
12887     SPIDER_SQL_HANDLER_CID_LEN);
12888   str->q_append(SPIDER_SQL_CLOSE_STR, SPIDER_SQL_CLOSE_LEN);
12889   DBUG_RETURN(0);
12890 }
12891 
append_insert_terminator_part(ulong sql_type)12892 int spider_mbase_handler::append_insert_terminator_part(
12893   ulong sql_type
12894 ) {
12895   int error_num;
12896   spider_string *str;
12897   DBUG_ENTER("spider_mbase_handler::append_insert_terminator_part");
12898   DBUG_PRINT("info",("spider this=%p", this));
12899   switch (sql_type)
12900   {
12901     case SPIDER_SQL_TYPE_INSERT_SQL:
12902       str = &insert_sql;
12903       break;
12904     default:
12905       DBUG_RETURN(0);
12906   }
12907   error_num = append_insert_terminator(str);
12908   DBUG_RETURN(error_num);
12909 }
12910 
append_insert_terminator(spider_string * str)12911 int spider_mbase_handler::append_insert_terminator(
12912   spider_string *str
12913 ) {
12914   DBUG_ENTER("spider_mbase_handler::append_insert_terminator");
12915   DBUG_PRINT("info",("spider this=%p", this));
12916   DBUG_PRINT("info",("spider dup_update_sql.length=%u", dup_update_sql.length()));
12917   if (
12918     spider->result_list.insert_dup_update_pushdown &&
12919     dup_update_sql.length()
12920   ) {
12921     DBUG_PRINT("info",("spider add duplicate key update"));
12922     direct_insert_kind = SPIDER_SQL_DIRECT_INSERT_KIND_DUP_UPDATE;
12923     str->length(str->length() - SPIDER_SQL_COMMA_LEN);
12924     if (str->reserve(SPIDER_SQL_DUPLICATE_KEY_UPDATE_LEN +
12925       dup_update_sql.length()))
12926     {
12927       str->length(0);
12928       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12929     }
12930     str->q_append(SPIDER_SQL_DUPLICATE_KEY_UPDATE_STR,
12931       SPIDER_SQL_DUPLICATE_KEY_UPDATE_LEN);
12932     if (str->append(dup_update_sql))
12933       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12934   } else {
12935     str->length(str->length() - SPIDER_SQL_COMMA_LEN);
12936   }
12937   DBUG_RETURN(0);
12938 }
12939 
append_insert_values_part(ulong sql_type)12940 int spider_mbase_handler::append_insert_values_part(
12941   ulong sql_type
12942 ) {
12943   int error_num;
12944   spider_string *str;
12945   DBUG_ENTER("spider_mbase_handler::append_insert_values_part");
12946   DBUG_PRINT("info",("spider this=%p", this));
12947   switch (sql_type)
12948   {
12949     case SPIDER_SQL_TYPE_INSERT_SQL:
12950       str = &insert_sql;
12951       break;
12952     default:
12953       DBUG_RETURN(0);
12954   }
12955   error_num = append_insert_values(str);
12956   DBUG_RETURN(error_num);
12957 }
12958 
append_insert_values(spider_string * str)12959 int spider_mbase_handler::append_insert_values(
12960   spider_string *str
12961 ) {
12962   SPIDER_SHARE *share = spider->share;
12963   TABLE *table = spider->get_table();
12964   Field **field;
12965   bool add_value = FALSE;
12966   DBUG_ENTER("spider_mbase_handler::append_insert_values");
12967   DBUG_PRINT("info",("spider this=%p", this));
12968   if (str->reserve(SPIDER_SQL_OPEN_PAREN_LEN))
12969   {
12970     str->length(0);
12971     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12972   }
12973   str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
12974   for (field = table->field; *field; field++)
12975   {
12976     DBUG_PRINT("info",("spider field_index=%u", (*field)->field_index));
12977     if (
12978       bitmap_is_set(table->write_set, (*field)->field_index) ||
12979       bitmap_is_set(table->read_set, (*field)->field_index)
12980     ) {
12981 #ifndef DBUG_OFF
12982       MY_BITMAP *tmp_map =
12983         dbug_tmp_use_all_columns(table, &table->read_set);
12984 #endif
12985       add_value = TRUE;
12986       DBUG_PRINT("info",("spider is_null()=%s",
12987         (*field)->is_null() ? "TRUE" : "FALSE"));
12988       DBUG_PRINT("info",("spider table->next_number_field=%p",
12989         table->next_number_field));
12990       DBUG_PRINT("info",("spider *field=%p", *field));
12991       DBUG_PRINT("info",("spider force_auto_increment=%s",
12992         (table->next_number_field && spider->force_auto_increment) ?
12993         "TRUE" : "FALSE"));
12994       if (
12995         (*field)->is_null() ||
12996         (
12997           table->next_number_field == *field &&
12998           !table->auto_increment_field_not_null &&
12999           !spider->force_auto_increment
13000         )
13001       ) {
13002         if (str->reserve(SPIDER_SQL_NULL_LEN + SPIDER_SQL_COMMA_LEN))
13003         {
13004 #ifndef DBUG_OFF
13005           dbug_tmp_restore_column_map(&table->read_set, tmp_map);
13006 #endif
13007           str->length(0);
13008           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13009         }
13010         str->q_append(SPIDER_SQL_NULL_STR, SPIDER_SQL_NULL_LEN);
13011       } else {
13012         if (
13013           spider_db_mbase_utility->
13014             append_column_value(spider, str, *field, NULL,
13015               share->access_charset) ||
13016           str->reserve(SPIDER_SQL_COMMA_LEN)
13017         ) {
13018 #ifndef DBUG_OFF
13019           dbug_tmp_restore_column_map(&table->read_set, tmp_map);
13020 #endif
13021           str->length(0);
13022           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13023         }
13024       }
13025       str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
13026 #ifndef DBUG_OFF
13027       dbug_tmp_restore_column_map(&table->read_set, tmp_map);
13028 #endif
13029     }
13030   }
13031   if (add_value)
13032     str->length(str->length() - SPIDER_SQL_COMMA_LEN);
13033   if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN + SPIDER_SQL_COMMA_LEN))
13034   {
13035     str->length(0);
13036     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13037   }
13038   str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
13039   str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
13040   DBUG_RETURN(0);
13041 }
13042 
append_into_part(ulong sql_type)13043 int spider_mbase_handler::append_into_part(
13044   ulong sql_type
13045 ) {
13046   int error_num;
13047   spider_string *str;
13048   DBUG_ENTER("spider_mbase_handler::append_into_part");
13049   DBUG_PRINT("info",("spider this=%p", this));
13050   switch (sql_type)
13051   {
13052     case SPIDER_SQL_TYPE_INSERT_SQL:
13053       str = &insert_sql;
13054       break;
13055     default:
13056       DBUG_RETURN(0);
13057   }
13058   error_num = append_into(str);
13059   DBUG_RETURN(error_num);
13060 }
13061 
append_into(spider_string * str)13062 int spider_mbase_handler::append_into(
13063   spider_string *str
13064 ) {
13065   const TABLE *table = spider->get_table();
13066   Field **field;
13067   uint field_name_length = 0;
13068   DBUG_ENTER("spider_mbase_handler::append_into");
13069   DBUG_PRINT("info",("spider this=%p", this));
13070   if (str->reserve(SPIDER_SQL_INTO_LEN + mysql_share->db_nm_max_length +
13071     SPIDER_SQL_DOT_LEN + mysql_share->table_nm_max_length +
13072     /* SPIDER_SQL_NAME_QUOTE_LEN */ 4 + SPIDER_SQL_OPEN_PAREN_LEN))
13073     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13074   str->q_append(SPIDER_SQL_INTO_STR, SPIDER_SQL_INTO_LEN);
13075   insert_table_name_pos = str->length();
13076   append_table_name_with_adjusting(str, first_link_idx,
13077     SPIDER_SQL_TYPE_INSERT_SQL);
13078   str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
13079   for (field = table->field; *field; field++)
13080   {
13081     if (
13082       bitmap_is_set(table->write_set, (*field)->field_index) ||
13083       bitmap_is_set(table->read_set, (*field)->field_index)
13084     ) {
13085       field_name_length =
13086         mysql_share->column_name_str[(*field)->field_index].length();
13087       if (str->reserve(field_name_length +
13088         /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
13089         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13090       mysql_share->append_column_name(str, (*field)->field_index);
13091       str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
13092     }
13093   }
13094   if (field_name_length)
13095     str->length(str->length() - SPIDER_SQL_COMMA_LEN);
13096   if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN + SPIDER_SQL_VALUES_LEN))
13097     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13098   str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
13099   str->q_append(SPIDER_SQL_VALUES_STR, SPIDER_SQL_VALUES_LEN);
13100   insert_pos = str->length();
13101   DBUG_RETURN(0);
13102 }
13103 
set_insert_to_pos(ulong sql_type)13104 void spider_mbase_handler::set_insert_to_pos(
13105   ulong sql_type
13106 ) {
13107   DBUG_ENTER("spider_mbase_handler::set_insert_to_pos");
13108   switch (sql_type)
13109   {
13110     case SPIDER_SQL_TYPE_INSERT_SQL:
13111       insert_sql.length(insert_pos);
13112       break;
13113     default:
13114       DBUG_ASSERT(0);
13115       break;
13116   }
13117   DBUG_VOID_RETURN;
13118 }
13119 
append_from_part(ulong sql_type,int link_idx)13120 int spider_mbase_handler::append_from_part(
13121   ulong sql_type,
13122   int link_idx
13123 ) {
13124   int error_num;
13125   spider_string *str;
13126   DBUG_ENTER("spider_mbase_handler::append_from_part");
13127   DBUG_PRINT("info",("spider this=%p", this));
13128   switch (sql_type)
13129   {
13130     case SPIDER_SQL_TYPE_HANDLER:
13131       str = &ha_sql;
13132       break;
13133     case SPIDER_SQL_TYPE_UPDATE_SQL:
13134     case SPIDER_SQL_TYPE_DELETE_SQL:
13135     case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
13136       str = &update_sql;
13137       break;
13138     default:
13139       str = &sql;
13140       break;
13141   }
13142   error_num = append_from(str, sql_type, link_idx);
13143   DBUG_RETURN(error_num);
13144 }
13145 
append_from(spider_string * str,ulong sql_type,int link_idx)13146 int spider_mbase_handler::append_from(
13147   spider_string *str,
13148   ulong sql_type,
13149   int link_idx
13150 ) {
13151   DBUG_ENTER("spider_mbase_handler::append_from");
13152   DBUG_PRINT("info",("spider this=%p", this));
13153   DBUG_PRINT("info",("spider link_idx=%d", link_idx));
13154   int error_num = 0;
13155   if (sql_type == SPIDER_SQL_TYPE_HANDLER)
13156   {
13157     ha_table_name_pos = str->length();
13158     DBUG_PRINT("info",("spider ha_table_name_pos=%u", ha_table_name_pos));
13159     ha_sql_handler_id = spider->m_handler_id[link_idx];
13160     DBUG_PRINT("info",("spider ha_sql_handler_id=%u", ha_sql_handler_id));
13161     if (str->reserve(SPIDER_SQL_HANDLER_CID_LEN))
13162       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13163     str->q_append(spider->m_handler_cid[link_idx], SPIDER_SQL_HANDLER_CID_LEN);
13164     DBUG_PRINT("info",("spider m_handler_cid=%s",
13165       spider->m_handler_cid[link_idx]));
13166   } else {
13167     if (str->reserve(SPIDER_SQL_FROM_LEN + mysql_share->db_nm_max_length +
13168       SPIDER_SQL_DOT_LEN + mysql_share->table_nm_max_length +
13169       /* SPIDER_SQL_NAME_QUOTE_LEN */ 4 + SPIDER_SQL_OPEN_PAREN_LEN))
13170       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13171     str->q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN);
13172     table_name_pos = str->length();
13173     append_table_name_with_adjusting(str, link_idx, sql_type);
13174     if(spider_param_index_hint_pushdown(spider->wide_handler->trx->thd))
13175     {
13176       if((error_num = append_index_hint(str, link_idx, sql_type)))
13177       {
13178         DBUG_RETURN(error_num);
13179       }
13180     }
13181   }
13182   DBUG_RETURN(0);
13183 }
13184 
append_flush_tables_part(ulong sql_type,int link_idx,bool lock)13185 int spider_mbase_handler::append_flush_tables_part(
13186   ulong sql_type,
13187   int link_idx,
13188   bool lock
13189 ) {
13190   int error_num;
13191   spider_string *str;
13192   DBUG_ENTER("spider_mbase_handler::append_flush_tables_part");
13193   DBUG_PRINT("info",("spider this=%p", this));
13194   switch (sql_type)
13195   {
13196     case SPIDER_SQL_TYPE_OTHER_SQL:
13197       str = &spider->result_list.sqls[link_idx];
13198       break;
13199     default:
13200       DBUG_RETURN(0);
13201   }
13202   error_num = append_flush_tables(str, link_idx, lock);
13203   DBUG_RETURN(error_num);
13204 }
13205 
append_flush_tables(spider_string * str,int link_idx,bool lock)13206 int spider_mbase_handler::append_flush_tables(
13207   spider_string *str,
13208   int link_idx,
13209   bool lock
13210 ) {
13211   DBUG_ENTER("spider_mbase_handler::append_flush_tables");
13212   DBUG_PRINT("info",("spider this=%p", this));
13213   if (lock)
13214   {
13215     if (str->reserve(SPIDER_SQL_FLUSH_TABLES_LEN +
13216       SPIDER_SQL_WITH_READ_LOCK_LEN))
13217       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13218     str->q_append(SPIDER_SQL_FLUSH_TABLES_STR, SPIDER_SQL_FLUSH_TABLES_LEN);
13219     str->q_append(SPIDER_SQL_WITH_READ_LOCK_STR,
13220       SPIDER_SQL_WITH_READ_LOCK_LEN);
13221   } else {
13222     if (str->reserve(SPIDER_SQL_FLUSH_TABLES_LEN))
13223       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13224     str->q_append(SPIDER_SQL_FLUSH_TABLES_STR, SPIDER_SQL_FLUSH_TABLES_LEN);
13225   }
13226   DBUG_RETURN(0);
13227 }
13228 
append_optimize_table_part(ulong sql_type,int link_idx)13229 int spider_mbase_handler::append_optimize_table_part(
13230   ulong sql_type,
13231   int link_idx
13232 ) {
13233   int error_num;
13234   spider_string *str;
13235   DBUG_ENTER("spider_mbase_handler::append_optimize_table_part");
13236   DBUG_PRINT("info",("spider this=%p", this));
13237   switch (sql_type)
13238   {
13239     case SPIDER_SQL_TYPE_OTHER_SQL:
13240       str = &spider->result_list.sqls[link_idx];
13241       break;
13242     default:
13243       DBUG_RETURN(0);
13244   }
13245   error_num = append_optimize_table(str, link_idx);
13246   DBUG_RETURN(error_num);
13247 }
13248 
append_optimize_table(spider_string * str,int link_idx)13249 int spider_mbase_handler::append_optimize_table(
13250   spider_string *str,
13251   int link_idx
13252 ) {
13253   SPIDER_SHARE *share = spider->share;
13254   int conn_link_idx = spider->conn_link_idx[link_idx];
13255   int local_length = spider_param_internal_optimize_local(
13256     spider->wide_handler->trx->thd,
13257     share->internal_optimize_local) * SPIDER_SQL_SQL_LOCAL_LEN;
13258   DBUG_ENTER("spider_mbase_handler::append_optimize_table");
13259   DBUG_PRINT("info",("spider this=%p", this));
13260   if (str->reserve(SPIDER_SQL_SQL_OPTIMIZE_LEN + SPIDER_SQL_SQL_TABLE_LEN +
13261     local_length +
13262     mysql_share->db_names_str[conn_link_idx].length() +
13263     SPIDER_SQL_DOT_LEN +
13264     mysql_share->table_names_str[conn_link_idx].length() +
13265     /* SPIDER_SQL_NAME_QUOTE_LEN */ 4))
13266     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13267   str->q_append(SPIDER_SQL_SQL_OPTIMIZE_STR, SPIDER_SQL_SQL_OPTIMIZE_LEN);
13268   if (local_length)
13269     str->q_append(SPIDER_SQL_SQL_LOCAL_STR, SPIDER_SQL_SQL_LOCAL_LEN);
13270   str->q_append(SPIDER_SQL_SQL_TABLE_STR, SPIDER_SQL_SQL_TABLE_LEN);
13271   mysql_share->append_table_name(str, conn_link_idx);
13272   DBUG_RETURN(0);
13273 }
13274 
append_analyze_table_part(ulong sql_type,int link_idx)13275 int spider_mbase_handler::append_analyze_table_part(
13276   ulong sql_type,
13277   int link_idx
13278 ) {
13279   int error_num;
13280   spider_string *str;
13281   DBUG_ENTER("spider_mbase_handler::append_analyze_table_part");
13282   DBUG_PRINT("info",("spider this=%p", this));
13283   switch (sql_type)
13284   {
13285     case SPIDER_SQL_TYPE_OTHER_SQL:
13286       str = &spider->result_list.sqls[link_idx];
13287       break;
13288     default:
13289       DBUG_RETURN(0);
13290   }
13291   error_num = append_analyze_table(str, link_idx);
13292   DBUG_RETURN(error_num);
13293 }
13294 
append_analyze_table(spider_string * str,int link_idx)13295 int spider_mbase_handler::append_analyze_table(
13296   spider_string *str,
13297   int link_idx
13298 ) {
13299   SPIDER_SHARE *share = spider->share;
13300   int conn_link_idx = spider->conn_link_idx[link_idx];
13301   int local_length = spider_param_internal_optimize_local(
13302     spider->wide_handler->trx->thd,
13303     share->internal_optimize_local) * SPIDER_SQL_SQL_LOCAL_LEN;
13304   DBUG_ENTER("spider_mbase_handler::append_analyze_table");
13305   DBUG_PRINT("info",("spider this=%p", this));
13306   if (str->reserve(SPIDER_SQL_SQL_ANALYZE_LEN + SPIDER_SQL_SQL_TABLE_LEN +
13307     local_length +
13308     mysql_share->db_names_str[conn_link_idx].length() +
13309     SPIDER_SQL_DOT_LEN +
13310     mysql_share->table_names_str[conn_link_idx].length() +
13311     /* SPIDER_SQL_NAME_QUOTE_LEN */ 4))
13312     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13313   str->q_append(SPIDER_SQL_SQL_ANALYZE_STR, SPIDER_SQL_SQL_ANALYZE_LEN);
13314   if (local_length)
13315     str->q_append(SPIDER_SQL_SQL_LOCAL_STR, SPIDER_SQL_SQL_LOCAL_LEN);
13316   str->q_append(SPIDER_SQL_SQL_TABLE_STR, SPIDER_SQL_SQL_TABLE_LEN);
13317   mysql_share->append_table_name(str, conn_link_idx);
13318   DBUG_RETURN(0);
13319 }
13320 
append_repair_table_part(ulong sql_type,int link_idx,HA_CHECK_OPT * check_opt)13321 int spider_mbase_handler::append_repair_table_part(
13322   ulong sql_type,
13323   int link_idx,
13324   HA_CHECK_OPT* check_opt
13325 ) {
13326   int error_num;
13327   spider_string *str;
13328   DBUG_ENTER("spider_mbase_handler::append_repair_table_part");
13329   DBUG_PRINT("info",("spider this=%p", this));
13330   switch (sql_type)
13331   {
13332     case SPIDER_SQL_TYPE_OTHER_SQL:
13333       str = &spider->result_list.sqls[link_idx];
13334       break;
13335     default:
13336       DBUG_RETURN(0);
13337   }
13338   error_num = append_repair_table(str, link_idx, check_opt);
13339   DBUG_RETURN(error_num);
13340 }
13341 
append_repair_table(spider_string * str,int link_idx,HA_CHECK_OPT * check_opt)13342 int spider_mbase_handler::append_repair_table(
13343   spider_string *str,
13344   int link_idx,
13345   HA_CHECK_OPT* check_opt
13346 ) {
13347   SPIDER_SHARE *share = spider->share;
13348   int conn_link_idx = spider->conn_link_idx[link_idx];
13349   int local_length = spider_param_internal_optimize_local(
13350     spider->wide_handler->trx->thd,
13351     share->internal_optimize_local) * SPIDER_SQL_SQL_LOCAL_LEN;
13352   DBUG_ENTER("spider_mbase_handler::append_repair_table");
13353   DBUG_PRINT("info",("spider this=%p", this));
13354   if (str->reserve(SPIDER_SQL_SQL_REPAIR_LEN + SPIDER_SQL_SQL_TABLE_LEN +
13355     local_length +
13356     mysql_share->db_names_str[conn_link_idx].length() +
13357     SPIDER_SQL_DOT_LEN +
13358     mysql_share->table_names_str[conn_link_idx].length() +
13359     /* SPIDER_SQL_NAME_QUOTE_LEN */ 4))
13360     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13361   str->q_append(SPIDER_SQL_SQL_REPAIR_STR, SPIDER_SQL_SQL_REPAIR_LEN);
13362   if (local_length)
13363     str->q_append(SPIDER_SQL_SQL_LOCAL_STR, SPIDER_SQL_SQL_LOCAL_LEN);
13364   str->q_append(SPIDER_SQL_SQL_TABLE_STR, SPIDER_SQL_SQL_TABLE_LEN);
13365   mysql_share->append_table_name(str, conn_link_idx);
13366   if (check_opt->flags & T_QUICK)
13367   {
13368     if (str->reserve(SPIDER_SQL_SQL_QUICK_LEN))
13369       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13370     str->q_append(SPIDER_SQL_SQL_QUICK_STR, SPIDER_SQL_SQL_QUICK_LEN);
13371   }
13372   if (check_opt->flags & T_EXTEND)
13373   {
13374     if (str->reserve(SPIDER_SQL_SQL_EXTENDED_LEN))
13375       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13376     str->q_append(SPIDER_SQL_SQL_EXTENDED_STR, SPIDER_SQL_SQL_EXTENDED_LEN);
13377   }
13378   if (check_opt->sql_flags & TT_USEFRM)
13379   {
13380     if (str->reserve(SPIDER_SQL_SQL_USE_FRM_LEN))
13381       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13382     str->q_append(SPIDER_SQL_SQL_USE_FRM_STR, SPIDER_SQL_SQL_USE_FRM_LEN);
13383   }
13384   DBUG_RETURN(0);
13385 }
13386 
append_check_table_part(ulong sql_type,int link_idx,HA_CHECK_OPT * check_opt)13387 int spider_mbase_handler::append_check_table_part(
13388   ulong sql_type,
13389   int link_idx,
13390   HA_CHECK_OPT* check_opt
13391 ) {
13392   int error_num;
13393   spider_string *str;
13394   DBUG_ENTER("spider_mbase_handler::append_check_table_part");
13395   DBUG_PRINT("info",("spider this=%p", this));
13396   switch (sql_type)
13397   {
13398     case SPIDER_SQL_TYPE_OTHER_SQL:
13399       str = &spider->result_list.sqls[link_idx];
13400       break;
13401     default:
13402       DBUG_RETURN(0);
13403   }
13404   error_num = append_check_table(str, link_idx, check_opt);
13405   DBUG_RETURN(error_num);
13406 }
13407 
append_check_table(spider_string * str,int link_idx,HA_CHECK_OPT * check_opt)13408 int spider_mbase_handler::append_check_table(
13409   spider_string *str,
13410   int link_idx,
13411   HA_CHECK_OPT* check_opt
13412 ) {
13413   int conn_link_idx = spider->conn_link_idx[link_idx];
13414   DBUG_ENTER("spider_mbase_handler::append_check_table");
13415   DBUG_PRINT("info",("spider this=%p", this));
13416   if (str->reserve(SPIDER_SQL_SQL_CHECK_TABLE_LEN +
13417     mysql_share->db_names_str[conn_link_idx].length() +
13418     SPIDER_SQL_DOT_LEN +
13419     mysql_share->table_names_str[conn_link_idx].length() +
13420     /* SPIDER_SQL_NAME_QUOTE_LEN */ 4))
13421     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13422   str->q_append(SPIDER_SQL_SQL_CHECK_TABLE_STR,
13423     SPIDER_SQL_SQL_CHECK_TABLE_LEN);
13424   mysql_share->append_table_name(str, conn_link_idx);
13425   if (check_opt->flags & T_QUICK)
13426   {
13427     if (str->reserve(SPIDER_SQL_SQL_QUICK_LEN))
13428       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13429     str->q_append(SPIDER_SQL_SQL_QUICK_STR, SPIDER_SQL_SQL_QUICK_LEN);
13430   }
13431   if (check_opt->flags & T_FAST)
13432   {
13433     if (str->reserve(SPIDER_SQL_SQL_FAST_LEN))
13434       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13435     str->q_append(SPIDER_SQL_SQL_FAST_STR, SPIDER_SQL_SQL_FAST_LEN);
13436   }
13437   if (check_opt->flags & T_MEDIUM)
13438   {
13439     if (str->reserve(SPIDER_SQL_SQL_MEDIUM_LEN))
13440       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13441     str->q_append(SPIDER_SQL_SQL_MEDIUM_STR, SPIDER_SQL_SQL_MEDIUM_LEN);
13442   }
13443   if (check_opt->flags & T_EXTEND)
13444   {
13445     if (str->reserve(SPIDER_SQL_SQL_EXTENDED_LEN))
13446       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13447     str->q_append(SPIDER_SQL_SQL_EXTENDED_STR, SPIDER_SQL_SQL_EXTENDED_LEN);
13448   }
13449   DBUG_RETURN(0);
13450 }
13451 
append_enable_keys_part(ulong sql_type,int link_idx)13452 int spider_mbase_handler::append_enable_keys_part(
13453   ulong sql_type,
13454   int link_idx
13455 ) {
13456   int error_num;
13457   spider_string *str;
13458   DBUG_ENTER("spider_mbase_handler::append_enable_keys_part");
13459   DBUG_PRINT("info",("spider this=%p", this));
13460   switch (sql_type)
13461   {
13462     case SPIDER_SQL_TYPE_OTHER_SQL:
13463       str = &spider->result_list.sqls[link_idx];
13464       break;
13465     default:
13466       DBUG_RETURN(0);
13467   }
13468   error_num = append_enable_keys(str, link_idx);
13469   DBUG_RETURN(error_num);
13470 }
13471 
append_enable_keys(spider_string * str,int link_idx)13472 int spider_mbase_handler::append_enable_keys(
13473   spider_string *str,
13474   int link_idx
13475 ) {
13476   int conn_link_idx = spider->conn_link_idx[link_idx];
13477   DBUG_ENTER("spider_mbase_handler::append_enable_keys");
13478   DBUG_PRINT("info",("spider this=%p", this));
13479   if (str->reserve(SPIDER_SQL_SQL_ALTER_TABLE_LEN +
13480     mysql_share->db_names_str[conn_link_idx].length() +
13481     SPIDER_SQL_DOT_LEN +
13482     mysql_share->table_names_str[conn_link_idx].length() +
13483     /* SPIDER_SQL_NAME_QUOTE_LEN */ 4 + SPIDER_SQL_SQL_ENABLE_KEYS_LEN))
13484     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13485   str->q_append(SPIDER_SQL_SQL_ALTER_TABLE_STR,
13486     SPIDER_SQL_SQL_ALTER_TABLE_LEN);
13487   mysql_share->append_table_name(str, conn_link_idx);
13488   str->q_append(SPIDER_SQL_SQL_ENABLE_KEYS_STR,
13489     SPIDER_SQL_SQL_ENABLE_KEYS_LEN);
13490   DBUG_RETURN(0);
13491 }
13492 
append_disable_keys_part(ulong sql_type,int link_idx)13493 int spider_mbase_handler::append_disable_keys_part(
13494   ulong sql_type,
13495   int link_idx
13496 ) {
13497   int error_num;
13498   spider_string *str;
13499   DBUG_ENTER("spider_mbase_handler::append_disable_keys_part");
13500   DBUG_PRINT("info",("spider this=%p", this));
13501   switch (sql_type)
13502   {
13503     case SPIDER_SQL_TYPE_OTHER_SQL:
13504       str = &spider->result_list.sqls[link_idx];
13505       break;
13506     default:
13507       DBUG_RETURN(0);
13508   }
13509   error_num = append_disable_keys(str, link_idx);
13510   DBUG_RETURN(error_num);
13511 }
13512 
append_disable_keys(spider_string * str,int link_idx)13513 int spider_mbase_handler::append_disable_keys(
13514   spider_string *str,
13515   int link_idx
13516 ) {
13517   int conn_link_idx = spider->conn_link_idx[link_idx];
13518   DBUG_ENTER("spider_mbase_handler::append_disable_keys");
13519   DBUG_PRINT("info",("spider this=%p", this));
13520   if (str->reserve(SPIDER_SQL_SQL_ALTER_TABLE_LEN +
13521     mysql_share->db_names_str[conn_link_idx].length() +
13522     SPIDER_SQL_DOT_LEN +
13523     mysql_share->table_names_str[conn_link_idx].length() +
13524     /* SPIDER_SQL_NAME_QUOTE_LEN */ 4 + SPIDER_SQL_SQL_DISABLE_KEYS_LEN))
13525     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13526   str->q_append(SPIDER_SQL_SQL_ALTER_TABLE_STR,
13527     SPIDER_SQL_SQL_ALTER_TABLE_LEN);
13528   mysql_share->append_table_name(str, conn_link_idx);
13529   str->q_append(SPIDER_SQL_SQL_DISABLE_KEYS_STR,
13530     SPIDER_SQL_SQL_DISABLE_KEYS_LEN);
13531   DBUG_RETURN(0);
13532 }
13533 
append_delete_all_rows_part(ulong sql_type)13534 int spider_mbase_handler::append_delete_all_rows_part(
13535   ulong sql_type
13536 ) {
13537   int error_num;
13538   spider_string *str;
13539   DBUG_ENTER("spider_mbase_handler::append_delete_all_rows_part");
13540   DBUG_PRINT("info",("spider this=%p", this));
13541   switch (sql_type)
13542   {
13543     case SPIDER_SQL_TYPE_DELETE_SQL:
13544       str = &update_sql;
13545       break;
13546     default:
13547       DBUG_RETURN(0);
13548   }
13549   error_num = append_delete_all_rows(str, sql_type);
13550   DBUG_RETURN(error_num);
13551 }
13552 
append_delete_all_rows(spider_string * str,ulong sql_type)13553 int spider_mbase_handler::append_delete_all_rows(
13554   spider_string *str,
13555   ulong sql_type
13556 ) {
13557   int error_num;
13558   DBUG_ENTER("spider_mbase_handler::append_delete_all_rows");
13559   DBUG_PRINT("info",("spider this=%p", this));
13560   if (spider->wide_handler->sql_command == SQLCOM_TRUNCATE)
13561   {
13562     if ((error_num = append_truncate(str, sql_type, first_link_idx)))
13563       DBUG_RETURN(error_num);
13564   } else {
13565     if (
13566       (error_num = append_delete(str)) ||
13567       (error_num = append_from(str, sql_type, first_link_idx))
13568     )
13569       DBUG_RETURN(error_num);
13570   }
13571   DBUG_RETURN(0);
13572 }
13573 
append_truncate(spider_string * str,ulong sql_type,int link_idx)13574 int spider_mbase_handler::append_truncate(
13575   spider_string *str,
13576   ulong sql_type,
13577   int link_idx
13578 ) {
13579   DBUG_ENTER("spider_mbase_handler::append_truncate");
13580   if (str->reserve(SPIDER_SQL_TRUNCATE_TABLE_LEN +
13581     mysql_share->db_nm_max_length +
13582     SPIDER_SQL_DOT_LEN + mysql_share->table_nm_max_length +
13583     /* SPIDER_SQL_NAME_QUOTE_LEN */ 4 + SPIDER_SQL_OPEN_PAREN_LEN))
13584     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13585   str->q_append(SPIDER_SQL_TRUNCATE_TABLE_STR, SPIDER_SQL_TRUNCATE_TABLE_LEN);
13586   table_name_pos = str->length();
13587   append_table_name_with_adjusting(str, link_idx, sql_type);
13588   DBUG_RETURN(0);
13589 }
13590 
append_explain_select_part(const key_range * start_key,const key_range * end_key,ulong sql_type,int link_idx)13591 int spider_mbase_handler::append_explain_select_part(
13592   const key_range *start_key,
13593   const key_range *end_key,
13594   ulong sql_type,
13595   int link_idx
13596 ) {
13597   int error_num;
13598   spider_string *str;
13599   DBUG_ENTER("spider_mbase_handler::append_explain_select_part");
13600   DBUG_PRINT("info",("spider this=%p", this));
13601   switch (sql_type)
13602   {
13603     case SPIDER_SQL_TYPE_OTHER_SQL:
13604       str = &spider->result_list.sqls[link_idx];
13605       break;
13606     default:
13607       DBUG_RETURN(0);
13608   }
13609   error_num =
13610     append_explain_select(str, start_key, end_key, sql_type, link_idx);
13611   DBUG_RETURN(error_num);
13612 }
13613 
append_explain_select(spider_string * str,const key_range * start_key,const key_range * end_key,ulong sql_type,int link_idx)13614 int spider_mbase_handler::append_explain_select(
13615   spider_string *str,
13616   const key_range *start_key,
13617   const key_range *end_key,
13618   ulong sql_type,
13619   int link_idx
13620 ) {
13621   int error_num;
13622   DBUG_ENTER("spider_mbase_handler::append_explain_select");
13623   DBUG_PRINT("info",("spider this=%p", this));
13624   if (str->reserve(SPIDER_SQL_EXPLAIN_SELECT_LEN))
13625   {
13626     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13627   }
13628   str->q_append(SPIDER_SQL_EXPLAIN_SELECT_STR, SPIDER_SQL_EXPLAIN_SELECT_LEN);
13629   if (
13630     (error_num = append_from(str, sql_type, link_idx)) ||
13631     (error_num = append_key_where(str, NULL, NULL, start_key, end_key,
13632       sql_type, FALSE))
13633   ) {
13634     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13635   }
13636   DBUG_RETURN(0);
13637 }
13638 
13639 /********************************************************************
13640  * Determine whether the current query's projection list
13641  * consists solely of the specified column.
13642  *
13643  * Params   IN      - field_index:
13644  *                    Field index of the column of interest within
13645  *                    its table.
13646  *
13647  * Returns  TRUE    - if the query's projection list consists
13648  *                    solely of the specified column.
13649  *          FALSE   - otherwise.
13650  ********************************************************************/
is_sole_projection_field(uint16 field_index)13651 bool spider_mbase_handler::is_sole_projection_field(
13652   uint16 field_index
13653 ) {
13654   // Determine whether the projection list consists solely of the field of interest
13655   bool            is_field_in_projection_list = FALSE;
13656   TABLE*          table                       = spider->get_table();
13657   uint16          projection_field_count      = 0;
13658   uint16          projection_field_index;
13659   Field**         field;
13660   DBUG_ENTER( "spider_mbase_handler::is_sole_projection_field" );
13661 
13662   for ( field = table->field; *field ; field++ )
13663   {
13664     projection_field_index = ( *field )->field_index;
13665 
13666     if ( !( minimum_select_bit_is_set( projection_field_index ) ) )
13667     {
13668       // Current field is not in the projection list
13669       continue;
13670     }
13671 
13672     projection_field_count++;
13673 
13674     if ( !is_field_in_projection_list )
13675     {
13676       if ( field_index == projection_field_index )
13677       {
13678         // Field of interest is in the projection list
13679         is_field_in_projection_list = TRUE;
13680       }
13681     }
13682 
13683     if ( is_field_in_projection_list && ( projection_field_count != 1 ) )
13684     {
13685       // Field of interest is not the sole column in the projection list
13686       DBUG_RETURN( FALSE );
13687     }
13688   }
13689 
13690   if ( is_field_in_projection_list && ( projection_field_count == 1 ) )
13691   {
13692     // Field of interest is the only column in the projection list
13693     DBUG_RETURN( TRUE );
13694   }
13695 
13696   DBUG_RETURN( FALSE );
13697 }
13698 
is_bulk_insert_exec_period(bool bulk_end)13699 bool spider_mbase_handler::is_bulk_insert_exec_period(
13700   bool bulk_end
13701 ) {
13702   DBUG_ENTER("spider_mbase_handler::is_bulk_insert_exec_period");
13703   DBUG_PRINT("info",("spider this=%p", this));
13704   DBUG_PRINT("info",("spider insert_sql.length=%u", insert_sql.length()));
13705   DBUG_PRINT("info",("spider insert_pos=%d", insert_pos));
13706   DBUG_PRINT("info",("spider insert_sql=%s", insert_sql.c_ptr_safe()));
13707   if (
13708     (bulk_end || (int) insert_sql.length() >= spider->bulk_size) &&
13709     (int) insert_sql.length() > insert_pos
13710   ) {
13711     DBUG_RETURN(TRUE);
13712   }
13713   DBUG_RETURN(FALSE);
13714 }
13715 
sql_is_filled_up(ulong sql_type)13716 bool spider_mbase_handler::sql_is_filled_up(
13717   ulong sql_type
13718 ) {
13719   DBUG_ENTER("spider_mbase_handler::sql_is_filled_up");
13720   DBUG_PRINT("info",("spider this=%p", this));
13721   DBUG_RETURN(filled_up);
13722 }
13723 
sql_is_empty(ulong sql_type)13724 bool spider_mbase_handler::sql_is_empty(
13725   ulong sql_type
13726 ) {
13727   bool is_empty;
13728   DBUG_ENTER("spider_mbase_handler::sql_is_empty");
13729   DBUG_PRINT("info",("spider this=%p", this));
13730   switch (sql_type)
13731   {
13732     case SPIDER_SQL_TYPE_SELECT_SQL:
13733       is_empty = (sql.length() == 0);
13734       break;
13735     case SPIDER_SQL_TYPE_INSERT_SQL:
13736       is_empty = (insert_sql.length() == 0);
13737       break;
13738     case SPIDER_SQL_TYPE_UPDATE_SQL:
13739     case SPIDER_SQL_TYPE_DELETE_SQL:
13740     case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
13741       is_empty = (update_sql.length() == 0);
13742       break;
13743     case SPIDER_SQL_TYPE_TMP_SQL:
13744       is_empty = (tmp_sql.length() == 0);
13745       break;
13746     case SPIDER_SQL_TYPE_HANDLER:
13747       is_empty = (ha_sql.length() == 0);
13748       break;
13749     default:
13750       is_empty = TRUE;
13751       break;
13752   }
13753   DBUG_RETURN(is_empty);
13754 }
13755 
support_multi_split_read()13756 bool spider_mbase_handler::support_multi_split_read()
13757 {
13758   DBUG_ENTER("spider_mbase_handler::support_multi_split_read");
13759   DBUG_PRINT("info",("spider this=%p", this));
13760   DBUG_RETURN(TRUE);
13761 }
13762 
support_bulk_update()13763 bool spider_mbase_handler::support_bulk_update()
13764 {
13765   DBUG_ENTER("spider_mbase_handler::support_bulk_update");
13766   DBUG_PRINT("info",("spider this=%p", this));
13767   DBUG_RETURN(TRUE);
13768 }
13769 
bulk_tmp_table_insert()13770 int spider_mbase_handler::bulk_tmp_table_insert()
13771 {
13772   int error_num;
13773   DBUG_ENTER("spider_mbase_handler::bulk_tmp_table_insert");
13774   DBUG_PRINT("info",("spider this=%p", this));
13775   error_num = store_sql_to_bulk_tmp_table(&update_sql, upd_tmp_tbl);
13776   DBUG_RETURN(error_num);
13777 }
13778 
bulk_tmp_table_insert(int link_idx)13779 int spider_mbase_handler::bulk_tmp_table_insert(
13780   int link_idx
13781 ) {
13782   int error_num;
13783   DBUG_ENTER("spider_mbase_handler::bulk_tmp_table_insert");
13784   DBUG_PRINT("info",("spider this=%p", this));
13785   error_num = store_sql_to_bulk_tmp_table(
13786     &spider->result_list.update_sqls[link_idx],
13787     spider->result_list.upd_tmp_tbls[link_idx]);
13788   DBUG_RETURN(error_num);
13789 }
13790 
bulk_tmp_table_end_bulk_insert()13791 int spider_mbase_handler::bulk_tmp_table_end_bulk_insert()
13792 {
13793   int error_num;
13794   DBUG_ENTER("spider_mbase_handler::bulk_tmp_table_end_bulk_insert");
13795   DBUG_PRINT("info",("spider this=%p", this));
13796   if ((error_num = upd_tmp_tbl->file->ha_end_bulk_insert()))
13797   {
13798     DBUG_RETURN(error_num);
13799   }
13800   DBUG_RETURN(0);
13801 }
13802 
bulk_tmp_table_rnd_init()13803 int spider_mbase_handler::bulk_tmp_table_rnd_init()
13804 {
13805   int error_num;
13806   DBUG_ENTER("spider_mbase_handler::bulk_tmp_table_rnd_init");
13807   DBUG_PRINT("info",("spider this=%p", this));
13808   upd_tmp_tbl->file->extra(HA_EXTRA_CACHE);
13809   if ((error_num = upd_tmp_tbl->file->ha_rnd_init(TRUE)))
13810   {
13811     DBUG_RETURN(error_num);
13812   }
13813   reading_from_bulk_tmp_table = TRUE;
13814   DBUG_RETURN(0);
13815 }
13816 
bulk_tmp_table_rnd_next()13817 int spider_mbase_handler::bulk_tmp_table_rnd_next()
13818 {
13819   int error_num;
13820   DBUG_ENTER("spider_mbase_handler::bulk_tmp_table_rnd_next");
13821   DBUG_PRINT("info",("spider this=%p", this));
13822 #if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 50200
13823   error_num = upd_tmp_tbl->file->ha_rnd_next(upd_tmp_tbl->record[0]);
13824 #else
13825   error_num = upd_tmp_tbl->file->rnd_next(upd_tmp_tbl->record[0]);
13826 #endif
13827   if (!error_num)
13828   {
13829     error_num = restore_sql_from_bulk_tmp_table(&insert_sql, upd_tmp_tbl);
13830   }
13831   DBUG_RETURN(error_num);
13832 }
13833 
bulk_tmp_table_rnd_end()13834 int spider_mbase_handler::bulk_tmp_table_rnd_end()
13835 {
13836   int error_num;
13837   DBUG_ENTER("spider_mbase_handler::bulk_tmp_table_rnd_end");
13838   DBUG_PRINT("info",("spider this=%p", this));
13839   reading_from_bulk_tmp_table = FALSE;
13840   if ((error_num = upd_tmp_tbl->file->ha_rnd_end()))
13841   {
13842     DBUG_RETURN(error_num);
13843   }
13844   DBUG_RETURN(0);
13845 }
13846 
need_copy_for_update(int link_idx)13847 bool spider_mbase_handler::need_copy_for_update(
13848   int link_idx
13849 ) {
13850   int all_link_idx = spider->conn_link_idx[link_idx];
13851   DBUG_ENTER("spider_mbase_handler::need_copy_for_update");
13852   DBUG_PRINT("info",("spider this=%p", this));
13853   DBUG_RETURN(!mysql_share->same_db_table_name ||
13854     spider->share->link_statuses[all_link_idx] == SPIDER_LINK_STATUS_RECOVERY);
13855 }
13856 
bulk_tmp_table_created()13857 bool spider_mbase_handler::bulk_tmp_table_created()
13858 {
13859   DBUG_ENTER("spider_mbase_handler::bulk_tmp_table_created");
13860   DBUG_PRINT("info",("spider this=%p", this));
13861   DBUG_RETURN(upd_tmp_tbl);
13862 }
13863 
mk_bulk_tmp_table_and_bulk_start()13864 int spider_mbase_handler::mk_bulk_tmp_table_and_bulk_start()
13865 {
13866   THD *thd = spider->wide_handler->trx->thd;
13867   TABLE *table = spider->get_table();
13868   DBUG_ENTER("spider_mbase_handler::mk_bulk_tmp_table_and_bulk_start");
13869   DBUG_PRINT("info",("spider this=%p", this));
13870   if (!upd_tmp_tbl)
13871   {
13872 #ifdef SPIDER_use_LEX_CSTRING_for_Field_blob_constructor
13873     LEX_CSTRING field_name = {STRING_WITH_LEN("a")};
13874     if (!(upd_tmp_tbl = spider_mk_sys_tmp_table(
13875       thd, table, &upd_tmp_tbl_prm, &field_name, update_sql.charset())))
13876 #else
13877     if (!(upd_tmp_tbl = spider_mk_sys_tmp_table(
13878       thd, table, &upd_tmp_tbl_prm, "a", update_sql.charset())))
13879 #endif
13880     {
13881       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13882     }
13883     upd_tmp_tbl->file->extra(HA_EXTRA_WRITE_CACHE);
13884     upd_tmp_tbl->file->ha_start_bulk_insert((ha_rows) 0);
13885   }
13886   DBUG_RETURN(0);
13887 }
13888 
rm_bulk_tmp_table()13889 void spider_mbase_handler::rm_bulk_tmp_table()
13890 {
13891   DBUG_ENTER("spider_mbase_handler::rm_bulk_tmp_table");
13892   DBUG_PRINT("info",("spider this=%p", this));
13893   if (upd_tmp_tbl)
13894   {
13895     spider_rm_sys_tmp_table(spider->wide_handler->trx->thd, upd_tmp_tbl,
13896       &upd_tmp_tbl_prm);
13897     upd_tmp_tbl = NULL;
13898   }
13899   DBUG_VOID_RETURN;
13900 }
13901 
store_sql_to_bulk_tmp_table(spider_string * str,TABLE * tmp_table)13902 int spider_mbase_handler::store_sql_to_bulk_tmp_table(
13903   spider_string *str,
13904   TABLE *tmp_table
13905 ) {
13906   int error_num;
13907   DBUG_ENTER("spider_mbase_handler::store_sql_to_bulk_tmp_table");
13908   DBUG_PRINT("info",("spider this=%p", this));
13909   tmp_table->field[0]->set_notnull();
13910   tmp_table->field[0]->store(str->ptr(), str->length(), str->charset());
13911   if ((error_num = tmp_table->file->ha_write_row(tmp_table->record[0])))
13912     DBUG_RETURN(error_num);
13913   DBUG_RETURN(0);
13914 }
13915 
restore_sql_from_bulk_tmp_table(spider_string * str,TABLE * tmp_table)13916 int spider_mbase_handler::restore_sql_from_bulk_tmp_table(
13917   spider_string *str,
13918   TABLE *tmp_table
13919 ) {
13920   DBUG_ENTER("spider_mbase_handler::restore_sql_from_bulk_tmp_table");
13921   DBUG_PRINT("info",("spider this=%p", this));
13922   tmp_table->field[0]->val_str(str->get_str());
13923   str->mem_calc();
13924   DBUG_RETURN(0);
13925 }
13926 
insert_lock_tables_list(SPIDER_CONN * conn,int link_idx)13927 int spider_mbase_handler::insert_lock_tables_list(
13928   SPIDER_CONN *conn,
13929   int link_idx
13930 ) {
13931   spider_db_mbase *db_conn = (spider_db_mbase *) conn->db_conn;
13932   SPIDER_LINK_FOR_HASH *tmp_link_for_hash2 = &link_for_hash[link_idx];
13933   DBUG_ENTER("spider_mbase_handler::insert_lock_tables_list");
13934   DBUG_PRINT("info",("spider this=%p", this));
13935   uint old_elements =
13936     db_conn->lock_table_hash.array.max_element;
13937 #ifdef HASH_UPDATE_WITH_HASH_VALUE
13938   if (my_hash_insert_with_hash_value(
13939     &db_conn->lock_table_hash,
13940     tmp_link_for_hash2->db_table_str_hash_value,
13941     (uchar*) tmp_link_for_hash2))
13942 #else
13943   if (my_hash_insert(&db_conn->lock_table_hash,
13944     (uchar*) tmp_link_for_hash2))
13945 #endif
13946   {
13947     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13948   }
13949   if (db_conn->lock_table_hash.array.max_element > old_elements)
13950   {
13951     spider_alloc_calc_mem(spider_current_trx,
13952       db_conn->lock_table_hash,
13953       (db_conn->lock_table_hash.array.max_element - old_elements) *
13954       db_conn->lock_table_hash.array.size_of_element);
13955   }
13956   DBUG_RETURN(0);
13957 }
13958 
append_lock_tables_list(SPIDER_CONN * conn,int link_idx,int * appended)13959 int spider_mbase_handler::append_lock_tables_list(
13960   SPIDER_CONN *conn,
13961   int link_idx,
13962   int *appended
13963 ) {
13964   int error_num;
13965   SPIDER_LINK_FOR_HASH *tmp_link_for_hash, *tmp_link_for_hash2;
13966   int conn_link_idx = spider->conn_link_idx[link_idx];
13967   spider_db_mbase *db_conn = (spider_db_mbase *) conn->db_conn;
13968   DBUG_ENTER("spider_mbase_handler::append_lock_tables_list");
13969   DBUG_PRINT("info",("spider this=%p", this));
13970   DBUG_PRINT("info",("spider db_conn=%p", db_conn));
13971   tmp_link_for_hash2 = &link_for_hash[link_idx];
13972   tmp_link_for_hash2->db_table_str =
13973     &mysql_share->db_table_str[conn_link_idx];
13974   DBUG_PRINT("info",("spider db_table_str=%s",
13975     tmp_link_for_hash2->db_table_str->c_ptr_safe()));
13976 #ifdef SPIDER_HAS_HASH_VALUE_TYPE
13977   tmp_link_for_hash2->db_table_str_hash_value =
13978     mysql_share->db_table_str_hash_value[conn_link_idx];
13979   if (!(tmp_link_for_hash = (SPIDER_LINK_FOR_HASH *)
13980     my_hash_search_using_hash_value(
13981       &db_conn->lock_table_hash,
13982       tmp_link_for_hash2->db_table_str_hash_value,
13983       (uchar*) tmp_link_for_hash2->db_table_str->ptr(),
13984       tmp_link_for_hash2->db_table_str->length())))
13985 #else
13986   if (!(tmp_link_for_hash = (SPIDER_LINK_FOR_HASH *) my_hash_search(
13987     &db_conn->lock_table_hash,
13988     (uchar*) tmp_link_for_hash2->db_table_str->ptr(),
13989     tmp_link_for_hash2->db_table_str->length())))
13990 #endif
13991   {
13992     if ((error_num = insert_lock_tables_list(conn, link_idx)))
13993       DBUG_RETURN(error_num);
13994     *appended = 1;
13995   } else {
13996     if (tmp_link_for_hash->spider->wide_handler->lock_type <
13997       spider->wide_handler->lock_type)
13998     {
13999 #ifdef HASH_UPDATE_WITH_HASH_VALUE
14000       my_hash_delete_with_hash_value(
14001         &db_conn->lock_table_hash,
14002         tmp_link_for_hash->db_table_str_hash_value,
14003         (uchar*) tmp_link_for_hash);
14004 #else
14005       my_hash_delete(&db_conn->lock_table_hash,
14006         (uchar*) tmp_link_for_hash);
14007 #endif
14008       uint old_elements =
14009         db_conn->lock_table_hash.array.max_element;
14010 #ifdef HASH_UPDATE_WITH_HASH_VALUE
14011       if (my_hash_insert_with_hash_value(
14012         &db_conn->lock_table_hash,
14013         tmp_link_for_hash2->db_table_str_hash_value,
14014         (uchar*) tmp_link_for_hash2))
14015 #else
14016       if (my_hash_insert(&db_conn->lock_table_hash,
14017         (uchar*) tmp_link_for_hash2))
14018 #endif
14019       {
14020         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
14021       }
14022       if (db_conn->lock_table_hash.array.max_element > old_elements)
14023       {
14024         spider_alloc_calc_mem(spider_current_trx,
14025           db_conn->lock_table_hash,
14026           (db_conn->lock_table_hash.array.max_element - old_elements) *
14027           db_conn->lock_table_hash.array.size_of_element);
14028       }
14029     }
14030   }
14031   DBUG_RETURN(0);
14032 }
14033 
realloc_sql(ulong * realloced)14034 int spider_mbase_handler::realloc_sql(
14035   ulong *realloced
14036 ) {
14037   THD *thd = spider->wide_handler->trx->thd;
14038   st_spider_share *share = spider->share;
14039   int init_sql_alloc_size =
14040     spider_param_init_sql_alloc_size(thd, share->init_sql_alloc_size);
14041   DBUG_ENTER("spider_mbase_handler::realloc_sql");
14042   DBUG_PRINT("info",("spider this=%p", this));
14043   if ((int) sql.alloced_length() > init_sql_alloc_size * 2)
14044   {
14045     sql.free();
14046     if (sql.real_alloc(init_sql_alloc_size))
14047       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
14048     *realloced |= SPIDER_SQL_TYPE_SELECT_SQL;
14049   }
14050   if ((int) ha_sql.alloced_length() > init_sql_alloc_size * 2)
14051   {
14052     ha_sql.free();
14053     if (ha_sql.real_alloc(init_sql_alloc_size))
14054       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
14055     *realloced |= SPIDER_SQL_TYPE_SELECT_SQL;
14056   }
14057   if ((int) dup_update_sql.alloced_length() > init_sql_alloc_size * 2)
14058   {
14059     dup_update_sql.free();
14060     if (dup_update_sql.real_alloc(init_sql_alloc_size))
14061       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
14062   }
14063   if ((int) insert_sql.alloced_length() > init_sql_alloc_size * 2)
14064   {
14065     insert_sql.free();
14066     if (insert_sql.real_alloc(init_sql_alloc_size))
14067       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
14068     *realloced |= SPIDER_SQL_TYPE_INSERT_SQL;
14069   }
14070   if ((int) update_sql.alloced_length() > init_sql_alloc_size * 2)
14071   {
14072     update_sql.free();
14073     if (update_sql.real_alloc(init_sql_alloc_size))
14074       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
14075     *realloced |= (SPIDER_SQL_TYPE_UPDATE_SQL | SPIDER_SQL_TYPE_DELETE_SQL);
14076   }
14077   update_sql.length(0);
14078   if ((int) tmp_sql.alloced_length() > init_sql_alloc_size * 2)
14079   {
14080     tmp_sql.free();
14081     if (tmp_sql.real_alloc(init_sql_alloc_size))
14082       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
14083     *realloced |= SPIDER_SQL_TYPE_TMP_SQL;
14084   }
14085   DBUG_RETURN(0);
14086 }
14087 
reset_sql(ulong sql_type)14088 int spider_mbase_handler::reset_sql(
14089   ulong sql_type
14090 ) {
14091   DBUG_ENTER("spider_mbase_handler::reset_sql");
14092   DBUG_PRINT("info",("spider this=%p", this));
14093   if (sql_type & SPIDER_SQL_TYPE_SELECT_SQL)
14094   {
14095     sql.length(0);
14096   }
14097   if (sql_type & SPIDER_SQL_TYPE_INSERT_SQL)
14098   {
14099     insert_sql.length(0);
14100   }
14101   if (sql_type & (SPIDER_SQL_TYPE_UPDATE_SQL | SPIDER_SQL_TYPE_DELETE_SQL |
14102     SPIDER_SQL_TYPE_BULK_UPDATE_SQL))
14103   {
14104     update_sql.length(0);
14105   }
14106   if (sql_type & SPIDER_SQL_TYPE_TMP_SQL)
14107   {
14108     tmp_sql.length(0);
14109   }
14110   if (sql_type & SPIDER_SQL_TYPE_HANDLER)
14111   {
14112     ha_sql.length(0);
14113   }
14114   DBUG_RETURN(0);
14115 }
14116 
14117 #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
reset_keys(ulong sql_type)14118 int spider_mbase_handler::reset_keys(
14119   ulong sql_type
14120 ) {
14121   DBUG_ENTER("spider_mbase_handler::reset_keys");
14122   DBUG_PRINT("info",("spider this=%p", this));
14123   DBUG_ASSERT(0);
14124   DBUG_RETURN(0);
14125 }
14126 
reset_upds(ulong sql_type)14127 int spider_mbase_handler::reset_upds(
14128   ulong sql_type
14129 ) {
14130   DBUG_ENTER("spider_mbase_handler::reset_upds");
14131   DBUG_PRINT("info",("spider this=%p", this));
14132   hs_upds.clear();
14133   DBUG_RETURN(0);
14134 }
14135 
reset_strs(ulong sql_type)14136 int spider_mbase_handler::reset_strs(
14137   ulong sql_type
14138 ) {
14139   DBUG_ENTER("spider_mbase_handler::reset_strs");
14140   DBUG_PRINT("info",("spider this=%p", this));
14141   DBUG_ASSERT(0);
14142   DBUG_RETURN(0);
14143 }
14144 
reset_strs_pos(ulong sql_type)14145 int spider_mbase_handler::reset_strs_pos(
14146   ulong sql_type
14147 ) {
14148   DBUG_ENTER("spider_mbase_handler::reset_strs_pos");
14149   DBUG_PRINT("info",("spider this=%p", this));
14150   DBUG_ASSERT(0);
14151   DBUG_RETURN(0);
14152 }
14153 
push_back_upds(SPIDER_HS_STRING_REF & info)14154 int spider_mbase_handler::push_back_upds(
14155   SPIDER_HS_STRING_REF &info
14156 ) {
14157   int error_num;
14158   DBUG_ENTER("spider_mbase_handler::push_back_upds");
14159   DBUG_PRINT("info",("spider this=%p", this));
14160   error_num = hs_upds.push_back(info);
14161   DBUG_RETURN(error_num);
14162 }
14163 #endif
14164 
need_lock_before_set_sql_for_exec(ulong sql_type)14165 bool spider_mbase_handler::need_lock_before_set_sql_for_exec(
14166   ulong sql_type
14167 ) {
14168   DBUG_ENTER("spider_mbase_handler::need_lock_before_set_sql_for_exec");
14169   DBUG_PRINT("info",("spider this=%p", this));
14170   DBUG_RETURN(FALSE);
14171 }
14172 
14173 #ifdef SPIDER_HAS_GROUP_BY_HANDLER
set_sql_for_exec(ulong sql_type,int link_idx,SPIDER_LINK_IDX_CHAIN * link_idx_chain)14174 int spider_mbase_handler::set_sql_for_exec(
14175   ulong sql_type,
14176   int link_idx,
14177   SPIDER_LINK_IDX_CHAIN *link_idx_chain
14178 ) {
14179   int error_num;
14180   DBUG_ENTER("spider_mbase_handler::set_sql_for_exec");
14181   DBUG_PRINT("info",("spider this=%p", this));
14182   if (sql_type & SPIDER_SQL_TYPE_SELECT_SQL)
14183   {
14184     if ((error_num = spider_db_mbase_utility->reappend_tables(
14185       spider->fields, link_idx_chain, &sql)))
14186       DBUG_RETURN(error_num);
14187     exec_sql = &sql;
14188   }
14189   DBUG_RETURN(0);
14190 }
14191 #endif
14192 
set_sql_for_exec(ulong sql_type,int link_idx)14193 int spider_mbase_handler::set_sql_for_exec(
14194   ulong sql_type,
14195   int link_idx
14196 ) {
14197   int error_num;
14198   uint tmp_pos;
14199   SPIDER_SHARE *share = spider->share;
14200   SPIDER_RESULT_LIST *result_list = &spider->result_list;
14201   int all_link_idx = spider->conn_link_idx[link_idx];
14202   DBUG_ENTER("spider_mbase_handler::set_sql_for_exec");
14203   DBUG_PRINT("info",("spider this=%p", this));
14204   if (sql_type & (SPIDER_SQL_TYPE_SELECT_SQL | SPIDER_SQL_TYPE_TMP_SQL))
14205   {
14206     if (mysql_share->same_db_table_name || link_idx == first_link_idx)
14207     {
14208       if (sql_type & SPIDER_SQL_TYPE_SELECT_SQL)
14209         exec_sql = &sql;
14210       if (sql_type & SPIDER_SQL_TYPE_TMP_SQL)
14211         exec_tmp_sql = &tmp_sql;
14212     } else {
14213       char tmp_table_name[MAX_FIELD_WIDTH * 2],
14214         tgt_table_name[MAX_FIELD_WIDTH * 2];
14215       int tmp_table_name_length;
14216       spider_string tgt_table_name_str(tgt_table_name,
14217         MAX_FIELD_WIDTH * 2,
14218         mysql_share->db_names_str[link_idx].charset());
14219       const char *table_names[2], *table_aliases[2];
14220       uint table_name_lengths[2], table_alias_lengths[2];
14221       tgt_table_name_str.init_calc_mem(104);
14222       tgt_table_name_str.length(0);
14223       if (result_list->tmp_table_join && spider->bka_mode != 2)
14224       {
14225         create_tmp_bka_table_name(tmp_table_name, &tmp_table_name_length,
14226           link_idx);
14227         append_table_name_with_adjusting(&tgt_table_name_str, link_idx,
14228           SPIDER_SQL_TYPE_TMP_SQL);
14229         table_names[0] = tmp_table_name;
14230         table_names[1] = tgt_table_name_str.ptr();
14231         table_name_lengths[0] = tmp_table_name_length;
14232         table_name_lengths[1] = tgt_table_name_str.length();
14233         table_aliases[0] = SPIDER_SQL_A_STR;
14234         table_aliases[1] = SPIDER_SQL_B_STR;
14235         table_alias_lengths[0] = SPIDER_SQL_A_LEN;
14236         table_alias_lengths[1] = SPIDER_SQL_B_LEN;
14237       }
14238       if (sql_type & SPIDER_SQL_TYPE_SELECT_SQL)
14239       {
14240         exec_sql = &result_list->sqls[link_idx];
14241         if (exec_sql->copy(sql))
14242           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
14243         else if (result_list->use_union)
14244         {
14245           if ((error_num = reset_union_table_name(exec_sql, link_idx,
14246             SPIDER_SQL_TYPE_SELECT_SQL)))
14247             DBUG_RETURN(error_num);
14248         } else {
14249           tmp_pos = exec_sql->length();
14250           exec_sql->length(table_name_pos);
14251           if (result_list->tmp_table_join && spider->bka_mode != 2)
14252           {
14253             if ((error_num = spider_db_mbase_utility->append_from_with_alias(
14254               exec_sql, table_names, table_name_lengths,
14255               table_aliases, table_alias_lengths, 2,
14256               &table_name_pos, TRUE))
14257             )
14258               DBUG_RETURN(error_num);
14259             exec_sql->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
14260           } else {
14261             append_table_name_with_adjusting(exec_sql, link_idx,
14262               SPIDER_SQL_TYPE_SELECT_SQL);
14263           }
14264           exec_sql->length(tmp_pos);
14265         }
14266       }
14267       if (sql_type & SPIDER_SQL_TYPE_TMP_SQL)
14268       {
14269         exec_tmp_sql = &result_list->tmp_sqls[link_idx];
14270         if (result_list->tmp_table_join && spider->bka_mode != 2)
14271         {
14272           if (exec_tmp_sql->copy(tmp_sql))
14273             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
14274           else {
14275             tmp_pos = exec_tmp_sql->length();
14276             exec_tmp_sql->length(tmp_sql_pos1);
14277             exec_tmp_sql->q_append(tmp_table_name, tmp_table_name_length);
14278             exec_tmp_sql->length(tmp_sql_pos2);
14279             exec_tmp_sql->q_append(tmp_table_name, tmp_table_name_length);
14280             exec_tmp_sql->length(tmp_sql_pos3);
14281             exec_tmp_sql->q_append(tmp_table_name, tmp_table_name_length);
14282             exec_tmp_sql->length(tmp_pos);
14283           }
14284         }
14285       }
14286     }
14287   }
14288   if (sql_type & SPIDER_SQL_TYPE_INSERT_SQL)
14289   {
14290     if (mysql_share->same_db_table_name || link_idx == first_link_idx)
14291       exec_insert_sql = &insert_sql;
14292     else {
14293       exec_insert_sql = &result_list->insert_sqls[link_idx];
14294       if (exec_insert_sql->copy(insert_sql))
14295         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
14296       DBUG_PRINT("info",("spider exec_insert_sql=%s",
14297         exec_insert_sql->c_ptr_safe()));
14298       tmp_pos = exec_insert_sql->length();
14299       exec_insert_sql->length(insert_table_name_pos);
14300       append_table_name_with_adjusting(exec_insert_sql, link_idx,
14301         sql_type);
14302       exec_insert_sql->length(tmp_pos);
14303       DBUG_PRINT("info",("spider exec_insert_sql->length=%u",
14304         exec_insert_sql->length()));
14305       DBUG_PRINT("info",("spider exec_insert_sql=%s",
14306         exec_insert_sql->c_ptr_safe()));
14307     }
14308   }
14309   if (sql_type & SPIDER_SQL_TYPE_BULK_UPDATE_SQL)
14310   {
14311     if (reading_from_bulk_tmp_table)
14312     {
14313       if (
14314         mysql_share->same_db_table_name &&
14315         share->link_statuses[all_link_idx] != SPIDER_LINK_STATUS_RECOVERY
14316       ) {
14317         exec_update_sql = &insert_sql;
14318       } else if (!spider->result_list.upd_tmp_tbls[link_idx])
14319       {
14320         DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
14321       } else {
14322         exec_update_sql = &spider->result_list.insert_sqls[link_idx];
14323         if ((error_num = restore_sql_from_bulk_tmp_table(exec_update_sql,
14324           spider->result_list.upd_tmp_tbls[link_idx])))
14325         {
14326           DBUG_RETURN(error_num);
14327         }
14328       }
14329     } else {
14330       if (
14331         mysql_share->same_db_table_name &&
14332         share->link_statuses[all_link_idx] != SPIDER_LINK_STATUS_RECOVERY
14333       ) {
14334         exec_update_sql = &update_sql;
14335       } else {
14336         exec_update_sql = &spider->result_list.update_sqls[link_idx];
14337       }
14338     }
14339   } else if (sql_type &
14340     (SPIDER_SQL_TYPE_UPDATE_SQL | SPIDER_SQL_TYPE_DELETE_SQL))
14341   {
14342     if (mysql_share->same_db_table_name || link_idx == first_link_idx)
14343       exec_update_sql = &update_sql;
14344     else {
14345       exec_update_sql = &spider->result_list.update_sqls[link_idx];
14346       if (exec_update_sql->copy(update_sql))
14347         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
14348       tmp_pos = exec_update_sql->length();
14349       exec_update_sql->length(table_name_pos);
14350       append_table_name_with_adjusting(exec_update_sql, link_idx,
14351         sql_type);
14352       exec_update_sql->length(tmp_pos);
14353     }
14354   }
14355   if (sql_type & SPIDER_SQL_TYPE_HANDLER)
14356   {
14357     if (spider->m_handler_id[link_idx] == ha_sql_handler_id)
14358       exec_ha_sql = &ha_sql;
14359     else {
14360       exec_ha_sql = &result_list->sqls[link_idx];
14361       if (exec_ha_sql->copy(ha_sql))
14362         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
14363       else {
14364         tmp_pos = exec_ha_sql->length();
14365         exec_ha_sql->length(ha_table_name_pos);
14366         append_table_name_with_adjusting(exec_ha_sql, link_idx,
14367           SPIDER_SQL_TYPE_HANDLER);
14368         exec_ha_sql->length(tmp_pos);
14369       }
14370     }
14371   }
14372   DBUG_RETURN(0);
14373 }
14374 
set_sql_for_exec(spider_db_copy_table * tgt_ct,ulong sql_type)14375 int spider_mbase_handler::set_sql_for_exec(
14376   spider_db_copy_table *tgt_ct,
14377   ulong sql_type
14378 ) {
14379   spider_mbase_copy_table *mysql_ct = (spider_mbase_copy_table *) tgt_ct;
14380   DBUG_ENTER("spider_mbase_handler::set_sql_for_exec");
14381   DBUG_PRINT("info",("spider this=%p", this));
14382   switch (sql_type)
14383   {
14384     case SPIDER_SQL_TYPE_INSERT_SQL:
14385       exec_insert_sql = &mysql_ct->sql;
14386       break;
14387     default:
14388       DBUG_ASSERT(0);
14389       break;
14390   }
14391   DBUG_RETURN(0);
14392 }
14393 
execute_sql(ulong sql_type,SPIDER_CONN * conn,int quick_mode,int * need_mon)14394 int spider_mbase_handler::execute_sql(
14395   ulong sql_type,
14396   SPIDER_CONN *conn,
14397   int quick_mode,
14398   int *need_mon
14399 ) {
14400   spider_string *tgt_sql;
14401   uint tgt_length;
14402   DBUG_ENTER("spider_mbase_handler::execute_sql");
14403   DBUG_PRINT("info",("spider this=%p", this));
14404   switch (sql_type)
14405   {
14406     case SPIDER_SQL_TYPE_SELECT_SQL:
14407       DBUG_PRINT("info",("spider SPIDER_SQL_TYPE_SELECT_SQL"));
14408       tgt_sql = exec_sql;
14409       tgt_length = tgt_sql->length();
14410       break;
14411     case SPIDER_SQL_TYPE_INSERT_SQL:
14412       DBUG_PRINT("info",("spider SPIDER_SQL_TYPE_SELECT_SQL"));
14413       tgt_sql = exec_insert_sql;
14414       tgt_length = tgt_sql->length();
14415       break;
14416     case SPIDER_SQL_TYPE_UPDATE_SQL:
14417     case SPIDER_SQL_TYPE_DELETE_SQL:
14418     case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
14419       DBUG_PRINT("info",("spider %s",
14420         sql_type == SPIDER_SQL_TYPE_UPDATE_SQL ? "SPIDER_SQL_TYPE_UPDATE_SQL" :
14421         sql_type == SPIDER_SQL_TYPE_DELETE_SQL ? "SPIDER_SQL_TYPE_DELETE_SQL" :
14422         "SPIDER_SQL_TYPE_BULK_UPDATE_SQL"
14423       ));
14424       tgt_sql = exec_update_sql;
14425       tgt_length = tgt_sql->length();
14426       break;
14427     case SPIDER_SQL_TYPE_TMP_SQL:
14428       DBUG_PRINT("info",("spider SPIDER_SQL_TYPE_TMP_SQL"));
14429       tgt_sql = exec_tmp_sql;
14430       tgt_length = tgt_sql->length();
14431       break;
14432     case SPIDER_SQL_TYPE_DROP_TMP_TABLE_SQL:
14433       DBUG_PRINT("info",("spider SPIDER_SQL_TYPE_DROP_TMP_TABLE_SQL"));
14434       tgt_sql = exec_tmp_sql;
14435       tgt_length = tmp_sql_pos5;
14436       break;
14437     case SPIDER_SQL_TYPE_HANDLER:
14438       DBUG_PRINT("info",("spider SPIDER_SQL_TYPE_HANDLER"));
14439       tgt_sql = exec_ha_sql;
14440       tgt_length = tgt_sql->length();
14441       break;
14442     default:
14443       /* nothing to do */
14444       DBUG_PRINT("info",("spider default"));
14445       DBUG_RETURN(0);
14446   }
14447   DBUG_RETURN(spider_db_query(
14448     conn,
14449     tgt_sql->ptr(),
14450     tgt_length,
14451     quick_mode,
14452     need_mon
14453   ));
14454 }
14455 
reset()14456 int spider_mbase_handler::reset()
14457 {
14458   DBUG_ENTER("spider_mbase_handler::reset");
14459   DBUG_PRINT("info",("spider this=%p", this));
14460   update_sql.length(0);
14461   DBUG_RETURN(0);
14462 }
14463 
sts_mode_exchange(int sts_mode)14464 int spider_mbase_handler::sts_mode_exchange(
14465   int sts_mode
14466 ) {
14467   DBUG_ENTER("spider_mbase_handler::sts_mode_exchange");
14468   DBUG_PRINT("info",("spider sts_mode=%d", sts_mode));
14469   DBUG_RETURN(sts_mode);
14470 }
14471 
show_table_status(int link_idx,int sts_mode,uint flag)14472 int spider_mbase_handler::show_table_status(
14473   int link_idx,
14474   int sts_mode,
14475   uint flag
14476 ) {
14477   int error_num;
14478   SPIDER_CONN *conn = spider->conns[link_idx];
14479   SPIDER_DB_RESULT *res;
14480   SPIDER_SHARE *share = spider->share;
14481   uint pos = (2 * spider->conn_link_idx[link_idx]);
14482   ulonglong auto_increment_value = 0;
14483   DBUG_ENTER("spider_mbase_handler::show_table_status");
14484   DBUG_PRINT("info",("spider sts_mode=%d", sts_mode));
14485 
14486   if (sts_mode == 1)
14487   {
14488     pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
14489     pthread_mutex_lock(&conn->mta_conn_mutex);
14490     SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
14491     conn->need_mon = &spider->need_mons[link_idx];
14492     DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
14493     DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
14494     conn->mta_conn_mutex_lock_already = TRUE;
14495     conn->mta_conn_mutex_unlock_later = TRUE;
14496     conn->disable_connect_retry = TRUE;
14497     spider_conn_set_timeout_from_share(conn, link_idx,
14498       spider->wide_handler->trx->thd,
14499       share);
14500     if (
14501       (error_num = spider_db_set_names(spider, conn, link_idx)) ||
14502       (
14503         spider_db_query(
14504           conn,
14505           mysql_share->show_table_status[0 + pos].ptr(),
14506           mysql_share->show_table_status[0 + pos].length(),
14507           -1,
14508           &spider->need_mons[link_idx]) &&
14509         (error_num = spider_db_errorno(conn))
14510       )
14511     ) {
14512       if (
14513         error_num == ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM &&
14514         !conn->disable_reconnect
14515       ) {
14516         /* retry */
14517         if ((error_num = spider_db_ping(spider, conn, link_idx)))
14518         {
14519           conn->disable_connect_retry = FALSE;
14520           DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14521           DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14522           conn->mta_conn_mutex_lock_already = FALSE;
14523           conn->mta_conn_mutex_unlock_later = FALSE;
14524           SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14525           pthread_mutex_unlock(&conn->mta_conn_mutex);
14526           DBUG_RETURN(error_num);
14527         }
14528         if ((error_num = spider_db_set_names(spider, conn, link_idx)))
14529         {
14530           conn->disable_connect_retry = FALSE;
14531           DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14532           DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14533           conn->mta_conn_mutex_lock_already = FALSE;
14534           conn->mta_conn_mutex_unlock_later = FALSE;
14535           SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14536           pthread_mutex_unlock(&conn->mta_conn_mutex);
14537           DBUG_RETURN(error_num);
14538         }
14539         spider_conn_set_timeout_from_share(conn, link_idx,
14540           spider->wide_handler->trx->thd,
14541           share);
14542         if (spider_db_query(
14543           conn,
14544           mysql_share->show_table_status[0 + pos].ptr(),
14545           mysql_share->show_table_status[0 + pos].length(),
14546           -1,
14547           &spider->need_mons[link_idx])
14548         ) {
14549           conn->disable_connect_retry = FALSE;
14550           DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14551           DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14552           conn->mta_conn_mutex_lock_already = FALSE;
14553           conn->mta_conn_mutex_unlock_later = FALSE;
14554           DBUG_RETURN(spider_db_errorno(conn));
14555         }
14556       } else {
14557         conn->disable_connect_retry = FALSE;
14558         DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14559         DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14560         conn->mta_conn_mutex_lock_already = FALSE;
14561         conn->mta_conn_mutex_unlock_later = FALSE;
14562         SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14563         pthread_mutex_unlock(&conn->mta_conn_mutex);
14564         DBUG_RETURN(error_num);
14565       }
14566     }
14567     st_spider_db_request_key request_key;
14568     request_key.spider_thread_id = spider->wide_handler->trx->spider_thread_id;
14569     request_key.query_id = spider->wide_handler->trx->thd->query_id;
14570     request_key.handler = spider;
14571     request_key.request_id = 1;
14572     request_key.next = NULL;
14573     if (spider_param_dry_access())
14574     {
14575       conn->disable_connect_retry = FALSE;
14576       DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14577       DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14578       conn->mta_conn_mutex_lock_already = FALSE;
14579       conn->mta_conn_mutex_unlock_later = FALSE;
14580       SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14581       pthread_mutex_unlock(&conn->mta_conn_mutex);
14582       DBUG_RETURN(0);
14583     }
14584     if (!(res = conn->db_conn->store_result(NULL, &request_key, &error_num)))
14585     {
14586       conn->disable_connect_retry = FALSE;
14587       DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14588       DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14589       conn->mta_conn_mutex_lock_already = FALSE;
14590       conn->mta_conn_mutex_unlock_later = FALSE;
14591       if (error_num)
14592       {
14593         SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14594         pthread_mutex_unlock(&conn->mta_conn_mutex);
14595         DBUG_RETURN(error_num);
14596       }
14597       else if ((error_num = spider_db_errorno(conn)))
14598         DBUG_RETURN(error_num);
14599       else {
14600         my_printf_error(ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM,
14601           ER_SPIDER_REMOTE_TABLE_NOT_FOUND_STR, MYF(0),
14602           mysql_share->db_names_str[spider->conn_link_idx[link_idx]].ptr(),
14603           mysql_share->table_names_str[spider->conn_link_idx[
14604             link_idx]].ptr());
14605         DBUG_RETURN(ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM);
14606       }
14607     }
14608     conn->disable_connect_retry = FALSE;
14609     DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14610     DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14611     conn->mta_conn_mutex_lock_already = FALSE;
14612     conn->mta_conn_mutex_unlock_later = FALSE;
14613     SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14614     pthread_mutex_unlock(&conn->mta_conn_mutex);
14615     error_num = res->fetch_table_status(
14616       sts_mode,
14617       share->stat
14618     );
14619     auto_increment_value = share->stat.auto_increment_value;
14620     res->free_result();
14621     delete res;
14622     if (error_num)
14623     {
14624       switch (error_num)
14625       {
14626         case ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM:
14627           my_printf_error(ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM,
14628             ER_SPIDER_REMOTE_TABLE_NOT_FOUND_STR, MYF(0),
14629             mysql_share->db_names_str[spider->conn_link_idx[link_idx]].ptr(),
14630             mysql_share->table_names_str[spider->conn_link_idx[
14631               link_idx]].ptr());
14632           break;
14633         case ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM:
14634           my_printf_error(ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM,
14635             ER_SPIDER_INVALID_REMOTE_TABLE_INFO_STR, MYF(0),
14636             mysql_share->db_names_str[spider->conn_link_idx[link_idx]].ptr(),
14637             mysql_share->table_names_str[spider->conn_link_idx[
14638               link_idx]].ptr());
14639           break;
14640         default:
14641           break;
14642       }
14643       DBUG_RETURN(error_num);
14644     }
14645   } else {
14646     pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
14647     pthread_mutex_lock(&conn->mta_conn_mutex);
14648     SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
14649     conn->need_mon = &spider->need_mons[link_idx];
14650     DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
14651     DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
14652     conn->mta_conn_mutex_lock_already = TRUE;
14653     conn->mta_conn_mutex_unlock_later = TRUE;
14654     conn->disable_connect_retry = TRUE;
14655     spider_conn_set_timeout_from_share(conn, link_idx,
14656       spider->wide_handler->trx->thd,
14657       share);
14658     if (
14659       (error_num = spider_db_set_names(spider, conn, link_idx)) ||
14660       (
14661         spider_db_query(
14662           conn,
14663           mysql_share->show_table_status[1 + pos].ptr(),
14664           mysql_share->show_table_status[1 + pos].length(),
14665           -1,
14666           &spider->need_mons[link_idx]) &&
14667         (error_num = spider_db_errorno(conn))
14668       )
14669     ) {
14670       if (
14671         error_num == ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM &&
14672         !conn->disable_reconnect
14673       ) {
14674         /* retry */
14675         if ((error_num = spider_db_ping(spider, conn, link_idx)))
14676         {
14677           conn->disable_connect_retry = FALSE;
14678           DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14679           DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14680           conn->mta_conn_mutex_lock_already = FALSE;
14681           conn->mta_conn_mutex_unlock_later = FALSE;
14682           SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14683           pthread_mutex_unlock(&conn->mta_conn_mutex);
14684           DBUG_RETURN(error_num);
14685         }
14686         if ((error_num = spider_db_set_names(spider, conn, link_idx)))
14687         {
14688           conn->disable_connect_retry = FALSE;
14689           DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14690           DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14691           conn->mta_conn_mutex_lock_already = FALSE;
14692           conn->mta_conn_mutex_unlock_later = FALSE;
14693           SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14694           pthread_mutex_unlock(&conn->mta_conn_mutex);
14695           DBUG_RETURN(error_num);
14696         }
14697         spider_conn_set_timeout_from_share(conn, link_idx,
14698           spider->wide_handler->trx->thd,
14699           share);
14700         if (spider_db_query(
14701           conn,
14702           mysql_share->show_table_status[1 + pos].ptr(),
14703           mysql_share->show_table_status[1 + pos].length(),
14704           -1,
14705           &spider->need_mons[link_idx])
14706         ) {
14707           conn->disable_connect_retry = FALSE;
14708           DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14709           DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14710           conn->mta_conn_mutex_lock_already = FALSE;
14711           conn->mta_conn_mutex_unlock_later = FALSE;
14712           DBUG_RETURN(spider_db_errorno(conn));
14713         }
14714       } else {
14715         conn->disable_connect_retry = FALSE;
14716         DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14717         DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14718         conn->mta_conn_mutex_lock_already = FALSE;
14719         conn->mta_conn_mutex_unlock_later = FALSE;
14720         SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14721         pthread_mutex_unlock(&conn->mta_conn_mutex);
14722         DBUG_RETURN(error_num);
14723       }
14724     }
14725     st_spider_db_request_key request_key;
14726     request_key.spider_thread_id = spider->wide_handler->trx->spider_thread_id;
14727     request_key.query_id = spider->wide_handler->trx->thd->query_id;
14728     request_key.handler = spider;
14729     request_key.request_id = 1;
14730     request_key.next = NULL;
14731     if (spider_param_dry_access())
14732     {
14733       conn->disable_connect_retry = FALSE;
14734       DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14735       DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14736       conn->mta_conn_mutex_lock_already = FALSE;
14737       conn->mta_conn_mutex_unlock_later = FALSE;
14738       SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14739       pthread_mutex_unlock(&conn->mta_conn_mutex);
14740       DBUG_RETURN(0);
14741     }
14742     if (!(res = conn->db_conn->store_result(NULL, &request_key, &error_num)))
14743     {
14744       conn->disable_connect_retry = FALSE;
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 = FALSE;
14748       conn->mta_conn_mutex_unlock_later = FALSE;
14749       if (error_num || (error_num = spider_db_errorno(conn)))
14750         DBUG_RETURN(error_num);
14751       else
14752         DBUG_RETURN(ER_QUERY_ON_FOREIGN_DATA_SOURCE);
14753     }
14754     conn->disable_connect_retry = FALSE;
14755     DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14756     DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14757     conn->mta_conn_mutex_lock_already = FALSE;
14758     conn->mta_conn_mutex_unlock_later = FALSE;
14759     SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14760     pthread_mutex_unlock(&conn->mta_conn_mutex);
14761     error_num = res->fetch_table_status(
14762       sts_mode,
14763       share->stat
14764     );
14765     auto_increment_value = share->stat.auto_increment_value;
14766     res->free_result();
14767     delete res;
14768     if (error_num)
14769     {
14770       switch (error_num)
14771       {
14772         case ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM:
14773           my_printf_error(ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM,
14774             ER_SPIDER_REMOTE_TABLE_NOT_FOUND_STR, MYF(0),
14775             mysql_share->db_names_str[spider->conn_link_idx[link_idx]].ptr(),
14776             mysql_share->table_names_str[spider->conn_link_idx[
14777               link_idx]].ptr());
14778           break;
14779         case ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM:
14780           my_printf_error(ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM,
14781             ER_SPIDER_INVALID_REMOTE_TABLE_INFO_STR, MYF(0),
14782             mysql_share->db_names_str[spider->conn_link_idx[link_idx]].ptr(),
14783             mysql_share->table_names_str[spider->conn_link_idx[
14784               link_idx]].ptr());
14785           break;
14786         default:
14787           break;
14788       }
14789       DBUG_RETURN(error_num);
14790     }
14791   }
14792   if ((error_num = ((spider_db_mbase *) conn->db_conn)->print_warnings(NULL)))
14793   {
14794     DBUG_RETURN(error_num);
14795   }
14796   if (share->static_records_for_status != -1)
14797   {
14798     share->stat.records = (ha_rows) share->static_records_for_status;
14799   }
14800   if (share->static_mean_rec_length != -1)
14801   {
14802     share->stat.mean_rec_length = (ulong) share->static_mean_rec_length;
14803   }
14804   if (auto_increment_value > share->lgtm_tblhnd_share->auto_increment_value)
14805   {
14806     share->lgtm_tblhnd_share->auto_increment_value = auto_increment_value;
14807     DBUG_PRINT("info",("spider auto_increment_value=%llu",
14808       share->lgtm_tblhnd_share->auto_increment_value));
14809   }
14810   DBUG_RETURN(0);
14811 }
14812 
crd_mode_exchange(int crd_mode)14813 int spider_mbase_handler::crd_mode_exchange(
14814   int crd_mode
14815 ) {
14816   DBUG_ENTER("spider_mbase_handler::crd_mode_exchange");
14817   DBUG_PRINT("info",("spider crd_mode=%d", crd_mode));
14818   DBUG_RETURN(crd_mode);
14819 }
14820 
show_index(int link_idx,int crd_mode)14821 int spider_mbase_handler::show_index(
14822   int link_idx,
14823   int crd_mode
14824 ) {
14825   int error_num;
14826   SPIDER_CONN *conn = spider->conns[link_idx];
14827   SPIDER_SHARE *share = spider->share;
14828   TABLE *table = spider->get_table();
14829   SPIDER_DB_RESULT *res;
14830   int roop_count;
14831   longlong *tmp_cardinality;
14832   uint pos = (2 * spider->conn_link_idx[link_idx]);
14833   DBUG_ENTER("spider_mbase_handler::show_index");
14834   DBUG_PRINT("info",("spider crd_mode=%d", crd_mode));
14835   if (crd_mode == 1)
14836   {
14837     pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
14838     pthread_mutex_lock(&conn->mta_conn_mutex);
14839     SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
14840     conn->need_mon = &spider->need_mons[link_idx];
14841     DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
14842     DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
14843     conn->mta_conn_mutex_lock_already = TRUE;
14844     conn->mta_conn_mutex_unlock_later = TRUE;
14845     spider_conn_set_timeout_from_share(conn, link_idx,
14846       spider->wide_handler->trx->thd,
14847       share);
14848     if (
14849       (error_num = spider_db_set_names(spider, conn, link_idx)) ||
14850       (
14851         spider_db_query(
14852           conn,
14853           mysql_share->show_index[0 + pos].ptr(),
14854           mysql_share->show_index[0 + pos].length(),
14855           -1,
14856           &spider->need_mons[link_idx]) &&
14857         (error_num = spider_db_errorno(conn))
14858       )
14859     ) {
14860       if (
14861         error_num == ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM &&
14862         !conn->disable_reconnect
14863       ) {
14864         /* retry */
14865         if ((error_num = spider_db_ping(spider, conn, link_idx)))
14866         {
14867           DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14868           DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14869           conn->mta_conn_mutex_lock_already = FALSE;
14870           conn->mta_conn_mutex_unlock_later = FALSE;
14871           SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14872           pthread_mutex_unlock(&conn->mta_conn_mutex);
14873           DBUG_RETURN(error_num);
14874         }
14875         if ((error_num = spider_db_set_names(spider, conn, link_idx)))
14876         {
14877           DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14878           DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14879           conn->mta_conn_mutex_lock_already = FALSE;
14880           conn->mta_conn_mutex_unlock_later = FALSE;
14881           SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14882           pthread_mutex_unlock(&conn->mta_conn_mutex);
14883           DBUG_RETURN(error_num);
14884         }
14885         spider_conn_set_timeout_from_share(conn, link_idx,
14886           spider->wide_handler->trx->thd,
14887           share);
14888         if (spider_db_query(
14889           conn,
14890           mysql_share->show_index[0 + pos].ptr(),
14891           mysql_share->show_index[0 + pos].length(),
14892           -1,
14893           &spider->need_mons[link_idx])
14894         ) {
14895           DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14896           DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14897           conn->mta_conn_mutex_lock_already = FALSE;
14898           conn->mta_conn_mutex_unlock_later = FALSE;
14899           DBUG_RETURN(spider_db_errorno(conn));
14900         }
14901       } else {
14902         DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14903         DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14904         conn->mta_conn_mutex_lock_already = FALSE;
14905         conn->mta_conn_mutex_unlock_later = FALSE;
14906         SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14907         pthread_mutex_unlock(&conn->mta_conn_mutex);
14908         DBUG_RETURN(error_num);
14909       }
14910     }
14911     st_spider_db_request_key request_key;
14912     request_key.spider_thread_id = spider->wide_handler->trx->spider_thread_id;
14913     request_key.query_id = spider->wide_handler->trx->thd->query_id;
14914     request_key.handler = spider;
14915     request_key.request_id = 1;
14916     request_key.next = NULL;
14917     if (!(res = conn->db_conn->store_result(NULL, &request_key, &error_num)))
14918     {
14919       if (error_num || (error_num = spider_db_errorno(conn)))
14920       {
14921         DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14922         DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14923         conn->mta_conn_mutex_lock_already = FALSE;
14924         conn->mta_conn_mutex_unlock_later = FALSE;
14925         SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14926         pthread_mutex_unlock(&conn->mta_conn_mutex);
14927         DBUG_RETURN(error_num);
14928       }
14929       /* no record is ok */
14930     }
14931     DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14932     DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14933     conn->mta_conn_mutex_lock_already = FALSE;
14934     conn->mta_conn_mutex_unlock_later = FALSE;
14935     SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14936     pthread_mutex_unlock(&conn->mta_conn_mutex);
14937     if (res)
14938     {
14939       error_num = res->fetch_table_cardinality(
14940         crd_mode,
14941         table,
14942         share->cardinality,
14943         share->cardinality_upd,
14944         share->bitmap_size
14945       );
14946     }
14947     for (roop_count = 0, tmp_cardinality = share->cardinality;
14948       roop_count < (int) table->s->fields;
14949       roop_count++, tmp_cardinality++)
14950     {
14951       if (!spider_bit_is_set(share->cardinality_upd, roop_count))
14952       {
14953         DBUG_PRINT("info",
14954           ("spider uninitialized column cardinality id=%d", roop_count));
14955         *tmp_cardinality = -1;
14956       }
14957     }
14958     if (res)
14959     {
14960       res->free_result();
14961       delete res;
14962     }
14963     if (error_num)
14964     {
14965       switch (error_num)
14966       {
14967         case ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM:
14968           my_printf_error(ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM,
14969             ER_SPIDER_REMOTE_TABLE_NOT_FOUND_STR, MYF(0),
14970             mysql_share->db_names_str[spider->conn_link_idx[link_idx]].ptr(),
14971             mysql_share->table_names_str[spider->conn_link_idx[
14972               link_idx]].ptr());
14973           break;
14974         case ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM:
14975           my_printf_error(ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM,
14976             ER_SPIDER_INVALID_REMOTE_TABLE_INFO_STR, MYF(0),
14977             mysql_share->db_names_str[spider->conn_link_idx[link_idx]].ptr(),
14978             mysql_share->table_names_str[spider->conn_link_idx[
14979               link_idx]].ptr());
14980           break;
14981         default:
14982           break;
14983       }
14984       DBUG_RETURN(error_num);
14985     }
14986   } else {
14987     pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
14988     pthread_mutex_lock(&conn->mta_conn_mutex);
14989     SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
14990     conn->need_mon = &spider->need_mons[link_idx];
14991     DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
14992     DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
14993     conn->mta_conn_mutex_lock_already = TRUE;
14994     conn->mta_conn_mutex_unlock_later = TRUE;
14995     spider_conn_set_timeout_from_share(conn, link_idx,
14996       spider->wide_handler->trx->thd,
14997       share);
14998     if (
14999       (error_num = spider_db_set_names(spider, conn, link_idx)) ||
15000       (
15001         spider_db_query(
15002           conn,
15003           mysql_share->show_index[1 + pos].ptr(),
15004           mysql_share->show_index[1 + pos].length(),
15005           -1,
15006           &spider->need_mons[link_idx]) &&
15007         (error_num = spider_db_errorno(conn))
15008       )
15009     ) {
15010       if (
15011         error_num == ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM &&
15012         !conn->disable_reconnect
15013       ) {
15014         /* retry */
15015         if ((error_num = spider_db_ping(spider, conn, link_idx)))
15016         {
15017           DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15018           DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15019           conn->mta_conn_mutex_lock_already = FALSE;
15020           conn->mta_conn_mutex_unlock_later = FALSE;
15021           SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15022           pthread_mutex_unlock(&conn->mta_conn_mutex);
15023           DBUG_RETURN(error_num);
15024         }
15025         if ((error_num = spider_db_set_names(spider, conn, link_idx)))
15026         {
15027           DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15028           DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15029           conn->mta_conn_mutex_lock_already = FALSE;
15030           conn->mta_conn_mutex_unlock_later = FALSE;
15031           SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15032           pthread_mutex_unlock(&conn->mta_conn_mutex);
15033           DBUG_RETURN(error_num);
15034         }
15035         spider_conn_set_timeout_from_share(conn, link_idx,
15036           spider->wide_handler->trx->thd,
15037           share);
15038         if (spider_db_query(
15039           conn,
15040           mysql_share->show_index[1 + pos].ptr(),
15041           mysql_share->show_index[1 + pos].length(),
15042           -1,
15043           &spider->need_mons[link_idx])
15044         ) {
15045           DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15046           DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15047           conn->mta_conn_mutex_lock_already = FALSE;
15048           conn->mta_conn_mutex_unlock_later = FALSE;
15049           DBUG_RETURN(spider_db_errorno(conn));
15050         }
15051       } else {
15052         DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15053         DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15054         conn->mta_conn_mutex_lock_already = FALSE;
15055         conn->mta_conn_mutex_unlock_later = FALSE;
15056         SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15057         pthread_mutex_unlock(&conn->mta_conn_mutex);
15058         DBUG_RETURN(error_num);
15059       }
15060     }
15061     st_spider_db_request_key request_key;
15062     request_key.spider_thread_id = spider->wide_handler->trx->spider_thread_id;
15063     request_key.query_id = spider->wide_handler->trx->thd->query_id;
15064     request_key.handler = spider;
15065     request_key.request_id = 1;
15066     request_key.next = NULL;
15067     if (!(res = conn->db_conn->store_result(NULL, &request_key, &error_num)))
15068     {
15069       if (error_num || (error_num = spider_db_errorno(conn)))
15070       {
15071         DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15072         DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15073         conn->mta_conn_mutex_lock_already = FALSE;
15074         conn->mta_conn_mutex_unlock_later = FALSE;
15075         SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15076         pthread_mutex_unlock(&conn->mta_conn_mutex);
15077         DBUG_RETURN(error_num);
15078       }
15079       /* no record is ok */
15080     }
15081     DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15082     DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15083     conn->mta_conn_mutex_lock_already = FALSE;
15084     conn->mta_conn_mutex_unlock_later = FALSE;
15085     SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15086     pthread_mutex_unlock(&conn->mta_conn_mutex);
15087     if (res)
15088     {
15089       error_num = res->fetch_table_cardinality(
15090         crd_mode,
15091         table,
15092         share->cardinality,
15093         share->cardinality_upd,
15094         share->bitmap_size
15095       );
15096     }
15097     for (roop_count = 0, tmp_cardinality = share->cardinality;
15098       roop_count < (int) table->s->fields;
15099       roop_count++, tmp_cardinality++)
15100     {
15101       if (!spider_bit_is_set(share->cardinality_upd, roop_count))
15102       {
15103         DBUG_PRINT("info",
15104           ("spider uninitialized column cardinality id=%d", roop_count));
15105         *tmp_cardinality = -1;
15106       }
15107     }
15108     if (res)
15109     {
15110       res->free_result();
15111       delete res;
15112     }
15113     if (error_num)
15114     {
15115       switch (error_num)
15116       {
15117         case ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM:
15118           my_printf_error(ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM,
15119             ER_SPIDER_REMOTE_TABLE_NOT_FOUND_STR, MYF(0),
15120             mysql_share->db_names_str[spider->conn_link_idx[link_idx]].ptr(),
15121             mysql_share->table_names_str[spider->conn_link_idx[
15122               link_idx]].ptr());
15123           break;
15124         case ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM:
15125           my_printf_error(ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM,
15126             ER_SPIDER_INVALID_REMOTE_TABLE_INFO_STR, MYF(0),
15127             mysql_share->db_names_str[spider->conn_link_idx[link_idx]].ptr(),
15128             mysql_share->table_names_str[spider->conn_link_idx[
15129               link_idx]].ptr());
15130           break;
15131         default:
15132           break;
15133       }
15134       DBUG_RETURN(error_num);
15135     }
15136   }
15137   DBUG_RETURN(0);
15138 }
15139 
simple_action(uint simple_action,int link_idx)15140 int spider_mbase_handler::simple_action(
15141   uint simple_action,
15142   int link_idx
15143 ) {
15144   int error_num;
15145   SPIDER_CONN *conn = spider->conns[link_idx];
15146   SPIDER_DB_RESULT *res;
15147   SPIDER_SHARE *share = spider->share;
15148   uint pos = spider->conn_link_idx[link_idx];
15149   spider_string *str = NULL;
15150   DBUG_ENTER("spider_mbase_handler::simple_action");
15151   switch (simple_action)
15152   {
15153     case SPIDER_SIMPLE_RECORDS:
15154       DBUG_PRINT("info",("spider simple records"));
15155       str = &mysql_share->show_records[pos];
15156       break;
15157 #ifdef HA_HAS_CHECKSUM_EXTENDED
15158     case SPIDER_SIMPLE_CHECKSUM_TABLE:
15159       DBUG_PRINT("info",("spider simple checksum_table"));
15160       str = &spider->result_list.sqls[link_idx];
15161       str->length(0);
15162       if (str->reserve(
15163         SPIDER_SQL_CHECKSUM_TABLE_LEN +
15164         mysql_share->db_nm_max_length +
15165         SPIDER_SQL_DOT_LEN +
15166         mysql_share->table_nm_max_length +
15167         /* SPIDER_SQL_NAME_QUOTE_LEN */ 4 +
15168         ((spider->action_flags & T_QUICK) ? SPIDER_SQL_SQL_QUICK_LEN : 0) +
15169         ((spider->action_flags & T_EXTEND) ? SPIDER_SQL_SQL_EXTENDED_LEN : 0)
15170       ))
15171       {
15172         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
15173       }
15174       str->q_append(SPIDER_SQL_CHECKSUM_TABLE_STR,
15175         SPIDER_SQL_CHECKSUM_TABLE_LEN);
15176       mysql_share->append_table_name(str, pos);
15177       if (spider->action_flags & T_QUICK)
15178       {
15179         str->q_append(SPIDER_SQL_SQL_QUICK_STR, SPIDER_SQL_SQL_QUICK_LEN);
15180       }
15181       if (spider->action_flags & T_EXTEND)
15182       {
15183         str->q_append(SPIDER_SQL_SQL_EXTENDED_STR,
15184           SPIDER_SQL_SQL_EXTENDED_LEN);
15185       }
15186       break;
15187 #endif
15188     default:
15189       DBUG_ASSERT(0);
15190       DBUG_RETURN(0);
15191   }
15192   pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
15193   pthread_mutex_lock(&conn->mta_conn_mutex);
15194   SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
15195   conn->need_mon = &spider->need_mons[link_idx];
15196   DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
15197   DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
15198   conn->mta_conn_mutex_lock_already = TRUE;
15199   conn->mta_conn_mutex_unlock_later = TRUE;
15200   spider_conn_set_timeout_from_share(conn, link_idx,
15201     spider->wide_handler->trx->thd,
15202     share);
15203   if (
15204     (error_num = spider_db_set_names(spider, conn, link_idx)) ||
15205     (
15206       spider_db_query(
15207         conn,
15208         str->ptr(),
15209         str->length(),
15210         -1,
15211         &spider->need_mons[link_idx]) &&
15212       (error_num = spider_db_errorno(conn))
15213     )
15214   ) {
15215     if (
15216       error_num == ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM &&
15217       !conn->disable_reconnect
15218     ) {
15219       /* retry */
15220       if ((error_num = spider_db_ping(spider, conn, link_idx)))
15221       {
15222         DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15223         DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15224         conn->mta_conn_mutex_lock_already = FALSE;
15225         conn->mta_conn_mutex_unlock_later = FALSE;
15226         SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15227         pthread_mutex_unlock(&conn->mta_conn_mutex);
15228         DBUG_PRINT("info", ("spider error_num=%d 1", error_num));
15229         DBUG_RETURN(error_num);
15230       }
15231       if ((error_num = spider_db_set_names(spider, conn, link_idx)))
15232       {
15233         DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15234         DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15235         conn->mta_conn_mutex_lock_already = FALSE;
15236         conn->mta_conn_mutex_unlock_later = FALSE;
15237         SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15238         pthread_mutex_unlock(&conn->mta_conn_mutex);
15239         DBUG_PRINT("info", ("spider error_num=%d 2", error_num));
15240         DBUG_RETURN(error_num);
15241       }
15242       spider_conn_set_timeout_from_share(conn, link_idx,
15243         spider->wide_handler->trx->thd,
15244         share);
15245       if (spider_db_query(
15246         conn,
15247         str->ptr(),
15248         str->length(),
15249         -1,
15250         &spider->need_mons[link_idx])
15251       ) {
15252         DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15253         DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15254         conn->mta_conn_mutex_lock_already = FALSE;
15255         conn->mta_conn_mutex_unlock_later = FALSE;
15256         DBUG_PRINT("info", ("spider error_num=%d 3", error_num));
15257         DBUG_RETURN(spider_db_errorno(conn));
15258       }
15259     } else {
15260       DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15261       DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15262       conn->mta_conn_mutex_lock_already = FALSE;
15263       conn->mta_conn_mutex_unlock_later = FALSE;
15264       SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15265       pthread_mutex_unlock(&conn->mta_conn_mutex);
15266       DBUG_PRINT("info", ("spider error_num=%d 4", error_num));
15267       DBUG_RETURN(error_num);
15268     }
15269   }
15270   st_spider_db_request_key request_key;
15271   request_key.spider_thread_id = spider->wide_handler->trx->spider_thread_id;
15272   request_key.query_id = spider->wide_handler->trx->thd->query_id;
15273   request_key.handler = spider;
15274   request_key.request_id = 1;
15275   request_key.next = NULL;
15276   if (!(res = conn->db_conn->store_result(NULL, &request_key, &error_num)))
15277   {
15278     DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15279     DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15280     conn->mta_conn_mutex_lock_already = FALSE;
15281     conn->mta_conn_mutex_unlock_later = FALSE;
15282     if (error_num)
15283     {
15284       SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15285       pthread_mutex_unlock(&conn->mta_conn_mutex);
15286       DBUG_PRINT("info", ("spider error_num=%d 5", error_num));
15287       DBUG_RETURN(error_num);
15288     }
15289     else if ((error_num = spider_db_errorno(conn)))
15290     {
15291       DBUG_PRINT("info", ("spider error_num=%d 6", error_num));
15292       DBUG_RETURN(error_num);
15293     } else {
15294       DBUG_PRINT("info", ("spider error_num=%d 7",
15295         ER_QUERY_ON_FOREIGN_DATA_SOURCE));
15296       DBUG_RETURN(ER_QUERY_ON_FOREIGN_DATA_SOURCE);
15297     }
15298   }
15299   DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15300   DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15301   conn->mta_conn_mutex_lock_already = FALSE;
15302   conn->mta_conn_mutex_unlock_later = FALSE;
15303   SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15304   pthread_mutex_unlock(&conn->mta_conn_mutex);
15305   switch (simple_action)
15306   {
15307     case SPIDER_SIMPLE_RECORDS:
15308       DBUG_PRINT("info",("spider simple records"));
15309       error_num = res->fetch_table_records(1, spider->table_rows);
15310       break;
15311 #ifdef HA_HAS_CHECKSUM_EXTENDED
15312     case SPIDER_SIMPLE_CHECKSUM_TABLE:
15313       DBUG_PRINT("info",("spider simple checksum_table"));
15314       error_num = res->fetch_table_checksum(spider);
15315       break;
15316 #endif
15317     default:
15318       DBUG_ASSERT(0);
15319       break;
15320   }
15321   res->free_result();
15322   delete res;
15323   if (error_num)
15324   {
15325     DBUG_PRINT("info", ("spider error_num=%d 7", error_num));
15326     DBUG_RETURN(error_num);
15327   }
15328   DBUG_RETURN(0);
15329 }
15330 
show_records(int link_idx)15331 int spider_mbase_handler::show_records(
15332   int link_idx
15333 ) {
15334   int error_num;
15335   DBUG_ENTER("spider_mbase_handler::show_records");
15336   error_num = simple_action(SPIDER_SIMPLE_RECORDS, link_idx);
15337   if (error_num)
15338   {
15339     DBUG_PRINT("info", ("spider error_num=%d", error_num));
15340     DBUG_RETURN(error_num);
15341   }
15342   spider->wide_handler->trx->direct_aggregate_count++;
15343   DBUG_RETURN(0);
15344 }
15345 
15346 #ifdef HA_HAS_CHECKSUM_EXTENDED
checksum_table(int link_idx)15347 int spider_mbase_handler::checksum_table(
15348   int link_idx
15349 ) {
15350   DBUG_ENTER("spider_mbase_handler::checksum_table");
15351   DBUG_RETURN(simple_action(SPIDER_SIMPLE_CHECKSUM_TABLE, link_idx));
15352   DBUG_RETURN(0);
15353 }
15354 #endif
15355 
show_last_insert_id(int link_idx,ulonglong & last_insert_id)15356 int spider_mbase_handler::show_last_insert_id(
15357   int link_idx,
15358   ulonglong &last_insert_id
15359 ) {
15360   SPIDER_CONN *conn = spider->conns[link_idx];
15361   DBUG_ENTER("spider_mbase_handler::show_last_insert_id");
15362   last_insert_id = conn->db_conn->last_insert_id();
15363   DBUG_RETURN(0);
15364 }
15365 
explain_select(const key_range * start_key,const key_range * end_key,int link_idx)15366 ha_rows spider_mbase_handler::explain_select(
15367   const key_range *start_key,
15368   const key_range *end_key,
15369   int link_idx
15370 ) {
15371   int error_num;
15372   SPIDER_CONN *conn = spider->conns[link_idx];
15373   SPIDER_RESULT_LIST *result_list = &spider->result_list;
15374   spider_string *str = &result_list->sqls[link_idx];
15375   SPIDER_DB_RESULT *res;
15376   ha_rows rows;
15377   spider_db_handler *dbton_hdl = spider->dbton_handler[conn->dbton_id];
15378   DBUG_ENTER("spider_mbase_handler::explain_select");
15379   if ((error_num = dbton_hdl->append_explain_select_part(
15380     start_key, end_key, SPIDER_SQL_TYPE_OTHER_SQL, link_idx)))
15381   {
15382     my_errno = error_num;
15383     DBUG_RETURN(HA_POS_ERROR);
15384   }
15385 
15386   pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
15387   pthread_mutex_lock(&conn->mta_conn_mutex);
15388   SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
15389   conn->need_mon = &spider->need_mons[link_idx];
15390   DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
15391   DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
15392   conn->mta_conn_mutex_lock_already = TRUE;
15393   conn->mta_conn_mutex_unlock_later = TRUE;
15394   spider_conn_set_timeout_from_share(conn, link_idx,
15395     spider->wide_handler->trx->thd,
15396     spider->share);
15397   if (
15398     (error_num = spider_db_set_names(spider, conn, link_idx)) ||
15399     (
15400       spider_db_query(
15401         conn,
15402         str->ptr(),
15403         str->length(),
15404         -1,
15405         &spider->need_mons[link_idx]) &&
15406       (error_num = spider_db_errorno(conn))
15407     )
15408   ) {
15409     if (
15410       error_num == ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM &&
15411       !conn->disable_reconnect
15412     ) {
15413       /* retry */
15414       if ((error_num = spider_db_ping(spider, conn, link_idx)))
15415       {
15416         if (spider->check_error_mode(error_num))
15417           my_errno = error_num;
15418         DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15419         DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15420         conn->mta_conn_mutex_lock_already = FALSE;
15421         conn->mta_conn_mutex_unlock_later = FALSE;
15422         SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15423         pthread_mutex_unlock(&conn->mta_conn_mutex);
15424         DBUG_RETURN(HA_POS_ERROR);
15425       }
15426       if ((error_num = spider_db_set_names(spider, conn, link_idx)))
15427       {
15428         if (spider->check_error_mode(error_num))
15429           my_errno = error_num;
15430         DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15431         DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15432         conn->mta_conn_mutex_lock_already = FALSE;
15433         conn->mta_conn_mutex_unlock_later = FALSE;
15434         SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15435         pthread_mutex_unlock(&conn->mta_conn_mutex);
15436         DBUG_RETURN(HA_POS_ERROR);
15437       }
15438       spider_conn_set_timeout_from_share(conn, link_idx,
15439         spider->wide_handler->trx->thd,
15440         spider->share);
15441       if (spider_db_query(
15442         conn,
15443         str->ptr(),
15444         str->length(),
15445         -1,
15446         &spider->need_mons[link_idx])
15447       ) {
15448         error_num = spider_db_errorno(conn);
15449         if (spider->check_error_mode(error_num))
15450           my_errno = error_num;
15451         DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15452         DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15453         conn->mta_conn_mutex_lock_already = FALSE;
15454         conn->mta_conn_mutex_unlock_later = FALSE;
15455         SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15456         pthread_mutex_unlock(&conn->mta_conn_mutex);
15457         DBUG_RETURN(HA_POS_ERROR);
15458       }
15459     } else {
15460       if (spider->check_error_mode(error_num))
15461         my_errno = error_num;
15462       DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15463       DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15464       conn->mta_conn_mutex_lock_already = FALSE;
15465       conn->mta_conn_mutex_unlock_later = FALSE;
15466       SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15467       pthread_mutex_unlock(&conn->mta_conn_mutex);
15468       DBUG_RETURN(HA_POS_ERROR);
15469     }
15470   }
15471   st_spider_db_request_key request_key;
15472   request_key.spider_thread_id = spider->wide_handler->trx->spider_thread_id;
15473   request_key.query_id = spider->wide_handler->trx->thd->query_id;
15474   request_key.handler = spider;
15475   request_key.request_id = 1;
15476   request_key.next = NULL;
15477   if (!(res = conn->db_conn->store_result(NULL, &request_key, &error_num)))
15478   {
15479     if (error_num || (error_num = spider_db_errorno(conn)))
15480     {
15481       if (spider->check_error_mode(error_num))
15482         my_errno = error_num;
15483       DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15484       DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15485       conn->mta_conn_mutex_lock_already = FALSE;
15486       conn->mta_conn_mutex_unlock_later = FALSE;
15487       SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15488       pthread_mutex_unlock(&conn->mta_conn_mutex);
15489       DBUG_RETURN(HA_POS_ERROR);
15490     } else {
15491       my_errno = ER_QUERY_ON_FOREIGN_DATA_SOURCE;
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 = FALSE;
15495       conn->mta_conn_mutex_unlock_later = FALSE;
15496       SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15497       pthread_mutex_unlock(&conn->mta_conn_mutex);
15498       DBUG_RETURN(HA_POS_ERROR);
15499     }
15500   }
15501   DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15502   DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15503   conn->mta_conn_mutex_lock_already = FALSE;
15504   conn->mta_conn_mutex_unlock_later = FALSE;
15505   SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15506   pthread_mutex_unlock(&conn->mta_conn_mutex);
15507   error_num = res->fetch_table_records(
15508     2,
15509     rows
15510   );
15511   res->free_result();
15512   delete res;
15513   if (error_num)
15514   {
15515     my_errno = error_num;
15516     DBUG_RETURN(HA_POS_ERROR);
15517   }
15518   DBUG_RETURN(rows);
15519 }
15520 
lock_tables(int link_idx)15521 int spider_mbase_handler::lock_tables(
15522   int link_idx
15523 ) {
15524   int error_num;
15525   SPIDER_CONN *conn = spider->conns[link_idx];
15526   spider_string *str = &sql;
15527   DBUG_ENTER("spider_mbase_handler::lock_tables");
15528   str->length(0);
15529   if ((error_num = conn->db_conn->append_lock_tables(str)))
15530   {
15531     DBUG_RETURN(error_num);
15532   }
15533   if (str->length())
15534   {
15535     pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
15536     pthread_mutex_lock(&conn->mta_conn_mutex);
15537     SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
15538     conn->need_mon = &spider->need_mons[link_idx];
15539     DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
15540     DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
15541     conn->mta_conn_mutex_lock_already = TRUE;
15542     conn->mta_conn_mutex_unlock_later = TRUE;
15543     if ((error_num = spider_db_set_names(spider, conn, link_idx)))
15544     {
15545       DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15546       DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15547       conn->mta_conn_mutex_lock_already = FALSE;
15548       conn->mta_conn_mutex_unlock_later = FALSE;
15549       SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15550       pthread_mutex_unlock(&conn->mta_conn_mutex);
15551       DBUG_RETURN(error_num);
15552     }
15553     spider_conn_set_timeout_from_share(conn, link_idx,
15554       spider->wide_handler->trx->thd,
15555       spider->share);
15556     if (spider_db_query(
15557       conn,
15558       str->ptr(),
15559       str->length(),
15560       -1,
15561       &spider->need_mons[link_idx])
15562     ) {
15563       DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15564       DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15565       conn->mta_conn_mutex_lock_already = FALSE;
15566       conn->mta_conn_mutex_unlock_later = FALSE;
15567       DBUG_RETURN(spider_db_errorno(conn));
15568     }
15569     DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15570     DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15571     conn->mta_conn_mutex_lock_already = FALSE;
15572     conn->mta_conn_mutex_unlock_later = FALSE;
15573     SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15574     pthread_mutex_unlock(&conn->mta_conn_mutex);
15575   }
15576   if (!conn->table_locked)
15577   {
15578     conn->table_locked = TRUE;
15579     spider->wide_handler->trx->locked_connections++;
15580   }
15581   DBUG_RETURN(0);
15582 }
15583 
unlock_tables(int link_idx)15584 int spider_mbase_handler::unlock_tables(
15585   int link_idx
15586 ) {
15587   int error_num;
15588   SPIDER_CONN *conn = spider->conns[link_idx];
15589   DBUG_ENTER("spider_mbase_handler::unlock_tables");
15590   if (conn->table_locked)
15591   {
15592     spider_string *str = &sql;
15593     conn->table_locked = FALSE;
15594     spider->wide_handler->trx->locked_connections--;
15595 
15596     str->length(0);
15597     if ((error_num = conn->db_conn->append_unlock_tables(str)))
15598     {
15599       DBUG_RETURN(error_num);
15600     }
15601     if (str->length())
15602     {
15603       spider_conn_set_timeout_from_share(conn, link_idx,
15604         spider->wide_handler->trx->thd,
15605         spider->share);
15606       pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
15607       pthread_mutex_lock(&conn->mta_conn_mutex);
15608       SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
15609       conn->need_mon = &spider->need_mons[link_idx];
15610       DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
15611       DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
15612       conn->mta_conn_mutex_lock_already = TRUE;
15613       conn->mta_conn_mutex_unlock_later = TRUE;
15614       if (spider_db_query(
15615         conn,
15616         str->ptr(),
15617         str->length(),
15618         -1,
15619         &spider->need_mons[link_idx])
15620       ) {
15621         DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15622         DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15623         conn->mta_conn_mutex_lock_already = FALSE;
15624         conn->mta_conn_mutex_unlock_later = FALSE;
15625         DBUG_RETURN(spider_db_errorno(conn));
15626       }
15627       DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15628       DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15629       conn->mta_conn_mutex_lock_already = FALSE;
15630       conn->mta_conn_mutex_unlock_later = FALSE;
15631       SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15632       pthread_mutex_unlock(&conn->mta_conn_mutex);
15633     }
15634   }
15635   DBUG_RETURN(0);
15636 }
15637 
disable_keys(SPIDER_CONN * conn,int link_idx)15638 int spider_mbase_handler::disable_keys(
15639   SPIDER_CONN *conn,
15640   int link_idx
15641 ) {
15642   int error_num;
15643   SPIDER_SHARE *share = spider->share;
15644   spider_string *str = &spider->result_list.sqls[link_idx];
15645   DBUG_ENTER("spider_mbase_handler::disable_keys");
15646   DBUG_PRINT("info",("spider this=%p", this));
15647   str->length(0);
15648   if ((error_num = append_disable_keys_part(SPIDER_SQL_TYPE_OTHER_HS,
15649     link_idx)))
15650   {
15651     DBUG_RETURN(error_num);
15652   }
15653   pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
15654   pthread_mutex_lock(&conn->mta_conn_mutex);
15655   SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
15656   conn->need_mon = &spider->need_mons[link_idx];
15657   DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
15658   DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
15659   conn->mta_conn_mutex_lock_already = TRUE;
15660   conn->mta_conn_mutex_unlock_later = TRUE;
15661   if ((error_num = spider_db_set_names(spider, conn, link_idx)))
15662   {
15663     DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15664     DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15665     conn->mta_conn_mutex_lock_already = FALSE;
15666     conn->mta_conn_mutex_unlock_later = FALSE;
15667     SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15668     pthread_mutex_unlock(&conn->mta_conn_mutex);
15669     DBUG_RETURN(error_num);
15670   }
15671   spider_conn_set_timeout_from_share(conn, link_idx,
15672     spider->wide_handler->trx->thd,
15673     share);
15674   if (spider_db_query(
15675     conn,
15676     str->ptr(),
15677     str->length(),
15678     -1,
15679     &spider->need_mons[link_idx])
15680   ) {
15681     DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15682     DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15683     conn->mta_conn_mutex_lock_already = FALSE;
15684     conn->mta_conn_mutex_unlock_later = FALSE;
15685     error_num = spider_db_errorno(conn);
15686     DBUG_RETURN(error_num);
15687   }
15688   DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15689   DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15690   conn->mta_conn_mutex_lock_already = FALSE;
15691   conn->mta_conn_mutex_unlock_later = FALSE;
15692   SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15693   pthread_mutex_unlock(&conn->mta_conn_mutex);
15694   DBUG_RETURN(0);
15695 }
15696 
enable_keys(SPIDER_CONN * conn,int link_idx)15697 int spider_mbase_handler::enable_keys(
15698   SPIDER_CONN *conn,
15699   int link_idx
15700 ) {
15701   int error_num;
15702   SPIDER_SHARE *share = spider->share;
15703   spider_string *str = &spider->result_list.sqls[link_idx];
15704   DBUG_ENTER("spider_mbase_handler::enable_keys");
15705   DBUG_PRINT("info",("spider this=%p", this));
15706   str->length(0);
15707   if ((error_num = append_enable_keys_part(SPIDER_SQL_TYPE_OTHER_HS,
15708     link_idx)))
15709   {
15710     DBUG_RETURN(error_num);
15711   }
15712   pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
15713   pthread_mutex_lock(&conn->mta_conn_mutex);
15714   SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
15715   conn->need_mon = &spider->need_mons[link_idx];
15716   DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
15717   DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
15718   conn->mta_conn_mutex_lock_already = TRUE;
15719   conn->mta_conn_mutex_unlock_later = TRUE;
15720   if ((error_num = spider_db_set_names(spider, conn, link_idx)))
15721   {
15722     DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15723     DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15724     conn->mta_conn_mutex_lock_already = FALSE;
15725     conn->mta_conn_mutex_unlock_later = FALSE;
15726     SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15727     pthread_mutex_unlock(&conn->mta_conn_mutex);
15728     DBUG_RETURN(error_num);
15729   }
15730   spider_conn_set_timeout_from_share(conn, link_idx,
15731     spider->wide_handler->trx->thd,
15732     share);
15733   if (spider_db_query(
15734     conn,
15735     str->ptr(),
15736     str->length(),
15737     -1,
15738     &spider->need_mons[link_idx])
15739   ) {
15740     DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15741     DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15742     conn->mta_conn_mutex_lock_already = FALSE;
15743     conn->mta_conn_mutex_unlock_later = FALSE;
15744     error_num = spider_db_errorno(conn);
15745     DBUG_RETURN(error_num);
15746   }
15747   DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15748   DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15749   conn->mta_conn_mutex_lock_already = FALSE;
15750   conn->mta_conn_mutex_unlock_later = FALSE;
15751   SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15752   pthread_mutex_unlock(&conn->mta_conn_mutex);
15753   DBUG_RETURN(0);
15754 }
15755 
check_table(SPIDER_CONN * conn,int link_idx,HA_CHECK_OPT * check_opt)15756 int spider_mbase_handler::check_table(
15757   SPIDER_CONN *conn,
15758   int link_idx,
15759   HA_CHECK_OPT* check_opt
15760 ) {
15761   int error_num;
15762   SPIDER_SHARE *share = spider->share;
15763   spider_string *str = &spider->result_list.sqls[link_idx];
15764   DBUG_ENTER("spider_mbase_handler::check_table");
15765   DBUG_PRINT("info",("spider this=%p", this));
15766   str->length(0);
15767   if ((error_num = append_check_table_part(SPIDER_SQL_TYPE_OTHER_HS,
15768     link_idx, check_opt)))
15769   {
15770     DBUG_RETURN(error_num);
15771   }
15772   pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
15773   pthread_mutex_lock(&conn->mta_conn_mutex);
15774   SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
15775   conn->need_mon = &spider->need_mons[link_idx];
15776   DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
15777   DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
15778   conn->mta_conn_mutex_lock_already = TRUE;
15779   conn->mta_conn_mutex_unlock_later = TRUE;
15780   if ((error_num = spider_db_set_names(spider, conn, link_idx)))
15781   {
15782     DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15783     DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15784     conn->mta_conn_mutex_lock_already = FALSE;
15785     conn->mta_conn_mutex_unlock_later = FALSE;
15786     SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15787     pthread_mutex_unlock(&conn->mta_conn_mutex);
15788     DBUG_RETURN(error_num);
15789   }
15790   spider_conn_set_timeout_from_share(conn, link_idx,
15791     spider->wide_handler->trx->thd,
15792     share);
15793   if (spider_db_query(
15794     conn,
15795     str->ptr(),
15796     str->length(),
15797     -1,
15798     &spider->need_mons[link_idx])
15799   ) {
15800     DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15801     DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15802     conn->mta_conn_mutex_lock_already = FALSE;
15803     conn->mta_conn_mutex_unlock_later = FALSE;
15804     error_num = spider_db_errorno(conn);
15805     DBUG_RETURN(error_num);
15806   }
15807   DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15808   DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15809   conn->mta_conn_mutex_lock_already = FALSE;
15810   conn->mta_conn_mutex_unlock_later = FALSE;
15811   SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15812   pthread_mutex_unlock(&conn->mta_conn_mutex);
15813   DBUG_RETURN(0);
15814 }
15815 
repair_table(SPIDER_CONN * conn,int link_idx,HA_CHECK_OPT * check_opt)15816 int spider_mbase_handler::repair_table(
15817   SPIDER_CONN *conn,
15818   int link_idx,
15819   HA_CHECK_OPT* check_opt
15820 ) {
15821   int error_num;
15822   SPIDER_SHARE *share = spider->share;
15823   spider_string *str = &spider->result_list.sqls[link_idx];
15824   DBUG_ENTER("spider_mbase_handler::repair_table");
15825   DBUG_PRINT("info",("spider this=%p", this));
15826   str->length(0);
15827   if ((error_num = append_repair_table_part(SPIDER_SQL_TYPE_OTHER_HS,
15828     link_idx, check_opt)))
15829   {
15830     DBUG_RETURN(error_num);
15831   }
15832   pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
15833   pthread_mutex_lock(&conn->mta_conn_mutex);
15834   SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
15835   conn->need_mon = &spider->need_mons[link_idx];
15836   DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
15837   DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
15838   conn->mta_conn_mutex_lock_already = TRUE;
15839   conn->mta_conn_mutex_unlock_later = TRUE;
15840   if ((error_num = spider_db_set_names(spider, conn, link_idx)))
15841   {
15842     DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15843     DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15844     conn->mta_conn_mutex_lock_already = FALSE;
15845     conn->mta_conn_mutex_unlock_later = FALSE;
15846     SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15847     pthread_mutex_unlock(&conn->mta_conn_mutex);
15848     DBUG_RETURN(error_num);
15849   }
15850   spider_conn_set_timeout_from_share(conn, link_idx,
15851     spider->wide_handler->trx->thd,
15852     share);
15853   if (spider_db_query(
15854     conn,
15855     str->ptr(),
15856     str->length(),
15857     -1,
15858     &spider->need_mons[link_idx])
15859   ) {
15860     DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15861     DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15862     conn->mta_conn_mutex_lock_already = FALSE;
15863     conn->mta_conn_mutex_unlock_later = FALSE;
15864     error_num = spider_db_errorno(conn);
15865     DBUG_RETURN(error_num);
15866   }
15867   DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15868   DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15869   conn->mta_conn_mutex_lock_already = FALSE;
15870   conn->mta_conn_mutex_unlock_later = FALSE;
15871   SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15872   pthread_mutex_unlock(&conn->mta_conn_mutex);
15873   DBUG_RETURN(0);
15874 }
15875 
analyze_table(SPIDER_CONN * conn,int link_idx)15876 int spider_mbase_handler::analyze_table(
15877   SPIDER_CONN *conn,
15878   int link_idx
15879 ) {
15880   int error_num;
15881   SPIDER_SHARE *share = spider->share;
15882   spider_string *str = &spider->result_list.sqls[link_idx];
15883   DBUG_ENTER("spider_mbase_handler::analyze_table");
15884   DBUG_PRINT("info",("spider this=%p", this));
15885   str->length(0);
15886   if ((error_num = append_analyze_table_part(SPIDER_SQL_TYPE_OTHER_HS,
15887     link_idx)))
15888   {
15889     DBUG_RETURN(error_num);
15890   }
15891   pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
15892   pthread_mutex_lock(&conn->mta_conn_mutex);
15893   SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
15894   conn->need_mon = &spider->need_mons[link_idx];
15895   DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
15896   DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
15897   conn->mta_conn_mutex_lock_already = TRUE;
15898   conn->mta_conn_mutex_unlock_later = TRUE;
15899   if ((error_num = spider_db_set_names(spider, conn, link_idx)))
15900   {
15901     DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15902     DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15903     conn->mta_conn_mutex_lock_already = FALSE;
15904     conn->mta_conn_mutex_unlock_later = FALSE;
15905     SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15906     pthread_mutex_unlock(&conn->mta_conn_mutex);
15907     DBUG_RETURN(error_num);
15908   }
15909   spider_conn_set_timeout_from_share(conn, link_idx,
15910     spider->wide_handler->trx->thd,
15911     share);
15912   if (spider_db_query(
15913     conn,
15914     str->ptr(),
15915     str->length(),
15916     -1,
15917     &spider->need_mons[link_idx])
15918   ) {
15919     DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15920     DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15921     conn->mta_conn_mutex_lock_already = FALSE;
15922     conn->mta_conn_mutex_unlock_later = FALSE;
15923     error_num = spider_db_errorno(conn);
15924     DBUG_RETURN(error_num);
15925   }
15926   DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15927   DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15928   conn->mta_conn_mutex_lock_already = FALSE;
15929   conn->mta_conn_mutex_unlock_later = FALSE;
15930   SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15931   pthread_mutex_unlock(&conn->mta_conn_mutex);
15932   DBUG_RETURN(0);
15933 }
15934 
optimize_table(SPIDER_CONN * conn,int link_idx)15935 int spider_mbase_handler::optimize_table(
15936   SPIDER_CONN *conn,
15937   int link_idx
15938 ) {
15939   int error_num;
15940   SPIDER_SHARE *share = spider->share;
15941   spider_string *str = &spider->result_list.sqls[link_idx];
15942   DBUG_ENTER("spider_mbase_handler::optimize_table");
15943   DBUG_PRINT("info",("spider this=%p", this));
15944   str->length(0);
15945   if ((error_num = append_optimize_table_part(SPIDER_SQL_TYPE_OTHER_HS,
15946     link_idx)))
15947   {
15948     DBUG_RETURN(error_num);
15949   }
15950   pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
15951   pthread_mutex_lock(&conn->mta_conn_mutex);
15952   SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
15953   conn->need_mon = &spider->need_mons[link_idx];
15954   DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
15955   DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
15956   conn->mta_conn_mutex_lock_already = TRUE;
15957   conn->mta_conn_mutex_unlock_later = TRUE;
15958   if ((error_num = spider_db_set_names(spider, conn, link_idx)))
15959   {
15960     DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15961     DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15962     conn->mta_conn_mutex_lock_already = FALSE;
15963     conn->mta_conn_mutex_unlock_later = FALSE;
15964     SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15965     pthread_mutex_unlock(&conn->mta_conn_mutex);
15966     DBUG_RETURN(error_num);
15967   }
15968   spider_conn_set_timeout_from_share(conn, link_idx,
15969     spider->wide_handler->trx->thd,
15970     share);
15971   if (spider_db_query(
15972     conn,
15973     str->ptr(),
15974     str->length(),
15975     -1,
15976     &spider->need_mons[link_idx])
15977   ) {
15978     DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15979     DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15980     conn->mta_conn_mutex_lock_already = FALSE;
15981     conn->mta_conn_mutex_unlock_later = FALSE;
15982     error_num = spider_db_errorno(conn);
15983     DBUG_RETURN(error_num);
15984   }
15985   DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15986   DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15987   conn->mta_conn_mutex_lock_already = FALSE;
15988   conn->mta_conn_mutex_unlock_later = FALSE;
15989   SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15990   pthread_mutex_unlock(&conn->mta_conn_mutex);
15991   DBUG_RETURN(0);
15992 }
15993 
flush_tables(SPIDER_CONN * conn,int link_idx,bool lock)15994 int spider_mbase_handler::flush_tables(
15995   SPIDER_CONN *conn,
15996   int link_idx,
15997   bool lock
15998 ) {
15999   int error_num;
16000   SPIDER_SHARE *share = spider->share;
16001   spider_string *str = &spider->result_list.sqls[link_idx];
16002   DBUG_ENTER("spider_mbase_handler::flush_tables");
16003   DBUG_PRINT("info",("spider this=%p", this));
16004   str->length(0);
16005   if ((error_num = append_flush_tables_part(SPIDER_SQL_TYPE_OTHER_HS,
16006     link_idx, lock)))
16007   {
16008     DBUG_RETURN(error_num);
16009   }
16010   spider_conn_set_timeout_from_share(conn, link_idx,
16011     spider->wide_handler->trx->thd,
16012     share);
16013   pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
16014   pthread_mutex_lock(&conn->mta_conn_mutex);
16015   SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
16016   conn->need_mon = &spider->need_mons[link_idx];
16017   DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
16018   DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
16019   conn->mta_conn_mutex_lock_already = TRUE;
16020   conn->mta_conn_mutex_unlock_later = TRUE;
16021   if (spider_db_query(
16022     conn,
16023     str->ptr(),
16024     str->length(),
16025     -1,
16026     &spider->need_mons[link_idx])
16027   ) {
16028     DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
16029     DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
16030     conn->mta_conn_mutex_lock_already = FALSE;
16031     conn->mta_conn_mutex_unlock_later = FALSE;
16032     error_num = spider_db_errorno(conn);
16033     DBUG_RETURN(error_num);
16034   }
16035   DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
16036   DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
16037   conn->mta_conn_mutex_lock_already = FALSE;
16038   conn->mta_conn_mutex_unlock_later = FALSE;
16039   SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
16040   pthread_mutex_unlock(&conn->mta_conn_mutex);
16041   DBUG_RETURN(0);
16042 }
16043 
flush_logs(SPIDER_CONN * conn,int link_idx)16044 int spider_mbase_handler::flush_logs(
16045   SPIDER_CONN *conn,
16046   int link_idx
16047 ) {
16048   int error_num;
16049   SPIDER_SHARE *share = spider->share;
16050   DBUG_ENTER("spider_mbase_handler::flush_logs");
16051   DBUG_PRINT("info",("spider this=%p", this));
16052   spider_conn_set_timeout_from_share(conn, link_idx,
16053     spider->wide_handler->trx->thd,
16054     share);
16055   pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
16056   pthread_mutex_lock(&conn->mta_conn_mutex);
16057   SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
16058   conn->need_mon = &spider->need_mons[link_idx];
16059   DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
16060   DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
16061   conn->mta_conn_mutex_lock_already = TRUE;
16062   conn->mta_conn_mutex_unlock_later = TRUE;
16063   if (spider_db_query(
16064     conn,
16065     SPIDER_SQL_FLUSH_LOGS_STR,
16066     SPIDER_SQL_FLUSH_LOGS_LEN,
16067     -1,
16068     &spider->need_mons[link_idx])
16069   ) {
16070     DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
16071     DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
16072     conn->mta_conn_mutex_lock_already = FALSE;
16073     conn->mta_conn_mutex_unlock_later = FALSE;
16074     error_num = spider_db_errorno(conn);
16075     DBUG_RETURN(error_num);
16076   }
16077   DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
16078   DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
16079   conn->mta_conn_mutex_lock_already = FALSE;
16080   conn->mta_conn_mutex_unlock_later = FALSE;
16081   SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
16082   pthread_mutex_unlock(&conn->mta_conn_mutex);
16083   DBUG_RETURN(0);
16084 }
16085 
insert_opened_handler(SPIDER_CONN * conn,int link_idx)16086 int spider_mbase_handler::insert_opened_handler(
16087   SPIDER_CONN *conn,
16088   int link_idx
16089 ) {
16090   spider_db_mbase *db_conn = (spider_db_mbase *) conn->db_conn;
16091   SPIDER_LINK_FOR_HASH *tmp_link_for_hash = &link_for_hash[link_idx];
16092   DBUG_ASSERT(tmp_link_for_hash->spider == spider);
16093   DBUG_ASSERT(tmp_link_for_hash->link_idx == link_idx);
16094   uint old_elements = db_conn->handler_open_array.max_element;
16095   DBUG_ENTER("spider_mbase_handler::insert_opened_handler");
16096   DBUG_PRINT("info",("spider this=%p", this));
16097   if (insert_dynamic(&db_conn->handler_open_array,
16098     (uchar*) &tmp_link_for_hash))
16099   {
16100     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16101   }
16102   if (db_conn->handler_open_array.max_element > old_elements)
16103   {
16104     spider_alloc_calc_mem(spider_current_trx,
16105       db_conn->handler_open_array,
16106       (db_conn->handler_open_array.max_element - old_elements) *
16107       db_conn->handler_open_array.size_of_element);
16108   }
16109   DBUG_RETURN(0);
16110 }
16111 
delete_opened_handler(SPIDER_CONN * conn,int link_idx)16112 int spider_mbase_handler::delete_opened_handler(
16113   SPIDER_CONN *conn,
16114   int link_idx
16115 ) {
16116   spider_db_mbase *db_conn = (spider_db_mbase *) conn->db_conn;
16117   uint roop_count, elements = db_conn->handler_open_array.elements;
16118   SPIDER_LINK_FOR_HASH *tmp_link_for_hash;
16119   DBUG_ENTER("spider_mbase_handler::delete_opened_handler");
16120   DBUG_PRINT("info",("spider this=%p", this));
16121   for (roop_count = 0; roop_count < elements; roop_count++)
16122   {
16123     get_dynamic(&db_conn->handler_open_array, (uchar *) &tmp_link_for_hash,
16124       roop_count);
16125     if (tmp_link_for_hash == &link_for_hash[link_idx])
16126     {
16127       delete_dynamic_element(&db_conn->handler_open_array, roop_count);
16128       break;
16129     }
16130   }
16131   DBUG_ASSERT(roop_count < elements);
16132   DBUG_RETURN(0);
16133 }
16134 
sync_from_clone_source(spider_db_handler * dbton_hdl)16135 int spider_mbase_handler::sync_from_clone_source(
16136   spider_db_handler *dbton_hdl
16137 ) {
16138   DBUG_ENTER("spider_mbase_handler::sync_from_clone_source");
16139   DBUG_PRINT("info",("spider this=%p", this));
16140   DBUG_RETURN(0);
16141 }
16142 
support_use_handler(int use_handler)16143 bool spider_mbase_handler::support_use_handler(
16144   int use_handler
16145 ) {
16146   DBUG_ENTER("spider_mbase_handler::support_use_handler");
16147   DBUG_PRINT("info",("spider this=%p", this));
16148   DBUG_RETURN(TRUE);
16149 }
16150 
minimum_select_bitmap_create()16151 void spider_mbase_handler::minimum_select_bitmap_create()
16152 {
16153   TABLE *table = spider->get_table();
16154   Field **field_p;
16155   DBUG_ENTER("spider_mbase_handler::minimum_select_bitmap_create");
16156   DBUG_PRINT("info",("spider this=%p", this));
16157   memset(minimum_select_bitmap, 0, no_bytes_in_map(table->read_set));
16158   if (
16159     spider->use_index_merge ||
16160 #ifdef HA_CAN_BULK_ACCESS
16161     (spider->is_clone && !spider->is_bulk_access_clone)
16162 #else
16163     spider->is_clone
16164 #endif
16165   ) {
16166     /* need preparing for cmp_ref */
16167     TABLE_SHARE *table_share = table->s;
16168     if (
16169       table_share->primary_key == MAX_KEY
16170     ) {
16171       /* need all columns */
16172       memset(minimum_select_bitmap, 0xFF, no_bytes_in_map(table->read_set));
16173       DBUG_VOID_RETURN;
16174     } else {
16175       /* need primary key columns */
16176       uint roop_count;
16177       KEY *key_info;
16178       KEY_PART_INFO *key_part;
16179       Field *field;
16180       key_info = &table_share->key_info[table_share->primary_key];
16181       key_part = key_info->key_part;
16182       for (roop_count = 0;
16183         roop_count < spider_user_defined_key_parts(key_info);
16184         roop_count++)
16185       {
16186         field = key_part[roop_count].field;
16187         spider_set_bit(minimum_select_bitmap, field->field_index);
16188       }
16189     }
16190   }
16191   DBUG_PRINT("info",("spider searched_bitmap=%p",
16192     spider->wide_handler->searched_bitmap));
16193   for (field_p = table->field; *field_p; field_p++)
16194   {
16195     uint field_index = (*field_p)->field_index;
16196     DBUG_PRINT("info",("spider field_index=%u", field_index));
16197     DBUG_PRINT("info",("spider ft_discard_bitmap=%s",
16198       spider_bit_is_set(spider->wide_handler->ft_discard_bitmap, field_index) ?
16199         "TRUE" : "FALSE"));
16200     DBUG_PRINT("info",("spider searched_bitmap=%s",
16201       spider_bit_is_set(spider->wide_handler->searched_bitmap, field_index) ?
16202         "TRUE" : "FALSE"));
16203     DBUG_PRINT("info",("spider read_set=%s",
16204       bitmap_is_set(table->read_set, field_index) ?
16205         "TRUE" : "FALSE"));
16206     DBUG_PRINT("info",("spider write_set=%s",
16207       bitmap_is_set(table->write_set, field_index) ?
16208         "TRUE" : "FALSE"));
16209     if (
16210       spider_bit_is_set(spider->wide_handler->ft_discard_bitmap, field_index) &&
16211       (
16212         spider_bit_is_set(spider->wide_handler->searched_bitmap, field_index) ||
16213         bitmap_is_set(table->read_set, field_index) ||
16214         bitmap_is_set(table->write_set, field_index)
16215       )
16216     ) {
16217       spider_set_bit(minimum_select_bitmap, field_index);
16218     }
16219   }
16220   DBUG_VOID_RETURN;
16221 }
16222 
minimum_select_bit_is_set(uint field_index)16223 bool spider_mbase_handler::minimum_select_bit_is_set(
16224   uint field_index
16225 ) {
16226   DBUG_ENTER("spider_mbase_handler::minimum_select_bit_is_set");
16227   DBUG_PRINT("info",("spider this=%p", this));
16228   DBUG_PRINT("info",("spider field_index=%u", field_index));
16229   DBUG_PRINT("info",("spider minimum_select_bitmap=%s",
16230     spider_bit_is_set(minimum_select_bitmap, field_index) ?
16231       "TRUE" : "FALSE"));
16232   DBUG_RETURN(spider_bit_is_set(minimum_select_bitmap, field_index));
16233 }
16234 
copy_minimum_select_bitmap(uchar * bitmap)16235 void spider_mbase_handler::copy_minimum_select_bitmap(
16236   uchar *bitmap
16237 ) {
16238   int roop_count;
16239   TABLE *table = spider->get_table();
16240   DBUG_ENTER("spider_mbase_handler::copy_minimum_select_bitmap");
16241   for (roop_count = 0;
16242     roop_count < (int) ((table->s->fields + 7) / 8);
16243     roop_count++)
16244   {
16245     bitmap[roop_count] =
16246       minimum_select_bitmap[roop_count];
16247     DBUG_PRINT("info",("spider roop_count=%d", roop_count));
16248     DBUG_PRINT("info",("spider bitmap=%d",
16249       bitmap[roop_count]));
16250   }
16251   DBUG_VOID_RETURN;
16252 }
16253 
init_union_table_name_pos()16254 int spider_mbase_handler::init_union_table_name_pos()
16255 {
16256   DBUG_ENTER("spider_mbase_handler::init_union_table_name_pos");
16257   DBUG_PRINT("info",("spider this=%p", this));
16258   if (!union_table_name_pos_first)
16259   {
16260     if (!spider_bulk_malloc(spider_current_trx, 236, MYF(MY_WME),
16261       &union_table_name_pos_first, (uint) (sizeof(SPIDER_INT_HLD)),
16262       NullS)
16263     ) {
16264       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16265     }
16266     union_table_name_pos_first->next = NULL;
16267   }
16268   union_table_name_pos_current = union_table_name_pos_first;
16269   union_table_name_pos_current->tgt_num = 0;
16270   DBUG_RETURN(0);
16271 }
16272 
set_union_table_name_pos()16273 int spider_mbase_handler::set_union_table_name_pos()
16274 {
16275   DBUG_ENTER("spider_mbase_handler::set_union_table_name_pos");
16276   DBUG_PRINT("info",("spider this=%p", this));
16277   if (union_table_name_pos_current->tgt_num >= SPIDER_INT_HLD_TGT_SIZE)
16278   {
16279     if (!union_table_name_pos_current->next)
16280     {
16281       if (!spider_bulk_malloc(spider_current_trx, 237, MYF(MY_WME),
16282         &union_table_name_pos_current->next, (uint) (sizeof(SPIDER_INT_HLD)),
16283         NullS)
16284       ) {
16285         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16286       }
16287       union_table_name_pos_current->next->next = NULL;
16288     }
16289     union_table_name_pos_current = union_table_name_pos_current->next;
16290     union_table_name_pos_current->tgt_num = 0;
16291   }
16292   union_table_name_pos_current->tgt[union_table_name_pos_current->tgt_num] =
16293     table_name_pos;
16294   ++union_table_name_pos_current->tgt_num;
16295   DBUG_RETURN(0);
16296 }
16297 
reset_union_table_name(spider_string * str,int link_idx,ulong sql_type)16298 int spider_mbase_handler::reset_union_table_name(
16299   spider_string *str,
16300   int link_idx,
16301   ulong sql_type
16302 ) {
16303   DBUG_ENTER("spider_mbase_handler::reset_union_table_name");
16304   DBUG_PRINT("info",("spider this=%p", this));
16305   if (!union_table_name_pos_current)
16306     DBUG_RETURN(0);
16307 
16308   SPIDER_INT_HLD *tmp_pos = union_table_name_pos_first;
16309   uint cur_num, pos_backup = str->length();
16310   while(TRUE)
16311   {
16312     for (cur_num = 0; cur_num < tmp_pos->tgt_num; ++cur_num)
16313     {
16314       str->length(tmp_pos->tgt[cur_num]);
16315       append_table_name_with_adjusting(str, link_idx, sql_type);
16316     }
16317     if (tmp_pos == union_table_name_pos_current)
16318       break;
16319     tmp_pos = tmp_pos->next;
16320   }
16321   str->length(pos_backup);
16322   DBUG_RETURN(0);
16323 }
16324 
16325 #ifdef SPIDER_HAS_GROUP_BY_HANDLER
append_from_and_tables_part(spider_fields * fields,ulong sql_type)16326 int spider_mbase_handler::append_from_and_tables_part(
16327   spider_fields *fields,
16328   ulong sql_type
16329 ) {
16330   int error_num;
16331   spider_string *str;
16332   SPIDER_TABLE_HOLDER *table_holder;
16333   TABLE_LIST *table_list;
16334   DBUG_ENTER("spider_mbase_handler::append_from_and_tables_part");
16335   DBUG_PRINT("info",("spider this=%p", this));
16336   switch (sql_type)
16337   {
16338     case SPIDER_SQL_TYPE_SELECT_SQL:
16339       str = &sql;
16340       break;
16341     default:
16342       DBUG_RETURN(0);
16343   }
16344   fields->set_pos_to_first_table_holder();
16345   table_holder = fields->get_next_table_holder();
16346   table_list = table_holder->table->pos_in_table_list;
16347   error_num = spider_db_mbase_utility->append_from_and_tables(
16348     table_holder->spider, fields, str,
16349     table_list, fields->get_table_count());
16350   DBUG_RETURN(error_num);
16351 }
16352 
reappend_tables_part(spider_fields * fields,ulong sql_type)16353 int spider_mbase_handler::reappend_tables_part(
16354   spider_fields *fields,
16355   ulong sql_type
16356 ) {
16357   int error_num;
16358   spider_string *str;
16359   DBUG_ENTER("spider_mbase_handler::reappend_tables_part");
16360   DBUG_PRINT("info",("spider this=%p", this));
16361   switch (sql_type)
16362   {
16363     case SPIDER_SQL_TYPE_SELECT_SQL:
16364       str = &sql;
16365       break;
16366     default:
16367       DBUG_RETURN(0);
16368   }
16369   error_num = spider_db_mbase_utility->reappend_tables(fields,
16370     link_idx_chain, str);
16371   DBUG_RETURN(error_num);
16372 }
16373 
append_where_part(ulong sql_type)16374 int spider_mbase_handler::append_where_part(
16375   ulong sql_type
16376 ) {
16377   int error_num;
16378   spider_string *str;
16379   DBUG_ENTER("spider_mbase_handler::append_where_part");
16380   DBUG_PRINT("info",("spider this=%p", this));
16381   switch (sql_type)
16382   {
16383     case SPIDER_SQL_TYPE_SELECT_SQL:
16384       str = &sql;
16385       break;
16386     default:
16387       DBUG_RETURN(0);
16388   }
16389   error_num = spider_db_mbase_utility->append_where(str);
16390   DBUG_RETURN(error_num);
16391 }
16392 
append_having_part(ulong sql_type)16393 int spider_mbase_handler::append_having_part(
16394   ulong sql_type
16395 ) {
16396   int error_num;
16397   spider_string *str;
16398   DBUG_ENTER("spider_mbase_handler::append_having_part");
16399   DBUG_PRINT("info",("spider this=%p", this));
16400   switch (sql_type)
16401   {
16402     case SPIDER_SQL_TYPE_SELECT_SQL:
16403       str = &sql;
16404       break;
16405     default:
16406       DBUG_RETURN(0);
16407   }
16408   error_num = spider_db_mbase_utility->append_having(str);
16409   DBUG_RETURN(error_num);
16410 }
16411 
append_item_type_part(Item * item,const char * alias,uint alias_length,bool use_fields,spider_fields * fields,ulong sql_type)16412 int spider_mbase_handler::append_item_type_part(
16413   Item *item,
16414   const char *alias,
16415   uint alias_length,
16416   bool use_fields,
16417   spider_fields *fields,
16418   ulong sql_type
16419 ) {
16420   int error_num;
16421   spider_string *str;
16422   DBUG_ENTER("spider_mbase_handler::append_item_type_part");
16423   DBUG_PRINT("info",("spider this=%p", this));
16424   switch (sql_type)
16425   {
16426     case SPIDER_SQL_TYPE_SELECT_SQL:
16427       str = &sql;
16428       break;
16429     default:
16430       DBUG_RETURN(0);
16431   }
16432   error_num = spider_db_print_item_type(item, NULL, spider, str,
16433     alias, alias_length, dbton_id, use_fields, fields);
16434   DBUG_RETURN(error_num);
16435 }
16436 
append_list_item_select_part(List<Item> * select,const char * alias,uint alias_length,bool use_fields,spider_fields * fields,ulong sql_type)16437 int spider_mbase_handler::append_list_item_select_part(
16438   List<Item> *select,
16439   const char *alias,
16440   uint alias_length,
16441   bool use_fields,
16442   spider_fields *fields,
16443   ulong sql_type
16444 ) {
16445   int error_num;
16446   spider_string *str;
16447   DBUG_ENTER("spider_mbase_handler::append_list_item_select_part");
16448   DBUG_PRINT("info",("spider this=%p", this));
16449   switch (sql_type)
16450   {
16451     case SPIDER_SQL_TYPE_SELECT_SQL:
16452       str = &sql;
16453       break;
16454     default:
16455       DBUG_RETURN(0);
16456   }
16457   error_num = append_list_item_select(select, str, alias, alias_length,
16458     use_fields, fields);
16459   DBUG_RETURN(error_num);
16460 }
16461 
append_list_item_select(List<Item> * select,spider_string * str,const char * alias,uint alias_length,bool use_fields,spider_fields * fields)16462 int spider_mbase_handler::append_list_item_select(
16463   List<Item> *select,
16464   spider_string *str,
16465   const char *alias,
16466   uint alias_length,
16467   bool use_fields,
16468   spider_fields *fields
16469 ) {
16470   int error_num;
16471   uint32 length, begin;
16472   List_iterator_fast<Item> it(*select);
16473   Item *item;
16474   Field *field;
16475   const char *item_name;
16476   DBUG_ENTER("spider_mbase_handler::append_list_item_select");
16477   DBUG_PRINT("info",("spider this=%p", this));
16478   begin = str->length();
16479   while ((item = it++))
16480   {
16481     if (item->const_item())
16482     {
16483       DBUG_PRINT("info",("spider const item"));
16484       continue;
16485     }
16486     if ((error_num = spider_db_print_item_type(item, NULL, spider, str,
16487       alias, alias_length, dbton_id, use_fields, fields)))
16488     {
16489       DBUG_RETURN(error_num);
16490     }
16491     field = *(fields->get_next_field_ptr());
16492     if (field)
16493     {
16494       item_name = SPIDER_field_name_str(field);
16495       length = SPIDER_field_name_length(field);
16496     } else {
16497       item_name = SPIDER_item_name_str(item);
16498       length = SPIDER_item_name_length(item);
16499     }
16500     if (str->reserve(
16501       SPIDER_SQL_COMMA_LEN + /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
16502       SPIDER_SQL_SPACE_LEN + length
16503     ))
16504       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16505     str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
16506     if ((error_num = spider_db_mbase_utility->append_escaped_name(str,
16507       item_name, length)))
16508     {
16509       DBUG_RETURN(error_num);
16510     }
16511     str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
16512   }
16513   if (begin == str->length())
16514   {
16515     /* no columns */
16516     if (str->reserve(SPIDER_SQL_ONE_LEN))
16517     {
16518       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16519     }
16520     str->q_append(SPIDER_SQL_ONE_STR, SPIDER_SQL_ONE_LEN);
16521   } else {
16522     str->length(str->length() - SPIDER_SQL_COMMA_LEN);
16523   }
16524   DBUG_RETURN(0);
16525 }
16526 
append_group_by_part(ORDER * order,const char * alias,uint alias_length,bool use_fields,spider_fields * fields,ulong sql_type)16527 int spider_mbase_handler::append_group_by_part(
16528   ORDER *order,
16529   const char *alias,
16530   uint alias_length,
16531   bool use_fields,
16532   spider_fields *fields,
16533   ulong sql_type
16534 ) {
16535   int error_num;
16536   spider_string *str;
16537   DBUG_ENTER("spider_mbase_handler::append_group_by_part");
16538   DBUG_PRINT("info",("spider this=%p", this));
16539   switch (sql_type)
16540   {
16541     case SPIDER_SQL_TYPE_SELECT_SQL:
16542       str = &sql;
16543       break;
16544     default:
16545       DBUG_RETURN(0);
16546   }
16547   error_num = append_group_by(order, str, alias, alias_length,
16548     use_fields, fields);
16549   DBUG_RETURN(error_num);
16550 }
16551 
append_group_by(ORDER * order,spider_string * str,const char * alias,uint alias_length,bool use_fields,spider_fields * fields)16552 int spider_mbase_handler::append_group_by(
16553   ORDER *order,
16554   spider_string *str,
16555   const char *alias,
16556   uint alias_length,
16557   bool use_fields,
16558   spider_fields *fields
16559 ) {
16560   int error_num;
16561   DBUG_ENTER("spider_mbase_handler::append_group_by");
16562   DBUG_PRINT("info",("spider this=%p", this));
16563   if (order)
16564   {
16565     if (str->reserve(SPIDER_SQL_GROUP_LEN))
16566       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16567     str->q_append(SPIDER_SQL_GROUP_STR, SPIDER_SQL_GROUP_LEN);
16568     for (; order; order = order->next)
16569     {
16570       if ((error_num = spider_db_print_item_type((*order->item), NULL, spider,
16571         str, alias, alias_length, dbton_id, use_fields, fields)))
16572       {
16573         DBUG_RETURN(error_num);
16574       }
16575       if (str->reserve(SPIDER_SQL_COMMA_LEN))
16576         DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16577       str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
16578     }
16579     str->length(str->length() - SPIDER_SQL_COMMA_LEN);
16580   }
16581   DBUG_RETURN(0);
16582 }
16583 
append_order_by_part(ORDER * order,const char * alias,uint alias_length,bool use_fields,spider_fields * fields,ulong sql_type)16584 int spider_mbase_handler::append_order_by_part(
16585   ORDER *order,
16586   const char *alias,
16587   uint alias_length,
16588   bool use_fields,
16589   spider_fields *fields,
16590   ulong sql_type
16591 ) {
16592   int error_num;
16593   spider_string *str;
16594   DBUG_ENTER("spider_mbase_handler::append_order_by_part");
16595   DBUG_PRINT("info",("spider this=%p", this));
16596   switch (sql_type)
16597   {
16598     case SPIDER_SQL_TYPE_SELECT_SQL:
16599       str = &sql;
16600       break;
16601     default:
16602       DBUG_RETURN(0);
16603   }
16604   error_num = append_order_by(order, str, alias, alias_length,
16605     use_fields, fields);
16606   DBUG_RETURN(error_num);
16607 }
16608 
append_order_by(ORDER * order,spider_string * str,const char * alias,uint alias_length,bool use_fields,spider_fields * fields)16609 int spider_mbase_handler::append_order_by(
16610   ORDER *order,
16611   spider_string *str,
16612   const char *alias,
16613   uint alias_length,
16614   bool use_fields,
16615   spider_fields *fields
16616 ) {
16617   int error_num;
16618   DBUG_ENTER("spider_mbase_handler::append_order_by");
16619   DBUG_PRINT("info",("spider this=%p", this));
16620   if (order)
16621   {
16622     if (str->reserve(SPIDER_SQL_ORDER_LEN))
16623       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16624     str->q_append(SPIDER_SQL_ORDER_STR, SPIDER_SQL_ORDER_LEN);
16625     for (; order; order = order->next)
16626     {
16627       if ((error_num = spider_db_print_item_type((*order->item), NULL, spider,
16628         str, alias, alias_length, dbton_id, use_fields, fields)))
16629       {
16630         DBUG_RETURN(error_num);
16631       }
16632       if (SPIDER_order_direction_is_asc(order))
16633       {
16634         if (str->reserve(SPIDER_SQL_COMMA_LEN))
16635           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16636         str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
16637       } else {
16638         if (str->reserve(SPIDER_SQL_COMMA_LEN + SPIDER_SQL_DESC_LEN))
16639           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16640         str->q_append(SPIDER_SQL_DESC_STR, SPIDER_SQL_DESC_LEN);
16641         str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
16642       }
16643     }
16644     str->length(str->length() - SPIDER_SQL_COMMA_LEN);
16645   }
16646   DBUG_RETURN(0);
16647 }
16648 #endif
16649 
16650 #ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
check_direct_update(st_select_lex * select_lex,longlong select_limit,longlong offset_limit)16651 bool spider_mbase_handler::check_direct_update(
16652   st_select_lex *select_lex,
16653   longlong select_limit,
16654   longlong offset_limit
16655 ) {
16656   DBUG_ENTER("spider_mbase_handler::check_direct_update");
16657   DBUG_PRINT("info",("spider this=%p", this));
16658   DBUG_RETURN(FALSE);
16659 }
16660 
check_direct_delete(st_select_lex * select_lex,longlong select_limit,longlong offset_limit)16661 bool spider_mbase_handler::check_direct_delete(
16662   st_select_lex *select_lex,
16663   longlong select_limit,
16664   longlong offset_limit
16665 ) {
16666   DBUG_ENTER("spider_mbase_handler::check_direct_delete");
16667   DBUG_PRINT("info",("spider this=%p", this));
16668   DBUG_RETURN(FALSE);
16669 }
16670 #endif
16671 
spider_mbase_copy_table(spider_mbase_share * db_share)16672 spider_mbase_copy_table::spider_mbase_copy_table(
16673   spider_mbase_share *db_share
16674 ) : spider_db_copy_table(
16675   db_share
16676 ),
16677   mysql_share(db_share)
16678 {
16679   DBUG_ENTER("spider_mbase_copy_table::spider_mbase_copy_table");
16680   DBUG_PRINT("info",("spider this=%p", this));
16681   DBUG_VOID_RETURN;
16682 }
16683 
spider_mysql_copy_table(spider_mbase_share * db_share)16684 spider_mysql_copy_table::spider_mysql_copy_table(
16685   spider_mbase_share *db_share
16686 ) : spider_mbase_copy_table(
16687   db_share
16688 ) {
16689   DBUG_ENTER("spider_mysql_copy_table::spider_mysql_copy_table");
16690   DBUG_PRINT("info",("spider this=%p", this));
16691   DBUG_VOID_RETURN;
16692 }
16693 
spider_mariadb_copy_table(spider_mbase_share * db_share)16694 spider_mariadb_copy_table::spider_mariadb_copy_table(
16695   spider_mbase_share *db_share
16696 ) : spider_mbase_copy_table(
16697   db_share
16698 ) {
16699   DBUG_ENTER("spider_mariadb_copy_table::spider_mariadb_copy_table");
16700   DBUG_PRINT("info",("spider this=%p", this));
16701   DBUG_VOID_RETURN;
16702 }
16703 
~spider_mbase_copy_table()16704 spider_mbase_copy_table::~spider_mbase_copy_table()
16705 {
16706   DBUG_ENTER("spider_mbase_copy_table::~spider_mbase_copy_table");
16707   DBUG_PRINT("info",("spider this=%p", this));
16708   DBUG_VOID_RETURN;
16709 }
16710 
~spider_mysql_copy_table()16711 spider_mysql_copy_table::~spider_mysql_copy_table()
16712 {
16713   DBUG_ENTER("spider_mysql_copy_table::~spider_mysql_copy_table");
16714   DBUG_PRINT("info",("spider this=%p", this));
16715   DBUG_VOID_RETURN;
16716 }
16717 
~spider_mariadb_copy_table()16718 spider_mariadb_copy_table::~spider_mariadb_copy_table()
16719 {
16720   DBUG_ENTER("spider_mariadb_copy_table::~spider_mariadb_copy_table");
16721   DBUG_PRINT("info",("spider this=%p", this));
16722   DBUG_VOID_RETURN;
16723 }
16724 
init()16725 int spider_mbase_copy_table::init()
16726 {
16727   DBUG_ENTER("spider_mbase_copy_table::init");
16728   DBUG_PRINT("info",("spider this=%p", this));
16729   sql.init_calc_mem(78);
16730   DBUG_RETURN(0);
16731 }
16732 
set_sql_charset(CHARSET_INFO * cs)16733 void spider_mbase_copy_table::set_sql_charset(
16734   CHARSET_INFO *cs
16735 ) {
16736   DBUG_ENTER("spider_mbase_copy_table::set_sql_charset");
16737   DBUG_PRINT("info",("spider this=%p", this));
16738   sql.set_charset(cs);
16739   DBUG_VOID_RETURN;
16740 }
16741 
append_select_str()16742 int spider_mbase_copy_table::append_select_str()
16743 {
16744   DBUG_ENTER("spider_mbase_copy_table::append_select_str");
16745   DBUG_PRINT("info",("spider this=%p", this));
16746   if (sql.reserve(SPIDER_SQL_SELECT_LEN))
16747     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16748   sql.q_append(SPIDER_SQL_SELECT_STR, SPIDER_SQL_SELECT_LEN);
16749   DBUG_RETURN(0);
16750 }
16751 
append_insert_str(int insert_flg)16752 int spider_mbase_copy_table::append_insert_str(
16753   int insert_flg
16754 ) {
16755   DBUG_ENTER("spider_mbase_copy_table::append_insert_str");
16756   DBUG_PRINT("info",("spider this=%p", this));
16757   if (insert_flg & SPIDER_DB_INSERT_REPLACE)
16758   {
16759     if (sql.reserve(SPIDER_SQL_REPLACE_LEN))
16760       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16761     sql.q_append(SPIDER_SQL_REPLACE_STR, SPIDER_SQL_REPLACE_LEN);
16762   } else {
16763     if (sql.reserve(SPIDER_SQL_INSERT_LEN))
16764       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16765     sql.q_append(SPIDER_SQL_INSERT_STR, SPIDER_SQL_INSERT_LEN);
16766   }
16767   if (insert_flg & SPIDER_DB_INSERT_LOW_PRIORITY)
16768   {
16769     if (sql.reserve(SPIDER_SQL_LOW_PRIORITY_LEN))
16770       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16771     sql.q_append(SPIDER_SQL_LOW_PRIORITY_STR, SPIDER_SQL_LOW_PRIORITY_LEN);
16772   }
16773   else if (insert_flg & SPIDER_DB_INSERT_DELAYED)
16774   {
16775     if (sql.reserve(SPIDER_SQL_SQL_DELAYED_LEN))
16776       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16777     sql.q_append(SPIDER_SQL_SQL_DELAYED_STR, SPIDER_SQL_SQL_DELAYED_LEN);
16778   }
16779   else if (insert_flg & SPIDER_DB_INSERT_HIGH_PRIORITY)
16780   {
16781     if (sql.reserve(SPIDER_SQL_HIGH_PRIORITY_LEN))
16782       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16783     sql.q_append(SPIDER_SQL_HIGH_PRIORITY_STR, SPIDER_SQL_HIGH_PRIORITY_LEN);
16784   }
16785   if (insert_flg & SPIDER_DB_INSERT_IGNORE)
16786   {
16787     if (sql.reserve(SPIDER_SQL_SQL_IGNORE_LEN))
16788       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16789     sql.q_append(SPIDER_SQL_SQL_IGNORE_STR, SPIDER_SQL_SQL_IGNORE_LEN);
16790   }
16791   DBUG_RETURN(0);
16792 }
16793 
append_table_columns(TABLE_SHARE * table_share)16794 int spider_mbase_copy_table::append_table_columns(
16795   TABLE_SHARE *table_share
16796 ) {
16797   int error_num;
16798   Field **field;
16799   DBUG_ENTER("spider_mbase_copy_table::append_table_columns");
16800   DBUG_PRINT("info",("spider this=%p", this));
16801   for (field = table_share->field; *field; field++)
16802   {
16803     if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN))
16804       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16805     sql.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
16806     if ((error_num = spider_db_append_name_with_quote_str(&sql,
16807       (*field)->field_name, dbton_id)))
16808       DBUG_RETURN(error_num);
16809     if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN + SPIDER_SQL_COMMA_LEN))
16810       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16811     sql.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
16812     sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
16813   }
16814   sql.length(sql.length() - SPIDER_SQL_COMMA_LEN);
16815   DBUG_RETURN(0);
16816 }
16817 
append_from_str()16818 int spider_mbase_copy_table::append_from_str()
16819 {
16820   DBUG_ENTER("spider_mbase_copy_table::append_from_str");
16821   DBUG_PRINT("info",("spider this=%p", this));
16822   if (sql.reserve(SPIDER_SQL_FROM_LEN))
16823     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16824   sql.q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN);
16825   DBUG_RETURN(0);
16826 }
16827 
append_table_name(int link_idx)16828 int spider_mbase_copy_table::append_table_name(
16829   int link_idx
16830 ) {
16831   int error_num;
16832   DBUG_ENTER("spider_mbase_copy_table::append_table_name");
16833   DBUG_PRINT("info",("spider this=%p", this));
16834   error_num = mysql_share->append_table_name(&sql, link_idx);
16835   DBUG_RETURN(error_num);
16836 }
16837 
set_sql_pos()16838 void spider_mbase_copy_table::set_sql_pos()
16839 {
16840   DBUG_ENTER("spider_mbase_copy_table::set_sql_pos");
16841   DBUG_PRINT("info",("spider this=%p", this));
16842   pos = sql.length();
16843   DBUG_VOID_RETURN;
16844 }
16845 
set_sql_to_pos()16846 void spider_mbase_copy_table::set_sql_to_pos()
16847 {
16848   DBUG_ENTER("spider_mbase_copy_table::set_sql_to_pos");
16849   DBUG_PRINT("info",("spider this=%p", this));
16850   sql.length(pos);
16851   DBUG_VOID_RETURN;
16852 }
16853 
append_copy_where(spider_db_copy_table * source_ct,KEY * key_info,ulong * last_row_pos,ulong * last_lengths)16854 int spider_mbase_copy_table::append_copy_where(
16855   spider_db_copy_table *source_ct,
16856   KEY *key_info,
16857   ulong *last_row_pos,
16858   ulong *last_lengths
16859 ) {
16860   int error_num, roop_count, roop_count2;
16861   DBUG_ENTER("spider_mbase_copy_table::append_copy_where");
16862   DBUG_PRINT("info",("spider this=%p", this));
16863   if (sql.reserve(SPIDER_SQL_WHERE_LEN + SPIDER_SQL_OPEN_PAREN_LEN))
16864   {
16865     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16866   }
16867   sql.q_append(SPIDER_SQL_WHERE_STR, SPIDER_SQL_WHERE_LEN);
16868   sql.q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
16869   Field *field;
16870   KEY_PART_INFO *key_part = key_info->key_part;
16871   for (roop_count = spider_user_defined_key_parts(key_info) - 1;
16872     roop_count >= 0; roop_count--)
16873   {
16874     for (roop_count2 = 0; roop_count2 < roop_count; roop_count2++)
16875     {
16876       field = key_part[roop_count2].field;
16877       if ((error_num = copy_key_row(source_ct,
16878         field, &last_row_pos[field->field_index],
16879         &last_lengths[field->field_index],
16880         SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN)))
16881       {
16882         DBUG_RETURN(error_num);
16883       }
16884     }
16885     field = key_part[roop_count2].field;
16886     if ((error_num = copy_key_row(source_ct,
16887       field, &last_row_pos[field->field_index],
16888       &last_lengths[field->field_index],
16889       SPIDER_SQL_GT_STR, SPIDER_SQL_GT_LEN)))
16890     {
16891       DBUG_RETURN(error_num);
16892     }
16893     sql.length(sql.length() - SPIDER_SQL_AND_LEN);
16894     if (sql.reserve(SPIDER_SQL_CLOSE_PAREN_LEN +
16895       SPIDER_SQL_OR_LEN + SPIDER_SQL_OPEN_PAREN_LEN))
16896     {
16897       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16898     }
16899     sql.q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
16900     sql.q_append(SPIDER_SQL_OR_STR, SPIDER_SQL_OR_LEN);
16901     sql.q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
16902   }
16903   sql.length(sql.length() - SPIDER_SQL_OR_LEN - SPIDER_SQL_OPEN_PAREN_LEN);
16904   DBUG_RETURN(0);
16905 }
16906 
append_key_order_str(KEY * key_info,int start_pos,bool desc_flg)16907 int spider_mbase_copy_table::append_key_order_str(
16908   KEY *key_info,
16909   int start_pos,
16910   bool desc_flg
16911 ) {
16912   int length, error_num;
16913   KEY_PART_INFO *key_part;
16914   Field *field;
16915   DBUG_ENTER("spider_mbase_copy_table::append_key_order_str");
16916   DBUG_PRINT("info",("spider this=%p", this));
16917   if ((int) spider_user_defined_key_parts(key_info) > start_pos)
16918   {
16919     if (sql.reserve(SPIDER_SQL_ORDER_LEN))
16920       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16921     sql.q_append(SPIDER_SQL_ORDER_STR, SPIDER_SQL_ORDER_LEN);
16922     if (desc_flg == TRUE)
16923     {
16924       for (
16925         key_part = key_info->key_part + start_pos,
16926         length = 0;
16927         length + start_pos < (int) spider_user_defined_key_parts(key_info);
16928         key_part++,
16929         length++
16930       ) {
16931         field = key_part->field;
16932         if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN))
16933           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16934         sql.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
16935         if ((error_num = spider_db_append_name_with_quote_str(&sql,
16936           field->field_name, dbton_id)))
16937           DBUG_RETURN(error_num);
16938         if (key_part->key_part_flag & HA_REVERSE_SORT)
16939         {
16940           if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN + SPIDER_SQL_COMMA_LEN))
16941             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16942           sql.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
16943           sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
16944         } else {
16945           if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN + SPIDER_SQL_DESC_LEN +
16946             SPIDER_SQL_COMMA_LEN))
16947             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16948           sql.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
16949           sql.q_append(SPIDER_SQL_DESC_STR, SPIDER_SQL_DESC_LEN);
16950           sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
16951         }
16952       }
16953     } else {
16954       for (
16955         key_part = key_info->key_part + start_pos,
16956         length = 0;
16957         length + start_pos < (int) spider_user_defined_key_parts(key_info);
16958         key_part++,
16959         length++
16960       ) {
16961         field = key_part->field;
16962         if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN))
16963           DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16964         sql.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
16965         if ((error_num = spider_db_append_name_with_quote_str(&sql,
16966           field->field_name, dbton_id)))
16967           DBUG_RETURN(error_num);
16968         if (key_part->key_part_flag & HA_REVERSE_SORT)
16969         {
16970           if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN + SPIDER_SQL_DESC_LEN +
16971             SPIDER_SQL_COMMA_LEN))
16972             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16973           sql.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
16974           sql.q_append(SPIDER_SQL_DESC_STR, SPIDER_SQL_DESC_LEN);
16975           sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
16976         } else {
16977           if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN + SPIDER_SQL_COMMA_LEN))
16978             DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16979           sql.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
16980           sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
16981         }
16982       }
16983     }
16984     sql.length(sql.length() - SPIDER_SQL_COMMA_LEN);
16985   }
16986   DBUG_RETURN(0);
16987 }
16988 
append_limit(longlong offset,longlong limit)16989 int spider_mbase_copy_table::append_limit(
16990   longlong offset,
16991   longlong limit
16992 ) {
16993   char buf[SPIDER_LONGLONG_LEN + 1];
16994   uint32 length;
16995   DBUG_ENTER("spider_mbase_copy_table::append_limit");
16996   DBUG_PRINT("info",("spider this=%p", this));
16997   if (offset || limit < 9223372036854775807LL)
16998   {
16999     if (sql.reserve(SPIDER_SQL_LIMIT_LEN + SPIDER_SQL_COMMA_LEN +
17000       ((SPIDER_LONGLONG_LEN) * 2)))
17001       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
17002     sql.q_append(SPIDER_SQL_LIMIT_STR, SPIDER_SQL_LIMIT_LEN);
17003     if (offset)
17004     {
17005       length = (uint32) (my_charset_bin.longlong10_to_str)(
17006         buf, SPIDER_LONGLONG_LEN + 1, -10, offset);
17007       sql.q_append(buf, length);
17008       sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
17009     }
17010     length = (uint32) (my_charset_bin.longlong10_to_str)(
17011       buf, SPIDER_LONGLONG_LEN + 1, -10, limit);
17012     sql.q_append(buf, length);
17013   }
17014   DBUG_RETURN(0);
17015 }
17016 
append_into_str()17017 int spider_mbase_copy_table::append_into_str()
17018 {
17019   DBUG_ENTER("spider_mbase_copy_table::append_into_str");
17020   DBUG_PRINT("info",("spider this=%p", this));
17021   if (sql.reserve(SPIDER_SQL_INTO_LEN))
17022     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
17023   sql.q_append(SPIDER_SQL_INTO_STR, SPIDER_SQL_INTO_LEN);
17024   DBUG_RETURN(0);
17025 }
17026 
append_open_paren_str()17027 int spider_mbase_copy_table::append_open_paren_str()
17028 {
17029   DBUG_ENTER("spider_mbase_copy_table::append_open_paren_str");
17030   DBUG_PRINT("info",("spider this=%p", this));
17031   if (sql.reserve(SPIDER_SQL_OPEN_PAREN_LEN))
17032     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
17033   sql.q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
17034   DBUG_RETURN(0);
17035 }
17036 
append_values_str()17037 int spider_mbase_copy_table::append_values_str()
17038 {
17039   DBUG_ENTER("spider_mbase_copy_table::append_values_str");
17040   DBUG_PRINT("info",("spider this=%p", this));
17041   if (sql.reserve(SPIDER_SQL_CLOSE_PAREN_LEN + SPIDER_SQL_VALUES_LEN +
17042     SPIDER_SQL_OPEN_PAREN_LEN))
17043     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
17044   sql.q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
17045   sql.q_append(SPIDER_SQL_VALUES_STR, SPIDER_SQL_VALUES_LEN);
17046   sql.q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
17047   DBUG_RETURN(0);
17048 }
17049 
append_select_lock_str(int lock_mode)17050 int spider_mbase_copy_table::append_select_lock_str(
17051   int lock_mode
17052 ) {
17053   DBUG_ENTER("spider_mbase_copy_table::append_select_lock_str");
17054   DBUG_PRINT("info",("spider this=%p", this));
17055   if (lock_mode == SPIDER_LOCK_MODE_EXCLUSIVE)
17056   {
17057     if (sql.reserve(SPIDER_SQL_FOR_UPDATE_LEN))
17058       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
17059     sql.q_append(SPIDER_SQL_FOR_UPDATE_STR, SPIDER_SQL_FOR_UPDATE_LEN);
17060   } else if (lock_mode == SPIDER_LOCK_MODE_SHARED)
17061   {
17062     if (sql.reserve(SPIDER_SQL_SHARED_LOCK_LEN))
17063       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
17064     sql.q_append(SPIDER_SQL_SHARED_LOCK_STR, SPIDER_SQL_SHARED_LOCK_LEN);
17065   }
17066   DBUG_RETURN(0);
17067 }
17068 
exec_query(SPIDER_CONN * conn,int quick_mode,int * need_mon)17069 int spider_mbase_copy_table::exec_query(
17070   SPIDER_CONN *conn,
17071   int quick_mode,
17072   int *need_mon
17073 ) {
17074   int error_num;
17075   DBUG_ENTER("spider_mbase_copy_table::exec_query");
17076   DBUG_PRINT("info",("spider this=%p", this));
17077   error_num = spider_db_query(conn, sql.ptr(), sql.length(), quick_mode,
17078     need_mon);
17079   DBUG_RETURN(error_num);
17080 }
17081 
copy_key_row(spider_db_copy_table * source_ct,Field * field,ulong * row_pos,ulong * length,const char * joint_str,const int joint_length)17082 int spider_mbase_copy_table::copy_key_row(
17083   spider_db_copy_table *source_ct,
17084   Field *field,
17085   ulong *row_pos,
17086   ulong *length,
17087   const char *joint_str,
17088   const int joint_length
17089 ) {
17090   int error_num;
17091   spider_string *source_str = &((spider_mbase_copy_table *) source_ct)->sql;
17092   DBUG_ENTER("spider_mbase_copy_table::copy_key_row");
17093   DBUG_PRINT("info",("spider this=%p", this));
17094   if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN))
17095     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
17096   sql.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
17097   if ((error_num = spider_db_append_name_with_quote_str(&sql,
17098     field->field_name, dbton_id)))
17099     DBUG_RETURN(error_num);
17100   if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN + joint_length + *length +
17101     SPIDER_SQL_AND_LEN))
17102     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
17103   sql.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
17104   sql.q_append(joint_str, joint_length);
17105   sql.q_append(source_str->ptr() + *row_pos, *length);
17106   sql.q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN);
17107   DBUG_RETURN(0);
17108 }
17109 
copy_row(Field * field,SPIDER_DB_ROW * row)17110 int spider_mbase_copy_table::copy_row(
17111   Field *field,
17112   SPIDER_DB_ROW *row
17113 ) {
17114   int error_num;
17115   DBUG_ENTER("spider_mbase_copy_table::copy_row");
17116   DBUG_PRINT("info",("spider this=%p", this));
17117   if (row->is_null())
17118   {
17119     if (sql.reserve(SPIDER_SQL_NULL_LEN + SPIDER_SQL_COMMA_LEN))
17120       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
17121     sql.q_append(SPIDER_SQL_NULL_STR, SPIDER_SQL_NULL_LEN);
17122   } else if (field->str_needs_quotes())
17123   {
17124     if (sql.reserve(SPIDER_SQL_VALUE_QUOTE_LEN))
17125       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
17126     sql.q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
17127     if ((error_num = row->append_escaped_to_str(&sql,
17128       dbton_id)))
17129       DBUG_RETURN(error_num);
17130     if (sql.reserve(SPIDER_SQL_VALUE_QUOTE_LEN + SPIDER_SQL_COMMA_LEN))
17131       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
17132     sql.q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
17133   } else {
17134     if ((error_num = row->append_to_str(&sql)))
17135       DBUG_RETURN(error_num);
17136     if (sql.reserve(SPIDER_SQL_COMMA_LEN))
17137       DBUG_RETURN(HA_ERR_OUT_OF_MEM);
17138   }
17139   sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
17140   DBUG_RETURN(0);
17141 }
17142 
copy_rows(TABLE * table,SPIDER_DB_ROW * row,ulong ** last_row_pos,ulong ** last_lengths)17143 int spider_mbase_copy_table::copy_rows(
17144   TABLE *table,
17145   SPIDER_DB_ROW *row,
17146   ulong **last_row_pos,
17147   ulong **last_lengths
17148 ) {
17149   int error_num;
17150   Field **field;
17151   ulong *lengths2, *row_pos2;
17152   DBUG_ENTER("spider_mbase_copy_table::copy_rows");
17153   DBUG_PRINT("info",("spider this=%p", this));
17154   row_pos2 = *last_row_pos;
17155   lengths2 = *last_lengths;
17156 
17157   for (
17158     field = table->field;
17159     *field;
17160     field++,
17161     lengths2++
17162   ) {
17163     *row_pos2 = sql.length();
17164     if ((error_num =
17165       copy_row(*field, row)))
17166       DBUG_RETURN(error_num);
17167     *lengths2 = sql.length() - *row_pos2 - SPIDER_SQL_COMMA_LEN;
17168     row->next();
17169     row_pos2++;
17170   }
17171   sql.length(sql.length() - SPIDER_SQL_COMMA_LEN);
17172   if (sql.reserve(SPIDER_SQL_CLOSE_PAREN_LEN +
17173     SPIDER_SQL_COMMA_LEN + SPIDER_SQL_OPEN_PAREN_LEN))
17174   {
17175     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
17176   }
17177   sql.q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
17178   sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
17179   sql.q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
17180   DBUG_RETURN(0);
17181 }
17182 
copy_rows(TABLE * table,SPIDER_DB_ROW * row)17183 int spider_mbase_copy_table::copy_rows(
17184   TABLE *table,
17185   SPIDER_DB_ROW *row
17186 ) {
17187   int error_num;
17188   Field **field;
17189   DBUG_ENTER("spider_mbase_copy_table::copy_rows");
17190   DBUG_PRINT("info",("spider this=%p", this));
17191   for (
17192     field = table->field;
17193     *field;
17194     field++
17195   ) {
17196     if ((error_num =
17197       copy_row(*field, row)))
17198       DBUG_RETURN(error_num);
17199     row->next();
17200   }
17201   sql.length(sql.length() - SPIDER_SQL_COMMA_LEN);
17202   if (sql.reserve(SPIDER_SQL_CLOSE_PAREN_LEN +
17203     SPIDER_SQL_COMMA_LEN + SPIDER_SQL_OPEN_PAREN_LEN))
17204   {
17205     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
17206   }
17207   sql.q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
17208   sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
17209   sql.q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
17210   DBUG_RETURN(0);
17211 }
17212 
append_insert_terminator()17213 int spider_mbase_copy_table::append_insert_terminator()
17214 {
17215   DBUG_ENTER("spider_mbase_copy_table::append_insert_terminator");
17216   DBUG_PRINT("info",("spider this=%p", this));
17217   sql.length(sql.length() - SPIDER_SQL_COMMA_LEN - SPIDER_SQL_OPEN_PAREN_LEN);
17218   DBUG_RETURN(0);
17219 }
17220 
copy_insert_values(spider_db_copy_table * source_ct)17221 int spider_mbase_copy_table::copy_insert_values(
17222   spider_db_copy_table *source_ct
17223 ) {
17224   spider_mbase_copy_table *tmp_ct = (spider_mbase_copy_table *) source_ct;
17225   spider_string *source_str = &tmp_ct->sql;
17226   int values_length = source_str->length() - tmp_ct->pos;
17227   const char *values_ptr = source_str->ptr() + tmp_ct->pos;
17228   DBUG_ENTER("spider_mbase_copy_table::copy_insert_values");
17229   DBUG_PRINT("info",("spider this=%p", this));
17230   if (sql.reserve(values_length))
17231   {
17232     DBUG_RETURN(HA_ERR_OUT_OF_MEM);
17233   }
17234   sql.q_append(values_ptr, values_length);
17235   DBUG_RETURN(0);
17236 }
17237