1 /* Copyright (C) 2012-2018 Kentoku Shiba
2
3 This program is free software; you can redistribute it and/or modify
4 it under the terms of the GNU General Public License as published by
5 the Free Software Foundation; version 2 of the License.
6
7 This program is distributed in the hope that it will be useful,
8 but WITHOUT ANY WARRANTY; without even the implied warranty of
9 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 GNU General Public License for more details.
11
12 You should have received a copy of the GNU General Public License
13 along with this program; if not, write to the Free Software
14 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */
15
16 #define MYSQL_SERVER 1
17 #include <my_global.h>
18 #include "mysql_version.h"
19 #include "spd_environ.h"
20 #if MYSQL_VERSION_ID < 50500
21 #include "mysql_priv.h"
22 #include <mysql/plugin.h>
23 #else
24 #include "sql_priv.h"
25 #include "probes_mysql.h"
26 #include "sql_class.h"
27 #include "sql_partition.h"
28 #include "sql_analyse.h"
29 #include "sql_base.h"
30 #include "tztime.h"
31 #ifdef HANDLER_HAS_DIRECT_AGGREGATE
32 #include "sql_select.h"
33 #endif
34 #endif
35 #include "sql_common.h"
36 #include <mysql.h>
37 #include <errmsg.h>
38 #include "spd_err.h"
39 #include "spd_param.h"
40 #include "spd_db_include.h"
41 #include "spd_include.h"
42 #include "spd_db_mysql.h"
43 #include "ha_spider.h"
44 #include "spd_conn.h"
45 #include "spd_db_conn.h"
46 #include "spd_malloc.h"
47 #include "spd_sys_table.h"
48 #include "spd_table.h"
49
50 extern struct charset_info_st *spd_charset_utf8_bin;
51 extern bool volatile *spd_abort_loop;
52
53 extern handlerton *spider_hton_ptr;
54 extern pthread_mutex_t spider_open_conn_mutex;
55 extern HASH spider_open_connections;
56 extern HASH spider_ipport_conns;
57 extern SPIDER_DBTON spider_dbton[SPIDER_DBTON_SIZE];
58 extern const char spider_dig_upper[];
59 extern const char **spd_mysqld_unix_port;
60 extern uint *spd_mysqld_port;
61
62 spider_db_mysql_util spider_db_mysql_utility;
63 spider_db_mariadb_util spider_db_mariadb_utility;
64
65 #define SPIDER_SQL_NAME_QUOTE_STR "`"
66 #define SPIDER_SQL_NAME_QUOTE_LEN (sizeof(SPIDER_SQL_NAME_QUOTE_STR) - 1)
67 static const char *name_quote_str = SPIDER_SQL_NAME_QUOTE_STR;
68
69 #define SPIDER_SQL_ISO_READ_UNCOMMITTED_STR "set session transaction isolation level read uncommitted"
70 #define SPIDER_SQL_ISO_READ_UNCOMMITTED_LEN sizeof(SPIDER_SQL_ISO_READ_UNCOMMITTED_STR) - 1
71 #define SPIDER_SQL_ISO_READ_COMMITTED_STR "set session transaction isolation level read committed"
72 #define SPIDER_SQL_ISO_READ_COMMITTED_LEN sizeof(SPIDER_SQL_ISO_READ_COMMITTED_STR) - 1
73 #define SPIDER_SQL_ISO_REPEATABLE_READ_STR "set session transaction isolation level repeatable read"
74 #define SPIDER_SQL_ISO_REPEATABLE_READ_LEN sizeof(SPIDER_SQL_ISO_REPEATABLE_READ_STR) - 1
75 #define SPIDER_SQL_ISO_SERIALIZABLE_STR "set session transaction isolation level serializable"
76 #define SPIDER_SQL_ISO_SERIALIZABLE_LEN sizeof(SPIDER_SQL_ISO_SERIALIZABLE_STR) - 1
77
78 #define SPIDER_SQL_START_CONSISTENT_SNAPSHOT_STR "start transaction with consistent snapshot"
79 #define SPIDER_SQL_START_CONSISTENT_SNAPSHOT_LEN sizeof(SPIDER_SQL_START_CONSISTENT_SNAPSHOT_STR) - 1
80 #define SPIDER_SQL_START_TRANSACTION_STR "start transaction"
81 #define SPIDER_SQL_START_TRANSACTION_LEN sizeof(SPIDER_SQL_START_TRANSACTION_STR) - 1
82
83 #define SPIDER_SQL_AUTOCOMMIT_OFF_STR "set session autocommit = 0"
84 #define SPIDER_SQL_AUTOCOMMIT_OFF_LEN sizeof(SPIDER_SQL_AUTOCOMMIT_OFF_STR) - 1
85 #define SPIDER_SQL_AUTOCOMMIT_ON_STR "set session autocommit = 1"
86 #define SPIDER_SQL_AUTOCOMMIT_ON_LEN sizeof(SPIDER_SQL_AUTOCOMMIT_ON_STR) - 1
87
88 #define SPIDER_SQL_SQL_LOG_OFF_STR "set session sql_log_off = 0"
89 #define SPIDER_SQL_SQL_LOG_OFF_LEN sizeof(SPIDER_SQL_SQL_LOG_OFF_STR) - 1
90 #define SPIDER_SQL_SQL_LOG_ON_STR "set session sql_log_off = 1"
91 #define SPIDER_SQL_SQL_LOG_ON_LEN sizeof(SPIDER_SQL_SQL_LOG_ON_STR) - 1
92
93 #define SPIDER_SQL_WAIT_TIMEOUT_STR "set session wait_timeout = "
94 #define SPIDER_SQL_WAIT_TIMEOUT_LEN sizeof(SPIDER_SQL_WAIT_TIMEOUT_STR) - 1
95
96 #define SPIDER_SQL_SQL_MODE_STR "set session sql_mode = '"
97 #define SPIDER_SQL_SQL_MODE_LEN sizeof(SPIDER_SQL_SQL_MODE_STR) - 1
98
99 #define SPIDER_SQL_TIME_ZONE_STR "set session time_zone = '"
100 #define SPIDER_SQL_TIME_ZONE_LEN sizeof(SPIDER_SQL_TIME_ZONE_STR) - 1
101
102 #define SPIDER_SQL_COMMIT_STR "commit"
103 #define SPIDER_SQL_COMMIT_LEN sizeof(SPIDER_SQL_COMMIT_STR) - 1
104 #define SPIDER_SQL_ROLLBACK_STR "rollback"
105 #define SPIDER_SQL_ROLLBACK_LEN sizeof(SPIDER_SQL_ROLLBACK_STR) - 1
106
107 #define SPIDER_SQL_XA_START_STR "xa start "
108 #define SPIDER_SQL_XA_START_LEN sizeof(SPIDER_SQL_XA_START_STR) - 1
109 #define SPIDER_SQL_XA_END_STR "xa end "
110 #define SPIDER_SQL_XA_END_LEN sizeof(SPIDER_SQL_XA_END_STR) - 1
111 #define SPIDER_SQL_XA_PREPARE_STR "xa prepare "
112 #define SPIDER_SQL_XA_PREPARE_LEN sizeof(SPIDER_SQL_XA_PREPARE_STR) - 1
113 #define SPIDER_SQL_XA_COMMIT_STR "xa commit "
114 #define SPIDER_SQL_XA_COMMIT_LEN sizeof(SPIDER_SQL_XA_COMMIT_STR) - 1
115 #define SPIDER_SQL_XA_ROLLBACK_STR "xa rollback "
116 #define SPIDER_SQL_XA_ROLLBACK_LEN sizeof(SPIDER_SQL_XA_ROLLBACK_STR) - 1
117
118 #define SPIDER_SQL_LOCK_TABLE_STR "lock tables "
119 #define SPIDER_SQL_LOCK_TABLE_LEN (sizeof(SPIDER_SQL_LOCK_TABLE_STR) - 1)
120 #define SPIDER_SQL_UNLOCK_TABLE_STR "unlock tables"
121 #define SPIDER_SQL_UNLOCK_TABLE_LEN (sizeof(SPIDER_SQL_UNLOCK_TABLE_STR) - 1)
122
123 #define SPIDER_SQL_LEFT_JOIN_STR " left join "
124 #define SPIDER_SQL_LEFT_JOIN_LEN (sizeof(SPIDER_SQL_LEFT_JOIN_STR) - 1)
125 #define SPIDER_SQL_RIGHT_JOIN_STR " right join "
126 #define SPIDER_SQL_RIGHT_JOIN_LEN (sizeof(SPIDER_SQL_RIGHT_JOIN_STR) - 1)
127 #define SPIDER_SQL_JOIN_STR " join "
128 #define SPIDER_SQL_JOIN_LEN (sizeof(SPIDER_SQL_JOIN_STR) - 1)
129 #define SPIDER_SQL_ON_STR " on "
130 #define SPIDER_SQL_ON_LEN (sizeof(SPIDER_SQL_ON_STR) - 1)
131
132 #define SPIDER_SQL_SHOW_TABLE_STATUS_STR "show table status from "
133 #define SPIDER_SQL_SHOW_TABLE_STATUS_LEN sizeof(SPIDER_SQL_SHOW_TABLE_STATUS_STR) - 1
134 #define SPIDER_SQL_SELECT_TABLES_STATUS_STR "select `table_rows`,`avg_row_length`,`data_length`,`max_data_length`,`index_length`,`auto_increment`,`create_time`,`update_time`,`check_time`,`checksum` from `information_schema`.`tables` where `table_schema` = "
135 #define SPIDER_SQL_SELECT_TABLES_STATUS_LEN sizeof(SPIDER_SQL_SELECT_TABLES_STATUS_STR) - 1
136 #define SPIDER_SQL_SHOW_WARNINGS_STR "show warnings"
137 #define SPIDER_SQL_SHOW_WARNINGS_LEN sizeof(SPIDER_SQL_SHOW_WARNINGS_STR) - 1
138
139 #define SPIDER_SQL_SHOW_MASTER_STATUS_STR "show master status"
140 #define SPIDER_SQL_SHOW_MASTER_STATUS_LEN sizeof(SPIDER_SQL_SHOW_MASTER_STATUS_STR) - 1
141 #define SPIDER_SQL_BINLOG_GTID_POS_STR "select binlog_gtid_pos"
142 #define SPIDER_SQL_BINLOG_GTID_POS_LEN sizeof(SPIDER_SQL_BINLOG_GTID_POS_STR) - 1
143
144 #ifdef SPIDER_HAS_DISCOVER_TABLE_STRUCTURE
145 #define SPIDER_SQL_SHOW_COLUMNS_STR "show columns from "
146 #define SPIDER_SQL_SHOW_COLUMNS_LEN sizeof(SPIDER_SQL_SHOW_COLUMNS_STR) - 1
147 #define SPIDER_SQL_SELECT_COLUMNS_STR "select `column_name`,`column_default`,`is_nullable`,`character_set_name`,`collation_name`,`column_type`,`extra` from `information_schema`.`columns` where `table_schema` = "
148 #define SPIDER_SQL_SELECT_COLUMNS_LEN sizeof(SPIDER_SQL_SELECT_COLUMNS_STR) - 1
149
150 #define SPIDER_SQL_AUTO_INCREMENT_STR " auto_increment"
151 #define SPIDER_SQL_AUTO_INCREMENT_LEN sizeof(SPIDER_SQL_AUTO_INCREMENT_STR) - 1
152 #define SPIDER_SQL_ORDINAL_POSITION_STR "ordinal_position"
153 #define SPIDER_SQL_ORDINAL_POSITION_LEN sizeof(SPIDER_SQL_ORDINAL_POSITION_STR) - 1
154 #define SPIDER_SQL_FULLTEXT_STR "fulltext"
155 #define SPIDER_SQL_FULLTEXT_LEN sizeof(SPIDER_SQL_FULLTEXT_STR) - 1
156 #define SPIDER_SQL_SPATIAL_STR "spatial"
157 #define SPIDER_SQL_SPATIAL_LEN sizeof(SPIDER_SQL_SPATIAL_STR) - 1
158 #define SPIDER_SQL_USING_HASH_STR " using hash"
159 #define SPIDER_SQL_USING_HASH_LEN sizeof(SPIDER_SQL_USING_HASH_STR) - 1
160 #endif
161
162 #define SPIDER_SQL_SHOW_RECORDS_RECORDS_POS 0
163 #define SPIDER_SQL_EXPLAIN_SELECT_RECORDS_POS 8
164
165 #ifdef HA_HAS_CHECKSUM_EXTENDED
166 #define SPIDER_SQL_CHECKSUM_CHECKSUM_POS 1
167 #define SPIDER_SQL_CHECKSUM_TABLE_STR "checksum table "
168 #define SPIDER_SQL_CHECKSUM_TABLE_LEN (sizeof(SPIDER_SQL_CHECKSUM_TABLE_STR) - 1)
169 #endif
170
171 #define SPIDER_SQL_LIKE_STR " like "
172 #define SPIDER_SQL_LIKE_LEN (sizeof(SPIDER_SQL_LIKE_STR) - 1)
173 #define SPIDER_SQL_LIMIT1_STR " limit 1"
174 #define SPIDER_SQL_LIMIT1_LEN (sizeof(SPIDER_SQL_LIMIT1_STR) - 1)
175 #define SPIDER_SQL_COLLATE_STR " collate "
176 #define SPIDER_SQL_COLLATE_LEN (sizeof(SPIDER_SQL_COLLATE_STR) - 1)
177
178 #define SPIDER_SQL_INTERVAL_STR " + interval "
179 #define SPIDER_SQL_INTERVAL_LEN (sizeof(SPIDER_SQL_INTERVAL_STR) - 1)
180 #define SPIDER_SQL_NEGINTERVAL_STR " - interval "
181 #define SPIDER_SQL_NEGINTERVAL_LEN (sizeof(SPIDER_SQL_NEGINTERVAL_STR) - 1)
182
183 static uchar SPIDER_SQL_LINESTRING_HEAD_STR[] =
184 {0x00,0x00,0x00,0x00,0x01,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00};
185 #define SPIDER_SQL_LINESTRING_HEAD_LEN sizeof(SPIDER_SQL_LINESTRING_HEAD_STR)
186
187 #define SPIDER_SQL_DIRECT_INSERT_KIND_INSERT 0
188 #define SPIDER_SQL_DIRECT_INSERT_KIND_REPLACE 1
189 #define SPIDER_SQL_DIRECT_INSERT_KIND_IGNORE 2
190 #define SPIDER_SQL_DIRECT_INSERT_KIND_DUP_UPDATE 3
191
192 static const char *spider_db_table_lock_str[] =
193 {
194 " read local,",
195 " read,",
196 " low_priority write,",
197 " write,"
198 };
199 static const int spider_db_table_lock_len[] =
200 {
201 sizeof(" read local,") - 1,
202 sizeof(" read,") - 1,
203 sizeof(" low_priority write,") - 1,
204 sizeof(" write,") - 1
205 };
206 static const char *spider_db_timefunc_interval_str[] =
207 {
208 " year", " quarter", " month", " week", " day",
209 " hour", " minute", " second", " microsecond",
210 " year_month", " day_hour", " day_minute",
211 " day_second", " hour_minute", " hour_second",
212 " minute_second", " day_microsecond", " hour_microsecond",
213 " minute_microsecond", " second_microsecond"
214 };
215
216 /* UTC time zone for timestamp columns */
217 extern Time_zone *UTC;
218
spider_mysql_init()219 int spider_mysql_init()
220 {
221 DBUG_ENTER("spider_mysql_init");
222 DBUG_RETURN(0);
223 }
224
spider_mariadb_init()225 int spider_mariadb_init()
226 {
227 DBUG_ENTER("spider_mariadb_init");
228 DBUG_RETURN(0);
229 }
230
spider_mysql_deinit()231 int spider_mysql_deinit()
232 {
233 DBUG_ENTER("spider_mysql_deinit");
234 DBUG_RETURN(0);
235 }
236
spider_mariadb_deinit()237 int spider_mariadb_deinit()
238 {
239 DBUG_ENTER("spider_mariadb_deinit");
240 DBUG_RETURN(0);
241 }
242
spider_mysql_create_share(SPIDER_SHARE * share)243 spider_db_share *spider_mysql_create_share(
244 SPIDER_SHARE *share
245 ) {
246 DBUG_ENTER("spider_mysql_create_share");
247 DBUG_RETURN(new spider_mysql_share(share));
248 }
249
spider_mariadb_create_share(SPIDER_SHARE * share)250 spider_db_share *spider_mariadb_create_share(
251 SPIDER_SHARE *share
252 ) {
253 DBUG_ENTER("spider_mariadb_create_share");
254 DBUG_RETURN(new spider_mariadb_share(share));
255 }
256
spider_mysql_create_handler(ha_spider * spider,spider_db_share * db_share)257 spider_db_handler *spider_mysql_create_handler(
258 ha_spider *spider,
259 spider_db_share *db_share
260 ) {
261 DBUG_ENTER("spider_mysql_create_handler");
262 DBUG_RETURN(new spider_mysql_handler(spider,
263 (spider_mbase_share *) db_share));
264 }
265
spider_mariadb_create_handler(ha_spider * spider,spider_db_share * db_share)266 spider_db_handler *spider_mariadb_create_handler(
267 ha_spider *spider,
268 spider_db_share *db_share
269 ) {
270 DBUG_ENTER("spider_mariadb_create_handler");
271 DBUG_RETURN(new spider_mariadb_handler(spider,
272 (spider_mbase_share *) db_share));
273 }
274
spider_mysql_create_copy_table(spider_db_share * db_share)275 spider_db_copy_table *spider_mysql_create_copy_table(
276 spider_db_share *db_share
277 ) {
278 DBUG_ENTER("spider_mysql_create_copy_table");
279 DBUG_RETURN(new spider_mysql_copy_table(
280 (spider_mbase_share *) db_share));
281 }
282
spider_mariadb_create_copy_table(spider_db_share * db_share)283 spider_db_copy_table *spider_mariadb_create_copy_table(
284 spider_db_share *db_share
285 ) {
286 DBUG_ENTER("spider_mariadb_create_copy_table");
287 DBUG_RETURN(new spider_mariadb_copy_table(
288 (spider_mbase_share *) db_share));
289 }
290
spider_mysql_create_conn(SPIDER_CONN * conn)291 SPIDER_DB_CONN *spider_mysql_create_conn(
292 SPIDER_CONN *conn
293 ) {
294 DBUG_ENTER("spider_mysql_create_conn");
295 DBUG_RETURN(new spider_db_mysql(conn));
296 }
297
spider_mariadb_create_conn(SPIDER_CONN * conn)298 SPIDER_DB_CONN *spider_mariadb_create_conn(
299 SPIDER_CONN *conn
300 ) {
301 DBUG_ENTER("spider_mariadb_create_conn");
302 DBUG_RETURN(new spider_db_mariadb(conn));
303 }
304
spider_mysql_support_direct_join()305 bool spider_mysql_support_direct_join(
306 ) {
307 DBUG_ENTER("spider_mysql_support_direct_join");
308 DBUG_RETURN(TRUE);
309 }
310
spider_mariadb_support_direct_join()311 bool spider_mariadb_support_direct_join(
312 ) {
313 DBUG_ENTER("spider_mariadb_support_direct_join");
314 DBUG_RETURN(TRUE);
315 }
316
317 SPIDER_DBTON spider_dbton_mysql = {
318 0,
319 SPIDER_DB_WRAPPER_MYSQL,
320 SPIDER_DB_ACCESS_TYPE_SQL,
321 spider_mysql_init,
322 spider_mysql_deinit,
323 spider_mysql_create_share,
324 spider_mysql_create_handler,
325 spider_mysql_create_copy_table,
326 spider_mysql_create_conn,
327 spider_mysql_support_direct_join,
328 &spider_db_mysql_utility
329 };
330
331 SPIDER_DBTON spider_dbton_mariadb = {
332 0,
333 SPIDER_DB_WRAPPER_MARIADB,
334 SPIDER_DB_ACCESS_TYPE_SQL,
335 spider_mariadb_init,
336 spider_mariadb_deinit,
337 spider_mariadb_create_share,
338 spider_mariadb_create_handler,
339 spider_mariadb_create_copy_table,
340 spider_mariadb_create_conn,
341 spider_mariadb_support_direct_join,
342 &spider_db_mariadb_utility
343 };
344
spider_db_mbase_row(uint dbton_id)345 spider_db_mbase_row::spider_db_mbase_row(
346 uint dbton_id
347 ) : spider_db_row(dbton_id),
348 row(NULL), lengths(NULL), cloned(FALSE)
349 {
350 DBUG_ENTER("spider_db_mbase_row::spider_db_mbase_row");
351 DBUG_PRINT("info",("spider this=%p", this));
352 DBUG_VOID_RETURN;
353 }
354
spider_db_mysql_row()355 spider_db_mysql_row::spider_db_mysql_row() :
356 spider_db_mbase_row(spider_db_mysql_utility.dbton_id)
357 {
358 DBUG_ENTER("spider_db_mysql_row::spider_db_mysql_row");
359 DBUG_PRINT("info",("spider this=%p", this));
360 DBUG_VOID_RETURN;
361 }
362
spider_db_mariadb_row()363 spider_db_mariadb_row::spider_db_mariadb_row() :
364 spider_db_mbase_row(spider_db_mariadb_utility.dbton_id)
365 {
366 DBUG_ENTER("spider_db_mariadb_row::spider_db_mariadb_row");
367 DBUG_PRINT("info",("spider this=%p", this));
368 DBUG_VOID_RETURN;
369 }
370
~spider_db_mbase_row()371 spider_db_mbase_row::~spider_db_mbase_row()
372 {
373 DBUG_ENTER("spider_db_mbase_row::~spider_db_mbase_row");
374 DBUG_PRINT("info",("spider this=%p", this));
375 if (cloned)
376 {
377 spider_free(spider_current_trx, row_first, MYF(0));
378 }
379 DBUG_VOID_RETURN;
380 }
381
~spider_db_mysql_row()382 spider_db_mysql_row::~spider_db_mysql_row()
383 {
384 DBUG_ENTER("spider_db_mysql_row::~spider_db_mysql_row");
385 DBUG_PRINT("info",("spider this=%p", this));
386 DBUG_VOID_RETURN;
387 }
388
~spider_db_mariadb_row()389 spider_db_mariadb_row::~spider_db_mariadb_row()
390 {
391 DBUG_ENTER("spider_db_mariadb_row::~spider_db_mariadb_row");
392 DBUG_PRINT("info",("spider this=%p", this));
393 DBUG_VOID_RETURN;
394 }
395
store_to_field(Field * field,CHARSET_INFO * access_charset)396 int spider_db_mbase_row::store_to_field(
397 Field *field,
398 CHARSET_INFO *access_charset
399 ) {
400 DBUG_ENTER("spider_db_mbase_row::store_to_field");
401 DBUG_PRINT("info",("spider this=%p", this));
402 if (!*row)
403 {
404 DBUG_PRINT("info", ("spider field is null"));
405 field->set_null();
406 field->reset();
407 } else {
408 field->set_notnull();
409 if (field->flags & BLOB_FLAG)
410 {
411 DBUG_PRINT("info", ("spider blob field"));
412 if (
413 field->charset() == &my_charset_bin ||
414 field->charset()->cset == access_charset->cset
415 )
416 ((Field_blob *)field)->set_ptr(*lengths, (uchar *) *row);
417 else {
418 DBUG_PRINT("info", ("spider blob convert"));
419 if (field->table->file->ht == spider_hton_ptr)
420 {
421 ha_spider *spider = (ha_spider *) field->table->file;
422 spider_string *str = &spider->blob_buff[field->field_index];
423 str->length(0);
424 if (str->append(*row, *lengths, access_charset))
425 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
426 ((Field_blob *)field)->set_ptr(str->length(), (uchar *) str->ptr());
427 } else {
428 field->store(*row, *lengths, access_charset);
429 }
430 }
431 } else
432 field->store(*row, *lengths, access_charset);
433 }
434 DBUG_RETURN(0);
435 }
436
append_to_str(spider_string * str)437 int spider_db_mbase_row::append_to_str(
438 spider_string *str
439 ) {
440 DBUG_ENTER("spider_db_mbase_row::append_to_str");
441 DBUG_PRINT("info",("spider this=%p", this));
442 if (str->reserve(*lengths))
443 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
444 str->q_append(*row, *lengths);
445 DBUG_RETURN(0);
446 }
447
append_escaped_to_str(spider_string * str,uint dbton_id)448 int spider_db_mbase_row::append_escaped_to_str(
449 spider_string *str,
450 uint dbton_id
451 ) {
452 DBUG_ENTER("spider_db_mbase_row::append_escaped_to_str");
453 DBUG_PRINT("info",("spider this=%p", this));
454 spider_string tmp_str(*row, *lengths + 1, str->charset());
455 tmp_str.init_calc_mem(133);
456 tmp_str.length(*lengths);
457 if (str->reserve(*lengths * 2 + 2))
458 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
459 spider_dbton[dbton_id].db_util->append_escaped_util(str, tmp_str.get_str());
460 DBUG_RETURN(0);
461 }
462
first()463 void spider_db_mbase_row::first()
464 {
465 DBUG_ENTER("spider_db_mbase_row::first");
466 DBUG_PRINT("info",("spider this=%p", this));
467 row = row_first;
468 lengths = lengths_first;
469 DBUG_VOID_RETURN;
470 }
471
next()472 void spider_db_mbase_row::next()
473 {
474 DBUG_ENTER("spider_db_mbase_row::next");
475 DBUG_PRINT("info",("spider this=%p", this));
476 row++;
477 lengths++;
478 DBUG_VOID_RETURN;
479 }
480
is_null()481 bool spider_db_mbase_row::is_null()
482 {
483 DBUG_ENTER("spider_db_mbase_row::is_null");
484 DBUG_PRINT("info",("spider this=%p", this));
485 DBUG_RETURN(!(*row));
486 }
487
val_int()488 int spider_db_mbase_row::val_int()
489 {
490 DBUG_ENTER("spider_db_mbase_row::val_int");
491 DBUG_PRINT("info",("spider this=%p", this));
492 DBUG_RETURN(*row ? atoi(*row) : 0);
493 }
494
val_real()495 double spider_db_mbase_row::val_real()
496 {
497 DBUG_ENTER("spider_db_mbase_row::val_real");
498 DBUG_PRINT("info",("spider this=%p", this));
499 DBUG_RETURN(*row ? my_atof(*row) : 0.0);
500 }
501
val_decimal(my_decimal * decimal_value,CHARSET_INFO * access_charset)502 my_decimal *spider_db_mbase_row::val_decimal(
503 my_decimal *decimal_value,
504 CHARSET_INFO *access_charset
505 ) {
506 DBUG_ENTER("spider_db_mbase_row::val_decimal");
507 DBUG_PRINT("info",("spider this=%p", this));
508 if (!*row)
509 DBUG_RETURN(NULL);
510
511 #ifdef SPIDER_HAS_DECIMAL_OPERATION_RESULTS_VALUE_TYPE
512 decimal_operation_results(str2my_decimal(0, *row, *lengths, access_charset,
513 decimal_value), "", "");
514 #else
515 decimal_operation_results(str2my_decimal(0, *row, *lengths, access_charset,
516 decimal_value));
517 #endif
518
519 DBUG_RETURN(decimal_value);
520 }
521
clone()522 SPIDER_DB_ROW *spider_db_mbase_row::clone()
523 {
524 spider_db_mbase_row *clone_row;
525 char *tmp_char;
526 MYSQL_ROW tmp_row = row_first, ctmp_row;
527 ulong *tmp_lengths = lengths_first;
528 uint row_size, i;
529 DBUG_ENTER("spider_db_mbase_row::clone");
530 DBUG_PRINT("info",("spider this=%p", this));
531 if (!(clone_row = new spider_db_mbase_row(dbton_id)))
532 {
533 DBUG_RETURN(NULL);
534 }
535 if (!record_size)
536 {
537 row_size = field_count;
538 for (i = 0; i < field_count; i++)
539 {
540 row_size += *tmp_lengths;
541 tmp_lengths++;
542 }
543 record_size = row_size - field_count;
544 } else {
545 row_size = record_size + field_count;
546 }
547 if (!spider_bulk_malloc(spider_current_trx, 29, MYF(MY_WME),
548 &clone_row->row, sizeof(char*) * field_count,
549 &tmp_char, row_size,
550 &clone_row->lengths, sizeof(ulong) * field_count,
551 NullS)
552 ) {
553 delete clone_row;
554 DBUG_RETURN(NULL);
555 }
556 memcpy(clone_row->lengths, lengths_first, sizeof(ulong) * field_count);
557 tmp_lengths = lengths_first;
558 ctmp_row = clone_row->row;
559 for (i = 0; i < field_count; i++)
560 {
561 DBUG_PRINT("info",("spider *lengths=%lu", *tmp_lengths));
562 if (*tmp_row == NULL)
563 {
564 *ctmp_row = NULL;
565 *tmp_char = 0;
566 tmp_char++;
567 } else {
568 *ctmp_row = tmp_char;
569 memcpy(tmp_char, *tmp_row, *tmp_lengths + 1);
570 tmp_char += *tmp_lengths + 1;
571 }
572 ctmp_row++;
573 tmp_lengths++;
574 tmp_row++;
575 }
576 clone_row->field_count = field_count;
577 clone_row->record_size = record_size;
578 clone_row->row_first = clone_row->row;
579 clone_row->lengths_first = clone_row->lengths;
580 clone_row->cloned = TRUE;
581 DBUG_RETURN((SPIDER_DB_ROW *) clone_row);
582 }
583
store_to_tmp_table(TABLE * tmp_table,spider_string * str)584 int spider_db_mbase_row::store_to_tmp_table(
585 TABLE *tmp_table,
586 spider_string *str
587 ) {
588 uint i;
589 MYSQL_ROW tmp_row = row;
590 ulong *tmp_lengths = lengths;
591 DBUG_ENTER("spider_db_mbase_row::store_to_tmp_table");
592 DBUG_PRINT("info",("spider this=%p", this));
593 str->length(0);
594 for (i = 0; i < field_count; i++)
595 {
596 if (*tmp_row)
597 {
598 if (str->reserve(*tmp_lengths + 1))
599 {
600 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
601 }
602 str->q_append(*tmp_row, *tmp_lengths + 1);
603 }
604 tmp_lengths++;
605 tmp_row++;
606 }
607 tmp_table->field[0]->set_notnull();
608 tmp_table->field[0]->store(
609 (const char *) lengths,
610 sizeof(ulong) * field_count, &my_charset_bin);
611 tmp_table->field[1]->set_notnull();
612 tmp_table->field[1]->store(
613 str->ptr(), str->length(), &my_charset_bin);
614 tmp_table->field[2]->set_notnull();
615 tmp_table->field[2]->store(
616 (char *) row, (uint) (sizeof(char *) * field_count), &my_charset_bin);
617 DBUG_RETURN(tmp_table->file->ha_write_row(tmp_table->record[0]));
618 }
619
get_byte_size()620 uint spider_db_mbase_row::get_byte_size()
621 {
622 ulong *tmp_lengths = lengths_first;
623 uint i;
624 DBUG_ENTER("spider_db_mbase_row::get_byte_size");
625 DBUG_PRINT("info",("spider this=%p", this));
626 if (!record_size)
627 {
628 for (i = 0; i < field_count; i++)
629 {
630 record_size += *tmp_lengths;
631 tmp_lengths++;
632 }
633 }
634 DBUG_RETURN(record_size);
635 }
636
spider_db_mbase_result(SPIDER_DB_CONN * in_db_conn)637 spider_db_mbase_result::spider_db_mbase_result(
638 SPIDER_DB_CONN *in_db_conn
639 ) : spider_db_result(in_db_conn),
640 db_result(NULL), row(in_db_conn->dbton_id)
641 {
642 DBUG_ENTER("spider_db_mbase_result::spider_db_mbase_result");
643 DBUG_PRINT("info",("spider this=%p", this));
644 DBUG_VOID_RETURN;
645 }
646
spider_db_mysql_result(SPIDER_DB_CONN * in_db_conn)647 spider_db_mysql_result::spider_db_mysql_result(
648 SPIDER_DB_CONN *in_db_conn
649 ) : spider_db_mbase_result(in_db_conn)
650 {
651 DBUG_ENTER("spider_db_mysql_result::spider_db_mysql_result");
652 DBUG_PRINT("info",("spider this=%p", this));
653 DBUG_VOID_RETURN;
654 }
655
spider_db_mariadb_result(SPIDER_DB_CONN * in_db_conn)656 spider_db_mariadb_result::spider_db_mariadb_result(
657 SPIDER_DB_CONN *in_db_conn
658 ) : spider_db_mbase_result(in_db_conn)
659 {
660 DBUG_ENTER("spider_db_mariadb_result::spider_db_mariadb_result");
661 DBUG_PRINT("info",("spider this=%p", this));
662 DBUG_VOID_RETURN;
663 }
664
~spider_db_mbase_result()665 spider_db_mbase_result::~spider_db_mbase_result()
666 {
667 DBUG_ENTER("spider_db_mbase_result::~spider_db_mbase_result");
668 DBUG_PRINT("info",("spider this=%p", this));
669 if (db_result)
670 {
671 free_result();
672 }
673 DBUG_VOID_RETURN;
674 }
675
~spider_db_mysql_result()676 spider_db_mysql_result::~spider_db_mysql_result()
677 {
678 DBUG_ENTER("spider_db_mysql_result::~spider_db_mysql_result");
679 DBUG_PRINT("info",("spider this=%p", this));
680 DBUG_VOID_RETURN;
681 }
682
~spider_db_mariadb_result()683 spider_db_mariadb_result::~spider_db_mariadb_result()
684 {
685 DBUG_ENTER("spider_db_mariadb_result::~spider_db_mariadb_result");
686 DBUG_PRINT("info",("spider this=%p", this));
687 DBUG_VOID_RETURN;
688 }
689
has_result()690 bool spider_db_mbase_result::has_result()
691 {
692 DBUG_ENTER("spider_db_mbase_result::has_result");
693 DBUG_PRINT("info",("spider this=%p", this));
694 DBUG_RETURN(db_result);
695 }
696
free_result()697 void spider_db_mbase_result::free_result()
698 {
699 DBUG_ENTER("spider_db_mbase_result::free_result");
700 DBUG_PRINT("info",("spider this=%p", this));
701 /* need 2 times execution design */
702 if (db_result)
703 {
704 mysql_free_result(db_result);
705 db_result = NULL;
706 }
707 DBUG_VOID_RETURN;
708 }
709
current_row()710 SPIDER_DB_ROW *spider_db_mbase_result::current_row()
711 {
712 DBUG_ENTER("spider_db_mbase_result::current_row");
713 DBUG_PRINT("info",("spider this=%p", this));
714 DBUG_RETURN((SPIDER_DB_ROW *) row.clone());
715 }
716
fetch_row()717 SPIDER_DB_ROW *spider_db_mbase_result::fetch_row()
718 {
719 DBUG_ENTER("spider_db_mbase_result::fetch_row");
720 DBUG_PRINT("info",("spider this=%p", this));
721 if (!(row.row = mysql_fetch_row(db_result)))
722 {
723 if (mysql_errno(((spider_db_mbase *) db_conn)->db_conn))
724 {
725 store_error_num = mysql_errno(((spider_db_mbase *) db_conn)->db_conn);
726 my_message(store_error_num,
727 mysql_error(((spider_db_mbase *) db_conn)->db_conn), MYF(0));
728 } else
729 store_error_num = HA_ERR_END_OF_FILE;
730 DBUG_RETURN(NULL);
731 }
732 row.lengths = mysql_fetch_lengths(db_result);
733 row.field_count = mysql_num_fields(db_result);
734 row.row_first = row.row;
735 row.lengths_first = row.lengths;
736 row.record_size = 0;
737 DBUG_RETURN((SPIDER_DB_ROW *) &row);
738 }
739
fetch_row_from_result_buffer(spider_db_result_buffer * spider_res_buf)740 SPIDER_DB_ROW *spider_db_mbase_result::fetch_row_from_result_buffer(
741 spider_db_result_buffer *spider_res_buf
742 ) {
743 DBUG_ENTER("spider_db_mbase_result::fetch_row_from_result_buffer");
744 DBUG_PRINT("info",("spider this=%p", this));
745 if (!(row.row = mysql_fetch_row(db_result)))
746 {
747 if (mysql_errno(((spider_db_mbase *) db_conn)->db_conn))
748 {
749 store_error_num = mysql_errno(((spider_db_mbase *) db_conn)->db_conn);
750 my_message(store_error_num,
751 mysql_error(((spider_db_mbase *) db_conn)->db_conn), MYF(0));
752 } else
753 store_error_num = HA_ERR_END_OF_FILE;
754 DBUG_RETURN(NULL);
755 }
756 row.lengths = mysql_fetch_lengths(db_result);
757 row.field_count = mysql_num_fields(db_result);
758 row.row_first = row.row;
759 row.lengths_first = row.lengths;
760 row.record_size = 0;
761 DBUG_RETURN((SPIDER_DB_ROW *) &row);
762 }
763
fetch_row_from_tmp_table(TABLE * tmp_table)764 SPIDER_DB_ROW *spider_db_mbase_result::fetch_row_from_tmp_table(
765 TABLE *tmp_table
766 ) {
767 uint i;
768 spider_string tmp_str1, tmp_str2, tmp_str3;
769 const char *row_ptr;
770 MYSQL_ROW tmp_row;
771 ulong *tmp_lengths;
772 uint field_count;
773 DBUG_ENTER("spider_db_mbase_result::fetch_row_from_tmp_table");
774 DBUG_PRINT("info",("spider this=%p", this));
775 tmp_str1.init_calc_mem(117);
776 tmp_str2.init_calc_mem(118);
777 tmp_str3.init_calc_mem(170);
778 tmp_table->field[0]->val_str(tmp_str1.get_str());
779 tmp_table->field[1]->val_str(tmp_str2.get_str());
780 tmp_table->field[2]->val_str(tmp_str3.get_str());
781 tmp_str1.mem_calc();
782 tmp_str2.mem_calc();
783 tmp_str3.mem_calc();
784 row_ptr = tmp_str2.ptr();
785 tmp_lengths = (ulong *) tmp_str1.ptr();
786 tmp_row = (MYSQL_ROW) tmp_str3.ptr();
787 field_count = tmp_str1.length() / sizeof(ulong);
788 row.row = tmp_row;
789 row.lengths = tmp_lengths;
790 row.field_count = field_count;
791 row.row_first = row.row;
792 row.lengths_first = row.lengths;
793 row.record_size = tmp_str2.length();
794 for (i = 0; i < field_count; i++)
795 {
796 if (*tmp_row)
797 {
798 *tmp_row = (char *) row_ptr;
799 row_ptr += *tmp_lengths + 1;
800 }
801 tmp_row++;
802 tmp_lengths++;
803 }
804 DBUG_RETURN((SPIDER_DB_ROW *) &row);
805 }
806
fetch_table_status(int mode,ha_statistics & stat)807 int spider_db_mbase_result::fetch_table_status(
808 int mode,
809 ha_statistics &stat
810 ) {
811 int error_num;
812 MYSQL_ROW mysql_row;
813 MYSQL_TIME mysql_time;
814 #ifdef MARIADB_BASE_VERSION
815 uint not_used_uint;
816 #else
817 my_bool not_used_my_bool;
818 #endif
819 #ifdef SPIDER_HAS_TIME_STATUS
820 MYSQL_TIME_STATUS time_status;
821 #else
822 int time_status;
823 #endif
824 long not_used_long;
825 DBUG_ENTER("spider_db_mbase_result::fetch_table_status");
826 DBUG_PRINT("info",("spider this=%p", this));
827 if (!(mysql_row = mysql_fetch_row(db_result)))
828 {
829 DBUG_PRINT("info",("spider fetch row is null"));
830 if ((error_num = mysql_errno(((spider_db_mbase *) db_conn)->db_conn)))
831 {
832 my_message(error_num,
833 mysql_error(((spider_db_mbase *) db_conn)->db_conn), MYF(0));
834 DBUG_RETURN(error_num);
835 }
836 DBUG_RETURN(ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM);
837 }
838 if (mode == 1)
839 {
840 /* Ok to test for 18 fields as all new fields are added last */
841 if (num_fields() < 18)
842 {
843 DBUG_PRINT("info",("spider field_count < 18"));
844 DBUG_RETURN(ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM);
845 }
846
847 if (mysql_row[4])
848 stat.records =
849 (ha_rows) my_strtoll10(mysql_row[4], (char**) NULL, &error_num);
850 else
851 stat.records = (ha_rows) 0;
852 DBUG_PRINT("info",
853 ("spider records=%lld", stat.records));
854 if (mysql_row[5])
855 stat.mean_rec_length =
856 (ulong) my_strtoll10(mysql_row[5], (char**) NULL, &error_num);
857 else
858 stat.mean_rec_length = 0;
859 DBUG_PRINT("info",
860 ("spider mean_rec_length=%lu", stat.mean_rec_length));
861 if (mysql_row[6])
862 stat.data_file_length =
863 (ulonglong) my_strtoll10(mysql_row[6], (char**) NULL, &error_num);
864 else
865 stat.data_file_length = 0;
866 DBUG_PRINT("info",
867 ("spider data_file_length=%lld", stat.data_file_length));
868 if (mysql_row[7])
869 stat.max_data_file_length =
870 (ulonglong) my_strtoll10(mysql_row[7], (char**) NULL, &error_num);
871 else
872 stat.max_data_file_length = 0;
873 DBUG_PRINT("info",
874 ("spider max_data_file_length=%lld", stat.max_data_file_length));
875 if (mysql_row[8])
876 stat.index_file_length =
877 (ulonglong) my_strtoll10(mysql_row[8], (char**) NULL, &error_num);
878 else
879 stat.index_file_length = 0;
880 DBUG_PRINT("info",
881 ("spider index_file_length=%lld", stat.index_file_length));
882 if (mysql_row[10])
883 stat.auto_increment_value =
884 (ulonglong) my_strtoll10(mysql_row[10], (char**) NULL, &error_num);
885 else
886 stat.auto_increment_value = 1;
887 DBUG_PRINT("info",
888 ("spider auto_increment_value=%lld", stat.auto_increment_value));
889 if (mysql_row[11])
890 {
891 #ifdef SPIDER_HAS_TIME_STATUS
892 my_time_status_init(&time_status);
893 #endif
894 SPIDER_str_to_datetime(mysql_row[11], strlen(mysql_row[11]),
895 &mysql_time, 0, &time_status);
896 #ifdef MARIADB_BASE_VERSION
897 stat.create_time = (time_t) my_system_gmt_sec(&mysql_time,
898 ¬_used_long, ¬_used_uint);
899 #else
900 stat.create_time = (time_t) my_system_gmt_sec(&mysql_time,
901 ¬_used_long, ¬_used_my_bool);
902 #endif
903 } else
904 stat.create_time = (time_t) 0;
905 #ifndef DBUG_OFF
906 {
907 struct tm *ts, tmp_ts;
908 char buf[80];
909 ts = localtime_r(&stat.create_time, &tmp_ts);
910 strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", ts);
911 DBUG_PRINT("info",("spider create_time=%s", buf));
912 }
913 #endif
914 if (mysql_row[12])
915 {
916 #ifdef SPIDER_HAS_TIME_STATUS
917 my_time_status_init(&time_status);
918 #endif
919 SPIDER_str_to_datetime(mysql_row[12], strlen(mysql_row[12]),
920 &mysql_time, 0, &time_status);
921 #ifdef MARIADB_BASE_VERSION
922 stat.update_time = (time_t) my_system_gmt_sec(&mysql_time,
923 ¬_used_long, ¬_used_uint);
924 #else
925 stat.update_time = (time_t) my_system_gmt_sec(&mysql_time,
926 ¬_used_long, ¬_used_my_bool);
927 #endif
928 } else
929 stat.update_time = (time_t) 0;
930 #ifndef DBUG_OFF
931 {
932 struct tm *ts, tmp_ts;
933 char buf[80];
934 ts = localtime_r(&stat.update_time, &tmp_ts);
935 strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", ts);
936 DBUG_PRINT("info",("spider update_time=%s", buf));
937 }
938 #endif
939 if (mysql_row[13])
940 {
941 #ifdef SPIDER_HAS_TIME_STATUS
942 my_time_status_init(&time_status);
943 #endif
944 SPIDER_str_to_datetime(mysql_row[13], strlen(mysql_row[13]),
945 &mysql_time, 0, &time_status);
946 #ifdef MARIADB_BASE_VERSION
947 stat.check_time = (time_t) my_system_gmt_sec(&mysql_time,
948 ¬_used_long, ¬_used_uint);
949 #else
950 stat.check_time = (time_t) my_system_gmt_sec(&mysql_time,
951 ¬_used_long, ¬_used_my_bool);
952 #endif
953 } else
954 stat.check_time = (time_t) 0;
955 #ifndef DBUG_OFF
956 {
957 struct tm *ts, tmp_ts;
958 char buf[80];
959 ts = localtime_r(&stat.check_time, &tmp_ts);
960 strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", ts);
961 DBUG_PRINT("info",("spider check_time=%s", buf));
962 }
963 #endif
964 if (mysql_row[15])
965 {
966 stat.checksum_null = FALSE;
967 stat.checksum =
968 (ha_checksum) my_strtoll10(mysql_row[15], (char**) NULL, &error_num);
969 DBUG_PRINT("info", ("spider checksum=%lu", (ulong) stat.checksum));
970 } else {
971 stat.checksum_null = TRUE;
972 stat.checksum = (ha_checksum) 0;
973 DBUG_PRINT("info", ("spider checksum is null"));
974 }
975 } else {
976 if (mysql_row[0])
977 stat.records =
978 (ha_rows) my_strtoll10(mysql_row[0], (char**) NULL, &error_num);
979 else
980 stat.records = (ha_rows) 0;
981 DBUG_PRINT("info",
982 ("spider records=%lld", stat.records));
983 if (mysql_row[1])
984 stat.mean_rec_length =
985 (ulong) my_strtoll10(mysql_row[1], (char**) NULL, &error_num);
986 else
987 stat.mean_rec_length = 0;
988 DBUG_PRINT("info",
989 ("spider mean_rec_length=%lu", stat.mean_rec_length));
990 if (mysql_row[2])
991 stat.data_file_length =
992 (ulonglong) my_strtoll10(mysql_row[2], (char**) NULL, &error_num);
993 else
994 stat.data_file_length = 0;
995 DBUG_PRINT("info",
996 ("spider data_file_length=%lld", stat.data_file_length));
997 if (mysql_row[3])
998 stat.max_data_file_length =
999 (ulonglong) my_strtoll10(mysql_row[3], (char**) NULL, &error_num);
1000 else
1001 stat.max_data_file_length = 0;
1002 DBUG_PRINT("info",
1003 ("spider max_data_file_length=%lld", stat.max_data_file_length));
1004 if (mysql_row[4])
1005 stat.index_file_length =
1006 (ulonglong) my_strtoll10(mysql_row[4], (char**) NULL, &error_num);
1007 else
1008 stat.index_file_length = 0;
1009 DBUG_PRINT("info",
1010 ("spider index_file_length=%lld", stat.index_file_length));
1011 if (mysql_row[5])
1012 stat.auto_increment_value =
1013 (ulonglong) my_strtoll10(mysql_row[5], (char**) NULL, &error_num);
1014 else
1015 stat.auto_increment_value = 1;
1016 DBUG_PRINT("info",
1017 ("spider auto_increment_value=%lld", stat.auto_increment_value));
1018 if (mysql_row[6])
1019 {
1020 #ifdef SPIDER_HAS_TIME_STATUS
1021 my_time_status_init(&time_status);
1022 #endif
1023 SPIDER_str_to_datetime(mysql_row[6], strlen(mysql_row[6]),
1024 &mysql_time, 0, &time_status);
1025 #ifdef MARIADB_BASE_VERSION
1026 stat.create_time = (time_t) my_system_gmt_sec(&mysql_time,
1027 ¬_used_long, ¬_used_uint);
1028 #else
1029 stat.create_time = (time_t) my_system_gmt_sec(&mysql_time,
1030 ¬_used_long, ¬_used_my_bool);
1031 #endif
1032 } else
1033 stat.create_time = (time_t) 0;
1034 #ifndef DBUG_OFF
1035 {
1036 struct tm *ts, tmp_ts;
1037 char buf[80];
1038 ts = localtime_r(&stat.create_time, &tmp_ts);
1039 strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", ts);
1040 DBUG_PRINT("info",("spider create_time=%s", buf));
1041 }
1042 #endif
1043 if (mysql_row[7])
1044 {
1045 #ifdef SPIDER_HAS_TIME_STATUS
1046 my_time_status_init(&time_status);
1047 #endif
1048 SPIDER_str_to_datetime(mysql_row[7], strlen(mysql_row[7]),
1049 &mysql_time, 0, &time_status);
1050 #ifdef MARIADB_BASE_VERSION
1051 stat.update_time = (time_t) my_system_gmt_sec(&mysql_time,
1052 ¬_used_long, ¬_used_uint);
1053 #else
1054 stat.update_time = (time_t) my_system_gmt_sec(&mysql_time,
1055 ¬_used_long, ¬_used_my_bool);
1056 #endif
1057 } else
1058 stat.update_time = (time_t) 0;
1059 #ifndef DBUG_OFF
1060 {
1061 struct tm *ts, tmp_ts;
1062 char buf[80];
1063 ts = localtime_r(&stat.update_time, &tmp_ts);
1064 strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", ts);
1065 DBUG_PRINT("info",("spider update_time=%s", buf));
1066 }
1067 #endif
1068 if (mysql_row[8])
1069 {
1070 #ifdef SPIDER_HAS_TIME_STATUS
1071 my_time_status_init(&time_status);
1072 #endif
1073 SPIDER_str_to_datetime(mysql_row[8], strlen(mysql_row[8]),
1074 &mysql_time, 0, &time_status);
1075 #ifdef MARIADB_BASE_VERSION
1076 stat.check_time = (time_t) my_system_gmt_sec(&mysql_time,
1077 ¬_used_long, ¬_used_uint);
1078 #else
1079 stat.check_time = (time_t) my_system_gmt_sec(&mysql_time,
1080 ¬_used_long, ¬_used_my_bool);
1081 #endif
1082 } else
1083 stat.check_time = (time_t) 0;
1084 #ifndef DBUG_OFF
1085 {
1086 struct tm *ts, tmp_ts;
1087 char buf[80];
1088 ts = localtime_r(&stat.check_time, &tmp_ts);
1089 strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", ts);
1090 DBUG_PRINT("info",("spider check_time=%s", buf));
1091 }
1092 #endif
1093 if (mysql_row[9])
1094 {
1095 stat.checksum_null = FALSE;
1096 stat.checksum =
1097 (ha_checksum) my_strtoll10(mysql_row[9], (char**) NULL, &error_num);
1098 DBUG_PRINT("info", ("spider checksum=%lu", (ulong) stat.checksum));
1099 } else {
1100 stat.checksum_null = TRUE;
1101 stat.checksum = (ha_checksum) 0;
1102 DBUG_PRINT("info", ("spider checksum is null"));
1103 }
1104 }
1105 DBUG_RETURN(0);
1106 }
1107
fetch_simple_action(uint simple_action,uint position,void * param)1108 int spider_db_mbase_result::fetch_simple_action(
1109 uint simple_action,
1110 uint position,
1111 void *param
1112 ) {
1113 int error_num;
1114 MYSQL_ROW mysql_row;
1115 DBUG_ENTER("spider_db_mbase_result::fetch_simple_action");
1116 DBUG_PRINT("info",("spider this=%p", this));
1117 if (!(mysql_row = mysql_fetch_row(db_result)))
1118 {
1119 DBUG_PRINT("info",("spider fetch row is null"));
1120 if ((error_num = mysql_errno(((spider_db_mbase *) db_conn)->db_conn)))
1121 {
1122 my_message(error_num,
1123 mysql_error(((spider_db_mbase *) db_conn)->db_conn), MYF(0));
1124 DBUG_RETURN(error_num);
1125 }
1126 DBUG_RETURN(ER_QUERY_ON_FOREIGN_DATA_SOURCE);
1127 }
1128 if (num_fields() <= position)
1129 {
1130 DBUG_RETURN(ER_QUERY_ON_FOREIGN_DATA_SOURCE);
1131 }
1132 switch (simple_action)
1133 {
1134 case SPIDER_SIMPLE_RECORDS:
1135 {
1136 ha_rows *records = (ha_rows *) param;
1137 if (mysql_row[position])
1138 {
1139 *records =
1140 (ha_rows) my_strtoll10(mysql_row[position], (char**) NULL,
1141 &error_num);
1142 } else {
1143 *records = (ha_rows) 0;
1144 }
1145 DBUG_PRINT("info", ("spider records=%lld", *records));
1146 break;
1147 }
1148 #ifdef HA_HAS_CHECKSUM_EXTENDED
1149 case SPIDER_SIMPLE_CHECKSUM_TABLE:
1150 {
1151 ha_spider *spider = (ha_spider *) param;
1152 if (mysql_row[position])
1153 {
1154 spider->checksum_val =
1155 (ha_checksum) my_strtoll10(mysql_row[position], (char**) NULL,
1156 &error_num);
1157 DBUG_PRINT("info", ("spider checksum=%llu", (ulonglong)spider->checksum_val));
1158 spider->checksum_null = FALSE;
1159 } else {
1160 spider->checksum_null = TRUE;
1161 DBUG_PRINT("info", ("spider checksum is null"));
1162 }
1163 break;
1164 }
1165 #endif
1166 default:
1167 DBUG_ASSERT(0);
1168 break;
1169 }
1170 DBUG_RETURN(0);
1171 }
1172
fetch_table_records(int mode,ha_rows & records)1173 int spider_db_mbase_result::fetch_table_records(
1174 int mode,
1175 ha_rows &records
1176 ) {
1177 DBUG_ENTER("spider_db_mbase_result::fetch_table_records");
1178 DBUG_PRINT("info",("spider this=%p", this));
1179 if (mode == 1)
1180 {
1181 DBUG_RETURN(fetch_simple_action(SPIDER_SIMPLE_RECORDS,
1182 SPIDER_SQL_SHOW_RECORDS_RECORDS_POS, &records));
1183 } else {
1184 DBUG_RETURN(fetch_simple_action(SPIDER_SIMPLE_RECORDS,
1185 SPIDER_SQL_EXPLAIN_SELECT_RECORDS_POS, &records));
1186 }
1187 }
1188
1189 #ifdef HA_HAS_CHECKSUM_EXTENDED
fetch_table_checksum(ha_spider * spider)1190 int spider_db_mbase_result::fetch_table_checksum(
1191 ha_spider *spider
1192 ) {
1193 DBUG_ENTER("spider_db_mbase_result::fetch_table_checksum");
1194 DBUG_PRINT("info",("spider this=%p", this));
1195 DBUG_RETURN(fetch_simple_action(SPIDER_SIMPLE_CHECKSUM_TABLE,
1196 SPIDER_SQL_CHECKSUM_CHECKSUM_POS, spider));
1197 }
1198 #endif
1199
fetch_table_cardinality(int mode,TABLE * table,longlong * cardinality,uchar * cardinality_upd,int bitmap_size)1200 int spider_db_mbase_result::fetch_table_cardinality(
1201 int mode,
1202 TABLE *table,
1203 longlong *cardinality,
1204 uchar *cardinality_upd,
1205 int bitmap_size
1206 ) {
1207 int error_num;
1208 MYSQL_ROW mysql_row;
1209 Field *field;
1210 DBUG_ENTER("spider_db_mbase_result::fetch_table_cardinality");
1211 DBUG_PRINT("info",("spider this=%p", this));
1212 memset((uchar *) cardinality_upd, 0, sizeof(uchar) * bitmap_size);
1213 if (!(mysql_row = mysql_fetch_row(db_result)))
1214 {
1215 DBUG_PRINT("info",("spider fetch row is null"));
1216 if ((error_num = mysql_errno(((spider_db_mbase *) db_conn)->db_conn)))
1217 {
1218 my_message(error_num,
1219 mysql_error(((spider_db_mbase *) db_conn)->db_conn), MYF(0));
1220 DBUG_RETURN(error_num);
1221 }
1222 /* no index */
1223 DBUG_RETURN(0);
1224 }
1225 if (mode == 1)
1226 {
1227 uint num_fields = this->num_fields();
1228 if (num_fields < 12 || num_fields > 13)
1229 {
1230 DBUG_PRINT("info",("spider num_fields < 12 || num_fields > 13"));
1231 DBUG_RETURN(ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM);
1232 }
1233
1234 while (mysql_row)
1235 {
1236 if (
1237 mysql_row[4] &&
1238 mysql_row[6] &&
1239 (field = find_field_in_table_sef(table, mysql_row[4]))
1240 ) {
1241 if ((cardinality[field->field_index] =
1242 (longlong) my_strtoll10(mysql_row[6], (char**) NULL, &error_num))
1243 <= 0)
1244 cardinality[field->field_index] = 1;
1245 spider_set_bit(cardinality_upd, field->field_index);
1246 DBUG_PRINT("info",
1247 ("spider col_name=%s", mysql_row[4]));
1248 DBUG_PRINT("info",
1249 ("spider cardinality=%lld",
1250 cardinality[field->field_index]));
1251 } else if (mysql_row[4])
1252 {
1253 DBUG_PRINT("info",
1254 ("spider skip col_name=%s", mysql_row[4]));
1255 } else {
1256 DBUG_RETURN(ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM);
1257 }
1258 mysql_row = mysql_fetch_row(db_result);
1259 }
1260 } else {
1261 while (mysql_row)
1262 {
1263 if (
1264 mysql_row[0] &&
1265 mysql_row[1] &&
1266 (field = find_field_in_table_sef(table, mysql_row[0]))
1267 ) {
1268 if ((cardinality[field->field_index] =
1269 (longlong) my_strtoll10(mysql_row[1], (char**) NULL, &error_num))
1270 <= 0)
1271 cardinality[field->field_index] = 1;
1272 spider_set_bit(cardinality_upd, field->field_index);
1273 DBUG_PRINT("info",
1274 ("spider col_name=%s", mysql_row[0]));
1275 DBUG_PRINT("info",
1276 ("spider cardinality=%lld",
1277 cardinality[field->field_index]));
1278 } else if (mysql_row[0])
1279 {
1280 DBUG_PRINT("info",
1281 ("spider skip col_name=%s", mysql_row[0]));
1282 } else {
1283 DBUG_RETURN(ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM);
1284 }
1285 mysql_row = mysql_fetch_row(db_result);
1286 }
1287 }
1288 if ((error_num = mysql_errno(((spider_db_mbase *) db_conn)->db_conn)))
1289 {
1290 my_message(error_num,
1291 mysql_error(((spider_db_mbase *) db_conn)->db_conn), MYF(0));
1292 DBUG_RETURN(error_num);
1293 }
1294 DBUG_RETURN(0);
1295 }
1296
fetch_table_mon_status(int & status)1297 int spider_db_mbase_result::fetch_table_mon_status(
1298 int &status
1299 ) {
1300 int error_num;
1301 MYSQL_ROW mysql_row;
1302 DBUG_ENTER("spider_db_mbase_result::fetch_table_mon_status");
1303 DBUG_PRINT("info",("spider this=%p", this));
1304 if (!(mysql_row = mysql_fetch_row(db_result)))
1305 {
1306 DBUG_PRINT("info",("spider fetch row is null"));
1307 if ((error_num = mysql_errno(((spider_db_mbase *) db_conn)->db_conn)))
1308 {
1309 my_message(error_num,
1310 mysql_error(((spider_db_mbase *) db_conn)->db_conn), MYF(0));
1311 DBUG_RETURN(error_num);
1312 }
1313 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1314 }
1315 if (num_fields() != 1)
1316 {
1317 DBUG_PRINT("info",("spider num_fields != 1"));
1318 my_printf_error(ER_SPIDER_UNKNOWN_NUM, ER_SPIDER_UNKNOWN_STR, MYF(0));
1319 DBUG_RETURN(ER_SPIDER_UNKNOWN_NUM);
1320 }
1321 if (mysql_row[0])
1322 status = atoi(mysql_row[0]);
1323 else
1324 status = SPIDER_LINK_MON_OK;
1325 DBUG_PRINT("info", ("spider status=%d", status));
1326 DBUG_RETURN(0);
1327 }
1328
fetch_show_master_status(const char ** binlog_file_name,const char ** binlog_pos)1329 int spider_db_mbase_result::fetch_show_master_status(
1330 const char **binlog_file_name,
1331 const char **binlog_pos
1332 ) {
1333 int error_num;
1334 MYSQL_ROW mysql_row;
1335 DBUG_ENTER("spider_db_mbase_result::fetch_show_master_status");
1336 DBUG_PRINT("info",("spider this=%p", this));
1337 if (!(mysql_row = mysql_fetch_row(db_result)))
1338 {
1339 DBUG_PRINT("info",("spider fetch row is null"));
1340 if ((error_num = mysql_errno(((spider_db_mbase *) db_conn)->db_conn)))
1341 {
1342 my_message(error_num,
1343 mysql_error(((spider_db_mbase *) db_conn)->db_conn), MYF(0));
1344 DBUG_RETURN(error_num);
1345 }
1346 DBUG_RETURN(ER_QUERY_ON_FOREIGN_DATA_SOURCE);
1347 }
1348 if (num_fields() != 4)
1349 {
1350 DBUG_RETURN(ER_QUERY_ON_FOREIGN_DATA_SOURCE);
1351 }
1352
1353 *binlog_file_name = mysql_row[0];
1354 DBUG_PRINT("info",("spider binlog_file_name=%s", *binlog_file_name));
1355 *binlog_pos = mysql_row[1];
1356 DBUG_PRINT("info",("spider binlog_pos=%s", *binlog_pos));
1357 DBUG_RETURN(0);
1358 }
1359
fetch_select_binlog_gtid_pos(const char ** gtid_pos)1360 int spider_db_mbase_result::fetch_select_binlog_gtid_pos(
1361 const char **gtid_pos
1362 ) {
1363 int error_num;
1364 MYSQL_ROW mysql_row;
1365 DBUG_ENTER("spider_db_mbase_result::fetch_select_binlog_gtid_pos");
1366 DBUG_PRINT("info",("spider this=%p", this));
1367 if (!(mysql_row = mysql_fetch_row(db_result)))
1368 {
1369 DBUG_PRINT("info",("spider fetch row is null"));
1370 if ((error_num = mysql_errno(((spider_db_mbase *) db_conn)->db_conn)))
1371 {
1372 my_message(error_num,
1373 mysql_error(((spider_db_mbase *) db_conn)->db_conn), MYF(0));
1374 DBUG_RETURN(error_num);
1375 }
1376 DBUG_RETURN(ER_QUERY_ON_FOREIGN_DATA_SOURCE);
1377 }
1378 if (num_fields() != 1)
1379 {
1380 DBUG_RETURN(ER_QUERY_ON_FOREIGN_DATA_SOURCE);
1381 }
1382
1383 *gtid_pos = mysql_row[0];
1384 DBUG_PRINT("info",("spider gtid_pos=%s", *gtid_pos));
1385 DBUG_RETURN(0);
1386 }
1387
num_rows()1388 longlong spider_db_mbase_result::num_rows()
1389 {
1390 DBUG_ENTER("spider_db_mbase_result::num_rows");
1391 DBUG_PRINT("info",("spider this=%p", this));
1392 DBUG_RETURN((longlong) mysql_num_rows(db_result));
1393 }
1394
num_fields()1395 uint spider_db_mbase_result::num_fields()
1396 {
1397 DBUG_ENTER("spider_db_mbase_result::num_fields");
1398 DBUG_PRINT("info",("spider this=%p", this));
1399 DBUG_RETURN(mysql_num_fields(db_result));
1400 }
1401
move_to_pos(longlong pos)1402 void spider_db_mbase_result::move_to_pos(
1403 longlong pos
1404 ) {
1405 DBUG_ENTER("spider_db_mbase_result::move_to_pos");
1406 DBUG_PRINT("info",("spider this=%p", this));
1407 DBUG_PRINT("info",("spider pos=%lld", pos));
1408 /*
1409 DBUG_ASSERT(first_row);
1410 */
1411 db_result->data_cursor = first_row + pos;
1412 DBUG_VOID_RETURN;
1413 }
1414
get_errno()1415 int spider_db_mbase_result::get_errno()
1416 {
1417 DBUG_ENTER("spider_db_mbase_result::get_errno");
1418 DBUG_PRINT("info",("spider this=%p", this));
1419 DBUG_PRINT("info",("spider store_error_num=%d", store_error_num));
1420 DBUG_RETURN(store_error_num);
1421 }
1422
1423 #ifdef SPIDER_HAS_DISCOVER_TABLE_STRUCTURE
fetch_columns_for_discover_table_structure(spider_string * str,CHARSET_INFO * access_charset)1424 int spider_db_mbase_result::fetch_columns_for_discover_table_structure(
1425 spider_string *str,
1426 CHARSET_INFO *access_charset
1427 ) {
1428 int error_num;
1429 uint length;
1430 MYSQL_ROW mysql_row;
1431 DBUG_ENTER("spider_db_mbase_result::fetch_columns_for_discover_table_structure");
1432 DBUG_PRINT("info",("spider this=%p", this));
1433 if (!(mysql_row = mysql_fetch_row(db_result)))
1434 {
1435 DBUG_PRINT("info",("spider fetch row is null"));
1436 if ((error_num = mysql_errno(((spider_db_mbase *) db_conn)->db_conn)))
1437 {
1438 my_message(error_num,
1439 mysql_error(((spider_db_mbase *) db_conn)->db_conn), MYF(0));
1440 DBUG_RETURN(error_num);
1441 }
1442 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1443 }
1444 if (num_fields() != 7)
1445 {
1446 DBUG_PRINT("info",("spider num_fields != 7"));
1447 my_printf_error(ER_SPIDER_UNKNOWN_NUM, ER_SPIDER_UNKNOWN_STR, MYF(0));
1448 DBUG_RETURN(ER_SPIDER_UNKNOWN_NUM);
1449 }
1450 do {
1451 if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN))
1452 {
1453 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1454 }
1455 str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
1456 if (str->append(mysql_row[0], strlen(mysql_row[0]), access_charset))
1457 {
1458 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1459 }
1460 if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN + SPIDER_SQL_SPACE_LEN))
1461 {
1462 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1463 }
1464 str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
1465 str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
1466 if (str->append(mysql_row[5], strlen(mysql_row[5]), access_charset))
1467 {
1468 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1469 }
1470 if (mysql_row[3])
1471 {
1472 length = strlen(mysql_row[3]);
1473 if (str->reserve(SPIDER_SQL_CHARACTER_SET_LEN + length))
1474 {
1475 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1476 }
1477 str->q_append(SPIDER_SQL_CHARACTER_SET_STR, SPIDER_SQL_CHARACTER_SET_LEN);
1478 str->q_append(mysql_row[3], length);
1479 }
1480 if (mysql_row[4])
1481 {
1482 length = strlen(mysql_row[4]);
1483 if (str->reserve(SPIDER_SQL_COLLATE_LEN + length))
1484 {
1485 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1486 }
1487 str->q_append(SPIDER_SQL_COLLATE_STR, SPIDER_SQL_COLLATE_LEN);
1488 str->q_append(mysql_row[4], length);
1489 }
1490 if (!strcmp(mysql_row[2], "NO"))
1491 {
1492 if (str->reserve(SPIDER_SQL_NOT_NULL_LEN))
1493 {
1494 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1495 }
1496 str->q_append(SPIDER_SQL_NOT_NULL_STR, SPIDER_SQL_NOT_NULL_LEN);
1497 if (mysql_row[1])
1498 {
1499 if (str->reserve(SPIDER_SQL_DEFAULT_LEN))
1500 {
1501 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1502 }
1503 str->q_append(SPIDER_SQL_DEFAULT_STR, SPIDER_SQL_DEFAULT_LEN);
1504 if (str->append(mysql_row[1], strlen(mysql_row[1]), access_charset))
1505 {
1506 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1507 }
1508 }
1509 } else {
1510 if (str->reserve(SPIDER_SQL_DEFAULT_LEN))
1511 {
1512 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1513 }
1514 str->q_append(SPIDER_SQL_DEFAULT_STR, SPIDER_SQL_DEFAULT_LEN);
1515 if (mysql_row[1])
1516 {
1517 if (str->append(mysql_row[1], strlen(mysql_row[1]), access_charset))
1518 {
1519 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1520 }
1521 } else {
1522 if (str->reserve(SPIDER_SQL_NULL_LEN))
1523 {
1524 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1525 }
1526 str->q_append(SPIDER_SQL_NULL_STR, SPIDER_SQL_NULL_LEN);
1527 }
1528 }
1529 if (mysql_row[6] && !strcmp(mysql_row[6], "auto_increment"))
1530 {
1531 if (str->reserve(SPIDER_SQL_AUTO_INCREMENT_LEN))
1532 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1533 str->q_append(SPIDER_SQL_AUTO_INCREMENT_STR, SPIDER_SQL_AUTO_INCREMENT_LEN);
1534 }
1535 if (str->reserve(SPIDER_SQL_COMMA_LEN))
1536 {
1537 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1538 }
1539 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
1540 } while ((mysql_row = mysql_fetch_row(db_result)));
1541 if ((error_num = mysql_errno(((spider_db_mbase *) db_conn)->db_conn)))
1542 {
1543 my_message(error_num,
1544 mysql_error(((spider_db_mbase *) db_conn)->db_conn), MYF(0));
1545 DBUG_RETURN(error_num);
1546 }
1547 DBUG_RETURN(0);
1548 }
1549
fetch_index_for_discover_table_structure(spider_string * str,CHARSET_INFO * access_charset)1550 int spider_db_mbase_result::fetch_index_for_discover_table_structure(
1551 spider_string *str,
1552 CHARSET_INFO *access_charset
1553 ) {
1554 int error_num;
1555 MYSQL_ROW mysql_row;
1556 DBUG_ENTER("spider_db_mbase_result::fetch_index_for_discover_table_structure");
1557 DBUG_PRINT("info",("spider this=%p", this));
1558 if (!(mysql_row = mysql_fetch_row(db_result)))
1559 {
1560 DBUG_PRINT("info",("spider fetch row is null"));
1561 if ((error_num = mysql_errno(((spider_db_mbase *) db_conn)->db_conn)))
1562 {
1563 my_message(error_num,
1564 mysql_error(((spider_db_mbase *) db_conn)->db_conn), MYF(0));
1565 DBUG_RETURN(error_num);
1566 }
1567 DBUG_RETURN(0);
1568 }
1569 if (num_fields() != 13)
1570 {
1571 DBUG_PRINT("info",("spider num_fields != 13"));
1572 my_printf_error(ER_SPIDER_UNKNOWN_NUM, ER_SPIDER_UNKNOWN_STR, MYF(0));
1573 DBUG_RETURN(ER_SPIDER_UNKNOWN_NUM);
1574 }
1575 bool first = TRUE;
1576 bool without_size = FALSE;
1577 bool using_hash = FALSE;
1578 do {
1579 if (!strcmp(mysql_row[3], "1"))
1580 {
1581 without_size = FALSE;
1582 if (first)
1583 {
1584 first = FALSE;
1585 } else {
1586 if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN + SPIDER_SQL_COMMA_LEN +
1587 (using_hash ? SPIDER_SQL_USING_HASH_LEN : 0)))
1588 {
1589 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1590 }
1591 str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
1592 if (using_hash)
1593 str->q_append(SPIDER_SQL_USING_HASH_STR, SPIDER_SQL_USING_HASH_LEN);
1594 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
1595 }
1596 /* new index */
1597 if (!strcmp(mysql_row[2], SPIDER_DB_PK_NAME_STR))
1598 {
1599 /* primary key */
1600 if (str->reserve(SPIDER_DB_PK_NAME_LEN + SPIDER_SQL_SPACE_LEN))
1601 {
1602 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1603 }
1604 str->q_append(SPIDER_DB_PK_NAME_STR, SPIDER_DB_PK_NAME_LEN);
1605 str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
1606 } else if (!strcmp(mysql_row[1], "0"))
1607 {
1608 /* unique key */
1609 if (str->reserve(SPIDER_DB_UNIQUE_NAME_LEN + SPIDER_SQL_SPACE_LEN))
1610 {
1611 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1612 }
1613 str->q_append(SPIDER_DB_UNIQUE_NAME_STR, SPIDER_DB_UNIQUE_NAME_LEN);
1614 str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
1615 } else if (mysql_row[10] && !strcmp(mysql_row[10], "FULLTEXT"))
1616 {
1617 /* fulltext key */
1618 if (str->reserve(SPIDER_SQL_FULLTEXT_LEN + SPIDER_SQL_SPACE_LEN))
1619 {
1620 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1621 }
1622 str->q_append(SPIDER_SQL_FULLTEXT_STR, SPIDER_SQL_FULLTEXT_LEN);
1623 str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
1624 } else if (mysql_row[10] && !strcmp(mysql_row[10], "SPATIAL"))
1625 {
1626 /* spatial key */
1627 without_size = TRUE;
1628 if (str->reserve(SPIDER_SQL_SPATIAL_LEN + SPIDER_SQL_SPACE_LEN))
1629 {
1630 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1631 }
1632 str->q_append(SPIDER_SQL_SPATIAL_STR, SPIDER_SQL_SPATIAL_LEN);
1633 str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
1634 }
1635 if (str->reserve(SPIDER_DB_KEY_NAME_LEN + SPIDER_SQL_SPACE_LEN))
1636 {
1637 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1638 }
1639 str->q_append(SPIDER_DB_KEY_NAME_STR, SPIDER_DB_KEY_NAME_LEN);
1640 str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
1641 if (strcmp(mysql_row[2], SPIDER_DB_PK_NAME_STR))
1642 {
1643 if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN))
1644 {
1645 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1646 }
1647 str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
1648 if (str->append(mysql_row[2], strlen(mysql_row[2]), access_charset))
1649 {
1650 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1651 }
1652 if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN))
1653 {
1654 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1655 }
1656 str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
1657 }
1658 if (str->reserve(SPIDER_SQL_OPEN_PAREN_LEN))
1659 {
1660 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1661 }
1662 str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
1663 if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN))
1664 {
1665 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1666 }
1667 str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
1668 if (str->append(mysql_row[4], strlen(mysql_row[4]), access_charset))
1669 {
1670 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1671 }
1672 if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN))
1673 {
1674 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1675 }
1676 str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
1677 if (mysql_row[7] && !without_size)
1678 {
1679 if (str->reserve(SPIDER_SQL_OPEN_PAREN_LEN))
1680 {
1681 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1682 }
1683 str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
1684 if (str->append(mysql_row[7], strlen(mysql_row[7]), access_charset))
1685 {
1686 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1687 }
1688 if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN))
1689 {
1690 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1691 }
1692 str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
1693 }
1694 } else {
1695 if (str->reserve(SPIDER_SQL_COMMA_LEN + SPIDER_SQL_NAME_QUOTE_LEN))
1696 {
1697 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1698 }
1699 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
1700 str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
1701 if (str->append(mysql_row[4], strlen(mysql_row[4]), access_charset))
1702 {
1703 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1704 }
1705 if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN))
1706 {
1707 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1708 }
1709 str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
1710 if (mysql_row[7] && !without_size)
1711 {
1712 if (str->reserve(SPIDER_SQL_OPEN_PAREN_LEN))
1713 {
1714 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1715 }
1716 str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
1717 if (str->append(mysql_row[7], strlen(mysql_row[7]), access_charset))
1718 {
1719 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1720 }
1721 if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN))
1722 {
1723 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1724 }
1725 str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
1726 }
1727 }
1728 if (mysql_row[10] && !strcmp(mysql_row[10], "HASH"))
1729 using_hash = TRUE;
1730 else
1731 using_hash = FALSE;
1732 } while ((mysql_row = mysql_fetch_row(db_result)));
1733 if ((error_num = mysql_errno(((spider_db_mbase *) db_conn)->db_conn)))
1734 {
1735 my_message(error_num,
1736 mysql_error(((spider_db_mbase *) db_conn)->db_conn), MYF(0));
1737 DBUG_RETURN(error_num);
1738 }
1739 if (!first)
1740 {
1741 if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN + SPIDER_SQL_COMMA_LEN +
1742 (using_hash ? SPIDER_SQL_USING_HASH_LEN : 0)))
1743 {
1744 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1745 }
1746 str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
1747 if (using_hash)
1748 str->q_append(SPIDER_SQL_USING_HASH_STR, SPIDER_SQL_USING_HASH_LEN);
1749 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
1750 }
1751 DBUG_RETURN(0);
1752 }
1753
fetch_table_for_discover_table_structure(spider_string * str,SPIDER_SHARE * spider_share,CHARSET_INFO * access_charset)1754 int spider_db_mbase_result::fetch_table_for_discover_table_structure(
1755 spider_string *str,
1756 SPIDER_SHARE *spider_share,
1757 CHARSET_INFO *access_charset
1758 ) {
1759 int error_num;
1760 MYSQL_ROW mysql_row;
1761 DBUG_ENTER("spider_db_mbase_result::fetch_table_for_discover_table_structure");
1762 DBUG_PRINT("info",("spider this=%p", this));
1763 if (!(mysql_row = mysql_fetch_row(db_result)))
1764 {
1765 DBUG_PRINT("info",("spider fetch row is null"));
1766 if ((error_num = mysql_errno(((spider_db_mbase *) db_conn)->db_conn)))
1767 {
1768 my_message(error_num,
1769 mysql_error(((spider_db_mbase *) db_conn)->db_conn), MYF(0));
1770 DBUG_RETURN(error_num);
1771 }
1772 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1773 }
1774 if (num_fields() < 18)
1775 {
1776 DBUG_PRINT("info",("spider num_fields != 18"));
1777 my_printf_error(ER_SPIDER_UNKNOWN_NUM, ER_SPIDER_UNKNOWN_STR, MYF(0));
1778 DBUG_RETURN(ER_SPIDER_UNKNOWN_NUM);
1779 }
1780 if (!mysql_row[14])
1781 {
1782 DBUG_PRINT("info",("spider mysql_row[14] is null"));
1783 my_printf_error(ER_SPIDER_UNKNOWN_NUM, ER_SPIDER_UNKNOWN_STR, MYF(0));
1784 DBUG_RETURN(ER_SPIDER_UNKNOWN_NUM);
1785 }
1786 DBUG_PRINT("info",("spider mysql_row[14]=%s", mysql_row[14]));
1787 if (!spider_share->table_share->table_charset)
1788 {
1789 spider_share->table_share->table_charset = get_charset_by_name(mysql_row[14], MYF(MY_WME));
1790 }
1791 DBUG_RETURN(0);
1792 }
1793 #endif
1794
spider_db_mbase(SPIDER_CONN * conn,spider_db_mbase_util * spider_db_mbase_utility)1795 spider_db_mbase::spider_db_mbase(
1796 SPIDER_CONN *conn,
1797 spider_db_mbase_util *spider_db_mbase_utility
1798 ) : spider_db_conn(conn), spider_db_mbase_utility(spider_db_mbase_utility),
1799 lock_table_hash_inited(FALSE), handler_open_array_inited(FALSE)
1800 {
1801 DBUG_ENTER("spider_db_mbase::spider_db_mbase");
1802 DBUG_PRINT("info",("spider this=%p", this));
1803 db_conn = NULL;
1804 DBUG_VOID_RETURN;
1805 }
1806
spider_db_mysql(SPIDER_CONN * conn)1807 spider_db_mysql::spider_db_mysql(
1808 SPIDER_CONN *conn
1809 ) : spider_db_mbase(conn, &spider_db_mysql_utility)
1810 {
1811 DBUG_ENTER("spider_db_mysql::spider_db_mysql");
1812 DBUG_PRINT("info",("spider this=%p", this));
1813 DBUG_VOID_RETURN;
1814 }
1815
spider_db_mariadb(SPIDER_CONN * conn)1816 spider_db_mariadb::spider_db_mariadb(
1817 SPIDER_CONN *conn
1818 ) : spider_db_mbase(conn, &spider_db_mariadb_utility)
1819 {
1820 DBUG_ENTER("spider_db_mariadb::spider_db_mariadb");
1821 DBUG_PRINT("info",("spider this=%p", this));
1822 DBUG_VOID_RETURN;
1823 }
1824
~spider_db_mbase()1825 spider_db_mbase::~spider_db_mbase()
1826 {
1827 DBUG_ENTER("spider_db_mbase::~spider_db_mbase");
1828 DBUG_PRINT("info",("spider this=%p", this));
1829 if (handler_open_array_inited)
1830 {
1831 reset_opened_handler();
1832 spider_free_mem_calc(spider_current_trx,
1833 handler_open_array_id,
1834 handler_open_array.max_element *
1835 handler_open_array.size_of_element);
1836 delete_dynamic(&handler_open_array);
1837 }
1838 if (lock_table_hash_inited)
1839 {
1840 spider_free_mem_calc(spider_current_trx,
1841 lock_table_hash_id,
1842 lock_table_hash.array.max_element *
1843 lock_table_hash.array.size_of_element);
1844 my_hash_free(&lock_table_hash);
1845 }
1846 DBUG_VOID_RETURN;
1847 }
1848
~spider_db_mysql()1849 spider_db_mysql::~spider_db_mysql()
1850 {
1851 DBUG_ENTER("spider_db_mysql::~spider_db_mysql");
1852 DBUG_PRINT("info",("spider this=%p", this));
1853 DBUG_VOID_RETURN;
1854 }
1855
~spider_db_mariadb()1856 spider_db_mariadb::~spider_db_mariadb()
1857 {
1858 DBUG_ENTER("spider_db_mariadb::~spider_db_mariadb");
1859 DBUG_PRINT("info",("spider this=%p", this));
1860 DBUG_VOID_RETURN;
1861 }
1862
init()1863 int spider_db_mbase::init()
1864 {
1865 DBUG_ENTER("spider_db_mbase::init");
1866 DBUG_PRINT("info",("spider this=%p", this));
1867 if (
1868 my_hash_init(&lock_table_hash, spd_charset_utf8_bin, 32, 0, 0,
1869 (my_hash_get_key) spider_link_get_key, 0, 0)
1870 ) {
1871 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1872 }
1873 spider_alloc_calc_mem_init(lock_table_hash, 140);
1874 spider_alloc_calc_mem(spider_current_trx,
1875 lock_table_hash,
1876 lock_table_hash.array.max_element *
1877 lock_table_hash.array.size_of_element);
1878 lock_table_hash_inited = TRUE;
1879
1880 if (
1881 SPD_INIT_DYNAMIC_ARRAY2(&handler_open_array,
1882 sizeof(SPIDER_LINK_FOR_HASH *), NULL, 16, 16, MYF(MY_WME))
1883 ) {
1884 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1885 }
1886 spider_alloc_calc_mem_init(handler_open_array, 162);
1887 spider_alloc_calc_mem(spider_current_trx,
1888 handler_open_array,
1889 handler_open_array.max_element *
1890 handler_open_array.size_of_element);
1891 handler_open_array_inited = TRUE;
1892 DBUG_RETURN(0);
1893 }
1894
is_connected()1895 bool spider_db_mbase::is_connected()
1896 {
1897 DBUG_ENTER("spider_db_mbase::is_connected");
1898 DBUG_PRINT("info",("spider this=%p", this));
1899 DBUG_RETURN(db_conn);
1900 }
1901
bg_connect()1902 void spider_db_mbase::bg_connect()
1903 {
1904 DBUG_ENTER("spider_db_mbase::bg_connect");
1905 DBUG_PRINT("info",("spider this=%p", this));
1906 DBUG_VOID_RETURN;
1907 }
1908
connect(char * tgt_host,char * tgt_username,char * tgt_password,long tgt_port,char * tgt_socket,char * server_name,int connect_retry_count,longlong connect_retry_interval)1909 int spider_db_mbase::connect(
1910 char *tgt_host,
1911 char *tgt_username,
1912 char *tgt_password,
1913 long tgt_port,
1914 char *tgt_socket,
1915 char *server_name,
1916 int connect_retry_count,
1917 longlong connect_retry_interval
1918 ) {
1919 int error_num;
1920 my_bool connect_mutex = spider_param_connect_mutex();
1921 DBUG_ENTER("spider_db_mbase::connect");
1922 DBUG_PRINT("info",("spider this=%p", this));
1923 while (TRUE)
1924 {
1925 THD *thd = current_thd;
1926 DBUG_PRINT("info",("spider thd->killed=%s",
1927 thd ? (thd->killed ? "TRUE" : "FALSE") : "NULL"));
1928 DBUG_PRINT("info",("spider abort_loop=%s",
1929 *spd_abort_loop ? "TRUE" : "FALSE"));
1930 if (
1931 (thd && thd->killed) ||
1932 *spd_abort_loop
1933 ) {
1934 DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
1935 }
1936
1937 if (!db_conn)
1938 {
1939 if (!(db_conn = mysql_init(NULL)))
1940 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
1941 }
1942
1943 mysql_options(db_conn, MYSQL_OPT_READ_TIMEOUT,
1944 &conn->net_read_timeout);
1945 mysql_options(db_conn, MYSQL_OPT_WRITE_TIMEOUT,
1946 &conn->net_write_timeout);
1947 mysql_options(db_conn, MYSQL_OPT_CONNECT_TIMEOUT,
1948 &conn->connect_timeout);
1949 mysql_options(db_conn, MYSQL_OPT_USE_REMOTE_CONNECTION,
1950 NULL);
1951
1952 if (
1953 conn->tgt_ssl_ca_length |
1954 conn->tgt_ssl_capath_length |
1955 conn->tgt_ssl_cert_length |
1956 conn->tgt_ssl_key_length
1957 ) {
1958 mysql_ssl_set(db_conn, conn->tgt_ssl_key, conn->tgt_ssl_cert,
1959 conn->tgt_ssl_ca, conn->tgt_ssl_capath, conn->tgt_ssl_cipher);
1960 if (conn->tgt_ssl_vsc)
1961 {
1962 my_bool verify_flg = TRUE;
1963 mysql_options(db_conn, MYSQL_OPT_SSL_VERIFY_SERVER_CERT,
1964 &verify_flg);
1965 }
1966 }
1967
1968 if (conn->tgt_default_file)
1969 {
1970 DBUG_PRINT("info",("spider tgt_default_file=%s",
1971 conn->tgt_default_file));
1972 mysql_options(db_conn, MYSQL_READ_DEFAULT_FILE,
1973 conn->tgt_default_file);
1974 }
1975 if (conn->tgt_default_group)
1976 {
1977 DBUG_PRINT("info",("spider tgt_default_group=%s",
1978 conn->tgt_default_group));
1979 mysql_options(db_conn, MYSQL_READ_DEFAULT_GROUP,
1980 conn->tgt_default_group);
1981 }
1982
1983 if (!spider_param_same_server_link(thd))
1984 {
1985 if (!strcmp(tgt_host, my_localhost))
1986 {
1987 if (!strcmp(tgt_socket, *spd_mysqld_unix_port))
1988 {
1989 my_printf_error(ER_SPIDER_SAME_SERVER_LINK_NUM,
1990 ER_SPIDER_SAME_SERVER_LINK_STR1, MYF(0),
1991 tgt_host, tgt_socket);
1992 DBUG_RETURN(ER_SPIDER_SAME_SERVER_LINK_NUM);
1993 }
1994 } else if (!strcmp(tgt_host, "127.0.0.1") ||
1995 !strcmp(tgt_host, glob_hostname))
1996 {
1997 if (tgt_port == (long) *spd_mysqld_port)
1998 {
1999 my_printf_error(ER_SPIDER_SAME_SERVER_LINK_NUM,
2000 ER_SPIDER_SAME_SERVER_LINK_STR2, MYF(0),
2001 tgt_host, tgt_port);
2002 DBUG_RETURN(ER_SPIDER_SAME_SERVER_LINK_NUM);
2003 }
2004 }
2005 }
2006
2007 if (connect_mutex)
2008 pthread_mutex_lock(&spider_open_conn_mutex);
2009 /* tgt_db not use */
2010 if (
2011 !spider_param_dry_access() &&
2012 !mysql_real_connect(
2013 db_conn,
2014 tgt_host,
2015 tgt_username,
2016 tgt_password,
2017 NULL,
2018 tgt_port,
2019 tgt_socket,
2020 CLIENT_MULTI_STATEMENTS
2021 )
2022 ) {
2023 if (connect_mutex)
2024 pthread_mutex_unlock(&spider_open_conn_mutex);
2025 error_num = mysql_errno(db_conn);
2026 disconnect();
2027 DBUG_PRINT("info",("spider thd->killed=%s",
2028 thd ? (thd->killed ? "TRUE" : "FALSE") : "NULL"));
2029 DBUG_PRINT("info",("spider abort_loop=%s",
2030 *spd_abort_loop ? "TRUE" : "FALSE"));
2031 if (
2032 (thd && thd->killed) ||
2033 *spd_abort_loop
2034 ) {
2035 DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
2036 }
2037 if (
2038 (
2039 error_num != CR_CONN_HOST_ERROR &&
2040 error_num != CR_CONNECTION_ERROR
2041 ) ||
2042 !connect_retry_count
2043 ) {
2044 if (error_num == ER_CON_COUNT_ERROR)
2045 {
2046 *conn->need_mon = 0;
2047 my_error(ER_CON_COUNT_ERROR, MYF(0));
2048 DBUG_RETURN(ER_CON_COUNT_ERROR);
2049 }
2050 *conn->need_mon = ER_CONNECT_TO_FOREIGN_DATA_SOURCE;
2051 my_error(ER_CONNECT_TO_FOREIGN_DATA_SOURCE, MYF(0),
2052 server_name ? server_name : tgt_host);
2053 DBUG_RETURN(ER_CONNECT_TO_FOREIGN_DATA_SOURCE);
2054 }
2055 connect_retry_count--;
2056 my_sleep((ulong) connect_retry_interval);
2057 } else {
2058 #ifdef SPIDER_NET_HAS_THD
2059 db_conn->net.thd = NULL;
2060 #endif
2061 if (connect_mutex)
2062 pthread_mutex_unlock(&spider_open_conn_mutex);
2063 break;
2064 }
2065 }
2066 DBUG_RETURN(0);
2067 }
2068
ping()2069 int spider_db_mbase::ping(
2070 ) {
2071 DBUG_ENTER("spider_db_mbase::ping");
2072 DBUG_PRINT("info",("spider this=%p", this));
2073 if (spider_param_dry_access())
2074 DBUG_RETURN(0);
2075 DBUG_RETURN(simple_command(db_conn, COM_PING, 0, 0, 0));
2076 }
2077
bg_disconnect()2078 void spider_db_mbase::bg_disconnect()
2079 {
2080 DBUG_ENTER("spider_db_mbase::bg_disconnect");
2081 DBUG_PRINT("info",("spider this=%p", this));
2082 DBUG_VOID_RETURN;
2083 }
2084
disconnect()2085 void spider_db_mbase::disconnect()
2086 {
2087 DBUG_ENTER("spider_db_mbase::disconnect");
2088 DBUG_PRINT("info",("spider this=%p", this));
2089 DBUG_PRINT("info",("spider db_conn=%p", db_conn));
2090 if (db_conn)
2091 {
2092 mysql_close(db_conn);
2093 db_conn = NULL;
2094 }
2095 DBUG_VOID_RETURN;
2096 }
2097
set_net_timeout()2098 int spider_db_mbase::set_net_timeout()
2099 {
2100 DBUG_ENTER("spider_db_mbase::set_net_timeout");
2101 DBUG_PRINT("info",("spider this=%p", this));
2102 DBUG_PRINT("info",("spider conn=%p", conn));
2103 my_net_set_read_timeout(&db_conn->net, conn->net_read_timeout);
2104 my_net_set_write_timeout(&db_conn->net, conn->net_write_timeout);
2105 DBUG_RETURN(0);
2106 }
2107
exec_query(const char * query,uint length,int quick_mode)2108 int spider_db_mbase::exec_query(
2109 const char *query,
2110 uint length,
2111 int quick_mode
2112 ) {
2113 int error_num = 0;
2114 uint log_result_errors = spider_param_log_result_errors();
2115 DBUG_ENTER("spider_db_mbase::exec_query");
2116 DBUG_PRINT("info",("spider this=%p", this));
2117 if (spider_param_general_log())
2118 {
2119 const char *tgt_str = conn->tgt_host;
2120 uint32 tgt_len = conn->tgt_host_length;
2121 spider_string tmp_query_str;
2122 tmp_query_str.init_calc_mem(230);
2123 if (tmp_query_str.reserve(
2124 length + conn->tgt_wrapper_length +
2125 tgt_len + (SPIDER_SQL_SPACE_LEN * 2)))
2126 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
2127 tmp_query_str.q_append(conn->tgt_wrapper, conn->tgt_wrapper_length);
2128 tmp_query_str.q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
2129 tmp_query_str.q_append(tgt_str, tgt_len);
2130 tmp_query_str.q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
2131 tmp_query_str.q_append(query, length);
2132 general_log_write(current_thd, COM_QUERY, tmp_query_str.ptr(),
2133 tmp_query_str.length());
2134 }
2135 if (!spider_param_dry_access())
2136 {
2137 error_num = mysql_real_query(db_conn, query, length);
2138 }
2139 if (
2140 (error_num && log_result_errors >= 1) ||
2141 (log_result_errors >= 2 && db_conn->warning_count > 0) ||
2142 (log_result_errors >= 4)
2143 ) {
2144 THD *thd = current_thd;
2145 uint log_result_error_with_sql = spider_param_log_result_error_with_sql();
2146 if (log_result_error_with_sql)
2147 {
2148 time_t cur_time = (time_t) time((time_t*) 0);
2149 struct tm lt;
2150 struct tm *l_time = localtime_r(&cur_time, <);
2151 spider_string tmp_query_str;
2152 tmp_query_str.init_calc_mem(243);
2153 uint query_length = thd->query_length();
2154 if ((log_result_error_with_sql & 2) && query_length)
2155 {
2156 Security_context *security_ctx = thd->security_ctx;
2157 tmp_query_str.length(0);
2158 if (tmp_query_str.reserve(query_length + 1))
2159 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
2160 tmp_query_str.q_append(thd->query(), query_length);
2161 fprintf(stderr, "%04d%02d%02d %02d:%02d:%02d [RECV SPIDER SQL] "
2162 "from [%s][%s] to %ld: "
2163 "sql: %s\n",
2164 l_time->tm_year + 1900, l_time->tm_mon + 1, l_time->tm_mday,
2165 l_time->tm_hour, l_time->tm_min, l_time->tm_sec,
2166 security_ctx->user ? security_ctx->user : "system user",
2167 security_ctx->host_or_ip,
2168 (ulong) thd->thread_id,
2169 tmp_query_str.c_ptr_safe());
2170 }
2171 if (log_result_error_with_sql & 1)
2172 {
2173 tmp_query_str.length(0);
2174 if (tmp_query_str.reserve(length + 1))
2175 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
2176 tmp_query_str.q_append(query, length);
2177 fprintf(stderr, "%04d%02d%02d %02d:%02d:%02d [SEND SPIDER SQL] "
2178 "from %ld to [%s] %ld: "
2179 "sql: %s\n",
2180 l_time->tm_year + 1900, l_time->tm_mon + 1, l_time->tm_mday,
2181 l_time->tm_hour, l_time->tm_min, l_time->tm_sec,
2182 (ulong) thd->thread_id, conn->tgt_host, (ulong) db_conn->thread_id,
2183 tmp_query_str.c_ptr_safe());
2184 }
2185 }
2186 if (log_result_errors >= 2 && db_conn->warning_count > 0)
2187 {
2188 time_t cur_time = (time_t) time((time_t*) 0);
2189 struct tm lt;
2190 struct tm *l_time = localtime_r(&cur_time, <);
2191 fprintf(stderr, "%04d%02d%02d %02d:%02d:%02d [WARN SPIDER RESULT] "
2192 "from [%s] %ld to %ld: "
2193 "affected_rows: %llu id: %llu status: %u warning_count: %u\n",
2194 l_time->tm_year + 1900, l_time->tm_mon + 1, l_time->tm_mday,
2195 l_time->tm_hour, l_time->tm_min, l_time->tm_sec,
2196 conn->tgt_host, (ulong) db_conn->thread_id, (ulong) thd->thread_id,
2197 db_conn->affected_rows, db_conn->insert_id,
2198 db_conn->server_status, db_conn->warning_count);
2199 if (spider_param_log_result_errors() >= 3)
2200 print_warnings(l_time);
2201 } else if (log_result_errors >= 4)
2202 {
2203 time_t cur_time = (time_t) time((time_t*) 0);
2204 struct tm lt;
2205 struct tm *l_time = localtime_r(&cur_time, <);
2206 fprintf(stderr, "%04d%02d%02d %02d:%02d:%02d [INFO SPIDER RESULT] "
2207 "from [%s] %ld to %ld: "
2208 "affected_rows: %llu id: %llu status: %u warning_count: %u\n",
2209 l_time->tm_year + 1900, l_time->tm_mon + 1, l_time->tm_mday,
2210 l_time->tm_hour, l_time->tm_min, l_time->tm_sec,
2211 conn->tgt_host, (ulong) db_conn->thread_id, (ulong) thd->thread_id,
2212 db_conn->affected_rows, db_conn->insert_id,
2213 db_conn->server_status, db_conn->warning_count);
2214 }
2215 }
2216 DBUG_RETURN(error_num);
2217 }
2218
get_errno()2219 int spider_db_mbase::get_errno()
2220 {
2221 DBUG_ENTER("spider_db_mbase::get_errno");
2222 DBUG_PRINT("info",("spider this=%p", this));
2223 stored_error = mysql_errno(db_conn);
2224 DBUG_PRINT("info",("spider stored_error=%d", stored_error));
2225 DBUG_RETURN(stored_error);
2226 }
2227
get_error()2228 const char *spider_db_mbase::get_error()
2229 {
2230 const char *error_ptr;
2231 DBUG_ENTER("spider_db_mbase::get_error");
2232 DBUG_PRINT("info",("spider this=%p", this));
2233 error_ptr = mysql_error(db_conn);
2234 DBUG_PRINT("info",("spider error=%s", error_ptr));
2235 DBUG_RETURN(error_ptr);
2236 }
2237
is_server_gone_error(int error_num)2238 bool spider_db_mbase::is_server_gone_error(
2239 int error_num
2240 ) {
2241 bool server_gone;
2242 DBUG_ENTER("spider_db_mbase::is_server_gone_error");
2243 DBUG_PRINT("info",("spider this=%p", this));
2244 server_gone =
2245 (error_num == CR_SERVER_GONE_ERROR || error_num == CR_SERVER_LOST);
2246 DBUG_PRINT("info",("spider server_gone=%s", server_gone ? "TRUE" : "FALSE"));
2247 DBUG_RETURN(server_gone);
2248 }
2249
is_dup_entry_error(int error_num)2250 bool spider_db_mbase::is_dup_entry_error(
2251 int error_num
2252 ) {
2253 bool dup_entry;
2254 DBUG_ENTER("spider_db_mbase::is_dup_entry_error");
2255 DBUG_PRINT("info",("spider this=%p", this));
2256 dup_entry =
2257 (
2258 error_num == ER_DUP_ENTRY ||
2259 error_num == ER_DUP_KEY ||
2260 error_num == HA_ERR_FOUND_DUPP_KEY
2261 );
2262 DBUG_PRINT("info",("spider dup_entry=%s", dup_entry ? "TRUE" : "FALSE"));
2263 DBUG_RETURN(dup_entry);
2264 }
2265
is_xa_nota_error(int error_num)2266 bool spider_db_mbase::is_xa_nota_error(
2267 int error_num
2268 ) {
2269 bool xa_nota;
2270 DBUG_ENTER("spider_db_mbase::is_xa_nota_error");
2271 DBUG_PRINT("info",("spider this=%p", this));
2272 xa_nota =
2273 (
2274 error_num == ER_XAER_NOTA ||
2275 error_num == ER_XA_RBTIMEOUT ||
2276 error_num == ER_XA_RBDEADLOCK
2277 );
2278 DBUG_PRINT("info",("spider xa_nota=%s", xa_nota ? "TRUE" : "FALSE"));
2279 DBUG_RETURN(xa_nota);
2280 }
2281
print_warnings(struct tm * l_time)2282 void spider_db_mbase::print_warnings(
2283 struct tm *l_time
2284 ) {
2285 DBUG_ENTER("spider_db_mbase::print_warnings");
2286 DBUG_PRINT("info",("spider this=%p", this));
2287 if (db_conn->status == MYSQL_STATUS_READY)
2288 {
2289 #if MYSQL_VERSION_ID < 50500
2290 if (!(db_conn->last_used_con->server_status & SERVER_MORE_RESULTS_EXISTS))
2291 #else
2292 if (!(db_conn->server_status & SERVER_MORE_RESULTS_EXISTS))
2293 #endif
2294 {
2295 if (
2296 spider_param_dry_access() ||
2297 !mysql_real_query(db_conn, SPIDER_SQL_SHOW_WARNINGS_STR,
2298 SPIDER_SQL_SHOW_WARNINGS_LEN)
2299 ) {
2300 MYSQL_RES *res = NULL;
2301 MYSQL_ROW row = NULL;
2302 uint num_fields;
2303 if (
2304 spider_param_dry_access() ||
2305 !(res = mysql_store_result(db_conn)) ||
2306 !(row = mysql_fetch_row(res))
2307 ) {
2308 if (mysql_errno(db_conn))
2309 {
2310 if (res)
2311 mysql_free_result(res);
2312 DBUG_VOID_RETURN;
2313 }
2314 /* no record is ok */
2315 }
2316 num_fields = mysql_num_fields(res);
2317 if (num_fields != 3)
2318 {
2319 mysql_free_result(res);
2320 DBUG_VOID_RETURN;
2321 }
2322 while (row)
2323 {
2324 fprintf(stderr, "%04d%02d%02d %02d:%02d:%02d [WARN SPIDER RESULT] "
2325 "from [%s] %ld to %ld: %s %s %s\n",
2326 l_time->tm_year + 1900, l_time->tm_mon + 1, l_time->tm_mday,
2327 l_time->tm_hour, l_time->tm_min, l_time->tm_sec,
2328 conn->tgt_host, (ulong) db_conn->thread_id,
2329 (ulong) current_thd->thread_id, row[0], row[1], row[2]);
2330 row = mysql_fetch_row(res);
2331 }
2332 if (res)
2333 mysql_free_result(res);
2334 }
2335 }
2336 }
2337 DBUG_VOID_RETURN;
2338 }
2339
store_result(spider_db_result_buffer ** spider_res_buf,st_spider_db_request_key * request_key,int * error_num)2340 spider_db_result *spider_db_mbase::store_result(
2341 spider_db_result_buffer **spider_res_buf,
2342 st_spider_db_request_key *request_key,
2343 int *error_num
2344 ) {
2345 spider_db_mbase_result *result;
2346 DBUG_ENTER("spider_db_mbase::store_result");
2347 DBUG_PRINT("info",("spider this=%p", this));
2348 DBUG_ASSERT(!spider_res_buf);
2349 if ((result = new spider_db_mbase_result(this)))
2350 {
2351 *error_num = 0;
2352 if (
2353 spider_param_dry_access() ||
2354 !(result->db_result = mysql_store_result(db_conn))
2355 ) {
2356 delete result;
2357 result = NULL;
2358 } else {
2359 result->first_row = result->db_result->data_cursor;
2360 DBUG_PRINT("info",("spider result->first_row=%p", result->first_row));
2361 }
2362 } else {
2363 *error_num = HA_ERR_OUT_OF_MEM;
2364 }
2365 DBUG_RETURN(result);
2366 }
2367
use_result(st_spider_db_request_key * request_key,int * error_num)2368 spider_db_result *spider_db_mbase::use_result(
2369 st_spider_db_request_key *request_key,
2370 int *error_num
2371 ) {
2372 spider_db_mbase_result *result;
2373 DBUG_ENTER("spider_db_mbase::use_result");
2374 DBUG_PRINT("info",("spider this=%p", this));
2375 if ((result = new spider_db_mbase_result(this)))
2376 {
2377 *error_num = 0;
2378 if (
2379 spider_param_dry_access() ||
2380 !(result->db_result = db_conn->methods->use_result(db_conn))
2381 ) {
2382 delete result;
2383 result = NULL;
2384 } else {
2385 result->first_row = NULL;
2386 }
2387 } else {
2388 *error_num = HA_ERR_OUT_OF_MEM;
2389 }
2390 DBUG_RETURN(result);
2391 }
2392
next_result()2393 int spider_db_mbase::next_result()
2394 {
2395 int status;
2396 DBUG_ENTER("spider_db_mbase::next_result");
2397 DBUG_PRINT("info",("spider this=%p", this));
2398 if (db_conn->status != MYSQL_STATUS_READY)
2399 {
2400 my_message(ER_SPIDER_UNKNOWN_NUM, ER_SPIDER_UNKNOWN_STR, MYF(0));
2401 DBUG_RETURN(ER_SPIDER_UNKNOWN_NUM);
2402 }
2403
2404 db_conn->net.last_errno = 0;
2405 db_conn->net.last_error[0] = '\0';
2406 strmov(db_conn->net.sqlstate, "00000");
2407 db_conn->affected_rows = ~(my_ulonglong) 0;
2408
2409 #if MYSQL_VERSION_ID < 50500
2410 if (db_conn->last_used_con->server_status & SERVER_MORE_RESULTS_EXISTS)
2411 #else
2412 if (db_conn->server_status & SERVER_MORE_RESULTS_EXISTS)
2413 #endif
2414 {
2415 if ((status = db_conn->methods->read_query_result(db_conn)) > 0)
2416 DBUG_RETURN(spider_db_errorno(conn));
2417 DBUG_RETURN(status);
2418 }
2419 DBUG_RETURN(-1);
2420 }
2421
affected_rows()2422 uint spider_db_mbase::affected_rows()
2423 {
2424 MYSQL *last_used_con;
2425 DBUG_ENTER("spider_db_mbase::affected_rows");
2426 DBUG_PRINT("info",("spider this=%p", this));
2427 #if MYSQL_VERSION_ID < 50500
2428 last_used_con = db_conn->last_used_con;
2429 #else
2430 last_used_con = db_conn;
2431 #endif
2432 DBUG_RETURN((uint) last_used_con->affected_rows);
2433 }
2434
matched_rows()2435 uint spider_db_mbase::matched_rows()
2436 {
2437 MYSQL *last_used_con;
2438 DBUG_ENTER("spider_db_mysql::matched_rows");
2439 DBUG_PRINT("info", ("spider this=%p", this));
2440 #if MYSQL_VERSION_ID < 50500
2441 last_used_con = db_conn->last_used_con;
2442 #else
2443 last_used_con = db_conn;
2444 #endif
2445 /* Rows matched: 65 Changed: 65 Warnings: 0 */
2446 const char *info = last_used_con->info;
2447 if (!info)
2448 DBUG_RETURN(0);
2449 DBUG_PRINT("info", ("spider info=%s", info));
2450 const char *begin = strstr(info, "Rows matched: ");
2451 if (!begin)
2452 DBUG_RETURN(0);
2453 DBUG_RETURN(atoi(begin + strlen("Rows matched: ")));
2454 }
2455
inserted_info(spider_db_handler * handler,ha_copy_info * copy_info)2456 bool spider_db_mbase::inserted_info(
2457 spider_db_handler *handler,
2458 ha_copy_info *copy_info
2459 ) {
2460 MYSQL *last_used_con;
2461 uchar direct_insert_kind =
2462 ((spider_mbase_handler *) handler)->direct_insert_kind;
2463 DBUG_ENTER("spider_db_mysql::inserted_info");
2464 DBUG_PRINT("info", ("spider this=%p", this));
2465 if (direct_insert_kind == SPIDER_SQL_DIRECT_INSERT_KIND_INSERT)
2466 {
2467 DBUG_RETURN(TRUE);
2468 }
2469 #if MYSQL_VERSION_ID < 50500
2470 last_used_con = db_conn->last_used_con;
2471 #else
2472 last_used_con = db_conn;
2473 #endif
2474 /* Records: 10 Duplicates: 4 Warnings: 0 */
2475 const char *info = last_used_con->info;
2476 if (!info)
2477 DBUG_RETURN(FALSE);
2478 DBUG_PRINT("info", ("spider info=%s", info));
2479 const char *begin = strstr(info, "Records: ");
2480 if (!begin)
2481 DBUG_RETURN(FALSE);
2482 begin += strlen("Records: ");
2483 uint records = atoi(begin);
2484 begin = strstr(begin, "Duplicates: ");
2485 if (!begin)
2486 DBUG_RETURN(FALSE);
2487 uint duplicates = atoi(begin + strlen("Duplicates: "));
2488 copy_info->records+= records;
2489 switch (direct_insert_kind)
2490 {
2491 case SPIDER_SQL_DIRECT_INSERT_KIND_IGNORE:
2492 copy_info->copied+= duplicates;
2493 break;
2494 case SPIDER_SQL_DIRECT_INSERT_KIND_REPLACE:
2495 copy_info->copied+= records;
2496 copy_info->deleted+= duplicates;
2497 break;
2498 case SPIDER_SQL_DIRECT_INSERT_KIND_DUP_UPDATE:
2499 copy_info->touched+= (last_used_con->affected_rows - (duplicates * 2));
2500 copy_info->copied+= (last_used_con->affected_rows - duplicates);
2501 copy_info->updated+= duplicates;
2502 break;
2503 default:
2504 DBUG_ASSERT(0);
2505 DBUG_RETURN(FALSE);
2506 }
2507 DBUG_RETURN(TRUE);
2508 }
2509
last_insert_id()2510 ulonglong spider_db_mbase::last_insert_id()
2511 {
2512 MYSQL *last_used_con;
2513 DBUG_ENTER("spider_db_mbase::last_insert_id");
2514 DBUG_PRINT("info",("spider this=%p", this));
2515 #if MYSQL_VERSION_ID < 50500
2516 last_used_con = db_conn->last_used_con;
2517 #else
2518 last_used_con = db_conn;
2519 #endif
2520 DBUG_RETURN((uint) last_used_con->insert_id);
2521 }
2522
set_character_set(const char * csname)2523 int spider_db_mbase::set_character_set(
2524 const char *csname
2525 ) {
2526 DBUG_ENTER("spider_db_mbase::set_character_set");
2527 DBUG_PRINT("info",("spider this=%p", this));
2528 if (spider_param_dry_access())
2529 DBUG_RETURN(0);
2530 DBUG_RETURN(mysql_set_character_set(db_conn, csname));
2531 }
2532
select_db(const char * dbname)2533 int spider_db_mbase::select_db(
2534 const char *dbname
2535 ) {
2536 DBUG_ENTER("spider_db_mbase::select_db");
2537 DBUG_PRINT("info",("spider this=%p", this));
2538 if (spider_param_dry_access())
2539 DBUG_RETURN(0);
2540 DBUG_RETURN(mysql_select_db(db_conn, dbname));
2541 }
2542
consistent_snapshot(int * need_mon)2543 int spider_db_mbase::consistent_snapshot(
2544 int *need_mon
2545 ) {
2546 DBUG_ENTER("spider_db_mbase::consistent_snapshot");
2547 DBUG_PRINT("info",("spider this=%p", this));
2548 pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
2549 pthread_mutex_lock(&conn->mta_conn_mutex);
2550 SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
2551 conn->need_mon = need_mon;
2552 DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
2553 DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
2554 conn->mta_conn_mutex_lock_already = TRUE;
2555 conn->mta_conn_mutex_unlock_later = TRUE;
2556 if (spider_db_query(
2557 conn,
2558 SPIDER_SQL_START_CONSISTENT_SNAPSHOT_STR,
2559 SPIDER_SQL_START_CONSISTENT_SNAPSHOT_LEN,
2560 -1,
2561 need_mon)
2562 ) {
2563 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
2564 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2565 conn->mta_conn_mutex_lock_already = FALSE;
2566 conn->mta_conn_mutex_unlock_later = FALSE;
2567 DBUG_RETURN(spider_db_errorno(conn));
2568 }
2569 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
2570 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2571 conn->mta_conn_mutex_lock_already = FALSE;
2572 conn->mta_conn_mutex_unlock_later = FALSE;
2573 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
2574 pthread_mutex_unlock(&conn->mta_conn_mutex);
2575 DBUG_RETURN(0);
2576 }
2577
trx_start_in_bulk_sql()2578 bool spider_db_mbase::trx_start_in_bulk_sql()
2579 {
2580 DBUG_ENTER("spider_db_mbase::trx_start_in_bulk_sql");
2581 DBUG_PRINT("info",("spider this=%p", this));
2582 DBUG_RETURN(TRUE);
2583 }
2584
start_transaction(int * need_mon)2585 int spider_db_mbase::start_transaction(
2586 int *need_mon
2587 ) {
2588 DBUG_ENTER("spider_db_mbase::start_transaction");
2589 DBUG_PRINT("info",("spider this=%p", this));
2590 pthread_mutex_assert_owner(&conn->mta_conn_mutex);
2591 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
2592 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2593 if (spider_db_query(
2594 conn,
2595 SPIDER_SQL_START_TRANSACTION_STR,
2596 SPIDER_SQL_START_TRANSACTION_LEN,
2597 -1,
2598 need_mon)
2599 ) {
2600 DBUG_RETURN(spider_db_errorno(conn));
2601 }
2602 DBUG_RETURN(0);
2603 }
2604
commit(int * need_mon)2605 int spider_db_mbase::commit(
2606 int *need_mon
2607 ) {
2608 DBUG_ENTER("spider_db_mbase::commit");
2609 DBUG_PRINT("info",("spider this=%p", this));
2610 pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
2611 pthread_mutex_lock(&conn->mta_conn_mutex);
2612 SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
2613 conn->need_mon = need_mon;
2614 DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
2615 DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
2616 conn->mta_conn_mutex_lock_already = TRUE;
2617 conn->mta_conn_mutex_unlock_later = TRUE;
2618 if (spider_db_query(
2619 conn,
2620 SPIDER_SQL_COMMIT_STR,
2621 SPIDER_SQL_COMMIT_LEN,
2622 -1,
2623 need_mon)
2624 ) {
2625 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
2626 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2627 conn->mta_conn_mutex_lock_already = FALSE;
2628 conn->mta_conn_mutex_unlock_later = FALSE;
2629 DBUG_RETURN(spider_db_errorno(conn));
2630 }
2631 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
2632 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2633 conn->mta_conn_mutex_lock_already = FALSE;
2634 conn->mta_conn_mutex_unlock_later = FALSE;
2635 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
2636 pthread_mutex_unlock(&conn->mta_conn_mutex);
2637 DBUG_RETURN(0);
2638 }
2639
rollback(int * need_mon)2640 int spider_db_mbase::rollback(
2641 int *need_mon
2642 ) {
2643 bool is_error;
2644 int error_num;
2645 DBUG_ENTER("spider_db_mbase::rollback");
2646 DBUG_PRINT("info",("spider this=%p", this));
2647 pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
2648 pthread_mutex_lock(&conn->mta_conn_mutex);
2649 SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
2650 conn->need_mon = need_mon;
2651 DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
2652 DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
2653 conn->mta_conn_mutex_lock_already = TRUE;
2654 conn->mta_conn_mutex_unlock_later = TRUE;
2655 if (spider_db_query(
2656 conn,
2657 SPIDER_SQL_ROLLBACK_STR,
2658 SPIDER_SQL_ROLLBACK_LEN,
2659 -1,
2660 need_mon)
2661 ) {
2662 is_error = conn->thd->is_error();
2663 error_num = spider_db_errorno(conn);
2664 if (
2665 error_num == ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM &&
2666 !is_error
2667 )
2668 conn->thd->clear_error();
2669 else {
2670 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
2671 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2672 conn->mta_conn_mutex_lock_already = FALSE;
2673 conn->mta_conn_mutex_unlock_later = FALSE;
2674 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
2675 pthread_mutex_unlock(&conn->mta_conn_mutex);
2676 DBUG_RETURN(error_num);
2677 }
2678 }
2679 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
2680 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2681 conn->mta_conn_mutex_lock_already = FALSE;
2682 conn->mta_conn_mutex_unlock_later = FALSE;
2683 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
2684 pthread_mutex_unlock(&conn->mta_conn_mutex);
2685 DBUG_RETURN(0);
2686 }
2687
xa_start(XID * xid,int * need_mon)2688 int spider_db_mbase::xa_start(
2689 XID *xid,
2690 int *need_mon
2691 ) {
2692 DBUG_ENTER("spider_db_mbase::xa_start");
2693 DBUG_PRINT("info",("spider this=%p", this));
2694 DBUG_ASSERT(0);
2695 DBUG_RETURN(0);
2696 }
2697
xa_start_in_bulk_sql()2698 bool spider_db_mbase::xa_start_in_bulk_sql()
2699 {
2700 DBUG_ENTER("spider_db_mbase::xa_start_in_bulk_sql");
2701 DBUG_PRINT("info",("spider this=%p", this));
2702 DBUG_RETURN(TRUE);
2703 }
2704
xa_end(XID * xid,int * need_mon)2705 int spider_db_mbase::xa_end(
2706 XID *xid,
2707 int *need_mon
2708 ) {
2709 char sql_buf[SPIDER_SQL_XA_END_LEN + XIDDATASIZE + sizeof(long) + 9];
2710 spider_string sql_str(sql_buf, sizeof(sql_buf), &my_charset_bin);
2711 DBUG_ENTER("spider_db_mbase::xa_end");
2712 DBUG_PRINT("info",("spider this=%p", this));
2713 sql_str.init_calc_mem(108);
2714
2715 sql_str.length(0);
2716 sql_str.q_append(SPIDER_SQL_XA_END_STR, SPIDER_SQL_XA_END_LEN);
2717 spider_db_append_xid_str(&sql_str, xid);
2718 pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
2719 pthread_mutex_lock(&conn->mta_conn_mutex);
2720 SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
2721 conn->need_mon = need_mon;
2722 DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
2723 DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
2724 conn->mta_conn_mutex_lock_already = TRUE;
2725 conn->mta_conn_mutex_unlock_later = TRUE;
2726 if (spider_db_query(
2727 conn,
2728 sql_str.ptr(),
2729 sql_str.length(),
2730 -1,
2731 need_mon)
2732 ) {
2733 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
2734 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2735 conn->mta_conn_mutex_lock_already = FALSE;
2736 conn->mta_conn_mutex_unlock_later = FALSE;
2737 DBUG_RETURN(spider_db_errorno(conn));
2738 }
2739 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
2740 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2741 conn->mta_conn_mutex_lock_already = FALSE;
2742 conn->mta_conn_mutex_unlock_later = FALSE;
2743 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
2744 pthread_mutex_unlock(&conn->mta_conn_mutex);
2745 DBUG_RETURN(0);
2746 }
2747
xa_prepare(XID * xid,int * need_mon)2748 int spider_db_mbase::xa_prepare(
2749 XID *xid,
2750 int *need_mon
2751 ) {
2752 char sql_buf[SPIDER_SQL_XA_PREPARE_LEN + XIDDATASIZE + sizeof(long) + 9];
2753 spider_string sql_str(sql_buf, sizeof(sql_buf), &my_charset_bin);
2754 DBUG_ENTER("spider_db_mbase::xa_prepare");
2755 DBUG_PRINT("info",("spider this=%p", this));
2756 sql_str.init_calc_mem(109);
2757
2758 sql_str.length(0);
2759 sql_str.q_append(SPIDER_SQL_XA_PREPARE_STR, SPIDER_SQL_XA_PREPARE_LEN);
2760 spider_db_append_xid_str(&sql_str, xid);
2761 pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
2762 pthread_mutex_lock(&conn->mta_conn_mutex);
2763 SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
2764 conn->need_mon = need_mon;
2765 DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
2766 DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
2767 conn->mta_conn_mutex_lock_already = TRUE;
2768 conn->mta_conn_mutex_unlock_later = TRUE;
2769 if (spider_db_query(
2770 conn,
2771 sql_str.ptr(),
2772 sql_str.length(),
2773 -1,
2774 need_mon)
2775 ) {
2776 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
2777 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2778 conn->mta_conn_mutex_lock_already = FALSE;
2779 conn->mta_conn_mutex_unlock_later = FALSE;
2780 DBUG_RETURN(spider_db_errorno(conn));
2781 }
2782 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
2783 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2784 conn->mta_conn_mutex_lock_already = FALSE;
2785 conn->mta_conn_mutex_unlock_later = FALSE;
2786 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
2787 pthread_mutex_unlock(&conn->mta_conn_mutex);
2788 DBUG_RETURN(0);
2789 }
2790
xa_commit(XID * xid,int * need_mon)2791 int spider_db_mbase::xa_commit(
2792 XID *xid,
2793 int *need_mon
2794 ) {
2795 char sql_buf[SPIDER_SQL_XA_COMMIT_LEN + XIDDATASIZE + sizeof(long) + 9];
2796 spider_string sql_str(sql_buf, sizeof(sql_buf), &my_charset_bin);
2797 DBUG_ENTER("spider_db_mbase::xa_commit");
2798 DBUG_PRINT("info",("spider this=%p", this));
2799 sql_str.init_calc_mem(110);
2800
2801 sql_str.length(0);
2802 sql_str.q_append(SPIDER_SQL_XA_COMMIT_STR, SPIDER_SQL_XA_COMMIT_LEN);
2803 spider_db_append_xid_str(&sql_str, xid);
2804 pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
2805 pthread_mutex_lock(&conn->mta_conn_mutex);
2806 SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
2807 conn->need_mon = need_mon;
2808 DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
2809 DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
2810 conn->mta_conn_mutex_lock_already = TRUE;
2811 conn->mta_conn_mutex_unlock_later = TRUE;
2812 if (spider_db_query(
2813 conn,
2814 sql_str.ptr(),
2815 sql_str.length(),
2816 -1,
2817 need_mon)
2818 ) {
2819 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
2820 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2821 conn->mta_conn_mutex_lock_already = FALSE;
2822 conn->mta_conn_mutex_unlock_later = FALSE;
2823 DBUG_RETURN(spider_db_errorno(conn));
2824 }
2825 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
2826 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2827 conn->mta_conn_mutex_lock_already = FALSE;
2828 conn->mta_conn_mutex_unlock_later = FALSE;
2829 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
2830 pthread_mutex_unlock(&conn->mta_conn_mutex);
2831 DBUG_RETURN(0);
2832 }
2833
xa_rollback(XID * xid,int * need_mon)2834 int spider_db_mbase::xa_rollback(
2835 XID *xid,
2836 int *need_mon
2837 ) {
2838 char sql_buf[SPIDER_SQL_XA_ROLLBACK_LEN + XIDDATASIZE + sizeof(long) + 9];
2839 spider_string sql_str(sql_buf, sizeof(sql_buf), &my_charset_bin);
2840 DBUG_ENTER("spider_db_mbase::xa_rollback");
2841 DBUG_PRINT("info",("spider this=%p", this));
2842 sql_str.init_calc_mem(111);
2843
2844 sql_str.length(0);
2845 sql_str.q_append(SPIDER_SQL_XA_ROLLBACK_STR, SPIDER_SQL_XA_ROLLBACK_LEN);
2846 spider_db_append_xid_str(&sql_str, xid);
2847 pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
2848 pthread_mutex_lock(&conn->mta_conn_mutex);
2849 SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
2850 conn->need_mon = need_mon;
2851 DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
2852 DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
2853 conn->mta_conn_mutex_lock_already = TRUE;
2854 conn->mta_conn_mutex_unlock_later = TRUE;
2855 if (spider_db_query(
2856 conn,
2857 sql_str.ptr(),
2858 sql_str.length(),
2859 -1,
2860 need_mon)
2861 ) {
2862 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
2863 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2864 conn->mta_conn_mutex_lock_already = FALSE;
2865 conn->mta_conn_mutex_unlock_later = FALSE;
2866 DBUG_RETURN(spider_db_errorno(conn));
2867 }
2868 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
2869 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2870 conn->mta_conn_mutex_lock_already = FALSE;
2871 conn->mta_conn_mutex_unlock_later = FALSE;
2872 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
2873 pthread_mutex_unlock(&conn->mta_conn_mutex);
2874 DBUG_RETURN(0);
2875 }
2876
set_trx_isolation_in_bulk_sql()2877 bool spider_db_mbase::set_trx_isolation_in_bulk_sql()
2878 {
2879 DBUG_ENTER("spider_db_mbase::set_trx_isolation_in_bulk_sql");
2880 DBUG_PRINT("info",("spider this=%p", this));
2881 DBUG_RETURN(TRUE);
2882 }
2883
set_trx_isolation(int trx_isolation,int * need_mon)2884 int spider_db_mbase::set_trx_isolation(
2885 int trx_isolation,
2886 int *need_mon
2887 ) {
2888 DBUG_ENTER("spider_db_mbase::set_trx_isolation");
2889 DBUG_PRINT("info",("spider this=%p", this));
2890 switch (trx_isolation)
2891 {
2892 case ISO_READ_UNCOMMITTED:
2893 pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
2894 pthread_mutex_lock(&conn->mta_conn_mutex);
2895 SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
2896 conn->need_mon = need_mon;
2897 DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
2898 DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
2899 conn->mta_conn_mutex_lock_already = TRUE;
2900 conn->mta_conn_mutex_unlock_later = TRUE;
2901 if (spider_db_query(
2902 conn,
2903 SPIDER_SQL_ISO_READ_UNCOMMITTED_STR,
2904 SPIDER_SQL_ISO_READ_UNCOMMITTED_LEN,
2905 -1,
2906 need_mon)
2907 ) {
2908 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
2909 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2910 conn->mta_conn_mutex_lock_already = FALSE;
2911 conn->mta_conn_mutex_unlock_later = FALSE;
2912 DBUG_RETURN(spider_db_errorno(conn));
2913 }
2914 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
2915 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2916 conn->mta_conn_mutex_lock_already = FALSE;
2917 conn->mta_conn_mutex_unlock_later = FALSE;
2918 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
2919 pthread_mutex_unlock(&conn->mta_conn_mutex);
2920 break;
2921 case ISO_READ_COMMITTED:
2922 pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
2923 pthread_mutex_lock(&conn->mta_conn_mutex);
2924 SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
2925 conn->need_mon = need_mon;
2926 DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
2927 DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
2928 conn->mta_conn_mutex_lock_already = TRUE;
2929 conn->mta_conn_mutex_unlock_later = TRUE;
2930 if (spider_db_query(
2931 conn,
2932 SPIDER_SQL_ISO_READ_COMMITTED_STR,
2933 SPIDER_SQL_ISO_READ_COMMITTED_LEN,
2934 -1,
2935 need_mon)
2936 ) {
2937 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
2938 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2939 conn->mta_conn_mutex_lock_already = FALSE;
2940 conn->mta_conn_mutex_unlock_later = FALSE;
2941 DBUG_RETURN(spider_db_errorno(conn));
2942 }
2943 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
2944 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2945 conn->mta_conn_mutex_lock_already = FALSE;
2946 conn->mta_conn_mutex_unlock_later = FALSE;
2947 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
2948 pthread_mutex_unlock(&conn->mta_conn_mutex);
2949 break;
2950 case ISO_REPEATABLE_READ:
2951 pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
2952 pthread_mutex_lock(&conn->mta_conn_mutex);
2953 SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
2954 conn->need_mon = need_mon;
2955 DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
2956 DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
2957 conn->mta_conn_mutex_lock_already = TRUE;
2958 conn->mta_conn_mutex_unlock_later = TRUE;
2959 if (spider_db_query(
2960 conn,
2961 SPIDER_SQL_ISO_REPEATABLE_READ_STR,
2962 SPIDER_SQL_ISO_REPEATABLE_READ_LEN,
2963 -1,
2964 need_mon)
2965 ) {
2966 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
2967 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2968 conn->mta_conn_mutex_lock_already = FALSE;
2969 conn->mta_conn_mutex_unlock_later = FALSE;
2970 DBUG_RETURN(spider_db_errorno(conn));
2971 }
2972 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
2973 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2974 conn->mta_conn_mutex_lock_already = FALSE;
2975 conn->mta_conn_mutex_unlock_later = FALSE;
2976 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
2977 pthread_mutex_unlock(&conn->mta_conn_mutex);
2978 break;
2979 case ISO_SERIALIZABLE:
2980 pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
2981 pthread_mutex_lock(&conn->mta_conn_mutex);
2982 SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
2983 conn->need_mon = need_mon;
2984 DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
2985 DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
2986 conn->mta_conn_mutex_lock_already = TRUE;
2987 conn->mta_conn_mutex_unlock_later = TRUE;
2988 if (spider_db_query(
2989 conn,
2990 SPIDER_SQL_ISO_SERIALIZABLE_STR,
2991 SPIDER_SQL_ISO_SERIALIZABLE_LEN,
2992 -1,
2993 need_mon)
2994 ) {
2995 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
2996 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
2997 conn->mta_conn_mutex_lock_already = FALSE;
2998 conn->mta_conn_mutex_unlock_later = FALSE;
2999 DBUG_RETURN(spider_db_errorno(conn));
3000 }
3001 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
3002 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
3003 conn->mta_conn_mutex_lock_already = FALSE;
3004 conn->mta_conn_mutex_unlock_later = FALSE;
3005 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
3006 pthread_mutex_unlock(&conn->mta_conn_mutex);
3007 break;
3008 default:
3009 DBUG_RETURN(HA_ERR_UNSUPPORTED);
3010 }
3011 DBUG_RETURN(0);
3012 }
3013
set_autocommit_in_bulk_sql()3014 bool spider_db_mbase::set_autocommit_in_bulk_sql()
3015 {
3016 DBUG_ENTER("spider_db_mbase::set_autocommit_in_bulk_sql");
3017 DBUG_PRINT("info",("spider this=%p", this));
3018 DBUG_RETURN(TRUE);
3019 }
3020
set_autocommit(bool autocommit,int * need_mon)3021 int spider_db_mbase::set_autocommit(
3022 bool autocommit,
3023 int *need_mon
3024 ) {
3025 DBUG_ENTER("spider_db_mbase::set_autocommit");
3026 DBUG_PRINT("info",("spider this=%p", this));
3027 if (autocommit)
3028 {
3029 pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
3030 pthread_mutex_lock(&conn->mta_conn_mutex);
3031 SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
3032 conn->need_mon = need_mon;
3033 DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
3034 DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
3035 conn->mta_conn_mutex_lock_already = TRUE;
3036 conn->mta_conn_mutex_unlock_later = TRUE;
3037 if (spider_db_query(
3038 conn,
3039 SPIDER_SQL_AUTOCOMMIT_ON_STR,
3040 SPIDER_SQL_AUTOCOMMIT_ON_LEN,
3041 -1,
3042 need_mon)
3043 ) {
3044 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
3045 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
3046 conn->mta_conn_mutex_lock_already = FALSE;
3047 conn->mta_conn_mutex_unlock_later = FALSE;
3048 DBUG_RETURN(spider_db_errorno(conn));
3049 }
3050 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
3051 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
3052 conn->mta_conn_mutex_lock_already = FALSE;
3053 conn->mta_conn_mutex_unlock_later = FALSE;
3054 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
3055 pthread_mutex_unlock(&conn->mta_conn_mutex);
3056 } else {
3057 pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
3058 pthread_mutex_lock(&conn->mta_conn_mutex);
3059 SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
3060 conn->need_mon = need_mon;
3061 DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
3062 DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
3063 conn->mta_conn_mutex_lock_already = TRUE;
3064 conn->mta_conn_mutex_unlock_later = TRUE;
3065 if (spider_db_query(
3066 conn,
3067 SPIDER_SQL_AUTOCOMMIT_OFF_STR,
3068 SPIDER_SQL_AUTOCOMMIT_OFF_LEN,
3069 -1,
3070 need_mon)
3071 ) {
3072 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
3073 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
3074 conn->mta_conn_mutex_lock_already = FALSE;
3075 conn->mta_conn_mutex_unlock_later = FALSE;
3076 DBUG_RETURN(spider_db_errorno(conn));
3077 }
3078 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
3079 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
3080 conn->mta_conn_mutex_lock_already = FALSE;
3081 conn->mta_conn_mutex_unlock_later = FALSE;
3082 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
3083 pthread_mutex_unlock(&conn->mta_conn_mutex);
3084 }
3085 DBUG_RETURN(0);
3086 }
3087
set_sql_log_off_in_bulk_sql()3088 bool spider_db_mbase::set_sql_log_off_in_bulk_sql()
3089 {
3090 DBUG_ENTER("spider_db_mbase::set_sql_log_off_in_bulk_sql");
3091 DBUG_PRINT("info",("spider this=%p", this));
3092 DBUG_RETURN(TRUE);
3093 }
3094
set_sql_log_off(bool sql_log_off,int * need_mon)3095 int spider_db_mbase::set_sql_log_off(
3096 bool sql_log_off,
3097 int *need_mon
3098 ) {
3099 DBUG_ENTER("spider_db_mbase::set_sql_log_off");
3100 DBUG_PRINT("info",("spider this=%p", this));
3101 if (sql_log_off)
3102 {
3103 pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
3104 pthread_mutex_lock(&conn->mta_conn_mutex);
3105 SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
3106 conn->need_mon = need_mon;
3107 DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
3108 DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
3109 conn->mta_conn_mutex_lock_already = TRUE;
3110 conn->mta_conn_mutex_unlock_later = TRUE;
3111 if (spider_db_query(
3112 conn,
3113 SPIDER_SQL_SQL_LOG_ON_STR,
3114 SPIDER_SQL_SQL_LOG_ON_LEN,
3115 -1,
3116 need_mon)
3117 ) {
3118 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
3119 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
3120 conn->mta_conn_mutex_lock_already = FALSE;
3121 conn->mta_conn_mutex_unlock_later = FALSE;
3122 DBUG_RETURN(spider_db_errorno(conn));
3123 }
3124 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
3125 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
3126 conn->mta_conn_mutex_lock_already = FALSE;
3127 conn->mta_conn_mutex_unlock_later = FALSE;
3128 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
3129 pthread_mutex_unlock(&conn->mta_conn_mutex);
3130 } else {
3131 pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
3132 pthread_mutex_lock(&conn->mta_conn_mutex);
3133 SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
3134 conn->need_mon = need_mon;
3135 DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
3136 DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
3137 conn->mta_conn_mutex_lock_already = TRUE;
3138 conn->mta_conn_mutex_unlock_later = TRUE;
3139 if (spider_db_query(
3140 conn,
3141 SPIDER_SQL_SQL_LOG_OFF_STR,
3142 SPIDER_SQL_SQL_LOG_OFF_LEN,
3143 -1,
3144 need_mon)
3145 ) {
3146 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
3147 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
3148 conn->mta_conn_mutex_lock_already = FALSE;
3149 conn->mta_conn_mutex_unlock_later = FALSE;
3150 DBUG_RETURN(spider_db_errorno(conn));
3151 }
3152 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
3153 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
3154 conn->mta_conn_mutex_lock_already = FALSE;
3155 conn->mta_conn_mutex_unlock_later = FALSE;
3156 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
3157 pthread_mutex_unlock(&conn->mta_conn_mutex);
3158 }
3159 DBUG_RETURN(0);
3160 }
3161
set_wait_timeout_in_bulk_sql()3162 bool spider_db_mbase::set_wait_timeout_in_bulk_sql()
3163 {
3164 DBUG_ENTER("spider_db_mbase::set_wait_timeout_in_bulk_sql");
3165 DBUG_PRINT("info",("spider this=%p", this));
3166 DBUG_RETURN(TRUE);
3167 }
3168
set_wait_timeout(int wait_timeout,int * need_mon)3169 int spider_db_mbase::set_wait_timeout(
3170 int wait_timeout,
3171 int *need_mon
3172 ) {
3173 char sql_buf[MAX_FIELD_WIDTH];
3174 char timeout_str[SPIDER_SQL_INT_LEN];
3175 int timeout_str_length;
3176 spider_string sql_str(sql_buf, sizeof(sql_buf), &my_charset_bin);
3177 DBUG_ENTER("spider_db_mbase::set_wait_timeout");
3178 DBUG_PRINT("info",("spider this=%p", this));
3179 sql_str.init_calc_mem(264);
3180 sql_str.length(0);
3181 timeout_str_length =
3182 my_sprintf(timeout_str, (timeout_str, "%d", wait_timeout));
3183 if (sql_str.reserve(SPIDER_SQL_WAIT_TIMEOUT_LEN + timeout_str_length))
3184 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
3185 sql_str.q_append(SPIDER_SQL_WAIT_TIMEOUT_STR, SPIDER_SQL_WAIT_TIMEOUT_LEN);
3186 sql_str.q_append(timeout_str, timeout_str_length);
3187 pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
3188 pthread_mutex_lock(&conn->mta_conn_mutex);
3189 SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
3190 conn->need_mon = need_mon;
3191 DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
3192 DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
3193 conn->mta_conn_mutex_lock_already = TRUE;
3194 conn->mta_conn_mutex_unlock_later = TRUE;
3195 if (spider_db_query(
3196 conn,
3197 sql_str.ptr(),
3198 sql_str.length(),
3199 -1,
3200 need_mon)
3201 ) {
3202 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
3203 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
3204 conn->mta_conn_mutex_lock_already = FALSE;
3205 conn->mta_conn_mutex_unlock_later = FALSE;
3206 DBUG_RETURN(spider_db_errorno(conn));
3207 }
3208 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
3209 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
3210 conn->mta_conn_mutex_lock_already = FALSE;
3211 conn->mta_conn_mutex_unlock_later = FALSE;
3212 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
3213 pthread_mutex_unlock(&conn->mta_conn_mutex);
3214 DBUG_RETURN(0);
3215 }
3216
set_sql_mode_in_bulk_sql()3217 bool spider_db_mbase::set_sql_mode_in_bulk_sql()
3218 {
3219 DBUG_ENTER("spider_db_mbase::set_sql_mode_in_bulk_sql");
3220 DBUG_PRINT("info",("spider this=%p", this));
3221 DBUG_RETURN(TRUE);
3222 }
3223
set_sql_mode(sql_mode_t sql_mode,int * need_mon)3224 int spider_db_mbase::set_sql_mode(
3225 sql_mode_t sql_mode,
3226 int *need_mon
3227 ) {
3228 int error_num;
3229 char sql_buf[MAX_FIELD_WIDTH];
3230 spider_string sql_str(sql_buf, sizeof(sql_buf), &my_charset_bin);
3231 DBUG_ENTER("spider_db_mbase::set_sql_mode");
3232 DBUG_PRINT("info",("spider this=%p", this));
3233 sql_str.init_calc_mem(265);
3234 sql_str.length(0);
3235 if (sql_str.reserve(SPIDER_SQL_SQL_MODE_LEN))
3236 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
3237 sql_str.q_append(SPIDER_SQL_SQL_MODE_STR, SPIDER_SQL_SQL_MODE_LEN);
3238 if ((error_num = spider_db_mbase_utility->append_sql_mode_internal(&sql_str, sql_mode)))
3239 {
3240 DBUG_RETURN(error_num);
3241 }
3242 if (sql_str.length() > SPIDER_SQL_SQL_MODE_LEN)
3243 {
3244 sql_str.length(sql_str.length() - SPIDER_SQL_COMMA_LEN);
3245 } else {
3246 if (sql_str.reserve(SPIDER_SQL_VALUE_QUOTE_LEN))
3247 {
3248 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
3249 }
3250 }
3251 sql_str.q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
3252 pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
3253 pthread_mutex_lock(&conn->mta_conn_mutex);
3254 SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
3255 conn->need_mon = need_mon;
3256 DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
3257 DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
3258 conn->mta_conn_mutex_lock_already = TRUE;
3259 conn->mta_conn_mutex_unlock_later = TRUE;
3260 if (spider_db_query(
3261 conn,
3262 sql_str.ptr(),
3263 sql_str.length(),
3264 -1,
3265 need_mon)
3266 ) {
3267 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
3268 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
3269 conn->mta_conn_mutex_lock_already = FALSE;
3270 conn->mta_conn_mutex_unlock_later = FALSE;
3271 DBUG_RETURN(spider_db_errorno(conn));
3272 }
3273 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
3274 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
3275 conn->mta_conn_mutex_lock_already = FALSE;
3276 conn->mta_conn_mutex_unlock_later = FALSE;
3277 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
3278 pthread_mutex_unlock(&conn->mta_conn_mutex);
3279 DBUG_RETURN(0);
3280 }
3281
set_time_zone_in_bulk_sql()3282 bool spider_db_mbase::set_time_zone_in_bulk_sql()
3283 {
3284 DBUG_ENTER("spider_db_mbase::set_time_zone_in_bulk_sql");
3285 DBUG_PRINT("info",("spider this=%p", this));
3286 DBUG_RETURN(TRUE);
3287 }
3288
set_time_zone(Time_zone * time_zone,int * need_mon)3289 int spider_db_mbase::set_time_zone(
3290 Time_zone *time_zone,
3291 int *need_mon
3292 ) {
3293 const String *tz_str = time_zone->get_name();
3294 char sql_buf[MAX_FIELD_WIDTH];
3295 spider_string sql_str(sql_buf, sizeof(sql_buf), &my_charset_bin);
3296 DBUG_ENTER("spider_db_mbase::set_time_zone");
3297 DBUG_PRINT("info",("spider this=%p", this));
3298 sql_str.init_calc_mem(214);
3299 sql_str.length(0);
3300 if (sql_str.reserve(SPIDER_SQL_TIME_ZONE_LEN +
3301 tz_str->length() + SPIDER_SQL_VALUE_QUOTE_LEN))
3302 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
3303 sql_str.q_append(SPIDER_SQL_TIME_ZONE_STR, SPIDER_SQL_TIME_ZONE_LEN);
3304 sql_str.q_append(tz_str->ptr(), tz_str->length());
3305 sql_str.q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
3306 pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
3307 pthread_mutex_lock(&conn->mta_conn_mutex);
3308 SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
3309 conn->need_mon = need_mon;
3310 DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
3311 DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
3312 conn->mta_conn_mutex_lock_already = TRUE;
3313 conn->mta_conn_mutex_unlock_later = TRUE;
3314 if (spider_db_query(
3315 conn,
3316 sql_str.ptr(),
3317 sql_str.length(),
3318 -1,
3319 need_mon)
3320 ) {
3321 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
3322 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
3323 conn->mta_conn_mutex_lock_already = FALSE;
3324 conn->mta_conn_mutex_unlock_later = FALSE;
3325 DBUG_RETURN(spider_db_errorno(conn));
3326 }
3327 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
3328 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
3329 conn->mta_conn_mutex_lock_already = FALSE;
3330 conn->mta_conn_mutex_unlock_later = FALSE;
3331 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
3332 pthread_mutex_unlock(&conn->mta_conn_mutex);
3333 DBUG_RETURN(0);
3334 }
3335
exec_simple_sql_with_result(SPIDER_TRX * trx,SPIDER_SHARE * share,const char * sql,uint sql_length,int all_link_idx,int * need_mon,SPIDER_DB_RESULT ** res)3336 int spider_db_mbase::exec_simple_sql_with_result(
3337 SPIDER_TRX *trx,
3338 SPIDER_SHARE *share,
3339 const char *sql,
3340 uint sql_length,
3341 int all_link_idx,
3342 int *need_mon,
3343 SPIDER_DB_RESULT **res
3344 ) {
3345 int error_num;
3346 DBUG_ENTER("spider_db_mbase::exec_simple_sql_with_result");
3347 pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
3348 pthread_mutex_lock(&conn->mta_conn_mutex);
3349 SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
3350 conn->need_mon = need_mon;
3351 DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
3352 DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
3353 conn->mta_conn_mutex_lock_already = TRUE;
3354 conn->mta_conn_mutex_unlock_later = TRUE;
3355 spider_conn_set_timeout_from_share(conn, all_link_idx, trx->thd,
3356 share);
3357 if (
3358 (error_num = spider_db_set_names_internal(trx, share, conn,
3359 all_link_idx, need_mon)) ||
3360 (
3361 spider_db_query(
3362 conn,
3363 sql,
3364 sql_length,
3365 -1,
3366 need_mon) &&
3367 (error_num = spider_db_errorno(conn))
3368 )
3369 ) {
3370 if (
3371 error_num == ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM &&
3372 !conn->disable_reconnect
3373 ) {
3374 /* retry */
3375 if ((error_num = spider_db_ping_internal(share, conn,
3376 all_link_idx, need_mon)))
3377 {
3378 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
3379 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
3380 conn->mta_conn_mutex_lock_already = FALSE;
3381 conn->mta_conn_mutex_unlock_later = FALSE;
3382 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
3383 pthread_mutex_unlock(&conn->mta_conn_mutex);
3384 DBUG_PRINT("info", ("spider error_num=%d 1", error_num));
3385 DBUG_RETURN(error_num);
3386 }
3387 if ((error_num = spider_db_set_names_internal(trx, share, conn,
3388 all_link_idx, need_mon)))
3389 {
3390 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
3391 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
3392 conn->mta_conn_mutex_lock_already = FALSE;
3393 conn->mta_conn_mutex_unlock_later = FALSE;
3394 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
3395 pthread_mutex_unlock(&conn->mta_conn_mutex);
3396 DBUG_PRINT("info", ("spider error_num=%d 2", error_num));
3397 DBUG_RETURN(error_num);
3398 }
3399 spider_conn_set_timeout_from_share(conn, all_link_idx, trx->thd,
3400 share);
3401 if (spider_db_query(
3402 conn,
3403 sql,
3404 sql_length,
3405 -1,
3406 need_mon)
3407 ) {
3408 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
3409 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
3410 conn->mta_conn_mutex_lock_already = FALSE;
3411 conn->mta_conn_mutex_unlock_later = FALSE;
3412 DBUG_PRINT("info", ("spider error_num=%d 3", error_num));
3413 DBUG_RETURN(spider_db_errorno(conn));
3414 }
3415 } else {
3416 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
3417 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
3418 conn->mta_conn_mutex_lock_already = FALSE;
3419 conn->mta_conn_mutex_unlock_later = FALSE;
3420 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
3421 pthread_mutex_unlock(&conn->mta_conn_mutex);
3422 DBUG_PRINT("info", ("spider error_num=%d 4", error_num));
3423 DBUG_RETURN(error_num);
3424 }
3425 }
3426 if (!(*res = store_result(NULL, NULL, &error_num)))
3427 {
3428 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
3429 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
3430 conn->mta_conn_mutex_lock_already = FALSE;
3431 conn->mta_conn_mutex_unlock_later = FALSE;
3432 if (error_num)
3433 {
3434 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
3435 pthread_mutex_unlock(&conn->mta_conn_mutex);
3436 DBUG_PRINT("info", ("spider error_num=%d 5", error_num));
3437 DBUG_RETURN(error_num);
3438 }
3439 else if ((error_num = spider_db_errorno(conn)))
3440 {
3441 DBUG_PRINT("info", ("spider error_num=%d 6", error_num));
3442 DBUG_RETURN(error_num);
3443 } else {
3444 DBUG_PRINT("info", ("spider error_num=%d 7",
3445 ER_QUERY_ON_FOREIGN_DATA_SOURCE));
3446 DBUG_RETURN(ER_QUERY_ON_FOREIGN_DATA_SOURCE);
3447 }
3448 }
3449 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
3450 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
3451 conn->mta_conn_mutex_lock_already = FALSE;
3452 conn->mta_conn_mutex_unlock_later = FALSE;
3453 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
3454 pthread_mutex_unlock(&conn->mta_conn_mutex);
3455 DBUG_RETURN(0);
3456 }
3457
show_master_status(SPIDER_TRX * trx,SPIDER_SHARE * share,int all_link_idx,int * need_mon,TABLE * table,spider_string * str,int mode,SPIDER_DB_RESULT ** res1,SPIDER_DB_RESULT ** res2)3458 int spider_db_mbase::show_master_status(
3459 SPIDER_TRX *trx,
3460 SPIDER_SHARE *share,
3461 int all_link_idx,
3462 int *need_mon,
3463 TABLE *table,
3464 spider_string *str,
3465 int mode,
3466 SPIDER_DB_RESULT **res1,
3467 SPIDER_DB_RESULT **res2
3468 ) {
3469 int error_num;
3470 const char *binlog_file_name, *binlog_pos;
3471 uint binlog_file_name_length, binlog_pos_length;
3472 DBUG_ENTER("spider_db_mbase::show_master_status");
3473 if ((error_num = exec_simple_sql_with_result(trx, share,
3474 SPIDER_SQL_SHOW_MASTER_STATUS_STR, SPIDER_SQL_SHOW_MASTER_STATUS_LEN,
3475 all_link_idx, need_mon, res1))
3476 ) {
3477 DBUG_PRINT("info", ("spider error_num=%d 1", error_num));
3478 DBUG_RETURN(error_num);
3479 }
3480
3481 if (!(error_num = ((spider_db_mbase_result *)*res1)->fetch_show_master_status(
3482 &binlog_file_name, &binlog_pos))
3483 ) {
3484 binlog_file_name_length = strlen(binlog_file_name);
3485 binlog_pos_length = strlen(binlog_pos);
3486 spider_store_binlog_pos_binlog_file(table,
3487 binlog_file_name, binlog_file_name_length,
3488 binlog_pos, binlog_pos_length, conn->access_charset);
3489 if (mode > 0)
3490 {
3491 error_num = select_binlog_gtid_pos(
3492 trx,
3493 share,
3494 all_link_idx,
3495 need_mon,
3496 table,
3497 str,
3498 binlog_file_name,
3499 binlog_file_name_length,
3500 binlog_pos,
3501 binlog_pos_length,
3502 res2
3503 );
3504 } else {
3505 spider_store_binlog_pos_gtid(table, NULL, 0, conn->access_charset);
3506 }
3507 }
3508 /*
3509 res->free_result();
3510 delete res;
3511 */
3512 if (error_num)
3513 {
3514 DBUG_PRINT("info", ("spider error_num=%d 2", error_num));
3515 DBUG_RETURN(error_num);
3516 }
3517 DBUG_RETURN(0);
3518 }
3519
select_binlog_gtid_pos(SPIDER_TRX * trx,SPIDER_SHARE * share,int all_link_idx,int * need_mon,TABLE * table,spider_string * str,const char * binlog_file_name,uint binlog_file_name_length,const char * binlog_pos,uint binlog_pos_length,SPIDER_DB_RESULT ** res)3520 int spider_db_mbase::select_binlog_gtid_pos(
3521 SPIDER_TRX *trx,
3522 SPIDER_SHARE *share,
3523 int all_link_idx,
3524 int *need_mon,
3525 TABLE *table,
3526 spider_string *str,
3527 const char *binlog_file_name,
3528 uint binlog_file_name_length,
3529 const char *binlog_pos,
3530 uint binlog_pos_length,
3531 SPIDER_DB_RESULT **res
3532 ) {
3533 int error_num;
3534 size_t length;
3535 const char *gtid_pos;
3536 DBUG_ENTER("spider_db_mbase::select_binlog_gtid_pos");
3537 str->length(0);
3538 if (str->reserve(
3539 SPIDER_SQL_BINLOG_GTID_POS_LEN +
3540 SPIDER_SQL_OPEN_PAREN_LEN +
3541 SPIDER_SQL_VALUE_QUOTE_LEN +
3542 binlog_file_name_length * 2 +
3543 SPIDER_SQL_VALUE_QUOTE_LEN +
3544 SPIDER_SQL_COMMA_LEN +
3545 SPIDER_SQL_VALUE_QUOTE_LEN +
3546 binlog_pos_length * 2 +
3547 SPIDER_SQL_VALUE_QUOTE_LEN +
3548 SPIDER_SQL_CLOSE_PAREN_LEN
3549 ))
3550 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
3551 str->q_append(SPIDER_SQL_BINLOG_GTID_POS_STR,
3552 SPIDER_SQL_BINLOG_GTID_POS_LEN);
3553 str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
3554 str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
3555 length = conn->db_conn->escape_string((char *)str->ptr() + str->length(),
3556 binlog_file_name, binlog_file_name_length);
3557 str->length(str->length() + length);
3558 str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
3559 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
3560 str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
3561 length = conn->db_conn->escape_string((char *)str->ptr() + str->length(),
3562 binlog_pos, binlog_pos_length);
3563 str->length(str->length() + length);
3564 str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
3565 str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
3566
3567 if ((error_num = exec_simple_sql_with_result(trx, share,
3568 str->ptr(), str->length(), all_link_idx, need_mon, res)))
3569 {
3570 DBUG_PRINT("info", ("spider error_num=%d 1", error_num));
3571 DBUG_RETURN(error_num);
3572 }
3573 if (!(error_num = ((spider_db_mbase_result *)*res)->fetch_select_binlog_gtid_pos(>id_pos)))
3574 {
3575 spider_store_binlog_pos_gtid(table, gtid_pos, strlen(gtid_pos), conn->access_charset);
3576 }
3577 /*
3578 res->free_result();
3579 delete res;
3580 */
3581 if (error_num)
3582 {
3583 DBUG_PRINT("info", ("spider error_num=%d 2", error_num));
3584 DBUG_RETURN(error_num);
3585 }
3586 DBUG_RETURN(0);
3587 }
3588
3589 #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
append_sql(char * sql,ulong sql_length,st_spider_db_request_key * request_key)3590 int spider_db_mbase::append_sql(
3591 char *sql,
3592 ulong sql_length,
3593 st_spider_db_request_key *request_key
3594 ) {
3595 DBUG_ENTER("spider_db_mbase::append_sql");
3596 DBUG_PRINT("info",("spider this=%p", this));
3597 DBUG_ASSERT(0);
3598 DBUG_RETURN(0);
3599 }
3600
append_open_handler(uint handler_id,const char * db_name,const char * table_name,const char * index_name,const char * sql,st_spider_db_request_key * request_key)3601 int spider_db_mbase::append_open_handler(
3602 uint handler_id,
3603 const char *db_name,
3604 const char *table_name,
3605 const char *index_name,
3606 const char *sql,
3607 st_spider_db_request_key *request_key
3608 ) {
3609 DBUG_ENTER("spider_db_mbase::append_open_handler");
3610 DBUG_PRINT("info",("spider this=%p", this));
3611 DBUG_ASSERT(0);
3612 DBUG_RETURN(0);
3613 }
3614
append_select(uint handler_id,spider_string * sql,SPIDER_DB_HS_STRING_REF_BUFFER * keys,int limit,int skip,st_spider_db_request_key * request_key)3615 int spider_db_mbase::append_select(
3616 uint handler_id,
3617 spider_string *sql,
3618 SPIDER_DB_HS_STRING_REF_BUFFER *keys,
3619 int limit,
3620 int skip,
3621 st_spider_db_request_key *request_key
3622 ) {
3623 DBUG_ENTER("spider_db_mbase::append_select");
3624 DBUG_PRINT("info",("spider this=%p", this));
3625 DBUG_ASSERT(0);
3626 DBUG_RETURN(0);
3627 }
3628
append_insert(uint handler_id,SPIDER_DB_HS_STRING_REF_BUFFER * upds,st_spider_db_request_key * request_key)3629 int spider_db_mbase::append_insert(
3630 uint handler_id,
3631 SPIDER_DB_HS_STRING_REF_BUFFER *upds,
3632 st_spider_db_request_key *request_key
3633 ) {
3634 DBUG_ENTER("spider_db_mbase::append_insert");
3635 DBUG_PRINT("info",("spider this=%p", this));
3636 DBUG_ASSERT(0);
3637 DBUG_RETURN(0);
3638 }
3639
append_update(uint handler_id,spider_string * sql,SPIDER_DB_HS_STRING_REF_BUFFER * keys,SPIDER_DB_HS_STRING_REF_BUFFER * upds,int limit,int skip,bool increment,bool decrement,st_spider_db_request_key * request_key)3640 int spider_db_mbase::append_update(
3641 uint handler_id,
3642 spider_string *sql,
3643 SPIDER_DB_HS_STRING_REF_BUFFER *keys,
3644 SPIDER_DB_HS_STRING_REF_BUFFER *upds,
3645 int limit,
3646 int skip,
3647 bool increment,
3648 bool decrement,
3649 st_spider_db_request_key *request_key
3650 ) {
3651 DBUG_ENTER("spider_db_mbase::append_update");
3652 DBUG_PRINT("info",("spider this=%p", this));
3653 DBUG_ASSERT(0);
3654 DBUG_RETURN(0);
3655 }
3656
append_delete(uint handler_id,spider_string * sql,SPIDER_DB_HS_STRING_REF_BUFFER * keys,int limit,int skip,st_spider_db_request_key * request_key)3657 int spider_db_mbase::append_delete(
3658 uint handler_id,
3659 spider_string *sql,
3660 SPIDER_DB_HS_STRING_REF_BUFFER *keys,
3661 int limit,
3662 int skip,
3663 st_spider_db_request_key *request_key
3664 ) {
3665 DBUG_ENTER("spider_db_mbase::append_delete");
3666 DBUG_PRINT("info",("spider this=%p", this));
3667 DBUG_ASSERT(0);
3668 DBUG_RETURN(0);
3669 }
3670
reset_request_queue()3671 void spider_db_mbase::reset_request_queue()
3672 {
3673 DBUG_ENTER("spider_db_mbase::reset_request_queue");
3674 DBUG_PRINT("info",("spider this=%p", this));
3675 DBUG_ASSERT(0);
3676 DBUG_VOID_RETURN;
3677 }
3678 #endif
3679
escape_string(char * to,const char * from,size_t from_length)3680 size_t spider_db_mbase::escape_string(
3681 char *to,
3682 const char *from,
3683 size_t from_length
3684 ) {
3685 DBUG_ENTER("spider_db_mbase::escape_string");
3686 DBUG_PRINT("info",("spider this=%p", this));
3687 if (db_conn->server_status & SERVER_STATUS_NO_BACKSLASH_ESCAPES)
3688 DBUG_RETURN(escape_quotes_for_mysql(db_conn->charset, to, 0,
3689 from, from_length));
3690 DBUG_RETURN(escape_string_for_mysql(db_conn->charset, to, 0,
3691 from, from_length));
3692 }
3693
have_lock_table_list()3694 bool spider_db_mbase::have_lock_table_list()
3695 {
3696 DBUG_ENTER("spider_db_mbase::have_lock_table_list");
3697 DBUG_PRINT("info",("spider this=%p", this));
3698 DBUG_RETURN(lock_table_hash.records);
3699 }
3700
append_lock_tables(spider_string * str)3701 int spider_db_mbase::append_lock_tables(
3702 spider_string *str
3703 ) {
3704 int error_num;
3705 ha_spider *tmp_spider;
3706 int lock_type;
3707 uint conn_link_idx;
3708 int tmp_link_idx;
3709 SPIDER_LINK_FOR_HASH *tmp_link_for_hash;
3710 const char *db_name;
3711 uint db_name_length;
3712 CHARSET_INFO *db_name_charset;
3713 const char *table_name;
3714 uint table_name_length;
3715 CHARSET_INFO *table_name_charset;
3716 DBUG_ENTER("spider_db_mbase::lock_tables");
3717 DBUG_PRINT("info",("spider this=%p", this));
3718 if ((error_num = spider_db_mbase_utility->append_lock_table_head(str)))
3719 {
3720 DBUG_RETURN(error_num);
3721 }
3722 while ((tmp_link_for_hash =
3723 (SPIDER_LINK_FOR_HASH *) my_hash_element(&lock_table_hash, 0)))
3724 {
3725 tmp_spider = tmp_link_for_hash->spider;
3726 tmp_link_idx = tmp_link_for_hash->link_idx;
3727 switch (tmp_spider->lock_type)
3728 {
3729 case TL_READ:
3730 lock_type = SPIDER_DB_TABLE_LOCK_READ_LOCAL;
3731 break;
3732 case TL_READ_NO_INSERT:
3733 lock_type = SPIDER_DB_TABLE_LOCK_READ;
3734 break;
3735 case TL_WRITE_LOW_PRIORITY:
3736 lock_type = SPIDER_DB_TABLE_LOCK_LOW_PRIORITY_WRITE;
3737 break;
3738 case TL_WRITE:
3739 lock_type = SPIDER_DB_TABLE_LOCK_WRITE;
3740 break;
3741 default:
3742 // no lock
3743 DBUG_PRINT("info",("spider lock_type=%d", tmp_spider->lock_type));
3744 DBUG_RETURN(0);
3745 }
3746 conn_link_idx = tmp_spider->conn_link_idx[tmp_link_idx];
3747 spider_mbase_share *db_share = (spider_mbase_share *)
3748 tmp_spider->share->dbton_share[conn->dbton_id];
3749 if (&db_share->db_names_str[conn_link_idx])
3750 {
3751 db_name = db_share->db_names_str[conn_link_idx].ptr();
3752 db_name_length = db_share->db_names_str[conn_link_idx].length();
3753 db_name_charset = tmp_spider->share->access_charset;
3754 } else {
3755 db_name = tmp_spider->share->tgt_dbs[conn_link_idx];
3756 db_name_length = tmp_spider->share->tgt_dbs_lengths[conn_link_idx];
3757 db_name_charset = system_charset_info;
3758 }
3759 if (&db_share->table_names_str[conn_link_idx])
3760 {
3761 table_name = db_share->table_names_str[conn_link_idx].ptr();
3762 table_name_length = db_share->table_names_str[conn_link_idx].length();
3763 table_name_charset = tmp_spider->share->access_charset;
3764 } else {
3765 table_name = tmp_spider->share->tgt_table_names[conn_link_idx];
3766 table_name_length =
3767 tmp_spider->share->tgt_table_names_lengths[conn_link_idx];
3768 table_name_charset = system_charset_info;
3769 }
3770 if ((error_num = spider_db_mbase_utility->
3771 append_lock_table_body(
3772 str,
3773 db_name,
3774 db_name_length,
3775 db_name_charset,
3776 table_name,
3777 table_name_length,
3778 table_name_charset,
3779 lock_type
3780 )
3781 )) {
3782 my_hash_reset(&lock_table_hash);
3783 DBUG_RETURN(error_num);
3784 }
3785 #ifdef HASH_UPDATE_WITH_HASH_VALUE
3786 my_hash_delete_with_hash_value(&lock_table_hash,
3787 tmp_link_for_hash->db_table_str_hash_value, (uchar*) tmp_link_for_hash);
3788 #else
3789 my_hash_delete(&lock_table_hash, (uchar*) tmp_link_for_hash);
3790 #endif
3791 }
3792 if ((error_num = spider_db_mbase_utility->append_lock_table_tail(str)))
3793 {
3794 DBUG_RETURN(error_num);
3795 }
3796 DBUG_RETURN(0);
3797 }
3798
append_unlock_tables(spider_string * str)3799 int spider_db_mbase::append_unlock_tables(
3800 spider_string *str
3801 ) {
3802 int error_num;
3803 DBUG_ENTER("spider_db_mbase::append_unlock_tables");
3804 DBUG_PRINT("info",("spider this=%p", this));
3805 if ((error_num = spider_db_mbase_utility->append_unlock_table(str)))
3806 {
3807 DBUG_RETURN(error_num);
3808 }
3809 DBUG_RETURN(0);
3810 }
3811
get_lock_table_hash_count()3812 uint spider_db_mbase::get_lock_table_hash_count()
3813 {
3814 DBUG_ENTER("spider_db_mbase::get_lock_table_hash_count");
3815 DBUG_PRINT("info",("spider this=%p", this));
3816 DBUG_RETURN(lock_table_hash.records);
3817 }
3818
reset_lock_table_hash()3819 void spider_db_mbase::reset_lock_table_hash()
3820 {
3821 DBUG_ENTER("spider_db_mbase::reset_lock_table_hash");
3822 DBUG_PRINT("info",("spider this=%p", this));
3823 my_hash_reset(&lock_table_hash);
3824 DBUG_VOID_RETURN;
3825 }
3826
get_opened_handler_count()3827 uint spider_db_mbase::get_opened_handler_count()
3828 {
3829 DBUG_ENTER("spider_db_mbase::get_opened_handler_count");
3830 DBUG_PRINT("info",("spider this=%p", this));
3831 DBUG_RETURN(handler_open_array.elements);
3832 }
3833
reset_opened_handler()3834 void spider_db_mbase::reset_opened_handler()
3835 {
3836 ha_spider *tmp_spider;
3837 int tmp_link_idx;
3838 SPIDER_LINK_FOR_HASH **tmp_link_for_hash;
3839 DBUG_ENTER("spider_db_mbase::reset_opened_handler");
3840 DBUG_PRINT("info",("spider this=%p", this));
3841 while ((tmp_link_for_hash =
3842 (SPIDER_LINK_FOR_HASH **) pop_dynamic(&handler_open_array)))
3843 {
3844 tmp_spider = (*tmp_link_for_hash)->spider;
3845 tmp_link_idx = (*tmp_link_for_hash)->link_idx;
3846 tmp_spider->clear_handler_opened(tmp_link_idx, conn->conn_kind);
3847 }
3848 DBUG_VOID_RETURN;
3849 }
3850
set_dup_key_idx(ha_spider * spider,int link_idx)3851 void spider_db_mbase::set_dup_key_idx(
3852 ha_spider *spider,
3853 int link_idx
3854 ) {
3855 TABLE *table = spider->get_table();
3856 uint roop_count, pk_idx = table->s->primary_key;
3857 int key_name_length;
3858 int max_length = 0;
3859 const char *key_name;
3860 DBUG_ENTER("spider_db_mbase::set_dup_key_idx");
3861 DBUG_PRINT("info",("spider this=%p", this));
3862 DBUG_PRINT("info",("spider error_str=%s", conn->error_str));
3863 for (roop_count = 0; roop_count < table->s->keys; roop_count++)
3864 {
3865 if (roop_count == pk_idx)
3866 {
3867 DBUG_PRINT("info",("spider pk_idx=%u", roop_count));
3868 int all_link_idx = spider->conn_link_idx[link_idx];
3869 key_name = spider->share->tgt_pk_names[all_link_idx];
3870 key_name_length = spider->share->tgt_pk_names_lengths[all_link_idx];
3871 } else {
3872 #ifdef SPIDER_use_LEX_CSTRING_for_KEY_Field_name
3873 key_name = table->key_info[roop_count].name.str;
3874 key_name_length = table->key_info[roop_count].name.length;
3875 #else
3876 key_name = table->key_info[roop_count].name;
3877 key_name_length = strlen(key_name);
3878 #endif
3879 }
3880 DBUG_PRINT("info",("spider key_name=%s", key_name));
3881 if (
3882 max_length < key_name_length &&
3883 conn->error_length - 1 >= key_name_length &&
3884 *(conn->error_str + conn->error_length - 2 -
3885 key_name_length) == '\'' &&
3886 !strncasecmp(conn->error_str +
3887 conn->error_length - 1 - key_name_length,
3888 key_name, key_name_length)
3889 ) {
3890 max_length = key_name_length;
3891 spider->dup_key_idx = roop_count;
3892 }
3893 }
3894 if (max_length == 0)
3895 spider->dup_key_idx = (uint) -1;
3896 DBUG_PRINT("info",("spider dup_key_idx=%d", spider->dup_key_idx));
3897 DBUG_VOID_RETURN;
3898 }
3899
cmp_request_key_to_snd(st_spider_db_request_key * request_key)3900 bool spider_db_mbase::cmp_request_key_to_snd(
3901 st_spider_db_request_key *request_key
3902 ) {
3903 DBUG_ENTER("spider_db_mbase::cmp_request_key_to_snd");
3904 DBUG_PRINT("info",("spider this=%p", this));
3905 DBUG_RETURN(TRUE);
3906 }
3907
spider_db_mbase_util()3908 spider_db_mbase_util::spider_db_mbase_util() : spider_db_util()
3909 {
3910 DBUG_ENTER("spider_db_mbase_util::spider_db_mbase_util");
3911 DBUG_PRINT("info",("spider this=%p", this));
3912 DBUG_VOID_RETURN;
3913 }
3914
spider_db_mysql_util()3915 spider_db_mysql_util::spider_db_mysql_util() : spider_db_mbase_util()
3916 {
3917 DBUG_ENTER("spider_db_mysql_util::spider_db_mysql_util");
3918 DBUG_PRINT("info",("spider this=%p", this));
3919 DBUG_VOID_RETURN;
3920 }
3921
spider_db_mariadb_util()3922 spider_db_mariadb_util::spider_db_mariadb_util() : spider_db_mbase_util()
3923 {
3924 DBUG_ENTER("spider_db_mariadb_util::spider_db_mariadb_util");
3925 DBUG_PRINT("info",("spider this=%p", this));
3926 DBUG_VOID_RETURN;
3927 }
3928
~spider_db_mbase_util()3929 spider_db_mbase_util::~spider_db_mbase_util()
3930 {
3931 DBUG_ENTER("spider_db_mbase_util::~spider_db_mbase_util");
3932 DBUG_PRINT("info",("spider this=%p", this));
3933 DBUG_VOID_RETURN;
3934 }
3935
~spider_db_mysql_util()3936 spider_db_mysql_util::~spider_db_mysql_util()
3937 {
3938 DBUG_ENTER("spider_db_mysql_util::~spider_db_mysql_util");
3939 DBUG_PRINT("info",("spider this=%p", this));
3940 DBUG_VOID_RETURN;
3941 }
3942
~spider_db_mariadb_util()3943 spider_db_mariadb_util::~spider_db_mariadb_util()
3944 {
3945 DBUG_ENTER("spider_db_mariadb_util::~spider_db_mariadb_util");
3946 DBUG_PRINT("info",("spider this=%p", this));
3947 DBUG_VOID_RETURN;
3948 }
3949
append_name(spider_string * str,const char * name,uint name_length)3950 int spider_db_mbase_util::append_name(
3951 spider_string *str,
3952 const char *name,
3953 uint name_length
3954 ) {
3955 DBUG_ENTER("spider_db_mbase_util::append_name");
3956 str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
3957 str->q_append(name, name_length);
3958 str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
3959 DBUG_RETURN(0);
3960 }
3961
append_name_with_charset(spider_string * str,const char * name,uint name_length,CHARSET_INFO * name_charset)3962 int spider_db_mbase_util::append_name_with_charset(
3963 spider_string *str,
3964 const char *name,
3965 uint name_length,
3966 CHARSET_INFO *name_charset
3967 ) {
3968 DBUG_ENTER("spider_db_mbase_util::append_name_with_charset");
3969 if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN * 2 + name_length * 2))
3970 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
3971 str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
3972 str->append(name, name_length, name_charset);
3973 if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN))
3974 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
3975 str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
3976 DBUG_RETURN(0);
3977 }
3978
append_escaped_name(spider_string * str,const char * name,uint name_length)3979 int spider_db_mbase_util::append_escaped_name(
3980 spider_string *str,
3981 const char *name,
3982 uint name_length
3983 ) {
3984 int error_num;
3985 DBUG_ENTER("spider_db_mbase_util::append_name");
3986 if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN * 2 + name_length * 2))
3987 {
3988 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
3989 }
3990 str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
3991 if ((error_num = spider_db_append_name_with_quote_str_internal(
3992 str, name, name_length, dbton_id)))
3993 {
3994 DBUG_RETURN(error_num);
3995 }
3996 if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN))
3997 {
3998 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
3999 }
4000 str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
4001 DBUG_RETURN(0);
4002 }
4003
append_escaped_name_with_charset(spider_string * str,const char * name,uint name_length,CHARSET_INFO * name_charset)4004 int spider_db_mbase_util::append_escaped_name_with_charset(
4005 spider_string *str,
4006 const char *name,
4007 uint name_length,
4008 CHARSET_INFO *name_charset
4009 ) {
4010 int error_num;
4011 DBUG_ENTER("spider_db_mbase_util::append_name_with_charset");
4012 if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN * 2 + name_length * 2))
4013 {
4014 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4015 }
4016 str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
4017 if ((error_num = spider_db_append_name_with_quote_str_internal(
4018 str, name, name_length, name_charset, dbton_id)))
4019 {
4020 DBUG_RETURN(error_num);
4021 }
4022 if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN))
4023 {
4024 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4025 }
4026 str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
4027 DBUG_RETURN(0);
4028 }
4029
is_name_quote(const char head_code)4030 bool spider_db_mbase_util::is_name_quote(
4031 const char head_code
4032 ) {
4033 DBUG_ENTER("spider_db_mbase_util::is_name_quote");
4034 DBUG_RETURN(head_code == *name_quote_str);
4035 }
4036
append_escaped_name_quote(spider_string * str)4037 int spider_db_mbase_util::append_escaped_name_quote(
4038 spider_string *str
4039 ) {
4040 DBUG_ENTER("spider_db_mbase_util::append_escaped_name_quote");
4041 if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN * 2))
4042 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4043 str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
4044 str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
4045 DBUG_RETURN(0);
4046 }
4047
append_column_value(ha_spider * spider,spider_string * str,Field * field,const uchar * new_ptr,CHARSET_INFO * access_charset)4048 int spider_db_mariadb_util::append_column_value(
4049 ha_spider *spider,
4050 spider_string *str,
4051 Field *field,
4052 const uchar *new_ptr,
4053 CHARSET_INFO *access_charset
4054 ) {
4055 bool float_value = FALSE;
4056 int error_num;
4057 char buf[MAX_FIELD_WIDTH];
4058 spider_string tmp_str(buf, MAX_FIELD_WIDTH, field->charset());
4059 String *ptr;
4060 uint length;
4061 THD *thd = field->table->in_use;
4062 Time_zone *saved_time_zone = thd->variables.time_zone;
4063 DBUG_ENTER("spider_db_mariadb_util::append_column_value");
4064 tmp_str.init_calc_mem(113);
4065
4066 thd->variables.time_zone = UTC;
4067
4068 if (new_ptr)
4069 {
4070 if (
4071 field->type() == MYSQL_TYPE_BLOB ||
4072 field->real_type() == MYSQL_TYPE_VARCHAR
4073 ) {
4074 length = uint2korr(new_ptr);
4075 tmp_str.set_quick((char *) new_ptr + HA_KEY_BLOB_LENGTH, length,
4076 field->charset());
4077 ptr = tmp_str.get_str();
4078 } else if (field->type() == MYSQL_TYPE_GEOMETRY)
4079 {
4080 /*
4081 uint mlength = SIZEOF_STORED_DOUBLE, lcnt;
4082 uchar *dest = (uchar *) buf;
4083 const uchar *source;
4084 for (lcnt = 0; lcnt < 4; lcnt++)
4085 {
4086 mlength = SIZEOF_STORED_DOUBLE;
4087 source = new_ptr + mlength + SIZEOF_STORED_DOUBLE * lcnt;
4088 while (mlength--)
4089 *dest++ = *--source;
4090 }
4091 tmp_str.length(SIZEOF_STORED_DOUBLE * lcnt);
4092 */
4093 #ifndef DBUG_OFF
4094 double xmin, xmax, ymin, ymax;
4095 /*
4096 float8store(buf,xmin);
4097 float8store(buf+8,xmax);
4098 float8store(buf+16,ymin);
4099 float8store(buf+24,ymax);
4100 memcpy(&xmin,new_ptr,sizeof(xmin));
4101 memcpy(&xmax,new_ptr + 8,sizeof(xmax));
4102 memcpy(&ymin,new_ptr + 16,sizeof(ymin));
4103 memcpy(&ymax,new_ptr + 24,sizeof(ymax));
4104 float8get(xmin, buf);
4105 float8get(xmax, buf + 8);
4106 float8get(ymin, buf + 16);
4107 float8get(ymax, buf + 24);
4108 DBUG_PRINT("info", ("spider geo is %f %f %f %f",
4109 xmin, xmax, ymin, ymax));
4110 DBUG_PRINT("info", ("spider geo is %.14g %.14g %.14g %.14g",
4111 xmin, xmax, ymin, ymax));
4112 */
4113 float8get(xmin, new_ptr);
4114 float8get(xmax, new_ptr + 8);
4115 float8get(ymin, new_ptr + 16);
4116 float8get(ymax, new_ptr + 24);
4117 DBUG_PRINT("info", ("spider geo is %f %f %f %f",
4118 xmin, xmax, ymin, ymax));
4119 /*
4120 float8get(xmin, new_ptr + SIZEOF_STORED_DOUBLE * 4);
4121 float8get(xmax, new_ptr + SIZEOF_STORED_DOUBLE * 5);
4122 float8get(ymin, new_ptr + SIZEOF_STORED_DOUBLE * 6);
4123 float8get(ymax, new_ptr + SIZEOF_STORED_DOUBLE * 7);
4124 DBUG_PRINT("info", ("spider geo is %f %f %f %f",
4125 xmin, xmax, ymin, ymax));
4126 float8get(xmin, new_ptr + SIZEOF_STORED_DOUBLE * 8);
4127 float8get(xmax, new_ptr + SIZEOF_STORED_DOUBLE * 9);
4128 float8get(ymin, new_ptr + SIZEOF_STORED_DOUBLE * 10);
4129 float8get(ymax, new_ptr + SIZEOF_STORED_DOUBLE * 11);
4130 DBUG_PRINT("info", ("spider geo is %f %f %f %f",
4131 xmin, xmax, ymin, ymax));
4132 float8get(xmin, new_ptr + SIZEOF_STORED_DOUBLE * 12);
4133 float8get(xmax, new_ptr + SIZEOF_STORED_DOUBLE * 13);
4134 float8get(ymin, new_ptr + SIZEOF_STORED_DOUBLE * 14);
4135 float8get(ymax, new_ptr + SIZEOF_STORED_DOUBLE * 15);
4136 DBUG_PRINT("info", ("spider geo is %f %f %f %f",
4137 xmin, xmax, ymin, ymax));
4138 */
4139 #endif
4140 /*
4141 tmp_str.set_quick((char *) new_ptr, SIZEOF_STORED_DOUBLE * 4,
4142 &my_charset_bin);
4143 */
4144 tmp_str.length(0);
4145 tmp_str.q_append((char *) SPIDER_SQL_LINESTRING_HEAD_STR,
4146 SPIDER_SQL_LINESTRING_HEAD_LEN);
4147 tmp_str.q_append((char *) new_ptr, SIZEOF_STORED_DOUBLE);
4148 tmp_str.q_append((char *) new_ptr + SIZEOF_STORED_DOUBLE * 2,
4149 SIZEOF_STORED_DOUBLE);
4150 tmp_str.q_append((char *) new_ptr + SIZEOF_STORED_DOUBLE,
4151 SIZEOF_STORED_DOUBLE);
4152 tmp_str.q_append((char *) new_ptr + SIZEOF_STORED_DOUBLE * 3,
4153 SIZEOF_STORED_DOUBLE);
4154 ptr = tmp_str.get_str();
4155 } else {
4156 ptr = field->val_str(tmp_str.get_str(), new_ptr);
4157 tmp_str.mem_calc();
4158 }
4159 } else {
4160 ptr = field->val_str(tmp_str.get_str());
4161 tmp_str.mem_calc();
4162 if (field->type() == MYSQL_TYPE_FLOAT)
4163 {
4164 float_value = TRUE;
4165 }
4166 }
4167
4168 thd->variables.time_zone = saved_time_zone;
4169
4170 DBUG_PRINT("info", ("spider field->type() is %d", field->type()));
4171 DBUG_PRINT("info", ("spider ptr->length() is %d", ptr->length()));
4172 /*
4173 if (
4174 field->type() == MYSQL_TYPE_BIT ||
4175 (field->type() >= MYSQL_TYPE_TINY_BLOB &&
4176 field->type() <= MYSQL_TYPE_BLOB)
4177 ) {
4178 uchar *hex_ptr = (uchar *) ptr->ptr(), *end_ptr;
4179 char *str_ptr;
4180 DBUG_PRINT("info", ("spider HEX"));
4181 if (str->reserve(SPIDER_SQL_HEX_LEN + ptr->length() * 2))
4182 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4183 str->q_append(SPIDER_SQL_HEX_STR, SPIDER_SQL_HEX_LEN);
4184 str_ptr = (char *) str->ptr() + str->length();
4185 for (end_ptr = hex_ptr + ptr->length(); hex_ptr < end_ptr; hex_ptr++)
4186 {
4187 *str_ptr++ = spider_dig_upper[(*hex_ptr) >> 4];
4188 *str_ptr++ = spider_dig_upper[(*hex_ptr) & 0x0F];
4189 }
4190 str->length(str->length() + ptr->length() * 2);
4191 } else
4192 */
4193 if (field->result_type() == STRING_RESULT)
4194 {
4195 DBUG_PRINT("info", ("spider STRING_RESULT"));
4196 if (str->charset() != field->charset())
4197 {
4198 if ((error_num = spider_db_append_charset_name_before_string(str,
4199 field->charset())))
4200 {
4201 DBUG_RETURN(error_num);
4202 }
4203 }
4204 if (str->reserve(SPIDER_SQL_VALUE_QUOTE_LEN))
4205 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4206 str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
4207 if (
4208 field->type() == MYSQL_TYPE_VARCHAR ||
4209 (field->type() >= MYSQL_TYPE_ENUM &&
4210 field->type() <= MYSQL_TYPE_GEOMETRY)
4211 ) {
4212 DBUG_PRINT("info", ("spider append_escaped"));
4213 char buf2[MAX_FIELD_WIDTH];
4214 spider_string tmp_str2(buf2, MAX_FIELD_WIDTH, field->charset());
4215 tmp_str2.init_calc_mem(114);
4216 tmp_str2.length(0);
4217 if (
4218 tmp_str2.append(ptr->ptr(), ptr->length(), field->charset()) ||
4219 str->reserve(tmp_str2.length() * 2) ||
4220 append_escaped_util(str, tmp_str2.get_str())
4221 )
4222 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4223 } else if (str->append(*ptr))
4224 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4225 if (str->reserve(SPIDER_SQL_VALUE_QUOTE_LEN))
4226 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4227 str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
4228 } else if (field->str_needs_quotes())
4229 {
4230 if (str->charset() != field->charset())
4231 {
4232 if ((error_num = spider_db_append_charset_name_before_string(str,
4233 field->charset())))
4234 {
4235 DBUG_RETURN(error_num);
4236 }
4237 }
4238 if (str->reserve(SPIDER_SQL_VALUE_QUOTE_LEN * 2 + ptr->length() * 2 + 2))
4239 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4240 str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
4241 append_escaped_util(str, ptr);
4242 str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
4243 } else if (float_value)
4244 {
4245 if (str->reserve(SPIDER_SQL_CAST_LEN + ptr->length() +
4246 SPIDER_SQL_AS_FLOAT_LEN + SPIDER_SQL_CLOSE_PAREN_LEN))
4247 {
4248 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4249 }
4250 str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
4251 str->q_append(ptr->ptr(), ptr->length());
4252 str->q_append(SPIDER_SQL_AS_FLOAT_STR, SPIDER_SQL_AS_FLOAT_LEN);
4253 str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
4254 } else if (str->append(*ptr))
4255 {
4256 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4257 }
4258 DBUG_RETURN(0);
4259 }
4260
append_column_value(ha_spider * spider,spider_string * str,Field * field,const uchar * new_ptr,CHARSET_INFO * access_charset)4261 int spider_db_mysql_util::append_column_value(
4262 ha_spider *spider,
4263 spider_string *str,
4264 Field *field,
4265 const uchar *new_ptr,
4266 CHARSET_INFO *access_charset
4267 ) {
4268 bool float_value = FALSE;
4269 int error_num;
4270 char buf[MAX_FIELD_WIDTH];
4271 spider_string tmp_str(buf, MAX_FIELD_WIDTH, field->charset());
4272 String *ptr;
4273 uint length;
4274 THD *thd = field->table->in_use;
4275 Time_zone *saved_time_zone = thd->variables.time_zone;
4276 DBUG_ENTER("spider_db_mysql_util::append_column_value");
4277 tmp_str.init_calc_mem(266);
4278
4279 thd->variables.time_zone = UTC;
4280
4281 if (new_ptr)
4282 {
4283 if (
4284 field->type() == MYSQL_TYPE_BLOB ||
4285 field->real_type() == MYSQL_TYPE_VARCHAR
4286 ) {
4287 length = uint2korr(new_ptr);
4288 tmp_str.set_quick((char *) new_ptr + HA_KEY_BLOB_LENGTH, length,
4289 field->charset());
4290 ptr = tmp_str.get_str();
4291 } else if (field->type() == MYSQL_TYPE_GEOMETRY)
4292 {
4293 /*
4294 uint mlength = SIZEOF_STORED_DOUBLE, lcnt;
4295 uchar *dest = (uchar *) buf;
4296 const uchar *source;
4297 for (lcnt = 0; lcnt < 4; lcnt++)
4298 {
4299 mlength = SIZEOF_STORED_DOUBLE;
4300 source = new_ptr + mlength + SIZEOF_STORED_DOUBLE * lcnt;
4301 while (mlength--)
4302 *dest++ = *--source;
4303 }
4304 tmp_str.length(SIZEOF_STORED_DOUBLE * lcnt);
4305 */
4306 #ifndef DBUG_OFF
4307 double xmin, xmax, ymin, ymax;
4308 /*
4309 float8store(buf,xmin);
4310 float8store(buf+8,xmax);
4311 float8store(buf+16,ymin);
4312 float8store(buf+24,ymax);
4313 memcpy(&xmin,new_ptr,sizeof(xmin));
4314 memcpy(&xmax,new_ptr + 8,sizeof(xmax));
4315 memcpy(&ymin,new_ptr + 16,sizeof(ymin));
4316 memcpy(&ymax,new_ptr + 24,sizeof(ymax));
4317 float8get(xmin, buf);
4318 float8get(xmax, buf + 8);
4319 float8get(ymin, buf + 16);
4320 float8get(ymax, buf + 24);
4321 DBUG_PRINT("info", ("spider geo is %f %f %f %f",
4322 xmin, xmax, ymin, ymax));
4323 DBUG_PRINT("info", ("spider geo is %.14g %.14g %.14g %.14g",
4324 xmin, xmax, ymin, ymax));
4325 */
4326 float8get(xmin, new_ptr);
4327 float8get(xmax, new_ptr + 8);
4328 float8get(ymin, new_ptr + 16);
4329 float8get(ymax, new_ptr + 24);
4330 DBUG_PRINT("info", ("spider geo is %f %f %f %f",
4331 xmin, xmax, ymin, ymax));
4332 /*
4333 float8get(xmin, new_ptr + SIZEOF_STORED_DOUBLE * 4);
4334 float8get(xmax, new_ptr + SIZEOF_STORED_DOUBLE * 5);
4335 float8get(ymin, new_ptr + SIZEOF_STORED_DOUBLE * 6);
4336 float8get(ymax, new_ptr + SIZEOF_STORED_DOUBLE * 7);
4337 DBUG_PRINT("info", ("spider geo is %f %f %f %f",
4338 xmin, xmax, ymin, ymax));
4339 float8get(xmin, new_ptr + SIZEOF_STORED_DOUBLE * 8);
4340 float8get(xmax, new_ptr + SIZEOF_STORED_DOUBLE * 9);
4341 float8get(ymin, new_ptr + SIZEOF_STORED_DOUBLE * 10);
4342 float8get(ymax, new_ptr + SIZEOF_STORED_DOUBLE * 11);
4343 DBUG_PRINT("info", ("spider geo is %f %f %f %f",
4344 xmin, xmax, ymin, ymax));
4345 float8get(xmin, new_ptr + SIZEOF_STORED_DOUBLE * 12);
4346 float8get(xmax, new_ptr + SIZEOF_STORED_DOUBLE * 13);
4347 float8get(ymin, new_ptr + SIZEOF_STORED_DOUBLE * 14);
4348 float8get(ymax, new_ptr + SIZEOF_STORED_DOUBLE * 15);
4349 DBUG_PRINT("info", ("spider geo is %f %f %f %f",
4350 xmin, xmax, ymin, ymax));
4351 */
4352 #endif
4353 /*
4354 tmp_str.set_quick((char *) new_ptr, SIZEOF_STORED_DOUBLE * 4,
4355 &my_charset_bin);
4356 */
4357 tmp_str.length(0);
4358 tmp_str.q_append((char *) SPIDER_SQL_LINESTRING_HEAD_STR,
4359 SPIDER_SQL_LINESTRING_HEAD_LEN);
4360 tmp_str.q_append((char *) new_ptr, SIZEOF_STORED_DOUBLE);
4361 tmp_str.q_append((char *) new_ptr + SIZEOF_STORED_DOUBLE * 2,
4362 SIZEOF_STORED_DOUBLE);
4363 tmp_str.q_append((char *) new_ptr + SIZEOF_STORED_DOUBLE,
4364 SIZEOF_STORED_DOUBLE);
4365 tmp_str.q_append((char *) new_ptr + SIZEOF_STORED_DOUBLE * 3,
4366 SIZEOF_STORED_DOUBLE);
4367 ptr = tmp_str.get_str();
4368 } else {
4369 ptr = field->val_str(tmp_str.get_str(), new_ptr);
4370 tmp_str.mem_calc();
4371 }
4372 } else {
4373 ptr = field->val_str(tmp_str.get_str());
4374 tmp_str.mem_calc();
4375 if (field->type() == MYSQL_TYPE_FLOAT)
4376 {
4377 float_value = TRUE;
4378 }
4379 }
4380
4381 thd->variables.time_zone = saved_time_zone;
4382
4383 DBUG_PRINT("info", ("spider field->type() is %d", field->type()));
4384 DBUG_PRINT("info", ("spider ptr->length() is %d", ptr->length()));
4385 /*
4386 if (
4387 field->type() == MYSQL_TYPE_BIT ||
4388 (field->type() >= MYSQL_TYPE_TINY_BLOB &&
4389 field->type() <= MYSQL_TYPE_BLOB)
4390 ) {
4391 uchar *hex_ptr = (uchar *) ptr->ptr(), *end_ptr;
4392 char *str_ptr;
4393 DBUG_PRINT("info", ("spider HEX"));
4394 if (str->reserve(SPIDER_SQL_HEX_LEN + ptr->length() * 2))
4395 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4396 str->q_append(SPIDER_SQL_HEX_STR, SPIDER_SQL_HEX_LEN);
4397 str_ptr = (char *) str->ptr() + str->length();
4398 for (end_ptr = hex_ptr + ptr->length(); hex_ptr < end_ptr; hex_ptr++)
4399 {
4400 *str_ptr++ = spider_dig_upper[(*hex_ptr) >> 4];
4401 *str_ptr++ = spider_dig_upper[(*hex_ptr) & 0x0F];
4402 }
4403 str->length(str->length() + ptr->length() * 2);
4404 } else
4405 */
4406 if (field->result_type() == STRING_RESULT)
4407 {
4408 DBUG_PRINT("info", ("spider STRING_RESULT"));
4409 if (str->charset() != field->charset())
4410 {
4411 if ((error_num = spider_db_append_charset_name_before_string(str,
4412 field->charset())))
4413 {
4414 DBUG_RETURN(error_num);
4415 }
4416 }
4417 if (str->reserve(SPIDER_SQL_VALUE_QUOTE_LEN))
4418 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4419 str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
4420 if (
4421 field->type() == MYSQL_TYPE_VARCHAR ||
4422 (field->type() >= MYSQL_TYPE_ENUM &&
4423 field->type() <= MYSQL_TYPE_GEOMETRY)
4424 ) {
4425 DBUG_PRINT("info", ("spider append_escaped"));
4426 char buf2[MAX_FIELD_WIDTH];
4427 spider_string tmp_str2(buf2, MAX_FIELD_WIDTH, field->charset());
4428 tmp_str2.init_calc_mem(267);
4429 tmp_str2.length(0);
4430 if (
4431 tmp_str2.append(ptr->ptr(), ptr->length(), field->charset()) ||
4432 str->reserve(tmp_str2.length() * 2) ||
4433 append_escaped_util(str, tmp_str2.get_str())
4434 )
4435 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4436 } else if (str->append(*ptr))
4437 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4438 if (str->reserve(SPIDER_SQL_VALUE_QUOTE_LEN))
4439 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4440 str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
4441 } else if (field->str_needs_quotes())
4442 {
4443 if (str->charset() != field->charset())
4444 {
4445 if ((error_num = spider_db_append_charset_name_before_string(str,
4446 field->charset())))
4447 {
4448 DBUG_RETURN(error_num);
4449 }
4450 }
4451 if (str->reserve(SPIDER_SQL_VALUE_QUOTE_LEN * 2 + ptr->length() * 2 + 2))
4452 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4453 str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
4454 append_escaped_util(str, ptr);
4455 str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
4456 } else if (float_value)
4457 {
4458 if (str->reserve(SPIDER_SQL_TO_FLOAT_LEN + ptr->length() +
4459 SPIDER_SQL_CLOSE_PAREN_LEN))
4460 {
4461 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4462 }
4463 str->q_append(SPIDER_SQL_TO_FLOAT_STR, SPIDER_SQL_TO_FLOAT_LEN);
4464 str->q_append(ptr->ptr(), ptr->length());
4465 str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
4466 } else if (str->append(*ptr))
4467 {
4468 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4469 }
4470 DBUG_RETURN(0);
4471 }
4472
append_column_value(ha_spider * spider,spider_string * str,Field * field,const uchar * new_ptr,CHARSET_INFO * access_charset)4473 int spider_db_mbase_util::append_column_value(
4474 ha_spider *spider,
4475 spider_string *str,
4476 Field *field,
4477 const uchar *new_ptr,
4478 CHARSET_INFO *access_charset
4479 ) {
4480 DBUG_ENTER("spider_db_mbase_util::append_column_value");
4481 DBUG_ASSERT(0);
4482 DBUG_RETURN(0);
4483 }
4484
append_from_with_alias(spider_string * str,const char ** table_names,uint * table_name_lengths,const char ** table_aliases,uint * table_alias_lengths,uint table_count,int * table_name_pos,bool over_write)4485 int spider_db_mbase_util::append_from_with_alias(
4486 spider_string *str,
4487 const char **table_names,
4488 uint *table_name_lengths,
4489 const char **table_aliases,
4490 uint *table_alias_lengths,
4491 uint table_count,
4492 int *table_name_pos,
4493 bool over_write
4494 ) {
4495 uint roop_count, length = 0;
4496 DBUG_ENTER("spider_db_mbase_util::append_from_with_alias");
4497 DBUG_PRINT("info",("spider this=%p", this));
4498 if (!over_write)
4499 {
4500 for (roop_count = 0; roop_count < table_count; roop_count++)
4501 length += table_name_lengths[roop_count] + SPIDER_SQL_SPACE_LEN +
4502 table_alias_lengths[roop_count] + SPIDER_SQL_COMMA_LEN;
4503 if (str->reserve(SPIDER_SQL_FROM_LEN + length))
4504 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4505 str->q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN);
4506 *table_name_pos = str->length();
4507 }
4508 for (roop_count = 0; roop_count < table_count; roop_count++)
4509 {
4510 str->q_append(table_names[roop_count], table_name_lengths[roop_count]);
4511 str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
4512 str->q_append(table_aliases[roop_count], table_alias_lengths[roop_count]);
4513 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
4514 }
4515 str->length(str->length() - SPIDER_SQL_COMMA_LEN);
4516 DBUG_RETURN(0);
4517 }
4518
append_trx_isolation(spider_string * str,int trx_isolation)4519 int spider_db_mbase_util::append_trx_isolation(
4520 spider_string *str,
4521 int trx_isolation
4522 ) {
4523 DBUG_ENTER("spider_db_mbase_util::append_trx_isolation");
4524 DBUG_PRINT("info",("spider this=%p", this));
4525 if (str->reserve(SPIDER_SQL_SEMICOLON_LEN +
4526 SPIDER_SQL_ISO_READ_UNCOMMITTED_LEN))
4527 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4528 if (str->length())
4529 {
4530 str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
4531 }
4532 switch (trx_isolation)
4533 {
4534 case ISO_READ_UNCOMMITTED:
4535 str->q_append(SPIDER_SQL_ISO_READ_UNCOMMITTED_STR,
4536 SPIDER_SQL_ISO_READ_UNCOMMITTED_LEN);
4537 break;
4538 case ISO_READ_COMMITTED:
4539 str->q_append(SPIDER_SQL_ISO_READ_COMMITTED_STR,
4540 SPIDER_SQL_ISO_READ_COMMITTED_LEN);
4541 break;
4542 case ISO_REPEATABLE_READ:
4543 str->q_append(SPIDER_SQL_ISO_REPEATABLE_READ_STR,
4544 SPIDER_SQL_ISO_REPEATABLE_READ_LEN);
4545 break;
4546 case ISO_SERIALIZABLE:
4547 str->q_append(SPIDER_SQL_ISO_SERIALIZABLE_STR,
4548 SPIDER_SQL_ISO_SERIALIZABLE_LEN);
4549 break;
4550 default:
4551 DBUG_RETURN(HA_ERR_UNSUPPORTED);
4552 }
4553 DBUG_RETURN(0);
4554 }
4555
append_autocommit(spider_string * str,bool autocommit)4556 int spider_db_mbase_util::append_autocommit(
4557 spider_string *str,
4558 bool autocommit
4559 ) {
4560 DBUG_ENTER("spider_db_mbase_util::append_autocommit");
4561 DBUG_PRINT("info",("spider this=%p", this));
4562 if (str->reserve(SPIDER_SQL_SEMICOLON_LEN + SPIDER_SQL_AUTOCOMMIT_OFF_LEN))
4563 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4564 if (str->length())
4565 {
4566 str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
4567 }
4568 if (autocommit)
4569 {
4570 str->q_append(SPIDER_SQL_AUTOCOMMIT_ON_STR,
4571 SPIDER_SQL_AUTOCOMMIT_ON_LEN);
4572 } else {
4573 str->q_append(SPIDER_SQL_AUTOCOMMIT_OFF_STR,
4574 SPIDER_SQL_AUTOCOMMIT_OFF_LEN);
4575 }
4576 DBUG_RETURN(0);
4577 }
4578
append_sql_log_off(spider_string * str,bool sql_log_off)4579 int spider_db_mbase_util::append_sql_log_off(
4580 spider_string *str,
4581 bool sql_log_off
4582 ) {
4583 DBUG_ENTER("spider_db_mbase_util::append_sql_log_off");
4584 DBUG_PRINT("info",("spider this=%p", this));
4585 if (str->reserve(SPIDER_SQL_SEMICOLON_LEN + SPIDER_SQL_SQL_LOG_OFF_LEN))
4586 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4587 if (str->length())
4588 {
4589 str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
4590 }
4591 if (sql_log_off)
4592 {
4593 str->q_append(SPIDER_SQL_SQL_LOG_ON_STR, SPIDER_SQL_SQL_LOG_ON_LEN);
4594 } else {
4595 str->q_append(SPIDER_SQL_SQL_LOG_OFF_STR, SPIDER_SQL_SQL_LOG_OFF_LEN);
4596 }
4597 DBUG_RETURN(0);
4598 }
4599
append_wait_timeout(spider_string * str,int wait_timeout)4600 int spider_db_mbase_util::append_wait_timeout(
4601 spider_string *str,
4602 int wait_timeout
4603 ) {
4604 char timeout_str[SPIDER_SQL_INT_LEN];
4605 int timeout_str_length;
4606 DBUG_ENTER("spider_db_mbase_util::append_wait_timeout");
4607 DBUG_PRINT("info",("spider this=%p", this));
4608 timeout_str_length =
4609 my_sprintf(timeout_str, (timeout_str, "%d", wait_timeout));
4610 if (str->reserve(SPIDER_SQL_SEMICOLON_LEN + SPIDER_SQL_WAIT_TIMEOUT_LEN +
4611 timeout_str_length))
4612 {
4613 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
4614 }
4615 if (str->length())
4616 {
4617 str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
4618 }
4619 str->q_append(SPIDER_SQL_WAIT_TIMEOUT_STR, SPIDER_SQL_WAIT_TIMEOUT_LEN);
4620 str->q_append(timeout_str, timeout_str_length);
4621 DBUG_RETURN(0);
4622 }
4623
4624 #define SPIDER_REAL_AS_FLOAT_STR "real_as_float"
4625 #define SPIDER_REAL_AS_FLOAT_LEN (sizeof(SPIDER_REAL_AS_FLOAT_STR) - 1)
4626 #define SPIDER_PIPES_AS_CONCAT_STR "pipes_as_concat"
4627 #define SPIDER_PIPES_AS_CONCAT_LEN (sizeof(SPIDER_PIPES_AS_CONCAT_STR) - 1)
4628 #define SPIDER_ANSI_QUOTES_STR "ansi_quotes"
4629 #define SPIDER_ANSI_QUOTES_LEN (sizeof(SPIDER_ANSI_QUOTES_STR) - 1)
4630 #define SPIDER_IGNORE_SPACE_STR "ignore_space"
4631 #define SPIDER_IGNORE_SPACE_LEN (sizeof(SPIDER_IGNORE_SPACE_STR) - 1)
4632 #define SPIDER_IGNORE_BAD_TABLE_OPTIONS_STR "ignore_bad_table_options"
4633 #define SPIDER_IGNORE_BAD_TABLE_OPTIONS_LEN (sizeof(SPIDER_IGNORE_BAD_TABLE_OPTIONS_STR) - 1)
4634 #define SPIDER_ONLY_FULL_GROUP_BY_STR "only_full_group_by"
4635 #define SPIDER_ONLY_FULL_GROUP_BY_LEN (sizeof(SPIDER_ONLY_FULL_GROUP_BY_STR) - 1)
4636 #define SPIDER_NO_UNSIGNED_SUBTRACTION_STR "no_unsigned_subtraction"
4637 #define SPIDER_NO_UNSIGNED_SUBTRACTION_LEN (sizeof(SPIDER_NO_UNSIGNED_SUBTRACTION_STR) - 1)
4638 #define SPIDER_NO_DIR_IN_CREATE_STR "no_dir_in_create"
4639 #define SPIDER_NO_DIR_IN_CREATE_LEN (sizeof(SPIDER_NO_DIR_IN_CREATE_STR) - 1)
4640 #define SPIDER_POSTGRESQL_STR "postgresql"
4641 #define SPIDER_POSTGRESQL_LEN (sizeof(SPIDER_POSTGRESQL_STR) - 1)
4642 #define SPIDER_ORACLE_STR "oracle"
4643 #define SPIDER_ORACLE_LEN (sizeof(SPIDER_ORACLE_STR) - 1)
4644 #define SPIDER_MSSQL_STR "mssql"
4645 #define SPIDER_MSSQL_LEN (sizeof(SPIDER_MSSQL_STR) - 1)
4646 #define SPIDER_DB2_STR "db2"
4647 #define SPIDER_DB2_LEN (sizeof(SPIDER_DB2_STR) - 1)
4648 #define SPIDER_MAXDB_STR "maxdb"
4649 #define SPIDER_MAXDB_LEN (sizeof(SPIDER_MAXDB_STR) - 1)
4650 #define SPIDER_NO_KEY_OPTIONS_STR "no_key_options"
4651 #define SPIDER_NO_KEY_OPTIONS_LEN (sizeof(SPIDER_NO_KEY_OPTIONS_STR) - 1)
4652 #define SPIDER_NO_TABLE_OPTIONS_STR "no_table_options"
4653 #define SPIDER_NO_TABLE_OPTIONS_LEN (sizeof(SPIDER_NO_TABLE_OPTIONS_STR) - 1)
4654 #define SPIDER_NO_FIELD_OPTIONS_STR "no_field_options"
4655 #define SPIDER_NO_FIELD_OPTIONS_LEN (sizeof(SPIDER_NO_FIELD_OPTIONS_STR) - 1)
4656 #define SPIDER_MYSQL323_STR "mysql323"
4657 #define SPIDER_MYSQL323_LEN (sizeof(SPIDER_MYSQL323_STR) - 1)
4658 #define SPIDER_MYSQL40_STR "mysql40"
4659 #define SPIDER_MYSQL40_LEN (sizeof(SPIDER_MYSQL40_STR) - 1)
4660 #define SPIDER_ANSI_STR "ansi"
4661 #define SPIDER_ANSI_LEN (sizeof(SPIDER_ANSI_STR) - 1)
4662 #define SPIDER_NO_AUTO_VALUE_ON_ZERO_STR "no_auto_value_on_zero"
4663 #define SPIDER_NO_AUTO_VALUE_ON_ZERO_LEN (sizeof(SPIDER_NO_AUTO_VALUE_ON_ZERO_STR) - 1)
4664 #define SPIDER_NO_BACKSLASH_ESCAPES_STR "no_backslash_escapes"
4665 #define SPIDER_NO_BACKSLASH_ESCAPES_LEN (sizeof(SPIDER_NO_BACKSLASH_ESCAPES_STR) - 1)
4666 #define SPIDER_STRICT_TRANS_TABLES_STR "strict_trans_tables"
4667 #define SPIDER_STRICT_TRANS_TABLES_LEN (sizeof(SPIDER_STRICT_TRANS_TABLES_STR) - 1)
4668 #define SPIDER_STRICT_ALL_TABLES_STR "strict_all_tables"
4669 #define SPIDER_STRICT_ALL_TABLES_LEN (sizeof(SPIDER_STRICT_ALL_TABLES_STR) - 1)
4670 #define SPIDER_NO_ZERO_IN_DATE_STR "no_zero_in_date"
4671 #define SPIDER_NO_ZERO_IN_DATE_LEN (sizeof(SPIDER_NO_ZERO_IN_DATE_STR) - 1)
4672 #define SPIDER_NO_ZERO_DATE_STR "no_zero_date"
4673 #define SPIDER_NO_ZERO_DATE_LEN (sizeof(SPIDER_NO_ZERO_DATE_STR) - 1)
4674 #define SPIDER_INVALID_DATES_STR "allow_invalid_dates"
4675 #define SPIDER_INVALID_DATES_LEN (sizeof(SPIDER_INVALID_DATES_STR) - 1)
4676 #define SPIDER_ERROR_FOR_DIVISION_BY_ZERO_STR "error_for_division_by_zero"
4677 #define SPIDER_ERROR_FOR_DIVISION_BY_ZERO_LEN (sizeof(SPIDER_ERROR_FOR_DIVISION_BY_ZERO_STR) - 1)
4678 #define SPIDER_TRADITIONAL_STR "traditional"
4679 #define SPIDER_TRADITIONAL_LEN (sizeof(SPIDER_TRADITIONAL_STR) - 1)
4680 #define SPIDER_NO_AUTO_CREATE_USER_STR "no_auto_create_user"
4681 #define SPIDER_NO_AUTO_CREATE_USER_LEN (sizeof(SPIDER_NO_AUTO_CREATE_USER_STR) - 1)
4682 #define SPIDER_HIGH_NOT_PRECEDENCE_STR "high_not_precedence"
4683 #define SPIDER_HIGH_NOT_PRECEDENCE_LEN (sizeof(SPIDER_HIGH_NOT_PRECEDENCE_STR) - 1)
4684 #define SPIDER_NO_ENGINE_SUBSTITUTION_STR "no_engine_substitution"
4685 #define SPIDER_NO_ENGINE_SUBSTITUTION_LEN (sizeof(SPIDER_NO_ENGINE_SUBSTITUTION_STR) - 1)
4686 #define SPIDER_PAD_CHAR_TO_FULL_LENGTH_STR "pad_char_to_full_length"
4687 #define SPIDER_PAD_CHAR_TO_FULL_LENGTH_LEN (sizeof(SPIDER_PAD_CHAR_TO_FULL_LENGTH_STR) - 1)
4688 #define SPIDER_EMPTY_STRING_IS_NULL_STR "empty_string_is_null"
4689 #define SPIDER_EMPTY_STRING_IS_NULL_LEN (sizeof(SPIDER_EMPTY_STRING_IS_NULL_STR) - 1)
4690 #define SPIDER_SIMULTANEOUS_ASSIGNMENT_STR "simultaneous_assignment"
4691 #define SPIDER_SIMULTANEOUS_ASSIGNMENT_LEN (sizeof(SPIDER_SIMULTANEOUS_ASSIGNMENT_STR) - 1)
4692 #define SPIDER_TIME_ROUND_FRACTIONAL_STR "time_round_fractional"
4693 #define SPIDER_TIME_ROUND_FRACTIONAL_LEN (sizeof(SPIDER_TIME_ROUND_FRACTIONAL_STR) - 1)
4694
4695 sql_mode_t full_sql_mode =
4696 #ifdef MODE_REAL_AS_FLOAT
4697 MODE_REAL_AS_FLOAT |
4698 #endif
4699 #ifdef MODE_PIPES_AS_CONCAT
4700 MODE_PIPES_AS_CONCAT |
4701 #endif
4702 #ifdef MODE_ANSI_QUOTES
4703 MODE_ANSI_QUOTES |
4704 #endif
4705 #ifdef MODE_IGNORE_SPACE
4706 MODE_IGNORE_SPACE |
4707 #endif
4708 #ifdef MODE_IGNORE_BAD_TABLE_OPTIONS
4709 MODE_IGNORE_BAD_TABLE_OPTIONS |
4710 #endif
4711 #ifdef MODE_ONLY_FULL_GROUP_BY
4712 MODE_ONLY_FULL_GROUP_BY |
4713 #endif
4714 #ifdef MODE_NO_UNSIGNED_SUBTRACTION
4715 MODE_NO_UNSIGNED_SUBTRACTION |
4716 #endif
4717 #ifdef MODE_NO_DIR_IN_CREATE
4718 MODE_NO_DIR_IN_CREATE |
4719 #endif
4720 #ifdef MODE_POSTGRESQL
4721 MODE_POSTGRESQL |
4722 #endif
4723 #ifdef MODE_ORACLE
4724 MODE_ORACLE |
4725 #endif
4726 #ifdef MODE_MSSQL
4727 MODE_MSSQL |
4728 #endif
4729 #ifdef MODE_DB2
4730 MODE_DB2 |
4731 #endif
4732 #ifdef MODE_MAXDB
4733 MODE_MAXDB |
4734 #endif
4735 #ifdef MODE_NO_KEY_OPTIONS
4736 MODE_NO_KEY_OPTIONS |
4737 #endif
4738 #ifdef MODE_NO_TABLE_OPTIONS
4739 MODE_NO_TABLE_OPTIONS |
4740 #endif
4741 #ifdef MODE_NO_FIELD_OPTIONS
4742 MODE_NO_FIELD_OPTIONS |
4743 #endif
4744 #ifdef MODE_MYSQL323
4745 MODE_MYSQL323 |
4746 #endif
4747 #ifdef MODE_MYSQL40
4748 MODE_MYSQL40 |
4749 #endif
4750 #ifdef MODE_ANSI
4751 MODE_ANSI |
4752 #endif
4753 #ifdef MODE_NO_AUTO_VALUE_ON_ZERO
4754 MODE_NO_AUTO_VALUE_ON_ZERO |
4755 #endif
4756 #ifdef MODE_NO_BACKSLASH_ESCAPES
4757 MODE_NO_BACKSLASH_ESCAPES |
4758 #endif
4759 #ifdef MODE_STRICT_TRANS_TABLES
4760 MODE_STRICT_TRANS_TABLES |
4761 #endif
4762 #ifdef MODE_STRICT_ALL_TABLES
4763 MODE_STRICT_ALL_TABLES |
4764 #endif
4765 #ifdef MODE_NO_ZERO_IN_DATE
4766 MODE_NO_ZERO_IN_DATE |
4767 #endif
4768 #ifdef MODE_NO_ZERO_DATE
4769 MODE_NO_ZERO_DATE |
4770 #endif
4771 #ifdef MODE_INVALID_DATES
4772 MODE_INVALID_DATES |
4773 #endif
4774 #ifdef MODE_ERROR_FOR_DIVISION_BY_ZERO
4775 MODE_ERROR_FOR_DIVISION_BY_ZERO |
4776 #endif
4777 #ifdef MODE_TRADITIONAL
4778 MODE_TRADITIONAL |
4779 #endif
4780 #ifdef MODE_NO_AUTO_CREATE_USER
4781 MODE_NO_AUTO_CREATE_USER |
4782 #endif
4783 #ifdef MODE_HIGH_NOT_PRECEDENCE
4784 MODE_HIGH_NOT_PRECEDENCE |
4785 #endif
4786 #ifdef MODE_NO_ENGINE_SUBSTITUTION
4787 MODE_NO_ENGINE_SUBSTITUTION |
4788 #endif
4789 #ifdef MODE_PAD_CHAR_TO_FULL_LENGTH
4790 MODE_PAD_CHAR_TO_FULL_LENGTH |
4791 #endif
4792 #ifdef MODE_EMPTY_STRING_IS_NULL
4793 MODE_EMPTY_STRING_IS_NULL |
4794 #endif
4795 #ifdef MODE_SIMULTANEOUS_ASSIGNMENT
4796 MODE_SIMULTANEOUS_ASSIGNMENT |
4797 #endif
4798 #ifdef MODE_TIME_ROUND_FRACTIONAL
4799 MODE_TIME_ROUND_FRACTIONAL |
4800 #endif
4801 0;
4802
4803 #ifdef MODE_REAL_AS_FLOAT
4804 /* pushdown */
4805 #define SPIDER_SQL_MODE_REAL_AS_FLOAT
4806 #endif
4807 #ifdef MODE_PIPES_AS_CONCAT
4808 /* no pushdown */
4809 #endif
4810 #ifdef MODE_ANSI_QUOTES
4811 /* no pushdown */
4812 #endif
4813 #ifdef MODE_IGNORE_SPACE
4814 /* no pushdown */
4815 #endif
4816 #ifdef MODE_IGNORE_BAD_TABLE_OPTIONS
4817 /* pushdown */
4818 #define SPIDER_SQL_MODE_IGNORE_BAD_TABLE_OPTIONS
4819 #endif
4820 #ifdef MODE_ONLY_FULL_GROUP_BY
4821 /* no pushdown */
4822 #endif
4823 #ifdef MODE_NO_UNSIGNED_SUBTRACTION
4824 /* pushdown */
4825 #define SPIDER_SQL_MODE_NO_UNSIGNED_SUBTRACTION
4826 #endif
4827 #ifdef MODE_NO_DIR_IN_CREATE
4828 /* pushdown */
4829 #define SPIDER_SQL_MODE_NO_DIR_IN_CREATE
4830 #endif
4831 #ifdef MODE_POSTGRESQL
4832 /* no pushdown */
4833 #endif
4834 #ifdef MODE_ORACLE
4835 /* no pushdown */
4836 #endif
4837 #ifdef MODE_MSSQL
4838 /* no pushdown */
4839 #endif
4840 #ifdef MODE_DB2
4841 /* no pushdown */
4842 #endif
4843 #ifdef MODE_MAXDB
4844 /* no pushdown */
4845 #endif
4846 #ifdef MODE_NO_KEY_OPTIONS
4847 /* no pushdown */
4848 #endif
4849 #ifdef MODE_NO_TABLE_OPTIONS
4850 /* no pushdown */
4851 #endif
4852 #ifdef MODE_NO_FIELD_OPTIONS
4853 /* no pushdown */
4854 #endif
4855 #ifdef MODE_MYSQL323
4856 /* no pushdown */
4857 #endif
4858 #ifdef MODE_MYSQL40
4859 /* no pushdown */
4860 #endif
4861 #ifdef MODE_ANSI
4862 /* no pushdown */
4863 #endif
4864 #ifdef MODE_NO_AUTO_VALUE_ON_ZERO
4865 /* pushdown */
4866 #define SPIDER_SQL_MODE_NO_AUTO_VALUE_ON_ZERO
4867 #endif
4868 #ifdef MODE_NO_BACKSLASH_ESCAPES
4869 /* no pushdown */
4870 #endif
4871 #ifdef MODE_STRICT_TRANS_TABLES
4872 /* pushdown */
4873 #define SPIDER_SQL_MODE_STRICT_TRANS_TABLES
4874 #endif
4875 #ifdef MODE_STRICT_ALL_TABLES
4876 /* pushdown */
4877 #define SPIDER_SQL_MODE_STRICT_ALL_TABLES
4878 #endif
4879 #ifdef MODE_NO_ZERO_IN_DATE
4880 /* pushdown */
4881 #define SPIDER_SQL_MODE_NO_ZERO_IN_DATE
4882 #endif
4883 #ifdef MODE_NO_ZERO_DATE
4884 /* pushdown */
4885 #define SPIDER_SQL_MODE_NO_ZERO_DATE
4886 #endif
4887 #ifdef MODE_INVALID_DATES
4888 /* pushdown */
4889 #define SPIDER_SQL_MODE_INVALID_DATES
4890 #endif
4891 #ifdef MODE_ERROR_FOR_DIVISION_BY_ZERO
4892 /* pushdown */
4893 #define SPIDER_SQL_MODE_ERROR_FOR_DIVISION_BY_ZERO
4894 #endif
4895 #ifdef MODE_TRADITIONAL
4896 /* no pushdown */
4897 #endif
4898 #ifdef MODE_NO_AUTO_CREATE_USER
4899 /* pushdown */
4900 #define SPIDER_SQL_MODE_NO_AUTO_CREATE_USER
4901 #endif
4902 #ifdef MODE_HIGH_NOT_PRECEDENCE
4903 /* pushdown */
4904 #define SPIDER_SQL_MODE_HIGH_NOT_PRECEDENCE
4905 #endif
4906 #ifdef MODE_NO_ENGINE_SUBSTITUTION
4907 /* pushdown */
4908 #define SPIDER_SQL_MODE_NO_ENGINE_SUBSTITUTION
4909 #endif
4910 #ifdef MODE_PAD_CHAR_TO_FULL_LENGTH
4911 /* pushdown */
4912 #define SPIDER_SQL_MODE_PAD_CHAR_TO_FULL_LENGTH
4913 #endif
4914 #ifdef MODE_EMPTY_STRING_IS_NULL
4915 /* pushdown */
4916 #define SPIDER_SQL_MODE_EMPTY_STRING_IS_NULL
4917 #endif
4918 #ifdef MODE_SIMULTANEOUS_ASSIGNMENT
4919 /* pushdown */
4920 #define SPIDER_SQL_MODE_SIMULTANEOUS_ASSIGNMENT
4921 #endif
4922 #ifdef MODE_TIME_ROUND_FRACTIONAL
4923 /* pushdown */
4924 #define SPIDER_SQL_MODE_TIME_ROUND_FRACTIONAL
4925 #endif
4926
4927 sql_mode_t pushdown_sql_mode =
4928 #ifdef SPIDER_SQL_MODE_REAL_AS_FLOAT
4929 MODE_REAL_AS_FLOAT |
4930 #endif
4931 #ifdef SPIDER_SQL_MODE_PIPES_AS_CONCAT
4932 MODE_PIPES_AS_CONCAT |
4933 #endif
4934 #ifdef SPIDER_SQL_MODE_ANSI_QUOTES
4935 MODE_ANSI_QUOTES |
4936 #endif
4937 #ifdef SPIDER_SQL_MODE_IGNORE_SPACE
4938 MODE_IGNORE_SPACE |
4939 #endif
4940 #ifdef SPIDER_SQL_MODE_IGNORE_BAD_TABLE_OPTIONS
4941 MODE_IGNORE_BAD_TABLE_OPTIONS |
4942 #endif
4943 #ifdef SPIDER_SQL_MODE_ONLY_FULL_GROUP_BY
4944 MODE_ONLY_FULL_GROUP_BY |
4945 #endif
4946 #ifdef SPIDER_SQL_MODE_NO_UNSIGNED_SUBTRACTION
4947 MODE_NO_UNSIGNED_SUBTRACTION |
4948 #endif
4949 #ifdef SPIDER_SQL_MODE_NO_DIR_IN_CREATE
4950 MODE_NO_DIR_IN_CREATE |
4951 #endif
4952 #ifdef SPIDER_SQL_MODE_POSTGRESQL
4953 MODE_POSTGRESQL |
4954 #endif
4955 #ifdef SPIDER_SQL_MODE_ORACLE
4956 MODE_ORACLE |
4957 #endif
4958 #ifdef SPIDER_SQL_MODE_MSSQL
4959 MODE_MSSQL |
4960 #endif
4961 #ifdef SPIDER_SQL_MODE_DB2
4962 MODE_DB2 |
4963 #endif
4964 #ifdef SPIDER_SQL_MODE_MAXDB
4965 MODE_MAXDB |
4966 #endif
4967 #ifdef SPIDER_SQL_MODE_NO_KEY_OPTIONS
4968 MODE_NO_KEY_OPTIONS |
4969 #endif
4970 #ifdef SPIDER_SQL_MODE_NO_TABLE_OPTIONS
4971 MODE_NO_TABLE_OPTIONS |
4972 #endif
4973 #ifdef SPIDER_SQL_MODE_NO_FIELD_OPTIONS
4974 MODE_NO_FIELD_OPTIONS |
4975 #endif
4976 #ifdef SPIDER_SQL_MODE_MYSQL323
4977 MODE_MYSQL323 |
4978 #endif
4979 #ifdef SPIDER_SQL_MODE_MYSQL40
4980 MODE_MYSQL40 |
4981 #endif
4982 #ifdef SPIDER_SQL_MODE_ANSI
4983 MODE_ANSI |
4984 #endif
4985 #ifdef SPIDER_SQL_MODE_NO_AUTO_VALUE_ON_ZERO
4986 MODE_NO_AUTO_VALUE_ON_ZERO |
4987 #endif
4988 #ifdef SPIDER_SQL_MODE_NO_BACKSLASH_ESCAPES
4989 MODE_NO_BACKSLASH_ESCAPES |
4990 #endif
4991 #ifdef SPIDER_SQL_MODE_STRICT_TRANS_TABLES
4992 MODE_STRICT_TRANS_TABLES |
4993 #endif
4994 #ifdef SPIDER_SQL_MODE_STRICT_ALL_TABLES
4995 MODE_STRICT_ALL_TABLES |
4996 #endif
4997 #ifdef SPIDER_SQL_MODE_NO_ZERO_IN_DATE
4998 MODE_NO_ZERO_IN_DATE |
4999 #endif
5000 #ifdef SPIDER_SQL_MODE_NO_ZERO_DATE
5001 MODE_NO_ZERO_DATE |
5002 #endif
5003 #ifdef SPIDER_SQL_MODE_INVALID_DATES
5004 MODE_INVALID_DATES |
5005 #endif
5006 #ifdef SPIDER_SQL_MODE_ERROR_FOR_DIVISION_BY_ZERO
5007 MODE_ERROR_FOR_DIVISION_BY_ZERO |
5008 #endif
5009 #ifdef SPIDER_SQL_MODE_TRADITIONAL
5010 MODE_TRADITIONAL |
5011 #endif
5012 #ifdef SPIDER_SQL_MODE_NO_AUTO_CREATE_USER
5013 MODE_NO_AUTO_CREATE_USER |
5014 #endif
5015 #ifdef SPIDER_SQL_MODE_HIGH_NOT_PRECEDENCE
5016 MODE_HIGH_NOT_PRECEDENCE |
5017 #endif
5018 #ifdef SPIDER_SQL_MODE_NO_ENGINE_SUBSTITUTION
5019 MODE_NO_ENGINE_SUBSTITUTION |
5020 #endif
5021 #ifdef SPIDER_SQL_MODE_PAD_CHAR_TO_FULL_LENGTH
5022 MODE_PAD_CHAR_TO_FULL_LENGTH |
5023 #endif
5024 #ifdef SPIDER_SQL_MODE_EMPTY_STRING_IS_NULL
5025 MODE_EMPTY_STRING_IS_NULL |
5026 #endif
5027 #ifdef SPIDER_SQL_MODE_SIMULTANEOUS_ASSIGNMENT
5028 MODE_SIMULTANEOUS_ASSIGNMENT |
5029 #endif
5030 #ifdef SPIDER_SQL_MODE_TIME_ROUND_FRACTIONAL
5031 MODE_TIME_ROUND_FRACTIONAL |
5032 #endif
5033 0;
5034
append_sql_mode_internal(spider_string * str,sql_mode_t sql_mode)5035 int spider_db_mbase_util::append_sql_mode_internal(
5036 spider_string *str,
5037 sql_mode_t sql_mode
5038 ) {
5039 DBUG_ENTER("spider_db_mbase_util::append_sql_mode_internal");
5040 DBUG_PRINT("info",("spider this=%p", this));
5041 #ifdef SPIDER_SQL_MODE_REAL_AS_FLOAT
5042 if (sql_mode & MODE_REAL_AS_FLOAT)
5043 {
5044 if (str->reserve(SPIDER_REAL_AS_FLOAT_LEN + SPIDER_SQL_COMMA_LEN))
5045 {
5046 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5047 }
5048 str->q_append(SPIDER_REAL_AS_FLOAT_STR, SPIDER_REAL_AS_FLOAT_LEN);
5049 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5050 }
5051 #endif
5052 #ifdef SPIDER_SQL_MODE_PIPES_AS_CONCAT
5053 if (sql_mode & MODE_PIPES_AS_CONCAT)
5054 {
5055 if (str->reserve(SPIDER_PIPES_AS_CONCAT_LEN + SPIDER_SQL_COMMA_LEN))
5056 {
5057 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5058 }
5059 str->q_append(SPIDER_PIPES_AS_CONCAT_STR, SPIDER_PIPES_AS_CONCAT_LEN);
5060 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5061 }
5062 #endif
5063 #ifdef SPIDER_SQL_MODE_ANSI_QUOTES
5064 if (sql_mode & MODE_ANSI_QUOTES)
5065 {
5066 if (str->reserve(SPIDER_ANSI_QUOTES_LEN + SPIDER_SQL_COMMA_LEN))
5067 {
5068 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5069 }
5070 str->q_append(SPIDER_ANSI_QUOTES_STR, SPIDER_ANSI_QUOTES_LEN);
5071 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5072 }
5073 #endif
5074 #ifdef SPIDER_SQL_MODE_IGNORE_SPACE
5075 if (sql_mode & MODE_IGNORE_SPACE)
5076 {
5077 if (str->reserve(SPIDER_IGNORE_SPACE_LEN + SPIDER_SQL_COMMA_LEN))
5078 {
5079 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5080 }
5081 str->q_append(SPIDER_IGNORE_SPACE_STR, SPIDER_IGNORE_SPACE_LEN);
5082 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5083 }
5084 #endif
5085 #ifdef SPIDER_SQL_MODE_IGNORE_BAD_TABLE_OPTIONS
5086 if (sql_mode & MODE_IGNORE_BAD_TABLE_OPTIONS)
5087 {
5088 if (str->reserve(SPIDER_IGNORE_BAD_TABLE_OPTIONS_LEN + SPIDER_SQL_COMMA_LEN))
5089 {
5090 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5091 }
5092 str->q_append(SPIDER_IGNORE_BAD_TABLE_OPTIONS_STR, SPIDER_IGNORE_BAD_TABLE_OPTIONS_LEN);
5093 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5094 }
5095 #endif
5096 #ifdef SPIDER_SQL_MODE_ONLY_FULL_GROUP_BY
5097 if (sql_mode & MODE_ONLY_FULL_GROUP_BY)
5098 {
5099 if (str->reserve(SPIDER_ONLY_FULL_GROUP_BY_LEN + SPIDER_SQL_COMMA_LEN))
5100 {
5101 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5102 }
5103 str->q_append(SPIDER_ONLY_FULL_GROUP_BY_STR, SPIDER_ONLY_FULL_GROUP_BY_LEN);
5104 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5105 }
5106 #endif
5107 #ifdef SPIDER_SQL_MODE_NO_UNSIGNED_SUBTRACTION
5108 if (sql_mode & MODE_NO_UNSIGNED_SUBTRACTION)
5109 {
5110 if (str->reserve(SPIDER_NO_UNSIGNED_SUBTRACTION_LEN + SPIDER_SQL_COMMA_LEN))
5111 {
5112 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5113 }
5114 str->q_append(SPIDER_NO_UNSIGNED_SUBTRACTION_STR, SPIDER_NO_UNSIGNED_SUBTRACTION_LEN);
5115 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5116 }
5117 #endif
5118 #ifdef SPIDER_SQL_MODE_NO_DIR_IN_CREATE
5119 if (sql_mode & MODE_NO_DIR_IN_CREATE)
5120 {
5121 if (str->reserve(SPIDER_NO_DIR_IN_CREATE_LEN + SPIDER_SQL_COMMA_LEN))
5122 {
5123 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5124 }
5125 str->q_append(SPIDER_NO_DIR_IN_CREATE_STR, SPIDER_NO_DIR_IN_CREATE_LEN);
5126 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5127 }
5128 #endif
5129 #ifdef SPIDER_SQL_MODE_POSTGRESQL
5130 if (sql_mode & MODE_POSTGRESQL)
5131 {
5132 if (str->reserve(SPIDER_POSTGRESQL_LEN + SPIDER_SQL_COMMA_LEN))
5133 {
5134 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5135 }
5136 str->q_append(SPIDER_POSTGRESQL_STR, SPIDER_POSTGRESQL_LEN);
5137 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5138 }
5139 #endif
5140 #ifdef SPIDER_SQL_MODE_ORACLE
5141 if (sql_mode & MODE_ORACLE)
5142 {
5143 if (str->reserve(SPIDER_ORACLE_LEN + SPIDER_SQL_COMMA_LEN))
5144 {
5145 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5146 }
5147 str->q_append(SPIDER_ORACLE_STR, SPIDER_ORACLE_LEN);
5148 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5149 }
5150 #endif
5151 #ifdef SPIDER_SQL_MODE_MSSQL
5152 if (sql_mode & MODE_MSSQL)
5153 {
5154 if (str->reserve(SPIDER_MSSQL_LEN + SPIDER_SQL_COMMA_LEN))
5155 {
5156 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5157 }
5158 str->q_append(SPIDER_MSSQL_STR, SPIDER_MSSQL_LEN);
5159 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5160 }
5161 #endif
5162 #ifdef SPIDER_SQL_MODE_DB2
5163 if (sql_mode & MODE_DB2)
5164 {
5165 if (str->reserve(SPIDER_DB2_LEN + SPIDER_SQL_COMMA_LEN))
5166 {
5167 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5168 }
5169 str->q_append(SPIDER_DB2_STR, SPIDER_DB2_LEN);
5170 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5171 }
5172 #endif
5173 #ifdef SPIDER_SQL_MODE_MAXDB
5174 if (sql_mode & MODE_MAXDB)
5175 {
5176 if (str->reserve(SPIDER_MAXDB_LEN + SPIDER_SQL_COMMA_LEN))
5177 {
5178 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5179 }
5180 str->q_append(SPIDER_MAXDB_STR, SPIDER_MAXDB_LEN);
5181 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5182 }
5183 #endif
5184 #ifdef SPIDER_SQL_MODE_NO_KEY_OPTIONS
5185 if (sql_mode & MODE_NO_KEY_OPTIONS)
5186 {
5187 if (str->reserve(SPIDER_NO_KEY_OPTIONS_LEN + SPIDER_SQL_COMMA_LEN))
5188 {
5189 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5190 }
5191 str->q_append(SPIDER_NO_KEY_OPTIONS_STR, SPIDER_NO_KEY_OPTIONS_LEN);
5192 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5193 }
5194 #endif
5195 #ifdef SPIDER_SQL_MODE_NO_TABLE_OPTIONS
5196 if (sql_mode & MODE_NO_TABLE_OPTIONS)
5197 {
5198 if (str->reserve(SPIDER_NO_TABLE_OPTIONS_LEN + SPIDER_SQL_COMMA_LEN))
5199 {
5200 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5201 }
5202 str->q_append(SPIDER_NO_TABLE_OPTIONS_STR, SPIDER_NO_TABLE_OPTIONS_LEN);
5203 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5204 }
5205 #endif
5206 #ifdef SPIDER_SQL_MODE_NO_FIELD_OPTIONS
5207 if (sql_mode & MODE_NO_FIELD_OPTIONS)
5208 {
5209 if (str->reserve(SPIDER_NO_FIELD_OPTIONS_LEN + SPIDER_SQL_COMMA_LEN))
5210 {
5211 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5212 }
5213 str->q_append(SPIDER_NO_FIELD_OPTIONS_STR, SPIDER_NO_FIELD_OPTIONS_LEN);
5214 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5215 }
5216 #endif
5217 #ifdef SPIDER_SQL_MODE_MYSQL323
5218 if (sql_mode & MODE_MYSQL323)
5219 {
5220 if (str->reserve(SPIDER_MYSQL323_LEN + SPIDER_SQL_COMMA_LEN))
5221 {
5222 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5223 }
5224 str->q_append(SPIDER_MYSQL323_STR, SPIDER_MYSQL323_LEN);
5225 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5226 }
5227 #endif
5228 #ifdef SPIDER_SQL_MODE_MYSQL40
5229 if (sql_mode & MODE_MYSQL40)
5230 {
5231 if (str->reserve(SPIDER_MYSQL40_LEN + SPIDER_SQL_COMMA_LEN))
5232 {
5233 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5234 }
5235 str->q_append(SPIDER_MYSQL40_STR, SPIDER_MYSQL40_LEN);
5236 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5237 }
5238 #endif
5239 #ifdef SPIDER_SQL_MODE_ANSI
5240 if (sql_mode & MODE_ANSI)
5241 {
5242 if (str->reserve(SPIDER_ANSI_LEN + SPIDER_SQL_COMMA_LEN))
5243 {
5244 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5245 }
5246 str->q_append(SPIDER_ANSI_STR, SPIDER_ANSI_LEN);
5247 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5248 }
5249 #endif
5250 #ifdef SPIDER_SQL_MODE_NO_AUTO_VALUE_ON_ZERO
5251 if (sql_mode & MODE_NO_AUTO_VALUE_ON_ZERO)
5252 {
5253 if (str->reserve(SPIDER_NO_AUTO_VALUE_ON_ZERO_LEN + SPIDER_SQL_COMMA_LEN))
5254 {
5255 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5256 }
5257 str->q_append(SPIDER_NO_AUTO_VALUE_ON_ZERO_STR, SPIDER_NO_AUTO_VALUE_ON_ZERO_LEN);
5258 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5259 }
5260 #endif
5261 #ifdef SPIDER_SQL_MODE_NO_BACKSLASH_ESCAPES
5262 if (sql_mode & MODE_NO_BACKSLASH_ESCAPES)
5263 {
5264 if (str->reserve(SPIDER_NO_BACKSLASH_ESCAPES_LEN + SPIDER_SQL_COMMA_LEN))
5265 {
5266 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5267 }
5268 str->q_append(SPIDER_NO_BACKSLASH_ESCAPES_STR, SPIDER_NO_BACKSLASH_ESCAPES_LEN);
5269 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5270 }
5271 #endif
5272 #ifdef SPIDER_SQL_MODE_STRICT_TRANS_TABLES
5273 if (sql_mode & MODE_STRICT_TRANS_TABLES)
5274 {
5275 if (str->reserve(SPIDER_STRICT_TRANS_TABLES_LEN + SPIDER_SQL_COMMA_LEN))
5276 {
5277 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5278 }
5279 str->q_append(SPIDER_STRICT_TRANS_TABLES_STR, SPIDER_STRICT_TRANS_TABLES_LEN);
5280 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5281 }
5282 #endif
5283 #ifdef SPIDER_SQL_MODE_STRICT_ALL_TABLES
5284 if (sql_mode & MODE_STRICT_ALL_TABLES)
5285 {
5286 if (str->reserve(SPIDER_STRICT_ALL_TABLES_LEN + SPIDER_SQL_COMMA_LEN))
5287 {
5288 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5289 }
5290 str->q_append(SPIDER_STRICT_ALL_TABLES_STR, SPIDER_STRICT_ALL_TABLES_LEN);
5291 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5292 }
5293 #endif
5294 #ifdef SPIDER_SQL_MODE_NO_ZERO_IN_DATE
5295 if (sql_mode & MODE_NO_ZERO_IN_DATE)
5296 {
5297 if (str->reserve(SPIDER_NO_ZERO_IN_DATE_LEN + SPIDER_SQL_COMMA_LEN))
5298 {
5299 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5300 }
5301 str->q_append(SPIDER_NO_ZERO_IN_DATE_STR, SPIDER_NO_ZERO_IN_DATE_LEN);
5302 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5303 }
5304 #endif
5305 #ifdef SPIDER_SQL_MODE_NO_ZERO_DATE
5306 if (sql_mode & MODE_NO_ZERO_DATE)
5307 {
5308 if (str->reserve(SPIDER_NO_ZERO_DATE_LEN + SPIDER_SQL_COMMA_LEN))
5309 {
5310 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5311 }
5312 str->q_append(SPIDER_NO_ZERO_DATE_STR, SPIDER_NO_ZERO_DATE_LEN);
5313 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5314 }
5315 #endif
5316 #ifdef SPIDER_SQL_MODE_INVALID_DATES
5317 if (sql_mode & MODE_INVALID_DATES)
5318 {
5319 if (str->reserve(SPIDER_INVALID_DATES_LEN + SPIDER_SQL_COMMA_LEN))
5320 {
5321 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5322 }
5323 str->q_append(SPIDER_INVALID_DATES_STR, SPIDER_INVALID_DATES_LEN);
5324 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5325 }
5326 #endif
5327 #ifdef SPIDER_SQL_MODE_ERROR_FOR_DIVISION_BY_ZERO
5328 if (sql_mode & MODE_ERROR_FOR_DIVISION_BY_ZERO)
5329 {
5330 if (str->reserve(SPIDER_ERROR_FOR_DIVISION_BY_ZERO_LEN + SPIDER_SQL_COMMA_LEN))
5331 {
5332 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5333 }
5334 str->q_append(SPIDER_ERROR_FOR_DIVISION_BY_ZERO_STR, SPIDER_ERROR_FOR_DIVISION_BY_ZERO_LEN);
5335 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5336 }
5337 #endif
5338 #ifdef SPIDER_SQL_MODE_TRADITIONAL
5339 if (sql_mode & MODE_TRADITIONAL)
5340 {
5341 if (str->reserve(SPIDER_TRADITIONAL_LEN + SPIDER_SQL_COMMA_LEN))
5342 {
5343 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5344 }
5345 str->q_append(SPIDER_TRADITIONAL_STR, SPIDER_TRADITIONAL_LEN);
5346 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5347 }
5348 #endif
5349 #ifdef SPIDER_SQL_MODE_NO_AUTO_CREATE_USER
5350 if (sql_mode & MODE_NO_AUTO_CREATE_USER)
5351 {
5352 if (str->reserve(SPIDER_NO_AUTO_CREATE_USER_LEN + SPIDER_SQL_COMMA_LEN))
5353 {
5354 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5355 }
5356 str->q_append(SPIDER_NO_AUTO_CREATE_USER_STR, SPIDER_NO_AUTO_CREATE_USER_LEN);
5357 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5358 }
5359 #endif
5360 #ifdef SPIDER_SQL_MODE_HIGH_NOT_PRECEDENCE
5361 if (sql_mode & MODE_HIGH_NOT_PRECEDENCE)
5362 {
5363 if (str->reserve(SPIDER_HIGH_NOT_PRECEDENCE_LEN + SPIDER_SQL_COMMA_LEN))
5364 {
5365 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5366 }
5367 str->q_append(SPIDER_HIGH_NOT_PRECEDENCE_STR, SPIDER_HIGH_NOT_PRECEDENCE_LEN);
5368 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5369 }
5370 #endif
5371 #ifdef SPIDER_SQL_MODE_NO_ENGINE_SUBSTITUTION
5372 if (sql_mode & MODE_NO_ENGINE_SUBSTITUTION)
5373 {
5374 if (str->reserve(SPIDER_NO_ENGINE_SUBSTITUTION_LEN + SPIDER_SQL_COMMA_LEN))
5375 {
5376 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5377 }
5378 str->q_append(SPIDER_NO_ENGINE_SUBSTITUTION_STR, SPIDER_NO_ENGINE_SUBSTITUTION_LEN);
5379 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5380 }
5381 #endif
5382 #ifdef SPIDER_SQL_MODE_PAD_CHAR_TO_FULL_LENGTH
5383 if (sql_mode & MODE_PAD_CHAR_TO_FULL_LENGTH)
5384 {
5385 if (str->reserve(SPIDER_PAD_CHAR_TO_FULL_LENGTH_LEN + SPIDER_SQL_COMMA_LEN))
5386 {
5387 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5388 }
5389 str->q_append(SPIDER_PAD_CHAR_TO_FULL_LENGTH_STR, SPIDER_PAD_CHAR_TO_FULL_LENGTH_LEN);
5390 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5391 }
5392 #endif
5393 DBUG_RETURN(0);
5394 }
5395
append_sql_mode_internal(spider_string * str,sql_mode_t sql_mode)5396 int spider_db_mariadb_util::append_sql_mode_internal(
5397 spider_string *str,
5398 sql_mode_t sql_mode
5399 ) {
5400 int error_num;
5401 DBUG_ENTER("spider_db_mbase_util::append_sql_mode_internal");
5402 DBUG_PRINT("info",("spider this=%p", this));
5403 if ((error_num = spider_db_mbase_util::append_sql_mode_internal(
5404 str, sql_mode)))
5405 {
5406 DBUG_RETURN(error_num);
5407 }
5408 #ifdef SPIDER_SQL_MODE_EMPTY_STRING_IS_NULL
5409 if (sql_mode & MODE_EMPTY_STRING_IS_NULL)
5410 {
5411 if (str->reserve(SPIDER_EMPTY_STRING_IS_NULL_LEN + SPIDER_SQL_COMMA_LEN))
5412 {
5413 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5414 }
5415 str->q_append(SPIDER_EMPTY_STRING_IS_NULL_STR, SPIDER_EMPTY_STRING_IS_NULL_LEN);
5416 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5417 }
5418 #endif
5419 #ifdef SPIDER_SQL_MODE_SIMULTANEOUS_ASSIGNMENT
5420 if (sql_mode & MODE_SIMULTANEOUS_ASSIGNMENT)
5421 {
5422 if (str->reserve(SPIDER_SIMULTANEOUS_ASSIGNMENT_LEN + SPIDER_SQL_COMMA_LEN))
5423 {
5424 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5425 }
5426 str->q_append(SPIDER_SIMULTANEOUS_ASSIGNMENT_STR, SPIDER_SIMULTANEOUS_ASSIGNMENT_LEN);
5427 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5428 }
5429 #endif
5430 #ifdef SPIDER_SQL_MODE_TIME_ROUND_FRACTIONAL
5431 if (sql_mode & MODE_TIME_ROUND_FRACTIONAL)
5432 {
5433 if (str->reserve(SPIDER_TIME_ROUND_FRACTIONAL_LEN + SPIDER_SQL_COMMA_LEN))
5434 {
5435 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5436 }
5437 str->q_append(SPIDER_TIME_ROUND_FRACTIONAL_STR, SPIDER_TIME_ROUND_FRACTIONAL_LEN);
5438 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
5439 }
5440 #endif
5441 DBUG_RETURN(0);
5442 }
5443
append_sql_mode(spider_string * str,sql_mode_t sql_mode)5444 int spider_db_mbase_util::append_sql_mode(
5445 spider_string *str,
5446 sql_mode_t sql_mode
5447 ) {
5448 int error_num;
5449 uint length;
5450 DBUG_ENTER("spider_db_mbase_util::append_sql_mode");
5451 DBUG_PRINT("info",("spider this=%p", this));
5452 if (str->reserve(SPIDER_SQL_SEMICOLON_LEN + SPIDER_SQL_SQL_MODE_LEN))
5453 {
5454 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5455 }
5456 if (str->length())
5457 {
5458 str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
5459 }
5460 str->q_append(SPIDER_SQL_SQL_MODE_STR, SPIDER_SQL_SQL_MODE_LEN);
5461 length = str->length();
5462 if ((error_num = append_sql_mode_internal(str, sql_mode)))
5463 {
5464 DBUG_RETURN(error_num);
5465 }
5466 if (str->length() > length)
5467 {
5468 str->length(str->length() - SPIDER_SQL_COMMA_LEN);
5469 } else {
5470 if (str->reserve(SPIDER_SQL_VALUE_QUOTE_LEN))
5471 {
5472 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5473 }
5474 }
5475 str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
5476 DBUG_RETURN(0);
5477 }
5478
append_time_zone(spider_string * str,Time_zone * time_zone)5479 int spider_db_mbase_util::append_time_zone(
5480 spider_string *str,
5481 Time_zone *time_zone
5482 ) {
5483 const String *tz_str = time_zone->get_name();
5484 DBUG_ENTER("spider_db_mbase_util::append_time_zone");
5485 DBUG_PRINT("info",("spider this=%p", this));
5486 if (str->reserve(SPIDER_SQL_SEMICOLON_LEN + SPIDER_SQL_TIME_ZONE_LEN +
5487 tz_str->length() + SPIDER_SQL_VALUE_QUOTE_LEN))
5488 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5489 if (str->length())
5490 str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
5491 str->q_append(SPIDER_SQL_TIME_ZONE_STR, SPIDER_SQL_TIME_ZONE_LEN);
5492 str->q_append(tz_str->ptr(), tz_str->length());
5493 str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
5494 DBUG_RETURN(0);
5495 }
5496
append_start_transaction(spider_string * str)5497 int spider_db_mbase_util::append_start_transaction(
5498 spider_string *str
5499 ) {
5500 DBUG_ENTER("spider_db_mbase_util::append_start_transaction");
5501 DBUG_PRINT("info",("spider this=%p", this));
5502 if (str->reserve(SPIDER_SQL_SEMICOLON_LEN +
5503 SPIDER_SQL_START_TRANSACTION_LEN))
5504 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5505 if (str->length())
5506 {
5507 str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
5508 }
5509 str->q_append(SPIDER_SQL_START_TRANSACTION_STR,
5510 SPIDER_SQL_START_TRANSACTION_LEN);
5511 DBUG_RETURN(0);
5512 }
5513
append_xa_start(spider_string * str,XID * xid)5514 int spider_db_mbase_util::append_xa_start(
5515 spider_string *str,
5516 XID *xid
5517 ) {
5518 DBUG_ENTER("spider_db_mbase_util::append_xa_start");
5519 DBUG_PRINT("info",("spider this=%p", this));
5520 if (str->reserve(SPIDER_SQL_SEMICOLON_LEN +
5521 SPIDER_SQL_XA_START_LEN + XIDDATASIZE + sizeof(long) + 9))
5522 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5523 if (str->length())
5524 {
5525 str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
5526 }
5527 str->q_append(SPIDER_SQL_XA_START_STR, SPIDER_SQL_XA_START_LEN);
5528 spider_db_append_xid_str(str, xid);
5529 DBUG_RETURN(0);
5530 }
5531
append_lock_table_head(spider_string * str)5532 int spider_db_mbase_util::append_lock_table_head(
5533 spider_string *str
5534 ) {
5535 DBUG_ENTER("spider_db_mbase_util::append_lock_table_head");
5536 DBUG_PRINT("info",("spider this=%p", this));
5537 if (str->reserve(SPIDER_SQL_LOCK_TABLE_LEN))
5538 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5539 str->q_append(SPIDER_SQL_LOCK_TABLE_STR, SPIDER_SQL_LOCK_TABLE_LEN);
5540 DBUG_RETURN(0);
5541 }
5542
append_lock_table_body(spider_string * str,const char * db_name,uint db_name_length,CHARSET_INFO * db_name_charset,const char * table_name,uint table_name_length,CHARSET_INFO * table_name_charset,int lock_type)5543 int spider_db_mbase_util::append_lock_table_body(
5544 spider_string *str,
5545 const char *db_name,
5546 uint db_name_length,
5547 CHARSET_INFO *db_name_charset,
5548 const char *table_name,
5549 uint table_name_length,
5550 CHARSET_INFO *table_name_charset,
5551 int lock_type
5552 ) {
5553 DBUG_ENTER("spider_db_mbase_util::append_lock_table_body");
5554 DBUG_PRINT("info",("spider this=%p", this));
5555 if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN))
5556 {
5557 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5558 }
5559 str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
5560 if (
5561 str->append(db_name, db_name_length, db_name_charset) ||
5562 str->reserve((SPIDER_SQL_NAME_QUOTE_LEN) * 2 + SPIDER_SQL_DOT_LEN)
5563 ) {
5564 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5565 }
5566 str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
5567 str->q_append(SPIDER_SQL_DOT_STR, SPIDER_SQL_DOT_LEN);
5568 str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
5569 if (
5570 str->append(table_name, table_name_length, table_name_charset) ||
5571 str->reserve(SPIDER_SQL_NAME_QUOTE_LEN +
5572 spider_db_table_lock_len[lock_type])
5573 ) {
5574 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5575 }
5576 str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
5577 str->q_append(spider_db_table_lock_str[lock_type],
5578 spider_db_table_lock_len[lock_type]);
5579 DBUG_RETURN(0);
5580 }
5581
append_lock_table_tail(spider_string * str)5582 int spider_db_mbase_util::append_lock_table_tail(
5583 spider_string *str
5584 ) {
5585 DBUG_ENTER("spider_db_mbase_util::append_lock_table_tail");
5586 DBUG_PRINT("info",("spider this=%p", this));
5587 str->length(str->length() - SPIDER_SQL_COMMA_LEN);
5588 DBUG_RETURN(0);
5589 }
5590
append_unlock_table(spider_string * str)5591 int spider_db_mbase_util::append_unlock_table(
5592 spider_string *str
5593 ) {
5594 DBUG_ENTER("spider_db_mbase_util::append_unlock_table");
5595 DBUG_PRINT("info",("spider this=%p", this));
5596 if (str->reserve(SPIDER_SQL_UNLOCK_TABLE_LEN))
5597 {
5598 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5599 }
5600 str->q_append(SPIDER_SQL_UNLOCK_TABLE_STR, SPIDER_SQL_UNLOCK_TABLE_LEN);
5601 DBUG_RETURN(0);
5602 }
5603
open_item_func(Item_func * item_func,ha_spider * spider,spider_string * str,const char * alias,uint alias_length,bool use_fields,spider_fields * fields)5604 int spider_db_mbase_util::open_item_func(
5605 Item_func *item_func,
5606 ha_spider *spider,
5607 spider_string *str,
5608 const char *alias,
5609 uint alias_length,
5610 bool use_fields,
5611 spider_fields *fields
5612 ) {
5613 int error_num;
5614 Item *item, **item_list = item_func->arguments();
5615 Field *field;
5616 uint roop_count, item_count = item_func->argument_count(), start_item = 0;
5617 const char *func_name = SPIDER_SQL_NULL_CHAR_STR,
5618 *separator_str = SPIDER_SQL_NULL_CHAR_STR,
5619 *last_str = SPIDER_SQL_NULL_CHAR_STR;
5620 int func_name_length = SPIDER_SQL_NULL_CHAR_LEN,
5621 separator_str_length = SPIDER_SQL_NULL_CHAR_LEN,
5622 last_str_length = SPIDER_SQL_NULL_CHAR_LEN;
5623 int use_pushdown_udf;
5624 bool merge_func = FALSE;
5625 DBUG_ENTER("spider_db_mbase_util::open_item_func");
5626 if (str)
5627 {
5628 if (str->reserve(SPIDER_SQL_OPEN_PAREN_LEN))
5629 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5630 str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
5631 }
5632 DBUG_PRINT("info",("spider functype = %d", item_func->functype()));
5633 switch (item_func->functype())
5634 {
5635 case Item_func::ISNULL_FUNC:
5636 last_str = SPIDER_SQL_IS_NULL_STR;
5637 last_str_length = SPIDER_SQL_IS_NULL_LEN;
5638 break;
5639 case Item_func::ISNOTNULL_FUNC:
5640 last_str = SPIDER_SQL_IS_NOT_NULL_STR;
5641 last_str_length = SPIDER_SQL_IS_NOT_NULL_LEN;
5642 break;
5643 case Item_func::UNKNOWN_FUNC:
5644 func_name = (char*) item_func->func_name();
5645 func_name_length = strlen(func_name);
5646 DBUG_PRINT("info",("spider func_name = %s", func_name));
5647 DBUG_PRINT("info",("spider func_name_length = %d", func_name_length));
5648 if (func_name_length == 1 &&
5649 (
5650 !strncasecmp("+", func_name, func_name_length) ||
5651 !strncasecmp("-", func_name, func_name_length) ||
5652 !strncasecmp("*", func_name, func_name_length) ||
5653 !strncasecmp("/", func_name, func_name_length) ||
5654 !strncasecmp("%", func_name, func_name_length) ||
5655 !strncasecmp("&", func_name, func_name_length) ||
5656 !strncasecmp("|", func_name, func_name_length) ||
5657 !strncasecmp("^", func_name, func_name_length)
5658 )
5659 ) {
5660 /* no action */
5661 break;
5662 } else if (func_name_length == 2 &&
5663 (
5664 !strncasecmp("<<", func_name, func_name_length) ||
5665 !strncasecmp(">>", func_name, func_name_length)
5666 )
5667 ) {
5668 /* no action */
5669 break;
5670 } else if (func_name_length == 3 &&
5671 !strncasecmp("div", func_name, func_name_length)
5672 ) {
5673 /* no action */
5674 break;
5675 } else if (func_name_length == 4)
5676 {
5677 if (
5678 !strncasecmp("rand", func_name, func_name_length) &&
5679 #ifdef SPIDER_Item_args_arg_count_IS_PROTECTED
5680 !item_func->argument_count()
5681 #else
5682 !item_func->arg_count
5683 #endif
5684 ) {
5685 if (str)
5686 str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
5687 DBUG_RETURN(spider_db_open_item_int(item_func, NULL, spider, str,
5688 alias, alias_length, dbton_id, use_fields, fields));
5689 } else if (
5690 !strncasecmp("trim", func_name, func_name_length) &&
5691 item_count == 2
5692 ) {
5693 /* item_count == 1 means this TRIM() is without a remove_str */
5694 item = item_list[0];
5695 Item *item_tmp = item_list[1];
5696 if (str)
5697 {
5698 if (item_tmp->is_of_type(Item::CONST_ITEM, STRING_RESULT))
5699 {
5700 /* 1. append 'TRIM(BOTH ' */
5701 if (str->reserve(SPIDER_SQL_TRIM_LEN + SPIDER_SQL_OPEN_PAREN_LEN +
5702 SPIDER_SQL_TRIM_BOTH_LEN))
5703 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5704 str->q_append(SPIDER_SQL_TRIM_STR, SPIDER_SQL_TRIM_LEN);
5705 str->q_append(SPIDER_SQL_OPEN_PAREN_STR,
5706 SPIDER_SQL_OPEN_PAREN_LEN);
5707 str->q_append(SPIDER_SQL_TRIM_BOTH_STR, SPIDER_SQL_TRIM_BOTH_LEN);
5708 /* 2. append "remove_str"*/
5709 if ((error_num = spider_db_print_item_type(
5710 item_tmp, NULL, spider, str, alias, alias_length, dbton_id,
5711 use_fields, fields)))
5712 DBUG_RETURN(error_num);
5713 /* 3. append ' FROM ' */
5714 if (str->reserve(SPIDER_SQL_FROM_LEN))
5715 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5716 str->q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN);
5717 /* 4. append `field` */
5718 if ((error_num = spider_db_print_item_type(
5719 item, NULL, spider, str, alias, alias_length, dbton_id,
5720 use_fields, fields)))
5721 DBUG_RETURN(error_num);
5722 /* 5. append ')' */
5723 if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN))
5724 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5725 str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,
5726 SPIDER_SQL_CLOSE_PAREN_LEN);
5727 }
5728 }
5729 item_count -= 2;
5730 break;
5731 }
5732 } else if (func_name_length == 5)
5733 {
5734 if (
5735 (!strncasecmp("ltrim", func_name, func_name_length) ||
5736 !strncasecmp("rtrim", func_name, func_name_length)) &&
5737 (item_count == 2)
5738 ) {
5739 /* the func_name for TRIM(LEADING ...) is LTRIM, for TRIM(TRAILING) is RTRIM */
5740 /* item_count == 2 means this TRIM(LEADING/TRAILING ...) is with a remove_str */
5741 item = item_list[0];
5742 Item *item_tmp = item_list[1];
5743 if (str)
5744 {
5745 if (item_tmp->is_of_type(Item::CONST_ITEM, STRING_RESULT))
5746 {
5747 /* 1. append 'TRIM(LEADING ' or 'TRIM(TRAILING ' */
5748 if (func_name[0] == 'l' || func_name[0] == 'L')
5749 { /* ltrim */
5750 if (str->reserve(SPIDER_SQL_TRIM_LEN + SPIDER_SQL_OPEN_PAREN_LEN +
5751 SPIDER_SQL_TRIM_LEADING_LEN))
5752 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5753 str->q_append(SPIDER_SQL_TRIM_STR, SPIDER_SQL_TRIM_LEN);
5754 str->q_append(SPIDER_SQL_OPEN_PAREN_STR,
5755 SPIDER_SQL_OPEN_PAREN_LEN);
5756 str->q_append(SPIDER_SQL_TRIM_LEADING_STR, SPIDER_SQL_TRIM_LEADING_LEN);
5757 } else
5758 { /* rtrim */
5759 if (str->reserve(SPIDER_SQL_TRIM_LEN + SPIDER_SQL_OPEN_PAREN_LEN +
5760 SPIDER_SQL_TRIM_TRAILING_LEN))
5761 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5762 str->q_append(SPIDER_SQL_TRIM_STR, SPIDER_SQL_TRIM_LEN);
5763 str->q_append(SPIDER_SQL_OPEN_PAREN_STR,
5764 SPIDER_SQL_OPEN_PAREN_LEN);
5765 str->q_append(SPIDER_SQL_TRIM_TRAILING_STR, SPIDER_SQL_TRIM_TRAILING_LEN);
5766 }
5767 /* 2. append "remove_str"*/
5768 if ((error_num = spider_db_print_item_type(
5769 item_tmp, NULL, spider, str, alias, alias_length, dbton_id,
5770 use_fields, fields)))
5771 DBUG_RETURN(error_num);
5772 /* 3. append ' FROM ' */
5773 if (str->reserve(SPIDER_SQL_FROM_LEN))
5774 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5775 str->q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN);
5776 /* 4. append `field` */
5777 if ((error_num = spider_db_print_item_type(
5778 item, NULL, spider, str, alias, alias_length, dbton_id,
5779 use_fields, fields)))
5780 DBUG_RETURN(error_num);
5781 /* 5. append ')' */
5782 if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN))
5783 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5784 str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,
5785 SPIDER_SQL_CLOSE_PAREN_LEN);
5786 }
5787 }
5788 item_count -= 2;
5789 break;
5790 }
5791 } else if (func_name_length == 6 &&
5792 !strncasecmp("istrue", func_name, func_name_length)
5793 ) {
5794 last_str = SPIDER_SQL_IS_TRUE_STR;
5795 last_str_length = SPIDER_SQL_IS_TRUE_LEN;
5796 break;
5797 } else if (func_name_length == 7)
5798 {
5799 if (!strncasecmp("isfalse", func_name, func_name_length))
5800 {
5801 last_str = SPIDER_SQL_IS_FALSE_STR;
5802 last_str_length = SPIDER_SQL_IS_FALSE_LEN;
5803 break;
5804 } else if (
5805 !strncasecmp("sysdate", func_name, func_name_length) ||
5806 !strncasecmp("curdate", func_name, func_name_length) ||
5807 !strncasecmp("curtime", func_name, func_name_length)
5808 ) {
5809 if (str)
5810 str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
5811 DBUG_RETURN(spider_db_open_item_string(item_func, NULL, spider, str,
5812 alias, alias_length, dbton_id, use_fields, fields));
5813 } else if (
5814 !strncasecmp("convert", func_name, func_name_length)
5815 ) {
5816 if (str)
5817 {
5818 if (str->reserve(func_name_length * 2 + SPIDER_SQL_OPEN_PAREN_LEN))
5819 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5820 str->q_append(func_name, func_name_length);
5821 str->q_append(SPIDER_SQL_OPEN_PAREN_STR,
5822 SPIDER_SQL_OPEN_PAREN_LEN);
5823 last_str = SPIDER_SQL_CLOSE_PAREN_STR;
5824 last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
5825 }
5826 break;
5827 }
5828 } else if (func_name_length == 8 &&
5829 (
5830 !strncasecmp("utc_date", func_name, func_name_length) ||
5831 !strncasecmp("utc_time", func_name, func_name_length)
5832 )
5833 ) {
5834 if (str)
5835 str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
5836 DBUG_RETURN(spider_db_open_item_string(item_func, NULL, spider, str,
5837 alias, alias_length, dbton_id, use_fields, fields));
5838 } else if (func_name_length == 9 &&
5839 !strncasecmp("isnottrue", func_name, func_name_length)
5840 ) {
5841 last_str = SPIDER_SQL_IS_NOT_TRUE_STR;
5842 last_str_length = SPIDER_SQL_IS_NOT_TRUE_LEN;
5843 break;
5844 } else if (func_name_length == 10)
5845 {
5846 if (!strncasecmp("isnotfalse", func_name, func_name_length))
5847 {
5848 last_str = SPIDER_SQL_IS_NOT_FALSE_STR;
5849 last_str_length = SPIDER_SQL_IS_NOT_FALSE_LEN;
5850 break;
5851 } else if (!strncasecmp("column_get", func_name, func_name_length))
5852 {
5853 if (str)
5854 {
5855 str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
5856 if (str->reserve(func_name_length + SPIDER_SQL_OPEN_PAREN_LEN))
5857 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5858 str->q_append(func_name, func_name_length);
5859 str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
5860 }
5861 func_name = SPIDER_SQL_COMMA_STR;
5862 func_name_length = SPIDER_SQL_COMMA_LEN;
5863 separator_str = SPIDER_SQL_COMMA_STR;
5864 separator_str_length = SPIDER_SQL_COMMA_LEN;
5865 break;
5866 }
5867 } else if (func_name_length == 12)
5868 {
5869 if (!strncasecmp("cast_as_date", func_name, func_name_length))
5870 {
5871 item = item_list[0];
5872 if (item->type() == Item::FUNC_ITEM)
5873 {
5874 DBUG_PRINT("info",("spider child is FUNC_ITEM"));
5875 Item_func *ifunc = (Item_func *) item;
5876 if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
5877 {
5878 const char *child_func_name;
5879 int child_func_name_length;
5880 DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
5881 child_func_name = (char*) ifunc->func_name();
5882 child_func_name_length = strlen(child_func_name);
5883 DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
5884 if (
5885 child_func_name_length == 10 &&
5886 !strncasecmp("column_get", child_func_name, child_func_name_length)
5887 ) {
5888 DBUG_PRINT("info",("spider this is merge func"));
5889 merge_func = TRUE;
5890 }
5891 }
5892 }
5893
5894 if (str)
5895 {
5896 str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
5897 if (!merge_func)
5898 {
5899 if (str->reserve(SPIDER_SQL_CAST_LEN))
5900 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5901 str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
5902 }
5903 }
5904 last_str = SPIDER_SQL_AS_DATE_STR;
5905 last_str_length = SPIDER_SQL_AS_DATE_LEN;
5906 break;
5907 } else if (!strncasecmp("cast_as_time", func_name, func_name_length))
5908 {
5909 item = item_list[0];
5910 if (item->type() == Item::FUNC_ITEM)
5911 {
5912 DBUG_PRINT("info",("spider child is FUNC_ITEM"));
5913 Item_func *ifunc = (Item_func *) item;
5914 if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
5915 {
5916 const char *child_func_name;
5917 int child_func_name_length;
5918 DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
5919 child_func_name = (char*) ifunc->func_name();
5920 child_func_name_length = strlen(child_func_name);
5921 DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
5922 if (
5923 child_func_name_length == 10 &&
5924 !strncasecmp("column_get", child_func_name, child_func_name_length)
5925 ) {
5926 DBUG_PRINT("info",("spider this is merge func"));
5927 merge_func = TRUE;
5928 }
5929 }
5930 }
5931
5932 if (str)
5933 {
5934 str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
5935 if (!merge_func)
5936 {
5937 if (str->reserve(SPIDER_SQL_CAST_LEN))
5938 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
5939 str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
5940 }
5941 }
5942 last_str = SPIDER_SQL_AS_TIME_STR;
5943 last_str_length = SPIDER_SQL_AS_TIME_LEN;
5944 break;
5945 }
5946 } else if (func_name_length == 13)
5947 {
5948 if (!strncasecmp("utc_timestamp", func_name, func_name_length))
5949 {
5950 if (str)
5951 str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
5952 DBUG_RETURN(spider_db_open_item_string(item_func, NULL, spider, str,
5953 alias, alias_length, dbton_id, use_fields, fields));
5954 } else if (!strncasecmp("timestampdiff", func_name, func_name_length))
5955 {
5956 #ifdef ITEM_FUNC_TIMESTAMPDIFF_ARE_PUBLIC
5957 Item_func_timestamp_diff *item_func_timestamp_diff =
5958 (Item_func_timestamp_diff *) item_func;
5959 if (str)
5960 {
5961 const char *interval_str;
5962 uint interval_len;
5963 switch (item_func_timestamp_diff->int_type)
5964 {
5965 case INTERVAL_YEAR:
5966 interval_str = SPIDER_SQL_YEAR_STR;
5967 interval_len = SPIDER_SQL_YEAR_LEN;
5968 break;
5969 case INTERVAL_QUARTER:
5970 interval_str = SPIDER_SQL_QUARTER_STR;
5971 interval_len = SPIDER_SQL_QUARTER_LEN;
5972 break;
5973 case INTERVAL_MONTH:
5974 interval_str = SPIDER_SQL_MONTH_STR;
5975 interval_len = SPIDER_SQL_MONTH_LEN;
5976 break;
5977 case INTERVAL_WEEK:
5978 interval_str = SPIDER_SQL_WEEK_STR;
5979 interval_len = SPIDER_SQL_WEEK_LEN;
5980 break;
5981 case INTERVAL_DAY:
5982 interval_str = SPIDER_SQL_DAY_STR;
5983 interval_len = SPIDER_SQL_DAY_LEN;
5984 break;
5985 case INTERVAL_HOUR:
5986 interval_str = SPIDER_SQL_HOUR_STR;
5987 interval_len = SPIDER_SQL_HOUR_LEN;
5988 break;
5989 case INTERVAL_MINUTE:
5990 interval_str = SPIDER_SQL_MINUTE_STR;
5991 interval_len = SPIDER_SQL_MINUTE_LEN;
5992 break;
5993 case INTERVAL_SECOND:
5994 interval_str = SPIDER_SQL_SECOND_STR;
5995 interval_len = SPIDER_SQL_SECOND_LEN;
5996 break;
5997 case INTERVAL_MICROSECOND:
5998 interval_str = SPIDER_SQL_MICROSECOND_STR;
5999 interval_len = SPIDER_SQL_MICROSECOND_LEN;
6000 break;
6001 default:
6002 interval_str = "";
6003 interval_len = 0;
6004 break;
6005 }
6006 str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
6007 if (str->reserve(func_name_length + SPIDER_SQL_OPEN_PAREN_LEN +
6008 interval_len + SPIDER_SQL_COMMA_LEN))
6009 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6010 str->q_append(func_name, func_name_length);
6011 str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
6012 str->q_append(interval_str, interval_len);
6013 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
6014 }
6015 if ((error_num = spider_db_print_item_type(item_list[0], NULL, spider,
6016 str, alias, alias_length, dbton_id, use_fields, fields)))
6017 DBUG_RETURN(error_num);
6018 if (str)
6019 {
6020 if (str->reserve(SPIDER_SQL_COMMA_LEN))
6021 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6022 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
6023 }
6024 if ((error_num = spider_db_print_item_type(item_list[1], NULL, spider,
6025 str, alias, alias_length, dbton_id, use_fields, fields)))
6026 DBUG_RETURN(error_num);
6027 if (str)
6028 {
6029 if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN))
6030 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6031 str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,
6032 SPIDER_SQL_CLOSE_PAREN_LEN);
6033 }
6034 DBUG_RETURN(0);
6035 #else
6036 DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
6037 #endif
6038 }
6039 } else if (func_name_length == 14)
6040 {
6041 if (!strncasecmp("cast_as_binary", func_name, func_name_length))
6042 {
6043 item = item_list[0];
6044 if (item->type() == Item::FUNC_ITEM)
6045 {
6046 DBUG_PRINT("info",("spider child is FUNC_ITEM"));
6047 Item_func *ifunc = (Item_func *) item;
6048 if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
6049 {
6050 const char *child_func_name;
6051 int child_func_name_length;
6052 DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
6053 child_func_name = (char*) ifunc->func_name();
6054 child_func_name_length = strlen(child_func_name);
6055 DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
6056 if (
6057 child_func_name_length == 10 &&
6058 !strncasecmp("column_get", child_func_name, child_func_name_length)
6059 ) {
6060 DBUG_PRINT("info",("spider this is merge func"));
6061 merge_func = TRUE;
6062 }
6063 }
6064 }
6065
6066 if (str)
6067 {
6068 char tmp_buf[MAX_FIELD_WIDTH], *tmp_ptr, *tmp_ptr2;
6069 spider_string tmp_str(tmp_buf, MAX_FIELD_WIDTH, str->charset());
6070 tmp_str.init_calc_mem(123);
6071 tmp_str.length(0);
6072 str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
6073 if (!merge_func)
6074 {
6075 if (str->reserve(SPIDER_SQL_CAST_LEN))
6076 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6077 str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
6078 }
6079 #if MYSQL_VERSION_ID < 50500
6080 item_func->print(tmp_str.get_str(), QT_IS);
6081 #else
6082 item_func->print(tmp_str.get_str(), QT_TO_SYSTEM_CHARSET);
6083 #endif
6084 tmp_str.mem_calc();
6085 if (tmp_str.reserve(1))
6086 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6087 tmp_ptr = tmp_str.c_ptr_quick();
6088 DBUG_PRINT("info",("spider tmp_ptr = %s", tmp_ptr));
6089 while ((tmp_ptr2 = strstr(tmp_ptr, SPIDER_SQL_AS_BINARY_STR)))
6090 tmp_ptr = tmp_ptr2 + 1;
6091 last_str = tmp_ptr - 1;
6092 last_str_length = strlen(last_str) - SPIDER_SQL_CLOSE_PAREN_LEN;
6093 }
6094 break;
6095 } else if (!strncasecmp("cast_as_signed", func_name, func_name_length))
6096 {
6097 item = item_list[0];
6098 if (item->type() == Item::FUNC_ITEM)
6099 {
6100 DBUG_PRINT("info",("spider child is FUNC_ITEM"));
6101 Item_func *ifunc = (Item_func *) item;
6102 if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
6103 {
6104 const char *child_func_name;
6105 int child_func_name_length;
6106 DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
6107 child_func_name = (char*) ifunc->func_name();
6108 child_func_name_length = strlen(child_func_name);
6109 DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
6110 if (
6111 child_func_name_length == 10 &&
6112 !strncasecmp("column_get", child_func_name, child_func_name_length)
6113 ) {
6114 DBUG_PRINT("info",("spider this is merge func"));
6115 merge_func = TRUE;
6116 }
6117 }
6118 }
6119
6120 if (str)
6121 {
6122 str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
6123 if (!merge_func)
6124 {
6125 if (str->reserve(SPIDER_SQL_CAST_LEN))
6126 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6127 str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
6128 }
6129 }
6130 last_str = SPIDER_SQL_AS_SIGNED_STR;
6131 last_str_length = SPIDER_SQL_AS_SIGNED_LEN;
6132 break;
6133 }
6134 } else if (func_name_length == 16)
6135 {
6136 if (!strncasecmp("cast_as_unsigned", func_name, func_name_length))
6137 {
6138 item = item_list[0];
6139 if (item->type() == Item::FUNC_ITEM)
6140 {
6141 DBUG_PRINT("info",("spider child is FUNC_ITEM"));
6142 Item_func *ifunc = (Item_func *) item;
6143 if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
6144 {
6145 const char *child_func_name;
6146 int child_func_name_length;
6147 DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
6148 child_func_name = (char*) ifunc->func_name();
6149 child_func_name_length = strlen(child_func_name);
6150 DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
6151 if (
6152 child_func_name_length == 10 &&
6153 !strncasecmp("column_get", child_func_name, child_func_name_length)
6154 ) {
6155 DBUG_PRINT("info",("spider this is merge func"));
6156 merge_func = TRUE;
6157 }
6158 }
6159 }
6160
6161 if (str)
6162 {
6163 str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
6164 if (!merge_func)
6165 {
6166 if (str->reserve(SPIDER_SQL_CAST_LEN))
6167 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6168 str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
6169 }
6170 }
6171 last_str = SPIDER_SQL_AS_UNSIGNED_STR;
6172 last_str_length = SPIDER_SQL_AS_UNSIGNED_LEN;
6173 break;
6174 } else if (!strncasecmp("decimal_typecast", func_name,
6175 func_name_length))
6176 {
6177 item = item_list[0];
6178 if (item->type() == Item::FUNC_ITEM)
6179 {
6180 DBUG_PRINT("info",("spider child is FUNC_ITEM"));
6181 Item_func *ifunc = (Item_func *) item;
6182 if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
6183 {
6184 const char *child_func_name;
6185 int child_func_name_length;
6186 DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
6187 child_func_name = (char*) ifunc->func_name();
6188 child_func_name_length = strlen(child_func_name);
6189 DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
6190 if (
6191 child_func_name_length == 10 &&
6192 !strncasecmp("column_get", child_func_name, child_func_name_length)
6193 ) {
6194 DBUG_PRINT("info",("spider this is merge func"));
6195 merge_func = TRUE;
6196 }
6197 }
6198 }
6199
6200 if (str)
6201 {
6202 char tmp_buf[MAX_FIELD_WIDTH], *tmp_ptr, *tmp_ptr2;
6203 spider_string tmp_str(tmp_buf, MAX_FIELD_WIDTH, str->charset());
6204 tmp_str.init_calc_mem(124);
6205 tmp_str.length(0);
6206 str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
6207 if (!merge_func)
6208 {
6209 if (str->reserve(SPIDER_SQL_CAST_LEN))
6210 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6211 str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
6212 }
6213 #if MYSQL_VERSION_ID < 50500
6214 item_func->print(tmp_str.get_str(), QT_IS);
6215 #else
6216 item_func->print(tmp_str.get_str(), QT_TO_SYSTEM_CHARSET);
6217 #endif
6218 tmp_str.mem_calc();
6219 if (tmp_str.reserve(1))
6220 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6221 tmp_ptr = tmp_str.c_ptr_quick();
6222 DBUG_PRINT("info",("spider tmp_ptr = %s", tmp_ptr));
6223 while ((tmp_ptr2 = strstr(tmp_ptr, SPIDER_SQL_AS_DECIMAL_STR)))
6224 tmp_ptr = tmp_ptr2 + 1;
6225 last_str = tmp_ptr - 1;
6226 last_str_length = strlen(last_str) - SPIDER_SQL_CLOSE_PAREN_LEN;
6227 }
6228 break;
6229 } else if (!strncasecmp("cast_as_datetime", func_name,
6230 func_name_length))
6231 {
6232 item = item_list[0];
6233 if (item->type() == Item::FUNC_ITEM)
6234 {
6235 DBUG_PRINT("info",("spider child is FUNC_ITEM"));
6236 Item_func *ifunc = (Item_func *) item;
6237 if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
6238 {
6239 const char *child_func_name;
6240 int child_func_name_length;
6241 DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
6242 child_func_name = (char*) ifunc->func_name();
6243 child_func_name_length = strlen(child_func_name);
6244 DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
6245 if (
6246 child_func_name_length == 10 &&
6247 !strncasecmp("column_get", child_func_name, child_func_name_length)
6248 ) {
6249 DBUG_PRINT("info",("spider this is merge func"));
6250 merge_func = TRUE;
6251 }
6252 }
6253 }
6254
6255 if (str)
6256 {
6257 str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
6258 if (!merge_func)
6259 {
6260 if (str->reserve(SPIDER_SQL_CAST_LEN))
6261 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6262 str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
6263 }
6264 }
6265 last_str = SPIDER_SQL_AS_DATETIME_STR;
6266 last_str_length = SPIDER_SQL_AS_DATETIME_LEN;
6267 break;
6268 }
6269 } else if (func_name_length == 17)
6270 {
6271 if (!strncasecmp("date_add_interval", func_name, func_name_length))
6272 {
6273 Item_date_add_interval *item_date_add_interval =
6274 (Item_date_add_interval *) item_func;
6275 func_name = spider_db_timefunc_interval_str[
6276 item_date_add_interval->int_type];
6277 func_name_length = strlen(func_name);
6278 if ((error_num = spider_db_print_item_type(item_list[0], NULL, spider,
6279 str, alias, alias_length, dbton_id, use_fields, fields)))
6280 DBUG_RETURN(error_num);
6281 if (str)
6282 {
6283 if (item_date_add_interval->date_sub_interval)
6284 {
6285 if (str->reserve(SPIDER_SQL_NEGINTERVAL_LEN))
6286 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6287 str->q_append(SPIDER_SQL_NEGINTERVAL_STR,
6288 SPIDER_SQL_NEGINTERVAL_LEN);
6289 } else {
6290 if (str->reserve(SPIDER_SQL_INTERVAL_LEN))
6291 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6292 str->q_append(SPIDER_SQL_INTERVAL_STR, SPIDER_SQL_INTERVAL_LEN);
6293 }
6294 }
6295 if ((error_num = spider_db_print_item_type(item_list[1], NULL, spider,
6296 str, alias, alias_length, dbton_id, use_fields, fields)))
6297 DBUG_RETURN(error_num);
6298 if (str)
6299 {
6300 if (str->reserve(func_name_length + SPIDER_SQL_CLOSE_PAREN_LEN))
6301 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6302 str->q_append(func_name, func_name_length);
6303 str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,
6304 SPIDER_SQL_CLOSE_PAREN_LEN);
6305 }
6306 DBUG_RETURN(0);
6307 }
6308 }
6309 if (str)
6310 {
6311 if (str->reserve(func_name_length + SPIDER_SQL_OPEN_PAREN_LEN))
6312 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6313 str->q_append(func_name, func_name_length);
6314 str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
6315 }
6316 func_name = SPIDER_SQL_COMMA_STR;
6317 func_name_length = SPIDER_SQL_COMMA_LEN;
6318 separator_str = SPIDER_SQL_COMMA_STR;
6319 separator_str_length = SPIDER_SQL_COMMA_LEN;
6320 last_str = SPIDER_SQL_CLOSE_PAREN_STR;
6321 last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
6322 break;
6323 case Item_func::NOW_FUNC:
6324 if (str)
6325 str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
6326 DBUG_RETURN(spider_db_open_item_string(item_func, NULL, spider,
6327 str, alias, alias_length, dbton_id, use_fields, fields));
6328 case Item_func::CHAR_TYPECAST_FUNC:
6329 DBUG_PRINT("info",("spider CHAR_TYPECAST_FUNC"));
6330 {
6331 item = item_list[0];
6332 if (item->type() == Item::FUNC_ITEM)
6333 {
6334 DBUG_PRINT("info",("spider child is FUNC_ITEM"));
6335 Item_func *ifunc = (Item_func *) item;
6336 if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
6337 {
6338 const char *child_func_name;
6339 int child_func_name_length;
6340 DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
6341 child_func_name = (char*) ifunc->func_name();
6342 child_func_name_length = strlen(child_func_name);
6343 DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
6344 if (
6345 child_func_name_length == 10 &&
6346 !strncasecmp("column_get", child_func_name, child_func_name_length)
6347 ) {
6348 DBUG_PRINT("info",("spider this is merge func"));
6349 merge_func = TRUE;
6350 }
6351 }
6352 }
6353
6354 if (str)
6355 {
6356 char tmp_buf[MAX_FIELD_WIDTH], *tmp_ptr, *tmp_ptr2;
6357 spider_string tmp_str(tmp_buf, MAX_FIELD_WIDTH, str->charset());
6358 tmp_str.init_calc_mem(125);
6359 tmp_str.length(0);
6360 str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
6361 if (!merge_func)
6362 {
6363 if (str->reserve(SPIDER_SQL_CAST_LEN))
6364 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6365 str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
6366 }
6367 #if MYSQL_VERSION_ID < 50500
6368 item_func->print(tmp_str.get_str(), QT_IS);
6369 #else
6370 item_func->print(tmp_str.get_str(), QT_TO_SYSTEM_CHARSET);
6371 #endif
6372 tmp_str.mem_calc();
6373 if (tmp_str.reserve(1))
6374 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6375 tmp_ptr = tmp_str.c_ptr_quick();
6376 DBUG_PRINT("info",("spider tmp_ptr = %s", tmp_ptr));
6377 while ((tmp_ptr2 = strstr(tmp_ptr, SPIDER_SQL_AS_CHAR_STR)))
6378 tmp_ptr = tmp_ptr2 + 1;
6379 last_str = tmp_ptr - 1;
6380 last_str_length = strlen(last_str) - SPIDER_SQL_CLOSE_PAREN_LEN;
6381 }
6382 }
6383 break;
6384 case Item_func::NOT_FUNC:
6385 DBUG_PRINT("info",("spider NOT_FUNC"));
6386 if (item_list[0]->type() == Item::COND_ITEM)
6387 {
6388 DBUG_PRINT("info",("spider item_list[0] is COND_ITEM"));
6389 Item_cond *item_cond = (Item_cond *) item_list[0];
6390 if (item_cond->functype() == Item_func::COND_AND_FUNC)
6391 {
6392 DBUG_PRINT("info",("spider item_cond is COND_AND_FUNC"));
6393 List_iterator_fast<Item> lif(*(item_cond->argument_list()));
6394 bool has_expr_cache_item = FALSE;
6395 bool has_isnotnull_func = FALSE;
6396 bool has_other_item = FALSE;
6397 while((item = lif++))
6398 {
6399 #ifdef SPIDER_HAS_EXPR_CACHE_ITEM
6400 if (
6401 item->type() == Item::EXPR_CACHE_ITEM
6402 ) {
6403 DBUG_PRINT("info",("spider EXPR_CACHE_ITEM"));
6404 has_expr_cache_item = TRUE;
6405 } else
6406 #endif
6407 if (
6408 item->type() == Item::FUNC_ITEM &&
6409 ((Item_func *) item)->functype() == Item_func::ISNOTNULL_FUNC
6410 ) {
6411 DBUG_PRINT("info",("spider ISNOTNULL_FUNC"));
6412 has_isnotnull_func = TRUE;
6413 } else {
6414 DBUG_PRINT("info",("spider has other item"));
6415 DBUG_PRINT("info",("spider COND type=%d", item->type()));
6416 has_other_item = TRUE;
6417 }
6418 }
6419 if (has_expr_cache_item && has_isnotnull_func && !has_other_item)
6420 {
6421 DBUG_PRINT("info",("spider NOT EXISTS skip"));
6422 DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
6423 }
6424 }
6425 }
6426 if (str)
6427 {
6428 func_name = (char*) item_func->func_name();
6429 func_name_length = strlen(func_name);
6430 if (str->reserve(func_name_length + SPIDER_SQL_SPACE_LEN))
6431 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6432 str->q_append(func_name, func_name_length);
6433 str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
6434 }
6435 break;
6436 case Item_func::NEG_FUNC:
6437 if (str)
6438 {
6439 func_name = (char*) item_func->func_name();
6440 func_name_length = strlen(func_name);
6441 if (str->reserve(func_name_length + SPIDER_SQL_SPACE_LEN))
6442 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6443 str->q_append(func_name, func_name_length);
6444 str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
6445 }
6446 break;
6447 case Item_func::IN_FUNC:
6448 if (((Item_func_opt_neg *) item_func)->negated)
6449 {
6450 func_name = SPIDER_SQL_NOT_IN_STR;
6451 func_name_length = SPIDER_SQL_NOT_IN_LEN;
6452 separator_str = SPIDER_SQL_COMMA_STR;
6453 separator_str_length = SPIDER_SQL_COMMA_LEN;
6454 last_str = SPIDER_SQL_CLOSE_PAREN_STR;
6455 last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
6456 } else {
6457 func_name = SPIDER_SQL_IN_STR;
6458 func_name_length = SPIDER_SQL_IN_LEN;
6459 separator_str = SPIDER_SQL_COMMA_STR;
6460 separator_str_length = SPIDER_SQL_COMMA_LEN;
6461 last_str = SPIDER_SQL_CLOSE_PAREN_STR;
6462 last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
6463 }
6464 break;
6465 case Item_func::BETWEEN:
6466 if (((Item_func_opt_neg *) item_func)->negated)
6467 {
6468 func_name = SPIDER_SQL_NOT_BETWEEN_STR;
6469 func_name_length = SPIDER_SQL_NOT_BETWEEN_LEN;
6470 separator_str = SPIDER_SQL_AND_STR;
6471 separator_str_length = SPIDER_SQL_AND_LEN;
6472 } else {
6473 func_name = (char*) item_func->func_name();
6474 func_name_length = strlen(func_name);
6475 separator_str = SPIDER_SQL_AND_STR;
6476 separator_str_length = SPIDER_SQL_AND_LEN;
6477 }
6478 break;
6479 case Item_func::FUNC_SP:
6480 case Item_func::UDF_FUNC:
6481 use_pushdown_udf = spider_param_use_pushdown_udf(spider->trx->thd,
6482 spider->share->use_pushdown_udf);
6483 if (!use_pushdown_udf)
6484 /*
6485 This is the default behavior because the remote nodes may deal with
6486 the function in an unexpected way (e.g. not having the same
6487 definition). Users can turn it on if they know what they are doing.
6488 */
6489 DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
6490 if (str)
6491 {
6492 func_name = (char*) item_func->func_name();
6493 func_name_length = strlen(func_name);
6494 DBUG_PRINT("info",("spider func_name = %s", func_name));
6495 DBUG_PRINT("info",("spider func_name_length = %d", func_name_length));
6496 if (str->reserve(func_name_length + SPIDER_SQL_OPEN_PAREN_LEN))
6497 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6498 str->q_append(func_name, func_name_length);
6499 str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
6500 }
6501 func_name = SPIDER_SQL_COMMA_STR;
6502 func_name_length = SPIDER_SQL_COMMA_LEN;
6503 separator_str = SPIDER_SQL_COMMA_STR;
6504 separator_str_length = SPIDER_SQL_COMMA_LEN;
6505 last_str = SPIDER_SQL_CLOSE_PAREN_STR;
6506 last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
6507 break;
6508 #ifdef MARIADB_BASE_VERSION
6509 case Item_func::XOR_FUNC:
6510 #else
6511 case Item_func::COND_XOR_FUNC:
6512 #endif
6513 if (str)
6514 str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
6515 DBUG_RETURN(
6516 spider_db_open_item_cond((Item_cond *) item_func, spider, str,
6517 alias, alias_length, dbton_id, use_fields, fields));
6518 case Item_func::TRIG_COND_FUNC:
6519 DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
6520 case Item_func::GUSERVAR_FUNC:
6521 if (str)
6522 str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
6523 if (item_func->result_type() == STRING_RESULT)
6524 DBUG_RETURN(spider_db_open_item_string(item_func, NULL, spider, str,
6525 alias, alias_length, dbton_id, use_fields, fields));
6526 else
6527 DBUG_RETURN(spider_db_open_item_int(item_func, NULL, spider, str,
6528 alias, alias_length, dbton_id, use_fields, fields));
6529 case Item_func::FT_FUNC:
6530 if (spider_db_check_ft_idx(item_func, spider) == MAX_KEY)
6531 DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
6532 start_item = 1;
6533 if (str)
6534 {
6535 if (str->reserve(SPIDER_SQL_MATCH_LEN))
6536 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6537 str->q_append(SPIDER_SQL_MATCH_STR, SPIDER_SQL_MATCH_LEN);
6538 }
6539 separator_str = SPIDER_SQL_COMMA_STR;
6540 separator_str_length = SPIDER_SQL_COMMA_LEN;
6541 last_str = SPIDER_SQL_CLOSE_PAREN_STR;
6542 last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
6543 break;
6544 case Item_func::SP_EQUALS_FUNC:
6545 if (str)
6546 {
6547 func_name = SPIDER_SQL_MBR_EQUAL_STR;
6548 func_name_length = SPIDER_SQL_MBR_EQUAL_LEN;
6549 DBUG_PRINT("info",("spider func_name = %s", func_name));
6550 DBUG_PRINT("info",("spider func_name_length = %d", func_name_length));
6551 if (str->reserve(func_name_length))
6552 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6553 str->q_append(func_name, func_name_length);
6554 }
6555 func_name = SPIDER_SQL_COMMA_STR;
6556 func_name_length = SPIDER_SQL_COMMA_LEN;
6557 separator_str = SPIDER_SQL_COMMA_STR;
6558 separator_str_length = SPIDER_SQL_COMMA_LEN;
6559 last_str = SPIDER_SQL_CLOSE_PAREN_STR;
6560 last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
6561 break;
6562 case Item_func::SP_DISJOINT_FUNC:
6563 case Item_func::SP_INTERSECTS_FUNC:
6564 case Item_func::SP_TOUCHES_FUNC:
6565 case Item_func::SP_CROSSES_FUNC:
6566 case Item_func::SP_WITHIN_FUNC:
6567 case Item_func::SP_CONTAINS_FUNC:
6568 case Item_func::SP_OVERLAPS_FUNC:
6569 if (str)
6570 {
6571 func_name = (char*) item_func->func_name();
6572 func_name_length = strlen(func_name);
6573 DBUG_PRINT("info",("spider func_name = %s", func_name));
6574 DBUG_PRINT("info",("spider func_name_length = %d", func_name_length));
6575 if (str->reserve(
6576 #ifndef SPIDER_ITEM_GEOFUNC_NAME_HAS_MBR
6577 SPIDER_SQL_MBR_LEN +
6578 #endif
6579 func_name_length + SPIDER_SQL_OPEN_PAREN_LEN))
6580 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6581 #ifndef SPIDER_ITEM_GEOFUNC_NAME_HAS_MBR
6582 str->q_append(SPIDER_SQL_MBR_STR, SPIDER_SQL_MBR_LEN);
6583 #endif
6584 str->q_append(func_name, func_name_length);
6585 str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
6586 }
6587 func_name = SPIDER_SQL_COMMA_STR;
6588 func_name_length = SPIDER_SQL_COMMA_LEN;
6589 separator_str = SPIDER_SQL_COMMA_STR;
6590 separator_str_length = SPIDER_SQL_COMMA_LEN;
6591 last_str = SPIDER_SQL_CLOSE_PAREN_STR;
6592 last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
6593 break;
6594 case Item_func::EQ_FUNC:
6595 case Item_func::EQUAL_FUNC:
6596 case Item_func::NE_FUNC:
6597 case Item_func::LT_FUNC:
6598 case Item_func::LE_FUNC:
6599 case Item_func::GE_FUNC:
6600 case Item_func::GT_FUNC:
6601 if (str)
6602 {
6603 func_name = (char*) item_func->func_name();
6604 func_name_length = strlen(func_name);
6605 }
6606 break;
6607 case Item_func::LIKE_FUNC:
6608 #ifdef SPIDER_LIKE_FUNC_HAS_GET_NEGATED
6609 if (str)
6610 {
6611 if (((Item_func_like *)item_func)->get_negated())
6612 {
6613 func_name = SPIDER_SQL_NOT_LIKE_STR;
6614 func_name_length = SPIDER_SQL_NOT_LIKE_LEN;
6615 }
6616 else
6617 {
6618 func_name = (char*)item_func->func_name();
6619 func_name_length = strlen(func_name);
6620 }
6621 }
6622 break;
6623 #else
6624 DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
6625 #endif
6626 case Item_func::CASE_SEARCHED_FUNC:
6627 case Item_func::CASE_SIMPLE_FUNC:
6628 #ifdef ITEM_FUNC_CASE_PARAMS_ARE_PUBLIC
6629 Item_func_case *item_func_case = (Item_func_case *) item_func;
6630 if (str)
6631 {
6632 if (str->reserve(SPIDER_SQL_CASE_LEN))
6633 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6634 str->q_append(SPIDER_SQL_CASE_STR, SPIDER_SQL_CASE_LEN);
6635 }
6636 if (item_func_case->first_expr_num != -1)
6637 {
6638 if ((error_num = spider_db_print_item_type(
6639 item_list[item_func_case->first_expr_num], NULL, spider, str,
6640 alias, alias_length, dbton_id, use_fields, fields)))
6641 DBUG_RETURN(error_num);
6642 }
6643 for (roop_count = 0; roop_count < item_func_case->ncases;
6644 roop_count += 2)
6645 {
6646 if (str)
6647 {
6648 if (str->reserve(SPIDER_SQL_WHEN_LEN))
6649 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6650 str->q_append(SPIDER_SQL_WHEN_STR, SPIDER_SQL_WHEN_LEN);
6651 }
6652 if ((error_num = spider_db_print_item_type(
6653 item_list[roop_count], NULL, spider, str,
6654 alias, alias_length, dbton_id, use_fields, fields)))
6655 DBUG_RETURN(error_num);
6656 if (str)
6657 {
6658 if (str->reserve(SPIDER_SQL_THEN_LEN))
6659 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6660 str->q_append(SPIDER_SQL_THEN_STR, SPIDER_SQL_THEN_LEN);
6661 }
6662 if ((error_num = spider_db_print_item_type(
6663 item_list[roop_count + 1], NULL, spider, str,
6664 alias, alias_length, dbton_id, use_fields, fields)))
6665 DBUG_RETURN(error_num);
6666 }
6667 if (item_func_case->else_expr_num != -1)
6668 {
6669 if (str)
6670 {
6671 if (str->reserve(SPIDER_SQL_ELSE_LEN))
6672 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6673 str->q_append(SPIDER_SQL_ELSE_STR, SPIDER_SQL_ELSE_LEN);
6674 }
6675 if ((error_num = spider_db_print_item_type(
6676 item_list[item_func_case->else_expr_num], NULL, spider, str,
6677 alias, alias_length, dbton_id, use_fields, fields)))
6678 DBUG_RETURN(error_num);
6679 }
6680 if (str)
6681 {
6682 if (str->reserve(SPIDER_SQL_END_LEN + SPIDER_SQL_CLOSE_PAREN_LEN))
6683 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6684 str->q_append(SPIDER_SQL_END_STR, SPIDER_SQL_END_LEN);
6685 str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,
6686 SPIDER_SQL_CLOSE_PAREN_LEN);
6687 }
6688 DBUG_RETURN(0);
6689 #else
6690 DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
6691 #endif
6692 case Item_func::JSON_EXTRACT_FUNC:
6693 func_name = (char*) item_func->func_name();
6694 func_name_length = strlen(func_name);
6695 if (str)
6696 {
6697 if (str->reserve(func_name_length + SPIDER_SQL_OPEN_PAREN_LEN))
6698 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6699 str->q_append(func_name, func_name_length);
6700 str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
6701 }
6702 func_name = SPIDER_SQL_COMMA_STR;
6703 func_name_length = SPIDER_SQL_COMMA_LEN;
6704 separator_str = SPIDER_SQL_COMMA_STR;
6705 separator_str_length = SPIDER_SQL_COMMA_LEN;
6706 last_str = SPIDER_SQL_CLOSE_PAREN_STR;
6707 last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
6708 break;
6709 default:
6710 THD *thd = spider->trx->thd;
6711 SPIDER_SHARE *share = spider->share;
6712 if (spider_param_skip_default_condition(thd,
6713 share->skip_default_condition))
6714 DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
6715 if (str)
6716 {
6717 func_name = (char*) item_func->func_name();
6718 func_name_length = strlen(func_name);
6719 }
6720 break;
6721 }
6722 DBUG_PRINT("info",("spider func_name = %s", func_name));
6723 DBUG_PRINT("info",("spider func_name_length = %d", func_name_length));
6724 DBUG_PRINT("info",("spider separator_str = %s", separator_str));
6725 DBUG_PRINT("info",("spider separator_str_length = %d", separator_str_length));
6726 DBUG_PRINT("info",("spider last_str = %s", last_str));
6727 DBUG_PRINT("info",("spider last_str_length = %d", last_str_length));
6728 if (item_count)
6729 {
6730 /* Find the field in the list of items of the expression tree */
6731 field = spider_db_find_field_in_item_list(item_list,
6732 item_count, start_item,
6733 str,
6734 func_name, func_name_length);
6735 item_count--;
6736 /*
6737 Loop through the items of the current function expression to
6738 print its portion of the statement
6739 */
6740 for (roop_count = start_item; roop_count < item_count; roop_count++)
6741 {
6742 item = item_list[roop_count];
6743 if ((error_num = spider_db_print_item_type(item, field, spider, str,
6744 alias, alias_length, dbton_id, use_fields, fields)))
6745 DBUG_RETURN(error_num);
6746 if (roop_count == 1)
6747 {
6748 /* Remaining operands need to be preceded by the separator */
6749 func_name = separator_str;
6750 func_name_length = separator_str_length;
6751 }
6752 if (str)
6753 {
6754 if (str->reserve(func_name_length + SPIDER_SQL_SPACE_LEN * 2))
6755 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6756 str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
6757 str->q_append(func_name, func_name_length);
6758 str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
6759 }
6760 }
6761
6762 /* Print the last operand value */
6763 item = item_list[roop_count];
6764 if ((error_num = spider_db_print_item_type(item, field, spider, str,
6765 alias, alias_length, dbton_id, use_fields, fields)))
6766 DBUG_RETURN(error_num);
6767 }
6768
6769 if (item_func->functype() == Item_func::FT_FUNC)
6770 {
6771 Item_func_match *item_func_match = (Item_func_match *)item_func;
6772 if (str)
6773 {
6774 if (str->reserve(SPIDER_SQL_AGAINST_LEN))
6775 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6776 str->q_append(SPIDER_SQL_AGAINST_STR, SPIDER_SQL_AGAINST_LEN);
6777 }
6778 item = item_list[0];
6779 if ((error_num = spider_db_print_item_type(item, NULL, spider, str,
6780 alias, alias_length, dbton_id, use_fields, fields)))
6781 DBUG_RETURN(error_num);
6782 if (str)
6783 {
6784 if (str->reserve(
6785 ((item_func_match->flags & FT_BOOL) ?
6786 SPIDER_SQL_IN_BOOLEAN_MODE_LEN : 0) +
6787 ((item_func_match->flags & FT_EXPAND) ?
6788 SPIDER_SQL_WITH_QUERY_EXPANSION_LEN : 0)
6789 ))
6790 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6791 if (item_func_match->flags & FT_BOOL)
6792 str->q_append(SPIDER_SQL_IN_BOOLEAN_MODE_STR,
6793 SPIDER_SQL_IN_BOOLEAN_MODE_LEN);
6794 if (item_func_match->flags & FT_EXPAND)
6795 str->q_append(SPIDER_SQL_WITH_QUERY_EXPANSION_STR,
6796 SPIDER_SQL_WITH_QUERY_EXPANSION_LEN);
6797 }
6798 } else if (item_func->functype() == Item_func::UNKNOWN_FUNC)
6799 {
6800 if (
6801 func_name_length == 7 &&
6802 !strncasecmp("convert", func_name, func_name_length)
6803 ) {
6804 if (str)
6805 {
6806 Item_func_conv_charset *item_func_conv_charset =
6807 (Item_func_conv_charset *)item_func;
6808 CHARSET_INFO *conv_charset =
6809 item_func_conv_charset->SPIDER_Item_func_conv_charset_conv_charset;
6810 uint cset_length = strlen(conv_charset->csname);
6811 if (str->reserve(SPIDER_SQL_USING_LEN + cset_length))
6812 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6813 str->q_append(SPIDER_SQL_USING_STR, SPIDER_SQL_USING_LEN);
6814 str->q_append(conv_charset->csname, cset_length);
6815 }
6816 }
6817 }
6818 if (str)
6819 {
6820 if (merge_func)
6821 str->length(str->length() - SPIDER_SQL_CLOSE_PAREN_LEN);
6822 if (str->reserve(last_str_length + SPIDER_SQL_CLOSE_PAREN_LEN))
6823 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6824 str->q_append(last_str, last_str_length);
6825 str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
6826 }
6827 DBUG_RETURN(0);
6828 }
6829
6830 #ifdef HANDLER_HAS_DIRECT_AGGREGATE
open_item_sum_func(Item_sum * item_sum,ha_spider * spider,spider_string * str,const char * alias,uint alias_length,bool use_fields,spider_fields * fields)6831 int spider_db_mbase_util::open_item_sum_func(
6832 Item_sum *item_sum,
6833 ha_spider *spider,
6834 spider_string *str,
6835 const char *alias,
6836 uint alias_length,
6837 bool use_fields,
6838 spider_fields *fields
6839 ) {
6840 uint roop_count, item_count = item_sum->get_arg_count();
6841 int error_num;
6842 DBUG_ENTER("spider_db_mbase_util::open_item_sum_func");
6843 DBUG_PRINT("info",("spider Sumfunctype = %d", item_sum->sum_func()));
6844 switch (item_sum->sum_func())
6845 {
6846 case Item_sum::COUNT_FUNC:
6847 case Item_sum::SUM_FUNC:
6848 case Item_sum::MIN_FUNC:
6849 case Item_sum::MAX_FUNC:
6850 {
6851 const char *func_name = item_sum->func_name();
6852 uint func_name_length = strlen(func_name);
6853 Item *item, **args = item_sum->get_args();
6854 if (str)
6855 {
6856 if (str->reserve(func_name_length))
6857 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6858 str->q_append(func_name, func_name_length);
6859 }
6860 if (item_count)
6861 {
6862 item_count--;
6863 for (roop_count = 0; roop_count < item_count; roop_count++)
6864 {
6865 item = args[roop_count];
6866 if ((error_num = spider_db_print_item_type(item, NULL, spider, str,
6867 alias, alias_length, dbton_id, use_fields, fields)))
6868 DBUG_RETURN(error_num);
6869 if (str)
6870 {
6871 if (str->reserve(SPIDER_SQL_COMMA_LEN))
6872 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6873 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
6874 }
6875 }
6876 item = args[roop_count];
6877 if ((error_num = spider_db_print_item_type(item, NULL, spider, str,
6878 alias, alias_length, dbton_id, use_fields, fields)))
6879 DBUG_RETURN(error_num);
6880 }
6881 if (str)
6882 {
6883 if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN))
6884 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6885 str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,
6886 SPIDER_SQL_CLOSE_PAREN_LEN);
6887 }
6888 }
6889 break;
6890 case Item_sum::COUNT_DISTINCT_FUNC:
6891 case Item_sum::SUM_DISTINCT_FUNC:
6892 case Item_sum::AVG_FUNC:
6893 case Item_sum::AVG_DISTINCT_FUNC:
6894 {
6895 if (!use_fields)
6896 DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
6897 const char *func_name = item_sum->func_name();
6898 uint func_name_length = strlen(func_name);
6899 Item *item, **args = item_sum->get_args();
6900 if (str)
6901 {
6902 if (str->reserve(func_name_length))
6903 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6904 str->q_append(func_name, func_name_length);
6905 }
6906 if (item_count)
6907 {
6908 item_count--;
6909 for (roop_count = 0; roop_count < item_count; roop_count++)
6910 {
6911 item = args[roop_count];
6912 if ((error_num = spider_db_print_item_type(item, NULL, spider, str,
6913 alias, alias_length, dbton_id, use_fields, fields)))
6914 DBUG_RETURN(error_num);
6915 if (str)
6916 {
6917 if (str->reserve(SPIDER_SQL_COMMA_LEN))
6918 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6919 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
6920 }
6921 }
6922 item = args[roop_count];
6923 if ((error_num = spider_db_print_item_type(item, NULL, spider, str,
6924 alias, alias_length, dbton_id, use_fields, fields)))
6925 DBUG_RETURN(error_num);
6926 }
6927 if (str)
6928 {
6929 if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN))
6930 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
6931 str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,
6932 SPIDER_SQL_CLOSE_PAREN_LEN);
6933 }
6934 }
6935 break;
6936 case Item_sum::STD_FUNC:
6937 case Item_sum::VARIANCE_FUNC:
6938 case Item_sum::SUM_BIT_FUNC:
6939 case Item_sum::UDF_SUM_FUNC:
6940 case Item_sum::GROUP_CONCAT_FUNC:
6941 default:
6942 DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
6943 }
6944 DBUG_RETURN(0);
6945 }
6946 #endif
6947
append_escaped_util(spider_string * to,String * from)6948 int spider_db_mbase_util::append_escaped_util(
6949 spider_string *to,
6950 String *from
6951 ) {
6952 DBUG_ENTER("spider_db_mbase_util::append_escaped_util");
6953 DBUG_PRINT("info",("spider this=%p", this));
6954 DBUG_PRINT("info",("spider from=%s", from->charset()->csname));
6955 DBUG_PRINT("info",("spider to=%s", to->charset()->csname));
6956 to->append_escape_string(from->ptr(), from->length());
6957 DBUG_RETURN(0);
6958 }
6959
6960 #ifdef SPIDER_HAS_GROUP_BY_HANDLER
append_table(ha_spider * spider,spider_fields * fields,spider_string * str,TABLE_LIST * table_list,TABLE_LIST ** used_table_list,uint * current_pos,TABLE_LIST ** cond_table_list_ptr,bool top_down,bool first)6961 int spider_db_mbase_util::append_table(
6962 ha_spider *spider,
6963 spider_fields *fields,
6964 spider_string *str,
6965 TABLE_LIST *table_list,
6966 TABLE_LIST **used_table_list,
6967 uint *current_pos,
6968 TABLE_LIST **cond_table_list_ptr,
6969 bool top_down,
6970 bool first
6971 ) {
6972 int error_num;
6973 bool use_cond_table_list = FALSE;
6974 spider_mbase_share *db_share;
6975 spider_mbase_handler *dbton_hdl;
6976 SPIDER_TABLE_HOLDER *table_holder;
6977 TABLE_LIST *cond_table_list = *cond_table_list_ptr;
6978 ha_spider *spd;
6979 DBUG_ENTER("spider_db_mbase_util::append_table");
6980 DBUG_PRINT("info",("spider table_list=%p", table_list));
6981 DBUG_PRINT("info",("spider table_list->outer_join=%u",
6982 table_list->outer_join));
6983 DBUG_PRINT("info",("spider table_list->on_expr=%p",
6984 table_list->on_expr));
6985 DBUG_PRINT("info",("spider table_list->join_using_fields=%p",
6986 table_list->join_using_fields));
6987 DBUG_PRINT("info",("spider table_list->table=%p",
6988 table_list->table));
6989 if (!top_down && table_list->embedding)
6990 {
6991 if ((error_num = append_embedding_tables(spider, fields, str,
6992 table_list->embedding, used_table_list, current_pos,
6993 cond_table_list_ptr)))
6994 DBUG_RETURN(error_num);
6995 } else if (!table_list->table)
6996 {
6997 if ((error_num = append_tables_top_down(spider, fields, str, table_list,
6998 used_table_list, current_pos, cond_table_list_ptr)))
6999 DBUG_RETURN(error_num);
7000 } else {
7001 if (
7002 table_list->outer_join ||
7003 table_list->on_expr ||
7004 table_list->join_using_fields
7005 ) {
7006 DBUG_PRINT("info",("spider use table_list"));
7007 if (table_list->outer_join & JOIN_TYPE_LEFT)
7008 {
7009 if (str)
7010 {
7011 if (str->reserve(SPIDER_SQL_LEFT_JOIN_LEN))
7012 {
7013 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7014 }
7015 str->q_append(SPIDER_SQL_LEFT_JOIN_STR, SPIDER_SQL_LEFT_JOIN_LEN);
7016 }
7017 } else {
7018 if (str)
7019 {
7020 if (str->reserve(SPIDER_SQL_JOIN_LEN))
7021 {
7022 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7023 }
7024 str->q_append(SPIDER_SQL_JOIN_STR, SPIDER_SQL_JOIN_LEN);
7025 }
7026 }
7027 } else if (
7028 cond_table_list &&
7029 (
7030 cond_table_list->outer_join ||
7031 cond_table_list->on_expr ||
7032 cond_table_list->join_using_fields
7033 )
7034 ) {
7035 DBUG_PRINT("info",("spider use cond_table_list"));
7036 if (cond_table_list->outer_join & (JOIN_TYPE_LEFT | JOIN_TYPE_RIGHT))
7037 {
7038 if (str)
7039 {
7040 if (str->reserve(SPIDER_SQL_LEFT_JOIN_LEN))
7041 {
7042 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7043 }
7044 str->q_append(SPIDER_SQL_LEFT_JOIN_STR, SPIDER_SQL_LEFT_JOIN_LEN);
7045 }
7046 } else {
7047 if (str)
7048 {
7049 if (str->reserve(SPIDER_SQL_JOIN_LEN))
7050 {
7051 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7052 }
7053 str->q_append(SPIDER_SQL_JOIN_STR, SPIDER_SQL_JOIN_LEN);
7054 }
7055 }
7056 use_cond_table_list = TRUE;
7057 } else if (*current_pos > 0 && !first)
7058 {
7059 DBUG_PRINT("info",("spider no condition"));
7060 if (top_down)
7061 {
7062 if (str)
7063 {
7064 if (str->reserve(SPIDER_SQL_JOIN_LEN))
7065 {
7066 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7067 }
7068 str->q_append(SPIDER_SQL_JOIN_STR, SPIDER_SQL_JOIN_LEN);
7069 }
7070 } else {
7071 if (str)
7072 {
7073 if (str->reserve(SPIDER_SQL_COMMA_LEN))
7074 {
7075 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7076 }
7077 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
7078 }
7079 }
7080 }
7081
7082 if (str)
7083 {
7084 table_holder = fields->get_table_holder(table_list->table);
7085 spd = table_holder->spider;
7086 db_share = (spider_mbase_share *)
7087 spd->share->dbton_share[dbton_id];
7088 dbton_hdl = (spider_mbase_handler *)
7089 spd->dbton_handler[dbton_id];
7090
7091 dbton_hdl->table_name_pos = str->length();
7092
7093 if (str->reserve(
7094 db_share->db_nm_max_length +
7095 SPIDER_SQL_DOT_LEN + /* SPIDER_SQL_NAME_QUOTE_LEN */ 4 +
7096 db_share->table_nm_max_length + SPIDER_SQL_SPACE_LEN +
7097 table_holder->alias->length() - SPIDER_SQL_DOT_LEN
7098 )) {
7099 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7100 }
7101
7102 if ((error_num = db_share->append_table_name_with_adjusting(str,
7103 spd->conn_link_idx[dbton_hdl->first_link_idx])))
7104 {
7105 DBUG_RETURN(error_num);
7106 }
7107 str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
7108 str->q_append(table_holder->alias->ptr(),
7109 table_holder->alias->length() - SPIDER_SQL_DOT_LEN);
7110 }
7111 used_table_list[(*current_pos)++] = table_list;
7112
7113 if (str)
7114 {
7115 List<String> *join_using_fields = table_list->join_using_fields;
7116 if (!join_using_fields && cond_table_list)
7117 {
7118 join_using_fields = cond_table_list->join_using_fields;
7119 }
7120
7121 if (join_using_fields)
7122 {
7123 if (str->reserve(SPIDER_SQL_USING_LEN + SPIDER_SQL_OPEN_PAREN_LEN))
7124 {
7125 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7126 }
7127 str->q_append(SPIDER_SQL_USING_STR, SPIDER_SQL_USING_LEN);
7128 str->q_append(SPIDER_SQL_OPEN_PAREN_STR,
7129 SPIDER_SQL_OPEN_PAREN_LEN);
7130 List_iterator_fast<String> it2(*join_using_fields);
7131 String *ptr;
7132 while ((ptr = it2++))
7133 {
7134 if (str->reserve(ptr->length() + SPIDER_SQL_COMMA_LEN))
7135 {
7136 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7137 }
7138 str->q_append(ptr->ptr(), ptr->length());
7139 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
7140 }
7141 str->length(str->length() - SPIDER_SQL_COMMA_LEN);
7142 if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN))
7143 {
7144 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7145 }
7146 str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,
7147 SPIDER_SQL_CLOSE_PAREN_LEN);
7148 }
7149 }
7150
7151 Item *on_expr = table_list->on_expr;
7152 if (!on_expr && cond_table_list)
7153 {
7154 on_expr = cond_table_list->on_expr;
7155 }
7156
7157 if (on_expr)
7158 {
7159 if (str)
7160 {
7161 if (str->reserve(SPIDER_SQL_ON_LEN))
7162 {
7163 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7164 }
7165 str->q_append(SPIDER_SQL_ON_STR, SPIDER_SQL_ON_LEN);
7166 }
7167 if ((error_num = spider_db_print_item_type(on_expr, NULL,
7168 spider, str, NULL, 0, dbton_id, TRUE, fields)))
7169 {
7170 DBUG_RETURN(error_num);
7171 }
7172 }
7173
7174 if (use_cond_table_list)
7175 {
7176 (*cond_table_list_ptr) = NULL;
7177 DBUG_PRINT("info",("spider cond_table_list=%p", (*cond_table_list_ptr)));
7178 }
7179 }
7180 DBUG_RETURN(0);
7181 }
7182
append_tables_top_down(ha_spider * spider,spider_fields * fields,spider_string * str,TABLE_LIST * table_list,TABLE_LIST ** used_table_list,uint * current_pos,TABLE_LIST ** cond_table_list_ptr)7183 int spider_db_mbase_util::append_tables_top_down(
7184 ha_spider *spider,
7185 spider_fields *fields,
7186 spider_string *str,
7187 TABLE_LIST *table_list,
7188 TABLE_LIST **used_table_list,
7189 uint *current_pos,
7190 TABLE_LIST **cond_table_list_ptr
7191 ) {
7192 int error_num;
7193 uint outer_join_backup;
7194 TABLE_LIST *cur_table_list, *prev_table_list = NULL, *cond_table_list = NULL;
7195 bool first = TRUE;
7196 DBUG_ENTER("spider_db_mbase_util::append_tables_top_down");
7197 DBUG_PRINT("info",("spider this=%p", this));
7198 if (
7199 table_list->outer_join ||
7200 table_list->on_expr ||
7201 table_list->join_using_fields
7202 ) {
7203 DBUG_ASSERT(!(*cond_table_list_ptr));
7204 (*cond_table_list_ptr) = table_list;
7205 DBUG_PRINT("info",("spider cond_table_list=%p", table_list));
7206 }
7207 List_iterator_fast<TABLE_LIST> it1(table_list->nested_join->join_list);
7208 cur_table_list = it1++;
7209 if (cur_table_list->outer_join & JOIN_TYPE_RIGHT)
7210 {
7211 first = FALSE;
7212 prev_table_list = cur_table_list;
7213 cur_table_list = it1++;
7214 } else if (*cond_table_list_ptr)
7215 {
7216 first = TRUE;
7217 cond_table_list = (*cond_table_list_ptr);
7218 (*cond_table_list_ptr) = NULL;
7219 if (cond_table_list->outer_join & JOIN_TYPE_LEFT)
7220 {
7221 if (str)
7222 {
7223 if (str->reserve(SPIDER_SQL_LEFT_JOIN_LEN + SPIDER_SQL_OPEN_PAREN_LEN))
7224 {
7225 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7226 }
7227 str->q_append(SPIDER_SQL_LEFT_JOIN_STR, SPIDER_SQL_LEFT_JOIN_LEN);
7228 str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
7229 }
7230 } else {
7231 if (str)
7232 {
7233 if (str->reserve(SPIDER_SQL_JOIN_LEN + SPIDER_SQL_OPEN_PAREN_LEN))
7234 {
7235 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7236 }
7237 str->q_append(SPIDER_SQL_JOIN_STR, SPIDER_SQL_JOIN_LEN);
7238 str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
7239 }
7240 }
7241 }
7242
7243 do {
7244 if (cur_table_list->outer_join & JOIN_TYPE_RIGHT)
7245 {
7246 prev_table_list = cur_table_list;
7247 } else {
7248 if ((error_num = append_table(spider, fields, str, cur_table_list,
7249 used_table_list, current_pos, cond_table_list_ptr, TRUE, first)))
7250 DBUG_RETURN(error_num);
7251 first = FALSE;
7252 if (prev_table_list)
7253 {
7254 outer_join_backup = prev_table_list->outer_join;
7255 prev_table_list->outer_join = JOIN_TYPE_LEFT;
7256 if ((error_num = append_table(spider, fields, str, prev_table_list,
7257 used_table_list, current_pos, cond_table_list_ptr, TRUE, FALSE)))
7258 {
7259 prev_table_list->outer_join = outer_join_backup;
7260 DBUG_RETURN(error_num);
7261 }
7262 prev_table_list->outer_join = outer_join_backup;
7263 prev_table_list = NULL;
7264 }
7265 }
7266 } while ((cur_table_list = it1++));
7267
7268 if (cond_table_list)
7269 {
7270 if (str)
7271 {
7272 if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN))
7273 {
7274 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7275 }
7276 str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,
7277 SPIDER_SQL_CLOSE_PAREN_LEN);
7278
7279 List<String> *join_using_fields = cond_table_list->join_using_fields;
7280 if (join_using_fields)
7281 {
7282 if (str->reserve(SPIDER_SQL_USING_LEN + SPIDER_SQL_OPEN_PAREN_LEN))
7283 {
7284 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7285 }
7286 str->q_append(SPIDER_SQL_USING_STR, SPIDER_SQL_USING_LEN);
7287 str->q_append(SPIDER_SQL_OPEN_PAREN_STR,
7288 SPIDER_SQL_OPEN_PAREN_LEN);
7289 List_iterator_fast<String> it2(*join_using_fields);
7290 String *ptr;
7291 while ((ptr = it2++))
7292 {
7293 if (str->reserve(ptr->length() + SPIDER_SQL_COMMA_LEN))
7294 {
7295 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7296 }
7297 str->q_append(ptr->ptr(), ptr->length());
7298 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
7299 }
7300 str->length(str->length() - SPIDER_SQL_COMMA_LEN);
7301 if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN))
7302 {
7303 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7304 }
7305 str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,
7306 SPIDER_SQL_CLOSE_PAREN_LEN);
7307 }
7308 }
7309
7310 Item *on_expr = cond_table_list->on_expr;
7311 if (on_expr)
7312 {
7313 if (str)
7314 {
7315 if (str->reserve(SPIDER_SQL_ON_LEN))
7316 {
7317 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7318 }
7319 str->q_append(SPIDER_SQL_ON_STR, SPIDER_SQL_ON_LEN);
7320 }
7321 if ((error_num = spider_db_print_item_type(on_expr, NULL,
7322 spider, str, NULL, 0, dbton_id, TRUE, fields)))
7323 {
7324 DBUG_RETURN(error_num);
7325 }
7326 }
7327 }
7328 DBUG_RETURN(0);
7329 }
7330
append_tables_top_down_check(TABLE_LIST * table_list,TABLE_LIST ** used_table_list,uint * current_pos)7331 int spider_db_mbase_util::append_tables_top_down_check(
7332 TABLE_LIST *table_list,
7333 TABLE_LIST **used_table_list,
7334 uint *current_pos
7335 ) {
7336 int error_num;
7337 TABLE_LIST *cur_table_list;
7338 DBUG_ENTER("spider_db_mbase_util::append_tables_top_down_check");
7339 DBUG_PRINT("info",("spider this=%p", this));
7340 List_iterator_fast<TABLE_LIST> it1(table_list->nested_join->join_list);
7341 while ((cur_table_list = it1++))
7342 {
7343 if (!cur_table_list->table)
7344 {
7345 if ((error_num = append_tables_top_down_check(
7346 cur_table_list, used_table_list, current_pos)))
7347 DBUG_RETURN(error_num);
7348 } else {
7349 used_table_list[(*current_pos)++] = cur_table_list;
7350 }
7351 }
7352 DBUG_RETURN(0);
7353 }
7354
append_embedding_tables(ha_spider * spider,spider_fields * fields,spider_string * str,TABLE_LIST * table_list,TABLE_LIST ** used_table_list,uint * current_pos,TABLE_LIST ** cond_table_list_ptr)7355 int spider_db_mbase_util::append_embedding_tables(
7356 ha_spider *spider,
7357 spider_fields *fields,
7358 spider_string *str,
7359 TABLE_LIST *table_list,
7360 TABLE_LIST **used_table_list,
7361 uint *current_pos,
7362 TABLE_LIST **cond_table_list_ptr
7363 ) {
7364 int error_num;
7365 TABLE_LIST *embedding = table_list->embedding;
7366 DBUG_ENTER("spider_db_mbase_util::append_embedding_tables");
7367 DBUG_PRINT("info",("spider this=%p", this));
7368 if (embedding)
7369 {
7370 DBUG_PRINT("info",("spider embedding=%p", embedding));
7371 DBUG_PRINT("info",("spider embedding->outer_join=%u",
7372 embedding->outer_join));
7373 DBUG_PRINT("info",("spider embedding->on_expr=%p",
7374 embedding->on_expr));
7375 DBUG_PRINT("info",("spider embedding->join_using_fields=%p",
7376 embedding->join_using_fields));
7377 DBUG_PRINT("info",("spider embedding->table=%p",
7378 embedding->table));
7379 if ((error_num = append_embedding_tables(spider, fields, str, embedding,
7380 used_table_list, current_pos, cond_table_list_ptr)))
7381 DBUG_RETURN(error_num);
7382 } else {
7383 DBUG_PRINT("info",("spider table_list=%p", table_list));
7384 DBUG_PRINT("info",("spider table_list->outer_join=%u",
7385 table_list->outer_join));
7386 DBUG_PRINT("info",("spider table_list->on_expr=%p",
7387 table_list->on_expr));
7388 DBUG_PRINT("info",("spider table_list->join_using_fields=%p",
7389 table_list->join_using_fields));
7390 DBUG_PRINT("info",("spider table_list->table=%p",
7391 table_list->table));
7392 if (table_list->outer_join & JOIN_TYPE_RIGHT)
7393 {
7394 if ((error_num = append_tables_top_down_check(table_list,
7395 used_table_list, current_pos)))
7396 DBUG_RETURN(error_num);
7397 DBUG_ASSERT(!(*cond_table_list_ptr));
7398 (*cond_table_list_ptr) = table_list;
7399 DBUG_PRINT("info",("spider cond_table_list=%p", table_list));
7400 } else {
7401 if ((error_num = append_tables_top_down(spider, fields, str, table_list,
7402 used_table_list, current_pos, cond_table_list_ptr)))
7403 DBUG_RETURN(error_num);
7404 }
7405 }
7406 DBUG_RETURN(0);
7407 }
7408
append_from_and_tables(ha_spider * spider,spider_fields * fields,spider_string * str,TABLE_LIST * table_list,uint table_count)7409 int spider_db_mbase_util::append_from_and_tables(
7410 ha_spider *spider,
7411 spider_fields *fields,
7412 spider_string *str,
7413 TABLE_LIST *table_list,
7414 uint table_count
7415 ) {
7416 int error_num;
7417 uint current_pos = 0, roop_count, backup_pos, outer_join_backup;
7418 TABLE *table;
7419 TABLE_LIST **used_table_list, *prev_table_list = NULL,
7420 *cond_table_list = NULL;
7421 DBUG_ENTER("spider_db_mbase_util::append_from_and_tables");
7422 DBUG_PRINT("info",("spider this=%p", this));
7423 used_table_list = (TABLE_LIST **)
7424 my_alloca(sizeof(TABLE_LIST *) * table_count);
7425 if (!used_table_list)
7426 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7427
7428 if (str)
7429 {
7430 if (str->reserve(SPIDER_SQL_FROM_LEN))
7431 {
7432 my_afree(used_table_list);
7433 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7434 }
7435 str->q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN);
7436 }
7437
7438 do {
7439 table = table_list->table;
7440 if (table->const_table)
7441 continue;
7442
7443 for (roop_count = 0; roop_count < current_pos; ++roop_count)
7444 {
7445 if (used_table_list[roop_count] == table_list)
7446 break;
7447 }
7448 if (roop_count < current_pos)
7449 continue;
7450
7451 if (prev_table_list)
7452 current_pos = backup_pos;
7453 else
7454 backup_pos = current_pos;
7455 if ((error_num = append_table(spider, fields, str, table_list, used_table_list,
7456 ¤t_pos, &cond_table_list, FALSE, FALSE)))
7457 {
7458 my_afree(used_table_list);
7459 DBUG_RETURN(error_num);
7460 }
7461 if (prev_table_list)
7462 {
7463 outer_join_backup = prev_table_list->outer_join;
7464 prev_table_list->outer_join = JOIN_TYPE_LEFT;
7465 if ((error_num = append_table(spider, fields, str, prev_table_list,
7466 used_table_list, ¤t_pos, &cond_table_list, FALSE, FALSE)))
7467 {
7468 prev_table_list->outer_join = outer_join_backup;
7469 my_afree(used_table_list);
7470 DBUG_RETURN(error_num);
7471 }
7472 prev_table_list->outer_join = outer_join_backup;
7473 prev_table_list = NULL;
7474 }
7475 if (cond_table_list && (cond_table_list->outer_join & JOIN_TYPE_RIGHT))
7476 {
7477 prev_table_list = cond_table_list;
7478 cond_table_list = NULL;
7479 DBUG_PRINT("info",("spider cond_table_list=%p", cond_table_list));
7480 }
7481 } while ((table_list = table_list->next_local));
7482 my_afree(used_table_list);
7483 DBUG_RETURN(0);
7484 }
7485
reappend_tables(spider_fields * fields,SPIDER_LINK_IDX_CHAIN * link_idx_chain,spider_string * str)7486 int spider_db_mbase_util::reappend_tables(
7487 spider_fields *fields,
7488 SPIDER_LINK_IDX_CHAIN *link_idx_chain,
7489 spider_string *str
7490 ) {
7491 int error_num;
7492 uint32 length;
7493 ha_spider *spider;
7494 spider_mbase_share *db_share;
7495 spider_mbase_handler *dbton_hdl;
7496 SPIDER_TABLE_HOLDER *table_holder;
7497 SPIDER_LINK_IDX_HOLDER *link_idx_holder;
7498 DBUG_ENTER("spider_db_mbase_util::reappend_tables");
7499 DBUG_PRINT("info",("spider this=%p", this));
7500 length = str->length();
7501 fields->set_pos_to_first_table_on_link_idx_chain(link_idx_chain);
7502 fields->set_pos_to_first_table_holder();
7503 while ((table_holder = fields->get_next_table_holder()))
7504 {
7505 link_idx_holder =
7506 fields->get_next_table_on_link_idx_chain(link_idx_chain);
7507 spider = table_holder->spider;
7508 db_share = (spider_mbase_share *)
7509 spider->share->dbton_share[dbton_id];
7510 if (!db_share->same_db_table_name)
7511 {
7512 dbton_hdl = (spider_mbase_handler *) spider->dbton_handler[dbton_id];
7513 str->length(dbton_hdl->table_name_pos);
7514 if ((error_num = db_share->append_table_name_with_adjusting(str,
7515 spider->conn_link_idx[link_idx_holder->link_idx])))
7516 {
7517 DBUG_RETURN(error_num);
7518 }
7519 }
7520 }
7521 str->length(length);
7522 DBUG_RETURN(0);
7523 }
7524
append_where(spider_string * str)7525 int spider_db_mbase_util::append_where(
7526 spider_string *str
7527 ) {
7528 DBUG_ENTER("spider_db_mbase_util::append_where");
7529 DBUG_PRINT("info",("spider this=%p", this));
7530 if (str->reserve(SPIDER_SQL_WHERE_LEN))
7531 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7532 str->q_append(SPIDER_SQL_WHERE_STR, SPIDER_SQL_WHERE_LEN);
7533 DBUG_RETURN(0);
7534 }
7535
append_having(spider_string * str)7536 int spider_db_mbase_util::append_having(
7537 spider_string *str
7538 ) {
7539 DBUG_ENTER("spider_db_mbase_util::append_having");
7540 DBUG_PRINT("info",("spider this=%p", this));
7541 if (str->reserve(SPIDER_SQL_HAVING_LEN))
7542 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7543 str->q_append(SPIDER_SQL_HAVING_STR, SPIDER_SQL_HAVING_LEN);
7544 DBUG_RETURN(0);
7545 }
7546 #endif
7547
spider_mbase_share(st_spider_share * share,uint dbton_id,spider_db_mbase_util * spider_db_mbase_utility)7548 spider_mbase_share::spider_mbase_share(
7549 st_spider_share *share,
7550 uint dbton_id,
7551 spider_db_mbase_util *spider_db_mbase_utility
7552 ) : spider_db_share(
7553 share,
7554 dbton_id
7555 ),
7556 spider_db_mbase_utility(spider_db_mbase_utility),
7557 table_select(NULL),
7558 table_select_pos(0),
7559 key_select(NULL),
7560 key_select_pos(NULL),
7561 key_hint(NULL),
7562 show_table_status(NULL),
7563 show_records(NULL),
7564 show_index(NULL),
7565 table_names_str(NULL),
7566 db_names_str(NULL),
7567 db_table_str(NULL),
7568 #ifdef SPIDER_HAS_HASH_VALUE_TYPE
7569 db_table_str_hash_value(NULL),
7570 #endif
7571 table_nm_max_length(0),
7572 db_nm_max_length(0),
7573 column_name_str(NULL),
7574 same_db_table_name(TRUE),
7575 first_all_link_idx(-1)
7576 {
7577 DBUG_ENTER("spider_mbase_share::spider_mbase_share");
7578 DBUG_PRINT("info",("spider this=%p", this));
7579 spider_alloc_calc_mem_init(mem_calc, 71);
7580 spider_alloc_calc_mem(spider_current_trx, mem_calc, sizeof(*this));
7581 DBUG_VOID_RETURN;
7582 }
7583
spider_mysql_share(st_spider_share * share)7584 spider_mysql_share::spider_mysql_share(
7585 st_spider_share *share
7586 ) : spider_mbase_share(
7587 share,
7588 spider_db_mysql_utility.dbton_id,
7589 &spider_db_mysql_utility
7590 ) {
7591 DBUG_ENTER("spider_mysql_share::spider_mysql_share");
7592 DBUG_PRINT("info",("spider this=%p", this));
7593 DBUG_VOID_RETURN;
7594 }
spider_mariadb_share(st_spider_share * share)7595 spider_mariadb_share::spider_mariadb_share(
7596 st_spider_share *share
7597 ) : spider_mbase_share(
7598 share,
7599 spider_db_mariadb_utility.dbton_id,
7600 &spider_db_mariadb_utility
7601 ) {
7602 DBUG_ENTER("spider_mariadb_share::spider_mariadb_share");
7603 DBUG_PRINT("info",("spider this=%p", this));
7604 DBUG_VOID_RETURN;
7605 }
7606
~spider_mbase_share()7607 spider_mbase_share::~spider_mbase_share()
7608 {
7609 DBUG_ENTER("spider_mbase_share::~spider_mbase_share");
7610 DBUG_PRINT("info",("spider this=%p", this));
7611 if (table_select)
7612 delete [] table_select;
7613 if (key_select)
7614 delete [] key_select;
7615 if (key_hint)
7616 delete [] key_hint;
7617 free_show_table_status();
7618 free_show_records();
7619 free_show_index();
7620 free_column_name_str();
7621 free_table_names_str();
7622 if (key_select_pos)
7623 {
7624 spider_free(spider_current_trx, key_select_pos, MYF(0));
7625 }
7626 spider_free_mem_calc(spider_current_trx, mem_calc_id, sizeof(*this));
7627 DBUG_VOID_RETURN;
7628 }
7629
~spider_mysql_share()7630 spider_mysql_share::~spider_mysql_share()
7631 {
7632 DBUG_ENTER("spider_mysql_share::~spider_mysql_share");
7633 DBUG_PRINT("info",("spider this=%p", this));
7634 DBUG_VOID_RETURN;
7635 }
7636
~spider_mariadb_share()7637 spider_mariadb_share::~spider_mariadb_share()
7638 {
7639 DBUG_ENTER("spider_mariadb_share::~spider_mariadb_share");
7640 DBUG_PRINT("info",("spider this=%p", this));
7641 DBUG_VOID_RETURN;
7642 }
7643
init()7644 int spider_mbase_share::init()
7645 {
7646 int error_num;
7647 uint roop_count;
7648 TABLE_SHARE *table_share = spider_share->table_share;
7649 uint keys = table_share ? table_share->keys : 0;
7650 DBUG_ENTER("spider_mbase_share::init");
7651 DBUG_PRINT("info",("spider this=%p", this));
7652 if (!(key_select_pos = (int *)
7653 spider_bulk_alloc_mem(spider_current_trx, 112,
7654 __func__, __FILE__, __LINE__, MYF(MY_WME | MY_ZEROFILL),
7655 &key_select_pos,
7656 sizeof(int) * keys,
7657 #ifdef SPIDER_HAS_HASH_VALUE_TYPE
7658 &db_table_str_hash_value,
7659 sizeof(my_hash_value_type) * spider_share->all_link_count,
7660 #endif
7661 NullS))
7662 ) {
7663 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7664 }
7665
7666 if (keys > 0 &&
7667 !(key_hint = new spider_string[keys])
7668 ) {
7669 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7670 }
7671 for (roop_count = 0; roop_count < keys; roop_count++)
7672 {
7673 key_hint[roop_count].init_calc_mem(189);
7674 key_hint[roop_count].set_charset(spider_share->access_charset);
7675 }
7676 DBUG_PRINT("info",("spider key_hint=%p", key_hint));
7677
7678 if (
7679 !(table_select = new spider_string[1]) ||
7680 (keys > 0 &&
7681 !(key_select = new spider_string[keys])
7682 ) ||
7683 (error_num = create_table_names_str()) ||
7684 (table_share &&
7685 (
7686 (error_num = create_column_name_str()) ||
7687 (error_num = convert_key_hint_str()) ||
7688 (error_num = append_show_table_status()) ||
7689 (error_num = append_show_records()) ||
7690 (error_num = append_show_index())
7691 )
7692 )
7693 ) {
7694 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7695 }
7696
7697 table_select->init_calc_mem(96);
7698 if (table_share && (error_num = append_table_select()))
7699 DBUG_RETURN(error_num);
7700
7701 for (roop_count = 0; roop_count < keys; roop_count++)
7702 {
7703 key_select[roop_count].init_calc_mem(97);
7704 if ((error_num = append_key_select(roop_count)))
7705 DBUG_RETURN(error_num);
7706 }
7707
7708 DBUG_RETURN(error_num);
7709 }
7710
get_column_name_length(uint field_index)7711 uint spider_mbase_share::get_column_name_length(
7712 uint field_index
7713 ) {
7714 DBUG_ENTER("spider_mbase_share::get_column_name_length");
7715 DBUG_PRINT("info",("spider this=%p", this));
7716 DBUG_RETURN(column_name_str[field_index].length());
7717 }
7718
append_column_name(spider_string * str,uint field_index)7719 int spider_mbase_share::append_column_name(
7720 spider_string *str,
7721 uint field_index
7722 ) {
7723 int error_num;
7724 DBUG_ENTER("spider_mbase_share::append_column_name");
7725 DBUG_PRINT("info",("spider this=%p", this));
7726 error_num = spider_db_mbase_utility->append_name(str,
7727 column_name_str[field_index].ptr(), column_name_str[field_index].length());
7728 DBUG_RETURN(error_num);
7729 }
7730
append_column_name_with_alias(spider_string * str,uint field_index,const char * alias,uint alias_length)7731 int spider_mbase_share::append_column_name_with_alias(
7732 spider_string *str,
7733 uint field_index,
7734 const char *alias,
7735 uint alias_length
7736 ) {
7737 DBUG_ENTER("spider_mbase_share::append_column_name_with_alias");
7738 DBUG_PRINT("info",("spider this=%p", this));
7739 if (str->reserve(
7740 alias_length +
7741 column_name_str[field_index].length() +
7742 /* SPIDER_SQL_NAME_QUOTE_LEN */ 2))
7743 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7744 str->q_append(alias, alias_length);
7745 append_column_name(str, field_index);
7746 DBUG_RETURN(0);
7747 }
7748
append_table_name(spider_string * str,int all_link_idx)7749 int spider_mbase_share::append_table_name(
7750 spider_string *str,
7751 int all_link_idx
7752 ) {
7753 const char *db_nm = db_names_str[all_link_idx].ptr();
7754 uint db_nm_len = db_names_str[all_link_idx].length();
7755 const char *table_nm = table_names_str[all_link_idx].ptr();
7756 uint table_nm_len = table_names_str[all_link_idx].length();
7757 DBUG_ENTER("spider_mbase_share::append_table_name");
7758 DBUG_PRINT("info",("spider this=%p", this));
7759 if (str->reserve(db_nm_len + SPIDER_SQL_DOT_LEN + table_nm_len +
7760 /* SPIDER_SQL_NAME_QUOTE_LEN */ 4))
7761 {
7762 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7763 }
7764 spider_db_mbase_utility->append_name(str, db_nm, db_nm_len);
7765 str->q_append(SPIDER_SQL_DOT_STR, SPIDER_SQL_DOT_LEN);
7766 spider_db_mbase_utility->append_name(str, table_nm, table_nm_len);
7767 DBUG_RETURN(0);
7768 }
7769
append_table_name_with_adjusting(spider_string * str,int all_link_idx)7770 int spider_mbase_share::append_table_name_with_adjusting(
7771 spider_string *str,
7772 int all_link_idx
7773 ) {
7774 const char *db_nm = db_names_str[all_link_idx].ptr();
7775 uint db_nm_len = db_names_str[all_link_idx].length();
7776 uint db_nm_max_len = db_nm_max_length;
7777 const char *table_nm = table_names_str[all_link_idx].ptr();
7778 uint table_nm_len = table_names_str[all_link_idx].length();
7779 uint table_nm_max_len = table_nm_max_length;
7780 DBUG_ENTER("spider_mbase_share::append_table_name_with_adjusting");
7781 DBUG_PRINT("info",("spider this=%p", this));
7782 spider_db_mbase_utility->append_name(str, db_nm, db_nm_len);
7783 str->q_append(SPIDER_SQL_DOT_STR, SPIDER_SQL_DOT_LEN);
7784 spider_db_mbase_utility->append_name(str, table_nm, table_nm_len);
7785 uint length =
7786 db_nm_max_len - db_nm_len +
7787 table_nm_max_len - table_nm_len;
7788 memset((char *) str->ptr() + str->length(), ' ', length);
7789 str->length(str->length() + length);
7790 DBUG_RETURN(0);
7791 }
7792
append_from_with_adjusted_table_name(spider_string * str,int * table_name_pos)7793 int spider_mbase_share::append_from_with_adjusted_table_name(
7794 spider_string *str,
7795 int *table_name_pos
7796 ) {
7797 const char *db_nm = db_names_str[0].ptr();
7798 uint db_nm_len = db_names_str[0].length();
7799 uint db_nm_max_len = db_nm_max_length;
7800 const char *table_nm = table_names_str[0].ptr();
7801 uint table_nm_len = table_names_str[0].length();
7802 uint table_nm_max_len = table_nm_max_length;
7803 DBUG_ENTER("spider_mbase_share::append_from_with_adjusted_table_name");
7804 DBUG_PRINT("info",("spider this=%p", this));
7805 if (str->reserve(SPIDER_SQL_FROM_LEN + db_nm_max_length +
7806 SPIDER_SQL_DOT_LEN + table_nm_max_length +
7807 /* SPIDER_SQL_NAME_QUOTE_LEN */ 4))
7808 {
7809 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7810 }
7811 str->q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN);
7812 *table_name_pos = str->length();
7813 spider_db_mbase_utility->append_name(str, db_nm, db_nm_len);
7814 str->q_append(SPIDER_SQL_DOT_STR, SPIDER_SQL_DOT_LEN);
7815 spider_db_mbase_utility->append_name(str, table_nm, table_nm_len);
7816 uint length =
7817 db_nm_max_len - db_nm_len +
7818 table_nm_max_len - table_nm_len;
7819 memset((char *) str->ptr() + str->length(), ' ', length);
7820 str->length(str->length() + length);
7821 DBUG_RETURN(0);
7822 }
7823
create_table_names_str()7824 int spider_mbase_share::create_table_names_str()
7825 {
7826 int error_num, roop_count;
7827 uint table_nm_len, db_nm_len;
7828 spider_string *str, *first_tbl_nm_str, *first_db_nm_str, *first_db_tbl_str;
7829 char *first_tbl_nm, *first_db_nm;
7830 DBUG_ENTER("spider_mbase_share::create_table_names_str");
7831 table_names_str = NULL;
7832 db_names_str = NULL;
7833 db_table_str = NULL;
7834 if (
7835 !(table_names_str = new spider_string[spider_share->all_link_count]) ||
7836 !(db_names_str = new spider_string[spider_share->all_link_count]) ||
7837 !(db_table_str = new spider_string[spider_share->all_link_count])
7838 ) {
7839 error_num = HA_ERR_OUT_OF_MEM;
7840 goto error;
7841 }
7842
7843 same_db_table_name = TRUE;
7844 first_tbl_nm = spider_share->tgt_table_names[0];
7845 first_db_nm = spider_share->tgt_dbs[0];
7846 table_nm_len = spider_share->tgt_table_names_lengths[0];
7847 db_nm_len = spider_share->tgt_dbs_lengths[0];
7848 first_tbl_nm_str = &table_names_str[0];
7849 first_db_nm_str = &db_names_str[0];
7850 first_db_tbl_str = &db_table_str[0];
7851 for (roop_count = 0; roop_count < (int) spider_share->all_link_count;
7852 roop_count++)
7853 {
7854 table_names_str[roop_count].init_calc_mem(86);
7855 db_names_str[roop_count].init_calc_mem(87);
7856 db_table_str[roop_count].init_calc_mem(88);
7857 if (spider_share->sql_dbton_ids[roop_count] != dbton_id)
7858 continue;
7859 if (first_all_link_idx == -1)
7860 first_all_link_idx = roop_count;
7861
7862 str = &table_names_str[roop_count];
7863 if (
7864 roop_count != 0 &&
7865 same_db_table_name &&
7866 spider_share->tgt_table_names_lengths[roop_count] == table_nm_len &&
7867 !memcmp(first_tbl_nm, spider_share->tgt_table_names[roop_count],
7868 table_nm_len)
7869 ) {
7870 if (str->copy(*first_tbl_nm_str))
7871 {
7872 error_num = HA_ERR_OUT_OF_MEM;
7873 goto error;
7874 }
7875 } else {
7876 str->set_charset(spider_share->access_charset);
7877 if ((error_num = spider_db_append_name_with_quote_str(str,
7878 spider_share->tgt_table_names[roop_count], dbton_id)))
7879 goto error;
7880 if (roop_count)
7881 {
7882 same_db_table_name = FALSE;
7883 DBUG_PRINT("info", ("spider found different table name %s",
7884 spider_share->tgt_table_names[roop_count]));
7885 if (str->length() > table_nm_max_length)
7886 table_nm_max_length = str->length();
7887 } else
7888 table_nm_max_length = str->length();
7889 }
7890
7891 str = &db_names_str[roop_count];
7892 if (
7893 roop_count != 0 &&
7894 same_db_table_name &&
7895 spider_share->tgt_dbs_lengths[roop_count] == db_nm_len &&
7896 !memcmp(first_db_nm, spider_share->tgt_dbs[roop_count],
7897 db_nm_len)
7898 ) {
7899 if (str->copy(*first_db_nm_str))
7900 {
7901 error_num = HA_ERR_OUT_OF_MEM;
7902 goto error;
7903 }
7904 } else {
7905 str->set_charset(spider_share->access_charset);
7906 if ((error_num = spider_db_append_name_with_quote_str(str,
7907 spider_share->tgt_dbs[roop_count], dbton_id)))
7908 goto error;
7909 if (roop_count)
7910 {
7911 same_db_table_name = FALSE;
7912 DBUG_PRINT("info", ("spider found different db name %s",
7913 spider_share->tgt_dbs[roop_count]));
7914 if (str->length() > db_nm_max_length)
7915 db_nm_max_length = str->length();
7916 } else
7917 db_nm_max_length = str->length();
7918 }
7919
7920 str = &db_table_str[roop_count];
7921 if (
7922 roop_count != 0 &&
7923 same_db_table_name
7924 ) {
7925 if (str->copy(*first_db_tbl_str))
7926 {
7927 error_num = HA_ERR_OUT_OF_MEM;
7928 goto error;
7929 }
7930 } else {
7931 str->set_charset(spider_share->access_charset);
7932 if ((error_num = append_table_name(str, roop_count)))
7933 goto error;
7934 }
7935 #ifdef SPIDER_HAS_HASH_VALUE_TYPE
7936 db_table_str_hash_value[roop_count] = my_calc_hash(
7937 &spider_open_connections, (uchar*) str->ptr(), str->length());
7938 #endif
7939 }
7940 DBUG_RETURN(0);
7941
7942 error:
7943 if (db_table_str)
7944 {
7945 delete [] db_table_str;
7946 db_table_str = NULL;
7947 }
7948 if (db_names_str)
7949 {
7950 delete [] db_names_str;
7951 db_names_str = NULL;
7952 }
7953 if (table_names_str)
7954 {
7955 delete [] table_names_str;
7956 table_names_str = NULL;
7957 }
7958 DBUG_RETURN(error_num);
7959 }
7960
free_table_names_str()7961 void spider_mbase_share::free_table_names_str()
7962 {
7963 DBUG_ENTER("spider_mbase_share::free_table_names_str");
7964 if (db_table_str)
7965 {
7966 delete [] db_table_str;
7967 db_table_str = NULL;
7968 }
7969 if (db_names_str)
7970 {
7971 delete [] db_names_str;
7972 db_names_str = NULL;
7973 }
7974 if (table_names_str)
7975 {
7976 delete [] table_names_str;
7977 table_names_str = NULL;
7978 }
7979 DBUG_VOID_RETURN;
7980 }
7981
create_column_name_str()7982 int spider_mbase_share::create_column_name_str()
7983 {
7984 spider_string *str;
7985 int error_num;
7986 Field **field;
7987 TABLE_SHARE *table_share = spider_share->table_share;
7988 DBUG_ENTER("spider_mbase_share::create_column_name_str");
7989 if (
7990 table_share->fields &&
7991 !(column_name_str = new spider_string[table_share->fields])
7992 )
7993 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
7994 for (field = table_share->field, str = column_name_str;
7995 *field; field++, str++)
7996 {
7997 str->init_calc_mem(89);
7998 str->set_charset(spider_share->access_charset);
7999 if ((error_num = spider_db_append_name_with_quote_str(str,
8000 (*field)->field_name, dbton_id)))
8001 goto error;
8002 }
8003 DBUG_RETURN(0);
8004
8005 error:
8006 if (column_name_str)
8007 {
8008 delete [] column_name_str;
8009 column_name_str = NULL;
8010 }
8011 DBUG_RETURN(error_num);
8012 }
8013
free_column_name_str()8014 void spider_mbase_share::free_column_name_str()
8015 {
8016 DBUG_ENTER("spider_mbase_share::free_column_name_str");
8017 if (column_name_str)
8018 {
8019 delete [] column_name_str;
8020 column_name_str = NULL;
8021 }
8022 DBUG_VOID_RETURN;
8023 }
8024
convert_key_hint_str()8025 int spider_mbase_share::convert_key_hint_str()
8026 {
8027 spider_string *tmp_key_hint;
8028 int roop_count;
8029 TABLE_SHARE *table_share = spider_share->table_share;
8030 DBUG_ENTER("spider_mbase_share::convert_key_hint_str");
8031 if (spider_share->access_charset->cset != system_charset_info->cset)
8032 {
8033 /* need conversion */
8034 for (roop_count = 0, tmp_key_hint = key_hint;
8035 roop_count < (int) table_share->keys; roop_count++, tmp_key_hint++)
8036 {
8037 tmp_key_hint->length(0);
8038 if (tmp_key_hint->append(spider_share->key_hint->ptr(),
8039 spider_share->key_hint->length(), system_charset_info))
8040 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
8041 }
8042 } else {
8043 for (roop_count = 0, tmp_key_hint = key_hint;
8044 roop_count < (int) table_share->keys; roop_count++, tmp_key_hint++)
8045 {
8046 if (tmp_key_hint->copy(spider_share->key_hint[roop_count]))
8047 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
8048 }
8049 }
8050 DBUG_RETURN(0);
8051 }
8052
append_show_table_status()8053 int spider_mbase_share::append_show_table_status()
8054 {
8055 int roop_count;
8056 spider_string *str;
8057 DBUG_ENTER("spider_mysql_append_show_table_status");
8058 if (!(show_table_status =
8059 new spider_string[2 * spider_share->all_link_count]))
8060 goto error;
8061
8062 for (roop_count = 0; roop_count < (int) spider_share->all_link_count;
8063 roop_count++)
8064 {
8065 show_table_status[0 + (2 * roop_count)].init_calc_mem(90);
8066 show_table_status[1 + (2 * roop_count)].init_calc_mem(91);
8067 if (spider_share->sql_dbton_ids[roop_count] != dbton_id)
8068 continue;
8069
8070 if (
8071 show_table_status[0 + (2 * roop_count)].reserve(
8072 SPIDER_SQL_SHOW_TABLE_STATUS_LEN +
8073 db_names_str[roop_count].length() +
8074 SPIDER_SQL_LIKE_LEN + table_names_str[roop_count].length() +
8075 ((SPIDER_SQL_NAME_QUOTE_LEN) * 2) +
8076 ((SPIDER_SQL_VALUE_QUOTE_LEN) * 2)) ||
8077 show_table_status[1 + (2 * roop_count)].reserve(
8078 SPIDER_SQL_SELECT_TABLES_STATUS_LEN +
8079 db_names_str[roop_count].length() +
8080 SPIDER_SQL_AND_LEN + SPIDER_SQL_TABLE_NAME_LEN + SPIDER_SQL_EQUAL_LEN +
8081 table_names_str[roop_count].length() +
8082 ((SPIDER_SQL_VALUE_QUOTE_LEN) * 4))
8083 )
8084 goto error;
8085 str = &show_table_status[0 + (2 * roop_count)];
8086 str->q_append(
8087 SPIDER_SQL_SHOW_TABLE_STATUS_STR, SPIDER_SQL_SHOW_TABLE_STATUS_LEN);
8088 str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
8089 str->q_append(db_names_str[roop_count].ptr(),
8090 db_names_str[roop_count].length());
8091 str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
8092 str->q_append(SPIDER_SQL_LIKE_STR, SPIDER_SQL_LIKE_LEN);
8093 str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
8094 str->q_append(table_names_str[roop_count].ptr(),
8095 table_names_str[roop_count].length());
8096 str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
8097 str = &show_table_status[1 + (2 * roop_count)];
8098 str->q_append(
8099 SPIDER_SQL_SELECT_TABLES_STATUS_STR,
8100 SPIDER_SQL_SELECT_TABLES_STATUS_LEN);
8101 str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
8102 str->q_append(db_names_str[roop_count].ptr(),
8103 db_names_str[roop_count].length());
8104 str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
8105 str->q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN);
8106 str->q_append(SPIDER_SQL_TABLE_NAME_STR, SPIDER_SQL_TABLE_NAME_LEN);
8107 str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
8108 str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
8109 str->q_append(table_names_str[roop_count].ptr(),
8110 table_names_str[roop_count].length());
8111 str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
8112 }
8113 DBUG_RETURN(0);
8114
8115 error:
8116 if (show_table_status)
8117 {
8118 delete [] show_table_status;
8119 show_table_status = NULL;
8120 }
8121 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
8122 }
8123
free_show_table_status()8124 void spider_mbase_share::free_show_table_status()
8125 {
8126 DBUG_ENTER("spider_mysql_free_show_table_status");
8127 if (show_table_status)
8128 {
8129 delete [] show_table_status;
8130 show_table_status = NULL;
8131 }
8132 DBUG_VOID_RETURN;
8133 }
8134
append_show_records()8135 int spider_mbase_share::append_show_records()
8136 {
8137 int roop_count;
8138 spider_string *str;
8139 DBUG_ENTER("spider_mbase_share::append_show_records");
8140 if (!(show_records = new spider_string[spider_share->all_link_count]))
8141 goto error;
8142
8143 for (roop_count = 0; roop_count < (int) spider_share->all_link_count;
8144 roop_count++)
8145 {
8146 show_records[roop_count].init_calc_mem(92);
8147 if (spider_share->sql_dbton_ids[roop_count] != dbton_id)
8148 continue;
8149
8150 if (
8151 show_records[roop_count].reserve(
8152 SPIDER_SQL_SHOW_RECORDS_LEN +
8153 db_names_str[roop_count].length() +
8154 SPIDER_SQL_DOT_LEN +
8155 table_names_str[roop_count].length() +
8156 /* SPIDER_SQL_NAME_QUOTE_LEN */ 4)
8157 )
8158 goto error;
8159 str = &show_records[roop_count];
8160 str->q_append(SPIDER_SQL_SHOW_RECORDS_STR, SPIDER_SQL_SHOW_RECORDS_LEN);
8161 append_table_name(str, roop_count);
8162 }
8163 DBUG_RETURN(0);
8164
8165 error:
8166 if (show_records)
8167 {
8168 delete [] show_records;
8169 show_records = NULL;
8170 }
8171 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
8172 }
8173
free_show_records()8174 void spider_mbase_share::free_show_records()
8175 {
8176 DBUG_ENTER("spider_mbase_share::free_show_records");
8177 if (show_records)
8178 {
8179 delete [] show_records;
8180 show_records = NULL;
8181 }
8182 DBUG_VOID_RETURN;
8183 }
8184
append_show_index()8185 int spider_mbase_share::append_show_index()
8186 {
8187 int roop_count;
8188 spider_string *str;
8189 DBUG_ENTER("spider_mbase_share::append_show_index");
8190 if (!(show_index = new spider_string[2 * spider_share->all_link_count]))
8191 goto error;
8192
8193 for (roop_count = 0; roop_count < (int) spider_share->all_link_count;
8194 roop_count++)
8195 {
8196 show_index[0 + (2 * roop_count)].init_calc_mem(93);
8197 show_index[1 + (2 * roop_count)].init_calc_mem(94);
8198 if (spider_share->sql_dbton_ids[roop_count] != dbton_id)
8199 continue;
8200
8201 if (
8202 show_index[0 + (2 * roop_count)].reserve(
8203 SPIDER_SQL_SHOW_INDEX_LEN + db_names_str[roop_count].length() +
8204 SPIDER_SQL_DOT_LEN +
8205 table_names_str[roop_count].length() +
8206 /* SPIDER_SQL_NAME_QUOTE_LEN */ 4) ||
8207 show_index[1 + (2 * roop_count)].reserve(
8208 SPIDER_SQL_SELECT_STATISTICS_LEN +
8209 db_names_str[roop_count].length() +
8210 SPIDER_SQL_AND_LEN + SPIDER_SQL_TABLE_NAME_LEN + SPIDER_SQL_EQUAL_LEN +
8211 table_names_str[roop_count].length() +
8212 ((SPIDER_SQL_VALUE_QUOTE_LEN) * 4) +
8213 SPIDER_SQL_GROUP_LEN + SPIDER_SQL_COLUMN_NAME_LEN)
8214 )
8215 goto error;
8216 str = &show_index[0 + (2 * roop_count)];
8217 str->q_append(
8218 SPIDER_SQL_SHOW_INDEX_STR, SPIDER_SQL_SHOW_INDEX_LEN);
8219 append_table_name(str, roop_count);
8220 str = &show_index[1 + (2 * roop_count)];
8221 str->q_append(
8222 SPIDER_SQL_SELECT_STATISTICS_STR, SPIDER_SQL_SELECT_STATISTICS_LEN);
8223 str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
8224 str->q_append(db_names_str[roop_count].ptr(),
8225 db_names_str[roop_count].length());
8226 str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
8227 str->q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN);
8228 str->q_append(SPIDER_SQL_TABLE_NAME_STR, SPIDER_SQL_TABLE_NAME_LEN);
8229 str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
8230 str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
8231 str->q_append(table_names_str[roop_count].ptr(),
8232 table_names_str[roop_count].length());
8233 str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
8234 str->q_append(SPIDER_SQL_GROUP_STR, SPIDER_SQL_GROUP_LEN);
8235 str->q_append(SPIDER_SQL_COLUMN_NAME_STR, SPIDER_SQL_COLUMN_NAME_LEN);
8236 }
8237 DBUG_RETURN(0);
8238
8239 error:
8240 if (show_index)
8241 {
8242 delete [] show_index;
8243 show_index = NULL;
8244 }
8245 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
8246 }
8247
free_show_index()8248 void spider_mbase_share::free_show_index()
8249 {
8250 DBUG_ENTER("spider_mbase_share::free_show_index");
8251 if (show_index)
8252 {
8253 delete [] show_index;
8254 show_index = NULL;
8255 }
8256 DBUG_VOID_RETURN;
8257 }
8258
append_table_select()8259 int spider_mbase_share::append_table_select()
8260 {
8261 Field **field;
8262 uint field_length;
8263 spider_string *str = table_select;
8264 TABLE_SHARE *table_share = spider_share->table_share;
8265 DBUG_ENTER("spider_mbase_share::append_table_select");
8266
8267 if (!*table_share->field)
8268 DBUG_RETURN(0);
8269
8270 for (field = table_share->field; *field; field++)
8271 {
8272 field_length = column_name_str[(*field)->field_index].length();
8273 if (str->reserve(field_length +
8274 /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
8275 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
8276 append_column_name(str, (*field)->field_index);
8277 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
8278 }
8279 str->length(str->length() - SPIDER_SQL_COMMA_LEN);
8280 DBUG_RETURN(append_from_with_adjusted_table_name(str, &table_select_pos));
8281 }
8282
append_key_select(uint idx)8283 int spider_mbase_share::append_key_select(
8284 uint idx
8285 ) {
8286 KEY_PART_INFO *key_part;
8287 Field *field;
8288 uint part_num;
8289 uint field_length;
8290 spider_string *str = &key_select[idx];
8291 TABLE_SHARE *table_share = spider_share->table_share;
8292 const KEY *key_info = &table_share->key_info[idx];
8293 DBUG_ENTER("spider_mbase_share::append_key_select");
8294
8295 if (!spider_user_defined_key_parts(key_info))
8296 DBUG_RETURN(0);
8297
8298 for (key_part = key_info->key_part, part_num = 0;
8299 part_num < spider_user_defined_key_parts(key_info); key_part++, part_num++)
8300 {
8301 field = key_part->field;
8302 field_length = column_name_str[field->field_index].length();
8303 if (str->reserve(field_length +
8304 /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
8305 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
8306 append_column_name(str, field->field_index);
8307 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
8308 }
8309 str->length(str->length() - SPIDER_SQL_COMMA_LEN);
8310 DBUG_RETURN(append_from_with_adjusted_table_name(str, &key_select_pos[idx]));
8311 }
8312
need_change_db_table_name()8313 bool spider_mbase_share::need_change_db_table_name()
8314 {
8315 DBUG_ENTER("spider_mbase_share::need_change_db_table_name");
8316 DBUG_RETURN(!same_db_table_name);
8317 }
8318
8319 #ifdef SPIDER_HAS_DISCOVER_TABLE_STRUCTURE
discover_table_structure(SPIDER_TRX * trx,SPIDER_SHARE * spider_share,spider_string * str)8320 int spider_mbase_share::discover_table_structure(
8321 SPIDER_TRX *trx,
8322 SPIDER_SHARE *spider_share,
8323 spider_string *str
8324 ) {
8325 int roop_count, error_num = HA_ERR_WRONG_COMMAND;
8326 char sql_buf[MAX_FIELD_WIDTH];
8327 spider_string sql_str(sql_buf, sizeof(sql_buf), system_charset_info);
8328 uint strlen = str->length();
8329 DBUG_ENTER("spider_mbase_share::discover_table_structure");
8330 DBUG_PRINT("info",("spider this=%p", this));
8331 sql_str.init_calc_mem(228);
8332 for (roop_count = 0; roop_count < (int) spider_share->all_link_count;
8333 roop_count++)
8334 {
8335 if (spider_share->sql_dbton_ids[roop_count] != dbton_id)
8336 {
8337 DBUG_PRINT("info",("spider spider_share->sql_dbton_ids[%d]=%u",
8338 roop_count, spider_share->sql_dbton_ids[roop_count]));
8339 DBUG_PRINT("info",("spider dbton_id=%u", dbton_id));
8340 continue;
8341 }
8342
8343 str->length(strlen);
8344 sql_str.length(0);
8345 if (sql_str.reserve(
8346 SPIDER_SQL_SELECT_COLUMNS_LEN + db_names_str[roop_count].length() +
8347 SPIDER_SQL_AND_LEN + SPIDER_SQL_TABLE_NAME_LEN + SPIDER_SQL_EQUAL_LEN +
8348 table_names_str[roop_count].length() + SPIDER_SQL_ORDER_LEN +
8349 SPIDER_SQL_ORDINAL_POSITION_LEN +
8350 /* SPIDER_SQL_VALUE_QUOTE_LEN */ 8 +
8351 SPIDER_SQL_SEMICOLON_LEN +
8352 SPIDER_SQL_SHOW_INDEX_LEN + db_names_str[roop_count].length() +
8353 SPIDER_SQL_DOT_LEN + table_names_str[roop_count].length() +
8354 /* SPIDER_SQL_NAME_QUOTE_LEN */ 4 +
8355 SPIDER_SQL_SEMICOLON_LEN +
8356 SPIDER_SQL_SHOW_TABLE_STATUS_LEN + db_names_str[roop_count].length() +
8357 SPIDER_SQL_LIKE_LEN + table_names_str[roop_count].length() +
8358 /* SPIDER_SQL_NAME_QUOTE_LEN */ 4
8359 )) {
8360 DBUG_PRINT("info",("spider alloc sql_str error"));
8361 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
8362 }
8363 sql_str.q_append(SPIDER_SQL_SELECT_COLUMNS_STR,
8364 SPIDER_SQL_SELECT_COLUMNS_LEN);
8365 sql_str.q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
8366 sql_str.q_append(db_names_str[roop_count].ptr(),
8367 db_names_str[roop_count].length());
8368 sql_str.q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
8369 sql_str.q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN);
8370 sql_str.q_append(SPIDER_SQL_TABLE_NAME_STR, SPIDER_SQL_TABLE_NAME_LEN);
8371 sql_str.q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
8372 sql_str.q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
8373 sql_str.q_append(table_names_str[roop_count].ptr(),
8374 table_names_str[roop_count].length());
8375 sql_str.q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
8376 sql_str.q_append(SPIDER_SQL_ORDER_STR, SPIDER_SQL_ORDER_LEN);
8377 sql_str.q_append(SPIDER_SQL_ORDINAL_POSITION_STR,
8378 SPIDER_SQL_ORDINAL_POSITION_LEN);
8379 sql_str.q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
8380 sql_str.q_append(SPIDER_SQL_SHOW_INDEX_STR, SPIDER_SQL_SHOW_INDEX_LEN);
8381 append_table_name(&sql_str, roop_count);
8382 sql_str.q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
8383 sql_str.q_append(
8384 SPIDER_SQL_SHOW_TABLE_STATUS_STR, SPIDER_SQL_SHOW_TABLE_STATUS_LEN);
8385 sql_str.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
8386 sql_str.q_append(db_names_str[roop_count].ptr(),
8387 db_names_str[roop_count].length());
8388 sql_str.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
8389 sql_str.q_append(SPIDER_SQL_LIKE_STR, SPIDER_SQL_LIKE_LEN);
8390 sql_str.q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
8391 sql_str.q_append(table_names_str[roop_count].ptr(),
8392 table_names_str[roop_count].length());
8393 sql_str.q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
8394
8395 SPIDER_CONN *conn;
8396 int need_mon;
8397 if (!(conn = spider_get_conn(
8398 spider_share, 0, spider_share->conn_keys[roop_count], trx, NULL, FALSE,
8399 FALSE, SPIDER_CONN_KIND_MYSQL, &error_num))
8400 ) {
8401 DBUG_RETURN(error_num);
8402 }
8403 pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
8404 pthread_mutex_lock(&conn->mta_conn_mutex);
8405 SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
8406 conn->need_mon = &need_mon;
8407 DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
8408 DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
8409 conn->mta_conn_mutex_lock_already = TRUE;
8410 conn->mta_conn_mutex_unlock_later = TRUE;
8411 if (!conn->disable_reconnect)
8412 {
8413 ha_spider tmp_spider;
8414 int need_mon = 0;
8415 uint tmp_conn_link_idx = 0;
8416 tmp_spider.trx = trx;
8417 tmp_spider.share = spider_share;
8418 tmp_spider.need_mons = &need_mon;
8419 tmp_spider.conn_link_idx = &tmp_conn_link_idx;
8420 if ((error_num = spider_db_ping(&tmp_spider, conn, 0)))
8421 {
8422 DBUG_PRINT("info",("spider spider_db_ping error"));
8423 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
8424 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
8425 conn->mta_conn_mutex_lock_already = FALSE;
8426 conn->mta_conn_mutex_unlock_later = FALSE;
8427 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
8428 pthread_mutex_unlock(&conn->mta_conn_mutex);
8429 continue;
8430 }
8431 }
8432 spider_conn_set_timeout_from_share(conn, roop_count, trx->thd,
8433 spider_share);
8434 if (
8435 (error_num = spider_db_set_names_internal(trx, spider_share, conn,
8436 roop_count, &need_mon)) ||
8437 (
8438 spider_db_query(
8439 conn,
8440 sql_str.ptr(),
8441 sql_str.length(),
8442 -1,
8443 &need_mon) &&
8444 (error_num = spider_db_errorno(conn))
8445 )
8446 ) {
8447 DBUG_PRINT("info",("spider spider_get_trx error"));
8448 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
8449 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
8450 conn->mta_conn_mutex_lock_already = FALSE;
8451 conn->mta_conn_mutex_unlock_later = FALSE;
8452 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
8453 pthread_mutex_unlock(&conn->mta_conn_mutex);
8454 continue;
8455 }
8456 st_spider_db_request_key request_key;
8457 request_key.spider_thread_id = trx->spider_thread_id;
8458 request_key.query_id = trx->thd->query_id;
8459 request_key.handler = NULL;
8460 request_key.request_id = 1;
8461 request_key.next = NULL;
8462 spider_db_result *res;
8463 /* get column list */
8464 if (!(res = conn->db_conn->store_result(NULL, &request_key, &error_num)))
8465 {
8466 if (error_num || (error_num = spider_db_errorno(conn)))
8467 {
8468 DBUG_PRINT("info",("spider column store error"));
8469 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
8470 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
8471 conn->mta_conn_mutex_lock_already = FALSE;
8472 conn->mta_conn_mutex_unlock_later = FALSE;
8473 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
8474 pthread_mutex_unlock(&conn->mta_conn_mutex);
8475 continue;
8476 }
8477 /* no record */
8478 DBUG_PRINT("info",("spider column no record error"));
8479 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
8480 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
8481 conn->mta_conn_mutex_lock_already = FALSE;
8482 conn->mta_conn_mutex_unlock_later = FALSE;
8483 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
8484 pthread_mutex_unlock(&conn->mta_conn_mutex);
8485 continue;
8486 }
8487 if ((error_num = res->fetch_columns_for_discover_table_structure(str,
8488 spider_share->access_charset)))
8489 {
8490 DBUG_PRINT("info",("spider column fetch error"));
8491 res->free_result();
8492 delete res;
8493 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
8494 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
8495 conn->mta_conn_mutex_lock_already = FALSE;
8496 conn->mta_conn_mutex_unlock_later = FALSE;
8497 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
8498 pthread_mutex_unlock(&conn->mta_conn_mutex);
8499 my_printf_error(ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM,
8500 ER_SPIDER_REMOTE_TABLE_NOT_FOUND_STR, MYF(0),
8501 db_names_str[roop_count].ptr(),
8502 table_names_str[roop_count].ptr());
8503 error_num = ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM;
8504 continue;
8505 }
8506 res->free_result();
8507 delete res;
8508 if (conn->db_conn->next_result())
8509 {
8510 DBUG_PRINT("info",("spider single result error"));
8511 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
8512 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
8513 conn->mta_conn_mutex_lock_already = FALSE;
8514 conn->mta_conn_mutex_unlock_later = FALSE;
8515 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
8516 pthread_mutex_unlock(&conn->mta_conn_mutex);
8517 continue;
8518 }
8519 /* get index list */
8520 if (!(res = conn->db_conn->store_result(NULL, &request_key, &error_num)))
8521 {
8522 if (error_num || (error_num = spider_db_errorno(conn)))
8523 {
8524 DBUG_PRINT("info",("spider index store error"));
8525 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
8526 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
8527 conn->mta_conn_mutex_lock_already = FALSE;
8528 conn->mta_conn_mutex_unlock_later = FALSE;
8529 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
8530 pthread_mutex_unlock(&conn->mta_conn_mutex);
8531 continue;
8532 }
8533 /* no record */
8534 DBUG_PRINT("info",("spider index no record error"));
8535 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
8536 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
8537 conn->mta_conn_mutex_lock_already = FALSE;
8538 conn->mta_conn_mutex_unlock_later = FALSE;
8539 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
8540 pthread_mutex_unlock(&conn->mta_conn_mutex);
8541 continue;
8542 }
8543 if ((error_num = res->fetch_index_for_discover_table_structure(str,
8544 spider_share->access_charset)))
8545 {
8546 DBUG_PRINT("info",("spider index fetch error"));
8547 res->free_result();
8548 delete res;
8549 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
8550 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
8551 conn->mta_conn_mutex_lock_already = FALSE;
8552 conn->mta_conn_mutex_unlock_later = FALSE;
8553 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
8554 pthread_mutex_unlock(&conn->mta_conn_mutex);
8555 continue;
8556 }
8557 res->free_result();
8558 delete res;
8559 if (conn->db_conn->next_result())
8560 {
8561 DBUG_PRINT("info",("spider dual result error"));
8562 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
8563 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
8564 conn->mta_conn_mutex_lock_already = FALSE;
8565 conn->mta_conn_mutex_unlock_later = FALSE;
8566 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
8567 pthread_mutex_unlock(&conn->mta_conn_mutex);
8568 continue;
8569 }
8570 /* get table info */
8571 if (!(res = conn->db_conn->store_result(NULL, &request_key, &error_num)))
8572 {
8573 if (error_num || (error_num = spider_db_errorno(conn)))
8574 {
8575 DBUG_PRINT("info",("spider table store error"));
8576 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
8577 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
8578 conn->mta_conn_mutex_lock_already = FALSE;
8579 conn->mta_conn_mutex_unlock_later = FALSE;
8580 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
8581 pthread_mutex_unlock(&conn->mta_conn_mutex);
8582 continue;
8583 }
8584 /* no record */
8585 DBUG_PRINT("info",("spider table no record error"));
8586 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
8587 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
8588 conn->mta_conn_mutex_lock_already = FALSE;
8589 conn->mta_conn_mutex_unlock_later = FALSE;
8590 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
8591 pthread_mutex_unlock(&conn->mta_conn_mutex);
8592 continue;
8593 }
8594 if ((error_num = res->fetch_table_for_discover_table_structure(str,
8595 spider_share, spider_share->access_charset)))
8596 {
8597 DBUG_PRINT("info",("spider table fetch error"));
8598 res->free_result();
8599 delete res;
8600 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
8601 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
8602 conn->mta_conn_mutex_lock_already = FALSE;
8603 conn->mta_conn_mutex_unlock_later = FALSE;
8604 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
8605 pthread_mutex_unlock(&conn->mta_conn_mutex);
8606 continue;
8607 }
8608 res->free_result();
8609 delete res;
8610 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
8611 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
8612 conn->mta_conn_mutex_lock_already = FALSE;
8613 conn->mta_conn_mutex_unlock_later = FALSE;
8614 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
8615 pthread_mutex_unlock(&conn->mta_conn_mutex);
8616 if (!error_num)
8617 break;
8618 }
8619 DBUG_RETURN(error_num);
8620 }
8621 #endif
8622
8623 #ifdef HA_HAS_CHECKSUM_EXTENDED
checksum_support()8624 bool spider_mbase_share::checksum_support()
8625 {
8626 DBUG_ENTER("spider_mbase_share::checksum_support");
8627 DBUG_PRINT("info",("spider this=%p", this));
8628 DBUG_RETURN(TRUE);
8629 }
8630 #endif
8631
spider_mbase_handler(ha_spider * spider,spider_mbase_share * db_share,spider_db_mbase_util * spider_db_mbase_utility)8632 spider_mbase_handler::spider_mbase_handler(
8633 ha_spider *spider,
8634 spider_mbase_share *db_share,
8635 spider_db_mbase_util *spider_db_mbase_utility
8636 ) : spider_db_handler(
8637 spider,
8638 db_share
8639 ),
8640 spider_db_mbase_utility(spider_db_mbase_utility),
8641 where_pos(0),
8642 order_pos(0),
8643 limit_pos(0),
8644 table_name_pos(0),
8645 ha_read_pos(0),
8646 ha_next_pos(0),
8647 ha_where_pos(0),
8648 ha_limit_pos(0),
8649 ha_table_name_pos(0),
8650 insert_pos(0),
8651 insert_table_name_pos(0),
8652 upd_tmp_tbl(NULL),
8653 tmp_sql_pos1(0),
8654 tmp_sql_pos2(0),
8655 tmp_sql_pos3(0),
8656 tmp_sql_pos4(0),
8657 tmp_sql_pos5(0),
8658 reading_from_bulk_tmp_table(FALSE),
8659 union_table_name_pos_first(NULL),
8660 union_table_name_pos_current(NULL),
8661 mysql_share(db_share),
8662 link_for_hash(NULL)
8663 {
8664 DBUG_ENTER("spider_mbase_handler::spider_mbase_handler");
8665 DBUG_PRINT("info",("spider this=%p", this));
8666 spider_alloc_calc_mem_init(mem_calc, 183);
8667 spider_alloc_calc_mem(spider_current_trx, mem_calc, sizeof(*this));
8668 DBUG_VOID_RETURN;
8669 }
8670
spider_mysql_handler(ha_spider * spider,spider_mbase_share * db_share)8671 spider_mysql_handler::spider_mysql_handler(
8672 ha_spider *spider,
8673 spider_mbase_share *db_share
8674 ) : spider_mbase_handler(
8675 spider,
8676 db_share,
8677 &spider_db_mysql_utility
8678 ) {
8679 DBUG_ENTER("spider_mysql_handler::spider_mysql_handler");
8680 DBUG_PRINT("info",("spider this=%p", this));
8681 DBUG_VOID_RETURN;
8682 }
8683
spider_mariadb_handler(ha_spider * spider,spider_mbase_share * db_share)8684 spider_mariadb_handler::spider_mariadb_handler(
8685 ha_spider *spider,
8686 spider_mbase_share *db_share
8687 ) : spider_mbase_handler(
8688 spider,
8689 db_share,
8690 &spider_db_mariadb_utility
8691 ) {
8692 DBUG_ENTER("spider_mariadb_handler::spider_mariadb_handler");
8693 DBUG_PRINT("info",("spider this=%p", this));
8694 DBUG_VOID_RETURN;
8695 }
8696
~spider_mbase_handler()8697 spider_mbase_handler::~spider_mbase_handler()
8698 {
8699 DBUG_ENTER("spider_mbase_handler::~spider_mbase_handler");
8700 DBUG_PRINT("info",("spider this=%p", this));
8701 while (union_table_name_pos_first)
8702 {
8703 SPIDER_INT_HLD *tmp_pos = union_table_name_pos_first;
8704 union_table_name_pos_first = tmp_pos->next;
8705 spider_free(spider_current_trx, tmp_pos, MYF(0));
8706 }
8707 if (link_for_hash)
8708 {
8709 spider_free(spider_current_trx, link_for_hash, MYF(0));
8710 }
8711 spider_free_mem_calc(spider_current_trx, mem_calc_id, sizeof(*this));
8712 DBUG_VOID_RETURN;
8713 }
8714
~spider_mysql_handler()8715 spider_mysql_handler::~spider_mysql_handler()
8716 {
8717 DBUG_ENTER("spider_mysql_handler::~spider_mysql_handler");
8718 DBUG_PRINT("info",("spider this=%p", this));
8719 DBUG_VOID_RETURN;
8720 }
8721
~spider_mariadb_handler()8722 spider_mariadb_handler::~spider_mariadb_handler()
8723 {
8724 DBUG_ENTER("spider_mariadb_handler::~spider_mariadb_handler");
8725 DBUG_PRINT("info",("spider this=%p", this));
8726 DBUG_VOID_RETURN;
8727 }
8728
init()8729 int spider_mbase_handler::init()
8730 {
8731 uint roop_count;
8732 THD *thd = spider->trx->thd;
8733 st_spider_share *share = spider->share;
8734 int init_sql_alloc_size =
8735 spider_param_init_sql_alloc_size(thd, share->init_sql_alloc_size);
8736 TABLE *table = spider->get_table();
8737 DBUG_ENTER("spider_mbase_handler::init");
8738 DBUG_PRINT("info",("spider this=%p", this));
8739 sql.init_calc_mem(59);
8740 sql_part.init_calc_mem(60);
8741 sql_part2.init_calc_mem(61);
8742 ha_sql.init_calc_mem(62);
8743 insert_sql.init_calc_mem(64);
8744 update_sql.init_calc_mem(65);
8745 tmp_sql.init_calc_mem(66);
8746 dup_update_sql.init_calc_mem(166);
8747 if (
8748 (sql.real_alloc(init_sql_alloc_size)) ||
8749 (insert_sql.real_alloc(init_sql_alloc_size)) ||
8750 (update_sql.real_alloc(init_sql_alloc_size)) ||
8751 (tmp_sql.real_alloc(init_sql_alloc_size))
8752 ) {
8753 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
8754 }
8755 sql.set_charset(share->access_charset);
8756 sql_part.set_charset(share->access_charset);
8757 sql_part2.set_charset(share->access_charset);
8758 ha_sql.set_charset(share->access_charset);
8759 insert_sql.set_charset(share->access_charset);
8760 update_sql.set_charset(share->access_charset);
8761 tmp_sql.set_charset(share->access_charset);
8762 dup_update_sql.set_charset(share->access_charset);
8763 upd_tmp_tbl_prm.init();
8764 upd_tmp_tbl_prm.field_count = 1;
8765 if (!(link_for_hash = (SPIDER_LINK_FOR_HASH *)
8766 spider_bulk_alloc_mem(spider_current_trx, 141,
8767 __func__, __FILE__, __LINE__, MYF(MY_WME | MY_ZEROFILL),
8768 &link_for_hash,
8769 sizeof(SPIDER_LINK_FOR_HASH) * share->link_count,
8770 &minimum_select_bitmap,
8771 table ? sizeof(uchar) * no_bytes_in_map(table->read_set) : 0,
8772 NullS))
8773 ) {
8774 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
8775 }
8776 for (roop_count = 0; roop_count < share->link_count; roop_count++)
8777 {
8778 link_for_hash[roop_count].spider = spider;
8779 link_for_hash[roop_count].link_idx = roop_count;
8780 link_for_hash[roop_count].db_table_str =
8781 &mysql_share->db_table_str[roop_count];
8782 #ifdef SPIDER_HAS_HASH_VALUE_TYPE
8783 link_for_hash[roop_count].db_table_str_hash_value =
8784 mysql_share->db_table_str_hash_value[roop_count];
8785 #endif
8786 }
8787 #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
8788 hs_upds.init();
8789 #endif
8790 DBUG_RETURN(0);
8791 }
8792
8793
append_index_hint(spider_string * str,int link_idx,ulong sql_type)8794 int spider_mbase_handler::append_index_hint(
8795 spider_string *str,
8796 int link_idx,
8797 ulong sql_type
8798 )
8799 {
8800 List<Index_hint> *index_hints = spider_get_index_hints(spider);
8801 List_iterator <Index_hint> iter(*index_hints);
8802 Index_hint *hint;
8803 // THD *thd = current_thd;
8804 int error_num = 0;
8805 DBUG_ENTER("spider_mbase_handler::append_index_hint");
8806 DBUG_PRINT("info",("spider this=%p", this));
8807
8808 while(index_hints && (hint = iter++))
8809 {
8810 // hint->print(thd, str);
8811 if (sql_type != SPIDER_SQL_TYPE_HANDLER)
8812 {
8813 switch(hint->type)
8814 {
8815 case INDEX_HINT_IGNORE:
8816 if (str->reserve(hint->key_name.length+ SPIDER_SQL_INDEX_IGNORE_LEN + SPIDER_SQL_OPEN_PAREN_LEN + SPIDER_SQL_CLOSE_PAREN_LEN))
8817 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
8818 str->q_append(SPIDER_SQL_INDEX_IGNORE_STR,SPIDER_SQL_INDEX_IGNORE_LEN);
8819 str->q_append(SPIDER_SQL_OPEN_PAREN_STR,SPIDER_SQL_OPEN_PAREN_LEN);
8820 str->q_append(hint->key_name.str, hint->key_name.length);
8821 str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,SPIDER_SQL_CLOSE_PAREN_LEN);
8822 break;
8823 case INDEX_HINT_USE:
8824 if (str->reserve(hint->key_name.length+ SPIDER_SQL_INDEX_USE_LEN + SPIDER_SQL_OPEN_PAREN_LEN + SPIDER_SQL_CLOSE_PAREN_LEN))
8825 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
8826 str->q_append(SPIDER_SQL_INDEX_USE_STR,SPIDER_SQL_INDEX_USE_LEN);
8827 str->q_append(SPIDER_SQL_OPEN_PAREN_STR,SPIDER_SQL_OPEN_PAREN_LEN);
8828 str->q_append(hint->key_name.str, hint->key_name.length);
8829 str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,SPIDER_SQL_CLOSE_PAREN_LEN);
8830 break;
8831 case INDEX_HINT_FORCE:
8832 if (str->reserve(hint->key_name.length+ SPIDER_SQL_INDEX_FORCE_LEN + SPIDER_SQL_OPEN_PAREN_LEN + SPIDER_SQL_CLOSE_PAREN_LEN))
8833 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
8834 str->q_append(SPIDER_SQL_INDEX_FORCE_STR,SPIDER_SQL_INDEX_FORCE_LEN);
8835 str->q_append(SPIDER_SQL_OPEN_PAREN_STR,SPIDER_SQL_OPEN_PAREN_LEN);
8836 str->q_append(hint->key_name.str, hint->key_name.length);
8837 str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,SPIDER_SQL_CLOSE_PAREN_LEN);
8838 break;
8839 default:
8840 // SPIDER_SQL_COMMA_STR
8841 break;
8842 }
8843 }
8844 }
8845 DBUG_RETURN(error_num);
8846 }
8847
append_table_name_with_adjusting(spider_string * str,int link_idx,ulong sql_type)8848 int spider_mbase_handler::append_table_name_with_adjusting(
8849 spider_string *str,
8850 int link_idx,
8851 ulong sql_type
8852 ) {
8853 int error_num = 0;
8854 DBUG_ENTER("spider_mbase_handler::append_table_name_with_adjusting");
8855 DBUG_PRINT("info",("spider this=%p", this));
8856 if (sql_type == SPIDER_SQL_TYPE_HANDLER)
8857 {
8858 str->q_append(spider->m_handler_cid[link_idx], SPIDER_SQL_HANDLER_CID_LEN);
8859 } else {
8860 error_num = mysql_share->append_table_name_with_adjusting(str,
8861 spider->conn_link_idx[link_idx]);
8862 }
8863 DBUG_RETURN(error_num);
8864 }
8865
append_key_column_types(const key_range * start_key,spider_string * str)8866 int spider_mbase_handler::append_key_column_types(
8867 const key_range *start_key,
8868 spider_string *str
8869 ) {
8870 SPIDER_RESULT_LIST *result_list = &spider->result_list;
8871 KEY *key_info = result_list->key_info;
8872 uint key_name_length, key_count;
8873 key_part_map full_key_part_map =
8874 make_prev_keypart_map(spider_user_defined_key_parts(key_info));
8875 key_part_map start_key_part_map;
8876 KEY_PART_INFO *key_part;
8877 Field *field;
8878 char tmp_buf[MAX_FIELD_WIDTH];
8879 spider_string tmp_str(tmp_buf, sizeof(tmp_buf), system_charset_info);
8880 DBUG_ENTER("spider_mbase_handler::append_key_column_types");
8881 DBUG_PRINT("info",("spider this=%p", this));
8882 tmp_str.init_calc_mem(115);
8883
8884 start_key_part_map = start_key->keypart_map & full_key_part_map;
8885 DBUG_PRINT("info", ("spider spider_user_defined_key_parts=%u",
8886 spider_user_defined_key_parts(key_info)));
8887 DBUG_PRINT("info", ("spider full_key_part_map=%lu", full_key_part_map));
8888 DBUG_PRINT("info", ("spider start_key_part_map=%lu", start_key_part_map));
8889
8890 if (!start_key_part_map)
8891 DBUG_RETURN(0);
8892
8893 for (
8894 key_part = key_info->key_part,
8895 key_count = 0;
8896 start_key_part_map;
8897 start_key_part_map >>= 1,
8898 key_part++,
8899 key_count++
8900 ) {
8901 field = key_part->field;
8902 key_name_length = my_sprintf(tmp_buf, (tmp_buf, "c%u", key_count));
8903 if (str->reserve(key_name_length + SPIDER_SQL_SPACE_LEN))
8904 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
8905 str->q_append(tmp_buf, key_name_length);
8906 str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
8907
8908 if (tmp_str.ptr() != tmp_buf)
8909 tmp_str.set(tmp_buf, sizeof(tmp_buf), system_charset_info);
8910 else
8911 tmp_str.set_charset(system_charset_info);
8912 field->sql_type(*tmp_str.get_str());
8913 tmp_str.mem_calc();
8914 str->append(tmp_str);
8915 if (field->has_charset())
8916 {
8917 CHARSET_INFO *cs = field->charset();
8918 uint coll_length = strlen(cs->name);
8919 if (str->reserve(SPIDER_SQL_COLLATE_LEN + coll_length))
8920 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
8921 str->q_append(SPIDER_SQL_COLLATE_STR, SPIDER_SQL_COLLATE_LEN);
8922 str->q_append(cs->name, coll_length);
8923 }
8924
8925 if (str->reserve(SPIDER_SQL_COMMA_LEN))
8926 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
8927 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
8928 }
8929 str->length(str->length() - SPIDER_SQL_COMMA_LEN);
8930
8931 DBUG_RETURN(0);
8932 }
8933
append_key_join_columns_for_bka(const key_range * start_key,spider_string * str,const char ** table_aliases,uint * table_alias_lengths)8934 int spider_mbase_handler::append_key_join_columns_for_bka(
8935 const key_range *start_key,
8936 spider_string *str,
8937 const char **table_aliases,
8938 uint *table_alias_lengths
8939 ) {
8940 KEY *key_info = spider->result_list.key_info;
8941 uint length, key_name_length, key_count;
8942 key_part_map full_key_part_map =
8943 make_prev_keypart_map(spider_user_defined_key_parts(key_info));
8944 key_part_map start_key_part_map;
8945 KEY_PART_INFO *key_part;
8946 Field *field;
8947 char tmp_buf[MAX_FIELD_WIDTH];
8948 bool start_where = ((int) str->length() == where_pos);
8949 DBUG_ENTER("spider_mbase_handler::append_key_join_columns_for_bka");
8950 DBUG_PRINT("info",("spider this=%p", this));
8951 start_key_part_map = start_key->keypart_map & full_key_part_map;
8952 DBUG_PRINT("info", ("spider spider_user_defined_key_parts=%u",
8953 spider_user_defined_key_parts(key_info)));
8954 DBUG_PRINT("info", ("spider full_key_part_map=%lu", full_key_part_map));
8955 DBUG_PRINT("info", ("spider start_key_part_map=%lu", start_key_part_map));
8956
8957 if (!start_key_part_map)
8958 DBUG_RETURN(0);
8959
8960 if (start_where)
8961 {
8962 if (str->reserve(SPIDER_SQL_WHERE_LEN))
8963 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
8964 str->q_append(SPIDER_SQL_WHERE_STR, SPIDER_SQL_WHERE_LEN);
8965 } else {
8966 if (str->reserve(SPIDER_SQL_AND_LEN))
8967 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
8968 str->q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN);
8969 }
8970
8971 for (
8972 key_part = key_info->key_part,
8973 key_count = 0;
8974 start_key_part_map;
8975 start_key_part_map >>= 1,
8976 key_part++,
8977 key_count++
8978 ) {
8979 field = key_part->field;
8980 key_name_length =
8981 mysql_share->column_name_str[field->field_index].length();
8982 length = my_sprintf(tmp_buf, (tmp_buf, "c%u", key_count));
8983 if (str->reserve(length + table_alias_lengths[0] + key_name_length +
8984 /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
8985 table_alias_lengths[1] + SPIDER_SQL_PF_EQUAL_LEN + SPIDER_SQL_AND_LEN))
8986 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
8987 str->q_append(table_aliases[0], table_alias_lengths[0]);
8988 str->q_append(tmp_buf, length);
8989 str->q_append(SPIDER_SQL_PF_EQUAL_STR, SPIDER_SQL_PF_EQUAL_LEN);
8990 str->q_append(table_aliases[1], table_alias_lengths[1]);
8991 mysql_share->append_column_name(str, field->field_index);
8992 str->q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN);
8993 }
8994 str->length(str->length() - SPIDER_SQL_AND_LEN);
8995 DBUG_RETURN(0);
8996 }
8997
append_tmp_table_and_sql_for_bka(const key_range * start_key)8998 int spider_mbase_handler::append_tmp_table_and_sql_for_bka(
8999 const key_range *start_key
9000 ) {
9001 int error_num;
9002 DBUG_ENTER("spider_mbase_handler::append_tmp_table_and_sql_for_bka");
9003 DBUG_PRINT("info",("spider this=%p", this));
9004 char tmp_table_name[MAX_FIELD_WIDTH * 2],
9005 tgt_table_name[MAX_FIELD_WIDTH * 2];
9006 int tmp_table_name_length;
9007 spider_string tgt_table_name_str(tgt_table_name, MAX_FIELD_WIDTH * 2,
9008 mysql_share->db_names_str[0].charset());
9009 const char *table_names[2], *table_aliases[2], *table_dot_aliases[2];
9010 uint table_name_lengths[2], table_alias_lengths[2],
9011 table_dot_alias_lengths[2];
9012 tgt_table_name_str.init_calc_mem(99);
9013 tgt_table_name_str.length(0);
9014 create_tmp_bka_table_name(tmp_table_name, &tmp_table_name_length,
9015 first_link_idx);
9016 if ((error_num = append_table_name_with_adjusting(&tgt_table_name_str,
9017 first_link_idx, SPIDER_SQL_TYPE_SELECT_SQL)))
9018 {
9019 DBUG_RETURN(error_num);
9020 }
9021 table_names[0] = tmp_table_name;
9022 table_names[1] = tgt_table_name_str.c_ptr_safe();
9023 table_name_lengths[0] = tmp_table_name_length;
9024 table_name_lengths[1] = tgt_table_name_str.length();
9025 table_aliases[0] = SPIDER_SQL_A_STR;
9026 table_aliases[1] = SPIDER_SQL_B_STR;
9027 table_alias_lengths[0] = SPIDER_SQL_A_LEN;
9028 table_alias_lengths[1] = SPIDER_SQL_B_LEN;
9029 table_dot_aliases[0] = SPIDER_SQL_A_DOT_STR;
9030 table_dot_aliases[1] = SPIDER_SQL_B_DOT_STR;
9031 table_dot_alias_lengths[0] = SPIDER_SQL_A_DOT_LEN;
9032 table_dot_alias_lengths[1] = SPIDER_SQL_B_DOT_LEN;
9033 if (
9034 (error_num = append_drop_tmp_bka_table(
9035 &tmp_sql, tmp_table_name, tmp_table_name_length,
9036 &tmp_sql_pos1, &tmp_sql_pos5, TRUE)) ||
9037 (error_num = append_create_tmp_bka_table(
9038 start_key,
9039 &tmp_sql, tmp_table_name,
9040 tmp_table_name_length,
9041 &tmp_sql_pos2, spider->share->table_share->table_charset)) ||
9042 (error_num = append_insert_tmp_bka_table(
9043 start_key,
9044 &tmp_sql, tmp_table_name,
9045 tmp_table_name_length, &tmp_sql_pos3))
9046 )
9047 DBUG_RETURN(error_num);
9048 tmp_sql_pos4 = tmp_sql.length();
9049 if ((error_num = spider_db_append_select(spider)))
9050 DBUG_RETURN(error_num);
9051 if (sql.reserve(SPIDER_SQL_A_DOT_LEN + SPIDER_SQL_ID_LEN +
9052 SPIDER_SQL_COMMA_LEN))
9053 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9054 sql.q_append(SPIDER_SQL_A_DOT_STR, SPIDER_SQL_A_DOT_LEN);
9055 sql.q_append(SPIDER_SQL_ID_STR, SPIDER_SQL_ID_LEN);
9056 sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
9057 if (
9058 (error_num = append_select_columns_with_alias(&sql,
9059 SPIDER_SQL_B_DOT_STR, SPIDER_SQL_B_DOT_LEN)) ||
9060 (error_num = spider_db_mbase_utility->append_from_with_alias(&sql,
9061 table_names, table_name_lengths,
9062 table_aliases, table_alias_lengths, 2,
9063 &table_name_pos, FALSE))
9064 )
9065 DBUG_RETURN(error_num);
9066 if (
9067 mysql_share->key_hint &&
9068 (error_num = spider_db_append_hint_after_table(spider,
9069 &sql, &mysql_share->key_hint[spider->active_index]))
9070 )
9071 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9072 where_pos = sql.length();
9073 if (
9074 (error_num = append_key_join_columns_for_bka(
9075 start_key, &sql,
9076 table_dot_aliases, table_dot_alias_lengths)) ||
9077 (error_num = append_condition_part(
9078 SPIDER_SQL_B_DOT_STR, SPIDER_SQL_B_DOT_LEN,
9079 SPIDER_SQL_TYPE_SELECT_SQL, FALSE))
9080 )
9081 DBUG_RETURN(error_num);
9082 if (spider->result_list.direct_order_limit)
9083 {
9084 if ((error_num = append_key_order_for_direct_order_limit_with_alias(&sql,
9085 SPIDER_SQL_B_DOT_STR, SPIDER_SQL_B_DOT_LEN)))
9086 DBUG_RETURN(error_num);
9087 }
9088 #ifdef HANDLER_HAS_DIRECT_AGGREGATE
9089 else if (spider->result_list.direct_aggregate)
9090 {
9091 if ((error_num =
9092 append_group_by(&sql, SPIDER_SQL_B_DOT_STR, SPIDER_SQL_B_DOT_LEN)))
9093 DBUG_RETURN(error_num);
9094 }
9095 #endif
9096
9097 DBUG_RETURN(0);
9098 }
9099
reuse_tmp_table_and_sql_for_bka()9100 int spider_mbase_handler::reuse_tmp_table_and_sql_for_bka()
9101 {
9102 DBUG_ENTER("spider_mbase_handler::reuse_tmp_table_and_sql_for_bka");
9103 DBUG_PRINT("info",("spider this=%p", this));
9104 tmp_sql.length(tmp_sql_pos4);
9105 sql.length(limit_pos);
9106 ha_sql.length(ha_limit_pos);
9107 DBUG_RETURN(0);
9108 }
9109
create_tmp_bka_table_name(char * tmp_table_name,int * tmp_table_name_length,int link_idx)9110 void spider_mbase_handler::create_tmp_bka_table_name(
9111 char *tmp_table_name,
9112 int *tmp_table_name_length,
9113 int link_idx
9114 ) {
9115 uint adjust_length, length;
9116 DBUG_ENTER("spider_mbase_handler::create_tmp_bka_table_name");
9117 if (spider_param_bka_table_name_type(current_thd,
9118 mysql_share->spider_share->
9119 bka_table_name_types[spider->conn_link_idx[link_idx]]) == 1)
9120 {
9121 adjust_length =
9122 mysql_share->db_nm_max_length -
9123 mysql_share->db_names_str[spider->conn_link_idx[link_idx]].length() +
9124 mysql_share->table_nm_max_length -
9125 mysql_share->table_names_str[spider->conn_link_idx[link_idx]].length();
9126 *tmp_table_name_length = mysql_share->db_nm_max_length +
9127 mysql_share->table_nm_max_length;
9128 memset(tmp_table_name, ' ', adjust_length);
9129 tmp_table_name += adjust_length;
9130 memcpy(tmp_table_name, mysql_share->db_names_str[link_idx].c_ptr(),
9131 mysql_share->db_names_str[link_idx].length());
9132 tmp_table_name += mysql_share->db_names_str[link_idx].length();
9133 length = my_sprintf(tmp_table_name, (tmp_table_name,
9134 "%s%s%p%s", SPIDER_SQL_DOT_STR, SPIDER_SQL_TMP_BKA_STR, spider,
9135 SPIDER_SQL_UNDERSCORE_STR));
9136 *tmp_table_name_length += length;
9137 tmp_table_name += length;
9138 memcpy(tmp_table_name,
9139 mysql_share->table_names_str[spider->conn_link_idx[link_idx]].c_ptr(),
9140 mysql_share->table_names_str[spider->conn_link_idx[link_idx]].length());
9141 } else {
9142 adjust_length =
9143 mysql_share->db_nm_max_length -
9144 mysql_share->db_names_str[spider->conn_link_idx[link_idx]].length();
9145 *tmp_table_name_length = mysql_share->db_nm_max_length;
9146 memset(tmp_table_name, ' ', adjust_length);
9147 tmp_table_name += adjust_length;
9148 memcpy(tmp_table_name, mysql_share->db_names_str[link_idx].c_ptr(),
9149 mysql_share->db_names_str[link_idx].length());
9150 tmp_table_name += mysql_share->db_names_str[link_idx].length();
9151 length = my_sprintf(tmp_table_name, (tmp_table_name,
9152 "%s%s%p", SPIDER_SQL_DOT_STR, SPIDER_SQL_TMP_BKA_STR, spider));
9153 *tmp_table_name_length += length;
9154 }
9155 DBUG_VOID_RETURN;
9156 }
9157
append_create_tmp_bka_table(const key_range * start_key,spider_string * str,char * tmp_table_name,int tmp_table_name_length,int * db_name_pos,CHARSET_INFO * table_charset)9158 int spider_mbase_handler::append_create_tmp_bka_table(
9159 const key_range *start_key,
9160 spider_string *str,
9161 char *tmp_table_name,
9162 int tmp_table_name_length,
9163 int *db_name_pos,
9164 CHARSET_INFO *table_charset
9165 ) {
9166 int error_num;
9167 SPIDER_SHARE *share = spider->share;
9168 THD *thd = spider->trx->thd;
9169 char *bka_engine = spider_param_bka_engine(thd, share->bka_engine);
9170 uint bka_engine_length = strlen(bka_engine),
9171 cset_length = strlen(table_charset->csname),
9172 coll_length = strlen(table_charset->name);
9173 DBUG_ENTER("spider_mbase_handler::append_create_tmp_bka_table");
9174 if (str->reserve(SPIDER_SQL_CREATE_TMP_LEN + tmp_table_name_length +
9175 SPIDER_SQL_OPEN_PAREN_LEN + SPIDER_SQL_ID_LEN + SPIDER_SQL_ID_TYPE_LEN +
9176 SPIDER_SQL_COMMA_LEN))
9177 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9178 str->q_append(SPIDER_SQL_CREATE_TMP_STR, SPIDER_SQL_CREATE_TMP_LEN);
9179 *db_name_pos = str->length();
9180 str->q_append(tmp_table_name, tmp_table_name_length);
9181 str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
9182 str->q_append(SPIDER_SQL_ID_STR, SPIDER_SQL_ID_LEN);
9183 str->q_append(SPIDER_SQL_ID_TYPE_STR, SPIDER_SQL_ID_TYPE_LEN);
9184 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
9185 if ((error_num = append_key_column_types(start_key, str)))
9186 DBUG_RETURN(error_num);
9187 if (str->reserve(SPIDER_SQL_ENGINE_LEN + bka_engine_length +
9188 SPIDER_SQL_DEF_CHARSET_LEN + cset_length + SPIDER_SQL_COLLATE_LEN +
9189 coll_length + SPIDER_SQL_SEMICOLON_LEN))
9190 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9191 str->q_append(SPIDER_SQL_ENGINE_STR, SPIDER_SQL_ENGINE_LEN);
9192 str->q_append(bka_engine, bka_engine_length);
9193 str->q_append(SPIDER_SQL_DEF_CHARSET_STR, SPIDER_SQL_DEF_CHARSET_LEN);
9194 str->q_append(table_charset->csname, cset_length);
9195 str->q_append(SPIDER_SQL_COLLATE_STR, SPIDER_SQL_COLLATE_LEN);
9196 str->q_append(table_charset->name, coll_length);
9197 str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
9198 DBUG_RETURN(0);
9199 }
9200
append_drop_tmp_bka_table(spider_string * str,char * tmp_table_name,int tmp_table_name_length,int * db_name_pos,int * drop_table_end_pos,bool with_semicolon)9201 int spider_mbase_handler::append_drop_tmp_bka_table(
9202 spider_string *str,
9203 char *tmp_table_name,
9204 int tmp_table_name_length,
9205 int *db_name_pos,
9206 int *drop_table_end_pos,
9207 bool with_semicolon
9208 ) {
9209 DBUG_ENTER("spider_mbase_handler::append_drop_tmp_bka_table");
9210 if (str->reserve(SPIDER_SQL_DROP_TMP_LEN + tmp_table_name_length +
9211 (with_semicolon ? SPIDER_SQL_SEMICOLON_LEN : 0)))
9212 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9213 str->q_append(SPIDER_SQL_DROP_TMP_STR, SPIDER_SQL_DROP_TMP_LEN);
9214 *db_name_pos = str->length();
9215 str->q_append(tmp_table_name, tmp_table_name_length);
9216 *drop_table_end_pos = str->length();
9217 if (with_semicolon)
9218 str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
9219 DBUG_RETURN(0);
9220 }
9221
append_insert_tmp_bka_table(const key_range * start_key,spider_string * str,char * tmp_table_name,int tmp_table_name_length,int * db_name_pos)9222 int spider_mbase_handler::append_insert_tmp_bka_table(
9223 const key_range *start_key,
9224 spider_string *str,
9225 char *tmp_table_name,
9226 int tmp_table_name_length,
9227 int *db_name_pos
9228 ) {
9229 int error_num;
9230 DBUG_ENTER("spider_mbase_handler::append_insert_tmp_bka_table");
9231 if (str->reserve(SPIDER_SQL_INSERT_LEN + SPIDER_SQL_INTO_LEN +
9232 tmp_table_name_length + SPIDER_SQL_OPEN_PAREN_LEN + SPIDER_SQL_ID_LEN +
9233 SPIDER_SQL_COMMA_LEN))
9234 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9235 str->q_append(SPIDER_SQL_INSERT_STR, SPIDER_SQL_INSERT_LEN);
9236 str->q_append(SPIDER_SQL_INTO_STR, SPIDER_SQL_INTO_LEN);
9237 *db_name_pos = str->length();
9238 str->q_append(tmp_table_name, tmp_table_name_length);
9239 str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
9240 str->q_append(SPIDER_SQL_ID_STR, SPIDER_SQL_ID_LEN);
9241 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
9242 if ((error_num = spider_db_append_key_columns(start_key, spider, str)))
9243 DBUG_RETURN(error_num);
9244 if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN + SPIDER_SQL_VALUES_LEN +
9245 SPIDER_SQL_OPEN_PAREN_LEN))
9246 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9247 str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
9248 str->q_append(SPIDER_SQL_VALUES_STR, SPIDER_SQL_VALUES_LEN);
9249 str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
9250 DBUG_RETURN(0);
9251 }
9252
append_union_table_and_sql_for_bka(const key_range * start_key)9253 int spider_mbase_handler::append_union_table_and_sql_for_bka(
9254 const key_range *start_key
9255 ) {
9256 int error_num;
9257 DBUG_ENTER("spider_mbase_handler::append_union_table_and_sql_for_bka");
9258 DBUG_PRINT("info",("spider this=%p", this));
9259 char tgt_table_name[MAX_FIELD_WIDTH * 2];
9260 spider_string tgt_table_name_str(tgt_table_name, MAX_FIELD_WIDTH * 2,
9261 mysql_share->db_names_str[0].charset());
9262 const char *table_names[2], *table_aliases[2], *table_dot_aliases[2];
9263 uint table_name_lengths[2], table_alias_lengths[2],
9264 table_dot_alias_lengths[2];
9265 tgt_table_name_str.init_calc_mem(233);
9266 tgt_table_name_str.length(0);
9267 if ((error_num = append_table_name_with_adjusting(&tgt_table_name_str,
9268 first_link_idx, SPIDER_SQL_TYPE_SELECT_SQL)))
9269 {
9270 DBUG_RETURN(error_num);
9271 }
9272 table_names[0] = "";
9273 table_names[1] = tgt_table_name_str.c_ptr_safe();
9274 table_name_lengths[0] = 0;
9275 table_name_lengths[1] = tgt_table_name_str.length();
9276 table_aliases[0] = SPIDER_SQL_A_STR;
9277 table_aliases[1] = SPIDER_SQL_B_STR;
9278 table_alias_lengths[0] = SPIDER_SQL_A_LEN;
9279 table_alias_lengths[1] = SPIDER_SQL_B_LEN;
9280 table_dot_aliases[0] = SPIDER_SQL_A_DOT_STR;
9281 table_dot_aliases[1] = SPIDER_SQL_B_DOT_STR;
9282 table_dot_alias_lengths[0] = SPIDER_SQL_A_DOT_LEN;
9283 table_dot_alias_lengths[1] = SPIDER_SQL_B_DOT_LEN;
9284
9285 if ((error_num = spider_db_append_select(spider)))
9286 DBUG_RETURN(error_num);
9287 if (sql.reserve(SPIDER_SQL_A_DOT_LEN + SPIDER_SQL_ID_LEN +
9288 SPIDER_SQL_COMMA_LEN))
9289 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9290 sql.q_append(SPIDER_SQL_A_DOT_STR, SPIDER_SQL_A_DOT_LEN);
9291 sql.q_append(SPIDER_SQL_ID_STR, SPIDER_SQL_ID_LEN);
9292 sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
9293 if ((error_num = append_select_columns_with_alias(&sql,
9294 SPIDER_SQL_B_DOT_STR, SPIDER_SQL_B_DOT_LEN)))
9295 DBUG_RETURN(error_num);
9296 if (sql.reserve(SPIDER_SQL_FROM_LEN + (SPIDER_SQL_OPEN_PAREN_LEN * 2)))
9297 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9298 sql.q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN);
9299 sql.q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
9300 sql.q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
9301 tmp_sql_pos1 = sql.length();
9302
9303 if (
9304 (error_num = spider_db_mbase_utility->append_from_with_alias(&tmp_sql,
9305 table_names, table_name_lengths,
9306 table_aliases, table_alias_lengths, 2,
9307 &table_name_pos, FALSE))
9308 )
9309 DBUG_RETURN(error_num);
9310 if (
9311 mysql_share->key_hint &&
9312 (error_num = spider_db_append_hint_after_table(spider,
9313 &tmp_sql, &mysql_share->key_hint[spider->active_index]))
9314 )
9315 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9316 where_pos = tmp_sql.length();
9317 if (
9318 (error_num = append_key_join_columns_for_bka(
9319 start_key, &tmp_sql,
9320 table_dot_aliases, table_dot_alias_lengths)) ||
9321 (error_num = append_condition_part(
9322 SPIDER_SQL_B_DOT_STR, SPIDER_SQL_B_DOT_LEN,
9323 SPIDER_SQL_TYPE_TMP_SQL, FALSE))
9324 )
9325 DBUG_RETURN(error_num);
9326 if (spider->result_list.direct_order_limit)
9327 {
9328 if ((error_num =
9329 append_key_order_for_direct_order_limit_with_alias(&tmp_sql,
9330 SPIDER_SQL_B_DOT_STR, SPIDER_SQL_B_DOT_LEN))
9331 )
9332 DBUG_RETURN(error_num);
9333 }
9334 #ifdef HANDLER_HAS_DIRECT_AGGREGATE
9335 else if (spider->result_list.direct_aggregate)
9336 {
9337 if ((error_num =
9338 append_group_by(&tmp_sql, SPIDER_SQL_B_DOT_STR, SPIDER_SQL_B_DOT_LEN)))
9339 DBUG_RETURN(error_num);
9340 }
9341 #endif
9342
9343 DBUG_RETURN(0);
9344 }
9345
reuse_union_table_and_sql_for_bka()9346 int spider_mbase_handler::reuse_union_table_and_sql_for_bka()
9347 {
9348 DBUG_ENTER("spider_mbase_handler::reuse_union_table_and_sql_for_bka");
9349 DBUG_PRINT("info",("spider this=%p", this));
9350 sql.length(tmp_sql_pos1);
9351 DBUG_RETURN(0);
9352 }
9353
append_insert_for_recovery(ulong sql_type,int link_idx)9354 int spider_mbase_handler::append_insert_for_recovery(
9355 ulong sql_type,
9356 int link_idx
9357 ) {
9358 const TABLE *table = spider->get_table();
9359 SPIDER_SHARE *share = spider->share;
9360 Field **field;
9361 uint field_name_length = 0;
9362 bool add_value = FALSE;
9363 spider_string *insert_sql;
9364 DBUG_ENTER("spider_mbase_handler::append_insert_for_recovery");
9365 DBUG_PRINT("info",("spider this=%p", this));
9366 if (sql_type == SPIDER_SQL_TYPE_INSERT_SQL)
9367 {
9368 insert_sql = &spider->result_list.insert_sqls[link_idx];
9369 insert_sql->length(0);
9370 } else {
9371 insert_sql = &spider->result_list.update_sqls[link_idx];
9372 }
9373 if (insert_sql->reserve(
9374 SPIDER_SQL_INSERT_LEN + SPIDER_SQL_SQL_IGNORE_LEN +
9375 SPIDER_SQL_INTO_LEN + mysql_share->db_nm_max_length +
9376 SPIDER_SQL_DOT_LEN + mysql_share->table_nm_max_length +
9377 /* SPIDER_SQL_NAME_QUOTE_LEN */ 4 + SPIDER_SQL_OPEN_PAREN_LEN))
9378 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9379 insert_sql->q_append(SPIDER_SQL_INSERT_STR, SPIDER_SQL_INSERT_LEN);
9380 insert_sql->q_append(SPIDER_SQL_SQL_IGNORE_STR, SPIDER_SQL_SQL_IGNORE_LEN);
9381 insert_sql->q_append(SPIDER_SQL_INTO_STR, SPIDER_SQL_INTO_LEN);
9382 mysql_share->append_table_name(insert_sql, spider->conn_link_idx[link_idx]);
9383 insert_sql->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
9384 for (field = table->field; *field; field++)
9385 {
9386 field_name_length =
9387 mysql_share->column_name_str[(*field)->field_index].length();
9388 if (insert_sql->reserve(field_name_length +
9389 /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
9390 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9391 mysql_share->append_column_name(insert_sql, (*field)->field_index);
9392 insert_sql->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
9393 }
9394 if (field_name_length)
9395 insert_sql->length(insert_sql->length() - SPIDER_SQL_COMMA_LEN);
9396 if (insert_sql->reserve(SPIDER_SQL_CLOSE_PAREN_LEN + SPIDER_SQL_VALUES_LEN +
9397 SPIDER_SQL_OPEN_PAREN_LEN))
9398 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9399 insert_sql->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
9400 insert_sql->q_append(SPIDER_SQL_VALUES_STR, SPIDER_SQL_VALUES_LEN);
9401 insert_sql->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
9402 for (field = table->field; *field; field++)
9403 {
9404 add_value = TRUE;
9405 if ((*field)->is_null())
9406 {
9407 if (insert_sql->reserve(SPIDER_SQL_NULL_LEN + SPIDER_SQL_COMMA_LEN))
9408 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9409 insert_sql->q_append(SPIDER_SQL_NULL_STR, SPIDER_SQL_NULL_LEN);
9410 } else {
9411 if (
9412 spider_db_mbase_utility->
9413 append_column_value(spider, insert_sql, *field, NULL,
9414 share->access_charset) ||
9415 insert_sql->reserve(SPIDER_SQL_COMMA_LEN)
9416 )
9417 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9418 }
9419 insert_sql->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
9420 }
9421 if (add_value)
9422 insert_sql->length(insert_sql->length() - SPIDER_SQL_COMMA_LEN);
9423 if (insert_sql->reserve(SPIDER_SQL_CLOSE_PAREN_LEN, SPIDER_SQL_COMMA_LEN))
9424 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9425 insert_sql->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
9426 if (sql_type == SPIDER_SQL_TYPE_INSERT_SQL)
9427 {
9428 exec_insert_sql = insert_sql;
9429 }
9430 DBUG_RETURN(0);
9431 }
9432
append_update(const TABLE * table,my_ptrdiff_t ptr_diff)9433 int spider_mbase_handler::append_update(
9434 const TABLE *table,
9435 my_ptrdiff_t ptr_diff
9436 ) {
9437 int error_num;
9438 spider_string *str = &update_sql;
9439 DBUG_ENTER("spider_mbase_handler::append_update");
9440 DBUG_PRINT("info",("spider this=%p", this));
9441 if (str->length() > 0)
9442 {
9443 if (str->reserve(SPIDER_SQL_SEMICOLON_LEN))
9444 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9445 str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
9446 }
9447
9448 if (
9449 (error_num = append_update(str, 0)) ||
9450 (error_num = append_update_set(str)) ||
9451 (error_num = append_update_where(str, table, ptr_diff))
9452 )
9453 DBUG_RETURN(error_num);
9454 filled_up = (str->length() >= (uint) spider->result_list.bulk_update_size);
9455 DBUG_RETURN(0);
9456 }
9457
append_update(const TABLE * table,my_ptrdiff_t ptr_diff,int link_idx)9458 int spider_mbase_handler::append_update(
9459 const TABLE *table,
9460 my_ptrdiff_t ptr_diff,
9461 int link_idx
9462 ) {
9463 int error_num;
9464 SPIDER_SHARE *share = spider->share;
9465 spider_string *str = &spider->result_list.update_sqls[link_idx];
9466 DBUG_ENTER("spider_mbase_handler::append_update");
9467 DBUG_PRINT("info",("spider this=%p", this));
9468 if (str->length() > 0)
9469 {
9470 if (str->reserve(SPIDER_SQL_SEMICOLON_LEN))
9471 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9472 str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
9473 }
9474
9475 if (
9476 (error_num = append_update(str, link_idx)) ||
9477 (error_num = append_update_set(str)) ||
9478 (error_num = append_update_where(str, table, ptr_diff))
9479 )
9480 DBUG_RETURN(error_num);
9481
9482 if (
9483 spider->pk_update &&
9484 share->link_statuses[link_idx] == SPIDER_LINK_STATUS_RECOVERY
9485 ) {
9486 if (str->reserve(SPIDER_SQL_SEMICOLON_LEN))
9487 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9488 str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
9489 if ((error_num = append_insert_for_recovery(
9490 SPIDER_SQL_TYPE_UPDATE_SQL, link_idx)))
9491 DBUG_RETURN(error_num);
9492 }
9493
9494 if (!filled_up)
9495 filled_up = (str->length() >= (uint) spider->result_list.bulk_update_size);
9496 DBUG_RETURN(0);
9497 }
9498
append_delete(const TABLE * table,my_ptrdiff_t ptr_diff)9499 int spider_mbase_handler::append_delete(
9500 const TABLE *table,
9501 my_ptrdiff_t ptr_diff
9502 ) {
9503 int error_num;
9504 spider_string *str = &update_sql;
9505 DBUG_ENTER("spider_mbase_handler::append_delete");
9506 DBUG_PRINT("info",("spider this=%p", this));
9507 if (str->length() > 0)
9508 {
9509 if (str->reserve(SPIDER_SQL_SEMICOLON_LEN))
9510 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9511 str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
9512 }
9513
9514 if (
9515 (error_num = append_delete(str)) ||
9516 (error_num = append_from(str, SPIDER_SQL_TYPE_DELETE_SQL,
9517 first_link_idx)) ||
9518 (error_num = append_update_where(str, table, ptr_diff))
9519 )
9520 DBUG_RETURN(error_num);
9521 filled_up = (str->length() >= (uint) spider->result_list.bulk_update_size);
9522 DBUG_RETURN(0);
9523 }
9524
append_delete(const TABLE * table,my_ptrdiff_t ptr_diff,int link_idx)9525 int spider_mbase_handler::append_delete(
9526 const TABLE *table,
9527 my_ptrdiff_t ptr_diff,
9528 int link_idx
9529 ) {
9530 int error_num;
9531 spider_string *str = &spider->result_list.update_sqls[link_idx];
9532 DBUG_ENTER("spider_mbase_handler::append_delete");
9533 DBUG_PRINT("info",("spider this=%p", this));
9534 if (str->length() > 0)
9535 {
9536 if (str->reserve(SPIDER_SQL_SEMICOLON_LEN))
9537 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9538 str->q_append(SPIDER_SQL_SEMICOLON_STR, SPIDER_SQL_SEMICOLON_LEN);
9539 }
9540
9541 if (
9542 (error_num = append_delete(str)) ||
9543 (error_num = append_from(str, SPIDER_SQL_TYPE_DELETE_SQL, link_idx)) ||
9544 (error_num = append_update_where(str, table, ptr_diff))
9545 )
9546 DBUG_RETURN(error_num);
9547 if (!filled_up)
9548 filled_up = (str->length() >= (uint) spider->result_list.bulk_update_size);
9549 DBUG_RETURN(0);
9550 }
9551
append_insert_part()9552 int spider_mbase_handler::append_insert_part()
9553 {
9554 int error_num;
9555 DBUG_ENTER("spider_mbase_handler::append_insert_part");
9556 DBUG_PRINT("info",("spider this=%p", this));
9557 error_num = append_insert(&insert_sql, 0);
9558 DBUG_RETURN(error_num);
9559 }
9560
append_insert(spider_string * str,int link_idx)9561 int spider_mbase_handler::append_insert(
9562 spider_string *str,
9563 int link_idx
9564 ) {
9565 SPIDER_SHARE *share = spider->share;
9566 DBUG_ENTER("spider_mbase_handler::append_insert");
9567 direct_insert_kind = SPIDER_SQL_DIRECT_INSERT_KIND_INSERT;
9568 if (
9569 (
9570 spider->write_can_replace ||
9571 /* for direct_dup_insert without patch for partition */
9572 spider->sql_command == SQLCOM_REPLACE ||
9573 spider->sql_command == SQLCOM_REPLACE_SELECT
9574 ) &&
9575 spider->direct_dup_insert
9576 ) {
9577 direct_insert_kind = SPIDER_SQL_DIRECT_INSERT_KIND_REPLACE;
9578 if (str->reserve(SPIDER_SQL_REPLACE_LEN))
9579 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9580 str->q_append(SPIDER_SQL_REPLACE_STR, SPIDER_SQL_REPLACE_LEN);
9581 } else {
9582 if (str->reserve(SPIDER_SQL_INSERT_LEN))
9583 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9584 str->q_append(SPIDER_SQL_INSERT_STR, SPIDER_SQL_INSERT_LEN);
9585 }
9586 if (spider->low_priority)
9587 {
9588 if (str->reserve(SPIDER_SQL_LOW_PRIORITY_LEN))
9589 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9590 str->q_append(SPIDER_SQL_LOW_PRIORITY_STR, SPIDER_SQL_LOW_PRIORITY_LEN);
9591 }
9592 else if (spider->insert_delayed)
9593 {
9594 if (share->internal_delayed)
9595 {
9596 if (str->reserve(SPIDER_SQL_SQL_DELAYED_LEN))
9597 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9598 str->q_append(SPIDER_SQL_SQL_DELAYED_STR, SPIDER_SQL_SQL_DELAYED_LEN);
9599 }
9600 }
9601 else if (
9602 spider->lock_type >= TL_WRITE &&
9603 !spider->write_can_replace &&
9604 /* for direct_dup_insert without patch for partition */
9605 spider->sql_command != SQLCOM_REPLACE &&
9606 spider->sql_command != SQLCOM_REPLACE_SELECT
9607 ) {
9608 if (str->reserve(SPIDER_SQL_HIGH_PRIORITY_LEN))
9609 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9610 str->q_append(SPIDER_SQL_HIGH_PRIORITY_STR, SPIDER_SQL_HIGH_PRIORITY_LEN);
9611 }
9612 if (
9613 spider->ignore_dup_key &&
9614 spider->direct_dup_insert &&
9615 !spider->write_can_replace &&
9616 #ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
9617 (!spider->insert_with_update || !dup_update_sql.length()) &&
9618 #else
9619 !spider->insert_with_update &&
9620 #endif
9621 /* for direct_dup_insert without patch for partition */
9622 spider->sql_command != SQLCOM_REPLACE &&
9623 spider->sql_command != SQLCOM_REPLACE_SELECT
9624 ) {
9625 direct_insert_kind = SPIDER_SQL_DIRECT_INSERT_KIND_IGNORE;
9626 if (str->reserve(SPIDER_SQL_SQL_IGNORE_LEN))
9627 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9628 str->q_append(SPIDER_SQL_SQL_IGNORE_STR, SPIDER_SQL_SQL_IGNORE_LEN);
9629 }
9630 DBUG_RETURN(0);
9631 }
9632
append_update_part()9633 int spider_mbase_handler::append_update_part()
9634 {
9635 int error_num;
9636 DBUG_ENTER("spider_mbase_handler::append_update_part");
9637 DBUG_PRINT("info",("spider this=%p", this));
9638 error_num = append_update(&update_sql, 0);
9639 DBUG_RETURN(error_num);
9640 }
9641
append_update(spider_string * str,int link_idx)9642 int spider_mbase_handler::append_update(
9643 spider_string *str,
9644 int link_idx
9645 ) {
9646 DBUG_ENTER("spider_mbase_handler::append_update");
9647 if (str->reserve(SPIDER_SQL_UPDATE_LEN))
9648 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9649 str->q_append(SPIDER_SQL_UPDATE_STR, SPIDER_SQL_UPDATE_LEN);
9650 if (spider->low_priority)
9651 {
9652 if (str->reserve(SPIDER_SQL_LOW_PRIORITY_LEN))
9653 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9654 str->q_append(SPIDER_SQL_LOW_PRIORITY_STR, SPIDER_SQL_LOW_PRIORITY_LEN);
9655 }
9656 if (
9657 spider->ignore_dup_key &&
9658 !spider->insert_with_update
9659 ) {
9660 if (str->reserve(SPIDER_SQL_SQL_IGNORE_LEN))
9661 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9662 str->q_append(SPIDER_SQL_SQL_IGNORE_STR, SPIDER_SQL_SQL_IGNORE_LEN);
9663 }
9664 if (str->reserve(mysql_share->db_nm_max_length +
9665 SPIDER_SQL_DOT_LEN + mysql_share->table_nm_max_length +
9666 /* SPIDER_SQL_NAME_QUOTE_LEN */ 4))
9667 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9668 table_name_pos = str->length();
9669 append_table_name_with_adjusting(str, link_idx, SPIDER_SQL_TYPE_UPDATE_SQL);
9670 DBUG_RETURN(0);
9671 }
9672
append_delete_part()9673 int spider_mbase_handler::append_delete_part()
9674 {
9675 int error_num;
9676 DBUG_ENTER("spider_mbase_handler::append_delete_part");
9677 DBUG_PRINT("info",("spider this=%p", this));
9678 error_num = append_delete(&update_sql);
9679 DBUG_RETURN(error_num);
9680 }
9681
append_delete(spider_string * str)9682 int spider_mbase_handler::append_delete(
9683 spider_string *str
9684 ) {
9685 DBUG_ENTER("spider_mbase_handler::append_delete");
9686 if (str->reserve(SPIDER_SQL_DELETE_LEN))
9687 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9688 str->q_append(SPIDER_SQL_DELETE_STR, SPIDER_SQL_DELETE_LEN);
9689 if (spider->low_priority)
9690 {
9691 if (str->reserve(SPIDER_SQL_LOW_PRIORITY_LEN))
9692 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9693 str->q_append(SPIDER_SQL_LOW_PRIORITY_STR, SPIDER_SQL_LOW_PRIORITY_LEN);
9694 }
9695 if (spider->quick_mode)
9696 {
9697 if (str->reserve(SPIDER_SQL_SQL_QUICK_MODE_LEN))
9698 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9699 str->q_append(SPIDER_SQL_SQL_QUICK_MODE_STR,
9700 SPIDER_SQL_SQL_QUICK_MODE_LEN);
9701 }
9702 if (spider->ignore_dup_key)
9703 {
9704 if (str->reserve(SPIDER_SQL_SQL_IGNORE_LEN))
9705 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9706 str->q_append(SPIDER_SQL_SQL_IGNORE_STR, SPIDER_SQL_SQL_IGNORE_LEN);
9707 }
9708 str->length(str->length() - 1);
9709 DBUG_RETURN(0);
9710 }
9711
9712 #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
9713 #ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
append_increment_update_set_part()9714 int spider_mbase_handler::append_increment_update_set_part()
9715 {
9716 int error_num;
9717 DBUG_ENTER("spider_mbase_handler::append_increment_update_set_part");
9718 DBUG_PRINT("info",("spider this=%p", this));
9719 error_num = append_increment_update_set(&update_sql);
9720 DBUG_RETURN(error_num);
9721 }
9722
append_increment_update_set(spider_string * str)9723 int spider_mbase_handler::append_increment_update_set(
9724 spider_string *str
9725 ) {
9726 uint field_name_length;
9727 uint roop_count;
9728 Field *field;
9729 DBUG_ENTER("spider_mbase_handler::append_increment_update_set");
9730 if (str->reserve(SPIDER_SQL_SET_LEN))
9731 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9732 str->q_append(SPIDER_SQL_SET_STR, SPIDER_SQL_SET_LEN);
9733 const SPIDER_HS_STRING_REF *value = hs_upds.ptr();
9734 for (roop_count = 0; roop_count < hs_upds.size();
9735 roop_count++)
9736 {
9737 if (
9738 value[roop_count].size() == 1 &&
9739 *(value[roop_count].begin()) == '0'
9740 )
9741 continue;
9742
9743 Field *top_table_field =
9744 spider->get_top_table_field(spider->hs_pushed_ret_fields[roop_count]);
9745 if (!(field = spider->field_exchange(top_table_field)))
9746 continue;
9747 field_name_length =
9748 mysql_share->column_name_str[field->field_index].length();
9749
9750 if (str->reserve(field_name_length * 2 + /* SPIDER_SQL_NAME_QUOTE_LEN */
9751 4 + SPIDER_SQL_EQUAL_LEN + SPIDER_SQL_HS_INCREMENT_LEN +
9752 SPIDER_SQL_COMMA_LEN + value[roop_count].size()))
9753 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9754
9755 mysql_share->append_column_name(str, field->field_index);
9756 str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
9757 mysql_share->append_column_name(str, field->field_index);
9758 if (spider->hs_increment)
9759 str->q_append(SPIDER_SQL_HS_INCREMENT_STR,
9760 SPIDER_SQL_HS_INCREMENT_LEN);
9761 else
9762 str->q_append(SPIDER_SQL_HS_DECREMENT_STR,
9763 SPIDER_SQL_HS_DECREMENT_LEN);
9764 str->q_append(value[roop_count].begin(), value[roop_count].size());
9765 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
9766 }
9767 str->length(str->length() - SPIDER_SQL_COMMA_LEN);
9768 DBUG_RETURN(0);
9769 }
9770 #endif
9771 #endif
9772
append_update_set_part()9773 int spider_mbase_handler::append_update_set_part()
9774 {
9775 int error_num;
9776 DBUG_ENTER("spider_mbase_handler::append_update_set_part");
9777 DBUG_PRINT("info",("spider this=%p", this));
9778 error_num = append_update_set(&update_sql);
9779 where_pos = update_sql.length();
9780 DBUG_RETURN(error_num);
9781 }
9782
append_update_set(spider_string * str)9783 int spider_mbase_handler::append_update_set(
9784 spider_string *str
9785 ) {
9786 uint field_name_length;
9787 SPIDER_SHARE *share = spider->share;
9788 TABLE *table = spider->get_table();
9789 Field **fields;
9790 DBUG_ENTER("spider_mbase_handler::append_update_set");
9791 if (str->reserve(SPIDER_SQL_SET_LEN))
9792 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9793 str->q_append(SPIDER_SQL_SET_STR, SPIDER_SQL_SET_LEN);
9794 for (fields = table->field; *fields; fields++)
9795 {
9796 if (bitmap_is_set(table->write_set, (*fields)->field_index))
9797 {
9798 field_name_length =
9799 mysql_share->column_name_str[(*fields)->field_index].length();
9800 if ((*fields)->is_null())
9801 {
9802 if (str->reserve(field_name_length + /* SPIDER_SQL_NAME_QUOTE_LEN */
9803 2 + SPIDER_SQL_EQUAL_LEN + SPIDER_SQL_NULL_LEN +
9804 SPIDER_SQL_COMMA_LEN))
9805 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9806 mysql_share->append_column_name(str, (*fields)->field_index);
9807 str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
9808 str->q_append(SPIDER_SQL_NULL_STR, SPIDER_SQL_NULL_LEN);
9809 } else {
9810 if (str->reserve(field_name_length + /* SPIDER_SQL_NAME_QUOTE_LEN */
9811 2 + SPIDER_SQL_EQUAL_LEN))
9812 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9813 mysql_share->append_column_name(str, (*fields)->field_index);
9814 str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
9815 #ifndef DBUG_OFF
9816 MY_BITMAP *tmp_map = dbug_tmp_use_all_columns(table, &table->read_set);
9817 #endif
9818 if (
9819 spider_db_mbase_utility->
9820 append_column_value(spider, str, *fields, NULL,
9821 share->access_charset) ||
9822 str->reserve(SPIDER_SQL_COMMA_LEN)
9823 ) {
9824 #ifndef DBUG_OFF
9825 dbug_tmp_restore_column_map(&table->read_set, tmp_map);
9826 #endif
9827 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9828 }
9829 #ifndef DBUG_OFF
9830 dbug_tmp_restore_column_map(&table->read_set, tmp_map);
9831 #endif
9832 }
9833 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
9834 }
9835 }
9836 str->length(str->length() - SPIDER_SQL_COMMA_LEN);
9837 DBUG_RETURN(0);
9838 }
9839
9840 #ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
append_direct_update_set_part()9841 int spider_mbase_handler::append_direct_update_set_part()
9842 {
9843 int error_num;
9844 DBUG_ENTER("spider_mbase_handler::append_direct_update_set_part");
9845 DBUG_PRINT("info",("spider this=%p", this));
9846 error_num = append_direct_update_set(&update_sql);
9847 where_pos = update_sql.length();
9848 DBUG_RETURN(error_num);
9849 }
9850
append_direct_update_set(spider_string * str)9851 int spider_mbase_handler::append_direct_update_set(
9852 spider_string *str
9853 ) {
9854 #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
9855 uint field_name_length;
9856 SPIDER_SHARE *share = spider->share;
9857 #ifndef DBUG_OFF
9858 TABLE *table = spider->get_table();
9859 #endif
9860 #endif
9861 DBUG_ENTER("spider_mbase_handler::append_direct_update_set");
9862 if (
9863 spider->direct_update_kinds == SPIDER_SQL_KIND_SQL &&
9864 spider->direct_update_fields
9865 ) {
9866 if (str->reserve(SPIDER_SQL_SET_LEN))
9867 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9868 str->q_append(SPIDER_SQL_SET_STR, SPIDER_SQL_SET_LEN);
9869 DBUG_RETURN(spider_db_append_update_columns(spider, str, NULL, 0,
9870 dbton_id, FALSE, NULL));
9871 }
9872
9873 if (
9874 (spider->direct_update_kinds & SPIDER_SQL_KIND_SQL)
9875 ) {
9876 #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
9877 size_t roop_count;
9878 Field *field;
9879 if (str->reserve(SPIDER_SQL_SET_LEN))
9880 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9881 str->q_append(SPIDER_SQL_SET_STR, SPIDER_SQL_SET_LEN);
9882 for (roop_count = 0; roop_count < spider->hs_pushed_ret_fields_num;
9883 roop_count++)
9884 {
9885 Field *top_table_field =
9886 spider->get_top_table_field(spider->hs_pushed_ret_fields[roop_count]);
9887 if (!(field = spider->field_exchange(top_table_field)))
9888 continue;
9889 field_name_length =
9890 mysql_share->column_name_str[field->field_index].length();
9891 if (top_table_field->is_null())
9892 {
9893 if (str->reserve(field_name_length + /* SPIDER_SQL_NAME_QUOTE_LEN */
9894 2 + SPIDER_SQL_EQUAL_LEN + SPIDER_SQL_NULL_LEN +
9895 SPIDER_SQL_COMMA_LEN))
9896 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9897 mysql_share->append_column_name(str, field->field_index);
9898 str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
9899 str->q_append(SPIDER_SQL_NULL_STR, SPIDER_SQL_NULL_LEN);
9900 } else {
9901 if (str->reserve(field_name_length + /* SPIDER_SQL_NAME_QUOTE_LEN */
9902 2 + SPIDER_SQL_EQUAL_LEN))
9903 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9904 mysql_share->append_column_name(str, field->field_index);
9905 str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
9906 #ifndef DBUG_OFF
9907 my_bitmap_map *tmp_map = dbug_tmp_use_all_columns(table,
9908 table->read_set);
9909 #endif
9910 if (
9911 spider_db_mbase_utility->
9912 append_column_value(spider, str, top_table_field, NULL,
9913 share->access_charset) ||
9914 str->reserve(SPIDER_SQL_COMMA_LEN)
9915 ) {
9916 #ifndef DBUG_OFF
9917 dbug_tmp_restore_column_map(table->read_set, tmp_map);
9918 #endif
9919 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
9920 }
9921 #ifndef DBUG_OFF
9922 dbug_tmp_restore_column_map(table->read_set, tmp_map);
9923 #endif
9924 }
9925 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
9926 }
9927 str->length(str->length() - SPIDER_SQL_COMMA_LEN);
9928 #else
9929 DBUG_ASSERT(0);
9930 #endif
9931 }
9932 DBUG_RETURN(0);
9933 }
9934
append_dup_update_pushdown_part(const char * alias,uint alias_length)9935 int spider_mbase_handler::append_dup_update_pushdown_part(
9936 const char *alias,
9937 uint alias_length
9938 ) {
9939 int error_num;
9940 DBUG_ENTER("spider_mbase_handler::append_dup_update_pushdown_part");
9941 DBUG_PRINT("info",("spider this=%p", this));
9942 dup_update_sql.length(0);
9943 error_num = append_update_columns(&dup_update_sql, alias, alias_length);
9944 DBUG_RETURN(error_num);
9945 }
9946
append_update_columns_part(const char * alias,uint alias_length)9947 int spider_mbase_handler::append_update_columns_part(
9948 const char *alias,
9949 uint alias_length
9950 ) {
9951 int error_num;
9952 DBUG_ENTER("spider_mbase_handler::append_update_columns_part");
9953 DBUG_PRINT("info",("spider this=%p", this));
9954 error_num = append_update_columns(&update_sql, alias, alias_length);
9955 DBUG_RETURN(error_num);
9956 }
9957
check_update_columns_part()9958 int spider_mbase_handler::check_update_columns_part()
9959 {
9960 int error_num;
9961 DBUG_ENTER("spider_mbase_handler::check_update_columns_part");
9962 DBUG_PRINT("info",("spider this=%p", this));
9963 error_num = append_update_columns(NULL, NULL, 0);
9964 DBUG_RETURN(error_num);
9965 }
9966
append_update_columns(spider_string * str,const char * alias,uint alias_length)9967 int spider_mbase_handler::append_update_columns(
9968 spider_string *str,
9969 const char *alias,
9970 uint alias_length
9971 ) {
9972 int error_num;
9973 DBUG_ENTER("spider_mbase_handler::append_update_columns");
9974 error_num = spider_db_append_update_columns(spider, str,
9975 alias, alias_length, dbton_id, FALSE, NULL);
9976 DBUG_RETURN(error_num);
9977 }
9978 #endif
9979
append_select_part(ulong sql_type)9980 int spider_mbase_handler::append_select_part(
9981 ulong sql_type
9982 ) {
9983 int error_num;
9984 spider_string *str;
9985 DBUG_ENTER("spider_mbase_handler::append_select_part");
9986 DBUG_PRINT("info",("spider this=%p", this));
9987 switch (sql_type)
9988 {
9989 case SPIDER_SQL_TYPE_SELECT_SQL:
9990 str = &sql;
9991 break;
9992 case SPIDER_SQL_TYPE_HANDLER:
9993 str = &ha_sql;
9994 break;
9995 default:
9996 DBUG_RETURN(0);
9997 }
9998 error_num = append_select(str, sql_type);
9999 DBUG_RETURN(error_num);
10000 }
10001
append_select(spider_string * str,ulong sql_type)10002 int spider_mbase_handler::append_select(
10003 spider_string *str,
10004 ulong sql_type
10005 ) {
10006 SPIDER_RESULT_LIST *result_list = &spider->result_list;
10007 DBUG_ENTER("spider_mbase_handler::append_select");
10008 if (sql_type == SPIDER_SQL_TYPE_HANDLER)
10009 {
10010 if (str->reserve(SPIDER_SQL_HANDLER_LEN))
10011 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10012 str->q_append(SPIDER_SQL_HANDLER_STR, SPIDER_SQL_HANDLER_LEN);
10013 } else {
10014 if (str->reserve(SPIDER_SQL_SELECT_LEN))
10015 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10016 str->q_append(SPIDER_SQL_SELECT_STR, SPIDER_SQL_SELECT_LEN);
10017 if (result_list->direct_distinct)
10018 {
10019 if (str->reserve(SPIDER_SQL_DISTINCT_LEN))
10020 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10021 str->q_append(SPIDER_SQL_DISTINCT_STR, SPIDER_SQL_DISTINCT_LEN);
10022 }
10023 if (result_list->lock_type != F_WRLCK && spider->lock_mode < 1)
10024 {
10025 /* no lock */
10026 #ifdef SPIDER_SQL_CACHE_IS_IN_LEX
10027 LEX *lex = spider->trx->thd->lex;
10028 #else
10029 st_select_lex *select_lex = &spider->trx->thd->lex->select_lex;
10030 #endif
10031 if (
10032 #ifdef SPIDER_SQL_CACHE_IS_IN_LEX
10033 lex->sql_cache == LEX::SQL_CACHE &&
10034 #else
10035 select_lex->sql_cache == SELECT_LEX::SQL_CACHE &&
10036 #endif
10037 (spider->share->query_cache_sync & 1)
10038 ) {
10039 if (str->reserve(SPIDER_SQL_SQL_CACHE_LEN))
10040 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10041 str->q_append(SPIDER_SQL_SQL_CACHE_STR, SPIDER_SQL_SQL_CACHE_LEN);
10042 } else if (
10043 #ifdef SPIDER_SQL_CACHE_IS_IN_LEX
10044 lex->sql_cache == LEX::SQL_NO_CACHE &&
10045 #else
10046 select_lex->sql_cache == SELECT_LEX::SQL_NO_CACHE &&
10047 #endif
10048 (spider->share->query_cache_sync & 2)
10049 ) {
10050 if (str->reserve(SPIDER_SQL_SQL_NO_CACHE_LEN))
10051 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10052 str->q_append(SPIDER_SQL_SQL_NO_CACHE_STR,
10053 SPIDER_SQL_SQL_NO_CACHE_LEN);
10054 } else if (spider->share->query_cache == 1)
10055 {
10056 if (str->reserve(SPIDER_SQL_SQL_CACHE_LEN))
10057 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10058 str->q_append(SPIDER_SQL_SQL_CACHE_STR, SPIDER_SQL_SQL_CACHE_LEN);
10059 } else if (spider->share->query_cache == 2)
10060 {
10061 if (str->reserve(SPIDER_SQL_SQL_NO_CACHE_LEN))
10062 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10063 str->q_append(SPIDER_SQL_SQL_NO_CACHE_STR,
10064 SPIDER_SQL_SQL_NO_CACHE_LEN);
10065 }
10066 }
10067 if (spider->high_priority)
10068 {
10069 if (str->reserve(SPIDER_SQL_HIGH_PRIORITY_LEN))
10070 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10071 str->q_append(SPIDER_SQL_HIGH_PRIORITY_STR,
10072 SPIDER_SQL_HIGH_PRIORITY_LEN);
10073 }
10074 }
10075 DBUG_RETURN(0);
10076 }
10077
append_table_select_part(ulong sql_type)10078 int spider_mbase_handler::append_table_select_part(
10079 ulong sql_type
10080 ) {
10081 int error_num;
10082 spider_string *str;
10083 DBUG_ENTER("spider_mbase_handler::append_table_select_part");
10084 DBUG_PRINT("info",("spider this=%p", this));
10085 switch (sql_type)
10086 {
10087 case SPIDER_SQL_TYPE_SELECT_SQL:
10088 str = &sql;
10089 break;
10090 default:
10091 DBUG_RETURN(0);
10092 }
10093 error_num = append_table_select(str);
10094 DBUG_RETURN(error_num);
10095 }
10096
append_table_select(spider_string * str)10097 int spider_mbase_handler::append_table_select(
10098 spider_string *str
10099 ) {
10100 DBUG_ENTER("spider_mbase_handler::append_table_select");
10101 table_name_pos = str->length() + mysql_share->table_select_pos;
10102 if (str->append(*(mysql_share->table_select)))
10103 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10104 DBUG_RETURN(0);
10105 }
10106
append_key_select_part(ulong sql_type,uint idx)10107 int spider_mbase_handler::append_key_select_part(
10108 ulong sql_type,
10109 uint idx
10110 ) {
10111 int error_num;
10112 spider_string *str;
10113 DBUG_ENTER("spider_mbase_handler::append_key_select_part");
10114 DBUG_PRINT("info",("spider this=%p", this));
10115 switch (sql_type)
10116 {
10117 case SPIDER_SQL_TYPE_SELECT_SQL:
10118 str = &sql;
10119 break;
10120 default:
10121 DBUG_RETURN(0);
10122 }
10123 error_num = append_key_select(str, idx);
10124 DBUG_RETURN(error_num);
10125 }
10126
append_key_select(spider_string * str,uint idx)10127 int spider_mbase_handler::append_key_select(
10128 spider_string *str,
10129 uint idx
10130 ) {
10131 DBUG_ENTER("spider_mbase_handler::append_key_select");
10132 table_name_pos = str->length() + mysql_share->key_select_pos[idx];
10133 if (str->append(mysql_share->key_select[idx]))
10134 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10135 DBUG_RETURN(0);
10136 }
10137
append_minimum_select_part(ulong sql_type)10138 int spider_mbase_handler::append_minimum_select_part(
10139 ulong sql_type
10140 ) {
10141 int error_num;
10142 spider_string *str;
10143 DBUG_ENTER("spider_mbase_handler::append_minimum_select_part");
10144 DBUG_PRINT("info",("spider this=%p", this));
10145 switch (sql_type)
10146 {
10147 case SPIDER_SQL_TYPE_SELECT_SQL:
10148 str = &sql;
10149 break;
10150 default:
10151 DBUG_RETURN(0);
10152 }
10153 error_num = append_minimum_select(str, sql_type);
10154 DBUG_RETURN(error_num);
10155 }
10156
append_minimum_select(spider_string * str,ulong sql_type)10157 int spider_mbase_handler::append_minimum_select(
10158 spider_string *str,
10159 ulong sql_type
10160 ) {
10161 TABLE *table = spider->get_table();
10162 Field **field;
10163 int field_length;
10164 bool appended = FALSE;
10165 DBUG_ENTER("spider_mbase_handler::append_minimum_select");
10166 minimum_select_bitmap_create();
10167 for (field = table->field; *field; field++)
10168 {
10169 if (minimum_select_bit_is_set((*field)->field_index))
10170 {
10171 /*
10172 spider_set_bit(minimum_select_bitmap, (*field)->field_index);
10173 */
10174 field_length =
10175 mysql_share->column_name_str[(*field)->field_index].length();
10176 if (str->reserve(field_length +
10177 /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
10178 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10179 mysql_share->append_column_name(str, (*field)->field_index);
10180 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
10181 appended = TRUE;
10182 }
10183 }
10184 if (appended)
10185 str->length(str->length() - SPIDER_SQL_COMMA_LEN);
10186 else {
10187 if (str->reserve(SPIDER_SQL_ONE_LEN))
10188 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10189 str->q_append(SPIDER_SQL_ONE_STR, SPIDER_SQL_ONE_LEN);
10190 }
10191 DBUG_RETURN(append_from(str, sql_type, first_link_idx));
10192 }
10193
append_table_select_with_alias(spider_string * str,const char * alias,uint alias_length)10194 int spider_mbase_handler::append_table_select_with_alias(
10195 spider_string *str,
10196 const char *alias,
10197 uint alias_length
10198 ) {
10199 TABLE *table = spider->get_table();
10200 Field **field;
10201 int field_length;
10202 DBUG_ENTER("spider_mbase_handler::append_table_select_with_alias");
10203 for (field = table->field; *field; field++)
10204 {
10205 field_length =
10206 mysql_share->column_name_str[(*field)->field_index].length();
10207 if (str->reserve(alias_length + field_length +
10208 /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
10209 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10210 str->q_append(alias, alias_length);
10211 mysql_share->append_column_name(str, (*field)->field_index);
10212 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
10213 }
10214 str->length(str->length() - SPIDER_SQL_COMMA_LEN);
10215 DBUG_RETURN(0);
10216 }
10217
append_key_select_with_alias(spider_string * str,const KEY * key_info,const char * alias,uint alias_length)10218 int spider_mbase_handler::append_key_select_with_alias(
10219 spider_string *str,
10220 const KEY *key_info,
10221 const char *alias,
10222 uint alias_length
10223 ) {
10224 KEY_PART_INFO *key_part;
10225 Field *field;
10226 uint part_num;
10227 int field_length;
10228 DBUG_ENTER("spider_mbase_handler::append_key_select_with_alias");
10229 for (key_part = key_info->key_part, part_num = 0;
10230 part_num < spider_user_defined_key_parts(key_info); key_part++, part_num++)
10231 {
10232 field = key_part->field;
10233 field_length = mysql_share->column_name_str[field->field_index].length();
10234 if (str->reserve(alias_length + field_length +
10235 /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
10236 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10237 str->q_append(alias, alias_length);
10238 mysql_share->append_column_name(str, field->field_index);
10239 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
10240 }
10241 str->length(str->length() - SPIDER_SQL_COMMA_LEN);
10242 DBUG_RETURN(0);
10243 }
10244
append_minimum_select_with_alias(spider_string * str,const char * alias,uint alias_length)10245 int spider_mbase_handler::append_minimum_select_with_alias(
10246 spider_string *str,
10247 const char *alias,
10248 uint alias_length
10249 ) {
10250 TABLE *table = spider->get_table();
10251 Field **field;
10252 int field_length;
10253 bool appended = FALSE;
10254 DBUG_ENTER("spider_mbase_handler::append_minimum_select_with_alias");
10255 minimum_select_bitmap_create();
10256 for (field = table->field; *field; field++)
10257 {
10258 if (minimum_select_bit_is_set((*field)->field_index))
10259 {
10260 /*
10261 spider_set_bit(minimum_select_bitmap, (*field)->field_index);
10262 */
10263 field_length =
10264 mysql_share->column_name_str[(*field)->field_index].length();
10265 if (str->reserve(alias_length + field_length +
10266 /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
10267 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10268 str->q_append(alias, alias_length);
10269 mysql_share->append_column_name(str, (*field)->field_index);
10270 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
10271 appended = TRUE;
10272 }
10273 }
10274 if (appended)
10275 str->length(str->length() - SPIDER_SQL_COMMA_LEN);
10276 else {
10277 if (str->reserve(SPIDER_SQL_ONE_LEN))
10278 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10279 str->q_append(SPIDER_SQL_ONE_STR, SPIDER_SQL_ONE_LEN);
10280 }
10281 DBUG_RETURN(0);
10282 }
10283
append_select_columns_with_alias(spider_string * str,const char * alias,uint alias_length)10284 int spider_mbase_handler::append_select_columns_with_alias(
10285 spider_string *str,
10286 const char *alias,
10287 uint alias_length
10288 ) {
10289 int error_num;
10290 SPIDER_RESULT_LIST *result_list = &spider->result_list;
10291 DBUG_ENTER("spider_mbase_handler::append_select_columns_with_alias");
10292 #ifdef HANDLER_HAS_DIRECT_AGGREGATE
10293 if (
10294 result_list->direct_aggregate &&
10295 (error_num = append_sum_select(str, alias, alias_length))
10296 )
10297 DBUG_RETURN(error_num);
10298 #endif
10299 if ((error_num = append_match_select(str, alias, alias_length)))
10300 DBUG_RETURN(error_num);
10301 if (!spider->select_column_mode)
10302 {
10303 if (result_list->keyread)
10304 DBUG_RETURN(append_key_select_with_alias(
10305 str, result_list->key_info, alias, alias_length));
10306 else
10307 DBUG_RETURN(append_table_select_with_alias(
10308 str, alias, alias_length));
10309 }
10310 DBUG_RETURN(append_minimum_select_with_alias(str, alias, alias_length));
10311 }
10312
append_hint_after_table_part(ulong sql_type)10313 int spider_mbase_handler::append_hint_after_table_part(
10314 ulong sql_type
10315 ) {
10316 int error_num;
10317 spider_string *str;
10318 DBUG_ENTER("spider_mbase_handler::append_hint_after_table_part");
10319 DBUG_PRINT("info",("spider this=%p", this));
10320 switch (sql_type)
10321 {
10322 case SPIDER_SQL_TYPE_SELECT_SQL:
10323 case SPIDER_SQL_TYPE_TMP_SQL:
10324 str = &sql;
10325 break;
10326 case SPIDER_SQL_TYPE_INSERT_SQL:
10327 case SPIDER_SQL_TYPE_UPDATE_SQL:
10328 case SPIDER_SQL_TYPE_DELETE_SQL:
10329 case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
10330 str = &update_sql;
10331 break;
10332 case SPIDER_SQL_TYPE_HANDLER:
10333 str = &ha_sql;
10334 break;
10335 default:
10336 DBUG_RETURN(0);
10337 }
10338 error_num = append_hint_after_table(str);
10339 DBUG_RETURN(error_num);
10340 }
10341
append_hint_after_table(spider_string * str)10342 int spider_mbase_handler::append_hint_after_table(
10343 spider_string *str
10344 ) {
10345 int error_num;
10346 DBUG_ENTER("spider_mbase_handler::append_hint_after_table");
10347 DBUG_PRINT("info",("spider this=%p", this));
10348 if (
10349 mysql_share->key_hint &&
10350 (error_num = spider_db_append_hint_after_table(spider,
10351 str, &mysql_share->key_hint[spider->active_index]))
10352 )
10353 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10354 DBUG_RETURN(0);
10355 }
10356
set_where_pos(ulong sql_type)10357 void spider_mbase_handler::set_where_pos(
10358 ulong sql_type
10359 ) {
10360 DBUG_ENTER("spider_mbase_handler::set_where_pos");
10361 switch (sql_type)
10362 {
10363 case SPIDER_SQL_TYPE_SELECT_SQL:
10364 case SPIDER_SQL_TYPE_TMP_SQL:
10365 where_pos = sql.length();
10366 break;
10367 case SPIDER_SQL_TYPE_INSERT_SQL:
10368 case SPIDER_SQL_TYPE_UPDATE_SQL:
10369 case SPIDER_SQL_TYPE_DELETE_SQL:
10370 case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
10371 where_pos = update_sql.length();
10372 break;
10373 case SPIDER_SQL_TYPE_HANDLER:
10374 ha_read_pos = ha_sql.length();
10375 break;
10376 default:
10377 break;
10378 }
10379 DBUG_VOID_RETURN;
10380 }
10381
set_where_to_pos(ulong sql_type)10382 void spider_mbase_handler::set_where_to_pos(
10383 ulong sql_type
10384 ) {
10385 DBUG_ENTER("spider_mbase_handler::set_where_to_pos");
10386 switch (sql_type)
10387 {
10388 case SPIDER_SQL_TYPE_SELECT_SQL:
10389 case SPIDER_SQL_TYPE_TMP_SQL:
10390 sql.length(where_pos);
10391 break;
10392 case SPIDER_SQL_TYPE_INSERT_SQL:
10393 case SPIDER_SQL_TYPE_UPDATE_SQL:
10394 case SPIDER_SQL_TYPE_DELETE_SQL:
10395 case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
10396 update_sql.length(where_pos);
10397 break;
10398 case SPIDER_SQL_TYPE_HANDLER:
10399 ha_sql.length(ha_read_pos);
10400 break;
10401 default:
10402 break;
10403 }
10404 DBUG_VOID_RETURN;
10405 }
10406
check_item_type(Item * item)10407 int spider_mbase_handler::check_item_type(
10408 Item *item
10409 ) {
10410 int error_num;
10411 DBUG_ENTER("spider_mbase_handler::check_item_type");
10412 DBUG_PRINT("info",("spider this=%p", this));
10413 error_num = spider_db_print_item_type(item, NULL, spider, NULL, NULL, 0,
10414 dbton_id, FALSE, NULL);
10415 DBUG_RETURN(error_num);
10416 }
10417
append_values_connector_part(ulong sql_type)10418 int spider_mbase_handler::append_values_connector_part(
10419 ulong sql_type
10420 ) {
10421 int error_num;
10422 spider_string *str;
10423 DBUG_ENTER("spider_mbase_handler::append_values_connector_part");
10424 DBUG_PRINT("info",("spider this=%p", this));
10425 switch (sql_type)
10426 {
10427 case SPIDER_SQL_TYPE_SELECT_SQL:
10428 str = &sql;
10429 break;
10430 case SPIDER_SQL_TYPE_TMP_SQL:
10431 str = &tmp_sql;
10432 break;
10433 default:
10434 DBUG_RETURN(0);
10435 }
10436 error_num = append_values_connector(str);
10437 DBUG_RETURN(error_num);
10438 }
10439
append_values_connector(spider_string * str)10440 int spider_mbase_handler::append_values_connector(
10441 spider_string *str
10442 ) {
10443 DBUG_ENTER("spider_mbase_handler::append_values_connector");
10444 DBUG_PRINT("info",("spider this=%p", this));
10445 if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN +
10446 SPIDER_SQL_COMMA_LEN + SPIDER_SQL_OPEN_PAREN_LEN))
10447 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10448 str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
10449 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
10450 str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
10451 DBUG_RETURN(0);
10452 }
10453
append_values_terminator_part(ulong sql_type)10454 int spider_mbase_handler::append_values_terminator_part(
10455 ulong sql_type
10456 ) {
10457 int error_num;
10458 spider_string *str;
10459 DBUG_ENTER("spider_mbase_handler::append_values_terminator_part");
10460 DBUG_PRINT("info",("spider this=%p", this));
10461 switch (sql_type)
10462 {
10463 case SPIDER_SQL_TYPE_SELECT_SQL:
10464 str = &sql;
10465 break;
10466 case SPIDER_SQL_TYPE_TMP_SQL:
10467 str = &tmp_sql;
10468 break;
10469 default:
10470 DBUG_RETURN(0);
10471 }
10472 error_num = append_values_terminator(str);
10473 DBUG_RETURN(error_num);
10474 }
10475
append_values_terminator(spider_string * str)10476 int spider_mbase_handler::append_values_terminator(
10477 spider_string *str
10478 ) {
10479 DBUG_ENTER("spider_mbase_handler::append_values_terminator");
10480 DBUG_PRINT("info",("spider this=%p", this));
10481 str->length(str->length() -
10482 SPIDER_SQL_COMMA_LEN - SPIDER_SQL_OPEN_PAREN_LEN);
10483 DBUG_RETURN(0);
10484 }
10485
append_union_table_connector_part(ulong sql_type)10486 int spider_mbase_handler::append_union_table_connector_part(
10487 ulong sql_type
10488 ) {
10489 int error_num;
10490 spider_string *str;
10491 DBUG_ENTER("spider_mbase_handler::append_union_table_connector_part");
10492 DBUG_PRINT("info",("spider this=%p", this));
10493 switch (sql_type)
10494 {
10495 case SPIDER_SQL_TYPE_SELECT_SQL:
10496 str = &sql;
10497 break;
10498 case SPIDER_SQL_TYPE_TMP_SQL:
10499 str = &tmp_sql;
10500 break;
10501 default:
10502 DBUG_RETURN(0);
10503 }
10504 error_num = append_union_table_connector(str);
10505 DBUG_RETURN(error_num);
10506 }
10507
append_union_table_connector(spider_string * str)10508 int spider_mbase_handler::append_union_table_connector(
10509 spider_string *str
10510 ) {
10511 DBUG_ENTER("spider_mbase_handler::append_union_table_connector");
10512 DBUG_PRINT("info",("spider this=%p", this));
10513 if (str->reserve((SPIDER_SQL_SPACE_LEN * 2) + SPIDER_SQL_UNION_ALL_LEN))
10514 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10515 str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
10516 str->q_append(SPIDER_SQL_UNION_ALL_STR, SPIDER_SQL_UNION_ALL_LEN);
10517 str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
10518 DBUG_RETURN(0);
10519 }
10520
append_union_table_terminator_part(ulong sql_type)10521 int spider_mbase_handler::append_union_table_terminator_part(
10522 ulong sql_type
10523 ) {
10524 int error_num;
10525 spider_string *str;
10526 DBUG_ENTER("spider_mbase_handler::append_union_table_terminator_part");
10527 DBUG_PRINT("info",("spider this=%p", this));
10528 switch (sql_type)
10529 {
10530 case SPIDER_SQL_TYPE_SELECT_SQL:
10531 str = &sql;
10532 break;
10533 default:
10534 DBUG_RETURN(0);
10535 }
10536 error_num = append_union_table_terminator(str);
10537 DBUG_RETURN(error_num);
10538 }
10539
append_union_table_terminator(spider_string * str)10540 int spider_mbase_handler::append_union_table_terminator(
10541 spider_string *str
10542 ) {
10543 DBUG_ENTER("spider_mbase_handler::append_union_table_terminator");
10544 DBUG_PRINT("info",("spider this=%p", this));
10545 str->length(str->length() -
10546 ((SPIDER_SQL_SPACE_LEN * 2) + SPIDER_SQL_UNION_ALL_LEN));
10547 str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
10548 str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
10549 table_name_pos = str->length() + SPIDER_SQL_SPACE_LEN + SPIDER_SQL_A_LEN +
10550 SPIDER_SQL_COMMA_LEN;
10551 if (str->reserve(tmp_sql.length() - SPIDER_SQL_FROM_LEN))
10552 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10553 str->q_append(tmp_sql.ptr() + SPIDER_SQL_FROM_LEN,
10554 tmp_sql.length() - SPIDER_SQL_FROM_LEN);
10555 DBUG_RETURN(0);
10556 }
10557
append_key_column_values_part(const key_range * start_key,ulong sql_type)10558 int spider_mbase_handler::append_key_column_values_part(
10559 const key_range *start_key,
10560 ulong sql_type
10561 ) {
10562 int error_num;
10563 spider_string *str;
10564 DBUG_ENTER("spider_mbase_handler::append_key_column_values_part");
10565 switch (sql_type)
10566 {
10567 case SPIDER_SQL_TYPE_SELECT_SQL:
10568 str = &sql;
10569 break;
10570 case SPIDER_SQL_TYPE_TMP_SQL:
10571 str = &tmp_sql;
10572 break;
10573 default:
10574 DBUG_RETURN(0);
10575 }
10576 error_num = append_key_column_values(str, start_key);
10577 DBUG_RETURN(error_num);
10578 }
10579
append_key_column_values(spider_string * str,const key_range * start_key)10580 int spider_mbase_handler::append_key_column_values(
10581 spider_string *str,
10582 const key_range *start_key
10583 ) {
10584 int error_num;
10585 const uchar *ptr;
10586 SPIDER_RESULT_LIST *result_list = &spider->result_list;
10587 SPIDER_SHARE *share = spider->share;
10588 KEY *key_info = result_list->key_info;
10589 uint length;
10590 uint store_length;
10591 key_part_map full_key_part_map =
10592 make_prev_keypart_map(spider_user_defined_key_parts(key_info));
10593 key_part_map start_key_part_map;
10594 KEY_PART_INFO *key_part;
10595 Field *field;
10596 DBUG_ENTER("spider_mbase_handler::append_key_column_values");
10597 start_key_part_map = start_key->keypart_map & full_key_part_map;
10598 DBUG_PRINT("info", ("spider spider_user_defined_key_parts=%u",
10599 spider_user_defined_key_parts(key_info)));
10600 DBUG_PRINT("info", ("spider full_key_part_map=%lu", full_key_part_map));
10601 DBUG_PRINT("info", ("spider start_key_part_map=%lu", start_key_part_map));
10602
10603 if (!start_key_part_map)
10604 DBUG_RETURN(0);
10605
10606 for (
10607 key_part = key_info->key_part,
10608 length = 0;
10609 start_key_part_map;
10610 start_key_part_map >>= 1,
10611 key_part++,
10612 length += store_length
10613 ) {
10614 store_length = key_part->store_length;
10615 ptr = start_key->key + length;
10616 field = key_part->field;
10617 if ((error_num = spider_db_append_null_value(str, key_part, &ptr)))
10618 {
10619 if (error_num > 0)
10620 DBUG_RETURN(error_num);
10621 } else {
10622 if (spider_db_mbase_utility->append_column_value(spider, str, field, ptr,
10623 share->access_charset))
10624 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10625 }
10626
10627 if (str->reserve(SPIDER_SQL_COMMA_LEN))
10628 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10629 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
10630 }
10631 str->length(str->length() - SPIDER_SQL_COMMA_LEN);
10632 DBUG_RETURN(0);
10633 }
10634
append_key_column_values_with_name_part(const key_range * start_key,ulong sql_type)10635 int spider_mbase_handler::append_key_column_values_with_name_part(
10636 const key_range *start_key,
10637 ulong sql_type
10638 ) {
10639 int error_num;
10640 spider_string *str;
10641 DBUG_ENTER("spider_mbase_handler::append_key_column_values_with_name_part");
10642 switch (sql_type)
10643 {
10644 case SPIDER_SQL_TYPE_SELECT_SQL:
10645 str = &sql;
10646 break;
10647 case SPIDER_SQL_TYPE_TMP_SQL:
10648 str = &tmp_sql;
10649 break;
10650 default:
10651 DBUG_RETURN(0);
10652 }
10653 error_num = append_key_column_values_with_name(str, start_key);
10654 DBUG_RETURN(error_num);
10655 }
10656
append_key_column_values_with_name(spider_string * str,const key_range * start_key)10657 int spider_mbase_handler::append_key_column_values_with_name(
10658 spider_string *str,
10659 const key_range *start_key
10660 ) {
10661 int error_num;
10662 const uchar *ptr;
10663 SPIDER_RESULT_LIST *result_list = &spider->result_list;
10664 SPIDER_SHARE *share = spider->share;
10665 KEY *key_info = result_list->key_info;
10666 uint length;
10667 uint key_name_length, key_count;
10668 uint store_length;
10669 key_part_map full_key_part_map =
10670 make_prev_keypart_map(spider_user_defined_key_parts(key_info));
10671 key_part_map start_key_part_map;
10672 KEY_PART_INFO *key_part;
10673 Field *field;
10674 char tmp_buf[MAX_FIELD_WIDTH];
10675 DBUG_ENTER("spider_mbase_handler::append_key_column_values_with_name");
10676 start_key_part_map = start_key->keypart_map & full_key_part_map;
10677 DBUG_PRINT("info", ("spider spider_user_defined_key_parts=%u",
10678 spider_user_defined_key_parts(key_info)));
10679 DBUG_PRINT("info", ("spider full_key_part_map=%lu", full_key_part_map));
10680 DBUG_PRINT("info", ("spider start_key_part_map=%lu", start_key_part_map));
10681
10682 if (!start_key_part_map)
10683 DBUG_RETURN(0);
10684
10685 for (
10686 key_part = key_info->key_part,
10687 length = 0,
10688 key_count = 0;
10689 start_key_part_map;
10690 start_key_part_map >>= 1,
10691 key_part++,
10692 length += store_length,
10693 key_count++
10694 ) {
10695 store_length = key_part->store_length;
10696 ptr = start_key->key + length;
10697 field = key_part->field;
10698 if ((error_num = spider_db_append_null_value(str, key_part, &ptr)))
10699 {
10700 if (error_num > 0)
10701 DBUG_RETURN(error_num);
10702 } else {
10703 if (spider_db_mbase_utility->append_column_value(spider, str, field, ptr,
10704 share->access_charset))
10705 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10706 }
10707
10708 key_name_length = my_sprintf(tmp_buf, (tmp_buf, "c%u", key_count));
10709 if (str->reserve(SPIDER_SQL_SPACE_LEN + key_name_length +
10710 SPIDER_SQL_COMMA_LEN))
10711 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10712 str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
10713 str->q_append(tmp_buf, key_name_length);
10714 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
10715 }
10716 str->length(str->length() - SPIDER_SQL_COMMA_LEN);
10717 DBUG_RETURN(0);
10718 }
10719
append_key_where_part(const key_range * start_key,const key_range * end_key,ulong sql_type)10720 int spider_mbase_handler::append_key_where_part(
10721 const key_range *start_key,
10722 const key_range *end_key,
10723 ulong sql_type
10724 ) {
10725 int error_num;
10726 spider_string *str, *str_part = NULL, *str_part2 = NULL;
10727 bool set_order;
10728 DBUG_ENTER("spider_mbase_handler::append_key_where_part");
10729 switch (sql_type)
10730 {
10731 case SPIDER_SQL_TYPE_SELECT_SQL:
10732 str = &sql;
10733 set_order = FALSE;
10734 break;
10735 case SPIDER_SQL_TYPE_TMP_SQL:
10736 str = &tmp_sql;
10737 set_order = FALSE;
10738 break;
10739 case SPIDER_SQL_TYPE_INSERT_SQL:
10740 case SPIDER_SQL_TYPE_UPDATE_SQL:
10741 case SPIDER_SQL_TYPE_DELETE_SQL:
10742 case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
10743 str = &update_sql;
10744 set_order = FALSE;
10745 break;
10746 case SPIDER_SQL_TYPE_HANDLER:
10747 str = &ha_sql;
10748 ha_read_pos = str->length();
10749 str_part = &sql_part;
10750 str_part2 = &sql_part2;
10751 str_part->length(0);
10752 str_part2->length(0);
10753 set_order = TRUE;
10754 break;
10755 default:
10756 DBUG_RETURN(0);
10757 }
10758 error_num = append_key_where(str, str_part, str_part2, start_key, end_key,
10759 sql_type, set_order);
10760 DBUG_RETURN(error_num);
10761 }
10762
append_key_where(spider_string * str,spider_string * str_part,spider_string * str_part2,const key_range * start_key,const key_range * end_key,ulong sql_type,bool set_order)10763 int spider_mbase_handler::append_key_where(
10764 spider_string *str,
10765 spider_string *str_part,
10766 spider_string *str_part2,
10767 const key_range *start_key,
10768 const key_range *end_key,
10769 ulong sql_type,
10770 bool set_order
10771 ) {
10772 int error_num;
10773 DBUG_ENTER("spider_mbase_handler::append_key_where");
10774 error_num = spider_db_append_key_where_internal(str, str_part, str_part2,
10775 start_key, end_key, spider, set_order, sql_type,
10776 dbton_id);
10777 DBUG_RETURN(error_num);
10778 }
10779
append_is_null_part(ulong sql_type,KEY_PART_INFO * key_part,const key_range * key,const uchar ** ptr,bool key_eq,bool tgt_final)10780 int spider_mbase_handler::append_is_null_part(
10781 ulong sql_type,
10782 KEY_PART_INFO *key_part,
10783 const key_range *key,
10784 const uchar **ptr,
10785 bool key_eq,
10786 bool tgt_final
10787 ) {
10788 int error_num;
10789 spider_string *str, *str_part = NULL, *str_part2 = NULL;
10790 DBUG_ENTER("spider_mbase_handler::append_is_null_part");
10791 DBUG_PRINT("info",("spider this=%p", this));
10792 switch (sql_type)
10793 {
10794 case SPIDER_SQL_TYPE_SELECT_SQL:
10795 case SPIDER_SQL_TYPE_TMP_SQL:
10796 str = &sql;
10797 break;
10798 case SPIDER_SQL_TYPE_INSERT_SQL:
10799 case SPIDER_SQL_TYPE_UPDATE_SQL:
10800 case SPIDER_SQL_TYPE_DELETE_SQL:
10801 case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
10802 str = &update_sql;
10803 break;
10804 case SPIDER_SQL_TYPE_HANDLER:
10805 str = &ha_sql;
10806 str_part = &sql_part;
10807 str_part2 = &sql_part2;
10808 break;
10809 default:
10810 DBUG_RETURN(0);
10811 }
10812 error_num = append_is_null(sql_type, str, str_part, str_part2,
10813 key_part, key, ptr, key_eq, tgt_final);
10814 DBUG_RETURN(error_num);
10815 }
10816
append_is_null(ulong sql_type,spider_string * str,spider_string * str_part,spider_string * str_part2,KEY_PART_INFO * key_part,const key_range * key,const uchar ** ptr,bool key_eq,bool tgt_final)10817 int spider_mbase_handler::append_is_null(
10818 ulong sql_type,
10819 spider_string *str,
10820 spider_string *str_part,
10821 spider_string *str_part2,
10822 KEY_PART_INFO *key_part,
10823 const key_range *key,
10824 const uchar **ptr,
10825 bool key_eq,
10826 bool tgt_final
10827 ) {
10828 DBUG_ENTER("spider_mbase_handler::append_is_null");
10829 DBUG_PRINT("info",("spider this=%p", this));
10830 DBUG_PRINT("info",("spider key_eq=%s", key_eq ? "TRUE" : "FALSE"));
10831 if (key_part->null_bit)
10832 {
10833 if (*(*ptr)++)
10834 {
10835 if (sql_type == SPIDER_SQL_TYPE_HANDLER)
10836 {
10837 if (
10838 key_eq ||
10839 key->flag == HA_READ_KEY_EXACT ||
10840 key->flag == HA_READ_KEY_OR_NEXT
10841 ) {
10842 #ifdef SPIDER_HANDLER_SUPPORT_MULTIPLE_KEY_PARTS
10843 if (tgt_final)
10844 {
10845 if (str->reserve(SPIDER_SQL_EQUAL_LEN))
10846 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10847 str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
10848 }
10849 str = str_part;
10850 if (str->reserve(SPIDER_SQL_NULL_LEN))
10851 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10852 str->q_append(SPIDER_SQL_NULL_STR, SPIDER_SQL_NULL_LEN);
10853 #else
10854 if (str_part->length() == SPIDER_SQL_OPEN_PAREN_LEN)
10855 {
10856 if (str->reserve(SPIDER_SQL_EQUAL_LEN))
10857 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10858 str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
10859 str = str_part;
10860 if (str->reserve(SPIDER_SQL_NULL_LEN))
10861 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10862 str->q_append(SPIDER_SQL_NULL_STR, SPIDER_SQL_NULL_LEN);
10863 }
10864 #endif
10865 } else {
10866 #ifdef SPIDER_HANDLER_SUPPORT_MULTIPLE_KEY_PARTS
10867 if (str_part->length() == SPIDER_SQL_OPEN_PAREN_LEN)
10868 {
10869 str = str_part;
10870 str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
10871 ha_next_pos = str->length();
10872 if (str->reserve(SPIDER_SQL_FIRST_LEN))
10873 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10874 str->q_append(SPIDER_SQL_FIRST_STR, SPIDER_SQL_FIRST_LEN);
10875 spider->result_list.ha_read_kind = 1;
10876 } else if (tgt_final)
10877 {
10878 if (str->reserve(SPIDER_SQL_GT_LEN))
10879 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10880 str->q_append(SPIDER_SQL_GT_STR, SPIDER_SQL_GT_LEN);
10881 str = str_part;
10882 if (str->reserve(SPIDER_SQL_NULL_LEN))
10883 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10884 str->q_append(SPIDER_SQL_NULL_STR, SPIDER_SQL_NULL_LEN);
10885 }
10886 #else
10887 if (str_part->length() == SPIDER_SQL_OPEN_PAREN_LEN)
10888 {
10889 str = str_part;
10890 /* first index column */
10891 str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
10892 ha_next_pos = str->length();
10893 if (str->reserve(SPIDER_SQL_FIRST_LEN))
10894 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10895 str->q_append(SPIDER_SQL_FIRST_STR, SPIDER_SQL_FIRST_LEN);
10896 spider->result_list.ha_read_kind = 1;
10897 }
10898 #endif
10899 }
10900 str = str_part2;
10901 }
10902 if (
10903 key_eq ||
10904 key->flag == HA_READ_KEY_EXACT ||
10905 key->flag == HA_READ_KEY_OR_NEXT
10906 ) {
10907 if (str->reserve(SPIDER_SQL_IS_NULL_LEN +
10908 /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
10909 mysql_share->column_name_str[key_part->field->field_index].length()))
10910 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10911 mysql_share->append_column_name(str, key_part->field->field_index);
10912 str->q_append(SPIDER_SQL_IS_NULL_STR, SPIDER_SQL_IS_NULL_LEN);
10913 } else {
10914 if (str->reserve(SPIDER_SQL_IS_NOT_NULL_LEN +
10915 /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
10916 mysql_share->column_name_str[key_part->field->field_index].length()))
10917 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10918 mysql_share->append_column_name(str, key_part->field->field_index);
10919 str->q_append(SPIDER_SQL_IS_NOT_NULL_STR, SPIDER_SQL_IS_NOT_NULL_LEN);
10920 }
10921 DBUG_RETURN(-1);
10922 }
10923 }
10924 DBUG_RETURN(0);
10925 }
10926
append_where_terminator_part(ulong sql_type,bool set_order,int key_count)10927 int spider_mbase_handler::append_where_terminator_part(
10928 ulong sql_type,
10929 bool set_order,
10930 int key_count
10931 ) {
10932 int error_num;
10933 spider_string *str, *str_part = NULL, *str_part2 = NULL;
10934 DBUG_ENTER("spider_mbase_handler::append_where_terminator_part");
10935 DBUG_PRINT("info",("spider this=%p", this));
10936 switch (sql_type)
10937 {
10938 case SPIDER_SQL_TYPE_SELECT_SQL:
10939 case SPIDER_SQL_TYPE_TMP_SQL:
10940 str = &sql;
10941 break;
10942 case SPIDER_SQL_TYPE_INSERT_SQL:
10943 case SPIDER_SQL_TYPE_UPDATE_SQL:
10944 case SPIDER_SQL_TYPE_DELETE_SQL:
10945 case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
10946 str = &update_sql;
10947 break;
10948 case SPIDER_SQL_TYPE_HANDLER:
10949 str = &ha_sql;
10950 str_part = &sql_part;
10951 str_part2 = &sql_part2;
10952 break;
10953 default:
10954 DBUG_RETURN(0);
10955 }
10956 error_num = append_where_terminator(sql_type, str, str_part, str_part2,
10957 set_order, key_count);
10958 DBUG_RETURN(error_num);
10959 }
10960
append_where_terminator(ulong sql_type,spider_string * str,spider_string * str_part,spider_string * str_part2,bool set_order,int key_count)10961 int spider_mbase_handler::append_where_terminator(
10962 ulong sql_type,
10963 spider_string *str,
10964 spider_string *str_part,
10965 spider_string *str_part2,
10966 bool set_order,
10967 int key_count
10968 ) {
10969 SPIDER_RESULT_LIST *result_list = &spider->result_list;
10970 DBUG_ENTER("spider_mbase_handler::append_where_terminator");
10971 DBUG_PRINT("info",("spider this=%p", this));
10972 if (sql_type != SPIDER_SQL_TYPE_HANDLER)
10973 {
10974 str->length(str->length() - SPIDER_SQL_AND_LEN);
10975 if (!set_order)
10976 result_list->key_order = key_count;
10977 } else {
10978 str_part2->length(str_part2->length() - SPIDER_SQL_AND_LEN);
10979
10980 #ifdef SPIDER_HANDLER_SUPPORT_MULTIPLE_KEY_PARTS
10981 str_part->length(str_part->length() - SPIDER_SQL_COMMA_LEN);
10982 #endif
10983 if (!result_list->ha_read_kind)
10984 str_part->q_append(SPIDER_SQL_CLOSE_PAREN_STR,
10985 SPIDER_SQL_CLOSE_PAREN_LEN);
10986 if (str->append(*str_part))
10987 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10988 uint clause_length = str->length() - ha_next_pos;
10989 if (clause_length < SPIDER_SQL_NEXT_LEN)
10990 {
10991 int roop_count;
10992 clause_length = SPIDER_SQL_NEXT_LEN - clause_length;
10993 if (str->reserve(clause_length))
10994 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
10995 for (roop_count = 0; roop_count < (int) clause_length; roop_count++)
10996 str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
10997 }
10998 }
10999 DBUG_RETURN(0);
11000 }
11001
append_match_where_part(ulong sql_type)11002 int spider_mbase_handler::append_match_where_part(
11003 ulong sql_type
11004 ) {
11005 int error_num;
11006 spider_string *str;
11007 DBUG_ENTER("spider_mbase_handler::append_match_where_part");
11008 switch (sql_type)
11009 {
11010 case SPIDER_SQL_TYPE_SELECT_SQL:
11011 str = &sql;
11012 break;
11013 default:
11014 DBUG_ASSERT(0);
11015 DBUG_RETURN(0);
11016 }
11017 error_num = append_match_where(str);
11018 DBUG_RETURN(error_num);
11019 }
11020
append_match_where(spider_string * str)11021 int spider_mbase_handler::append_match_where(
11022 spider_string *str
11023 ) {
11024 int error_num;
11025 bool first = TRUE;
11026 st_spider_ft_info *ft_info = spider->ft_first;
11027 DBUG_ENTER("spider_mbase_handler::append_match_where");
11028 if (spider->ft_current)
11029 {
11030 while (TRUE)
11031 {
11032 if (ft_info->used_in_where)
11033 {
11034 if (first)
11035 {
11036 if (str->reserve(SPIDER_SQL_WHERE_LEN))
11037 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11038 str->q_append(SPIDER_SQL_WHERE_STR, SPIDER_SQL_WHERE_LEN);
11039 first = FALSE;
11040 }
11041 if ((error_num = append_match_against(str, ft_info, NULL, 0)))
11042 DBUG_RETURN(error_num);
11043 if (str->reserve(SPIDER_SQL_AND_LEN))
11044 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11045 str->q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN);
11046 }
11047
11048 if (ft_info == spider->ft_current)
11049 break;
11050 ft_info = ft_info->next;
11051 }
11052 if (!first)
11053 str->length(str->length() - SPIDER_SQL_AND_LEN);
11054 }
11055 DBUG_RETURN(0);
11056 }
11057
append_update_where(spider_string * str,const TABLE * table,my_ptrdiff_t ptr_diff)11058 int spider_mbase_handler::append_update_where(
11059 spider_string *str,
11060 const TABLE *table,
11061 my_ptrdiff_t ptr_diff
11062 ) {
11063 uint field_name_length;
11064 Field **field;
11065 THD *thd = spider->trx->thd;
11066 SPIDER_SHARE *share = spider->share;
11067 bool no_pk = (table->s->primary_key == MAX_KEY);
11068 DBUG_ENTER("spider_mbase_handler::append_update_where");
11069 DBUG_PRINT("info", ("spider table->s->primary_key=%s",
11070 table->s->primary_key != MAX_KEY ? "TRUE" : "FALSE"));
11071 uint str_len_bakup = str->length();
11072 if (str->reserve(SPIDER_SQL_WHERE_LEN))
11073 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11074 str->q_append(SPIDER_SQL_WHERE_STR, SPIDER_SQL_WHERE_LEN);
11075
11076 if (
11077 no_pk ||
11078 spider_param_use_cond_other_than_pk_for_update(thd)
11079 ) {
11080 for (field = table->field; *field; field++)
11081 {
11082 if (
11083 no_pk ||
11084 bitmap_is_set(table->read_set, (*field)->field_index)
11085 ) {
11086 field_name_length =
11087 mysql_share->column_name_str[(*field)->field_index].length();
11088 if ((*field)->is_null(ptr_diff))
11089 {
11090 if (str->reserve(field_name_length +
11091 /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
11092 SPIDER_SQL_IS_NULL_LEN + SPIDER_SQL_AND_LEN))
11093 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11094 mysql_share->append_column_name(str, (*field)->field_index);
11095 str->q_append(SPIDER_SQL_IS_NULL_STR, SPIDER_SQL_IS_NULL_LEN);
11096 } else {
11097 if (str->reserve(field_name_length +
11098 /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
11099 SPIDER_SQL_EQUAL_LEN))
11100 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11101 mysql_share->append_column_name(str, (*field)->field_index);
11102 str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
11103 (*field)->move_field_offset(ptr_diff);
11104 if (
11105 spider_db_mbase_utility->
11106 append_column_value(spider, str, *field, NULL,
11107 share->access_charset) ||
11108 str->reserve(SPIDER_SQL_AND_LEN)
11109 )
11110 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11111 (*field)->move_field_offset(-ptr_diff);
11112 }
11113 str->q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN);
11114 }
11115 }
11116 } else {
11117 KEY *key_info = &table->key_info[table->s->primary_key];
11118 KEY_PART_INFO *key_part;
11119 uint part_num;
11120 for (
11121 key_part = key_info->key_part, part_num = 0;
11122 part_num < spider_user_defined_key_parts(key_info);
11123 key_part++, part_num++
11124 ) {
11125 field = &key_part->field;
11126 field_name_length =
11127 mysql_share->column_name_str[(*field)->field_index].length();
11128 if ((*field)->is_null(ptr_diff))
11129 {
11130 if (str->reserve(field_name_length +
11131 /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
11132 SPIDER_SQL_IS_NULL_LEN + SPIDER_SQL_AND_LEN))
11133 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11134 mysql_share->append_column_name(str, (*field)->field_index);
11135 str->q_append(SPIDER_SQL_IS_NULL_STR, SPIDER_SQL_IS_NULL_LEN);
11136 } else {
11137 if (str->reserve(field_name_length +
11138 /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
11139 SPIDER_SQL_EQUAL_LEN))
11140 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11141 mysql_share->append_column_name(str, (*field)->field_index);
11142 str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
11143 (*field)->move_field_offset(ptr_diff);
11144 if (
11145 spider_db_mbase_utility->
11146 append_column_value(spider, str, *field, NULL,
11147 share->access_charset) ||
11148 str->reserve(SPIDER_SQL_AND_LEN)
11149 )
11150 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11151 (*field)->move_field_offset(-ptr_diff);
11152 }
11153 str->q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN);
11154 }
11155 }
11156 if (str->length() == str_len_bakup + SPIDER_SQL_WHERE_LEN)
11157 {
11158 /* no condition */
11159 str->length(str_len_bakup);
11160 } else {
11161 str->length(str->length() - SPIDER_SQL_AND_LEN);
11162 }
11163 if (str->reserve(SPIDER_SQL_LIMIT1_LEN))
11164 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11165 str->q_append(SPIDER_SQL_LIMIT1_STR, SPIDER_SQL_LIMIT1_LEN);
11166 DBUG_RETURN(0);
11167 }
11168
append_condition_part(const char * alias,uint alias_length,ulong sql_type,bool test_flg)11169 int spider_mbase_handler::append_condition_part(
11170 const char *alias,
11171 uint alias_length,
11172 ulong sql_type,
11173 bool test_flg
11174 ) {
11175 int error_num;
11176 spider_string *str;
11177 bool start_where = FALSE;
11178 DBUG_ENTER("spider_mbase_handler::append_condition_part");
11179 switch (sql_type)
11180 {
11181 case SPIDER_SQL_TYPE_SELECT_SQL:
11182 if (test_flg)
11183 {
11184 str = NULL;
11185 } else {
11186 str = &sql;
11187 start_where = ((int) str->length() == where_pos);
11188 }
11189 break;
11190 case SPIDER_SQL_TYPE_TMP_SQL:
11191 if (test_flg)
11192 {
11193 str = NULL;
11194 } else {
11195 str = &tmp_sql;
11196 start_where = ((int) str->length() == where_pos);
11197 }
11198 break;
11199 case SPIDER_SQL_TYPE_INSERT_SQL:
11200 case SPIDER_SQL_TYPE_UPDATE_SQL:
11201 case SPIDER_SQL_TYPE_DELETE_SQL:
11202 case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
11203 if (test_flg)
11204 {
11205 str = NULL;
11206 } else {
11207 str = &update_sql;
11208 start_where = ((int) str->length() == where_pos);
11209 }
11210 break;
11211 case SPIDER_SQL_TYPE_HANDLER:
11212 if (test_flg)
11213 {
11214 str = NULL;
11215 } else {
11216 str = &ha_sql;
11217 start_where = TRUE;
11218 if (spider->active_index == MAX_KEY)
11219 {
11220 set_where_pos(SPIDER_SQL_TYPE_HANDLER);
11221 if (str->reserve(SPIDER_SQL_READ_LEN + SPIDER_SQL_FIRST_LEN))
11222 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11223 str->q_append(SPIDER_SQL_READ_STR, SPIDER_SQL_READ_LEN);
11224 ha_next_pos = str->length();
11225 str->q_append(SPIDER_SQL_FIRST_STR, SPIDER_SQL_FIRST_LEN);
11226 sql_part2.length(0);
11227 }
11228 ha_where_pos = str->length();
11229
11230 if (
11231 spider->sql_command == SQLCOM_HA_READ ||
11232 !spider->result_list.use_both_key
11233 ) {
11234 if (sql_part2.length())
11235 {
11236 str->append(sql_part2);
11237 start_where = FALSE;
11238 }
11239 } else {
11240 DBUG_RETURN(0);
11241 }
11242 }
11243 break;
11244 default:
11245 DBUG_RETURN(0);
11246 }
11247 error_num = append_condition(str, alias, alias_length, start_where,
11248 sql_type);
11249 DBUG_RETURN(error_num);
11250 }
11251
append_condition(spider_string * str,const char * alias,uint alias_length,bool start_where,ulong sql_type)11252 int spider_mbase_handler::append_condition(
11253 spider_string *str,
11254 const char *alias,
11255 uint alias_length,
11256 bool start_where,
11257 ulong sql_type
11258 ) {
11259 int error_num, restart_pos = 0, start_where_pos;
11260 SPIDER_CONDITION *tmp_cond = spider->condition;
11261 DBUG_ENTER("spider_mbase_handler::append_condition");
11262 if (str && start_where)
11263 {
11264 start_where_pos = str->length();
11265 } else {
11266 start_where_pos = 0;
11267 }
11268
11269 if (spider->is_clone && !tmp_cond)
11270 {
11271 tmp_cond = spider->pt_clone_source_handler->condition;
11272 }
11273
11274 while (tmp_cond)
11275 {
11276 if (str)
11277 {
11278 restart_pos = str->length();
11279 if (start_where)
11280 {
11281 if (str->reserve(SPIDER_SQL_WHERE_LEN))
11282 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11283 str->q_append(SPIDER_SQL_WHERE_STR, SPIDER_SQL_WHERE_LEN);
11284 start_where = FALSE;
11285 } else {
11286 if (str->reserve(SPIDER_SQL_AND_LEN))
11287 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11288 str->q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN);
11289 }
11290 }
11291 if ((error_num = spider_db_print_item_type(
11292 (Item *) tmp_cond->cond, NULL, spider, str, alias, alias_length,
11293 dbton_id, FALSE, NULL)))
11294 {
11295 if (str && error_num == ER_SPIDER_COND_SKIP_NUM)
11296 {
11297 DBUG_PRINT("info",("spider COND skip"));
11298 str->length(restart_pos);
11299 start_where = (restart_pos == start_where_pos);
11300 } else
11301 DBUG_RETURN(error_num);
11302 }
11303 tmp_cond = tmp_cond->next;
11304 }
11305 DBUG_RETURN(0);
11306 }
11307
append_match_against_part(ulong sql_type,st_spider_ft_info * ft_info,const char * alias,uint alias_length)11308 int spider_mbase_handler::append_match_against_part(
11309 ulong sql_type,
11310 st_spider_ft_info *ft_info,
11311 const char *alias,
11312 uint alias_length
11313 ) {
11314 int error_num;
11315 spider_string *str;
11316 DBUG_ENTER("spider_mbase_handler::append_match_against_part");
11317 DBUG_PRINT("info",("spider this=%p", this));
11318 switch (sql_type)
11319 {
11320 case SPIDER_SQL_TYPE_SELECT_SQL:
11321 str = &sql;
11322 break;
11323 default:
11324 DBUG_RETURN(0);
11325 }
11326 error_num = append_match_against(str, ft_info, alias, alias_length);
11327 DBUG_RETURN(error_num);
11328 }
11329
append_match_against(spider_string * str,st_spider_ft_info * ft_info,const char * alias,uint alias_length)11330 int spider_mbase_handler::append_match_against(
11331 spider_string *str,
11332 st_spider_ft_info *ft_info,
11333 const char *alias,
11334 uint alias_length
11335 ) {
11336 SPIDER_SHARE *share = spider->share;
11337 TABLE *table = spider->get_table();
11338 String *ft_init_key;
11339 KEY *key_info;
11340 uint key_name_length;
11341 int key_count;
11342 KEY_PART_INFO *key_part;
11343 Field *field;
11344 DBUG_ENTER("spider_mbase_handler::append_match_against");
11345 DBUG_PRINT("info",("spider this=%p", this));
11346 if (str->reserve(SPIDER_SQL_MATCH_LEN))
11347 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11348 str->q_append(SPIDER_SQL_MATCH_STR, SPIDER_SQL_MATCH_LEN);
11349
11350 ft_init_key = ft_info->key;
11351 key_info = &table->key_info[ft_info->inx];
11352 DBUG_PRINT("info", ("spider spider_user_defined_key_parts=%u",
11353 spider_user_defined_key_parts(key_info)));
11354
11355 for (
11356 key_part = key_info->key_part,
11357 key_count = 0;
11358 key_count < (int) spider_user_defined_key_parts(key_info);
11359 key_part++,
11360 key_count++
11361 ) {
11362 field = key_part->field;
11363 key_name_length =
11364 mysql_share->column_name_str[field->field_index].length();
11365 if (alias_length)
11366 {
11367 if (str->reserve(alias_length + key_name_length +
11368 /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
11369 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11370 str->q_append(alias, alias_length);
11371 } else {
11372 if (str->reserve(key_name_length +
11373 /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
11374 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11375 }
11376 mysql_share->append_column_name(str, field->field_index);
11377 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
11378 }
11379 str->length(str->length() - SPIDER_SQL_COMMA_LEN);
11380 if (str->reserve(SPIDER_SQL_AGAINST_LEN + SPIDER_SQL_VALUE_QUOTE_LEN))
11381 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11382 str->q_append(SPIDER_SQL_AGAINST_STR, SPIDER_SQL_AGAINST_LEN);
11383 str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
11384
11385 char buf[MAX_FIELD_WIDTH];
11386 spider_string tmp_str(buf, MAX_FIELD_WIDTH, share->access_charset);
11387 tmp_str.init_calc_mem(116);
11388 tmp_str.length(0);
11389 if (
11390 tmp_str.append(ft_init_key->ptr(), ft_init_key->length(),
11391 ft_init_key->charset()) ||
11392 str->reserve(tmp_str.length() * 2) ||
11393 spider_db_mbase_utility->append_escaped_util(str, tmp_str.get_str())
11394 )
11395 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11396 str->mem_calc();
11397
11398 if (str->reserve(
11399 SPIDER_SQL_VALUE_QUOTE_LEN + SPIDER_SQL_CLOSE_PAREN_LEN +
11400 ((ft_info->flags & FT_BOOL) ? SPIDER_SQL_IN_BOOLEAN_MODE_LEN : 0) +
11401 ((ft_info->flags & FT_EXPAND) ?
11402 SPIDER_SQL_WITH_QUERY_EXPANSION_LEN : 0)
11403 ))
11404 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11405 str->q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
11406 if (ft_info->flags & FT_BOOL)
11407 str->q_append(SPIDER_SQL_IN_BOOLEAN_MODE_STR,
11408 SPIDER_SQL_IN_BOOLEAN_MODE_LEN);
11409 if (ft_info->flags & FT_EXPAND)
11410 str->q_append(SPIDER_SQL_WITH_QUERY_EXPANSION_STR,
11411 SPIDER_SQL_WITH_QUERY_EXPANSION_LEN);
11412 str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
11413 DBUG_RETURN(0);
11414 }
11415
append_match_select_part(ulong sql_type,const char * alias,uint alias_length)11416 int spider_mbase_handler::append_match_select_part(
11417 ulong sql_type,
11418 const char *alias,
11419 uint alias_length
11420 ) {
11421 int error_num;
11422 spider_string *str;
11423 DBUG_ENTER("spider_mbase_handler::append_match_select_part");
11424 DBUG_PRINT("info",("spider this=%p", this));
11425 switch (sql_type)
11426 {
11427 case SPIDER_SQL_TYPE_SELECT_SQL:
11428 str = &sql;
11429 break;
11430 default:
11431 DBUG_RETURN(0);
11432 }
11433 error_num = append_match_select(str, alias, alias_length);
11434 DBUG_RETURN(error_num);
11435 }
11436
append_match_select(spider_string * str,const char * alias,uint alias_length)11437 int spider_mbase_handler::append_match_select(
11438 spider_string *str,
11439 const char *alias,
11440 uint alias_length
11441 ) {
11442 int error_num;
11443 DBUG_ENTER("spider_mbase_handler::append_match_select");
11444 DBUG_PRINT("info",("spider this=%p", this));
11445 if (spider->ft_current)
11446 {
11447 st_spider_ft_info *ft_info = spider->ft_first;
11448 while (TRUE)
11449 {
11450 if ((error_num = append_match_against(str, ft_info,
11451 alias, alias_length)))
11452 DBUG_RETURN(error_num);
11453 if (str->reserve(SPIDER_SQL_COMMA_LEN))
11454 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11455 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
11456 if (ft_info == spider->ft_current)
11457 break;
11458 ft_info = ft_info->next;
11459 }
11460 }
11461 DBUG_RETURN(0);
11462 }
11463
11464 #ifdef HANDLER_HAS_DIRECT_AGGREGATE
append_sum_select_part(ulong sql_type,const char * alias,uint alias_length)11465 int spider_mbase_handler::append_sum_select_part(
11466 ulong sql_type,
11467 const char *alias,
11468 uint alias_length
11469 ) {
11470 int error_num;
11471 spider_string *str;
11472 DBUG_ENTER("spider_mbase_handler::append_sum_select_part");
11473 DBUG_PRINT("info",("spider this=%p", this));
11474 switch (sql_type)
11475 {
11476 case SPIDER_SQL_TYPE_SELECT_SQL:
11477 str = &sql;
11478 break;
11479 default:
11480 DBUG_RETURN(0);
11481 }
11482 error_num = append_sum_select(str, alias, alias_length);
11483 DBUG_RETURN(error_num);
11484 }
11485
append_sum_select(spider_string * str,const char * alias,uint alias_length)11486 int spider_mbase_handler::append_sum_select(
11487 spider_string *str,
11488 const char *alias,
11489 uint alias_length
11490 ) {
11491 int error_num;
11492 st_select_lex *select_lex;
11493 DBUG_ENTER("spider_mbase_handler::append_sum_select");
11494 DBUG_PRINT("info",("spider this=%p", this));
11495 select_lex = spider_get_select_lex(spider);
11496 JOIN *join = select_lex->join;
11497 Item_sum **item_sum_ptr;
11498 for (item_sum_ptr = join->sum_funcs; *item_sum_ptr; ++item_sum_ptr)
11499 {
11500 if ((error_num = spider_db_mbase_utility->open_item_sum_func(*item_sum_ptr,
11501 spider, str, alias, alias_length, FALSE, NULL)))
11502 {
11503 DBUG_RETURN(error_num);
11504 }
11505 if (str->reserve(SPIDER_SQL_COMMA_LEN))
11506 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11507 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
11508 }
11509 DBUG_RETURN(0);
11510 }
11511 #endif
11512
set_order_pos(ulong sql_type)11513 void spider_mbase_handler::set_order_pos(
11514 ulong sql_type
11515 ) {
11516 DBUG_ENTER("spider_mbase_handler::set_order_pos");
11517 switch (sql_type)
11518 {
11519 case SPIDER_SQL_TYPE_SELECT_SQL:
11520 case SPIDER_SQL_TYPE_TMP_SQL:
11521 order_pos = sql.length();
11522 break;
11523 case SPIDER_SQL_TYPE_INSERT_SQL:
11524 case SPIDER_SQL_TYPE_UPDATE_SQL:
11525 case SPIDER_SQL_TYPE_DELETE_SQL:
11526 case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
11527 order_pos = update_sql.length();
11528 break;
11529 case SPIDER_SQL_TYPE_HANDLER:
11530 ha_next_pos = ha_sql.length();
11531 break;
11532 default:
11533 DBUG_ASSERT(0);
11534 break;
11535 }
11536 DBUG_VOID_RETURN;
11537 }
11538
set_order_to_pos(ulong sql_type)11539 void spider_mbase_handler::set_order_to_pos(
11540 ulong sql_type
11541 ) {
11542 DBUG_ENTER("spider_mbase_handler::set_order_to_pos");
11543 switch (sql_type)
11544 {
11545 case SPIDER_SQL_TYPE_SELECT_SQL:
11546 case SPIDER_SQL_TYPE_TMP_SQL:
11547 sql.length(order_pos);
11548 break;
11549 case SPIDER_SQL_TYPE_INSERT_SQL:
11550 case SPIDER_SQL_TYPE_UPDATE_SQL:
11551 case SPIDER_SQL_TYPE_DELETE_SQL:
11552 case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
11553 update_sql.length(order_pos);
11554 break;
11555 case SPIDER_SQL_TYPE_HANDLER:
11556 ha_sql.length(ha_next_pos);
11557 break;
11558 default:
11559 DBUG_ASSERT(0);
11560 break;
11561 }
11562 DBUG_VOID_RETURN;
11563 }
11564
11565 #ifdef HANDLER_HAS_DIRECT_AGGREGATE
append_group_by_part(const char * alias,uint alias_length,ulong sql_type)11566 int spider_mbase_handler::append_group_by_part(
11567 const char *alias,
11568 uint alias_length,
11569 ulong sql_type
11570 ) {
11571 int error_num;
11572 spider_string *str;
11573 DBUG_ENTER("spider_mbase_handler::append_group_by_part");
11574 DBUG_PRINT("info",("spider this=%p", this));
11575 switch (sql_type)
11576 {
11577 case SPIDER_SQL_TYPE_SELECT_SQL:
11578 case SPIDER_SQL_TYPE_TMP_SQL:
11579 str = &sql;
11580 break;
11581 case SPIDER_SQL_TYPE_INSERT_SQL:
11582 case SPIDER_SQL_TYPE_UPDATE_SQL:
11583 case SPIDER_SQL_TYPE_DELETE_SQL:
11584 case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
11585 str = &update_sql;
11586 break;
11587 case SPIDER_SQL_TYPE_HANDLER:
11588 str = &ha_sql;
11589 break;
11590 default:
11591 DBUG_RETURN(0);
11592 }
11593 error_num = append_group_by(str, alias, alias_length);
11594 DBUG_RETURN(error_num);
11595 }
11596
append_group_by(spider_string * str,const char * alias,uint alias_length)11597 int spider_mbase_handler::append_group_by(
11598 spider_string *str,
11599 const char *alias,
11600 uint alias_length
11601 ) {
11602 int error_num;
11603 st_select_lex *select_lex;
11604 DBUG_ENTER("spider_mbase_handler::append_group_by");
11605 DBUG_PRINT("info",("spider this=%p", this));
11606 select_lex = spider_get_select_lex(spider);
11607 ORDER *group = (ORDER *) select_lex->group_list.first;
11608 if (group)
11609 {
11610 if (str->reserve(SPIDER_SQL_GROUP_LEN))
11611 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11612 str->q_append(SPIDER_SQL_GROUP_STR, SPIDER_SQL_GROUP_LEN);
11613 for (; group; group = group->next)
11614 {
11615 if ((error_num = spider_db_print_item_type((*group->item), NULL, spider,
11616 str, alias, alias_length, dbton_id, FALSE, NULL)))
11617 {
11618 DBUG_RETURN(error_num);
11619 }
11620 if (str->reserve(SPIDER_SQL_COMMA_LEN))
11621 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11622 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
11623 }
11624 str->length(str->length() - SPIDER_SQL_COMMA_LEN);
11625 }
11626 DBUG_RETURN(0);
11627 }
11628 #endif
11629
append_key_order_for_merge_with_alias_part(const char * alias,uint alias_length,ulong sql_type)11630 int spider_mbase_handler::append_key_order_for_merge_with_alias_part(
11631 const char *alias,
11632 uint alias_length,
11633 ulong sql_type
11634 ) {
11635 int error_num;
11636 spider_string *str;
11637 DBUG_ENTER("spider_mbase_handler::append_key_order_for_merge_with_alias_part");
11638 DBUG_PRINT("info",("spider this=%p", this));
11639 switch (sql_type)
11640 {
11641 case SPIDER_SQL_TYPE_SELECT_SQL:
11642 case SPIDER_SQL_TYPE_TMP_SQL:
11643 str = &sql;
11644 break;
11645 case SPIDER_SQL_TYPE_INSERT_SQL:
11646 case SPIDER_SQL_TYPE_UPDATE_SQL:
11647 case SPIDER_SQL_TYPE_DELETE_SQL:
11648 case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
11649 str = &update_sql;
11650 break;
11651 case SPIDER_SQL_TYPE_HANDLER:
11652 str = &ha_sql;
11653 ha_limit_pos = ha_sql.length();
11654 break;
11655 default:
11656 DBUG_RETURN(0);
11657 }
11658 error_num = append_key_order_for_merge_with_alias(str, alias, alias_length);
11659 DBUG_RETURN(error_num);
11660 }
11661
append_key_order_for_merge_with_alias(spider_string * str,const char * alias,uint alias_length)11662 int spider_mbase_handler::append_key_order_for_merge_with_alias(
11663 spider_string *str,
11664 const char *alias,
11665 uint alias_length
11666 ) {
11667 /* sort for index merge */
11668 TABLE *table = spider->get_table();
11669 int length;
11670 Field *field;
11671 uint key_name_length;
11672 DBUG_ENTER("spider_mbase_handler::append_key_order_for_merge_with_alias");
11673 DBUG_PRINT("info",("spider this=%p", this));
11674 #ifdef HANDLER_HAS_DIRECT_AGGREGATE
11675 if (spider->result_list.direct_aggregate)
11676 {
11677 int error_num;
11678 if ((error_num = append_group_by(str, alias, alias_length)))
11679 DBUG_RETURN(error_num);
11680 }
11681 #endif
11682 if (table->s->primary_key < MAX_KEY)
11683 {
11684 /* sort by primary key */
11685 KEY *key_info = &table->key_info[table->s->primary_key];
11686 KEY_PART_INFO *key_part;
11687 for (
11688 key_part = key_info->key_part,
11689 length = 1;
11690 length <= (int) spider_user_defined_key_parts(key_info);
11691 key_part++,
11692 length++
11693 ) {
11694 field = key_part->field;
11695 key_name_length =
11696 mysql_share->column_name_str[field->field_index].length();
11697 if (length == 1)
11698 {
11699 if (str->reserve(SPIDER_SQL_ORDER_LEN))
11700 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11701 str->q_append(SPIDER_SQL_ORDER_STR, SPIDER_SQL_ORDER_LEN);
11702 }
11703 if (str->reserve(alias_length + key_name_length +
11704 /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
11705 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11706 str->q_append(alias, alias_length);
11707 mysql_share->append_column_name(str, field->field_index);
11708 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
11709 }
11710 if (length > 1)
11711 {
11712 str->length(str->length() - SPIDER_SQL_COMMA_LEN);
11713 }
11714 } else {
11715 /* sort by all columns */
11716 Field **fieldp;
11717 for (
11718 fieldp = table->field, length = 1;
11719 *fieldp;
11720 fieldp++, length++
11721 ) {
11722 key_name_length =
11723 mysql_share->column_name_str[(*fieldp)->field_index].length();
11724 if (length == 1)
11725 {
11726 if (str->reserve(SPIDER_SQL_ORDER_LEN))
11727 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11728 str->q_append(SPIDER_SQL_ORDER_STR, SPIDER_SQL_ORDER_LEN);
11729 }
11730 if (str->reserve(alias_length + key_name_length +
11731 /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
11732 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11733 str->q_append(alias, alias_length);
11734 mysql_share->append_column_name(str, (*fieldp)->field_index);
11735 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
11736 }
11737 if (length > 1)
11738 {
11739 str->length(str->length() - SPIDER_SQL_COMMA_LEN);
11740 }
11741 }
11742 limit_pos = str->length();
11743 DBUG_RETURN(0);
11744 }
11745
append_key_order_for_direct_order_limit_with_alias_part(const char * alias,uint alias_length,ulong sql_type)11746 int spider_mbase_handler::append_key_order_for_direct_order_limit_with_alias_part(
11747 const char *alias,
11748 uint alias_length,
11749 ulong sql_type
11750 ) {
11751 int error_num;
11752 spider_string *str;
11753 DBUG_ENTER("spider_mbase_handler::append_key_order_for_direct_order_limit_with_alias_part");
11754 DBUG_PRINT("info",("spider this=%p", this));
11755 switch (sql_type)
11756 {
11757 case SPIDER_SQL_TYPE_SELECT_SQL:
11758 case SPIDER_SQL_TYPE_TMP_SQL:
11759 str = &sql;
11760 break;
11761 case SPIDER_SQL_TYPE_INSERT_SQL:
11762 case SPIDER_SQL_TYPE_UPDATE_SQL:
11763 case SPIDER_SQL_TYPE_DELETE_SQL:
11764 case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
11765 str = &update_sql;
11766 break;
11767 case SPIDER_SQL_TYPE_HANDLER:
11768 str = &ha_sql;
11769 break;
11770 default:
11771 DBUG_RETURN(0);
11772 }
11773 error_num = append_key_order_for_direct_order_limit_with_alias(
11774 str, alias, alias_length);
11775 DBUG_RETURN(error_num);
11776 }
11777
append_key_order_for_direct_order_limit_with_alias(spider_string * str,const char * alias,uint alias_length)11778 int spider_mbase_handler::append_key_order_for_direct_order_limit_with_alias(
11779 spider_string *str,
11780 const char *alias,
11781 uint alias_length
11782 ) {
11783 int error_num;
11784 ORDER *order;
11785 st_select_lex *select_lex;
11786 longlong select_limit;
11787 longlong offset_limit;
11788 DBUG_ENTER("spider_mbase_handler::append_key_order_for_direct_order_limit_with_alias");
11789 DBUG_PRINT("info",("spider this=%p", this));
11790 #ifdef HANDLER_HAS_DIRECT_AGGREGATE
11791 if (spider->result_list.direct_aggregate)
11792 {
11793 if ((error_num = append_group_by(str, alias, alias_length)))
11794 DBUG_RETURN(error_num);
11795 }
11796 #endif
11797 spider_get_select_limit(spider, &select_lex, &select_limit,
11798 &offset_limit);
11799 if (select_lex->order_list.first)
11800 {
11801 if (str->reserve(SPIDER_SQL_ORDER_LEN))
11802 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11803 str->q_append(SPIDER_SQL_ORDER_STR, SPIDER_SQL_ORDER_LEN);
11804 for (order = (ORDER *) select_lex->order_list.first; order;
11805 order = order->next)
11806 {
11807 if ((error_num =
11808 spider_db_print_item_type((*order->item), NULL, spider, str, alias,
11809 alias_length, dbton_id, FALSE, NULL)))
11810 {
11811 DBUG_PRINT("info",("spider error=%d", error_num));
11812 DBUG_RETURN(error_num);
11813 }
11814 if (SPIDER_order_direction_is_asc(order))
11815 {
11816 if (str->reserve(SPIDER_SQL_COMMA_LEN))
11817 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11818 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
11819 } else {
11820 if (str->reserve(SPIDER_SQL_DESC_LEN + SPIDER_SQL_COMMA_LEN))
11821 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11822 str->q_append(SPIDER_SQL_DESC_STR, SPIDER_SQL_DESC_LEN);
11823 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
11824 }
11825 }
11826 str->length(str->length() - SPIDER_SQL_COMMA_LEN);
11827 }
11828 limit_pos = str->length();
11829 DBUG_RETURN(0);
11830 }
11831
append_key_order_with_alias_part(const char * alias,uint alias_length,ulong sql_type)11832 int spider_mbase_handler::append_key_order_with_alias_part(
11833 const char *alias,
11834 uint alias_length,
11835 ulong sql_type
11836 ) {
11837 int error_num;
11838 spider_string *str;
11839 DBUG_ENTER("spider_mbase_handler::append_key_order_with_alias_part");
11840 DBUG_PRINT("info",("spider this=%p", this));
11841 switch (sql_type)
11842 {
11843 case SPIDER_SQL_TYPE_SELECT_SQL:
11844 case SPIDER_SQL_TYPE_TMP_SQL:
11845 str = &sql;
11846 break;
11847 case SPIDER_SQL_TYPE_INSERT_SQL:
11848 case SPIDER_SQL_TYPE_UPDATE_SQL:
11849 case SPIDER_SQL_TYPE_DELETE_SQL:
11850 case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
11851 str = &update_sql;
11852 break;
11853 case SPIDER_SQL_TYPE_HANDLER:
11854 str = &ha_sql;
11855 error_num = append_key_order_for_handler(str, alias, alias_length);
11856 DBUG_RETURN(error_num);
11857 default:
11858 DBUG_RETURN(0);
11859 }
11860 error_num = append_key_order_with_alias(str, alias, alias_length);
11861 DBUG_RETURN(error_num);
11862 }
11863
append_key_order_for_handler(spider_string * str,const char * alias,uint alias_length)11864 int spider_mbase_handler::append_key_order_for_handler(
11865 spider_string *str,
11866 const char *alias,
11867 uint alias_length
11868 ) {
11869 DBUG_ENTER("spider_mbase_handler::append_key_order_for_handler");
11870 DBUG_PRINT("info",("spider this=%p", this));
11871 DBUG_PRINT("info",("spider ha_next_pos=%d", ha_next_pos));
11872 DBUG_PRINT("info",("spider ha_where_pos=%d", ha_where_pos));
11873 str->q_append(alias, alias_length);
11874 memset((char *) str->ptr() + str->length(), ' ',
11875 ha_where_pos - ha_next_pos - alias_length);
11876 DBUG_RETURN(0);
11877 }
11878
append_key_order_with_alias(spider_string * str,const char * alias,uint alias_length)11879 int spider_mbase_handler::append_key_order_with_alias(
11880 spider_string *str,
11881 const char *alias,
11882 uint alias_length
11883 ) {
11884 SPIDER_RESULT_LIST *result_list = &spider->result_list;
11885 KEY *key_info = result_list->key_info;
11886 int length;
11887 KEY_PART_INFO *key_part;
11888 Field *field;
11889 uint key_name_length;
11890 DBUG_ENTER("spider_mbase_handler::append_key_order_with_alias");
11891 DBUG_PRINT("info",("spider this=%p", this));
11892 #ifdef HANDLER_HAS_DIRECT_AGGREGATE
11893 if (spider->result_list.direct_aggregate)
11894 {
11895 int error_num;
11896 if ((error_num = append_group_by(str, alias, alias_length)))
11897 DBUG_RETURN(error_num);
11898 }
11899 #endif
11900 if (result_list->sorted == TRUE)
11901 {
11902 if (result_list->desc_flg == TRUE)
11903 {
11904 for (
11905 key_part = key_info->key_part + result_list->key_order,
11906 length = 1;
11907 length + result_list->key_order <
11908 (int) spider_user_defined_key_parts(key_info) &&
11909 length < result_list->max_order;
11910 key_part++,
11911 length++
11912 ) {
11913 field = key_part->field;
11914 key_name_length =
11915 mysql_share->column_name_str[field->field_index].length();
11916 if (length == 1)
11917 {
11918 if (str->reserve(SPIDER_SQL_ORDER_LEN))
11919 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11920 str->q_append(SPIDER_SQL_ORDER_STR, SPIDER_SQL_ORDER_LEN);
11921 }
11922 if (key_part->key_part_flag & HA_REVERSE_SORT)
11923 {
11924 if (str->reserve(alias_length + key_name_length +
11925 /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
11926 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11927 str->q_append(alias, alias_length);
11928 mysql_share->append_column_name(str, field->field_index);
11929 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
11930 } else {
11931 if (str->reserve(alias_length + key_name_length +
11932 /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
11933 SPIDER_SQL_DESC_LEN + SPIDER_SQL_COMMA_LEN))
11934 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11935 str->q_append(alias, alias_length);
11936 mysql_share->append_column_name(str, field->field_index);
11937 str->q_append(SPIDER_SQL_DESC_STR, SPIDER_SQL_DESC_LEN);
11938 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
11939 }
11940 }
11941 if (
11942 length + result_list->key_order <=
11943 (int) spider_user_defined_key_parts(key_info) &&
11944 length <= result_list->max_order
11945 ) {
11946 field = key_part->field;
11947 key_name_length =
11948 mysql_share->column_name_str[field->field_index].length();
11949 if (length == 1)
11950 {
11951 if (str->reserve(SPIDER_SQL_ORDER_LEN))
11952 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11953 str->q_append(SPIDER_SQL_ORDER_STR, SPIDER_SQL_ORDER_LEN);
11954 }
11955 if (key_part->key_part_flag & HA_REVERSE_SORT)
11956 {
11957 if (str->reserve(alias_length + key_name_length +
11958 /* SPIDER_SQL_NAME_QUOTE_LEN */ 2))
11959 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11960 str->q_append(alias, alias_length);
11961 mysql_share->append_column_name(str, field->field_index);
11962 } else {
11963 if (str->reserve(alias_length + key_name_length +
11964 /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_DESC_LEN))
11965 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11966 str->q_append(alias, alias_length);
11967 mysql_share->append_column_name(str, field->field_index);
11968 str->q_append(SPIDER_SQL_DESC_STR, SPIDER_SQL_DESC_LEN);
11969 }
11970 }
11971 } else {
11972 for (
11973 key_part = key_info->key_part + result_list->key_order,
11974 length = 1;
11975 length + result_list->key_order <
11976 (int) spider_user_defined_key_parts(key_info) &&
11977 length < result_list->max_order;
11978 key_part++,
11979 length++
11980 ) {
11981 field = key_part->field;
11982 key_name_length =
11983 mysql_share->column_name_str[field->field_index].length();
11984 if (length == 1)
11985 {
11986 if (str->reserve(SPIDER_SQL_ORDER_LEN))
11987 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11988 str->q_append(SPIDER_SQL_ORDER_STR, SPIDER_SQL_ORDER_LEN);
11989 }
11990 if (key_part->key_part_flag & HA_REVERSE_SORT)
11991 {
11992 if (str->reserve(alias_length + key_name_length +
11993 /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
11994 SPIDER_SQL_DESC_LEN + SPIDER_SQL_COMMA_LEN))
11995 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
11996 str->q_append(alias, alias_length);
11997 mysql_share->append_column_name(str, field->field_index);
11998 str->q_append(SPIDER_SQL_DESC_STR, SPIDER_SQL_DESC_LEN);
11999 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
12000 } else {
12001 if (str->reserve(alias_length + key_name_length +
12002 /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
12003 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12004 str->q_append(alias, alias_length);
12005 mysql_share->append_column_name(str, field->field_index);
12006 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
12007 }
12008 }
12009 if (
12010 length + result_list->key_order <=
12011 (int) spider_user_defined_key_parts(key_info) &&
12012 length <= result_list->max_order
12013 ) {
12014 field = key_part->field;
12015 key_name_length =
12016 mysql_share->column_name_str[field->field_index].length();
12017 if (length == 1)
12018 {
12019 if (str->reserve(SPIDER_SQL_ORDER_LEN))
12020 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12021 str->q_append(SPIDER_SQL_ORDER_STR, SPIDER_SQL_ORDER_LEN);
12022 }
12023 if (key_part->key_part_flag & HA_REVERSE_SORT)
12024 {
12025 if (str->reserve(alias_length + key_name_length +
12026 /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_DESC_LEN))
12027 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12028 str->q_append(alias, alias_length);
12029 mysql_share->append_column_name(str, field->field_index);
12030 str->q_append(SPIDER_SQL_DESC_STR, SPIDER_SQL_DESC_LEN);
12031 } else {
12032 if (str->reserve(alias_length + key_name_length +
12033 /* SPIDER_SQL_NAME_QUOTE_LEN */ 2))
12034 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12035 str->q_append(alias, alias_length);
12036 mysql_share->append_column_name(str, field->field_index);
12037 }
12038 }
12039 }
12040 }
12041 limit_pos = str->length();
12042 DBUG_RETURN(0);
12043 }
12044
append_limit_part(longlong offset,longlong limit,ulong sql_type)12045 int spider_mbase_handler::append_limit_part(
12046 longlong offset,
12047 longlong limit,
12048 ulong sql_type
12049 ) {
12050 int error_num;
12051 spider_string *str;
12052 DBUG_ENTER("spider_mbase_handler::append_limit_part");
12053 DBUG_PRINT("info",("spider this=%p", this));
12054 switch (sql_type)
12055 {
12056 case SPIDER_SQL_TYPE_SELECT_SQL:
12057 str = &sql;
12058 limit_pos = str->length();
12059 break;
12060 case SPIDER_SQL_TYPE_TMP_SQL:
12061 str = &tmp_sql;
12062 limit_pos = str->length();
12063 break;
12064 case SPIDER_SQL_TYPE_INSERT_SQL:
12065 case SPIDER_SQL_TYPE_UPDATE_SQL:
12066 case SPIDER_SQL_TYPE_DELETE_SQL:
12067 case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
12068 str = &update_sql;
12069 limit_pos = str->length();
12070 break;
12071 case SPIDER_SQL_TYPE_HANDLER:
12072 str = &ha_sql;
12073 ha_limit_pos = str->length();
12074 break;
12075 default:
12076 DBUG_RETURN(0);
12077 }
12078 error_num = append_limit(str, offset, limit);
12079 DBUG_RETURN(error_num);
12080 }
12081
reappend_limit_part(longlong offset,longlong limit,ulong sql_type)12082 int spider_mbase_handler::reappend_limit_part(
12083 longlong offset,
12084 longlong limit,
12085 ulong sql_type
12086 ) {
12087 int error_num;
12088 spider_string *str;
12089 DBUG_ENTER("spider_mbase_handler::reappend_limit_part");
12090 DBUG_PRINT("info",("spider this=%p", this));
12091 switch (sql_type)
12092 {
12093 case SPIDER_SQL_TYPE_SELECT_SQL:
12094 str = &sql;
12095 str->length(limit_pos);
12096 break;
12097 case SPIDER_SQL_TYPE_TMP_SQL:
12098 str = &tmp_sql;
12099 str->length(limit_pos);
12100 break;
12101 case SPIDER_SQL_TYPE_INSERT_SQL:
12102 case SPIDER_SQL_TYPE_UPDATE_SQL:
12103 case SPIDER_SQL_TYPE_DELETE_SQL:
12104 case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
12105 str = &update_sql;
12106 str->length(limit_pos);
12107 break;
12108 case SPIDER_SQL_TYPE_HANDLER:
12109 str = &ha_sql;
12110 str->length(ha_limit_pos);
12111 break;
12112 default:
12113 DBUG_RETURN(0);
12114 }
12115 error_num = append_limit(str, offset, limit);
12116 DBUG_RETURN(error_num);
12117 }
12118
append_limit(spider_string * str,longlong offset,longlong limit)12119 int spider_mbase_handler::append_limit(
12120 spider_string *str,
12121 longlong offset,
12122 longlong limit
12123 ) {
12124 char buf[SPIDER_LONGLONG_LEN + 1];
12125 uint32 length;
12126 DBUG_ENTER("spider_mbase_handler::append_limit");
12127 DBUG_PRINT("info",("spider this=%p", this));
12128 DBUG_PRINT("info", ("spider offset=%lld", offset));
12129 DBUG_PRINT("info", ("spider limit=%lld", limit));
12130 if (offset || limit < 9223372036854775807LL)
12131 {
12132 if (str->reserve(SPIDER_SQL_LIMIT_LEN + SPIDER_SQL_COMMA_LEN +
12133 ((SPIDER_LONGLONG_LEN) * 2)))
12134 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12135 str->q_append(SPIDER_SQL_LIMIT_STR, SPIDER_SQL_LIMIT_LEN);
12136 if (offset)
12137 {
12138 length = (uint32) (my_charset_bin.cset->longlong10_to_str)(
12139 &my_charset_bin, buf, SPIDER_LONGLONG_LEN + 1, -10, offset);
12140 str->q_append(buf, length);
12141 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
12142 }
12143 length = (uint32) (my_charset_bin.cset->longlong10_to_str)(
12144 &my_charset_bin, buf, SPIDER_LONGLONG_LEN + 1, -10, limit);
12145 str->q_append(buf, length);
12146 }
12147 DBUG_RETURN(0);
12148 }
12149
append_select_lock_part(ulong sql_type)12150 int spider_mbase_handler::append_select_lock_part(
12151 ulong sql_type
12152 ) {
12153 int error_num;
12154 spider_string *str;
12155 DBUG_ENTER("spider_mbase_handler::append_select_lock_part");
12156 DBUG_PRINT("info",("spider this=%p", this));
12157 switch (sql_type)
12158 {
12159 case SPIDER_SQL_TYPE_SELECT_SQL:
12160 str = &sql;
12161 break;
12162 default:
12163 DBUG_RETURN(0);
12164 }
12165 error_num = append_select_lock(str);
12166 DBUG_RETURN(error_num);
12167 }
12168
append_select_lock(spider_string * str)12169 int spider_mbase_handler::append_select_lock(
12170 spider_string *str
12171 ) {
12172 int lock_mode = spider_conn_lock_mode(spider);
12173 DBUG_ENTER("spider_mbase_handler::append_select_lock");
12174 DBUG_PRINT("info",("spider this=%p", this));
12175 if (lock_mode == SPIDER_LOCK_MODE_EXCLUSIVE)
12176 {
12177 if (str->reserve(SPIDER_SQL_FOR_UPDATE_LEN))
12178 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12179 str->q_append(SPIDER_SQL_FOR_UPDATE_STR, SPIDER_SQL_FOR_UPDATE_LEN);
12180 } else if (lock_mode == SPIDER_LOCK_MODE_SHARED)
12181 {
12182 if (str->reserve(SPIDER_SQL_SHARED_LOCK_LEN))
12183 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12184 str->q_append(SPIDER_SQL_SHARED_LOCK_STR, SPIDER_SQL_SHARED_LOCK_LEN);
12185 }
12186 DBUG_RETURN(0);
12187 }
12188
append_union_all_start_part(ulong sql_type)12189 int spider_mbase_handler::append_union_all_start_part(
12190 ulong sql_type
12191 ) {
12192 int error_num;
12193 spider_string *str;
12194 DBUG_ENTER("spider_mbase_handler::append_union_all_start_part");
12195 DBUG_PRINT("info",("spider this=%p", this));
12196 switch (sql_type)
12197 {
12198 case SPIDER_SQL_TYPE_SELECT_SQL:
12199 str = &sql;
12200 break;
12201 default:
12202 DBUG_RETURN(0);
12203 }
12204 error_num = append_union_all_start(str);
12205 DBUG_RETURN(error_num);
12206 }
12207
append_union_all_start(spider_string * str)12208 int spider_mbase_handler::append_union_all_start(
12209 spider_string *str
12210 ) {
12211 DBUG_ENTER("spider_mbase_handler::append_union_all_start");
12212 DBUG_PRINT("info",("spider this=%p", this));
12213 if (str->reserve(SPIDER_SQL_OPEN_PAREN_LEN))
12214 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12215 str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
12216 DBUG_RETURN(0);
12217 }
12218
append_union_all_part(ulong sql_type)12219 int spider_mbase_handler::append_union_all_part(
12220 ulong sql_type
12221 ) {
12222 int error_num;
12223 spider_string *str;
12224 DBUG_ENTER("spider_mbase_handler::append_union_all_part");
12225 DBUG_PRINT("info",("spider this=%p", this));
12226 switch (sql_type)
12227 {
12228 case SPIDER_SQL_TYPE_SELECT_SQL:
12229 str = &sql;
12230 break;
12231 default:
12232 DBUG_RETURN(0);
12233 }
12234 error_num = append_union_all(str);
12235 DBUG_RETURN(error_num);
12236 }
12237
append_union_all(spider_string * str)12238 int spider_mbase_handler::append_union_all(
12239 spider_string *str
12240 ) {
12241 DBUG_ENTER("spider_mbase_handler::append_union_all");
12242 DBUG_PRINT("info",("spider this=%p", this));
12243 if (str->reserve(SPIDER_SQL_UNION_ALL_LEN))
12244 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12245 str->q_append(SPIDER_SQL_UNION_ALL_STR, SPIDER_SQL_UNION_ALL_LEN);
12246 DBUG_RETURN(0);
12247 }
12248
append_union_all_end_part(ulong sql_type)12249 int spider_mbase_handler::append_union_all_end_part(
12250 ulong sql_type
12251 ) {
12252 int error_num;
12253 spider_string *str;
12254 DBUG_ENTER("spider_mbase_handler::append_union_all_end_part");
12255 DBUG_PRINT("info",("spider this=%p", this));
12256 switch (sql_type)
12257 {
12258 case SPIDER_SQL_TYPE_SELECT_SQL:
12259 str = &sql;
12260 break;
12261 default:
12262 DBUG_RETURN(0);
12263 }
12264 error_num = append_union_all_end(str);
12265 DBUG_RETURN(error_num);
12266 }
12267
append_union_all_end(spider_string * str)12268 int spider_mbase_handler::append_union_all_end(
12269 spider_string *str
12270 ) {
12271 DBUG_ENTER("spider_mbase_handler::append_union_all_end");
12272 DBUG_PRINT("info",("spider this=%p", this));
12273 str->length(str->length() -
12274 SPIDER_SQL_UNION_ALL_LEN + SPIDER_SQL_CLOSE_PAREN_LEN);
12275 DBUG_RETURN(0);
12276 }
12277
append_multi_range_cnt_part(ulong sql_type,uint multi_range_cnt,bool with_comma)12278 int spider_mbase_handler::append_multi_range_cnt_part(
12279 ulong sql_type,
12280 uint multi_range_cnt,
12281 bool with_comma
12282 ) {
12283 int error_num;
12284 spider_string *str;
12285 DBUG_ENTER("spider_mbase_handler::append_multi_range_cnt_part");
12286 DBUG_PRINT("info",("spider this=%p", this));
12287 switch (sql_type)
12288 {
12289 case SPIDER_SQL_TYPE_SELECT_SQL:
12290 str = &sql;
12291 break;
12292 case SPIDER_SQL_TYPE_TMP_SQL:
12293 str = &tmp_sql;
12294 break;
12295 default:
12296 DBUG_RETURN(0);
12297 }
12298 error_num = append_multi_range_cnt(str, multi_range_cnt, with_comma);
12299 DBUG_RETURN(error_num);
12300 }
12301
append_multi_range_cnt(spider_string * str,uint multi_range_cnt,bool with_comma)12302 int spider_mbase_handler::append_multi_range_cnt(
12303 spider_string *str,
12304 uint multi_range_cnt,
12305 bool with_comma
12306 ) {
12307 int range_cnt_length;
12308 char range_cnt_str[SPIDER_SQL_INT_LEN];
12309 DBUG_ENTER("spider_mbase_handler::append_multi_range_cnt");
12310 DBUG_PRINT("info",("spider this=%p", this));
12311 range_cnt_length = my_sprintf(range_cnt_str, (range_cnt_str, "%u",
12312 multi_range_cnt));
12313 if (with_comma)
12314 {
12315 if (str->reserve(range_cnt_length + SPIDER_SQL_COMMA_LEN))
12316 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12317 str->q_append(range_cnt_str, range_cnt_length);
12318 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
12319 } else {
12320 if (str->reserve(range_cnt_length))
12321 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12322 str->q_append(range_cnt_str, range_cnt_length);
12323 }
12324 DBUG_RETURN(0);
12325 }
12326
append_multi_range_cnt_with_name_part(ulong sql_type,uint multi_range_cnt)12327 int spider_mbase_handler::append_multi_range_cnt_with_name_part(
12328 ulong sql_type,
12329 uint multi_range_cnt
12330 ) {
12331 int error_num;
12332 spider_string *str;
12333 DBUG_ENTER("spider_mbase_handler::append_multi_range_cnt_with_name_part");
12334 DBUG_PRINT("info",("spider this=%p", this));
12335 switch (sql_type)
12336 {
12337 case SPIDER_SQL_TYPE_SELECT_SQL:
12338 str = &sql;
12339 break;
12340 case SPIDER_SQL_TYPE_TMP_SQL:
12341 str = &tmp_sql;
12342 break;
12343 default:
12344 DBUG_RETURN(0);
12345 }
12346 error_num = append_multi_range_cnt_with_name(str, multi_range_cnt);
12347 DBUG_RETURN(error_num);
12348 }
12349
append_multi_range_cnt_with_name(spider_string * str,uint multi_range_cnt)12350 int spider_mbase_handler::append_multi_range_cnt_with_name(
12351 spider_string *str,
12352 uint multi_range_cnt
12353 ) {
12354 int range_cnt_length;
12355 char range_cnt_str[SPIDER_SQL_INT_LEN];
12356 DBUG_ENTER("spider_mbase_handler::append_multi_range_cnt_with_name");
12357 DBUG_PRINT("info",("spider this=%p", this));
12358 range_cnt_length = my_sprintf(range_cnt_str, (range_cnt_str, "%u",
12359 multi_range_cnt));
12360 if (str->reserve(range_cnt_length + SPIDER_SQL_SPACE_LEN +
12361 SPIDER_SQL_ID_LEN + SPIDER_SQL_COMMA_LEN))
12362 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12363 str->q_append(range_cnt_str, range_cnt_length);
12364 str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
12365 str->q_append(SPIDER_SQL_ID_STR, SPIDER_SQL_ID_LEN);
12366 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
12367 DBUG_RETURN(0);
12368 }
12369
append_open_handler_part(ulong sql_type,uint handler_id,SPIDER_CONN * conn,int link_idx)12370 int spider_mbase_handler::append_open_handler_part(
12371 ulong sql_type,
12372 uint handler_id,
12373 SPIDER_CONN *conn,
12374 int link_idx
12375 ) {
12376 int error_num;
12377 spider_string *str;
12378 DBUG_ENTER("spider_mbase_handler::append_open_handler_part");
12379 DBUG_PRINT("info",("spider this=%p", this));
12380 switch (sql_type)
12381 {
12382 case SPIDER_SQL_TYPE_HANDLER:
12383 str = &ha_sql;
12384 break;
12385 default:
12386 DBUG_RETURN(0);
12387 }
12388 error_num = append_open_handler(str, handler_id, conn, link_idx);
12389 exec_ha_sql = str;
12390 DBUG_RETURN(error_num);
12391 }
12392
append_open_handler(spider_string * str,uint handler_id,SPIDER_CONN * conn,int link_idx)12393 int spider_mbase_handler::append_open_handler(
12394 spider_string *str,
12395 uint handler_id,
12396 SPIDER_CONN *conn,
12397 int link_idx
12398 ) {
12399 int error_num;
12400 DBUG_ENTER("spider_mbase_handler::append_open_handler");
12401 DBUG_PRINT("info",("spider this=%p", this));
12402 DBUG_PRINT("info",("spider link_idx=%d", link_idx));
12403 DBUG_PRINT("info",("spider m_handler_cid=%s",
12404 spider->m_handler_cid[link_idx]));
12405 if (str->reserve(SPIDER_SQL_HANDLER_LEN))
12406 {
12407 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12408 }
12409 str->q_append(SPIDER_SQL_HANDLER_STR, SPIDER_SQL_HANDLER_LEN);
12410 if ((error_num = mysql_share->append_table_name(str,
12411 spider->conn_link_idx[link_idx])))
12412 DBUG_RETURN(error_num);
12413 if (str->reserve(SPIDER_SQL_OPEN_LEN + SPIDER_SQL_AS_LEN +
12414 SPIDER_SQL_HANDLER_CID_LEN))
12415 {
12416 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12417 }
12418 str->q_append(SPIDER_SQL_OPEN_STR, SPIDER_SQL_OPEN_LEN);
12419 str->q_append(SPIDER_SQL_AS_STR, SPIDER_SQL_AS_LEN);
12420 str->q_append(spider->m_handler_cid[link_idx], SPIDER_SQL_HANDLER_CID_LEN);
12421 DBUG_RETURN(0);
12422 }
12423
append_close_handler_part(ulong sql_type,int link_idx)12424 int spider_mbase_handler::append_close_handler_part(
12425 ulong sql_type,
12426 int link_idx
12427 ) {
12428 int error_num;
12429 spider_string *str;
12430 DBUG_ENTER("spider_mbase_handler::append_close_handler_part");
12431 DBUG_PRINT("info",("spider this=%p", this));
12432 switch (sql_type)
12433 {
12434 case SPIDER_SQL_TYPE_HANDLER:
12435 str = &ha_sql;
12436 break;
12437 default:
12438 DBUG_RETURN(0);
12439 }
12440 error_num = append_close_handler(str, link_idx);
12441 exec_ha_sql = str;
12442 DBUG_RETURN(error_num);
12443 }
12444
append_close_handler(spider_string * str,int link_idx)12445 int spider_mbase_handler::append_close_handler(
12446 spider_string *str,
12447 int link_idx
12448 ) {
12449 DBUG_ENTER("spider_mbase_handler::append_close_handler");
12450 DBUG_PRINT("info",("spider this=%p", this));
12451 if (str->reserve(SPIDER_SQL_HANDLER_LEN + SPIDER_SQL_CLOSE_LEN +
12452 SPIDER_SQL_HANDLER_CID_LEN))
12453 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12454 str->q_append(SPIDER_SQL_HANDLER_STR, SPIDER_SQL_HANDLER_LEN);
12455 str->q_append(spider->m_handler_cid[link_idx],
12456 SPIDER_SQL_HANDLER_CID_LEN);
12457 str->q_append(SPIDER_SQL_CLOSE_STR, SPIDER_SQL_CLOSE_LEN);
12458 DBUG_RETURN(0);
12459 }
12460
append_insert_terminator_part(ulong sql_type)12461 int spider_mbase_handler::append_insert_terminator_part(
12462 ulong sql_type
12463 ) {
12464 int error_num;
12465 spider_string *str;
12466 DBUG_ENTER("spider_mbase_handler::append_insert_terminator_part");
12467 DBUG_PRINT("info",("spider this=%p", this));
12468 switch (sql_type)
12469 {
12470 case SPIDER_SQL_TYPE_INSERT_SQL:
12471 str = &insert_sql;
12472 break;
12473 default:
12474 DBUG_RETURN(0);
12475 }
12476 error_num = append_insert_terminator(str);
12477 DBUG_RETURN(error_num);
12478 }
12479
append_insert_terminator(spider_string * str)12480 int spider_mbase_handler::append_insert_terminator(
12481 spider_string *str
12482 ) {
12483 DBUG_ENTER("spider_mbase_handler::append_insert_terminator");
12484 DBUG_PRINT("info",("spider this=%p", this));
12485 DBUG_PRINT("info",("spider dup_update_sql.length=%u", dup_update_sql.length()));
12486 if (
12487 spider->result_list.insert_dup_update_pushdown &&
12488 dup_update_sql.length()
12489 ) {
12490 DBUG_PRINT("info",("spider add duplicate key update"));
12491 direct_insert_kind = SPIDER_SQL_DIRECT_INSERT_KIND_DUP_UPDATE;
12492 str->length(str->length() - SPIDER_SQL_COMMA_LEN);
12493 if (str->reserve(SPIDER_SQL_DUPLICATE_KEY_UPDATE_LEN +
12494 dup_update_sql.length()))
12495 {
12496 str->length(0);
12497 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12498 }
12499 str->q_append(SPIDER_SQL_DUPLICATE_KEY_UPDATE_STR,
12500 SPIDER_SQL_DUPLICATE_KEY_UPDATE_LEN);
12501 if (str->append(dup_update_sql))
12502 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12503 } else {
12504 str->length(str->length() - SPIDER_SQL_COMMA_LEN);
12505 }
12506 DBUG_RETURN(0);
12507 }
12508
append_insert_values_part(ulong sql_type)12509 int spider_mbase_handler::append_insert_values_part(
12510 ulong sql_type
12511 ) {
12512 int error_num;
12513 spider_string *str;
12514 DBUG_ENTER("spider_mbase_handler::append_insert_values_part");
12515 DBUG_PRINT("info",("spider this=%p", this));
12516 switch (sql_type)
12517 {
12518 case SPIDER_SQL_TYPE_INSERT_SQL:
12519 str = &insert_sql;
12520 break;
12521 default:
12522 DBUG_RETURN(0);
12523 }
12524 error_num = append_insert_values(str);
12525 DBUG_RETURN(error_num);
12526 }
12527
append_insert_values(spider_string * str)12528 int spider_mbase_handler::append_insert_values(
12529 spider_string *str
12530 ) {
12531 SPIDER_SHARE *share = spider->share;
12532 TABLE *table = spider->get_table();
12533 Field **field;
12534 bool add_value = FALSE;
12535 DBUG_ENTER("spider_mbase_handler::append_insert_values");
12536 DBUG_PRINT("info",("spider this=%p", this));
12537 if (str->reserve(SPIDER_SQL_OPEN_PAREN_LEN))
12538 {
12539 str->length(0);
12540 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12541 }
12542 str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
12543 for (field = table->field; *field; field++)
12544 {
12545 DBUG_PRINT("info",("spider field_index=%u", (*field)->field_index));
12546 if (
12547 bitmap_is_set(table->write_set, (*field)->field_index) ||
12548 bitmap_is_set(table->read_set, (*field)->field_index)
12549 ) {
12550 #ifndef DBUG_OFF
12551 MY_BITMAP *tmp_map =
12552 dbug_tmp_use_all_columns(table, &table->read_set);
12553 #endif
12554 add_value = TRUE;
12555 DBUG_PRINT("info",("spider is_null()=%s",
12556 (*field)->is_null() ? "TRUE" : "FALSE"));
12557 DBUG_PRINT("info",("spider table->next_number_field=%p",
12558 table->next_number_field));
12559 DBUG_PRINT("info",("spider *field=%p", *field));
12560 DBUG_PRINT("info",("spider force_auto_increment=%s",
12561 (table->next_number_field && spider->force_auto_increment) ?
12562 "TRUE" : "FALSE"));
12563 if (
12564 (*field)->is_null() ||
12565 (
12566 table->next_number_field == *field &&
12567 !table->auto_increment_field_not_null &&
12568 !spider->force_auto_increment
12569 )
12570 ) {
12571 if (str->reserve(SPIDER_SQL_NULL_LEN + SPIDER_SQL_COMMA_LEN))
12572 {
12573 #ifndef DBUG_OFF
12574 dbug_tmp_restore_column_map(&table->read_set, tmp_map);
12575 #endif
12576 str->length(0);
12577 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12578 }
12579 str->q_append(SPIDER_SQL_NULL_STR, SPIDER_SQL_NULL_LEN);
12580 } else {
12581 if (
12582 spider_db_mbase_utility->
12583 append_column_value(spider, str, *field, NULL,
12584 share->access_charset) ||
12585 str->reserve(SPIDER_SQL_COMMA_LEN)
12586 ) {
12587 #ifndef DBUG_OFF
12588 dbug_tmp_restore_column_map(&table->read_set, tmp_map);
12589 #endif
12590 str->length(0);
12591 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12592 }
12593 }
12594 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
12595 #ifndef DBUG_OFF
12596 dbug_tmp_restore_column_map(&table->read_set, tmp_map);
12597 #endif
12598 }
12599 }
12600 if (add_value)
12601 str->length(str->length() - SPIDER_SQL_COMMA_LEN);
12602 if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN + SPIDER_SQL_COMMA_LEN))
12603 {
12604 str->length(0);
12605 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12606 }
12607 str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
12608 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
12609 DBUG_RETURN(0);
12610 }
12611
append_into_part(ulong sql_type)12612 int spider_mbase_handler::append_into_part(
12613 ulong sql_type
12614 ) {
12615 int error_num;
12616 spider_string *str;
12617 DBUG_ENTER("spider_mbase_handler::append_into_part");
12618 DBUG_PRINT("info",("spider this=%p", this));
12619 switch (sql_type)
12620 {
12621 case SPIDER_SQL_TYPE_INSERT_SQL:
12622 str = &insert_sql;
12623 break;
12624 default:
12625 DBUG_RETURN(0);
12626 }
12627 error_num = append_into(str);
12628 DBUG_RETURN(error_num);
12629 }
12630
append_into(spider_string * str)12631 int spider_mbase_handler::append_into(
12632 spider_string *str
12633 ) {
12634 const TABLE *table = spider->get_table();
12635 Field **field;
12636 uint field_name_length = 0;
12637 DBUG_ENTER("spider_mbase_handler::append_into");
12638 DBUG_PRINT("info",("spider this=%p", this));
12639 if (str->reserve(SPIDER_SQL_INTO_LEN + mysql_share->db_nm_max_length +
12640 SPIDER_SQL_DOT_LEN + mysql_share->table_nm_max_length +
12641 /* SPIDER_SQL_NAME_QUOTE_LEN */ 4 + SPIDER_SQL_OPEN_PAREN_LEN))
12642 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12643 str->q_append(SPIDER_SQL_INTO_STR, SPIDER_SQL_INTO_LEN);
12644 insert_table_name_pos = str->length();
12645 append_table_name_with_adjusting(str, first_link_idx,
12646 SPIDER_SQL_TYPE_INSERT_SQL);
12647 str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
12648 for (field = table->field; *field; field++)
12649 {
12650 if (
12651 bitmap_is_set(table->write_set, (*field)->field_index) ||
12652 bitmap_is_set(table->read_set, (*field)->field_index)
12653 ) {
12654 field_name_length =
12655 mysql_share->column_name_str[(*field)->field_index].length();
12656 if (str->reserve(field_name_length +
12657 /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + SPIDER_SQL_COMMA_LEN))
12658 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12659 mysql_share->append_column_name(str, (*field)->field_index);
12660 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
12661 }
12662 }
12663 if (field_name_length)
12664 str->length(str->length() - SPIDER_SQL_COMMA_LEN);
12665 if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN + SPIDER_SQL_VALUES_LEN))
12666 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12667 str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
12668 str->q_append(SPIDER_SQL_VALUES_STR, SPIDER_SQL_VALUES_LEN);
12669 insert_pos = str->length();
12670 DBUG_RETURN(0);
12671 }
12672
set_insert_to_pos(ulong sql_type)12673 void spider_mbase_handler::set_insert_to_pos(
12674 ulong sql_type
12675 ) {
12676 DBUG_ENTER("spider_mbase_handler::set_insert_to_pos");
12677 switch (sql_type)
12678 {
12679 case SPIDER_SQL_TYPE_INSERT_SQL:
12680 insert_sql.length(insert_pos);
12681 break;
12682 default:
12683 DBUG_ASSERT(0);
12684 break;
12685 }
12686 DBUG_VOID_RETURN;
12687 }
12688
append_from_part(ulong sql_type,int link_idx)12689 int spider_mbase_handler::append_from_part(
12690 ulong sql_type,
12691 int link_idx
12692 ) {
12693 int error_num;
12694 spider_string *str;
12695 DBUG_ENTER("spider_mbase_handler::append_from_part");
12696 DBUG_PRINT("info",("spider this=%p", this));
12697 switch (sql_type)
12698 {
12699 case SPIDER_SQL_TYPE_HANDLER:
12700 str = &ha_sql;
12701 break;
12702 case SPIDER_SQL_TYPE_UPDATE_SQL:
12703 case SPIDER_SQL_TYPE_DELETE_SQL:
12704 case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
12705 str = &update_sql;
12706 break;
12707 default:
12708 str = &sql;
12709 break;
12710 }
12711 error_num = append_from(str, sql_type, link_idx);
12712 DBUG_RETURN(error_num);
12713 }
12714
append_from(spider_string * str,ulong sql_type,int link_idx)12715 int spider_mbase_handler::append_from(
12716 spider_string *str,
12717 ulong sql_type,
12718 int link_idx
12719 ) {
12720 DBUG_ENTER("spider_mbase_handler::append_from");
12721 DBUG_PRINT("info",("spider this=%p", this));
12722 DBUG_PRINT("info",("spider link_idx=%d", link_idx));
12723 int error_num = 0;
12724 if (sql_type == SPIDER_SQL_TYPE_HANDLER)
12725 {
12726 ha_table_name_pos = str->length();
12727 DBUG_PRINT("info",("spider ha_table_name_pos=%u", ha_table_name_pos));
12728 ha_sql_handler_id = spider->m_handler_id[link_idx];
12729 DBUG_PRINT("info",("spider ha_sql_handler_id=%u", ha_sql_handler_id));
12730 if (str->reserve(SPIDER_SQL_HANDLER_CID_LEN))
12731 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12732 str->q_append(spider->m_handler_cid[link_idx], SPIDER_SQL_HANDLER_CID_LEN);
12733 DBUG_PRINT("info",("spider m_handler_cid=%s",
12734 spider->m_handler_cid[link_idx]));
12735 } else {
12736 if (str->reserve(SPIDER_SQL_FROM_LEN + mysql_share->db_nm_max_length +
12737 SPIDER_SQL_DOT_LEN + mysql_share->table_nm_max_length +
12738 /* SPIDER_SQL_NAME_QUOTE_LEN */ 4 + SPIDER_SQL_OPEN_PAREN_LEN))
12739 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12740 str->q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN);
12741 table_name_pos = str->length();
12742 append_table_name_with_adjusting(str, link_idx, sql_type);
12743 if(spider_param_index_hint_pushdown(spider->trx->thd))
12744 {
12745 if((error_num = append_index_hint(str, link_idx, sql_type)))
12746 {
12747 DBUG_RETURN(error_num);
12748 }
12749 }
12750 }
12751 DBUG_RETURN(0);
12752 }
12753
append_flush_tables_part(ulong sql_type,int link_idx,bool lock)12754 int spider_mbase_handler::append_flush_tables_part(
12755 ulong sql_type,
12756 int link_idx,
12757 bool lock
12758 ) {
12759 int error_num;
12760 spider_string *str;
12761 DBUG_ENTER("spider_mbase_handler::append_flush_tables_part");
12762 DBUG_PRINT("info",("spider this=%p", this));
12763 switch (sql_type)
12764 {
12765 case SPIDER_SQL_TYPE_OTHER_SQL:
12766 str = &spider->result_list.sqls[link_idx];
12767 break;
12768 default:
12769 DBUG_RETURN(0);
12770 }
12771 error_num = append_flush_tables(str, link_idx, lock);
12772 DBUG_RETURN(error_num);
12773 }
12774
append_flush_tables(spider_string * str,int link_idx,bool lock)12775 int spider_mbase_handler::append_flush_tables(
12776 spider_string *str,
12777 int link_idx,
12778 bool lock
12779 ) {
12780 DBUG_ENTER("spider_mbase_handler::append_flush_tables");
12781 DBUG_PRINT("info",("spider this=%p", this));
12782 if (lock)
12783 {
12784 if (str->reserve(SPIDER_SQL_FLUSH_TABLES_LEN +
12785 SPIDER_SQL_WITH_READ_LOCK_LEN))
12786 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12787 str->q_append(SPIDER_SQL_FLUSH_TABLES_STR, SPIDER_SQL_FLUSH_TABLES_LEN);
12788 str->q_append(SPIDER_SQL_WITH_READ_LOCK_STR,
12789 SPIDER_SQL_WITH_READ_LOCK_LEN);
12790 } else {
12791 if (str->reserve(SPIDER_SQL_FLUSH_TABLES_LEN))
12792 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12793 str->q_append(SPIDER_SQL_FLUSH_TABLES_STR, SPIDER_SQL_FLUSH_TABLES_LEN);
12794 }
12795 DBUG_RETURN(0);
12796 }
12797
append_optimize_table_part(ulong sql_type,int link_idx)12798 int spider_mbase_handler::append_optimize_table_part(
12799 ulong sql_type,
12800 int link_idx
12801 ) {
12802 int error_num;
12803 spider_string *str;
12804 DBUG_ENTER("spider_mbase_handler::append_optimize_table_part");
12805 DBUG_PRINT("info",("spider this=%p", this));
12806 switch (sql_type)
12807 {
12808 case SPIDER_SQL_TYPE_OTHER_SQL:
12809 str = &spider->result_list.sqls[link_idx];
12810 break;
12811 default:
12812 DBUG_RETURN(0);
12813 }
12814 error_num = append_optimize_table(str, link_idx);
12815 DBUG_RETURN(error_num);
12816 }
12817
append_optimize_table(spider_string * str,int link_idx)12818 int spider_mbase_handler::append_optimize_table(
12819 spider_string *str,
12820 int link_idx
12821 ) {
12822 SPIDER_SHARE *share = spider->share;
12823 int conn_link_idx = spider->conn_link_idx[link_idx];
12824 int local_length = spider_param_internal_optimize_local(spider->trx->thd,
12825 share->internal_optimize_local) * SPIDER_SQL_SQL_LOCAL_LEN;
12826 DBUG_ENTER("spider_mbase_handler::append_optimize_table");
12827 DBUG_PRINT("info",("spider this=%p", this));
12828 if (str->reserve(SPIDER_SQL_SQL_OPTIMIZE_LEN + SPIDER_SQL_SQL_TABLE_LEN +
12829 local_length +
12830 mysql_share->db_names_str[conn_link_idx].length() +
12831 SPIDER_SQL_DOT_LEN +
12832 mysql_share->table_names_str[conn_link_idx].length() +
12833 /* SPIDER_SQL_NAME_QUOTE_LEN */ 4))
12834 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12835 str->q_append(SPIDER_SQL_SQL_OPTIMIZE_STR, SPIDER_SQL_SQL_OPTIMIZE_LEN);
12836 if (local_length)
12837 str->q_append(SPIDER_SQL_SQL_LOCAL_STR, SPIDER_SQL_SQL_LOCAL_LEN);
12838 str->q_append(SPIDER_SQL_SQL_TABLE_STR, SPIDER_SQL_SQL_TABLE_LEN);
12839 mysql_share->append_table_name(str, conn_link_idx);
12840 DBUG_RETURN(0);
12841 }
12842
append_analyze_table_part(ulong sql_type,int link_idx)12843 int spider_mbase_handler::append_analyze_table_part(
12844 ulong sql_type,
12845 int link_idx
12846 ) {
12847 int error_num;
12848 spider_string *str;
12849 DBUG_ENTER("spider_mbase_handler::append_analyze_table_part");
12850 DBUG_PRINT("info",("spider this=%p", this));
12851 switch (sql_type)
12852 {
12853 case SPIDER_SQL_TYPE_OTHER_SQL:
12854 str = &spider->result_list.sqls[link_idx];
12855 break;
12856 default:
12857 DBUG_RETURN(0);
12858 }
12859 error_num = append_analyze_table(str, link_idx);
12860 DBUG_RETURN(error_num);
12861 }
12862
append_analyze_table(spider_string * str,int link_idx)12863 int spider_mbase_handler::append_analyze_table(
12864 spider_string *str,
12865 int link_idx
12866 ) {
12867 SPIDER_SHARE *share = spider->share;
12868 int conn_link_idx = spider->conn_link_idx[link_idx];
12869 int local_length = spider_param_internal_optimize_local(spider->trx->thd,
12870 share->internal_optimize_local) * SPIDER_SQL_SQL_LOCAL_LEN;
12871 DBUG_ENTER("spider_mbase_handler::append_analyze_table");
12872 DBUG_PRINT("info",("spider this=%p", this));
12873 if (str->reserve(SPIDER_SQL_SQL_ANALYZE_LEN + SPIDER_SQL_SQL_TABLE_LEN +
12874 local_length +
12875 mysql_share->db_names_str[conn_link_idx].length() +
12876 SPIDER_SQL_DOT_LEN +
12877 mysql_share->table_names_str[conn_link_idx].length() +
12878 /* SPIDER_SQL_NAME_QUOTE_LEN */ 4))
12879 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12880 str->q_append(SPIDER_SQL_SQL_ANALYZE_STR, SPIDER_SQL_SQL_ANALYZE_LEN);
12881 if (local_length)
12882 str->q_append(SPIDER_SQL_SQL_LOCAL_STR, SPIDER_SQL_SQL_LOCAL_LEN);
12883 str->q_append(SPIDER_SQL_SQL_TABLE_STR, SPIDER_SQL_SQL_TABLE_LEN);
12884 mysql_share->append_table_name(str, conn_link_idx);
12885 DBUG_RETURN(0);
12886 }
12887
append_repair_table_part(ulong sql_type,int link_idx,HA_CHECK_OPT * check_opt)12888 int spider_mbase_handler::append_repair_table_part(
12889 ulong sql_type,
12890 int link_idx,
12891 HA_CHECK_OPT* check_opt
12892 ) {
12893 int error_num;
12894 spider_string *str;
12895 DBUG_ENTER("spider_mbase_handler::append_repair_table_part");
12896 DBUG_PRINT("info",("spider this=%p", this));
12897 switch (sql_type)
12898 {
12899 case SPIDER_SQL_TYPE_OTHER_SQL:
12900 str = &spider->result_list.sqls[link_idx];
12901 break;
12902 default:
12903 DBUG_RETURN(0);
12904 }
12905 error_num = append_repair_table(str, link_idx, check_opt);
12906 DBUG_RETURN(error_num);
12907 }
12908
append_repair_table(spider_string * str,int link_idx,HA_CHECK_OPT * check_opt)12909 int spider_mbase_handler::append_repair_table(
12910 spider_string *str,
12911 int link_idx,
12912 HA_CHECK_OPT* check_opt
12913 ) {
12914 SPIDER_SHARE *share = spider->share;
12915 int conn_link_idx = spider->conn_link_idx[link_idx];
12916 int local_length = spider_param_internal_optimize_local(spider->trx->thd,
12917 share->internal_optimize_local) * SPIDER_SQL_SQL_LOCAL_LEN;
12918 DBUG_ENTER("spider_mbase_handler::append_repair_table");
12919 DBUG_PRINT("info",("spider this=%p", this));
12920 if (str->reserve(SPIDER_SQL_SQL_REPAIR_LEN + SPIDER_SQL_SQL_TABLE_LEN +
12921 local_length +
12922 mysql_share->db_names_str[conn_link_idx].length() +
12923 SPIDER_SQL_DOT_LEN +
12924 mysql_share->table_names_str[conn_link_idx].length() +
12925 /* SPIDER_SQL_NAME_QUOTE_LEN */ 4))
12926 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12927 str->q_append(SPIDER_SQL_SQL_REPAIR_STR, SPIDER_SQL_SQL_REPAIR_LEN);
12928 if (local_length)
12929 str->q_append(SPIDER_SQL_SQL_LOCAL_STR, SPIDER_SQL_SQL_LOCAL_LEN);
12930 str->q_append(SPIDER_SQL_SQL_TABLE_STR, SPIDER_SQL_SQL_TABLE_LEN);
12931 mysql_share->append_table_name(str, conn_link_idx);
12932 if (check_opt->flags & T_QUICK)
12933 {
12934 if (str->reserve(SPIDER_SQL_SQL_QUICK_LEN))
12935 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12936 str->q_append(SPIDER_SQL_SQL_QUICK_STR, SPIDER_SQL_SQL_QUICK_LEN);
12937 }
12938 if (check_opt->flags & T_EXTEND)
12939 {
12940 if (str->reserve(SPIDER_SQL_SQL_EXTENDED_LEN))
12941 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12942 str->q_append(SPIDER_SQL_SQL_EXTENDED_STR, SPIDER_SQL_SQL_EXTENDED_LEN);
12943 }
12944 if (check_opt->sql_flags & TT_USEFRM)
12945 {
12946 if (str->reserve(SPIDER_SQL_SQL_USE_FRM_LEN))
12947 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12948 str->q_append(SPIDER_SQL_SQL_USE_FRM_STR, SPIDER_SQL_SQL_USE_FRM_LEN);
12949 }
12950 DBUG_RETURN(0);
12951 }
12952
append_check_table_part(ulong sql_type,int link_idx,HA_CHECK_OPT * check_opt)12953 int spider_mbase_handler::append_check_table_part(
12954 ulong sql_type,
12955 int link_idx,
12956 HA_CHECK_OPT* check_opt
12957 ) {
12958 int error_num;
12959 spider_string *str;
12960 DBUG_ENTER("spider_mbase_handler::append_check_table_part");
12961 DBUG_PRINT("info",("spider this=%p", this));
12962 switch (sql_type)
12963 {
12964 case SPIDER_SQL_TYPE_OTHER_SQL:
12965 str = &spider->result_list.sqls[link_idx];
12966 break;
12967 default:
12968 DBUG_RETURN(0);
12969 }
12970 error_num = append_check_table(str, link_idx, check_opt);
12971 DBUG_RETURN(error_num);
12972 }
12973
append_check_table(spider_string * str,int link_idx,HA_CHECK_OPT * check_opt)12974 int spider_mbase_handler::append_check_table(
12975 spider_string *str,
12976 int link_idx,
12977 HA_CHECK_OPT* check_opt
12978 ) {
12979 int conn_link_idx = spider->conn_link_idx[link_idx];
12980 DBUG_ENTER("spider_mbase_handler::append_check_table");
12981 DBUG_PRINT("info",("spider this=%p", this));
12982 if (str->reserve(SPIDER_SQL_SQL_CHECK_TABLE_LEN +
12983 mysql_share->db_names_str[conn_link_idx].length() +
12984 SPIDER_SQL_DOT_LEN +
12985 mysql_share->table_names_str[conn_link_idx].length() +
12986 /* SPIDER_SQL_NAME_QUOTE_LEN */ 4))
12987 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12988 str->q_append(SPIDER_SQL_SQL_CHECK_TABLE_STR,
12989 SPIDER_SQL_SQL_CHECK_TABLE_LEN);
12990 mysql_share->append_table_name(str, conn_link_idx);
12991 if (check_opt->flags & T_QUICK)
12992 {
12993 if (str->reserve(SPIDER_SQL_SQL_QUICK_LEN))
12994 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
12995 str->q_append(SPIDER_SQL_SQL_QUICK_STR, SPIDER_SQL_SQL_QUICK_LEN);
12996 }
12997 if (check_opt->flags & T_FAST)
12998 {
12999 if (str->reserve(SPIDER_SQL_SQL_FAST_LEN))
13000 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13001 str->q_append(SPIDER_SQL_SQL_FAST_STR, SPIDER_SQL_SQL_FAST_LEN);
13002 }
13003 if (check_opt->flags & T_MEDIUM)
13004 {
13005 if (str->reserve(SPIDER_SQL_SQL_MEDIUM_LEN))
13006 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13007 str->q_append(SPIDER_SQL_SQL_MEDIUM_STR, SPIDER_SQL_SQL_MEDIUM_LEN);
13008 }
13009 if (check_opt->flags & T_EXTEND)
13010 {
13011 if (str->reserve(SPIDER_SQL_SQL_EXTENDED_LEN))
13012 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13013 str->q_append(SPIDER_SQL_SQL_EXTENDED_STR, SPIDER_SQL_SQL_EXTENDED_LEN);
13014 }
13015 DBUG_RETURN(0);
13016 }
13017
append_enable_keys_part(ulong sql_type,int link_idx)13018 int spider_mbase_handler::append_enable_keys_part(
13019 ulong sql_type,
13020 int link_idx
13021 ) {
13022 int error_num;
13023 spider_string *str;
13024 DBUG_ENTER("spider_mbase_handler::append_enable_keys_part");
13025 DBUG_PRINT("info",("spider this=%p", this));
13026 switch (sql_type)
13027 {
13028 case SPIDER_SQL_TYPE_OTHER_SQL:
13029 str = &spider->result_list.sqls[link_idx];
13030 break;
13031 default:
13032 DBUG_RETURN(0);
13033 }
13034 error_num = append_enable_keys(str, link_idx);
13035 DBUG_RETURN(error_num);
13036 }
13037
append_enable_keys(spider_string * str,int link_idx)13038 int spider_mbase_handler::append_enable_keys(
13039 spider_string *str,
13040 int link_idx
13041 ) {
13042 int conn_link_idx = spider->conn_link_idx[link_idx];
13043 DBUG_ENTER("spider_mbase_handler::append_enable_keys");
13044 DBUG_PRINT("info",("spider this=%p", this));
13045 if (str->reserve(SPIDER_SQL_SQL_ALTER_TABLE_LEN +
13046 mysql_share->db_names_str[conn_link_idx].length() +
13047 SPIDER_SQL_DOT_LEN +
13048 mysql_share->table_names_str[conn_link_idx].length() +
13049 /* SPIDER_SQL_NAME_QUOTE_LEN */ 4 + SPIDER_SQL_SQL_ENABLE_KEYS_LEN))
13050 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13051 str->q_append(SPIDER_SQL_SQL_ALTER_TABLE_STR,
13052 SPIDER_SQL_SQL_ALTER_TABLE_LEN);
13053 mysql_share->append_table_name(str, conn_link_idx);
13054 str->q_append(SPIDER_SQL_SQL_ENABLE_KEYS_STR,
13055 SPIDER_SQL_SQL_ENABLE_KEYS_LEN);
13056 DBUG_RETURN(0);
13057 }
13058
append_disable_keys_part(ulong sql_type,int link_idx)13059 int spider_mbase_handler::append_disable_keys_part(
13060 ulong sql_type,
13061 int link_idx
13062 ) {
13063 int error_num;
13064 spider_string *str;
13065 DBUG_ENTER("spider_mbase_handler::append_disable_keys_part");
13066 DBUG_PRINT("info",("spider this=%p", this));
13067 switch (sql_type)
13068 {
13069 case SPIDER_SQL_TYPE_OTHER_SQL:
13070 str = &spider->result_list.sqls[link_idx];
13071 break;
13072 default:
13073 DBUG_RETURN(0);
13074 }
13075 error_num = append_disable_keys(str, link_idx);
13076 DBUG_RETURN(error_num);
13077 }
13078
append_disable_keys(spider_string * str,int link_idx)13079 int spider_mbase_handler::append_disable_keys(
13080 spider_string *str,
13081 int link_idx
13082 ) {
13083 int conn_link_idx = spider->conn_link_idx[link_idx];
13084 DBUG_ENTER("spider_mbase_handler::append_disable_keys");
13085 DBUG_PRINT("info",("spider this=%p", this));
13086 if (str->reserve(SPIDER_SQL_SQL_ALTER_TABLE_LEN +
13087 mysql_share->db_names_str[conn_link_idx].length() +
13088 SPIDER_SQL_DOT_LEN +
13089 mysql_share->table_names_str[conn_link_idx].length() +
13090 /* SPIDER_SQL_NAME_QUOTE_LEN */ 4 + SPIDER_SQL_SQL_DISABLE_KEYS_LEN))
13091 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13092 str->q_append(SPIDER_SQL_SQL_ALTER_TABLE_STR,
13093 SPIDER_SQL_SQL_ALTER_TABLE_LEN);
13094 mysql_share->append_table_name(str, conn_link_idx);
13095 str->q_append(SPIDER_SQL_SQL_DISABLE_KEYS_STR,
13096 SPIDER_SQL_SQL_DISABLE_KEYS_LEN);
13097 DBUG_RETURN(0);
13098 }
13099
append_delete_all_rows_part(ulong sql_type)13100 int spider_mbase_handler::append_delete_all_rows_part(
13101 ulong sql_type
13102 ) {
13103 int error_num;
13104 spider_string *str;
13105 DBUG_ENTER("spider_mbase_handler::append_delete_all_rows_part");
13106 DBUG_PRINT("info",("spider this=%p", this));
13107 switch (sql_type)
13108 {
13109 case SPIDER_SQL_TYPE_DELETE_SQL:
13110 str = &update_sql;
13111 break;
13112 default:
13113 DBUG_RETURN(0);
13114 }
13115 error_num = append_delete_all_rows(str, sql_type);
13116 DBUG_RETURN(error_num);
13117 }
13118
append_delete_all_rows(spider_string * str,ulong sql_type)13119 int spider_mbase_handler::append_delete_all_rows(
13120 spider_string *str,
13121 ulong sql_type
13122 ) {
13123 int error_num;
13124 DBUG_ENTER("spider_mbase_handler::append_delete_all_rows");
13125 DBUG_PRINT("info",("spider this=%p", this));
13126 if (spider->sql_command == SQLCOM_TRUNCATE)
13127 {
13128 if ((error_num = append_truncate(str, sql_type, first_link_idx)))
13129 DBUG_RETURN(error_num);
13130 } else {
13131 if (
13132 (error_num = append_delete(str)) ||
13133 (error_num = append_from(str, sql_type, first_link_idx))
13134 )
13135 DBUG_RETURN(error_num);
13136 }
13137 DBUG_RETURN(0);
13138 }
13139
append_truncate(spider_string * str,ulong sql_type,int link_idx)13140 int spider_mbase_handler::append_truncate(
13141 spider_string *str,
13142 ulong sql_type,
13143 int link_idx
13144 ) {
13145 DBUG_ENTER("spider_mbase_handler::append_truncate");
13146 if (str->reserve(SPIDER_SQL_TRUNCATE_TABLE_LEN +
13147 mysql_share->db_nm_max_length +
13148 SPIDER_SQL_DOT_LEN + mysql_share->table_nm_max_length +
13149 /* SPIDER_SQL_NAME_QUOTE_LEN */ 4 + SPIDER_SQL_OPEN_PAREN_LEN))
13150 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13151 str->q_append(SPIDER_SQL_TRUNCATE_TABLE_STR, SPIDER_SQL_TRUNCATE_TABLE_LEN);
13152 table_name_pos = str->length();
13153 append_table_name_with_adjusting(str, link_idx, sql_type);
13154 DBUG_RETURN(0);
13155 }
13156
append_explain_select_part(key_range * start_key,key_range * end_key,ulong sql_type,int link_idx)13157 int spider_mbase_handler::append_explain_select_part(
13158 key_range *start_key,
13159 key_range *end_key,
13160 ulong sql_type,
13161 int link_idx
13162 ) {
13163 int error_num;
13164 spider_string *str;
13165 DBUG_ENTER("spider_mbase_handler::append_explain_select_part");
13166 DBUG_PRINT("info",("spider this=%p", this));
13167 switch (sql_type)
13168 {
13169 case SPIDER_SQL_TYPE_OTHER_SQL:
13170 str = &spider->result_list.sqls[link_idx];
13171 break;
13172 default:
13173 DBUG_RETURN(0);
13174 }
13175 error_num =
13176 append_explain_select(str, start_key, end_key, sql_type, link_idx);
13177 DBUG_RETURN(error_num);
13178 }
13179
append_explain_select(spider_string * str,key_range * start_key,key_range * end_key,ulong sql_type,int link_idx)13180 int spider_mbase_handler::append_explain_select(
13181 spider_string *str,
13182 key_range *start_key,
13183 key_range *end_key,
13184 ulong sql_type,
13185 int link_idx
13186 ) {
13187 int error_num;
13188 DBUG_ENTER("spider_mbase_handler::append_explain_select");
13189 DBUG_PRINT("info",("spider this=%p", this));
13190 if (str->reserve(SPIDER_SQL_EXPLAIN_SELECT_LEN))
13191 {
13192 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13193 }
13194 str->q_append(SPIDER_SQL_EXPLAIN_SELECT_STR, SPIDER_SQL_EXPLAIN_SELECT_LEN);
13195 if (
13196 (error_num = append_from(str, sql_type, link_idx)) ||
13197 (error_num = append_key_where(str, NULL, NULL, start_key, end_key,
13198 sql_type, FALSE))
13199 ) {
13200 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13201 }
13202 DBUG_RETURN(0);
13203 }
13204
13205 /********************************************************************
13206 * Determine whether the current query's projection list
13207 * consists solely of the specified column.
13208 *
13209 * Params IN - field_index:
13210 * Field index of the column of interest within
13211 * its table.
13212 *
13213 * Returns TRUE - if the query's projection list consists
13214 * solely of the specified column.
13215 * FALSE - otherwise.
13216 ********************************************************************/
is_sole_projection_field(uint16 field_index)13217 bool spider_mbase_handler::is_sole_projection_field(
13218 uint16 field_index
13219 ) {
13220 // Determine whether the projection list consists solely of the field of interest
13221 bool is_field_in_projection_list = FALSE;
13222 TABLE* table = spider->get_table();
13223 uint16 projection_field_count = 0;
13224 uint16 projection_field_index;
13225 Field** field;
13226 DBUG_ENTER( "spider_mbase_handler::is_sole_projection_field" );
13227
13228 for ( field = table->field; *field ; field++ )
13229 {
13230 projection_field_index = ( *field )->field_index;
13231
13232 if ( !( minimum_select_bit_is_set( projection_field_index ) ) )
13233 {
13234 // Current field is not in the projection list
13235 continue;
13236 }
13237
13238 projection_field_count++;
13239
13240 if ( !is_field_in_projection_list )
13241 {
13242 if ( field_index == projection_field_index )
13243 {
13244 // Field of interest is in the projection list
13245 is_field_in_projection_list = TRUE;
13246 }
13247 }
13248
13249 if ( is_field_in_projection_list && ( projection_field_count != 1 ) )
13250 {
13251 // Field of interest is not the sole column in the projection list
13252 DBUG_RETURN( FALSE );
13253 }
13254 }
13255
13256 if ( is_field_in_projection_list && ( projection_field_count == 1 ) )
13257 {
13258 // Field of interest is the only column in the projection list
13259 DBUG_RETURN( TRUE );
13260 }
13261
13262 DBUG_RETURN( FALSE );
13263 }
13264
is_bulk_insert_exec_period(bool bulk_end)13265 bool spider_mbase_handler::is_bulk_insert_exec_period(
13266 bool bulk_end
13267 ) {
13268 DBUG_ENTER("spider_mbase_handler::is_bulk_insert_exec_period");
13269 DBUG_PRINT("info",("spider this=%p", this));
13270 DBUG_PRINT("info",("spider insert_sql.length=%u", insert_sql.length()));
13271 DBUG_PRINT("info",("spider insert_pos=%d", insert_pos));
13272 DBUG_PRINT("info",("spider insert_sql=%s", insert_sql.c_ptr_safe()));
13273 if (
13274 (bulk_end || (int) insert_sql.length() >= spider->bulk_size) &&
13275 (int) insert_sql.length() > insert_pos
13276 ) {
13277 DBUG_RETURN(TRUE);
13278 }
13279 DBUG_RETURN(FALSE);
13280 }
13281
sql_is_filled_up(ulong sql_type)13282 bool spider_mbase_handler::sql_is_filled_up(
13283 ulong sql_type
13284 ) {
13285 DBUG_ENTER("spider_mbase_handler::sql_is_filled_up");
13286 DBUG_PRINT("info",("spider this=%p", this));
13287 DBUG_RETURN(filled_up);
13288 }
13289
sql_is_empty(ulong sql_type)13290 bool spider_mbase_handler::sql_is_empty(
13291 ulong sql_type
13292 ) {
13293 bool is_empty;
13294 DBUG_ENTER("spider_mbase_handler::sql_is_empty");
13295 DBUG_PRINT("info",("spider this=%p", this));
13296 switch (sql_type)
13297 {
13298 case SPIDER_SQL_TYPE_SELECT_SQL:
13299 is_empty = (sql.length() == 0);
13300 break;
13301 case SPIDER_SQL_TYPE_INSERT_SQL:
13302 is_empty = (insert_sql.length() == 0);
13303 break;
13304 case SPIDER_SQL_TYPE_UPDATE_SQL:
13305 case SPIDER_SQL_TYPE_DELETE_SQL:
13306 case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
13307 is_empty = (update_sql.length() == 0);
13308 break;
13309 case SPIDER_SQL_TYPE_TMP_SQL:
13310 is_empty = (tmp_sql.length() == 0);
13311 break;
13312 case SPIDER_SQL_TYPE_HANDLER:
13313 is_empty = (ha_sql.length() == 0);
13314 break;
13315 default:
13316 is_empty = TRUE;
13317 break;
13318 }
13319 DBUG_RETURN(is_empty);
13320 }
13321
support_multi_split_read()13322 bool spider_mbase_handler::support_multi_split_read()
13323 {
13324 DBUG_ENTER("spider_mbase_handler::support_multi_split_read");
13325 DBUG_PRINT("info",("spider this=%p", this));
13326 DBUG_RETURN(TRUE);
13327 }
13328
support_bulk_update()13329 bool spider_mbase_handler::support_bulk_update()
13330 {
13331 DBUG_ENTER("spider_mbase_handler::support_bulk_update");
13332 DBUG_PRINT("info",("spider this=%p", this));
13333 DBUG_RETURN(TRUE);
13334 }
13335
bulk_tmp_table_insert()13336 int spider_mbase_handler::bulk_tmp_table_insert()
13337 {
13338 int error_num;
13339 DBUG_ENTER("spider_mbase_handler::bulk_tmp_table_insert");
13340 DBUG_PRINT("info",("spider this=%p", this));
13341 error_num = store_sql_to_bulk_tmp_table(&update_sql, upd_tmp_tbl);
13342 DBUG_RETURN(error_num);
13343 }
13344
bulk_tmp_table_insert(int link_idx)13345 int spider_mbase_handler::bulk_tmp_table_insert(
13346 int link_idx
13347 ) {
13348 int error_num;
13349 DBUG_ENTER("spider_mbase_handler::bulk_tmp_table_insert");
13350 DBUG_PRINT("info",("spider this=%p", this));
13351 error_num = store_sql_to_bulk_tmp_table(
13352 &spider->result_list.update_sqls[link_idx],
13353 spider->result_list.upd_tmp_tbls[link_idx]);
13354 DBUG_RETURN(error_num);
13355 }
13356
bulk_tmp_table_end_bulk_insert()13357 int spider_mbase_handler::bulk_tmp_table_end_bulk_insert()
13358 {
13359 int error_num;
13360 DBUG_ENTER("spider_mbase_handler::bulk_tmp_table_end_bulk_insert");
13361 DBUG_PRINT("info",("spider this=%p", this));
13362 if ((error_num = upd_tmp_tbl->file->ha_end_bulk_insert()))
13363 {
13364 DBUG_RETURN(error_num);
13365 }
13366 DBUG_RETURN(0);
13367 }
13368
bulk_tmp_table_rnd_init()13369 int spider_mbase_handler::bulk_tmp_table_rnd_init()
13370 {
13371 int error_num;
13372 DBUG_ENTER("spider_mbase_handler::bulk_tmp_table_rnd_init");
13373 DBUG_PRINT("info",("spider this=%p", this));
13374 upd_tmp_tbl->file->extra(HA_EXTRA_CACHE);
13375 if ((error_num = upd_tmp_tbl->file->ha_rnd_init(TRUE)))
13376 {
13377 DBUG_RETURN(error_num);
13378 }
13379 reading_from_bulk_tmp_table = TRUE;
13380 DBUG_RETURN(0);
13381 }
13382
bulk_tmp_table_rnd_next()13383 int spider_mbase_handler::bulk_tmp_table_rnd_next()
13384 {
13385 int error_num;
13386 DBUG_ENTER("spider_mbase_handler::bulk_tmp_table_rnd_next");
13387 DBUG_PRINT("info",("spider this=%p", this));
13388 #if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 50200
13389 error_num = upd_tmp_tbl->file->ha_rnd_next(upd_tmp_tbl->record[0]);
13390 #else
13391 error_num = upd_tmp_tbl->file->rnd_next(upd_tmp_tbl->record[0]);
13392 #endif
13393 if (!error_num)
13394 {
13395 error_num = restore_sql_from_bulk_tmp_table(&insert_sql, upd_tmp_tbl);
13396 }
13397 DBUG_RETURN(error_num);
13398 }
13399
bulk_tmp_table_rnd_end()13400 int spider_mbase_handler::bulk_tmp_table_rnd_end()
13401 {
13402 int error_num;
13403 DBUG_ENTER("spider_mbase_handler::bulk_tmp_table_rnd_end");
13404 DBUG_PRINT("info",("spider this=%p", this));
13405 reading_from_bulk_tmp_table = FALSE;
13406 if ((error_num = upd_tmp_tbl->file->ha_rnd_end()))
13407 {
13408 DBUG_RETURN(error_num);
13409 }
13410 DBUG_RETURN(0);
13411 }
13412
need_copy_for_update(int link_idx)13413 bool spider_mbase_handler::need_copy_for_update(
13414 int link_idx
13415 ) {
13416 int all_link_idx = spider->conn_link_idx[link_idx];
13417 DBUG_ENTER("spider_mbase_handler::need_copy_for_update");
13418 DBUG_PRINT("info",("spider this=%p", this));
13419 DBUG_RETURN(!mysql_share->same_db_table_name ||
13420 spider->share->link_statuses[all_link_idx] == SPIDER_LINK_STATUS_RECOVERY);
13421 }
13422
bulk_tmp_table_created()13423 bool spider_mbase_handler::bulk_tmp_table_created()
13424 {
13425 DBUG_ENTER("spider_mbase_handler::bulk_tmp_table_created");
13426 DBUG_PRINT("info",("spider this=%p", this));
13427 DBUG_RETURN(upd_tmp_tbl);
13428 }
13429
mk_bulk_tmp_table_and_bulk_start()13430 int spider_mbase_handler::mk_bulk_tmp_table_and_bulk_start()
13431 {
13432 THD *thd = spider->trx->thd;
13433 TABLE *table = spider->get_table();
13434 DBUG_ENTER("spider_mbase_handler::mk_bulk_tmp_table_and_bulk_start");
13435 DBUG_PRINT("info",("spider this=%p", this));
13436 if (!upd_tmp_tbl)
13437 {
13438 #ifdef SPIDER_use_LEX_CSTRING_for_Field_blob_constructor
13439 LEX_CSTRING field_name = {STRING_WITH_LEN("a")};
13440 if (!(upd_tmp_tbl = spider_mk_sys_tmp_table(
13441 thd, table, &upd_tmp_tbl_prm, &field_name, update_sql.charset())))
13442 #else
13443 if (!(upd_tmp_tbl = spider_mk_sys_tmp_table(
13444 thd, table, &upd_tmp_tbl_prm, "a", update_sql.charset())))
13445 #endif
13446 {
13447 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13448 }
13449 upd_tmp_tbl->file->extra(HA_EXTRA_WRITE_CACHE);
13450 upd_tmp_tbl->file->ha_start_bulk_insert((ha_rows) 0);
13451 }
13452 DBUG_RETURN(0);
13453 }
13454
rm_bulk_tmp_table()13455 void spider_mbase_handler::rm_bulk_tmp_table()
13456 {
13457 DBUG_ENTER("spider_mbase_handler::rm_bulk_tmp_table");
13458 DBUG_PRINT("info",("spider this=%p", this));
13459 if (upd_tmp_tbl)
13460 {
13461 spider_rm_sys_tmp_table(spider->trx->thd, upd_tmp_tbl, &upd_tmp_tbl_prm);
13462 upd_tmp_tbl = NULL;
13463 }
13464 DBUG_VOID_RETURN;
13465 }
13466
store_sql_to_bulk_tmp_table(spider_string * str,TABLE * tmp_table)13467 int spider_mbase_handler::store_sql_to_bulk_tmp_table(
13468 spider_string *str,
13469 TABLE *tmp_table
13470 ) {
13471 int error_num;
13472 DBUG_ENTER("spider_mbase_handler::store_sql_to_bulk_tmp_table");
13473 DBUG_PRINT("info",("spider this=%p", this));
13474 tmp_table->field[0]->set_notnull();
13475 tmp_table->field[0]->store(str->ptr(), str->length(), str->charset());
13476 if ((error_num = tmp_table->file->ha_write_row(tmp_table->record[0])))
13477 DBUG_RETURN(error_num);
13478 DBUG_RETURN(0);
13479 }
13480
restore_sql_from_bulk_tmp_table(spider_string * str,TABLE * tmp_table)13481 int spider_mbase_handler::restore_sql_from_bulk_tmp_table(
13482 spider_string *str,
13483 TABLE *tmp_table
13484 ) {
13485 DBUG_ENTER("spider_mbase_handler::restore_sql_from_bulk_tmp_table");
13486 DBUG_PRINT("info",("spider this=%p", this));
13487 tmp_table->field[0]->val_str(str->get_str());
13488 str->mem_calc();
13489 DBUG_RETURN(0);
13490 }
13491
insert_lock_tables_list(SPIDER_CONN * conn,int link_idx)13492 int spider_mbase_handler::insert_lock_tables_list(
13493 SPIDER_CONN *conn,
13494 int link_idx
13495 ) {
13496 spider_db_mbase *db_conn = (spider_db_mbase *) conn->db_conn;
13497 SPIDER_LINK_FOR_HASH *tmp_link_for_hash2 = &link_for_hash[link_idx];
13498 DBUG_ENTER("spider_mbase_handler::insert_lock_tables_list");
13499 DBUG_PRINT("info",("spider this=%p", this));
13500 uint old_elements =
13501 db_conn->lock_table_hash.array.max_element;
13502 #ifdef HASH_UPDATE_WITH_HASH_VALUE
13503 if (my_hash_insert_with_hash_value(
13504 &db_conn->lock_table_hash,
13505 tmp_link_for_hash2->db_table_str_hash_value,
13506 (uchar*) tmp_link_for_hash2))
13507 #else
13508 if (my_hash_insert(&db_conn->lock_table_hash,
13509 (uchar*) tmp_link_for_hash2))
13510 #endif
13511 {
13512 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13513 }
13514 if (db_conn->lock_table_hash.array.max_element > old_elements)
13515 {
13516 spider_alloc_calc_mem(spider_current_trx,
13517 db_conn->lock_table_hash,
13518 (db_conn->lock_table_hash.array.max_element - old_elements) *
13519 db_conn->lock_table_hash.array.size_of_element);
13520 }
13521 DBUG_RETURN(0);
13522 }
13523
append_lock_tables_list(SPIDER_CONN * conn,int link_idx,int * appended)13524 int spider_mbase_handler::append_lock_tables_list(
13525 SPIDER_CONN *conn,
13526 int link_idx,
13527 int *appended
13528 ) {
13529 int error_num;
13530 SPIDER_LINK_FOR_HASH *tmp_link_for_hash, *tmp_link_for_hash2;
13531 int conn_link_idx = spider->conn_link_idx[link_idx];
13532 spider_db_mbase *db_conn = (spider_db_mbase *) conn->db_conn;
13533 DBUG_ENTER("spider_mbase_handler::append_lock_tables_list");
13534 DBUG_PRINT("info",("spider this=%p", this));
13535 tmp_link_for_hash2 = &link_for_hash[link_idx];
13536 tmp_link_for_hash2->db_table_str =
13537 &mysql_share->db_table_str[conn_link_idx];
13538 #ifdef SPIDER_HAS_HASH_VALUE_TYPE
13539 tmp_link_for_hash2->db_table_str_hash_value =
13540 mysql_share->db_table_str_hash_value[conn_link_idx];
13541 if (!(tmp_link_for_hash = (SPIDER_LINK_FOR_HASH *)
13542 my_hash_search_using_hash_value(
13543 &db_conn->lock_table_hash,
13544 tmp_link_for_hash2->db_table_str_hash_value,
13545 (uchar*) tmp_link_for_hash2->db_table_str->ptr(),
13546 tmp_link_for_hash2->db_table_str->length())))
13547 #else
13548 if (!(tmp_link_for_hash = (SPIDER_LINK_FOR_HASH *) my_hash_search(
13549 &db_conn->lock_table_hash,
13550 (uchar*) tmp_link_for_hash2->db_table_str->ptr(),
13551 tmp_link_for_hash2->db_table_str->length())))
13552 #endif
13553 {
13554 if ((error_num = insert_lock_tables_list(conn, link_idx)))
13555 DBUG_RETURN(error_num);
13556 *appended = 1;
13557 } else {
13558 if (tmp_link_for_hash->spider->lock_type < spider->lock_type)
13559 {
13560 #ifdef HASH_UPDATE_WITH_HASH_VALUE
13561 my_hash_delete_with_hash_value(
13562 &db_conn->lock_table_hash,
13563 tmp_link_for_hash->db_table_str_hash_value,
13564 (uchar*) tmp_link_for_hash);
13565 #else
13566 my_hash_delete(&db_conn->lock_table_hash,
13567 (uchar*) tmp_link_for_hash);
13568 #endif
13569 uint old_elements =
13570 db_conn->lock_table_hash.array.max_element;
13571 #ifdef HASH_UPDATE_WITH_HASH_VALUE
13572 if (my_hash_insert_with_hash_value(
13573 &db_conn->lock_table_hash,
13574 tmp_link_for_hash2->db_table_str_hash_value,
13575 (uchar*) tmp_link_for_hash2))
13576 #else
13577 if (my_hash_insert(&db_conn->lock_table_hash,
13578 (uchar*) tmp_link_for_hash2))
13579 #endif
13580 {
13581 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13582 }
13583 if (db_conn->lock_table_hash.array.max_element > old_elements)
13584 {
13585 spider_alloc_calc_mem(spider_current_trx,
13586 db_conn->lock_table_hash,
13587 (db_conn->lock_table_hash.array.max_element - old_elements) *
13588 db_conn->lock_table_hash.array.size_of_element);
13589 }
13590 }
13591 }
13592 DBUG_RETURN(0);
13593 }
13594
realloc_sql(ulong * realloced)13595 int spider_mbase_handler::realloc_sql(
13596 ulong *realloced
13597 ) {
13598 THD *thd = spider->trx->thd;
13599 st_spider_share *share = spider->share;
13600 int init_sql_alloc_size =
13601 spider_param_init_sql_alloc_size(thd, share->init_sql_alloc_size);
13602 DBUG_ENTER("spider_mbase_handler::realloc_sql");
13603 DBUG_PRINT("info",("spider this=%p", this));
13604 if ((int) sql.alloced_length() > init_sql_alloc_size * 2)
13605 {
13606 sql.free();
13607 if (sql.real_alloc(init_sql_alloc_size))
13608 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13609 *realloced |= SPIDER_SQL_TYPE_SELECT_SQL;
13610 }
13611 if ((int) ha_sql.alloced_length() > init_sql_alloc_size * 2)
13612 {
13613 ha_sql.free();
13614 if (ha_sql.real_alloc(init_sql_alloc_size))
13615 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13616 *realloced |= SPIDER_SQL_TYPE_SELECT_SQL;
13617 }
13618 if ((int) dup_update_sql.alloced_length() > init_sql_alloc_size * 2)
13619 {
13620 dup_update_sql.free();
13621 if (dup_update_sql.real_alloc(init_sql_alloc_size))
13622 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13623 }
13624 if ((int) insert_sql.alloced_length() > init_sql_alloc_size * 2)
13625 {
13626 insert_sql.free();
13627 if (insert_sql.real_alloc(init_sql_alloc_size))
13628 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13629 *realloced |= SPIDER_SQL_TYPE_INSERT_SQL;
13630 }
13631 if ((int) update_sql.alloced_length() > init_sql_alloc_size * 2)
13632 {
13633 update_sql.free();
13634 if (update_sql.real_alloc(init_sql_alloc_size))
13635 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13636 *realloced |= (SPIDER_SQL_TYPE_UPDATE_SQL | SPIDER_SQL_TYPE_DELETE_SQL);
13637 }
13638 update_sql.length(0);
13639 if ((int) tmp_sql.alloced_length() > init_sql_alloc_size * 2)
13640 {
13641 tmp_sql.free();
13642 if (tmp_sql.real_alloc(init_sql_alloc_size))
13643 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13644 *realloced |= SPIDER_SQL_TYPE_TMP_SQL;
13645 }
13646 DBUG_RETURN(0);
13647 }
13648
reset_sql(ulong sql_type)13649 int spider_mbase_handler::reset_sql(
13650 ulong sql_type
13651 ) {
13652 DBUG_ENTER("spider_mbase_handler::reset_sql");
13653 DBUG_PRINT("info",("spider this=%p", this));
13654 if (sql_type & SPIDER_SQL_TYPE_SELECT_SQL)
13655 {
13656 sql.length(0);
13657 }
13658 if (sql_type & SPIDER_SQL_TYPE_INSERT_SQL)
13659 {
13660 insert_sql.length(0);
13661 }
13662 if (sql_type & (SPIDER_SQL_TYPE_UPDATE_SQL | SPIDER_SQL_TYPE_DELETE_SQL |
13663 SPIDER_SQL_TYPE_BULK_UPDATE_SQL))
13664 {
13665 update_sql.length(0);
13666 }
13667 if (sql_type & SPIDER_SQL_TYPE_TMP_SQL)
13668 {
13669 tmp_sql.length(0);
13670 }
13671 if (sql_type & SPIDER_SQL_TYPE_HANDLER)
13672 {
13673 ha_sql.length(0);
13674 }
13675 DBUG_RETURN(0);
13676 }
13677
13678 #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
reset_keys(ulong sql_type)13679 int spider_mbase_handler::reset_keys(
13680 ulong sql_type
13681 ) {
13682 DBUG_ENTER("spider_mbase_handler::reset_keys");
13683 DBUG_PRINT("info",("spider this=%p", this));
13684 DBUG_ASSERT(0);
13685 DBUG_RETURN(0);
13686 }
13687
reset_upds(ulong sql_type)13688 int spider_mbase_handler::reset_upds(
13689 ulong sql_type
13690 ) {
13691 DBUG_ENTER("spider_mbase_handler::reset_upds");
13692 DBUG_PRINT("info",("spider this=%p", this));
13693 hs_upds.clear();
13694 DBUG_RETURN(0);
13695 }
13696
reset_strs(ulong sql_type)13697 int spider_mbase_handler::reset_strs(
13698 ulong sql_type
13699 ) {
13700 DBUG_ENTER("spider_mbase_handler::reset_strs");
13701 DBUG_PRINT("info",("spider this=%p", this));
13702 DBUG_ASSERT(0);
13703 DBUG_RETURN(0);
13704 }
13705
reset_strs_pos(ulong sql_type)13706 int spider_mbase_handler::reset_strs_pos(
13707 ulong sql_type
13708 ) {
13709 DBUG_ENTER("spider_mbase_handler::reset_strs_pos");
13710 DBUG_PRINT("info",("spider this=%p", this));
13711 DBUG_ASSERT(0);
13712 DBUG_RETURN(0);
13713 }
13714
push_back_upds(SPIDER_HS_STRING_REF & info)13715 int spider_mbase_handler::push_back_upds(
13716 SPIDER_HS_STRING_REF &info
13717 ) {
13718 int error_num;
13719 DBUG_ENTER("spider_mbase_handler::push_back_upds");
13720 DBUG_PRINT("info",("spider this=%p", this));
13721 error_num = hs_upds.push_back(info);
13722 DBUG_RETURN(error_num);
13723 }
13724 #endif
13725
need_lock_before_set_sql_for_exec(ulong sql_type)13726 bool spider_mbase_handler::need_lock_before_set_sql_for_exec(
13727 ulong sql_type
13728 ) {
13729 DBUG_ENTER("spider_mbase_handler::need_lock_before_set_sql_for_exec");
13730 DBUG_PRINT("info",("spider this=%p", this));
13731 DBUG_RETURN(FALSE);
13732 }
13733
13734 #ifdef SPIDER_HAS_GROUP_BY_HANDLER
set_sql_for_exec(ulong sql_type,int link_idx,SPIDER_LINK_IDX_CHAIN * link_idx_chain)13735 int spider_mbase_handler::set_sql_for_exec(
13736 ulong sql_type,
13737 int link_idx,
13738 SPIDER_LINK_IDX_CHAIN *link_idx_chain
13739 ) {
13740 int error_num;
13741 DBUG_ENTER("spider_mbase_handler::set_sql_for_exec");
13742 DBUG_PRINT("info",("spider this=%p", this));
13743 if (sql_type & SPIDER_SQL_TYPE_SELECT_SQL)
13744 {
13745 if ((error_num = spider_db_mbase_utility->reappend_tables(
13746 spider->fields, link_idx_chain, &sql)))
13747 DBUG_RETURN(error_num);
13748 exec_sql = &sql;
13749 }
13750 DBUG_RETURN(0);
13751 }
13752 #endif
13753
set_sql_for_exec(ulong sql_type,int link_idx)13754 int spider_mbase_handler::set_sql_for_exec(
13755 ulong sql_type,
13756 int link_idx
13757 ) {
13758 int error_num;
13759 uint tmp_pos;
13760 SPIDER_SHARE *share = spider->share;
13761 SPIDER_RESULT_LIST *result_list = &spider->result_list;
13762 int all_link_idx = spider->conn_link_idx[link_idx];
13763 DBUG_ENTER("spider_mbase_handler::set_sql_for_exec");
13764 DBUG_PRINT("info",("spider this=%p", this));
13765 if (sql_type & (SPIDER_SQL_TYPE_SELECT_SQL | SPIDER_SQL_TYPE_TMP_SQL))
13766 {
13767 if (mysql_share->same_db_table_name || link_idx == first_link_idx)
13768 {
13769 if (sql_type & SPIDER_SQL_TYPE_SELECT_SQL)
13770 exec_sql = &sql;
13771 if (sql_type & SPIDER_SQL_TYPE_TMP_SQL)
13772 exec_tmp_sql = &tmp_sql;
13773 } else {
13774 char tmp_table_name[MAX_FIELD_WIDTH * 2],
13775 tgt_table_name[MAX_FIELD_WIDTH * 2];
13776 int tmp_table_name_length;
13777 spider_string tgt_table_name_str(tgt_table_name,
13778 MAX_FIELD_WIDTH * 2,
13779 mysql_share->db_names_str[link_idx].charset());
13780 const char *table_names[2], *table_aliases[2];
13781 uint table_name_lengths[2], table_alias_lengths[2];
13782 tgt_table_name_str.init_calc_mem(104);
13783 tgt_table_name_str.length(0);
13784 if (result_list->tmp_table_join && spider->bka_mode != 2)
13785 {
13786 create_tmp_bka_table_name(tmp_table_name, &tmp_table_name_length,
13787 link_idx);
13788 append_table_name_with_adjusting(&tgt_table_name_str, link_idx,
13789 SPIDER_SQL_TYPE_TMP_SQL);
13790 table_names[0] = tmp_table_name;
13791 table_names[1] = tgt_table_name_str.ptr();
13792 table_name_lengths[0] = tmp_table_name_length;
13793 table_name_lengths[1] = tgt_table_name_str.length();
13794 table_aliases[0] = SPIDER_SQL_A_STR;
13795 table_aliases[1] = SPIDER_SQL_B_STR;
13796 table_alias_lengths[0] = SPIDER_SQL_A_LEN;
13797 table_alias_lengths[1] = SPIDER_SQL_B_LEN;
13798 }
13799 if (sql_type & SPIDER_SQL_TYPE_SELECT_SQL)
13800 {
13801 exec_sql = &result_list->sqls[link_idx];
13802 if (exec_sql->copy(sql))
13803 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13804 else if (result_list->use_union)
13805 {
13806 if ((error_num = reset_union_table_name(exec_sql, link_idx,
13807 SPIDER_SQL_TYPE_SELECT_SQL)))
13808 DBUG_RETURN(error_num);
13809 } else {
13810 tmp_pos = exec_sql->length();
13811 exec_sql->length(table_name_pos);
13812 if (result_list->tmp_table_join && spider->bka_mode != 2)
13813 {
13814 if ((error_num = spider_db_mbase_utility->append_from_with_alias(
13815 exec_sql, table_names, table_name_lengths,
13816 table_aliases, table_alias_lengths, 2,
13817 &table_name_pos, TRUE))
13818 )
13819 DBUG_RETURN(error_num);
13820 exec_sql->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
13821 } else {
13822 append_table_name_with_adjusting(exec_sql, link_idx,
13823 SPIDER_SQL_TYPE_SELECT_SQL);
13824 }
13825 exec_sql->length(tmp_pos);
13826 }
13827 }
13828 if (sql_type & SPIDER_SQL_TYPE_TMP_SQL)
13829 {
13830 exec_tmp_sql = &result_list->tmp_sqls[link_idx];
13831 if (result_list->tmp_table_join && spider->bka_mode != 2)
13832 {
13833 if (exec_tmp_sql->copy(tmp_sql))
13834 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13835 else {
13836 tmp_pos = exec_tmp_sql->length();
13837 exec_tmp_sql->length(tmp_sql_pos1);
13838 exec_tmp_sql->q_append(tmp_table_name, tmp_table_name_length);
13839 exec_tmp_sql->length(tmp_sql_pos2);
13840 exec_tmp_sql->q_append(tmp_table_name, tmp_table_name_length);
13841 exec_tmp_sql->length(tmp_sql_pos3);
13842 exec_tmp_sql->q_append(tmp_table_name, tmp_table_name_length);
13843 exec_tmp_sql->length(tmp_pos);
13844 }
13845 }
13846 }
13847 }
13848 }
13849 if (sql_type & SPIDER_SQL_TYPE_INSERT_SQL)
13850 {
13851 if (mysql_share->same_db_table_name || link_idx == first_link_idx)
13852 exec_insert_sql = &insert_sql;
13853 else {
13854 exec_insert_sql = &result_list->insert_sqls[link_idx];
13855 if (exec_insert_sql->copy(insert_sql))
13856 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13857 DBUG_PRINT("info",("spider exec_insert_sql=%s",
13858 exec_insert_sql->c_ptr_safe()));
13859 tmp_pos = exec_insert_sql->length();
13860 exec_insert_sql->length(insert_table_name_pos);
13861 append_table_name_with_adjusting(exec_insert_sql, link_idx,
13862 sql_type);
13863 exec_insert_sql->length(tmp_pos);
13864 DBUG_PRINT("info",("spider exec_insert_sql->length=%u",
13865 exec_insert_sql->length()));
13866 DBUG_PRINT("info",("spider exec_insert_sql=%s",
13867 exec_insert_sql->c_ptr_safe()));
13868 }
13869 }
13870 if (sql_type & SPIDER_SQL_TYPE_BULK_UPDATE_SQL)
13871 {
13872 if (reading_from_bulk_tmp_table)
13873 {
13874 if (
13875 mysql_share->same_db_table_name &&
13876 share->link_statuses[all_link_idx] != SPIDER_LINK_STATUS_RECOVERY
13877 ) {
13878 exec_update_sql = &insert_sql;
13879 } else if (!spider->result_list.upd_tmp_tbls[link_idx])
13880 {
13881 DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
13882 } else {
13883 exec_update_sql = &spider->result_list.insert_sqls[link_idx];
13884 if ((error_num = restore_sql_from_bulk_tmp_table(exec_update_sql,
13885 spider->result_list.upd_tmp_tbls[link_idx])))
13886 {
13887 DBUG_RETURN(error_num);
13888 }
13889 }
13890 } else {
13891 if (
13892 mysql_share->same_db_table_name &&
13893 share->link_statuses[all_link_idx] != SPIDER_LINK_STATUS_RECOVERY
13894 ) {
13895 exec_update_sql = &update_sql;
13896 } else {
13897 exec_update_sql = &spider->result_list.update_sqls[link_idx];
13898 }
13899 }
13900 } else if (sql_type &
13901 (SPIDER_SQL_TYPE_UPDATE_SQL | SPIDER_SQL_TYPE_DELETE_SQL))
13902 {
13903 if (mysql_share->same_db_table_name || link_idx == first_link_idx)
13904 exec_update_sql = &update_sql;
13905 else {
13906 exec_update_sql = &spider->result_list.update_sqls[link_idx];
13907 if (exec_update_sql->copy(update_sql))
13908 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13909 tmp_pos = exec_update_sql->length();
13910 exec_update_sql->length(table_name_pos);
13911 append_table_name_with_adjusting(exec_update_sql, link_idx,
13912 sql_type);
13913 exec_update_sql->length(tmp_pos);
13914 }
13915 }
13916 if (sql_type & SPIDER_SQL_TYPE_HANDLER)
13917 {
13918 if (spider->m_handler_id[link_idx] == ha_sql_handler_id)
13919 exec_ha_sql = &ha_sql;
13920 else {
13921 exec_ha_sql = &result_list->sqls[link_idx];
13922 if (exec_ha_sql->copy(ha_sql))
13923 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
13924 else {
13925 tmp_pos = exec_ha_sql->length();
13926 exec_ha_sql->length(ha_table_name_pos);
13927 append_table_name_with_adjusting(exec_ha_sql, link_idx,
13928 SPIDER_SQL_TYPE_HANDLER);
13929 exec_ha_sql->length(tmp_pos);
13930 }
13931 }
13932 }
13933 DBUG_RETURN(0);
13934 }
13935
set_sql_for_exec(spider_db_copy_table * tgt_ct,ulong sql_type)13936 int spider_mbase_handler::set_sql_for_exec(
13937 spider_db_copy_table *tgt_ct,
13938 ulong sql_type
13939 ) {
13940 spider_mbase_copy_table *mysql_ct = (spider_mbase_copy_table *) tgt_ct;
13941 DBUG_ENTER("spider_mbase_handler::set_sql_for_exec");
13942 DBUG_PRINT("info",("spider this=%p", this));
13943 switch (sql_type)
13944 {
13945 case SPIDER_SQL_TYPE_INSERT_SQL:
13946 exec_insert_sql = &mysql_ct->sql;
13947 break;
13948 default:
13949 DBUG_ASSERT(0);
13950 break;
13951 }
13952 DBUG_RETURN(0);
13953 }
13954
execute_sql(ulong sql_type,SPIDER_CONN * conn,int quick_mode,int * need_mon)13955 int spider_mbase_handler::execute_sql(
13956 ulong sql_type,
13957 SPIDER_CONN *conn,
13958 int quick_mode,
13959 int *need_mon
13960 ) {
13961 spider_string *tgt_sql;
13962 uint tgt_length;
13963 DBUG_ENTER("spider_mbase_handler::execute_sql");
13964 DBUG_PRINT("info",("spider this=%p", this));
13965 switch (sql_type)
13966 {
13967 case SPIDER_SQL_TYPE_SELECT_SQL:
13968 DBUG_PRINT("info",("spider SPIDER_SQL_TYPE_SELECT_SQL"));
13969 tgt_sql = exec_sql;
13970 tgt_length = tgt_sql->length();
13971 break;
13972 case SPIDER_SQL_TYPE_INSERT_SQL:
13973 DBUG_PRINT("info",("spider SPIDER_SQL_TYPE_SELECT_SQL"));
13974 tgt_sql = exec_insert_sql;
13975 tgt_length = tgt_sql->length();
13976 break;
13977 case SPIDER_SQL_TYPE_UPDATE_SQL:
13978 case SPIDER_SQL_TYPE_DELETE_SQL:
13979 case SPIDER_SQL_TYPE_BULK_UPDATE_SQL:
13980 DBUG_PRINT("info",("spider %s",
13981 sql_type == SPIDER_SQL_TYPE_UPDATE_SQL ? "SPIDER_SQL_TYPE_UPDATE_SQL" :
13982 sql_type == SPIDER_SQL_TYPE_DELETE_SQL ? "SPIDER_SQL_TYPE_DELETE_SQL" :
13983 "SPIDER_SQL_TYPE_BULK_UPDATE_SQL"
13984 ));
13985 tgt_sql = exec_update_sql;
13986 tgt_length = tgt_sql->length();
13987 break;
13988 case SPIDER_SQL_TYPE_TMP_SQL:
13989 DBUG_PRINT("info",("spider SPIDER_SQL_TYPE_TMP_SQL"));
13990 tgt_sql = exec_tmp_sql;
13991 tgt_length = tgt_sql->length();
13992 break;
13993 case SPIDER_SQL_TYPE_DROP_TMP_TABLE_SQL:
13994 DBUG_PRINT("info",("spider SPIDER_SQL_TYPE_DROP_TMP_TABLE_SQL"));
13995 tgt_sql = exec_tmp_sql;
13996 tgt_length = tmp_sql_pos5;
13997 break;
13998 case SPIDER_SQL_TYPE_HANDLER:
13999 DBUG_PRINT("info",("spider SPIDER_SQL_TYPE_HANDLER"));
14000 tgt_sql = exec_ha_sql;
14001 tgt_length = tgt_sql->length();
14002 break;
14003 default:
14004 /* nothing to do */
14005 DBUG_PRINT("info",("spider default"));
14006 DBUG_RETURN(0);
14007 }
14008 DBUG_RETURN(spider_db_query(
14009 conn,
14010 tgt_sql->ptr(),
14011 tgt_length,
14012 quick_mode,
14013 need_mon
14014 ));
14015 }
14016
reset()14017 int spider_mbase_handler::reset()
14018 {
14019 DBUG_ENTER("spider_mbase_handler::reset");
14020 DBUG_PRINT("info",("spider this=%p", this));
14021 update_sql.length(0);
14022 DBUG_RETURN(0);
14023 }
14024
sts_mode_exchange(int sts_mode)14025 int spider_mbase_handler::sts_mode_exchange(
14026 int sts_mode
14027 ) {
14028 DBUG_ENTER("spider_mbase_handler::sts_mode_exchange");
14029 DBUG_PRINT("info",("spider sts_mode=%d", sts_mode));
14030 DBUG_RETURN(sts_mode);
14031 }
14032
show_table_status(int link_idx,int sts_mode,uint flag)14033 int spider_mbase_handler::show_table_status(
14034 int link_idx,
14035 int sts_mode,
14036 uint flag
14037 ) {
14038 int error_num;
14039 SPIDER_CONN *conn = spider->conns[link_idx];
14040 SPIDER_DB_RESULT *res;
14041 SPIDER_SHARE *share = spider->share;
14042 uint pos = (2 * spider->conn_link_idx[link_idx]);
14043 ulonglong auto_increment_value = 0;
14044 DBUG_ENTER("spider_mbase_handler::show_table_status");
14045 DBUG_PRINT("info",("spider sts_mode=%d", sts_mode));
14046
14047 if (sts_mode == 1)
14048 {
14049 pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
14050 pthread_mutex_lock(&conn->mta_conn_mutex);
14051 SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
14052 conn->need_mon = &spider->need_mons[link_idx];
14053 DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
14054 DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
14055 conn->mta_conn_mutex_lock_already = TRUE;
14056 conn->mta_conn_mutex_unlock_later = TRUE;
14057 conn->disable_connect_retry = TRUE;
14058 spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
14059 share);
14060 if (
14061 (error_num = spider_db_set_names(spider, conn, link_idx)) ||
14062 (
14063 spider_db_query(
14064 conn,
14065 mysql_share->show_table_status[0 + pos].ptr(),
14066 mysql_share->show_table_status[0 + pos].length(),
14067 -1,
14068 &spider->need_mons[link_idx]) &&
14069 (error_num = spider_db_errorno(conn))
14070 )
14071 ) {
14072 if (
14073 error_num == ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM &&
14074 !conn->disable_reconnect
14075 ) {
14076 /* retry */
14077 if ((error_num = spider_db_ping(spider, conn, link_idx)))
14078 {
14079 conn->disable_connect_retry = FALSE;
14080 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14081 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14082 conn->mta_conn_mutex_lock_already = FALSE;
14083 conn->mta_conn_mutex_unlock_later = FALSE;
14084 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14085 pthread_mutex_unlock(&conn->mta_conn_mutex);
14086 DBUG_RETURN(error_num);
14087 }
14088 if ((error_num = spider_db_set_names(spider, conn, link_idx)))
14089 {
14090 conn->disable_connect_retry = FALSE;
14091 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14092 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14093 conn->mta_conn_mutex_lock_already = FALSE;
14094 conn->mta_conn_mutex_unlock_later = FALSE;
14095 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14096 pthread_mutex_unlock(&conn->mta_conn_mutex);
14097 DBUG_RETURN(error_num);
14098 }
14099 spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
14100 share);
14101 if (spider_db_query(
14102 conn,
14103 mysql_share->show_table_status[0 + pos].ptr(),
14104 mysql_share->show_table_status[0 + pos].length(),
14105 -1,
14106 &spider->need_mons[link_idx])
14107 ) {
14108 conn->disable_connect_retry = FALSE;
14109 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14110 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14111 conn->mta_conn_mutex_lock_already = FALSE;
14112 conn->mta_conn_mutex_unlock_later = FALSE;
14113 DBUG_RETURN(spider_db_errorno(conn));
14114 }
14115 } else {
14116 conn->disable_connect_retry = FALSE;
14117 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14118 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14119 conn->mta_conn_mutex_lock_already = FALSE;
14120 conn->mta_conn_mutex_unlock_later = FALSE;
14121 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14122 pthread_mutex_unlock(&conn->mta_conn_mutex);
14123 DBUG_RETURN(error_num);
14124 }
14125 }
14126 st_spider_db_request_key request_key;
14127 request_key.spider_thread_id = spider->trx->spider_thread_id;
14128 request_key.query_id = spider->trx->thd->query_id;
14129 request_key.handler = spider;
14130 request_key.request_id = 1;
14131 request_key.next = NULL;
14132 if (spider_param_dry_access())
14133 {
14134 conn->disable_connect_retry = FALSE;
14135 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14136 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14137 conn->mta_conn_mutex_lock_already = FALSE;
14138 conn->mta_conn_mutex_unlock_later = FALSE;
14139 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14140 pthread_mutex_unlock(&conn->mta_conn_mutex);
14141 DBUG_RETURN(0);
14142 }
14143 if (!(res = conn->db_conn->store_result(NULL, &request_key, &error_num)))
14144 {
14145 conn->disable_connect_retry = FALSE;
14146 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14147 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14148 conn->mta_conn_mutex_lock_already = FALSE;
14149 conn->mta_conn_mutex_unlock_later = FALSE;
14150 if (error_num)
14151 {
14152 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14153 pthread_mutex_unlock(&conn->mta_conn_mutex);
14154 DBUG_RETURN(error_num);
14155 }
14156 else if ((error_num = spider_db_errorno(conn)))
14157 DBUG_RETURN(error_num);
14158 else {
14159 my_printf_error(ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM,
14160 ER_SPIDER_REMOTE_TABLE_NOT_FOUND_STR, MYF(0),
14161 mysql_share->db_names_str[spider->conn_link_idx[link_idx]].ptr(),
14162 mysql_share->table_names_str[spider->conn_link_idx[
14163 link_idx]].ptr());
14164 DBUG_RETURN(ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM);
14165 }
14166 }
14167 conn->disable_connect_retry = FALSE;
14168 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14169 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14170 conn->mta_conn_mutex_lock_already = FALSE;
14171 conn->mta_conn_mutex_unlock_later = FALSE;
14172 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14173 pthread_mutex_unlock(&conn->mta_conn_mutex);
14174 error_num = res->fetch_table_status(
14175 sts_mode,
14176 share->stat
14177 );
14178 auto_increment_value = share->stat.auto_increment_value;
14179 res->free_result();
14180 delete res;
14181 if (error_num)
14182 {
14183 switch (error_num)
14184 {
14185 case ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM:
14186 my_printf_error(ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM,
14187 ER_SPIDER_REMOTE_TABLE_NOT_FOUND_STR, MYF(0),
14188 mysql_share->db_names_str[spider->conn_link_idx[link_idx]].ptr(),
14189 mysql_share->table_names_str[spider->conn_link_idx[
14190 link_idx]].ptr());
14191 break;
14192 case ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM:
14193 my_printf_error(ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM,
14194 ER_SPIDER_INVALID_REMOTE_TABLE_INFO_STR, MYF(0),
14195 mysql_share->db_names_str[spider->conn_link_idx[link_idx]].ptr(),
14196 mysql_share->table_names_str[spider->conn_link_idx[
14197 link_idx]].ptr());
14198 break;
14199 default:
14200 break;
14201 }
14202 DBUG_RETURN(error_num);
14203 }
14204 } else {
14205 pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
14206 pthread_mutex_lock(&conn->mta_conn_mutex);
14207 SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
14208 conn->need_mon = &spider->need_mons[link_idx];
14209 DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
14210 DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
14211 conn->mta_conn_mutex_lock_already = TRUE;
14212 conn->mta_conn_mutex_unlock_later = TRUE;
14213 conn->disable_connect_retry = TRUE;
14214 spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
14215 share);
14216 if (
14217 (error_num = spider_db_set_names(spider, conn, link_idx)) ||
14218 (
14219 spider_db_query(
14220 conn,
14221 mysql_share->show_table_status[1 + pos].ptr(),
14222 mysql_share->show_table_status[1 + pos].length(),
14223 -1,
14224 &spider->need_mons[link_idx]) &&
14225 (error_num = spider_db_errorno(conn))
14226 )
14227 ) {
14228 if (
14229 error_num == ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM &&
14230 !conn->disable_reconnect
14231 ) {
14232 /* retry */
14233 if ((error_num = spider_db_ping(spider, conn, link_idx)))
14234 {
14235 conn->disable_connect_retry = FALSE;
14236 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14237 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14238 conn->mta_conn_mutex_lock_already = FALSE;
14239 conn->mta_conn_mutex_unlock_later = FALSE;
14240 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14241 pthread_mutex_unlock(&conn->mta_conn_mutex);
14242 DBUG_RETURN(error_num);
14243 }
14244 if ((error_num = spider_db_set_names(spider, conn, link_idx)))
14245 {
14246 conn->disable_connect_retry = FALSE;
14247 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14248 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14249 conn->mta_conn_mutex_lock_already = FALSE;
14250 conn->mta_conn_mutex_unlock_later = FALSE;
14251 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14252 pthread_mutex_unlock(&conn->mta_conn_mutex);
14253 DBUG_RETURN(error_num);
14254 }
14255 spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
14256 share);
14257 if (spider_db_query(
14258 conn,
14259 mysql_share->show_table_status[1 + pos].ptr(),
14260 mysql_share->show_table_status[1 + pos].length(),
14261 -1,
14262 &spider->need_mons[link_idx])
14263 ) {
14264 conn->disable_connect_retry = FALSE;
14265 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14266 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14267 conn->mta_conn_mutex_lock_already = FALSE;
14268 conn->mta_conn_mutex_unlock_later = FALSE;
14269 DBUG_RETURN(spider_db_errorno(conn));
14270 }
14271 } else {
14272 conn->disable_connect_retry = FALSE;
14273 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14274 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14275 conn->mta_conn_mutex_lock_already = FALSE;
14276 conn->mta_conn_mutex_unlock_later = FALSE;
14277 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14278 pthread_mutex_unlock(&conn->mta_conn_mutex);
14279 DBUG_RETURN(error_num);
14280 }
14281 }
14282 st_spider_db_request_key request_key;
14283 request_key.spider_thread_id = spider->trx->spider_thread_id;
14284 request_key.query_id = spider->trx->thd->query_id;
14285 request_key.handler = spider;
14286 request_key.request_id = 1;
14287 request_key.next = NULL;
14288 if (spider_param_dry_access())
14289 {
14290 conn->disable_connect_retry = FALSE;
14291 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14292 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14293 conn->mta_conn_mutex_lock_already = FALSE;
14294 conn->mta_conn_mutex_unlock_later = FALSE;
14295 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14296 pthread_mutex_unlock(&conn->mta_conn_mutex);
14297 DBUG_RETURN(0);
14298 }
14299 if (!(res = conn->db_conn->store_result(NULL, &request_key, &error_num)))
14300 {
14301 conn->disable_connect_retry = FALSE;
14302 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14303 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14304 conn->mta_conn_mutex_lock_already = FALSE;
14305 conn->mta_conn_mutex_unlock_later = FALSE;
14306 if (error_num || (error_num = spider_db_errorno(conn)))
14307 DBUG_RETURN(error_num);
14308 else
14309 DBUG_RETURN(ER_QUERY_ON_FOREIGN_DATA_SOURCE);
14310 }
14311 conn->disable_connect_retry = FALSE;
14312 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14313 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14314 conn->mta_conn_mutex_lock_already = FALSE;
14315 conn->mta_conn_mutex_unlock_later = FALSE;
14316 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14317 pthread_mutex_unlock(&conn->mta_conn_mutex);
14318 error_num = res->fetch_table_status(
14319 sts_mode,
14320 share->stat
14321 );
14322 auto_increment_value = share->stat.auto_increment_value;
14323 res->free_result();
14324 delete res;
14325 if (error_num)
14326 {
14327 switch (error_num)
14328 {
14329 case ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM:
14330 my_printf_error(ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM,
14331 ER_SPIDER_REMOTE_TABLE_NOT_FOUND_STR, MYF(0),
14332 mysql_share->db_names_str[spider->conn_link_idx[link_idx]].ptr(),
14333 mysql_share->table_names_str[spider->conn_link_idx[
14334 link_idx]].ptr());
14335 break;
14336 case ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM:
14337 my_printf_error(ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM,
14338 ER_SPIDER_INVALID_REMOTE_TABLE_INFO_STR, MYF(0),
14339 mysql_share->db_names_str[spider->conn_link_idx[link_idx]].ptr(),
14340 mysql_share->table_names_str[spider->conn_link_idx[
14341 link_idx]].ptr());
14342 break;
14343 default:
14344 break;
14345 }
14346 DBUG_RETURN(error_num);
14347 }
14348 }
14349 if (share->static_records_for_status != -1)
14350 {
14351 share->stat.records = (ha_rows) share->static_records_for_status;
14352 }
14353 if (share->static_mean_rec_length != -1)
14354 {
14355 share->stat.mean_rec_length = (ulong) share->static_mean_rec_length;
14356 }
14357 if (auto_increment_value > share->lgtm_tblhnd_share->auto_increment_value)
14358 {
14359 share->lgtm_tblhnd_share->auto_increment_value = auto_increment_value;
14360 DBUG_PRINT("info",("spider auto_increment_value=%llu",
14361 share->lgtm_tblhnd_share->auto_increment_value));
14362 }
14363 DBUG_RETURN(0);
14364 }
14365
crd_mode_exchange(int crd_mode)14366 int spider_mbase_handler::crd_mode_exchange(
14367 int crd_mode
14368 ) {
14369 DBUG_ENTER("spider_mbase_handler::crd_mode_exchange");
14370 DBUG_PRINT("info",("spider crd_mode=%d", crd_mode));
14371 DBUG_RETURN(crd_mode);
14372 }
14373
show_index(int link_idx,int crd_mode)14374 int spider_mbase_handler::show_index(
14375 int link_idx,
14376 int crd_mode
14377 ) {
14378 int error_num;
14379 SPIDER_CONN *conn = spider->conns[link_idx];
14380 SPIDER_SHARE *share = spider->share;
14381 TABLE *table = spider->get_table();
14382 SPIDER_DB_RESULT *res;
14383 int roop_count;
14384 longlong *tmp_cardinality;
14385 uint pos = (2 * spider->conn_link_idx[link_idx]);
14386 DBUG_ENTER("spider_mbase_handler::show_index");
14387 DBUG_PRINT("info",("spider crd_mode=%d", crd_mode));
14388 if (crd_mode == 1)
14389 {
14390 pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
14391 pthread_mutex_lock(&conn->mta_conn_mutex);
14392 SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
14393 conn->need_mon = &spider->need_mons[link_idx];
14394 DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
14395 DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
14396 conn->mta_conn_mutex_lock_already = TRUE;
14397 conn->mta_conn_mutex_unlock_later = TRUE;
14398 spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
14399 share);
14400 if (
14401 (error_num = spider_db_set_names(spider, conn, link_idx)) ||
14402 (
14403 spider_db_query(
14404 conn,
14405 mysql_share->show_index[0 + pos].ptr(),
14406 mysql_share->show_index[0 + pos].length(),
14407 -1,
14408 &spider->need_mons[link_idx]) &&
14409 (error_num = spider_db_errorno(conn))
14410 )
14411 ) {
14412 if (
14413 error_num == ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM &&
14414 !conn->disable_reconnect
14415 ) {
14416 /* retry */
14417 if ((error_num = spider_db_ping(spider, conn, link_idx)))
14418 {
14419 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14420 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14421 conn->mta_conn_mutex_lock_already = FALSE;
14422 conn->mta_conn_mutex_unlock_later = FALSE;
14423 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14424 pthread_mutex_unlock(&conn->mta_conn_mutex);
14425 DBUG_RETURN(error_num);
14426 }
14427 if ((error_num = spider_db_set_names(spider, conn, link_idx)))
14428 {
14429 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14430 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14431 conn->mta_conn_mutex_lock_already = FALSE;
14432 conn->mta_conn_mutex_unlock_later = FALSE;
14433 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14434 pthread_mutex_unlock(&conn->mta_conn_mutex);
14435 DBUG_RETURN(error_num);
14436 }
14437 spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
14438 share);
14439 if (spider_db_query(
14440 conn,
14441 mysql_share->show_index[0 + pos].ptr(),
14442 mysql_share->show_index[0 + pos].length(),
14443 -1,
14444 &spider->need_mons[link_idx])
14445 ) {
14446 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14447 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14448 conn->mta_conn_mutex_lock_already = FALSE;
14449 conn->mta_conn_mutex_unlock_later = FALSE;
14450 DBUG_RETURN(spider_db_errorno(conn));
14451 }
14452 } else {
14453 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14454 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14455 conn->mta_conn_mutex_lock_already = FALSE;
14456 conn->mta_conn_mutex_unlock_later = FALSE;
14457 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14458 pthread_mutex_unlock(&conn->mta_conn_mutex);
14459 DBUG_RETURN(error_num);
14460 }
14461 }
14462 st_spider_db_request_key request_key;
14463 request_key.spider_thread_id = spider->trx->spider_thread_id;
14464 request_key.query_id = spider->trx->thd->query_id;
14465 request_key.handler = spider;
14466 request_key.request_id = 1;
14467 request_key.next = NULL;
14468 if (!(res = conn->db_conn->store_result(NULL, &request_key, &error_num)))
14469 {
14470 if (error_num || (error_num = spider_db_errorno(conn)))
14471 {
14472 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14473 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14474 conn->mta_conn_mutex_lock_already = FALSE;
14475 conn->mta_conn_mutex_unlock_later = FALSE;
14476 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14477 pthread_mutex_unlock(&conn->mta_conn_mutex);
14478 DBUG_RETURN(error_num);
14479 }
14480 /* no record is ok */
14481 }
14482 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14483 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14484 conn->mta_conn_mutex_lock_already = FALSE;
14485 conn->mta_conn_mutex_unlock_later = FALSE;
14486 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14487 pthread_mutex_unlock(&conn->mta_conn_mutex);
14488 if (res)
14489 {
14490 error_num = res->fetch_table_cardinality(
14491 crd_mode,
14492 table,
14493 share->cardinality,
14494 share->cardinality_upd,
14495 share->bitmap_size
14496 );
14497 }
14498 for (roop_count = 0, tmp_cardinality = share->cardinality;
14499 roop_count < (int) table->s->fields;
14500 roop_count++, tmp_cardinality++)
14501 {
14502 if (!spider_bit_is_set(share->cardinality_upd, roop_count))
14503 {
14504 DBUG_PRINT("info",
14505 ("spider uninitialized column cardinality id=%d", roop_count));
14506 *tmp_cardinality = -1;
14507 }
14508 }
14509 if (res)
14510 {
14511 res->free_result();
14512 delete res;
14513 }
14514 if (error_num)
14515 {
14516 switch (error_num)
14517 {
14518 case ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM:
14519 my_printf_error(ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM,
14520 ER_SPIDER_REMOTE_TABLE_NOT_FOUND_STR, MYF(0),
14521 mysql_share->db_names_str[spider->conn_link_idx[link_idx]].ptr(),
14522 mysql_share->table_names_str[spider->conn_link_idx[
14523 link_idx]].ptr());
14524 break;
14525 case ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM:
14526 my_printf_error(ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM,
14527 ER_SPIDER_INVALID_REMOTE_TABLE_INFO_STR, MYF(0),
14528 mysql_share->db_names_str[spider->conn_link_idx[link_idx]].ptr(),
14529 mysql_share->table_names_str[spider->conn_link_idx[
14530 link_idx]].ptr());
14531 break;
14532 default:
14533 break;
14534 }
14535 DBUG_RETURN(error_num);
14536 }
14537 } else {
14538 pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
14539 pthread_mutex_lock(&conn->mta_conn_mutex);
14540 SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
14541 conn->need_mon = &spider->need_mons[link_idx];
14542 DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
14543 DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
14544 conn->mta_conn_mutex_lock_already = TRUE;
14545 conn->mta_conn_mutex_unlock_later = TRUE;
14546 spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
14547 share);
14548 if (
14549 (error_num = spider_db_set_names(spider, conn, link_idx)) ||
14550 (
14551 spider_db_query(
14552 conn,
14553 mysql_share->show_index[1 + pos].ptr(),
14554 mysql_share->show_index[1 + pos].length(),
14555 -1,
14556 &spider->need_mons[link_idx]) &&
14557 (error_num = spider_db_errorno(conn))
14558 )
14559 ) {
14560 if (
14561 error_num == ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM &&
14562 !conn->disable_reconnect
14563 ) {
14564 /* retry */
14565 if ((error_num = spider_db_ping(spider, conn, link_idx)))
14566 {
14567 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14568 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14569 conn->mta_conn_mutex_lock_already = FALSE;
14570 conn->mta_conn_mutex_unlock_later = FALSE;
14571 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14572 pthread_mutex_unlock(&conn->mta_conn_mutex);
14573 DBUG_RETURN(error_num);
14574 }
14575 if ((error_num = spider_db_set_names(spider, conn, link_idx)))
14576 {
14577 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14578 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14579 conn->mta_conn_mutex_lock_already = FALSE;
14580 conn->mta_conn_mutex_unlock_later = FALSE;
14581 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14582 pthread_mutex_unlock(&conn->mta_conn_mutex);
14583 DBUG_RETURN(error_num);
14584 }
14585 spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
14586 share);
14587 if (spider_db_query(
14588 conn,
14589 mysql_share->show_index[1 + pos].ptr(),
14590 mysql_share->show_index[1 + pos].length(),
14591 -1,
14592 &spider->need_mons[link_idx])
14593 ) {
14594 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14595 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14596 conn->mta_conn_mutex_lock_already = FALSE;
14597 conn->mta_conn_mutex_unlock_later = FALSE;
14598 DBUG_RETURN(spider_db_errorno(conn));
14599 }
14600 } else {
14601 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14602 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14603 conn->mta_conn_mutex_lock_already = FALSE;
14604 conn->mta_conn_mutex_unlock_later = FALSE;
14605 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14606 pthread_mutex_unlock(&conn->mta_conn_mutex);
14607 DBUG_RETURN(error_num);
14608 }
14609 }
14610 st_spider_db_request_key request_key;
14611 request_key.spider_thread_id = spider->trx->spider_thread_id;
14612 request_key.query_id = spider->trx->thd->query_id;
14613 request_key.handler = spider;
14614 request_key.request_id = 1;
14615 request_key.next = NULL;
14616 if (!(res = conn->db_conn->store_result(NULL, &request_key, &error_num)))
14617 {
14618 if (error_num || (error_num = spider_db_errorno(conn)))
14619 {
14620 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14621 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14622 conn->mta_conn_mutex_lock_already = FALSE;
14623 conn->mta_conn_mutex_unlock_later = FALSE;
14624 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14625 pthread_mutex_unlock(&conn->mta_conn_mutex);
14626 DBUG_RETURN(error_num);
14627 }
14628 /* no record is ok */
14629 }
14630 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14631 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14632 conn->mta_conn_mutex_lock_already = FALSE;
14633 conn->mta_conn_mutex_unlock_later = FALSE;
14634 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14635 pthread_mutex_unlock(&conn->mta_conn_mutex);
14636 if (res)
14637 {
14638 error_num = res->fetch_table_cardinality(
14639 crd_mode,
14640 table,
14641 share->cardinality,
14642 share->cardinality_upd,
14643 share->bitmap_size
14644 );
14645 }
14646 for (roop_count = 0, tmp_cardinality = share->cardinality;
14647 roop_count < (int) table->s->fields;
14648 roop_count++, tmp_cardinality++)
14649 {
14650 if (!spider_bit_is_set(share->cardinality_upd, roop_count))
14651 {
14652 DBUG_PRINT("info",
14653 ("spider uninitialized column cardinality id=%d", roop_count));
14654 *tmp_cardinality = -1;
14655 }
14656 }
14657 if (res)
14658 {
14659 res->free_result();
14660 delete res;
14661 }
14662 if (error_num)
14663 {
14664 switch (error_num)
14665 {
14666 case ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM:
14667 my_printf_error(ER_SPIDER_REMOTE_TABLE_NOT_FOUND_NUM,
14668 ER_SPIDER_REMOTE_TABLE_NOT_FOUND_STR, MYF(0),
14669 mysql_share->db_names_str[spider->conn_link_idx[link_idx]].ptr(),
14670 mysql_share->table_names_str[spider->conn_link_idx[
14671 link_idx]].ptr());
14672 break;
14673 case ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM:
14674 my_printf_error(ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM,
14675 ER_SPIDER_INVALID_REMOTE_TABLE_INFO_STR, MYF(0),
14676 mysql_share->db_names_str[spider->conn_link_idx[link_idx]].ptr(),
14677 mysql_share->table_names_str[spider->conn_link_idx[
14678 link_idx]].ptr());
14679 break;
14680 default:
14681 break;
14682 }
14683 DBUG_RETURN(error_num);
14684 }
14685 }
14686 DBUG_RETURN(0);
14687 }
14688
simple_action(uint simple_action,int link_idx)14689 int spider_mbase_handler::simple_action(
14690 uint simple_action,
14691 int link_idx
14692 ) {
14693 int error_num;
14694 SPIDER_CONN *conn = spider->conns[link_idx];
14695 SPIDER_DB_RESULT *res;
14696 SPIDER_SHARE *share = spider->share;
14697 uint pos = spider->conn_link_idx[link_idx];
14698 spider_string *str = NULL;
14699 DBUG_ENTER("spider_mbase_handler::simple_action");
14700 switch (simple_action)
14701 {
14702 case SPIDER_SIMPLE_RECORDS:
14703 DBUG_PRINT("info",("spider simple records"));
14704 str = &mysql_share->show_records[pos];
14705 break;
14706 #ifdef HA_HAS_CHECKSUM_EXTENDED
14707 case SPIDER_SIMPLE_CHECKSUM_TABLE:
14708 DBUG_PRINT("info",("spider simple checksum_table"));
14709 str = &spider->result_list.sqls[link_idx];
14710 str->length(0);
14711 if (str->reserve(
14712 SPIDER_SQL_CHECKSUM_TABLE_LEN +
14713 mysql_share->db_nm_max_length +
14714 SPIDER_SQL_DOT_LEN +
14715 mysql_share->table_nm_max_length +
14716 /* SPIDER_SQL_NAME_QUOTE_LEN */ 4 +
14717 ((spider->action_flags & T_QUICK) ? SPIDER_SQL_SQL_QUICK_LEN : 0) +
14718 ((spider->action_flags & T_EXTEND) ? SPIDER_SQL_SQL_EXTENDED_LEN : 0)
14719 ))
14720 {
14721 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
14722 }
14723 str->q_append(SPIDER_SQL_CHECKSUM_TABLE_STR,
14724 SPIDER_SQL_CHECKSUM_TABLE_LEN);
14725 mysql_share->append_table_name(str, pos);
14726 if (spider->action_flags & T_QUICK)
14727 {
14728 str->q_append(SPIDER_SQL_SQL_QUICK_STR, SPIDER_SQL_SQL_QUICK_LEN);
14729 }
14730 if (spider->action_flags & T_EXTEND)
14731 {
14732 str->q_append(SPIDER_SQL_SQL_EXTENDED_STR,
14733 SPIDER_SQL_SQL_EXTENDED_LEN);
14734 }
14735 break;
14736 #endif
14737 default:
14738 DBUG_ASSERT(0);
14739 DBUG_RETURN(0);
14740 }
14741 pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
14742 pthread_mutex_lock(&conn->mta_conn_mutex);
14743 SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
14744 conn->need_mon = &spider->need_mons[link_idx];
14745 DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
14746 DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
14747 conn->mta_conn_mutex_lock_already = TRUE;
14748 conn->mta_conn_mutex_unlock_later = TRUE;
14749 spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
14750 share);
14751 if (
14752 (error_num = spider_db_set_names(spider, conn, link_idx)) ||
14753 (
14754 spider_db_query(
14755 conn,
14756 str->ptr(),
14757 str->length(),
14758 -1,
14759 &spider->need_mons[link_idx]) &&
14760 (error_num = spider_db_errorno(conn))
14761 )
14762 ) {
14763 if (
14764 error_num == ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM &&
14765 !conn->disable_reconnect
14766 ) {
14767 /* retry */
14768 if ((error_num = spider_db_ping(spider, conn, link_idx)))
14769 {
14770 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14771 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14772 conn->mta_conn_mutex_lock_already = FALSE;
14773 conn->mta_conn_mutex_unlock_later = FALSE;
14774 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14775 pthread_mutex_unlock(&conn->mta_conn_mutex);
14776 DBUG_PRINT("info", ("spider error_num=%d 1", error_num));
14777 DBUG_RETURN(error_num);
14778 }
14779 if ((error_num = spider_db_set_names(spider, conn, link_idx)))
14780 {
14781 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14782 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14783 conn->mta_conn_mutex_lock_already = FALSE;
14784 conn->mta_conn_mutex_unlock_later = FALSE;
14785 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14786 pthread_mutex_unlock(&conn->mta_conn_mutex);
14787 DBUG_PRINT("info", ("spider error_num=%d 2", error_num));
14788 DBUG_RETURN(error_num);
14789 }
14790 spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
14791 share);
14792 if (spider_db_query(
14793 conn,
14794 str->ptr(),
14795 str->length(),
14796 -1,
14797 &spider->need_mons[link_idx])
14798 ) {
14799 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14800 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14801 conn->mta_conn_mutex_lock_already = FALSE;
14802 conn->mta_conn_mutex_unlock_later = FALSE;
14803 DBUG_PRINT("info", ("spider error_num=%d 3", error_num));
14804 DBUG_RETURN(spider_db_errorno(conn));
14805 }
14806 } else {
14807 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14808 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14809 conn->mta_conn_mutex_lock_already = FALSE;
14810 conn->mta_conn_mutex_unlock_later = FALSE;
14811 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14812 pthread_mutex_unlock(&conn->mta_conn_mutex);
14813 DBUG_PRINT("info", ("spider error_num=%d 4", error_num));
14814 DBUG_RETURN(error_num);
14815 }
14816 }
14817 st_spider_db_request_key request_key;
14818 request_key.spider_thread_id = spider->trx->spider_thread_id;
14819 request_key.query_id = spider->trx->thd->query_id;
14820 request_key.handler = spider;
14821 request_key.request_id = 1;
14822 request_key.next = NULL;
14823 if (!(res = conn->db_conn->store_result(NULL, &request_key, &error_num)))
14824 {
14825 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14826 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14827 conn->mta_conn_mutex_lock_already = FALSE;
14828 conn->mta_conn_mutex_unlock_later = FALSE;
14829 if (error_num)
14830 {
14831 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14832 pthread_mutex_unlock(&conn->mta_conn_mutex);
14833 DBUG_PRINT("info", ("spider error_num=%d 5", error_num));
14834 DBUG_RETURN(error_num);
14835 }
14836 else if ((error_num = spider_db_errorno(conn)))
14837 {
14838 DBUG_PRINT("info", ("spider error_num=%d 6", error_num));
14839 DBUG_RETURN(error_num);
14840 } else {
14841 DBUG_PRINT("info", ("spider error_num=%d 7",
14842 ER_QUERY_ON_FOREIGN_DATA_SOURCE));
14843 DBUG_RETURN(ER_QUERY_ON_FOREIGN_DATA_SOURCE);
14844 }
14845 }
14846 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14847 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14848 conn->mta_conn_mutex_lock_already = FALSE;
14849 conn->mta_conn_mutex_unlock_later = FALSE;
14850 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14851 pthread_mutex_unlock(&conn->mta_conn_mutex);
14852 switch (simple_action)
14853 {
14854 case SPIDER_SIMPLE_RECORDS:
14855 DBUG_PRINT("info",("spider simple records"));
14856 error_num = res->fetch_table_records(1, spider->table_rows);
14857 break;
14858 #ifdef HA_HAS_CHECKSUM_EXTENDED
14859 case SPIDER_SIMPLE_CHECKSUM_TABLE:
14860 DBUG_PRINT("info",("spider simple checksum_table"));
14861 error_num = res->fetch_table_checksum(spider);
14862 break;
14863 #endif
14864 default:
14865 DBUG_ASSERT(0);
14866 break;
14867 }
14868 res->free_result();
14869 delete res;
14870 if (error_num)
14871 {
14872 DBUG_PRINT("info", ("spider error_num=%d 7", error_num));
14873 DBUG_RETURN(error_num);
14874 }
14875 DBUG_RETURN(0);
14876 }
14877
show_records(int link_idx)14878 int spider_mbase_handler::show_records(
14879 int link_idx
14880 ) {
14881 int error_num;
14882 DBUG_ENTER("spider_mbase_handler::show_records");
14883 error_num = simple_action(SPIDER_SIMPLE_RECORDS, link_idx);
14884 if (error_num)
14885 {
14886 DBUG_PRINT("info", ("spider error_num=%d", error_num));
14887 DBUG_RETURN(error_num);
14888 }
14889 spider->trx->direct_aggregate_count++;
14890 DBUG_RETURN(0);
14891 }
14892
14893 #ifdef HA_HAS_CHECKSUM_EXTENDED
checksum_table(int link_idx)14894 int spider_mbase_handler::checksum_table(
14895 int link_idx
14896 ) {
14897 DBUG_ENTER("spider_mbase_handler::checksum_table");
14898 DBUG_RETURN(simple_action(SPIDER_SIMPLE_CHECKSUM_TABLE, link_idx));
14899 DBUG_RETURN(0);
14900 }
14901 #endif
14902
show_last_insert_id(int link_idx,ulonglong & last_insert_id)14903 int spider_mbase_handler::show_last_insert_id(
14904 int link_idx,
14905 ulonglong &last_insert_id
14906 ) {
14907 SPIDER_CONN *conn = spider->conns[link_idx];
14908 DBUG_ENTER("spider_mbase_handler::show_last_insert_id");
14909 last_insert_id = conn->db_conn->last_insert_id();
14910 DBUG_RETURN(0);
14911 }
14912
explain_select(key_range * start_key,key_range * end_key,int link_idx)14913 ha_rows spider_mbase_handler::explain_select(
14914 key_range *start_key,
14915 key_range *end_key,
14916 int link_idx
14917 ) {
14918 int error_num;
14919 SPIDER_CONN *conn = spider->conns[link_idx];
14920 SPIDER_RESULT_LIST *result_list = &spider->result_list;
14921 spider_string *str = &result_list->sqls[link_idx];
14922 SPIDER_DB_RESULT *res;
14923 ha_rows rows;
14924 spider_db_handler *dbton_hdl = spider->dbton_handler[conn->dbton_id];
14925 DBUG_ENTER("spider_mbase_handler::explain_select");
14926 if ((error_num = dbton_hdl->append_explain_select_part(
14927 start_key, end_key, SPIDER_SQL_TYPE_OTHER_SQL, link_idx)))
14928 {
14929 my_errno = error_num;
14930 DBUG_RETURN(HA_POS_ERROR);
14931 }
14932
14933 pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
14934 pthread_mutex_lock(&conn->mta_conn_mutex);
14935 SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
14936 conn->need_mon = &spider->need_mons[link_idx];
14937 DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
14938 DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
14939 conn->mta_conn_mutex_lock_already = TRUE;
14940 conn->mta_conn_mutex_unlock_later = TRUE;
14941 spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
14942 spider->share);
14943 if (
14944 (error_num = spider_db_set_names(spider, conn, link_idx)) ||
14945 (
14946 spider_db_query(
14947 conn,
14948 str->ptr(),
14949 str->length(),
14950 -1,
14951 &spider->need_mons[link_idx]) &&
14952 (error_num = spider_db_errorno(conn))
14953 )
14954 ) {
14955 if (
14956 error_num == ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM &&
14957 !conn->disable_reconnect
14958 ) {
14959 /* retry */
14960 if ((error_num = spider_db_ping(spider, conn, link_idx)))
14961 {
14962 if (spider->check_error_mode(error_num))
14963 my_errno = error_num;
14964 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14965 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14966 conn->mta_conn_mutex_lock_already = FALSE;
14967 conn->mta_conn_mutex_unlock_later = FALSE;
14968 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14969 pthread_mutex_unlock(&conn->mta_conn_mutex);
14970 DBUG_RETURN(HA_POS_ERROR);
14971 }
14972 if ((error_num = spider_db_set_names(spider, conn, link_idx)))
14973 {
14974 if (spider->check_error_mode(error_num))
14975 my_errno = error_num;
14976 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14977 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14978 conn->mta_conn_mutex_lock_already = FALSE;
14979 conn->mta_conn_mutex_unlock_later = FALSE;
14980 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
14981 pthread_mutex_unlock(&conn->mta_conn_mutex);
14982 DBUG_RETURN(HA_POS_ERROR);
14983 }
14984 spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
14985 spider->share);
14986 if (spider_db_query(
14987 conn,
14988 str->ptr(),
14989 str->length(),
14990 -1,
14991 &spider->need_mons[link_idx])
14992 ) {
14993 error_num = spider_db_errorno(conn);
14994 if (spider->check_error_mode(error_num))
14995 my_errno = error_num;
14996 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
14997 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
14998 conn->mta_conn_mutex_lock_already = FALSE;
14999 conn->mta_conn_mutex_unlock_later = FALSE;
15000 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15001 pthread_mutex_unlock(&conn->mta_conn_mutex);
15002 DBUG_RETURN(HA_POS_ERROR);
15003 }
15004 } else {
15005 if (spider->check_error_mode(error_num))
15006 my_errno = error_num;
15007 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15008 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15009 conn->mta_conn_mutex_lock_already = FALSE;
15010 conn->mta_conn_mutex_unlock_later = FALSE;
15011 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15012 pthread_mutex_unlock(&conn->mta_conn_mutex);
15013 DBUG_RETURN(HA_POS_ERROR);
15014 }
15015 }
15016 st_spider_db_request_key request_key;
15017 request_key.spider_thread_id = spider->trx->spider_thread_id;
15018 request_key.query_id = spider->trx->thd->query_id;
15019 request_key.handler = spider;
15020 request_key.request_id = 1;
15021 request_key.next = NULL;
15022 if (!(res = conn->db_conn->store_result(NULL, &request_key, &error_num)))
15023 {
15024 if (error_num || (error_num = spider_db_errorno(conn)))
15025 {
15026 if (spider->check_error_mode(error_num))
15027 my_errno = error_num;
15028 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15029 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15030 conn->mta_conn_mutex_lock_already = FALSE;
15031 conn->mta_conn_mutex_unlock_later = FALSE;
15032 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15033 pthread_mutex_unlock(&conn->mta_conn_mutex);
15034 DBUG_RETURN(HA_POS_ERROR);
15035 } else {
15036 my_errno = ER_QUERY_ON_FOREIGN_DATA_SOURCE;
15037 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15038 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15039 conn->mta_conn_mutex_lock_already = FALSE;
15040 conn->mta_conn_mutex_unlock_later = FALSE;
15041 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15042 pthread_mutex_unlock(&conn->mta_conn_mutex);
15043 DBUG_RETURN(HA_POS_ERROR);
15044 }
15045 }
15046 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15047 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15048 conn->mta_conn_mutex_lock_already = FALSE;
15049 conn->mta_conn_mutex_unlock_later = FALSE;
15050 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15051 pthread_mutex_unlock(&conn->mta_conn_mutex);
15052 error_num = res->fetch_table_records(
15053 2,
15054 rows
15055 );
15056 res->free_result();
15057 delete res;
15058 if (error_num)
15059 {
15060 my_errno = error_num;
15061 DBUG_RETURN(HA_POS_ERROR);
15062 }
15063 DBUG_RETURN(rows);
15064 }
15065
lock_tables(int link_idx)15066 int spider_mbase_handler::lock_tables(
15067 int link_idx
15068 ) {
15069 int error_num;
15070 SPIDER_CONN *conn = spider->conns[link_idx];
15071 spider_string *str = &sql;
15072 DBUG_ENTER("spider_mbase_handler::lock_tables");
15073 str->length(0);
15074 if ((error_num = conn->db_conn->append_lock_tables(str)))
15075 {
15076 DBUG_RETURN(error_num);
15077 }
15078 if (str->length())
15079 {
15080 pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
15081 pthread_mutex_lock(&conn->mta_conn_mutex);
15082 SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
15083 conn->need_mon = &spider->need_mons[link_idx];
15084 DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
15085 DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
15086 conn->mta_conn_mutex_lock_already = TRUE;
15087 conn->mta_conn_mutex_unlock_later = TRUE;
15088 if ((error_num = spider_db_set_names(spider, conn, link_idx)))
15089 {
15090 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15091 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15092 conn->mta_conn_mutex_lock_already = FALSE;
15093 conn->mta_conn_mutex_unlock_later = FALSE;
15094 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15095 pthread_mutex_unlock(&conn->mta_conn_mutex);
15096 DBUG_RETURN(error_num);
15097 }
15098 spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
15099 spider->share);
15100 if (spider_db_query(
15101 conn,
15102 str->ptr(),
15103 str->length(),
15104 -1,
15105 &spider->need_mons[link_idx])
15106 ) {
15107 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15108 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15109 conn->mta_conn_mutex_lock_already = FALSE;
15110 conn->mta_conn_mutex_unlock_later = FALSE;
15111 DBUG_RETURN(spider_db_errorno(conn));
15112 }
15113 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15114 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15115 conn->mta_conn_mutex_lock_already = FALSE;
15116 conn->mta_conn_mutex_unlock_later = FALSE;
15117 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15118 pthread_mutex_unlock(&conn->mta_conn_mutex);
15119 }
15120 if (!conn->table_locked)
15121 {
15122 conn->table_locked = TRUE;
15123 spider->trx->locked_connections++;
15124 }
15125 DBUG_RETURN(0);
15126 }
15127
unlock_tables(int link_idx)15128 int spider_mbase_handler::unlock_tables(
15129 int link_idx
15130 ) {
15131 int error_num;
15132 SPIDER_CONN *conn = spider->conns[link_idx];
15133 DBUG_ENTER("spider_mbase_handler::unlock_tables");
15134 if (conn->table_locked)
15135 {
15136 spider_string *str = &sql;
15137 conn->table_locked = FALSE;
15138 spider->trx->locked_connections--;
15139
15140 str->length(0);
15141 if ((error_num = conn->db_conn->append_unlock_tables(str)))
15142 {
15143 DBUG_RETURN(error_num);
15144 }
15145 if (str->length())
15146 {
15147 spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
15148 spider->share);
15149 pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
15150 pthread_mutex_lock(&conn->mta_conn_mutex);
15151 SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
15152 conn->need_mon = &spider->need_mons[link_idx];
15153 DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
15154 DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
15155 conn->mta_conn_mutex_lock_already = TRUE;
15156 conn->mta_conn_mutex_unlock_later = TRUE;
15157 if (spider_db_query(
15158 conn,
15159 str->ptr(),
15160 str->length(),
15161 -1,
15162 &spider->need_mons[link_idx])
15163 ) {
15164 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15165 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15166 conn->mta_conn_mutex_lock_already = FALSE;
15167 conn->mta_conn_mutex_unlock_later = FALSE;
15168 DBUG_RETURN(spider_db_errorno(conn));
15169 }
15170 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15171 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15172 conn->mta_conn_mutex_lock_already = FALSE;
15173 conn->mta_conn_mutex_unlock_later = FALSE;
15174 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15175 pthread_mutex_unlock(&conn->mta_conn_mutex);
15176 }
15177 }
15178 DBUG_RETURN(0);
15179 }
15180
disable_keys(SPIDER_CONN * conn,int link_idx)15181 int spider_mbase_handler::disable_keys(
15182 SPIDER_CONN *conn,
15183 int link_idx
15184 ) {
15185 int error_num;
15186 SPIDER_SHARE *share = spider->share;
15187 spider_string *str = &spider->result_list.sqls[link_idx];
15188 DBUG_ENTER("spider_mbase_handler::disable_keys");
15189 DBUG_PRINT("info",("spider this=%p", this));
15190 str->length(0);
15191 if ((error_num = append_disable_keys_part(SPIDER_SQL_TYPE_OTHER_HS,
15192 link_idx)))
15193 {
15194 DBUG_RETURN(error_num);
15195 }
15196 pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
15197 pthread_mutex_lock(&conn->mta_conn_mutex);
15198 SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
15199 conn->need_mon = &spider->need_mons[link_idx];
15200 DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
15201 DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
15202 conn->mta_conn_mutex_lock_already = TRUE;
15203 conn->mta_conn_mutex_unlock_later = TRUE;
15204 if ((error_num = spider_db_set_names(spider, conn, link_idx)))
15205 {
15206 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15207 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15208 conn->mta_conn_mutex_lock_already = FALSE;
15209 conn->mta_conn_mutex_unlock_later = FALSE;
15210 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15211 pthread_mutex_unlock(&conn->mta_conn_mutex);
15212 DBUG_RETURN(error_num);
15213 }
15214 spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
15215 share);
15216 if (spider_db_query(
15217 conn,
15218 str->ptr(),
15219 str->length(),
15220 -1,
15221 &spider->need_mons[link_idx])
15222 ) {
15223 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15224 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15225 conn->mta_conn_mutex_lock_already = FALSE;
15226 conn->mta_conn_mutex_unlock_later = FALSE;
15227 error_num = spider_db_errorno(conn);
15228 DBUG_RETURN(error_num);
15229 }
15230 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15231 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15232 conn->mta_conn_mutex_lock_already = FALSE;
15233 conn->mta_conn_mutex_unlock_later = FALSE;
15234 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15235 pthread_mutex_unlock(&conn->mta_conn_mutex);
15236 DBUG_RETURN(0);
15237 }
15238
enable_keys(SPIDER_CONN * conn,int link_idx)15239 int spider_mbase_handler::enable_keys(
15240 SPIDER_CONN *conn,
15241 int link_idx
15242 ) {
15243 int error_num;
15244 SPIDER_SHARE *share = spider->share;
15245 spider_string *str = &spider->result_list.sqls[link_idx];
15246 DBUG_ENTER("spider_mbase_handler::enable_keys");
15247 DBUG_PRINT("info",("spider this=%p", this));
15248 str->length(0);
15249 if ((error_num = append_enable_keys_part(SPIDER_SQL_TYPE_OTHER_HS,
15250 link_idx)))
15251 {
15252 DBUG_RETURN(error_num);
15253 }
15254 pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
15255 pthread_mutex_lock(&conn->mta_conn_mutex);
15256 SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
15257 conn->need_mon = &spider->need_mons[link_idx];
15258 DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
15259 DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
15260 conn->mta_conn_mutex_lock_already = TRUE;
15261 conn->mta_conn_mutex_unlock_later = TRUE;
15262 if ((error_num = spider_db_set_names(spider, conn, link_idx)))
15263 {
15264 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15265 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15266 conn->mta_conn_mutex_lock_already = FALSE;
15267 conn->mta_conn_mutex_unlock_later = FALSE;
15268 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15269 pthread_mutex_unlock(&conn->mta_conn_mutex);
15270 DBUG_RETURN(error_num);
15271 }
15272 spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
15273 share);
15274 if (spider_db_query(
15275 conn,
15276 str->ptr(),
15277 str->length(),
15278 -1,
15279 &spider->need_mons[link_idx])
15280 ) {
15281 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15282 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15283 conn->mta_conn_mutex_lock_already = FALSE;
15284 conn->mta_conn_mutex_unlock_later = FALSE;
15285 error_num = spider_db_errorno(conn);
15286 DBUG_RETURN(error_num);
15287 }
15288 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15289 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15290 conn->mta_conn_mutex_lock_already = FALSE;
15291 conn->mta_conn_mutex_unlock_later = FALSE;
15292 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15293 pthread_mutex_unlock(&conn->mta_conn_mutex);
15294 DBUG_RETURN(0);
15295 }
15296
check_table(SPIDER_CONN * conn,int link_idx,HA_CHECK_OPT * check_opt)15297 int spider_mbase_handler::check_table(
15298 SPIDER_CONN *conn,
15299 int link_idx,
15300 HA_CHECK_OPT* check_opt
15301 ) {
15302 int error_num;
15303 SPIDER_SHARE *share = spider->share;
15304 spider_string *str = &spider->result_list.sqls[link_idx];
15305 DBUG_ENTER("spider_mbase_handler::check_table");
15306 DBUG_PRINT("info",("spider this=%p", this));
15307 str->length(0);
15308 if ((error_num = append_check_table_part(SPIDER_SQL_TYPE_OTHER_HS,
15309 link_idx, check_opt)))
15310 {
15311 DBUG_RETURN(error_num);
15312 }
15313 pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
15314 pthread_mutex_lock(&conn->mta_conn_mutex);
15315 SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
15316 conn->need_mon = &spider->need_mons[link_idx];
15317 DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
15318 DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
15319 conn->mta_conn_mutex_lock_already = TRUE;
15320 conn->mta_conn_mutex_unlock_later = TRUE;
15321 if ((error_num = spider_db_set_names(spider, conn, link_idx)))
15322 {
15323 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15324 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15325 conn->mta_conn_mutex_lock_already = FALSE;
15326 conn->mta_conn_mutex_unlock_later = FALSE;
15327 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15328 pthread_mutex_unlock(&conn->mta_conn_mutex);
15329 DBUG_RETURN(error_num);
15330 }
15331 spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
15332 share);
15333 if (spider_db_query(
15334 conn,
15335 str->ptr(),
15336 str->length(),
15337 -1,
15338 &spider->need_mons[link_idx])
15339 ) {
15340 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15341 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15342 conn->mta_conn_mutex_lock_already = FALSE;
15343 conn->mta_conn_mutex_unlock_later = FALSE;
15344 error_num = spider_db_errorno(conn);
15345 DBUG_RETURN(error_num);
15346 }
15347 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15348 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15349 conn->mta_conn_mutex_lock_already = FALSE;
15350 conn->mta_conn_mutex_unlock_later = FALSE;
15351 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15352 pthread_mutex_unlock(&conn->mta_conn_mutex);
15353 DBUG_RETURN(0);
15354 }
15355
repair_table(SPIDER_CONN * conn,int link_idx,HA_CHECK_OPT * check_opt)15356 int spider_mbase_handler::repair_table(
15357 SPIDER_CONN *conn,
15358 int link_idx,
15359 HA_CHECK_OPT* check_opt
15360 ) {
15361 int error_num;
15362 SPIDER_SHARE *share = spider->share;
15363 spider_string *str = &spider->result_list.sqls[link_idx];
15364 DBUG_ENTER("spider_mbase_handler::repair_table");
15365 DBUG_PRINT("info",("spider this=%p", this));
15366 str->length(0);
15367 if ((error_num = append_repair_table_part(SPIDER_SQL_TYPE_OTHER_HS,
15368 link_idx, check_opt)))
15369 {
15370 DBUG_RETURN(error_num);
15371 }
15372 pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
15373 pthread_mutex_lock(&conn->mta_conn_mutex);
15374 SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
15375 conn->need_mon = &spider->need_mons[link_idx];
15376 DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
15377 DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
15378 conn->mta_conn_mutex_lock_already = TRUE;
15379 conn->mta_conn_mutex_unlock_later = TRUE;
15380 if ((error_num = spider_db_set_names(spider, conn, link_idx)))
15381 {
15382 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15383 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15384 conn->mta_conn_mutex_lock_already = FALSE;
15385 conn->mta_conn_mutex_unlock_later = FALSE;
15386 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15387 pthread_mutex_unlock(&conn->mta_conn_mutex);
15388 DBUG_RETURN(error_num);
15389 }
15390 spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
15391 share);
15392 if (spider_db_query(
15393 conn,
15394 str->ptr(),
15395 str->length(),
15396 -1,
15397 &spider->need_mons[link_idx])
15398 ) {
15399 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15400 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15401 conn->mta_conn_mutex_lock_already = FALSE;
15402 conn->mta_conn_mutex_unlock_later = FALSE;
15403 error_num = spider_db_errorno(conn);
15404 DBUG_RETURN(error_num);
15405 }
15406 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15407 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15408 conn->mta_conn_mutex_lock_already = FALSE;
15409 conn->mta_conn_mutex_unlock_later = FALSE;
15410 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15411 pthread_mutex_unlock(&conn->mta_conn_mutex);
15412 DBUG_RETURN(0);
15413 }
15414
analyze_table(SPIDER_CONN * conn,int link_idx)15415 int spider_mbase_handler::analyze_table(
15416 SPIDER_CONN *conn,
15417 int link_idx
15418 ) {
15419 int error_num;
15420 SPIDER_SHARE *share = spider->share;
15421 spider_string *str = &spider->result_list.sqls[link_idx];
15422 DBUG_ENTER("spider_mbase_handler::analyze_table");
15423 DBUG_PRINT("info",("spider this=%p", this));
15424 str->length(0);
15425 if ((error_num = append_analyze_table_part(SPIDER_SQL_TYPE_OTHER_HS,
15426 link_idx)))
15427 {
15428 DBUG_RETURN(error_num);
15429 }
15430 pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
15431 pthread_mutex_lock(&conn->mta_conn_mutex);
15432 SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
15433 conn->need_mon = &spider->need_mons[link_idx];
15434 DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
15435 DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
15436 conn->mta_conn_mutex_lock_already = TRUE;
15437 conn->mta_conn_mutex_unlock_later = TRUE;
15438 if ((error_num = spider_db_set_names(spider, conn, link_idx)))
15439 {
15440 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15441 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15442 conn->mta_conn_mutex_lock_already = FALSE;
15443 conn->mta_conn_mutex_unlock_later = FALSE;
15444 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15445 pthread_mutex_unlock(&conn->mta_conn_mutex);
15446 DBUG_RETURN(error_num);
15447 }
15448 spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
15449 share);
15450 if (spider_db_query(
15451 conn,
15452 str->ptr(),
15453 str->length(),
15454 -1,
15455 &spider->need_mons[link_idx])
15456 ) {
15457 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15458 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15459 conn->mta_conn_mutex_lock_already = FALSE;
15460 conn->mta_conn_mutex_unlock_later = FALSE;
15461 error_num = spider_db_errorno(conn);
15462 DBUG_RETURN(error_num);
15463 }
15464 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15465 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15466 conn->mta_conn_mutex_lock_already = FALSE;
15467 conn->mta_conn_mutex_unlock_later = FALSE;
15468 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15469 pthread_mutex_unlock(&conn->mta_conn_mutex);
15470 DBUG_RETURN(0);
15471 }
15472
optimize_table(SPIDER_CONN * conn,int link_idx)15473 int spider_mbase_handler::optimize_table(
15474 SPIDER_CONN *conn,
15475 int link_idx
15476 ) {
15477 int error_num;
15478 SPIDER_SHARE *share = spider->share;
15479 spider_string *str = &spider->result_list.sqls[link_idx];
15480 DBUG_ENTER("spider_mbase_handler::optimize_table");
15481 DBUG_PRINT("info",("spider this=%p", this));
15482 str->length(0);
15483 if ((error_num = append_optimize_table_part(SPIDER_SQL_TYPE_OTHER_HS,
15484 link_idx)))
15485 {
15486 DBUG_RETURN(error_num);
15487 }
15488 pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
15489 pthread_mutex_lock(&conn->mta_conn_mutex);
15490 SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
15491 conn->need_mon = &spider->need_mons[link_idx];
15492 DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
15493 DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
15494 conn->mta_conn_mutex_lock_already = TRUE;
15495 conn->mta_conn_mutex_unlock_later = TRUE;
15496 if ((error_num = spider_db_set_names(spider, conn, link_idx)))
15497 {
15498 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15499 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15500 conn->mta_conn_mutex_lock_already = FALSE;
15501 conn->mta_conn_mutex_unlock_later = FALSE;
15502 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15503 pthread_mutex_unlock(&conn->mta_conn_mutex);
15504 DBUG_RETURN(error_num);
15505 }
15506 spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
15507 share);
15508 if (spider_db_query(
15509 conn,
15510 str->ptr(),
15511 str->length(),
15512 -1,
15513 &spider->need_mons[link_idx])
15514 ) {
15515 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15516 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15517 conn->mta_conn_mutex_lock_already = FALSE;
15518 conn->mta_conn_mutex_unlock_later = FALSE;
15519 error_num = spider_db_errorno(conn);
15520 DBUG_RETURN(error_num);
15521 }
15522 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15523 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15524 conn->mta_conn_mutex_lock_already = FALSE;
15525 conn->mta_conn_mutex_unlock_later = FALSE;
15526 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15527 pthread_mutex_unlock(&conn->mta_conn_mutex);
15528 DBUG_RETURN(0);
15529 }
15530
flush_tables(SPIDER_CONN * conn,int link_idx,bool lock)15531 int spider_mbase_handler::flush_tables(
15532 SPIDER_CONN *conn,
15533 int link_idx,
15534 bool lock
15535 ) {
15536 int error_num;
15537 SPIDER_SHARE *share = spider->share;
15538 spider_string *str = &spider->result_list.sqls[link_idx];
15539 DBUG_ENTER("spider_mbase_handler::flush_tables");
15540 DBUG_PRINT("info",("spider this=%p", this));
15541 str->length(0);
15542 if ((error_num = append_flush_tables_part(SPIDER_SQL_TYPE_OTHER_HS,
15543 link_idx, lock)))
15544 {
15545 DBUG_RETURN(error_num);
15546 }
15547 spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
15548 share);
15549 pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
15550 pthread_mutex_lock(&conn->mta_conn_mutex);
15551 SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
15552 conn->need_mon = &spider->need_mons[link_idx];
15553 DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
15554 DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
15555 conn->mta_conn_mutex_lock_already = TRUE;
15556 conn->mta_conn_mutex_unlock_later = TRUE;
15557 if (spider_db_query(
15558 conn,
15559 str->ptr(),
15560 str->length(),
15561 -1,
15562 &spider->need_mons[link_idx])
15563 ) {
15564 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15565 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15566 conn->mta_conn_mutex_lock_already = FALSE;
15567 conn->mta_conn_mutex_unlock_later = FALSE;
15568 error_num = spider_db_errorno(conn);
15569 DBUG_RETURN(error_num);
15570 }
15571 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15572 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15573 conn->mta_conn_mutex_lock_already = FALSE;
15574 conn->mta_conn_mutex_unlock_later = FALSE;
15575 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15576 pthread_mutex_unlock(&conn->mta_conn_mutex);
15577 DBUG_RETURN(0);
15578 }
15579
flush_logs(SPIDER_CONN * conn,int link_idx)15580 int spider_mbase_handler::flush_logs(
15581 SPIDER_CONN *conn,
15582 int link_idx
15583 ) {
15584 int error_num;
15585 SPIDER_SHARE *share = spider->share;
15586 DBUG_ENTER("spider_mbase_handler::flush_logs");
15587 DBUG_PRINT("info",("spider this=%p", this));
15588 spider_conn_set_timeout_from_share(conn, link_idx, spider->trx->thd,
15589 share);
15590 pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
15591 pthread_mutex_lock(&conn->mta_conn_mutex);
15592 SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
15593 conn->need_mon = &spider->need_mons[link_idx];
15594 DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
15595 DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
15596 conn->mta_conn_mutex_lock_already = TRUE;
15597 conn->mta_conn_mutex_unlock_later = TRUE;
15598 if (spider_db_query(
15599 conn,
15600 SPIDER_SQL_FLUSH_LOGS_STR,
15601 SPIDER_SQL_FLUSH_LOGS_LEN,
15602 -1,
15603 &spider->need_mons[link_idx])
15604 ) {
15605 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15606 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15607 conn->mta_conn_mutex_lock_already = FALSE;
15608 conn->mta_conn_mutex_unlock_later = FALSE;
15609 error_num = spider_db_errorno(conn);
15610 DBUG_RETURN(error_num);
15611 }
15612 DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
15613 DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
15614 conn->mta_conn_mutex_lock_already = FALSE;
15615 conn->mta_conn_mutex_unlock_later = FALSE;
15616 SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
15617 pthread_mutex_unlock(&conn->mta_conn_mutex);
15618 DBUG_RETURN(0);
15619 }
15620
insert_opened_handler(SPIDER_CONN * conn,int link_idx)15621 int spider_mbase_handler::insert_opened_handler(
15622 SPIDER_CONN *conn,
15623 int link_idx
15624 ) {
15625 spider_db_mbase *db_conn = (spider_db_mbase *) conn->db_conn;
15626 SPIDER_LINK_FOR_HASH *tmp_link_for_hash = &link_for_hash[link_idx];
15627 DBUG_ASSERT(tmp_link_for_hash->spider == spider);
15628 DBUG_ASSERT(tmp_link_for_hash->link_idx == link_idx);
15629 uint old_elements = db_conn->handler_open_array.max_element;
15630 DBUG_ENTER("spider_mbase_handler::insert_opened_handler");
15631 DBUG_PRINT("info",("spider this=%p", this));
15632 if (insert_dynamic(&db_conn->handler_open_array,
15633 (uchar*) &tmp_link_for_hash))
15634 {
15635 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
15636 }
15637 if (db_conn->handler_open_array.max_element > old_elements)
15638 {
15639 spider_alloc_calc_mem(spider_current_trx,
15640 db_conn->handler_open_array,
15641 (db_conn->handler_open_array.max_element - old_elements) *
15642 db_conn->handler_open_array.size_of_element);
15643 }
15644 DBUG_RETURN(0);
15645 }
15646
delete_opened_handler(SPIDER_CONN * conn,int link_idx)15647 int spider_mbase_handler::delete_opened_handler(
15648 SPIDER_CONN *conn,
15649 int link_idx
15650 ) {
15651 spider_db_mbase *db_conn = (spider_db_mbase *) conn->db_conn;
15652 uint roop_count, elements = db_conn->handler_open_array.elements;
15653 SPIDER_LINK_FOR_HASH *tmp_link_for_hash;
15654 DBUG_ENTER("spider_mbase_handler::delete_opened_handler");
15655 DBUG_PRINT("info",("spider this=%p", this));
15656 for (roop_count = 0; roop_count < elements; roop_count++)
15657 {
15658 get_dynamic(&db_conn->handler_open_array, (uchar *) &tmp_link_for_hash,
15659 roop_count);
15660 if (tmp_link_for_hash == &link_for_hash[link_idx])
15661 {
15662 delete_dynamic_element(&db_conn->handler_open_array, roop_count);
15663 break;
15664 }
15665 }
15666 DBUG_ASSERT(roop_count < elements);
15667 DBUG_RETURN(0);
15668 }
15669
sync_from_clone_source(spider_db_handler * dbton_hdl)15670 int spider_mbase_handler::sync_from_clone_source(
15671 spider_db_handler *dbton_hdl
15672 ) {
15673 DBUG_ENTER("spider_mbase_handler::sync_from_clone_source");
15674 DBUG_PRINT("info",("spider this=%p", this));
15675 DBUG_RETURN(0);
15676 }
15677
support_use_handler(int use_handler)15678 bool spider_mbase_handler::support_use_handler(
15679 int use_handler
15680 ) {
15681 DBUG_ENTER("spider_mbase_handler::support_use_handler");
15682 DBUG_PRINT("info",("spider this=%p", this));
15683 DBUG_RETURN(TRUE);
15684 }
15685
minimum_select_bitmap_create()15686 void spider_mbase_handler::minimum_select_bitmap_create()
15687 {
15688 TABLE *table = spider->get_table();
15689 Field **field_p;
15690 DBUG_ENTER("spider_mbase_handler::minimum_select_bitmap_create");
15691 DBUG_PRINT("info",("spider this=%p", this));
15692 memset(minimum_select_bitmap, 0, no_bytes_in_map(table->read_set));
15693 if (
15694 spider->use_index_merge ||
15695 #ifdef HA_CAN_BULK_ACCESS
15696 (spider->is_clone && !spider->is_bulk_access_clone)
15697 #else
15698 spider->is_clone
15699 #endif
15700 ) {
15701 /* need preparing for cmp_ref */
15702 TABLE_SHARE *table_share = table->s;
15703 if (
15704 table_share->primary_key == MAX_KEY
15705 ) {
15706 /* need all columns */
15707 memset(minimum_select_bitmap, 0xFF, no_bytes_in_map(table->read_set));
15708 DBUG_VOID_RETURN;
15709 } else {
15710 /* need primary key columns */
15711 uint roop_count;
15712 KEY *key_info;
15713 KEY_PART_INFO *key_part;
15714 Field *field;
15715 key_info = &table_share->key_info[table_share->primary_key];
15716 key_part = key_info->key_part;
15717 for (roop_count = 0;
15718 roop_count < spider_user_defined_key_parts(key_info);
15719 roop_count++)
15720 {
15721 field = key_part[roop_count].field;
15722 spider_set_bit(minimum_select_bitmap, field->field_index);
15723 }
15724 }
15725 }
15726 DBUG_PRINT("info",("spider searched_bitmap=%p", spider->searched_bitmap));
15727 for (field_p = table->field; *field_p; field_p++)
15728 {
15729 uint field_index = (*field_p)->field_index;
15730 DBUG_PRINT("info",("spider field_index=%u", field_index));
15731 DBUG_PRINT("info",("spider ft_discard_bitmap=%s",
15732 spider_bit_is_set(spider->ft_discard_bitmap, field_index) ?
15733 "TRUE" : "FALSE"));
15734 DBUG_PRINT("info",("spider searched_bitmap=%s",
15735 spider_bit_is_set(spider->searched_bitmap, field_index) ?
15736 "TRUE" : "FALSE"));
15737 DBUG_PRINT("info",("spider read_set=%s",
15738 bitmap_is_set(table->read_set, field_index) ?
15739 "TRUE" : "FALSE"));
15740 DBUG_PRINT("info",("spider write_set=%s",
15741 bitmap_is_set(table->write_set, field_index) ?
15742 "TRUE" : "FALSE"));
15743 if (
15744 spider_bit_is_set(spider->ft_discard_bitmap, field_index) &
15745 (
15746 spider_bit_is_set(spider->searched_bitmap, field_index) |
15747 bitmap_is_set(table->read_set, field_index) |
15748 bitmap_is_set(table->write_set, field_index)
15749 )
15750 ) {
15751 spider_set_bit(minimum_select_bitmap, field_index);
15752 }
15753 }
15754 DBUG_VOID_RETURN;
15755 }
15756
minimum_select_bit_is_set(uint field_index)15757 bool spider_mbase_handler::minimum_select_bit_is_set(
15758 uint field_index
15759 ) {
15760 DBUG_ENTER("spider_mbase_handler::minimum_select_bit_is_set");
15761 DBUG_PRINT("info",("spider this=%p", this));
15762 DBUG_PRINT("info",("spider field_index=%u", field_index));
15763 DBUG_PRINT("info",("spider minimum_select_bitmap=%s",
15764 spider_bit_is_set(minimum_select_bitmap, field_index) ?
15765 "TRUE" : "FALSE"));
15766 DBUG_RETURN(spider_bit_is_set(minimum_select_bitmap, field_index));
15767 }
15768
copy_minimum_select_bitmap(uchar * bitmap)15769 void spider_mbase_handler::copy_minimum_select_bitmap(
15770 uchar *bitmap
15771 ) {
15772 int roop_count;
15773 TABLE *table = spider->get_table();
15774 DBUG_ENTER("spider_mbase_handler::copy_minimum_select_bitmap");
15775 for (roop_count = 0;
15776 roop_count < (int) ((table->s->fields + 7) / 8);
15777 roop_count++)
15778 {
15779 bitmap[roop_count] =
15780 minimum_select_bitmap[roop_count];
15781 DBUG_PRINT("info",("spider roop_count=%d", roop_count));
15782 DBUG_PRINT("info",("spider bitmap=%d",
15783 bitmap[roop_count]));
15784 }
15785 DBUG_VOID_RETURN;
15786 }
15787
init_union_table_name_pos()15788 int spider_mbase_handler::init_union_table_name_pos()
15789 {
15790 DBUG_ENTER("spider_mbase_handler::init_union_table_name_pos");
15791 DBUG_PRINT("info",("spider this=%p", this));
15792 if (!union_table_name_pos_first)
15793 {
15794 if (!spider_bulk_malloc(spider_current_trx, 236, MYF(MY_WME),
15795 &union_table_name_pos_first, sizeof(SPIDER_INT_HLD),
15796 NullS)
15797 ) {
15798 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
15799 }
15800 union_table_name_pos_first->next = NULL;
15801 }
15802 union_table_name_pos_current = union_table_name_pos_first;
15803 union_table_name_pos_current->tgt_num = 0;
15804 DBUG_RETURN(0);
15805 }
15806
set_union_table_name_pos()15807 int spider_mbase_handler::set_union_table_name_pos()
15808 {
15809 DBUG_ENTER("spider_mbase_handler::set_union_table_name_pos");
15810 DBUG_PRINT("info",("spider this=%p", this));
15811 if (union_table_name_pos_current->tgt_num >= SPIDER_INT_HLD_TGT_SIZE)
15812 {
15813 if (!union_table_name_pos_current->next)
15814 {
15815 if (!spider_bulk_malloc(spider_current_trx, 237, MYF(MY_WME),
15816 &union_table_name_pos_current->next, sizeof(SPIDER_INT_HLD),
15817 NullS)
15818 ) {
15819 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
15820 }
15821 union_table_name_pos_current->next->next = NULL;
15822 }
15823 union_table_name_pos_current = union_table_name_pos_current->next;
15824 union_table_name_pos_current->tgt_num = 0;
15825 }
15826 union_table_name_pos_current->tgt[union_table_name_pos_current->tgt_num] =
15827 table_name_pos;
15828 ++union_table_name_pos_current->tgt_num;
15829 DBUG_RETURN(0);
15830 }
15831
reset_union_table_name(spider_string * str,int link_idx,ulong sql_type)15832 int spider_mbase_handler::reset_union_table_name(
15833 spider_string *str,
15834 int link_idx,
15835 ulong sql_type
15836 ) {
15837 DBUG_ENTER("spider_mbase_handler::reset_union_table_name");
15838 DBUG_PRINT("info",("spider this=%p", this));
15839 if (!union_table_name_pos_current)
15840 DBUG_RETURN(0);
15841
15842 SPIDER_INT_HLD *tmp_pos = union_table_name_pos_first;
15843 uint cur_num, pos_backup = str->length();
15844 while(TRUE)
15845 {
15846 for (cur_num = 0; cur_num < tmp_pos->tgt_num; ++cur_num)
15847 {
15848 str->length(tmp_pos->tgt[cur_num]);
15849 append_table_name_with_adjusting(str, link_idx, sql_type);
15850 }
15851 if (tmp_pos == union_table_name_pos_current)
15852 break;
15853 tmp_pos = tmp_pos->next;
15854 }
15855 str->length(pos_backup);
15856 DBUG_RETURN(0);
15857 }
15858
15859 #ifdef SPIDER_HAS_GROUP_BY_HANDLER
append_from_and_tables_part(spider_fields * fields,ulong sql_type)15860 int spider_mbase_handler::append_from_and_tables_part(
15861 spider_fields *fields,
15862 ulong sql_type
15863 ) {
15864 int error_num;
15865 spider_string *str;
15866 SPIDER_TABLE_HOLDER *table_holder;
15867 TABLE_LIST *table_list;
15868 DBUG_ENTER("spider_mbase_handler::append_from_and_tables_part");
15869 DBUG_PRINT("info",("spider this=%p", this));
15870 switch (sql_type)
15871 {
15872 case SPIDER_SQL_TYPE_SELECT_SQL:
15873 str = &sql;
15874 break;
15875 default:
15876 DBUG_RETURN(0);
15877 }
15878 fields->set_pos_to_first_table_holder();
15879 table_holder = fields->get_next_table_holder();
15880 table_list = table_holder->table->pos_in_table_list;
15881 error_num = spider_db_mbase_utility->append_from_and_tables(
15882 table_holder->spider, fields, str,
15883 table_list, fields->get_table_count());
15884 DBUG_RETURN(error_num);
15885 }
15886
reappend_tables_part(spider_fields * fields,ulong sql_type)15887 int spider_mbase_handler::reappend_tables_part(
15888 spider_fields *fields,
15889 ulong sql_type
15890 ) {
15891 int error_num;
15892 spider_string *str;
15893 DBUG_ENTER("spider_mbase_handler::reappend_tables_part");
15894 DBUG_PRINT("info",("spider this=%p", this));
15895 switch (sql_type)
15896 {
15897 case SPIDER_SQL_TYPE_SELECT_SQL:
15898 str = &sql;
15899 break;
15900 default:
15901 DBUG_RETURN(0);
15902 }
15903 error_num = spider_db_mbase_utility->reappend_tables(fields,
15904 link_idx_chain, str);
15905 DBUG_RETURN(error_num);
15906 }
15907
append_where_part(ulong sql_type)15908 int spider_mbase_handler::append_where_part(
15909 ulong sql_type
15910 ) {
15911 int error_num;
15912 spider_string *str;
15913 DBUG_ENTER("spider_mbase_handler::append_where_part");
15914 DBUG_PRINT("info",("spider this=%p", this));
15915 switch (sql_type)
15916 {
15917 case SPIDER_SQL_TYPE_SELECT_SQL:
15918 str = &sql;
15919 break;
15920 default:
15921 DBUG_RETURN(0);
15922 }
15923 error_num = spider_db_mbase_utility->append_where(str);
15924 DBUG_RETURN(error_num);
15925 }
15926
append_having_part(ulong sql_type)15927 int spider_mbase_handler::append_having_part(
15928 ulong sql_type
15929 ) {
15930 int error_num;
15931 spider_string *str;
15932 DBUG_ENTER("spider_mbase_handler::append_having_part");
15933 DBUG_PRINT("info",("spider this=%p", this));
15934 switch (sql_type)
15935 {
15936 case SPIDER_SQL_TYPE_SELECT_SQL:
15937 str = &sql;
15938 break;
15939 default:
15940 DBUG_RETURN(0);
15941 }
15942 error_num = spider_db_mbase_utility->append_having(str);
15943 DBUG_RETURN(error_num);
15944 }
15945
append_item_type_part(Item * item,const char * alias,uint alias_length,bool use_fields,spider_fields * fields,ulong sql_type)15946 int spider_mbase_handler::append_item_type_part(
15947 Item *item,
15948 const char *alias,
15949 uint alias_length,
15950 bool use_fields,
15951 spider_fields *fields,
15952 ulong sql_type
15953 ) {
15954 int error_num;
15955 spider_string *str;
15956 DBUG_ENTER("spider_mbase_handler::append_item_type_part");
15957 DBUG_PRINT("info",("spider this=%p", this));
15958 switch (sql_type)
15959 {
15960 case SPIDER_SQL_TYPE_SELECT_SQL:
15961 str = &sql;
15962 break;
15963 default:
15964 DBUG_RETURN(0);
15965 }
15966 error_num = spider_db_print_item_type(item, NULL, spider, str,
15967 alias, alias_length, dbton_id, use_fields, fields);
15968 DBUG_RETURN(error_num);
15969 }
15970
append_list_item_select_part(List<Item> * select,const char * alias,uint alias_length,bool use_fields,spider_fields * fields,ulong sql_type)15971 int spider_mbase_handler::append_list_item_select_part(
15972 List<Item> *select,
15973 const char *alias,
15974 uint alias_length,
15975 bool use_fields,
15976 spider_fields *fields,
15977 ulong sql_type
15978 ) {
15979 int error_num;
15980 spider_string *str;
15981 DBUG_ENTER("spider_mbase_handler::append_list_item_select_part");
15982 DBUG_PRINT("info",("spider this=%p", this));
15983 switch (sql_type)
15984 {
15985 case SPIDER_SQL_TYPE_SELECT_SQL:
15986 str = &sql;
15987 break;
15988 default:
15989 DBUG_RETURN(0);
15990 }
15991 error_num = append_list_item_select(select, str, alias, alias_length,
15992 use_fields, fields);
15993 DBUG_RETURN(error_num);
15994 }
15995
append_list_item_select(List<Item> * select,spider_string * str,const char * alias,uint alias_length,bool use_fields,spider_fields * fields)15996 int spider_mbase_handler::append_list_item_select(
15997 List<Item> *select,
15998 spider_string *str,
15999 const char *alias,
16000 uint alias_length,
16001 bool use_fields,
16002 spider_fields *fields
16003 ) {
16004 int error_num;
16005 uint32 length, begin;
16006 List_iterator_fast<Item> it(*select);
16007 Item *item;
16008 Field *field;
16009 const char *item_name;
16010 DBUG_ENTER("spider_mbase_handler::append_list_item_select");
16011 DBUG_PRINT("info",("spider this=%p", this));
16012 begin = str->length();
16013 while ((item = it++))
16014 {
16015 if (item->const_item())
16016 {
16017 DBUG_PRINT("info",("spider const item"));
16018 continue;
16019 }
16020 if ((error_num = spider_db_print_item_type(item, NULL, spider, str,
16021 alias, alias_length, dbton_id, use_fields, fields)))
16022 {
16023 DBUG_RETURN(error_num);
16024 }
16025 field = *(fields->get_next_field_ptr());
16026 if (field)
16027 {
16028 item_name = SPIDER_field_name_str(field);
16029 length = SPIDER_field_name_length(field);
16030 } else {
16031 item_name = SPIDER_item_name_str(item);
16032 length = SPIDER_item_name_length(item);
16033 }
16034 if (str->reserve(
16035 SPIDER_SQL_COMMA_LEN + /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 +
16036 SPIDER_SQL_SPACE_LEN + length
16037 ))
16038 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16039 str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
16040 if ((error_num = spider_db_mbase_utility->append_escaped_name(str,
16041 item_name, length)))
16042 {
16043 DBUG_RETURN(error_num);
16044 }
16045 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
16046 }
16047 if (begin == str->length())
16048 {
16049 /* no columns */
16050 if (str->reserve(SPIDER_SQL_ONE_LEN))
16051 {
16052 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16053 }
16054 str->q_append(SPIDER_SQL_ONE_STR, SPIDER_SQL_ONE_LEN);
16055 } else {
16056 str->length(str->length() - SPIDER_SQL_COMMA_LEN);
16057 }
16058 DBUG_RETURN(0);
16059 }
16060
append_group_by_part(ORDER * order,const char * alias,uint alias_length,bool use_fields,spider_fields * fields,ulong sql_type)16061 int spider_mbase_handler::append_group_by_part(
16062 ORDER *order,
16063 const char *alias,
16064 uint alias_length,
16065 bool use_fields,
16066 spider_fields *fields,
16067 ulong sql_type
16068 ) {
16069 int error_num;
16070 spider_string *str;
16071 DBUG_ENTER("spider_mbase_handler::append_group_by_part");
16072 DBUG_PRINT("info",("spider this=%p", this));
16073 switch (sql_type)
16074 {
16075 case SPIDER_SQL_TYPE_SELECT_SQL:
16076 str = &sql;
16077 break;
16078 default:
16079 DBUG_RETURN(0);
16080 }
16081 error_num = append_group_by(order, str, alias, alias_length,
16082 use_fields, fields);
16083 DBUG_RETURN(error_num);
16084 }
16085
append_group_by(ORDER * order,spider_string * str,const char * alias,uint alias_length,bool use_fields,spider_fields * fields)16086 int spider_mbase_handler::append_group_by(
16087 ORDER *order,
16088 spider_string *str,
16089 const char *alias,
16090 uint alias_length,
16091 bool use_fields,
16092 spider_fields *fields
16093 ) {
16094 int error_num;
16095 DBUG_ENTER("spider_mbase_handler::append_group_by");
16096 DBUG_PRINT("info",("spider this=%p", this));
16097 if (order)
16098 {
16099 if (str->reserve(SPIDER_SQL_GROUP_LEN))
16100 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16101 str->q_append(SPIDER_SQL_GROUP_STR, SPIDER_SQL_GROUP_LEN);
16102 for (; order; order = order->next)
16103 {
16104 if ((error_num = spider_db_print_item_type((*order->item), NULL, spider,
16105 str, alias, alias_length, dbton_id, use_fields, fields)))
16106 {
16107 DBUG_RETURN(error_num);
16108 }
16109 if (str->reserve(SPIDER_SQL_COMMA_LEN))
16110 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16111 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
16112 }
16113 str->length(str->length() - SPIDER_SQL_COMMA_LEN);
16114 }
16115 DBUG_RETURN(0);
16116 }
16117
append_order_by_part(ORDER * order,const char * alias,uint alias_length,bool use_fields,spider_fields * fields,ulong sql_type)16118 int spider_mbase_handler::append_order_by_part(
16119 ORDER *order,
16120 const char *alias,
16121 uint alias_length,
16122 bool use_fields,
16123 spider_fields *fields,
16124 ulong sql_type
16125 ) {
16126 int error_num;
16127 spider_string *str;
16128 DBUG_ENTER("spider_mbase_handler::append_order_by_part");
16129 DBUG_PRINT("info",("spider this=%p", this));
16130 switch (sql_type)
16131 {
16132 case SPIDER_SQL_TYPE_SELECT_SQL:
16133 str = &sql;
16134 break;
16135 default:
16136 DBUG_RETURN(0);
16137 }
16138 error_num = append_order_by(order, str, alias, alias_length,
16139 use_fields, fields);
16140 DBUG_RETURN(error_num);
16141 }
16142
append_order_by(ORDER * order,spider_string * str,const char * alias,uint alias_length,bool use_fields,spider_fields * fields)16143 int spider_mbase_handler::append_order_by(
16144 ORDER *order,
16145 spider_string *str,
16146 const char *alias,
16147 uint alias_length,
16148 bool use_fields,
16149 spider_fields *fields
16150 ) {
16151 int error_num;
16152 DBUG_ENTER("spider_mbase_handler::append_order_by");
16153 DBUG_PRINT("info",("spider this=%p", this));
16154 if (order)
16155 {
16156 if (str->reserve(SPIDER_SQL_ORDER_LEN))
16157 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16158 str->q_append(SPIDER_SQL_ORDER_STR, SPIDER_SQL_ORDER_LEN);
16159 for (; order; order = order->next)
16160 {
16161 if ((error_num = spider_db_print_item_type((*order->item), NULL, spider,
16162 str, alias, alias_length, dbton_id, use_fields, fields)))
16163 {
16164 DBUG_RETURN(error_num);
16165 }
16166 if (SPIDER_order_direction_is_asc(order))
16167 {
16168 if (str->reserve(SPIDER_SQL_COMMA_LEN))
16169 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16170 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
16171 } else {
16172 if (str->reserve(SPIDER_SQL_COMMA_LEN + SPIDER_SQL_DESC_LEN))
16173 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16174 str->q_append(SPIDER_SQL_DESC_STR, SPIDER_SQL_DESC_LEN);
16175 str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
16176 }
16177 }
16178 str->length(str->length() - SPIDER_SQL_COMMA_LEN);
16179 }
16180 DBUG_RETURN(0);
16181 }
16182 #endif
16183
spider_mbase_copy_table(spider_mbase_share * db_share)16184 spider_mbase_copy_table::spider_mbase_copy_table(
16185 spider_mbase_share *db_share
16186 ) : spider_db_copy_table(
16187 db_share
16188 ),
16189 mysql_share(db_share)
16190 {
16191 DBUG_ENTER("spider_mbase_copy_table::spider_mbase_copy_table");
16192 DBUG_PRINT("info",("spider this=%p", this));
16193 DBUG_VOID_RETURN;
16194 }
16195
spider_mysql_copy_table(spider_mbase_share * db_share)16196 spider_mysql_copy_table::spider_mysql_copy_table(
16197 spider_mbase_share *db_share
16198 ) : spider_mbase_copy_table(
16199 db_share
16200 ) {
16201 DBUG_ENTER("spider_mysql_copy_table::spider_mysql_copy_table");
16202 DBUG_PRINT("info",("spider this=%p", this));
16203 DBUG_VOID_RETURN;
16204 }
16205
spider_mariadb_copy_table(spider_mbase_share * db_share)16206 spider_mariadb_copy_table::spider_mariadb_copy_table(
16207 spider_mbase_share *db_share
16208 ) : spider_mbase_copy_table(
16209 db_share
16210 ) {
16211 DBUG_ENTER("spider_mariadb_copy_table::spider_mariadb_copy_table");
16212 DBUG_PRINT("info",("spider this=%p", this));
16213 DBUG_VOID_RETURN;
16214 }
16215
~spider_mbase_copy_table()16216 spider_mbase_copy_table::~spider_mbase_copy_table()
16217 {
16218 DBUG_ENTER("spider_mbase_copy_table::~spider_mbase_copy_table");
16219 DBUG_PRINT("info",("spider this=%p", this));
16220 DBUG_VOID_RETURN;
16221 }
16222
~spider_mysql_copy_table()16223 spider_mysql_copy_table::~spider_mysql_copy_table()
16224 {
16225 DBUG_ENTER("spider_mysql_copy_table::~spider_mysql_copy_table");
16226 DBUG_PRINT("info",("spider this=%p", this));
16227 DBUG_VOID_RETURN;
16228 }
16229
~spider_mariadb_copy_table()16230 spider_mariadb_copy_table::~spider_mariadb_copy_table()
16231 {
16232 DBUG_ENTER("spider_mariadb_copy_table::~spider_mariadb_copy_table");
16233 DBUG_PRINT("info",("spider this=%p", this));
16234 DBUG_VOID_RETURN;
16235 }
16236
init()16237 int spider_mbase_copy_table::init()
16238 {
16239 DBUG_ENTER("spider_mbase_copy_table::init");
16240 DBUG_PRINT("info",("spider this=%p", this));
16241 sql.init_calc_mem(78);
16242 DBUG_RETURN(0);
16243 }
16244
set_sql_charset(CHARSET_INFO * cs)16245 void spider_mbase_copy_table::set_sql_charset(
16246 CHARSET_INFO *cs
16247 ) {
16248 DBUG_ENTER("spider_mbase_copy_table::set_sql_charset");
16249 DBUG_PRINT("info",("spider this=%p", this));
16250 sql.set_charset(cs);
16251 DBUG_VOID_RETURN;
16252 }
16253
append_select_str()16254 int spider_mbase_copy_table::append_select_str()
16255 {
16256 DBUG_ENTER("spider_mbase_copy_table::append_select_str");
16257 DBUG_PRINT("info",("spider this=%p", this));
16258 if (sql.reserve(SPIDER_SQL_SELECT_LEN))
16259 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16260 sql.q_append(SPIDER_SQL_SELECT_STR, SPIDER_SQL_SELECT_LEN);
16261 DBUG_RETURN(0);
16262 }
16263
append_insert_str(int insert_flg)16264 int spider_mbase_copy_table::append_insert_str(
16265 int insert_flg
16266 ) {
16267 DBUG_ENTER("spider_mbase_copy_table::append_insert_str");
16268 DBUG_PRINT("info",("spider this=%p", this));
16269 if (insert_flg & SPIDER_DB_INSERT_REPLACE)
16270 {
16271 if (sql.reserve(SPIDER_SQL_REPLACE_LEN))
16272 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16273 sql.q_append(SPIDER_SQL_REPLACE_STR, SPIDER_SQL_REPLACE_LEN);
16274 } else {
16275 if (sql.reserve(SPIDER_SQL_INSERT_LEN))
16276 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16277 sql.q_append(SPIDER_SQL_INSERT_STR, SPIDER_SQL_INSERT_LEN);
16278 }
16279 if (insert_flg & SPIDER_DB_INSERT_LOW_PRIORITY)
16280 {
16281 if (sql.reserve(SPIDER_SQL_LOW_PRIORITY_LEN))
16282 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16283 sql.q_append(SPIDER_SQL_LOW_PRIORITY_STR, SPIDER_SQL_LOW_PRIORITY_LEN);
16284 }
16285 else if (insert_flg & SPIDER_DB_INSERT_DELAYED)
16286 {
16287 if (sql.reserve(SPIDER_SQL_SQL_DELAYED_LEN))
16288 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16289 sql.q_append(SPIDER_SQL_SQL_DELAYED_STR, SPIDER_SQL_SQL_DELAYED_LEN);
16290 }
16291 else if (insert_flg & SPIDER_DB_INSERT_HIGH_PRIORITY)
16292 {
16293 if (sql.reserve(SPIDER_SQL_HIGH_PRIORITY_LEN))
16294 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16295 sql.q_append(SPIDER_SQL_HIGH_PRIORITY_STR, SPIDER_SQL_HIGH_PRIORITY_LEN);
16296 }
16297 if (insert_flg & SPIDER_DB_INSERT_IGNORE)
16298 {
16299 if (sql.reserve(SPIDER_SQL_SQL_IGNORE_LEN))
16300 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16301 sql.q_append(SPIDER_SQL_SQL_IGNORE_STR, SPIDER_SQL_SQL_IGNORE_LEN);
16302 }
16303 DBUG_RETURN(0);
16304 }
16305
append_table_columns(TABLE_SHARE * table_share)16306 int spider_mbase_copy_table::append_table_columns(
16307 TABLE_SHARE *table_share
16308 ) {
16309 int error_num;
16310 Field **field;
16311 DBUG_ENTER("spider_mbase_copy_table::append_table_columns");
16312 DBUG_PRINT("info",("spider this=%p", this));
16313 for (field = table_share->field; *field; field++)
16314 {
16315 if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN))
16316 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16317 sql.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
16318 if ((error_num = spider_db_append_name_with_quote_str(&sql,
16319 (*field)->field_name, dbton_id)))
16320 DBUG_RETURN(error_num);
16321 if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN + SPIDER_SQL_COMMA_LEN))
16322 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16323 sql.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
16324 sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
16325 }
16326 sql.length(sql.length() - SPIDER_SQL_COMMA_LEN);
16327 DBUG_RETURN(0);
16328 }
16329
append_from_str()16330 int spider_mbase_copy_table::append_from_str()
16331 {
16332 DBUG_ENTER("spider_mbase_copy_table::append_from_str");
16333 DBUG_PRINT("info",("spider this=%p", this));
16334 if (sql.reserve(SPIDER_SQL_FROM_LEN))
16335 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16336 sql.q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN);
16337 DBUG_RETURN(0);
16338 }
16339
append_table_name(int link_idx)16340 int spider_mbase_copy_table::append_table_name(
16341 int link_idx
16342 ) {
16343 int error_num;
16344 DBUG_ENTER("spider_mbase_copy_table::append_table_name");
16345 DBUG_PRINT("info",("spider this=%p", this));
16346 error_num = mysql_share->append_table_name(&sql, link_idx);
16347 DBUG_RETURN(error_num);
16348 }
16349
set_sql_pos()16350 void spider_mbase_copy_table::set_sql_pos()
16351 {
16352 DBUG_ENTER("spider_mbase_copy_table::set_sql_pos");
16353 DBUG_PRINT("info",("spider this=%p", this));
16354 pos = sql.length();
16355 DBUG_VOID_RETURN;
16356 }
16357
set_sql_to_pos()16358 void spider_mbase_copy_table::set_sql_to_pos()
16359 {
16360 DBUG_ENTER("spider_mbase_copy_table::set_sql_to_pos");
16361 DBUG_PRINT("info",("spider this=%p", this));
16362 sql.length(pos);
16363 DBUG_VOID_RETURN;
16364 }
16365
append_copy_where(spider_db_copy_table * source_ct,KEY * key_info,ulong * last_row_pos,ulong * last_lengths)16366 int spider_mbase_copy_table::append_copy_where(
16367 spider_db_copy_table *source_ct,
16368 KEY *key_info,
16369 ulong *last_row_pos,
16370 ulong *last_lengths
16371 ) {
16372 int error_num, roop_count, roop_count2;
16373 DBUG_ENTER("spider_mbase_copy_table::append_copy_where");
16374 DBUG_PRINT("info",("spider this=%p", this));
16375 if (sql.reserve(SPIDER_SQL_WHERE_LEN + SPIDER_SQL_OPEN_PAREN_LEN))
16376 {
16377 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16378 }
16379 sql.q_append(SPIDER_SQL_WHERE_STR, SPIDER_SQL_WHERE_LEN);
16380 sql.q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
16381 Field *field;
16382 KEY_PART_INFO *key_part = key_info->key_part;
16383 for (roop_count = spider_user_defined_key_parts(key_info) - 1;
16384 roop_count >= 0; roop_count--)
16385 {
16386 for (roop_count2 = 0; roop_count2 < roop_count; roop_count2++)
16387 {
16388 field = key_part[roop_count2].field;
16389 if ((error_num = copy_key_row(source_ct,
16390 field, &last_row_pos[field->field_index],
16391 &last_lengths[field->field_index],
16392 SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN)))
16393 {
16394 DBUG_RETURN(error_num);
16395 }
16396 }
16397 field = key_part[roop_count2].field;
16398 if ((error_num = copy_key_row(source_ct,
16399 field, &last_row_pos[field->field_index],
16400 &last_lengths[field->field_index],
16401 SPIDER_SQL_GT_STR, SPIDER_SQL_GT_LEN)))
16402 {
16403 DBUG_RETURN(error_num);
16404 }
16405 sql.length(sql.length() - SPIDER_SQL_AND_LEN);
16406 if (sql.reserve(SPIDER_SQL_CLOSE_PAREN_LEN +
16407 SPIDER_SQL_OR_LEN + SPIDER_SQL_OPEN_PAREN_LEN))
16408 {
16409 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16410 }
16411 sql.q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
16412 sql.q_append(SPIDER_SQL_OR_STR, SPIDER_SQL_OR_LEN);
16413 sql.q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
16414 }
16415 sql.length(sql.length() - SPIDER_SQL_OR_LEN - SPIDER_SQL_OPEN_PAREN_LEN);
16416 DBUG_RETURN(0);
16417 }
16418
append_key_order_str(KEY * key_info,int start_pos,bool desc_flg)16419 int spider_mbase_copy_table::append_key_order_str(
16420 KEY *key_info,
16421 int start_pos,
16422 bool desc_flg
16423 ) {
16424 int length, error_num;
16425 KEY_PART_INFO *key_part;
16426 Field *field;
16427 DBUG_ENTER("spider_mbase_copy_table::append_key_order_str");
16428 DBUG_PRINT("info",("spider this=%p", this));
16429 if ((int) spider_user_defined_key_parts(key_info) > start_pos)
16430 {
16431 if (sql.reserve(SPIDER_SQL_ORDER_LEN))
16432 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16433 sql.q_append(SPIDER_SQL_ORDER_STR, SPIDER_SQL_ORDER_LEN);
16434 if (desc_flg == TRUE)
16435 {
16436 for (
16437 key_part = key_info->key_part + start_pos,
16438 length = 0;
16439 length + start_pos < (int) spider_user_defined_key_parts(key_info);
16440 key_part++,
16441 length++
16442 ) {
16443 field = key_part->field;
16444 if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN))
16445 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16446 sql.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
16447 if ((error_num = spider_db_append_name_with_quote_str(&sql,
16448 field->field_name, dbton_id)))
16449 DBUG_RETURN(error_num);
16450 if (key_part->key_part_flag & HA_REVERSE_SORT)
16451 {
16452 if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN + SPIDER_SQL_COMMA_LEN))
16453 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16454 sql.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
16455 sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
16456 } else {
16457 if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN + SPIDER_SQL_DESC_LEN +
16458 SPIDER_SQL_COMMA_LEN))
16459 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16460 sql.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
16461 sql.q_append(SPIDER_SQL_DESC_STR, SPIDER_SQL_DESC_LEN);
16462 sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
16463 }
16464 }
16465 } else {
16466 for (
16467 key_part = key_info->key_part + start_pos,
16468 length = 0;
16469 length + start_pos < (int) spider_user_defined_key_parts(key_info);
16470 key_part++,
16471 length++
16472 ) {
16473 field = key_part->field;
16474 if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN))
16475 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16476 sql.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
16477 if ((error_num = spider_db_append_name_with_quote_str(&sql,
16478 field->field_name, dbton_id)))
16479 DBUG_RETURN(error_num);
16480 if (key_part->key_part_flag & HA_REVERSE_SORT)
16481 {
16482 if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN + SPIDER_SQL_DESC_LEN +
16483 SPIDER_SQL_COMMA_LEN))
16484 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16485 sql.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
16486 sql.q_append(SPIDER_SQL_DESC_STR, SPIDER_SQL_DESC_LEN);
16487 sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
16488 } else {
16489 if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN + SPIDER_SQL_COMMA_LEN))
16490 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16491 sql.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
16492 sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
16493 }
16494 }
16495 }
16496 sql.length(sql.length() - SPIDER_SQL_COMMA_LEN);
16497 }
16498 DBUG_RETURN(0);
16499 }
16500
append_limit(longlong offset,longlong limit)16501 int spider_mbase_copy_table::append_limit(
16502 longlong offset,
16503 longlong limit
16504 ) {
16505 char buf[SPIDER_LONGLONG_LEN + 1];
16506 uint32 length;
16507 DBUG_ENTER("spider_mbase_copy_table::append_limit");
16508 DBUG_PRINT("info",("spider this=%p", this));
16509 if (offset || limit < 9223372036854775807LL)
16510 {
16511 if (sql.reserve(SPIDER_SQL_LIMIT_LEN + SPIDER_SQL_COMMA_LEN +
16512 ((SPIDER_LONGLONG_LEN) * 2)))
16513 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16514 sql.q_append(SPIDER_SQL_LIMIT_STR, SPIDER_SQL_LIMIT_LEN);
16515 if (offset)
16516 {
16517 length = (uint32) (my_charset_bin.cset->longlong10_to_str)(
16518 &my_charset_bin, buf, SPIDER_LONGLONG_LEN + 1, -10, offset);
16519 sql.q_append(buf, length);
16520 sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
16521 }
16522 length = (uint32) (my_charset_bin.cset->longlong10_to_str)(
16523 &my_charset_bin, buf, SPIDER_LONGLONG_LEN + 1, -10, limit);
16524 sql.q_append(buf, length);
16525 }
16526 DBUG_RETURN(0);
16527 }
16528
append_into_str()16529 int spider_mbase_copy_table::append_into_str()
16530 {
16531 DBUG_ENTER("spider_mbase_copy_table::append_into_str");
16532 DBUG_PRINT("info",("spider this=%p", this));
16533 if (sql.reserve(SPIDER_SQL_INTO_LEN))
16534 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16535 sql.q_append(SPIDER_SQL_INTO_STR, SPIDER_SQL_INTO_LEN);
16536 DBUG_RETURN(0);
16537 }
16538
append_open_paren_str()16539 int spider_mbase_copy_table::append_open_paren_str()
16540 {
16541 DBUG_ENTER("spider_mbase_copy_table::append_open_paren_str");
16542 DBUG_PRINT("info",("spider this=%p", this));
16543 if (sql.reserve(SPIDER_SQL_OPEN_PAREN_LEN))
16544 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16545 sql.q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
16546 DBUG_RETURN(0);
16547 }
16548
append_values_str()16549 int spider_mbase_copy_table::append_values_str()
16550 {
16551 DBUG_ENTER("spider_mbase_copy_table::append_values_str");
16552 DBUG_PRINT("info",("spider this=%p", this));
16553 if (sql.reserve(SPIDER_SQL_CLOSE_PAREN_LEN + SPIDER_SQL_VALUES_LEN +
16554 SPIDER_SQL_OPEN_PAREN_LEN))
16555 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16556 sql.q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
16557 sql.q_append(SPIDER_SQL_VALUES_STR, SPIDER_SQL_VALUES_LEN);
16558 sql.q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
16559 DBUG_RETURN(0);
16560 }
16561
append_select_lock_str(int lock_mode)16562 int spider_mbase_copy_table::append_select_lock_str(
16563 int lock_mode
16564 ) {
16565 DBUG_ENTER("spider_mbase_copy_table::append_select_lock_str");
16566 DBUG_PRINT("info",("spider this=%p", this));
16567 if (lock_mode == SPIDER_LOCK_MODE_EXCLUSIVE)
16568 {
16569 if (sql.reserve(SPIDER_SQL_FOR_UPDATE_LEN))
16570 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16571 sql.q_append(SPIDER_SQL_FOR_UPDATE_STR, SPIDER_SQL_FOR_UPDATE_LEN);
16572 } else if (lock_mode == SPIDER_LOCK_MODE_SHARED)
16573 {
16574 if (sql.reserve(SPIDER_SQL_SHARED_LOCK_LEN))
16575 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16576 sql.q_append(SPIDER_SQL_SHARED_LOCK_STR, SPIDER_SQL_SHARED_LOCK_LEN);
16577 }
16578 DBUG_RETURN(0);
16579 }
16580
exec_query(SPIDER_CONN * conn,int quick_mode,int * need_mon)16581 int spider_mbase_copy_table::exec_query(
16582 SPIDER_CONN *conn,
16583 int quick_mode,
16584 int *need_mon
16585 ) {
16586 int error_num;
16587 DBUG_ENTER("spider_mbase_copy_table::exec_query");
16588 DBUG_PRINT("info",("spider this=%p", this));
16589 error_num = spider_db_query(conn, sql.ptr(), sql.length(), quick_mode,
16590 need_mon);
16591 DBUG_RETURN(error_num);
16592 }
16593
copy_key_row(spider_db_copy_table * source_ct,Field * field,ulong * row_pos,ulong * length,const char * joint_str,const int joint_length)16594 int spider_mbase_copy_table::copy_key_row(
16595 spider_db_copy_table *source_ct,
16596 Field *field,
16597 ulong *row_pos,
16598 ulong *length,
16599 const char *joint_str,
16600 const int joint_length
16601 ) {
16602 int error_num;
16603 spider_string *source_str = &((spider_mbase_copy_table *) source_ct)->sql;
16604 DBUG_ENTER("spider_mbase_copy_table::copy_key_row");
16605 DBUG_PRINT("info",("spider this=%p", this));
16606 if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN))
16607 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16608 sql.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
16609 if ((error_num = spider_db_append_name_with_quote_str(&sql,
16610 field->field_name, dbton_id)))
16611 DBUG_RETURN(error_num);
16612 if (sql.reserve(SPIDER_SQL_NAME_QUOTE_LEN + joint_length + *length +
16613 SPIDER_SQL_AND_LEN))
16614 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16615 sql.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
16616 sql.q_append(joint_str, joint_length);
16617 sql.q_append(source_str->ptr() + *row_pos, *length);
16618 sql.q_append(SPIDER_SQL_AND_STR, SPIDER_SQL_AND_LEN);
16619 DBUG_RETURN(0);
16620 }
16621
copy_row(Field * field,SPIDER_DB_ROW * row)16622 int spider_mbase_copy_table::copy_row(
16623 Field *field,
16624 SPIDER_DB_ROW *row
16625 ) {
16626 int error_num;
16627 DBUG_ENTER("spider_mbase_copy_table::copy_row");
16628 DBUG_PRINT("info",("spider this=%p", this));
16629 if (row->is_null())
16630 {
16631 if (sql.reserve(SPIDER_SQL_NULL_LEN + SPIDER_SQL_COMMA_LEN))
16632 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16633 sql.q_append(SPIDER_SQL_NULL_STR, SPIDER_SQL_NULL_LEN);
16634 } else if (field->str_needs_quotes())
16635 {
16636 if (sql.reserve(SPIDER_SQL_VALUE_QUOTE_LEN))
16637 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16638 sql.q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
16639 if ((error_num = row->append_escaped_to_str(&sql,
16640 dbton_id)))
16641 DBUG_RETURN(error_num);
16642 if (sql.reserve(SPIDER_SQL_VALUE_QUOTE_LEN + SPIDER_SQL_COMMA_LEN))
16643 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16644 sql.q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN);
16645 } else {
16646 if ((error_num = row->append_to_str(&sql)))
16647 DBUG_RETURN(error_num);
16648 if (sql.reserve(SPIDER_SQL_COMMA_LEN))
16649 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16650 }
16651 sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
16652 DBUG_RETURN(0);
16653 }
16654
copy_rows(TABLE * table,SPIDER_DB_ROW * row,ulong ** last_row_pos,ulong ** last_lengths)16655 int spider_mbase_copy_table::copy_rows(
16656 TABLE *table,
16657 SPIDER_DB_ROW *row,
16658 ulong **last_row_pos,
16659 ulong **last_lengths
16660 ) {
16661 int error_num;
16662 Field **field;
16663 ulong *lengths2, *row_pos2;
16664 DBUG_ENTER("spider_mbase_copy_table::copy_rows");
16665 DBUG_PRINT("info",("spider this=%p", this));
16666 row_pos2 = *last_row_pos;
16667 lengths2 = *last_lengths;
16668
16669 for (
16670 field = table->field;
16671 *field;
16672 field++,
16673 lengths2++
16674 ) {
16675 *row_pos2 = sql.length();
16676 if ((error_num =
16677 copy_row(*field, row)))
16678 DBUG_RETURN(error_num);
16679 *lengths2 = sql.length() - *row_pos2 - SPIDER_SQL_COMMA_LEN;
16680 row->next();
16681 row_pos2++;
16682 }
16683 sql.length(sql.length() - SPIDER_SQL_COMMA_LEN);
16684 if (sql.reserve(SPIDER_SQL_CLOSE_PAREN_LEN +
16685 SPIDER_SQL_COMMA_LEN + SPIDER_SQL_OPEN_PAREN_LEN))
16686 {
16687 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16688 }
16689 sql.q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
16690 sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
16691 sql.q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
16692 DBUG_RETURN(0);
16693 }
16694
copy_rows(TABLE * table,SPIDER_DB_ROW * row)16695 int spider_mbase_copy_table::copy_rows(
16696 TABLE *table,
16697 SPIDER_DB_ROW *row
16698 ) {
16699 int error_num;
16700 Field **field;
16701 DBUG_ENTER("spider_mbase_copy_table::copy_rows");
16702 DBUG_PRINT("info",("spider this=%p", this));
16703 for (
16704 field = table->field;
16705 *field;
16706 field++
16707 ) {
16708 if ((error_num =
16709 copy_row(*field, row)))
16710 DBUG_RETURN(error_num);
16711 row->next();
16712 }
16713 sql.length(sql.length() - SPIDER_SQL_COMMA_LEN);
16714 if (sql.reserve(SPIDER_SQL_CLOSE_PAREN_LEN +
16715 SPIDER_SQL_COMMA_LEN + SPIDER_SQL_OPEN_PAREN_LEN))
16716 {
16717 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16718 }
16719 sql.q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
16720 sql.q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
16721 sql.q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
16722 DBUG_RETURN(0);
16723 }
16724
append_insert_terminator()16725 int spider_mbase_copy_table::append_insert_terminator()
16726 {
16727 DBUG_ENTER("spider_mbase_copy_table::append_insert_terminator");
16728 DBUG_PRINT("info",("spider this=%p", this));
16729 sql.length(sql.length() - SPIDER_SQL_COMMA_LEN - SPIDER_SQL_OPEN_PAREN_LEN);
16730 DBUG_RETURN(0);
16731 }
16732
copy_insert_values(spider_db_copy_table * source_ct)16733 int spider_mbase_copy_table::copy_insert_values(
16734 spider_db_copy_table *source_ct
16735 ) {
16736 spider_mbase_copy_table *tmp_ct = (spider_mbase_copy_table *) source_ct;
16737 spider_string *source_str = &tmp_ct->sql;
16738 int values_length = source_str->length() - tmp_ct->pos;
16739 const char *values_ptr = source_str->ptr() + tmp_ct->pos;
16740 DBUG_ENTER("spider_mbase_copy_table::copy_insert_values");
16741 DBUG_PRINT("info",("spider this=%p", this));
16742 if (sql.reserve(values_length))
16743 {
16744 DBUG_RETURN(HA_ERR_OUT_OF_MEM);
16745 }
16746 sql.q_append(values_ptr, values_length);
16747 DBUG_RETURN(0);
16748 }
16749