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