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 class spider_db_mbase_util: public spider_db_util
17 {
18 public:
19   spider_db_mbase_util();
20   virtual ~spider_db_mbase_util();
21   int append_name(
22     spider_string *str,
23     const char *name,
24     uint name_length
25   );
26   int append_name_with_charset(
27     spider_string *str,
28     const char *name,
29     uint name_length,
30     CHARSET_INFO *name_charset
31   );
32   int append_escaped_name(
33     spider_string *str,
34     const char *name,
35     uint name_length
36   );
37   int append_escaped_name_with_charset(
38     spider_string *str,
39     const char *name,
40     uint name_length,
41     CHARSET_INFO *name_charset
42   );
43   bool is_name_quote(
44     const char head_code
45   );
46   int append_escaped_name_quote(
47     spider_string *str
48   );
49   int append_column_value(
50     ha_spider *spider,
51     spider_string *str,
52     Field *field,
53     const uchar *new_ptr,
54     CHARSET_INFO *access_charset
55   );
56   int append_from_with_alias(
57     spider_string *str,
58     const char **table_names,
59     uint *table_name_lengths,
60     const char **table_aliases,
61     uint *table_alias_lengths,
62     uint table_count,
63     int *table_name_pos,
64     bool over_write
65   );
66   int append_trx_isolation(
67     spider_string *str,
68     int trx_isolation
69   );
70   int append_autocommit(
71     spider_string *str,
72     bool autocommit
73   );
74   int append_sql_log_off(
75     spider_string *str,
76     bool sql_log_off
77   );
78   int append_wait_timeout(
79     spider_string *str,
80     int wait_timeout
81   );
82   virtual int append_sql_mode_internal(
83     spider_string *str,
84     sql_mode_t sql_mode
85   );
86   int append_sql_mode(
87     spider_string *str,
88     sql_mode_t sql_mode
89   );
90   int append_time_zone(
91     spider_string *str,
92     Time_zone *time_zone
93   );
94   int append_loop_check(
95     spider_string *str,
96     SPIDER_CONN *conn
97   );
98   int append_start_transaction(
99     spider_string *str
100   );
101   int append_xa_start(
102     spider_string *str,
103     XID *xid
104   );
105   int append_lock_table_head(
106     spider_string *str
107   );
108   int append_lock_table_body(
109     spider_string *str,
110     const char *db_name,
111     uint db_name_length,
112     CHARSET_INFO *db_name_charset,
113     const char *table_name,
114     uint table_name_length,
115     CHARSET_INFO *table_name_charset,
116     int lock_type
117   );
118   int append_lock_table_tail(
119     spider_string *str
120   );
121   int append_unlock_table(
122     spider_string *str
123   );
124   int open_item_func(
125     Item_func *item_func,
126     ha_spider *spider,
127     spider_string *str,
128     const char *alias,
129     uint alias_length,
130     bool use_fields,
131     spider_fields *fields
132   );
133 #ifdef HANDLER_HAS_DIRECT_AGGREGATE
134   int open_item_sum_func(
135     Item_sum *item_sum,
136     ha_spider *spider,
137     spider_string *str,
138     const char *alias,
139     uint alias_length,
140     bool use_fields,
141     spider_fields *fields
142   );
143 #endif
144   int append_escaped_util(
145     spider_string *to,
146     String *from
147   );
148 #ifdef SPIDER_HAS_GROUP_BY_HANDLER
149   int append_table(
150     ha_spider *spider,
151     spider_fields *fields,
152     spider_string *str,
153     TABLE_LIST *table_list,
154     TABLE_LIST **used_table_list,
155     uint *current_pos,
156     TABLE_LIST **cond_table_list_ptr,
157     bool top_down,
158     bool first
159   );
160   int append_tables_top_down(
161     ha_spider *spider,
162     spider_fields *fields,
163     spider_string *str,
164     TABLE_LIST *table_list,
165     TABLE_LIST **used_table_list,
166     uint *current_pos,
167     TABLE_LIST **cond_table_list_ptr
168   );
169   int append_tables_top_down_check(
170     TABLE_LIST *table_list,
171     TABLE_LIST **used_table_list,
172     uint *current_pos
173   );
174   int append_embedding_tables(
175     ha_spider *spider,
176     spider_fields *fields,
177     spider_string *str,
178     TABLE_LIST *table_list,
179     TABLE_LIST **used_table_list,
180     uint *current_pos,
181     TABLE_LIST **cond_table_list_ptr
182   );
183   int append_from_and_tables(
184     ha_spider *spider,
185     spider_fields *fields,
186     spider_string *str,
187     TABLE_LIST *table_list,
188     uint table_count
189   );
190   int reappend_tables(
191     spider_fields *fields,
192     SPIDER_LINK_IDX_CHAIN *link_idx_chain,
193     spider_string *str
194   );
195   int append_where(
196     spider_string *str
197   );
198   int append_having(
199     spider_string *str
200   );
201 #endif
202   bool append_charset_name_before_string();
203 };
204 
205 class spider_db_mysql_util: public spider_db_mbase_util
206 {
207 public:
208   spider_db_mysql_util();
209   ~spider_db_mysql_util();
210   int append_column_value(
211     ha_spider *spider,
212     spider_string *str,
213     Field *field,
214     const uchar *new_ptr,
215     CHARSET_INFO *access_charset
216   );
217 };
218 
219 class spider_db_mariadb_util: public spider_db_mbase_util
220 {
221 public:
222   spider_db_mariadb_util();
223   ~spider_db_mariadb_util();
224   int append_sql_mode_internal(
225     spider_string *str,
226     sql_mode_t sql_mode
227   );
228   int append_column_value(
229     ha_spider *spider,
230     spider_string *str,
231     Field *field,
232     const uchar *new_ptr,
233     CHARSET_INFO *access_charset
234   );
235 };
236 
237 class spider_db_mbase_row: public spider_db_row
238 {
239 public:
240   MYSQL_ROW           row;
241   MYSQL_ROW           row_first;
242   ulong               *lengths;
243   ulong               *lengths_first;
244   uint                field_count;
245   uint                record_size;
246   bool                cloned;
247   spider_db_mbase_row(
248     uint dbton_id
249   );
250   virtual ~spider_db_mbase_row();
251   int store_to_field(
252     Field *field,
253     CHARSET_INFO *access_charset
254   );
255   int append_to_str(
256     spider_string *str
257   );
258   int append_escaped_to_str(
259     spider_string *str,
260     uint dbton_id
261   );
262   void first();
263   void next();
264   bool is_null();
265   int val_int();
266   double val_real();
267   my_decimal *val_decimal(
268     my_decimal *decimal_value,
269     CHARSET_INFO *access_charset
270   );
271   SPIDER_DB_ROW *clone();
272   int store_to_tmp_table(
273     TABLE *tmp_table,
274     spider_string *str
275   );
276   uint get_byte_size();
277 };
278 
279 class spider_db_mysql_row: public spider_db_mbase_row
280 {
281 public:
282   spider_db_mysql_row();
283   ~spider_db_mysql_row();
284 };
285 
286 class spider_db_mariadb_row: public spider_db_mbase_row
287 {
288 public:
289   spider_db_mariadb_row();
290   ~spider_db_mariadb_row();
291 };
292 
293 class spider_db_mbase_result: public spider_db_result
294 {
295 public:
296   MYSQL_RES           *db_result;
297   spider_db_mbase_row row;
298   MYSQL_ROW_OFFSET    first_row;
299   int                 store_error_num;
300   spider_db_mbase_result(
301     SPIDER_DB_CONN *in_db_conn
302   );
303   virtual ~spider_db_mbase_result();
304   bool has_result();
305   void free_result();
306   SPIDER_DB_ROW *current_row();
307   SPIDER_DB_ROW *fetch_row();
308   SPIDER_DB_ROW *fetch_row_from_result_buffer(
309     spider_db_result_buffer *spider_res_buf
310   );
311   SPIDER_DB_ROW *fetch_row_from_tmp_table(
312     TABLE *tmp_table
313   );
314   int fetch_table_status(
315     int mode,
316     ha_statistics &stat
317   );
318   int fetch_simple_action(
319     uint simple_action,
320     uint position,
321     void *param
322   );
323   int fetch_table_records(
324     int mode,
325     ha_rows &records
326   );
327 #ifdef HA_HAS_CHECKSUM_EXTENDED
328   int fetch_table_checksum(
329     ha_spider *spider
330   );
331 #endif
332   int fetch_table_cardinality(
333     int mode,
334     TABLE *table,
335     longlong *cardinality,
336     uchar *cardinality_upd,
337     int bitmap_size
338   );
339   int fetch_table_mon_status(
340     int &status
341   );
342   int fetch_show_master_status(
343     const char **binlog_file_name,
344     const char **binlog_pos
345   );
346   int fetch_select_binlog_gtid_pos(
347     const char **gtid_pos
348   );
349   longlong num_rows();
350   uint num_fields();
351   void move_to_pos(
352     longlong pos
353   );
354   int get_errno();
355 #ifdef SPIDER_HAS_DISCOVER_TABLE_STRUCTURE
356   int fetch_columns_for_discover_table_structure(
357     spider_string *str,
358     CHARSET_INFO *access_charset
359   );
360   int fetch_index_for_discover_table_structure(
361     spider_string *str,
362     CHARSET_INFO *access_charset
363   );
364   int fetch_table_for_discover_table_structure(
365     spider_string *str,
366     SPIDER_SHARE *spider_share,
367     CHARSET_INFO *access_charset
368   );
369 #endif
370 };
371 
372 class spider_db_mysql_result: public spider_db_mbase_result
373 {
374 public:
375   spider_db_mysql_result(
376     SPIDER_DB_CONN *in_db_conn
377   );
378   ~spider_db_mysql_result();
379 };
380 
381 class spider_db_mariadb_result: public spider_db_mbase_result
382 {
383 public:
384   spider_db_mariadb_result(
385     SPIDER_DB_CONN *in_db_conn
386   );
387   ~spider_db_mariadb_result();
388 };
389 
390 class spider_db_mbase: public spider_db_conn
391 {
392 protected:
393   int                  stored_error;
394   spider_db_mbase_util *spider_db_mbase_utility;
395 public:
396   MYSQL          *db_conn;
397   HASH           lock_table_hash;
398   bool           lock_table_hash_inited;
399   uint           lock_table_hash_id;
400   const char     *lock_table_hash_func_name;
401   const char     *lock_table_hash_file_name;
402   ulong          lock_table_hash_line_no;
403   DYNAMIC_ARRAY  handler_open_array;
404   bool           handler_open_array_inited;
405   uint           handler_open_array_id;
406   const char     *handler_open_array_func_name;
407   const char     *handler_open_array_file_name;
408   ulong          handler_open_array_line_no;
409   spider_db_mbase(
410     SPIDER_CONN *conn,
411     spider_db_mbase_util *spider_db_mbase_utility
412   );
413   virtual ~spider_db_mbase();
414   int init();
415   bool is_connected();
416   void bg_connect();
417   int connect(
418     char *tgt_host,
419     char *tgt_username,
420     char *tgt_password,
421     long tgt_port,
422     char *tgt_socket,
423     char *server_name,
424     int connect_retry_count,
425     longlong connect_retry_interval
426   );
427   int ping();
428   void bg_disconnect();
429   void disconnect();
430   int set_net_timeout();
431   int exec_query(
432     const char *query,
433     uint length,
434     int quick_mode
435   );
436   int get_errno();
437   const char *get_error();
438   bool is_server_gone_error(
439     int error_num
440   );
441   bool is_dup_entry_error(
442     int error_num
443   );
444   bool is_xa_nota_error(
445     int error_num
446   );
447   int print_warnings(
448     struct tm *l_time
449   );
450   spider_db_result *store_result(
451     spider_db_result_buffer **spider_res_buf,
452     st_spider_db_request_key *request_key,
453     int *error_num
454   );
455   spider_db_result *use_result(
456     ha_spider *spider,
457     st_spider_db_request_key *request_key,
458     int *error_num
459   );
460   int next_result();
461   uint affected_rows();
462   uint matched_rows();
463   bool inserted_info(
464     spider_db_handler *handler,
465     ha_copy_info *copy_info
466   );
467   ulonglong last_insert_id();
468   int set_character_set(
469     const char *csname
470   );
471   int select_db(
472     const char *dbname
473   );
474   int consistent_snapshot(
475     int *need_mon
476   );
477   bool trx_start_in_bulk_sql();
478   int start_transaction(
479     int *need_mon
480   );
481   int commit(
482     int *need_mon
483   );
484   int rollback(
485     int *need_mon
486   );
487   bool xa_start_in_bulk_sql();
488   int xa_start(
489     XID *xid,
490     int *need_mon
491   );
492   int xa_end(
493     XID *xid,
494     int *need_mon
495   );
496   int xa_prepare(
497     XID *xid,
498     int *need_mon
499   );
500   int xa_commit(
501     XID *xid,
502     int *need_mon
503   );
504   int xa_rollback(
505     XID *xid,
506     int *need_mon
507   );
508   bool set_trx_isolation_in_bulk_sql();
509   int set_trx_isolation(
510     int trx_isolation,
511     int *need_mon
512   );
513   bool set_autocommit_in_bulk_sql();
514   int set_autocommit(
515     bool autocommit,
516     int *need_mon
517   );
518   bool set_sql_log_off_in_bulk_sql();
519   int set_sql_log_off(
520     bool sql_log_off,
521     int *need_mon
522   );
523   bool set_wait_timeout_in_bulk_sql();
524   int set_wait_timeout(
525     int wait_timeout,
526     int *need_mon
527   );
528   bool set_sql_mode_in_bulk_sql();
529   int set_sql_mode(
530     sql_mode_t sql_mode,
531     int *need_mon
532   );
533   bool set_time_zone_in_bulk_sql();
534   int set_time_zone(
535     Time_zone *time_zone,
536     int *need_mon
537   );
538   bool set_loop_check_in_bulk_sql();
539   int set_loop_check(
540     int *need_mon
541   );
542   int fin_loop_check();
543   int exec_simple_sql_with_result(
544     SPIDER_TRX *trx,
545     SPIDER_SHARE *share,
546     const char *sql,
547     uint sql_length,
548     int all_link_idx,
549     int *need_mon,
550     SPIDER_DB_RESULT **res
551   );
552   int show_master_status(
553     SPIDER_TRX *trx,
554     SPIDER_SHARE *share,
555     int all_link_idx,
556     int *need_mon,
557     TABLE *table,
558     spider_string *str,
559     int mode,
560     SPIDER_DB_RESULT **res1,
561     SPIDER_DB_RESULT **res2
562   );
563   int select_binlog_gtid_pos(
564     SPIDER_TRX *trx,
565     SPIDER_SHARE *share,
566     int all_link_idx,
567     int *need_mon,
568     TABLE *table,
569     spider_string *str,
570     const char *binlog_file_name,
571     uint binlog_file_name_length,
572     const char *binlog_pos,
573     uint binlog_pos_length,
574     SPIDER_DB_RESULT **res
575   );
576 #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
577   int append_sql(
578     char *sql,
579     ulong sql_length,
580     st_spider_db_request_key *request_key
581   );
582   int append_open_handler(
583     uint handler_id,
584     const char *db_name,
585     const char *table_name,
586     const char *index_name,
587     const char *sql,
588     st_spider_db_request_key *request_key
589   );
590   int append_select(
591     uint handler_id,
592     spider_string *sql,
593     SPIDER_DB_HS_STRING_REF_BUFFER *keys,
594     int limit,
595     int skip,
596     st_spider_db_request_key *request_key
597   );
598   int append_insert(
599     uint handler_id,
600     SPIDER_DB_HS_STRING_REF_BUFFER *upds,
601     st_spider_db_request_key *request_key
602   );
603   int append_update(
604     uint handler_id,
605     spider_string *sql,
606     SPIDER_DB_HS_STRING_REF_BUFFER *keys,
607     SPIDER_DB_HS_STRING_REF_BUFFER *upds,
608     int limit,
609     int skip,
610     bool increment,
611     bool decrement,
612     st_spider_db_request_key *request_key
613   );
614   int append_delete(
615     uint handler_id,
616     spider_string *sql,
617     SPIDER_DB_HS_STRING_REF_BUFFER *keys,
618     int limit,
619     int skip,
620     st_spider_db_request_key *request_key
621   );
622   void reset_request_queue();
623 #endif
624   size_t escape_string(
625     char *to,
626     const char *from,
627     size_t from_length
628   );
629   bool have_lock_table_list();
630   int append_lock_tables(
631     spider_string *str
632   );
633   int append_unlock_tables(
634     spider_string *str
635   );
636   uint get_lock_table_hash_count();
637   void reset_lock_table_hash();
638   uint get_opened_handler_count();
639   void reset_opened_handler();
640   void set_dup_key_idx(
641     ha_spider *spider,
642     int link_idx
643   );
644   bool cmp_request_key_to_snd(
645     st_spider_db_request_key *request_key
646   );
647 };
648 
649 class spider_db_mysql: public spider_db_mbase
650 {
651 public:
652   spider_db_mysql(
653     SPIDER_CONN *conn
654   );
655   ~spider_db_mysql();
656 };
657 
658 class spider_db_mariadb: public spider_db_mbase
659 {
660 public:
661   spider_db_mariadb(
662     SPIDER_CONN *conn
663   );
664   ~spider_db_mariadb();
665 };
666 
667 class spider_mbase_share: public spider_db_share
668 {
669 protected:
670   spider_db_mbase_util *spider_db_mbase_utility;
671 public:
672   spider_string      *table_select;
673   int                table_select_pos;
674   spider_string      *key_select;
675   int                *key_select_pos;
676   spider_string      *key_hint;
677   spider_string      *show_table_status;
678   spider_string      *show_records;
679   spider_string      *show_index;
680   spider_string      *table_names_str;
681   spider_string      *db_names_str;
682   spider_string      *db_table_str;
683 #ifdef SPIDER_HAS_HASH_VALUE_TYPE
684   my_hash_value_type *db_table_str_hash_value;
685 #endif
686   uint               table_nm_max_length;
687   uint               db_nm_max_length;
688   spider_string      *column_name_str;
689   bool               same_db_table_name;
690   int                first_all_link_idx;
691 
692   spider_mbase_share(
693     st_spider_share *share,
694     uint dbton_id,
695     spider_db_mbase_util *spider_db_mbase_utility
696   );
697   virtual ~spider_mbase_share();
698   int init();
699   uint get_column_name_length(
700     uint field_index
701   );
702   int append_column_name(
703     spider_string *str,
704     uint field_index
705   );
706   int append_column_name_with_alias(
707     spider_string *str,
708     uint field_index,
709     const char *alias,
710     uint alias_length
711   );
712   int append_table_name(
713     spider_string *str,
714     int all_link_idx
715   );
716   int append_table_name_with_adjusting(
717     spider_string *str,
718     int all_link_idx
719   );
720   int append_from_with_adjusted_table_name(
721     spider_string *str,
722     int *table_name_pos
723   );
724   bool need_change_db_table_name();
725 #ifdef SPIDER_HAS_DISCOVER_TABLE_STRUCTURE
726   int discover_table_structure(
727     SPIDER_TRX *trx,
728     SPIDER_SHARE *spider_share,
729     spider_string *str
730   );
731 #endif
732 #ifdef HA_HAS_CHECKSUM_EXTENDED
733   bool checksum_support();
734 #endif
735 protected:
736   int create_table_names_str();
737   void free_table_names_str();
738   int create_column_name_str();
739   void free_column_name_str();
740   int convert_key_hint_str();
741   int append_show_table_status();
742   void free_show_table_status();
743   int append_show_records();
744   void free_show_records();
745   int append_show_index();
746   void free_show_index();
747   int append_table_select();
748   int append_key_select(
749     uint idx
750   );
751 };
752 
753 class spider_mysql_share: public spider_mbase_share
754 {
755 public:
756   spider_mysql_share(
757     st_spider_share *share
758   );
759   ~spider_mysql_share();
760 };
761 
762 class spider_mariadb_share: public spider_mbase_share
763 {
764 public:
765   spider_mariadb_share(
766     st_spider_share *share
767   );
768   ~spider_mariadb_share();
769 };
770 
771 class spider_mbase_handler: public spider_db_handler
772 {
773 protected:
774   spider_db_mbase_util    *spider_db_mbase_utility;
775   spider_string           sql;
776   spider_string           sql_part;
777   spider_string           sql_part2;
778   spider_string           ha_sql;
779   int                     where_pos;
780   int                     order_pos;
781   int                     limit_pos;
782 public:
783   int                     table_name_pos;
784 protected:
785   int                     ha_read_pos;
786   int                     ha_next_pos;
787   int                     ha_where_pos;
788   int                     ha_limit_pos;
789   int                     ha_table_name_pos;
790   uint                    ha_sql_handler_id;
791   spider_string           insert_sql;
792   int                     insert_pos;
793   int                     insert_table_name_pos;
794   spider_string           update_sql;
795   TABLE                   *upd_tmp_tbl;
796   TMP_TABLE_PARAM         upd_tmp_tbl_prm;
797   spider_string           tmp_sql;
798   int                     tmp_sql_pos1; /* drop db nm pos at tmp_table_join */
799   int                     tmp_sql_pos2; /* create db nm pos at tmp_table_join */
800   int                     tmp_sql_pos3; /* insert db nm pos at tmp_table_join */
801   int                     tmp_sql_pos4; /* insert val pos at tmp_table_join */
802   int                     tmp_sql_pos5; /* end of drop tbl at tmp_table_join */
803   spider_string           dup_update_sql;
804   spider_string           *exec_sql;
805   spider_string           *exec_insert_sql;
806   spider_string           *exec_update_sql;
807   spider_string           *exec_tmp_sql;
808   spider_string           *exec_ha_sql;
809   bool                    reading_from_bulk_tmp_table;
810   bool                    filled_up;
811 #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
812   SPIDER_DB_HS_STRING_REF_BUFFER hs_upds;
813 #endif
814   SPIDER_INT_HLD          *union_table_name_pos_first;
815   SPIDER_INT_HLD          *union_table_name_pos_current;
816 public:
817   spider_mbase_share      *mysql_share;
818   SPIDER_LINK_FOR_HASH    *link_for_hash;
819   uchar                   *minimum_select_bitmap;
820   uchar                   direct_insert_kind;
821   spider_mbase_handler(
822     ha_spider *spider,
823     spider_mbase_share *share,
824     spider_db_mbase_util *spider_db_mbase_utility
825   );
826   virtual ~spider_mbase_handler();
827   int init();
828   int append_index_hint(
829     spider_string *str,
830     int link_idx,
831     ulong sql_type
832     );
833   int append_table_name_with_adjusting(
834     spider_string *str,
835     int link_idx,
836     ulong sql_type
837   );
838   int append_key_column_types(
839     const key_range *start_key,
840     spider_string *str
841   );
842   int append_key_join_columns_for_bka(
843     const key_range *start_key,
844     spider_string *str,
845     const char **table_aliases,
846     uint *table_alias_lengths
847   );
848   int append_tmp_table_and_sql_for_bka(
849     const key_range *start_key
850   );
851   int reuse_tmp_table_and_sql_for_bka();
852   void create_tmp_bka_table_name(
853     char *tmp_table_name,
854     int *tmp_table_name_length,
855     int link_idx
856   );
857   int append_create_tmp_bka_table(
858     const key_range *start_key,
859     spider_string *str,
860     char *tmp_table_name,
861     int tmp_table_name_length,
862     int *db_name_pos,
863     CHARSET_INFO *table_charset
864   );
865   int append_drop_tmp_bka_table(
866     spider_string *str,
867     char *tmp_table_name,
868     int tmp_table_name_length,
869     int *db_name_pos,
870     int *drop_table_end_pos,
871     bool with_semicolon
872   );
873   int append_insert_tmp_bka_table(
874     const key_range *start_key,
875     spider_string *str,
876     char *tmp_table_name,
877     int tmp_table_name_length,
878     int *db_name_pos
879   );
880   int append_union_table_and_sql_for_bka(
881     const key_range *start_key
882   );
883   int reuse_union_table_and_sql_for_bka();
884   int append_insert_for_recovery(
885     ulong sql_type,
886     int link_idx
887   );
888   int append_update(
889     const TABLE *table,
890     my_ptrdiff_t ptr_diff
891   );
892   int append_update(
893     const TABLE *table,
894     my_ptrdiff_t ptr_diff,
895     int link_idx
896   );
897   int append_delete(
898     const TABLE *table,
899     my_ptrdiff_t ptr_diff
900   );
901   int append_delete(
902     const TABLE *table,
903     my_ptrdiff_t ptr_diff,
904     int link_idx
905   );
906   int append_insert_part();
907   int append_insert(
908     spider_string *str,
909     int link_idx
910   );
911   int append_update_part();
912   int append_update(
913     spider_string *str,
914     int link_idx
915   );
916   int append_delete_part();
917   int append_delete(
918     spider_string *str
919   );
920   #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
921   #ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
922   int append_increment_update_set_part();
923   int append_increment_update_set(
924     spider_string *str
925   );
926   #endif
927   #endif
928   int append_update_set_part();
929   int append_update_set(
930     spider_string *str
931   );
932   #ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
933   int append_direct_update_set_part();
934   int append_direct_update_set(
935     spider_string *str
936   );
937   int append_dup_update_pushdown_part(
938     const char *alias,
939     uint alias_length
940   );
941   int append_update_columns_part(
942     const char *alias,
943     uint alias_length
944   );
945   int check_update_columns_part();
946   int append_update_columns(
947     spider_string *str,
948     const char *alias,
949     uint alias_length
950   );
951   #endif
952   int append_select_part(
953     ulong sql_type
954   );
955   int append_select(
956     spider_string *str,
957     ulong sql_type
958   );
959   int append_table_select_part(
960     ulong sql_type
961   );
962   int append_table_select(
963     spider_string *str
964   );
965   int append_key_select_part(
966     ulong sql_type,
967     uint idx
968   );
969   int append_key_select(
970     spider_string *str,
971     uint idx
972   );
973   int append_minimum_select_part(
974     ulong sql_type
975   );
976   int append_minimum_select(
977     spider_string *str,
978     ulong sql_type
979   );
980   int append_table_select_with_alias(
981     spider_string *str,
982     const char *alias,
983     uint alias_length
984   );
985   int append_key_select_with_alias(
986     spider_string *str,
987     const KEY *key_info,
988     const char *alias,
989     uint alias_length
990   );
991   int append_minimum_select_with_alias(
992     spider_string *str,
993     const char *alias,
994     uint alias_length
995   );
996   int append_select_columns_with_alias(
997     spider_string *str,
998     const char *alias,
999     uint alias_length
1000   );
1001   int append_hint_after_table_part(
1002     ulong sql_type
1003   );
1004   int append_hint_after_table(
1005     spider_string *str
1006   );
1007   void set_where_pos(
1008     ulong sql_type
1009   );
1010   void set_where_to_pos(
1011     ulong sql_type
1012   );
1013   int check_item_type(
1014     Item *item
1015   );
1016   int append_values_connector_part(
1017     ulong sql_type
1018   );
1019   int append_values_connector(
1020     spider_string *str
1021   );
1022   int append_values_terminator_part(
1023     ulong sql_type
1024   );
1025   int append_values_terminator(
1026     spider_string *str
1027   );
1028   int append_union_table_connector_part(
1029     ulong sql_type
1030   );
1031   int append_union_table_connector(
1032     spider_string *str
1033   );
1034   int append_union_table_terminator_part(
1035     ulong sql_type
1036   );
1037   int append_union_table_terminator(
1038     spider_string *str
1039   );
1040   int append_key_column_values_part(
1041     const key_range *start_key,
1042     ulong sql_type
1043   );
1044   int append_key_column_values(
1045     spider_string *str,
1046     const key_range *start_key
1047   );
1048   int append_key_column_values_with_name_part(
1049     const key_range *start_key,
1050     ulong sql_type
1051   );
1052   int append_key_column_values_with_name(
1053     spider_string *str,
1054     const key_range *start_key
1055   );
1056   int append_key_where_part(
1057     const key_range *start_key,
1058     const key_range *end_key,
1059     ulong sql_type
1060   );
1061   int append_key_where(
1062     spider_string *str,
1063     spider_string *str_part,
1064     spider_string *str_part2,
1065     const key_range *start_key,
1066     const key_range *end_key,
1067     ulong sql_type,
1068     bool set_order
1069   );
1070   int append_is_null_part(
1071     ulong sql_type,
1072     KEY_PART_INFO *key_part,
1073     const key_range *key,
1074     const uchar **ptr,
1075     bool key_eq,
1076     bool tgt_final
1077   );
1078   int append_is_null(
1079     ulong sql_type,
1080     spider_string *str,
1081     spider_string *str_part,
1082     spider_string *str_part2,
1083     KEY_PART_INFO *key_part,
1084     const key_range *key,
1085     const uchar **ptr,
1086     bool key_eq,
1087     bool tgt_final
1088   );
1089   int append_where_terminator_part(
1090     ulong sql_type,
1091     bool set_order,
1092     int key_count
1093   );
1094   int append_where_terminator(
1095     ulong sql_type,
1096     spider_string *str,
1097     spider_string *str_part,
1098     spider_string *str_part2,
1099     bool set_order,
1100     int key_count
1101   );
1102   int append_match_where_part(
1103     ulong sql_type
1104   );
1105   int append_match_where(
1106     spider_string *str
1107   );
1108   int append_update_where(
1109     spider_string *str,
1110     const TABLE *table,
1111     my_ptrdiff_t ptr_diff
1112   );
1113   int append_condition_part(
1114     const char *alias,
1115     uint alias_length,
1116     ulong sql_type,
1117     bool test_flg
1118   );
1119   int append_condition(
1120     spider_string *str,
1121     const char *alias,
1122     uint alias_length,
1123     bool start_where,
1124     ulong sql_type
1125   );
1126   int append_match_against_part(
1127     ulong sql_type,
1128     st_spider_ft_info *ft_info,
1129     const char *alias,
1130     uint alias_length
1131   );
1132   int append_match_against(
1133     spider_string *str,
1134     st_spider_ft_info  *ft_info,
1135     const char *alias,
1136     uint alias_length
1137   );
1138   int append_match_select_part(
1139     ulong sql_type,
1140     const char *alias,
1141     uint alias_length
1142   );
1143   int append_match_select(
1144     spider_string *str,
1145     const char *alias,
1146     uint alias_length
1147   );
1148 #ifdef HANDLER_HAS_DIRECT_AGGREGATE
1149   int append_sum_select_part(
1150     ulong sql_type,
1151     const char *alias,
1152     uint alias_length
1153   );
1154   int append_sum_select(
1155     spider_string *str,
1156     const char *alias,
1157     uint alias_length
1158   );
1159 #endif
1160   void set_order_pos(
1161     ulong sql_type
1162   );
1163   void set_order_to_pos(
1164     ulong sql_type
1165   );
1166 #ifdef HANDLER_HAS_DIRECT_AGGREGATE
1167   int append_group_by_part(
1168     const char *alias,
1169     uint alias_length,
1170     ulong sql_type
1171   );
1172   int append_group_by(
1173     spider_string *str,
1174     const char *alias,
1175     uint alias_length
1176   );
1177 #endif
1178   int append_key_order_for_merge_with_alias_part(
1179     const char *alias,
1180     uint alias_length,
1181     ulong sql_type
1182   );
1183   int append_key_order_for_merge_with_alias(
1184     spider_string *str,
1185     const char *alias,
1186     uint alias_length
1187   );
1188   int append_key_order_for_direct_order_limit_with_alias_part(
1189     const char *alias,
1190     uint alias_length,
1191     ulong sql_type
1192   );
1193   int append_key_order_for_direct_order_limit_with_alias(
1194     spider_string *str,
1195     const char *alias,
1196     uint alias_length
1197   );
1198   int append_key_order_with_alias_part(
1199     const char *alias,
1200     uint alias_length,
1201     ulong sql_type
1202   );
1203   int append_key_order_for_handler(
1204     spider_string *str,
1205     const char *alias,
1206     uint alias_length
1207   );
1208   int append_key_order_with_alias(
1209     spider_string *str,
1210     const char *alias,
1211     uint alias_length
1212   );
1213   int append_limit_part(
1214     longlong offset,
1215     longlong limit,
1216     ulong sql_type
1217   );
1218   int reappend_limit_part(
1219     longlong offset,
1220     longlong limit,
1221     ulong sql_type
1222   );
1223   int append_limit(
1224     spider_string *str,
1225     longlong offset,
1226     longlong limit
1227   );
1228   int append_select_lock_part(
1229     ulong sql_type
1230   );
1231   int append_select_lock(
1232     spider_string *str
1233   );
1234   int append_union_all_start_part(
1235     ulong sql_type
1236   );
1237   int append_union_all_start(
1238     spider_string *str
1239   );
1240   int append_union_all_part(
1241     ulong sql_type
1242   );
1243   int append_union_all(
1244     spider_string *str
1245   );
1246   int append_union_all_end_part(
1247     ulong sql_type
1248   );
1249   int append_union_all_end(
1250     spider_string *str
1251   );
1252   int append_multi_range_cnt_part(
1253     ulong sql_type,
1254     uint multi_range_cnt,
1255     bool with_comma
1256   );
1257   int append_multi_range_cnt(
1258     spider_string *str,
1259     uint multi_range_cnt,
1260     bool with_comma
1261   );
1262   int append_multi_range_cnt_with_name_part(
1263     ulong sql_type,
1264     uint multi_range_cnt
1265   );
1266   int append_multi_range_cnt_with_name(
1267     spider_string *str,
1268     uint multi_range_cnt
1269   );
1270   int append_open_handler_part(
1271     ulong sql_type,
1272     uint handler_id,
1273     SPIDER_CONN *conn,
1274     int link_idx
1275   );
1276   int append_open_handler(
1277     spider_string *str,
1278     uint handler_id,
1279     SPIDER_CONN *conn,
1280     int link_idx
1281   );
1282   int append_close_handler_part(
1283     ulong sql_type,
1284     int link_idx
1285   );
1286   int append_close_handler(
1287     spider_string *str,
1288     int link_idx
1289   );
1290   int append_insert_terminator_part(
1291     ulong sql_type
1292   );
1293   int append_insert_terminator(
1294     spider_string *str
1295   );
1296   int append_insert_values_part(
1297     ulong sql_type
1298   );
1299   int append_insert_values(
1300     spider_string *str
1301   );
1302   int append_into_part(
1303     ulong sql_type
1304   );
1305   int append_into(
1306     spider_string *str
1307   );
1308   void set_insert_to_pos(
1309     ulong sql_type
1310   );
1311   int append_from_part(
1312     ulong sql_type,
1313     int link_idx
1314   );
1315   int append_from(
1316     spider_string *str,
1317     ulong sql_type,
1318     int link_idx
1319   );
1320   int append_flush_tables_part(
1321     ulong sql_type,
1322     int link_idx,
1323     bool lock
1324   );
1325   int append_flush_tables(
1326     spider_string *str,
1327     int link_idx,
1328     bool lock
1329   );
1330   int append_optimize_table_part(
1331     ulong sql_type,
1332     int link_idx
1333   );
1334   int append_optimize_table(
1335     spider_string *str,
1336     int link_idx
1337   );
1338   int append_analyze_table_part(
1339     ulong sql_type,
1340     int link_idx
1341   );
1342   int append_analyze_table(
1343     spider_string *str,
1344     int link_idx
1345   );
1346   int append_repair_table_part(
1347     ulong sql_type,
1348     int link_idx,
1349     HA_CHECK_OPT* check_opt
1350   );
1351   int append_repair_table(
1352     spider_string *str,
1353     int link_idx,
1354     HA_CHECK_OPT* check_opt
1355   );
1356   int append_check_table_part(
1357     ulong sql_type,
1358     int link_idx,
1359     HA_CHECK_OPT* check_opt
1360   );
1361   int append_check_table(
1362     spider_string *str,
1363     int link_idx,
1364     HA_CHECK_OPT* check_opt
1365   );
1366   int append_enable_keys_part(
1367     ulong sql_type,
1368     int link_idx
1369   );
1370   int append_enable_keys(
1371     spider_string *str,
1372     int link_idx
1373   );
1374   int append_disable_keys_part(
1375     ulong sql_type,
1376     int link_idx
1377   );
1378   int append_disable_keys(
1379     spider_string *str,
1380     int link_idx
1381   );
1382   int append_delete_all_rows_part(
1383     ulong sql_type
1384   );
1385   int append_delete_all_rows(
1386     spider_string *str,
1387     ulong sql_type
1388   );
1389   int append_truncate(
1390     spider_string *str,
1391     ulong sql_type,
1392     int link_idx
1393   );
1394   int append_explain_select_part(
1395     const key_range *start_key,
1396     const key_range *end_key,
1397     ulong sql_type,
1398     int link_idx
1399   );
1400   int append_explain_select(
1401     spider_string *str,
1402     const key_range *start_key,
1403     const key_range *end_key,
1404     ulong sql_type,
1405     int link_idx
1406   );
1407   bool is_sole_projection_field(
1408     uint16 field_index
1409   );
1410   bool is_bulk_insert_exec_period(
1411     bool bulk_end
1412   );
1413   bool sql_is_filled_up(
1414     ulong sql_type
1415   );
1416   bool sql_is_empty(
1417     ulong sql_type
1418   );
1419   bool support_multi_split_read();
1420   bool support_bulk_update();
1421   int bulk_tmp_table_insert();
1422   int bulk_tmp_table_insert(
1423     int link_idx
1424   );
1425   int bulk_tmp_table_end_bulk_insert();
1426   int bulk_tmp_table_rnd_init();
1427   int bulk_tmp_table_rnd_next();
1428   int bulk_tmp_table_rnd_end();
1429   bool need_copy_for_update(
1430     int link_idx
1431   );
1432   bool bulk_tmp_table_created();
1433   int mk_bulk_tmp_table_and_bulk_start();
1434   void rm_bulk_tmp_table();
1435   int store_sql_to_bulk_tmp_table(
1436     spider_string *str,
1437     TABLE *tmp_table
1438   );
1439   int restore_sql_from_bulk_tmp_table(
1440     spider_string *str,
1441     TABLE *tmp_table
1442   );
1443   int insert_lock_tables_list(
1444     SPIDER_CONN *conn,
1445     int link_idx
1446   );
1447   int append_lock_tables_list(
1448     SPIDER_CONN *conn,
1449     int link_idx,
1450     int *appended
1451   );
1452   int realloc_sql(
1453     ulong *realloced
1454   );
1455   int reset_sql(
1456     ulong sql_type
1457   );
1458 #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
1459   int reset_keys(
1460     ulong sql_type
1461   );
1462   int reset_upds(
1463     ulong sql_type
1464   );
1465   int reset_strs(
1466     ulong sql_type
1467   );
1468   int reset_strs_pos(
1469     ulong sql_type
1470   );
1471   int push_back_upds(
1472     SPIDER_HS_STRING_REF &info
1473   );
1474 #endif
1475   bool need_lock_before_set_sql_for_exec(
1476     ulong sql_type
1477   );
1478 #ifdef SPIDER_HAS_GROUP_BY_HANDLER
1479   int set_sql_for_exec(
1480     ulong sql_type,
1481     int link_idx,
1482     SPIDER_LINK_IDX_CHAIN *link_idx_chain
1483   );
1484 #endif
1485   int set_sql_for_exec(
1486     ulong sql_type,
1487     int link_idx
1488   );
1489   int set_sql_for_exec(
1490     spider_db_copy_table *tgt_ct,
1491     ulong sql_type
1492   );
1493   int execute_sql(
1494     ulong sql_type,
1495     SPIDER_CONN *conn,
1496     int quick_mode,
1497     int *need_mon
1498   );
1499   int reset();
1500   int sts_mode_exchange(
1501     int sts_mode
1502   );
1503   int show_table_status(
1504     int link_idx,
1505     int sts_mode,
1506     uint flag
1507   );
1508   int crd_mode_exchange(
1509     int crd_mode
1510   );
1511   int show_index(
1512     int link_idx,
1513     int crd_mode
1514   );
1515   int simple_action(
1516     uint simple_action,
1517     int link_idx
1518   );
1519   int show_records(
1520     int link_idx
1521   );
1522 #ifdef HA_HAS_CHECKSUM_EXTENDED
1523   int checksum_table(
1524     int link_idx
1525   );
1526 #endif
1527   int show_last_insert_id(
1528     int link_idx,
1529     ulonglong &last_insert_id
1530   );
1531   ha_rows explain_select(
1532     const key_range *start_key,
1533     const key_range *end_key,
1534     int link_idx
1535   );
1536   int lock_tables(
1537     int link_idx
1538   );
1539   int unlock_tables(
1540     int link_idx
1541   );
1542   int disable_keys(
1543     SPIDER_CONN *conn,
1544     int link_idx
1545   );
1546   int enable_keys(
1547     SPIDER_CONN *conn,
1548     int link_idx
1549   );
1550   int check_table(
1551     SPIDER_CONN *conn,
1552     int link_idx,
1553     HA_CHECK_OPT* check_opt
1554   );
1555   int repair_table(
1556     SPIDER_CONN *conn,
1557     int link_idx,
1558     HA_CHECK_OPT* check_opt
1559   );
1560   int analyze_table(
1561     SPIDER_CONN *conn,
1562     int link_idx
1563   );
1564   int optimize_table(
1565     SPIDER_CONN *conn,
1566     int link_idx
1567   );
1568   int flush_tables(
1569     SPIDER_CONN *conn,
1570     int link_idx,
1571     bool lock
1572   );
1573   int flush_logs(
1574     SPIDER_CONN *conn,
1575     int link_idx
1576   );
1577   int insert_opened_handler(
1578     SPIDER_CONN *conn,
1579     int link_idx
1580   );
1581   int delete_opened_handler(
1582     SPIDER_CONN *conn,
1583     int link_idx
1584   );
1585   int sync_from_clone_source(
1586     spider_db_handler *dbton_hdl
1587   );
1588   bool support_use_handler(
1589     int use_handler
1590   );
1591   void minimum_select_bitmap_create();
1592   bool minimum_select_bit_is_set(
1593     uint field_index
1594   );
1595   void copy_minimum_select_bitmap(
1596     uchar *bitmap
1597   );
1598   int init_union_table_name_pos();
1599   int set_union_table_name_pos();
1600   int reset_union_table_name(
1601     spider_string *str,
1602     int link_idx,
1603     ulong sql_type
1604   );
1605 #ifdef SPIDER_HAS_GROUP_BY_HANDLER
1606   int append_from_and_tables_part(
1607     spider_fields *fields,
1608     ulong sql_type
1609   );
1610   int reappend_tables_part(
1611     spider_fields *fields,
1612     ulong sql_type
1613   );
1614   int append_where_part(
1615     ulong sql_type
1616   );
1617   int append_having_part(
1618     ulong sql_type
1619   );
1620   int append_item_type_part(
1621     Item *item,
1622     const char *alias,
1623     uint alias_length,
1624     bool use_fields,
1625     spider_fields *fields,
1626     ulong sql_type
1627   );
1628   int append_list_item_select_part(
1629     List<Item> *select,
1630     const char *alias,
1631     uint alias_length,
1632     bool use_fields,
1633     spider_fields *fields,
1634     ulong sql_type
1635   );
1636   int append_list_item_select(
1637     List<Item> *select,
1638     spider_string *str,
1639     const char *alias,
1640     uint alias_length,
1641     bool use_fields,
1642     spider_fields *fields
1643   );
1644   int append_group_by_part(
1645     ORDER *order,
1646     const char *alias,
1647     uint alias_length,
1648     bool use_fields,
1649     spider_fields *fields,
1650     ulong sql_type
1651   );
1652   int append_group_by(
1653     ORDER *order,
1654     spider_string *str,
1655     const char *alias,
1656     uint alias_length,
1657     bool use_fields,
1658     spider_fields *fields
1659   );
1660   int append_order_by_part(
1661     ORDER *order,
1662     const char *alias,
1663     uint alias_length,
1664     bool use_fields,
1665     spider_fields *fields,
1666     ulong sql_type
1667   );
1668   int append_order_by(
1669     ORDER *order,
1670     spider_string *str,
1671     const char *alias,
1672     uint alias_length,
1673     bool use_fields,
1674     spider_fields *fields
1675   );
1676 #endif
1677 #ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
1678   bool check_direct_update(
1679     st_select_lex *select_lex,
1680     longlong select_limit,
1681     longlong offset_limit
1682   );
1683   bool check_direct_delete(
1684     st_select_lex *select_lex,
1685     longlong select_limit,
1686     longlong offset_limit
1687   );
1688 #endif
1689 };
1690 
1691 class spider_mysql_handler: public spider_mbase_handler
1692 {
1693 public:
1694   spider_mysql_handler(
1695     ha_spider *spider,
1696     spider_mbase_share *share
1697   );
1698   ~spider_mysql_handler();
1699 };
1700 
1701 class spider_mariadb_handler: public spider_mbase_handler
1702 {
1703 public:
1704   spider_mariadb_handler(
1705     ha_spider *spider,
1706     spider_mbase_share *share
1707   );
1708   ~spider_mariadb_handler();
1709 };
1710 
1711 class spider_mbase_copy_table: public spider_db_copy_table
1712 {
1713 public:
1714   spider_mbase_share      *mysql_share;
1715   spider_string           sql;
1716   uint                    pos;
1717   spider_mbase_copy_table(
1718     spider_mbase_share *db_share
1719   );
1720   virtual ~spider_mbase_copy_table();
1721   int init();
1722   void set_sql_charset(
1723     CHARSET_INFO *cs
1724   );
1725   int append_select_str();
1726   int append_insert_str(
1727     int insert_flg
1728   );
1729   int append_table_columns(
1730     TABLE_SHARE *table_share
1731   );
1732   int append_from_str();
1733   int append_table_name(
1734     int link_idx
1735   );
1736   void set_sql_pos();
1737   void set_sql_to_pos();
1738   int append_copy_where(
1739     spider_db_copy_table *source_ct,
1740     KEY *key_info,
1741     ulong *last_row_pos,
1742     ulong *last_lengths
1743   );
1744   int append_key_order_str(
1745     KEY *key_info,
1746     int start_pos,
1747     bool desc_flg
1748   );
1749   int append_limit(
1750     longlong offset,
1751     longlong limit
1752   );
1753   int append_into_str();
1754   int append_open_paren_str();
1755   int append_values_str();
1756   int append_select_lock_str(
1757     int lock_mode
1758   );
1759   int exec_query(
1760     SPIDER_CONN *conn,
1761     int quick_mode,
1762     int *need_mon
1763   );
1764   int copy_key_row(
1765     spider_db_copy_table *source_ct,
1766     Field *field,
1767     ulong *row_pos,
1768     ulong *length,
1769     const char *joint_str,
1770     const int joint_length
1771   );
1772   int copy_row(
1773     Field *field,
1774     SPIDER_DB_ROW *row
1775   );
1776   int copy_rows(
1777     TABLE *table,
1778     SPIDER_DB_ROW *row,
1779     ulong **last_row_pos,
1780     ulong **last_lengths
1781   );
1782   int copy_rows(
1783     TABLE *table,
1784     SPIDER_DB_ROW *row
1785   );
1786   int append_insert_terminator();
1787   int copy_insert_values(
1788     spider_db_copy_table *source_ct
1789   );
1790 };
1791 
1792 class spider_mysql_copy_table: public spider_mbase_copy_table
1793 {
1794 public:
1795   spider_mysql_copy_table(
1796     spider_mbase_share *db_share
1797   );
1798   ~spider_mysql_copy_table();
1799 };
1800 
1801 class spider_mariadb_copy_table: public spider_mbase_copy_table
1802 {
1803 public:
1804   spider_mariadb_copy_table(
1805     spider_mbase_share *db_share
1806   );
1807   ~spider_mariadb_copy_table();
1808 };
1809