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