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 ¬_used_long, ¬_used_uint);
909 #else
910 stat.create_time = (time_t) my_system_gmt_sec(&mysql_time,
911 ¬_used_long, ¬_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 ¬_used_long, ¬_used_uint);
934 #else
935 stat.update_time = (time_t) my_system_gmt_sec(&mysql_time,
936 ¬_used_long, ¬_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 ¬_used_long, ¬_used_uint);
959 #else
960 stat.check_time = (time_t) my_system_gmt_sec(&mysql_time,
961 ¬_used_long, ¬_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 ¬_used_long, ¬_used_uint);
1038 #else
1039 stat.create_time = (time_t) my_system_gmt_sec(&mysql_time,
1040 ¬_used_long, ¬_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 ¬_used_long, ¬_used_uint);
1063 #else
1064 stat.update_time = (time_t) my_system_gmt_sec(&mysql_time,
1065 ¬_used_long, ¬_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 ¬_used_long, ¬_used_uint);
1088 #else
1089 stat.check_time = (time_t) my_system_gmt_sec(&mysql_time,
1090 ¬_used_long, ¬_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, <);
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, <);
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, <);
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(>id_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 ¤t_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, ¤t_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