From 0be86e93113243141e74140c625bdc80fe79fdbd Mon Sep 17 00:00:00 2001 From: "wangxiantong.wxt" Date: Mon, 15 Apr 2024 20:17:00 +0800 Subject: [PATCH] support obcdc 4.3.0.1 --- deps/oblogproxy.el7.aarch64.deps | 1 + deps/oblogproxy.el7.x86_64.deps | 1 + deps/oblogproxy.el8.aarch64.deps | 1 + deps/oblogproxy.el8.x86_64.deps | 1 + deps/oblogproxy.el9.aarch64.deps | 1 + deps/oblogproxy.el9.x86_64.deps | 1 + src/binlog/data_type.cpp | 7 +- src/test/test_data_type.cpp | 61 ++- .../grammar/oceanbase/OBLexer.g4 | 160 ++++++- .../grammar/oceanbase/OBParser.g4 | 404 ++++++++++++++++-- .../src/object/rename_table_column_object.h | 42 ++ .../src/sink/object_builder_mapper.cpp | 3 + .../rename_table_column_object_builder.cpp | 37 ++ .../sink/rename_table_column_object_builder.h | 25 ++ .../src/source/obmysql_object_parser.cpp | 11 +- third-party/etransfer-cpp/test/unit_test.cpp | 62 +++ 16 files changed, 758 insertions(+), 60 deletions(-) create mode 100644 third-party/etransfer-cpp/src/object/rename_table_column_object.h create mode 100644 third-party/etransfer-cpp/src/sink/rename_table_column_object_builder.cpp create mode 100644 third-party/etransfer-cpp/src/sink/rename_table_column_object_builder.h diff --git a/deps/oblogproxy.el7.aarch64.deps b/deps/oblogproxy.el7.aarch64.deps index 00786ec..951b468 100644 --- a/deps/oblogproxy.el7.aarch64.deps +++ b/deps/oblogproxy.el7.aarch64.deps @@ -9,6 +9,7 @@ oceanbase_cdc_repo=https://mirrors.aliyun.com/oceanbase/community/stable/el/7/aa oceanbase-ce-devel-3.1.5-100020022023091114.el7.aarch64.rpm oceanbase-ce-cdc-4.2.1.4-104010022024031310.el7.aarch64.rpm oceanbase-ce-cdc-4.2.2.1-101000022024031310.el7.aarch64.rpm +oceanbase-ce-cdc-4.3.0.1-101000042024032211.el7.aarch64.rpm [tools] obdevtools-gcc9-9.3.0-52022092914.el7.aarch64.rpm diff --git a/deps/oblogproxy.el7.x86_64.deps b/deps/oblogproxy.el7.x86_64.deps index b54ecc4..f95c0d0 100644 --- a/deps/oblogproxy.el7.x86_64.deps +++ b/deps/oblogproxy.el7.x86_64.deps @@ -9,6 +9,7 @@ oceanbase_cdc_repo=https://mirrors.aliyun.com/oceanbase/community/stable/el/7/x8 oceanbase-ce-devel-3.1.5-100020022023091114.el7.x86_64.rpm oceanbase-ce-cdc-4.2.1.4-104010022024031310.el7.x86_64.rpm oceanbase-ce-cdc-4.2.2.1-101000022024031310.el7.x86_64.rpm +oceanbase-ce-cdc-4.3.0.1-101000042024032211.el7.x86_64.rpm [tools] obdevtools-gcc9-9.3.0-52022092914.el7.x86_64.rpm diff --git a/deps/oblogproxy.el8.aarch64.deps b/deps/oblogproxy.el8.aarch64.deps index d0181c8..920bb65 100644 --- a/deps/oblogproxy.el8.aarch64.deps +++ b/deps/oblogproxy.el8.aarch64.deps @@ -9,6 +9,7 @@ oceanbase_cdc_repo=https://mirrors.aliyun.com/oceanbase/community/stable/el/8/aa oceanbase-ce-devel-3.1.5-100020022023091114.el8.aarch64.rpm oceanbase-ce-cdc-4.2.1.4-104010022024031310.el8.aarch64.rpm oceanbase-ce-cdc-4.2.2.1-101000022024031310.el8.aarch64.rpm +oceanbase-ce-cdc-4.3.0.1-101000042024032211.el8.aarch64.rpm [tools] obdevtools-gcc9-9.3.0-52022092914.el8.aarch64.rpm diff --git a/deps/oblogproxy.el8.x86_64.deps b/deps/oblogproxy.el8.x86_64.deps index 02f65b3..2fdf9ed 100644 --- a/deps/oblogproxy.el8.x86_64.deps +++ b/deps/oblogproxy.el8.x86_64.deps @@ -9,6 +9,7 @@ oceanbase_cdc_repo=https://mirrors.aliyun.com/oceanbase/community/stable/el/8/x8 oceanbase-ce-devel-3.1.5-100020022023091114.el8.x86_64.rpm oceanbase-ce-cdc-4.2.1.4-104010022024031310.el8.x86_64.rpm oceanbase-ce-cdc-4.2.2.1-101000022024031310.el8.x86_64.rpm +oceanbase-ce-cdc-4.3.0.1-101000042024032211.el8.x86_64.rpm [tools] obdevtools-gcc9-9.3.0-52022092914.el8.x86_64.rpm diff --git a/deps/oblogproxy.el9.aarch64.deps b/deps/oblogproxy.el9.aarch64.deps index d0181c8..920bb65 100644 --- a/deps/oblogproxy.el9.aarch64.deps +++ b/deps/oblogproxy.el9.aarch64.deps @@ -9,6 +9,7 @@ oceanbase_cdc_repo=https://mirrors.aliyun.com/oceanbase/community/stable/el/8/aa oceanbase-ce-devel-3.1.5-100020022023091114.el8.aarch64.rpm oceanbase-ce-cdc-4.2.1.4-104010022024031310.el8.aarch64.rpm oceanbase-ce-cdc-4.2.2.1-101000022024031310.el8.aarch64.rpm +oceanbase-ce-cdc-4.3.0.1-101000042024032211.el8.aarch64.rpm [tools] obdevtools-gcc9-9.3.0-52022092914.el8.aarch64.rpm diff --git a/deps/oblogproxy.el9.x86_64.deps b/deps/oblogproxy.el9.x86_64.deps index 02f65b3..2fdf9ed 100644 --- a/deps/oblogproxy.el9.x86_64.deps +++ b/deps/oblogproxy.el9.x86_64.deps @@ -9,6 +9,7 @@ oceanbase_cdc_repo=https://mirrors.aliyun.com/oceanbase/community/stable/el/8/x8 oceanbase-ce-devel-3.1.5-100020022023091114.el8.x86_64.rpm oceanbase-ce-cdc-4.2.1.4-104010022024031310.el8.x86_64.rpm oceanbase-ce-cdc-4.2.2.1-101000022024031310.el8.x86_64.rpm +oceanbase-ce-cdc-4.3.0.1-101000042024032211.el8.x86_64.rpm [tools] obdevtools-gcc9-9.3.0-52022092914.el8.x86_64.rpm diff --git a/src/binlog/data_type.cpp b/src/binlog/data_type.cpp index 8eaba40..0e665cf 100644 --- a/src/binlog/data_type.cpp +++ b/src/binlog/data_type.cpp @@ -257,7 +257,7 @@ size_t binary_to_hex(const std::string& binary, char* buff, int len) { size_t i = 0; size_t index = 0; - std::bitset<64> bit_max(atoi(binary.c_str())); + std::bitset<64> bit_max(std::stoull((binary.c_str()))); std::string real = bit_max.to_string().substr(64 - len * 8, len * 8); for (; i < real.size(); i += 8) { std::bitset<8> bit_set{real.substr(i, 8)}; @@ -1007,10 +1007,7 @@ int get_packed_integer(size_t val) size_t int_two_complement(unsigned char* val, size_t len, const char* data) { - auto num = atoll(data); - // if (num < 0) { - // num += pow(2, len); - // } + auto num = std::stoull(data); switch (len) { case 1: int1store(val, num); diff --git a/src/test/test_data_type.cpp b/src/test/test_data_type.cpp index 8666551..e1c79e2 100644 --- a/src/test/test_data_type.cpp +++ b/src/test/test_data_type.cpp @@ -146,26 +146,57 @@ TEST(DataType, short_type) TEST(DataType, long_type) { - IColMeta col_meta; - std::string val = "-2222"; - uint8_t result[4] = {82, 247, 255, 255}; - col_meta.setType(OB_TYPE_LONG); - MsgBuf msg_buf; - get_column_val_bytes(col_meta, val.size(), val.data(), msg_buf, std::string()); - ASSERT_EQ(true, memcmp(result, msg_buf.begin()->buffer(), sizeof(result)) == 0); + { + IColMeta col_meta; + std::string val = "-2222"; + uint8_t result[4] = {82, 247, 255, 255}; + col_meta.setType(OB_TYPE_LONG); + MsgBuf msg_buf; + get_column_val_bytes(col_meta, val.size(), val.data(), msg_buf, std::string()); + ASSERT_EQ(true, memcmp(result, msg_buf.begin()->buffer(), sizeof(result)) == 0); + } + { + IColMeta col_meta; + std::string val = "18446744073709551615"; + uint8_t result[8] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; + col_meta.setType(OB_TYPE_LONGLONG); + MsgBuf msg_buf; + + size_t len = get_column_val_bytes(col_meta, val.size(), val.data(), msg_buf, std::string()); + for (int i = 0; i < len; ++i) { + printf("\\%02hhx", (unsigned char)msg_buf.begin()->buffer()[i]); + } + ASSERT_EQ(true, memcmp(result, msg_buf.begin()->buffer(), sizeof(result)) == 0); + } } TEST(DataType, bit_type) { - IColMeta col_meta; - std::string val = "6"; - col_meta.setType(OB_TYPE_BIT); - col_meta.setPrecision(5); - MsgBuf msg_buf; - get_column_val_bytes(col_meta, val.size(), val.data(), msg_buf, std::string()); + { + IColMeta col_meta; + std::string val = "6"; + col_meta.setType(OB_TYPE_BIT); + col_meta.setPrecision(5); + MsgBuf msg_buf; + get_column_val_bytes(col_meta, val.size(), val.data(), msg_buf, std::string()); - uint8_t result[1] = {6}; - ASSERT_EQ(true, memcmp(result, msg_buf.begin()->buffer(), sizeof(result)) == 0); + uint8_t result[1] = {6}; + ASSERT_EQ(true, memcmp(result, msg_buf.begin()->buffer(), sizeof(result)) == 0); + } + + { + IColMeta col_meta; + std::string val = "8608372198138972245"; + col_meta.setType(OB_TYPE_BIT); + col_meta.setPrecision(64); + MsgBuf msg_buf; + size_t len = get_column_val_bytes(col_meta, val.size(), val.data(), msg_buf, std::string()); + for (int i = 0; i < len; ++i) { + printf("\\%02hhx", (unsigned char)msg_buf.begin()->buffer()[i]); + } + uint8_t result[8] = {0x77, 0x77, 0x14, 0xe7, 0xb4, 0x6c, 0x08, 0x55}; + ASSERT_EQ(true, memcmp(result, msg_buf.begin()->buffer(), sizeof(result)) == 0); + } } TEST(DataType, date_type) diff --git a/third-party/etransfer-cpp/grammar/oceanbase/OBLexer.g4 b/third-party/etransfer-cpp/grammar/oceanbase/OBLexer.g4 index 9687979..68a2a03 100644 --- a/third-party/etransfer-cpp/grammar/oceanbase/OBLexer.g4 +++ b/third-party/etransfer-cpp/grammar/oceanbase/OBLexer.g4 @@ -1,4 +1,7 @@ lexer grammar OBLexer; +@members { +bool inRangeOperator = false; +} ACCESS : ( A C C E S S ) @@ -434,6 +437,10 @@ INSERT : ( I N S E R T ) ; +ORDINALITY + : O R D I N A L I T Y + ; + INTO : ( I N T O ) ; @@ -534,6 +541,10 @@ LONG : ( L O N G ) ; +UNLIMITED + : U N L I M I T E D + ; + LONGBLOB : ( L O N G B L O B ) ; @@ -912,6 +923,10 @@ UNLOCK : ( U N L O C K ) ; +LINE_DELIMITER + : L I N E '_' D E L I M I T E R + ; + UNSIGNED : ( U N S I G N E D ) ; @@ -924,6 +939,10 @@ USAGE : ( U S A G E ) ; +GEOMCOLLECTION + : G E O M C O L L E C T I O N + ; + USE : ( U S E ) ; @@ -1014,30 +1033,38 @@ SESSION_ALIAS | ('@''@' L O C A L ) ; -UnderlineUTF8 +UNDER_LINE_UTF8 : ('_' U T F '8') ; -UnderlineUTF8MB4 +UNDER_LINE_UTF8MB4 : ('_' U T F '8' M B '4') ; -UnderlineGBK +UNDER_LINE_GBK : ('_' G B K ) ; -UnderlineGB18030 +UNDER_LINE_GB18030 : ('_' G B '1''8''0''3''0') ; -UnderlineBINARY +UNDER_LINE_BINARY : ('_' B I N A R Y ) ; -UnderlineUTF16 +UNDER_LINE_UTF16 : ('_' U T F '1''6') ; +UNDER_LINE_LATIN1 + : ('_' L A T I N '1') + ; + +UNDER_LINE_GB18030_2022 + : ('_' G B '1''8''0''3''0''_''2''0''2''2') + ; + STRONG : ( S T R O N G ) ; @@ -1046,6 +1073,10 @@ WEAK : ( W E A K ) ; +CONNECT + : C O N N E C T + ; + FROZEN : ( F R O Z E N ) ; @@ -1094,6 +1125,10 @@ NO_PUSH_LIMIT : N O '_' P U S H '_' L I M I T ; +EMPTY_FIELD_AS_NULL + : E M P T Y '_' F I E L D '_' A S '_' N U L L + ; + UNINSTALL : U N I N S T A L L ; @@ -1482,6 +1517,10 @@ EVERY : E V E R Y ; +SHARDING + : S H A R D I N G + ; + BYTE : B Y T E ; @@ -1496,6 +1535,7 @@ MIN_ROWS ERROR_P : E R R O R + | E R R O R '_' P ; MAX_USER_CONNECTIONS @@ -1574,6 +1614,10 @@ SQL_TSI_MONTH : S Q L '_' T S I '_' M O N T H ; +ARBITRATION + : A R B I T R A T I O N + ; + IGNORE : I G N O R E ; @@ -1634,6 +1678,10 @@ SIMPLIFY_LIMIT : S I M P L I F Y '_' L I M I T ; +FIELD_OPTIONALLY_ENCLOSED_BY + : F I E L D '_' O P T I O N A L L Y '_' E N C L O S E D '_' B Y + ; + DES_KEY_FILE : D E S '_' K E Y '_' F I L E ; @@ -1791,7 +1839,7 @@ CHUNK ; FILEX - : F I L E + : F I L E X ; BACKUPSET @@ -1806,6 +1854,10 @@ UNIT : U N I T ; +NATIONAL_LITERAL + : N A T I O N A L '_' L I T E R A L + ; + PRIVILEGES : P R I V I L E G E S ; @@ -1874,6 +1926,10 @@ DUMP : D U M P ; +EXTERNAL + : E X T E R N A L + ; + APPROX_COUNT_DISTINCT_SYNOPSIS : A P P R O X '_' C O U N T '_' D I S T I N C T '_' S Y N O P S I S ; @@ -1890,6 +1946,10 @@ SLOG : S L O G ; +OJ + : O J + ; + ARCHIVELOG : A R C H I V E L O G ; @@ -1898,6 +1958,10 @@ MAX_CONNECTIONS_PER_HOUR : M A X '_' C O N N E C T I O N S '_' P E R '_' H O U R ; +ENCODING + : E N C O D I N G + ; + SECOND : S E C O N D ; @@ -2310,6 +2374,10 @@ DATA_TABLE_ID : D A T A '_' T A B L E '_' I D ; +SEQUENCES + : S E Q U E N C E S + ; + VALID : V A L I D ; @@ -2410,6 +2478,10 @@ NAMES : N A M E S ; +MY_NAME + : M Y '_' N A M E + ; + CHAR : C H A R ; @@ -2534,6 +2606,10 @@ BACKED : B A C K E D ; +SERVICE + : S E R V I C E + ; + TEMPLATE : T E M P L A T E ; @@ -2586,6 +2662,10 @@ COALESCE_SQ : C O A L E S C E '_' S Q ; +TRIM_SPACE + : T R I M '_' S P A C E + ; + INNER_PARSE : I N N E R '_' P A R S E ; @@ -2670,6 +2750,10 @@ ELIMINATE_JOIN : E L I M I N A T E '_' J O I N ; +PATH + : P A T H + ; + IPC : I P C ; @@ -2838,7 +2922,7 @@ SIMPLE : S I M P L E ; -BEGI +BEGIN : B E G I N ; @@ -2878,6 +2962,10 @@ INFO : I N F O ; +SKIP_HEADER + : S K I P '_' H E A D E R + ; + SQL_THREAD : S Q L '_' T H R E A D ; @@ -2958,6 +3046,10 @@ INDEX_TABLE_ID : I N D E X '_' T A B L E '_' I D ; +PATTERN + : P A T T E R N + ; + RECOVERY_WINDOW : R E C O V E R Y '_' W I N D O W ; @@ -3050,6 +3142,10 @@ SLAVE : S L A V E ; +SKIP_BLANK_LINES + : S K I P '_' B L A N K '_' L I N E S + ; + GTS : G T S ; @@ -3446,6 +3542,10 @@ MAX_MEMORY : M A X '_' M E M O R Y ; +NESTED + : N E S T E D + ; + CLEAN : C L E A N ; @@ -4062,6 +4162,10 @@ GROUP_CONCAT : G R O U P '_' C O N C A T ; +JSON_TABLE + : J S O N '_' T A B L E + ; + LEAD : L E A D ; @@ -4102,6 +4206,10 @@ NTILE : N T I L E ; +NULL_IF_EXETERNAL + : N U L L '_' I F '_' E X E T E R N A L + ; + BUCKETS : B U C K E T S ; @@ -4178,6 +4286,10 @@ REDO_TRANSPORT_OPTIONS : R E D O '_' T R A N S P O R T '_' O P T I O N S ; +FIELD_DELIMITER + : F I E L D '_' D E L I M I T E R + ; + MASTER_HOST : M A S T E R '_' H O S T ; @@ -4222,6 +4334,14 @@ WEEK : W E E K ; +LINK + : L I N K + ; + +STATEMENT_ID + : S T A T E M E N T '_' I D + ; + NULLS : N U L L S ; @@ -4238,6 +4358,10 @@ PLUGIN : P L U G I N ; +ENCRYPTED + : E N C R Y P T E D + ; + TENANT : T E N A N T ; @@ -4370,6 +4494,22 @@ BROADCAST : B R O A D C A S T; HINT_HINT_BEGIN : H I N T '_' H I N T '_' B E G I N; +LOG_RESTORE_SOURCE + : L O G '_' R E S T O R E '_' S O U R C E + ; + +ENABLE_ARBITRATION_SERVICE + : E N A B L E '_' A R B I T R A T I O N '_' S E R V I C E + ; + +LEFT_BRACE + : '{' + ; + +RIGHT_BRACE + : '}' + ; + Comma : [,] ; @@ -4568,6 +4708,10 @@ ANTLR_SKIP : '--'[ \t]* .*? '\n' -> channel(1) ; +COMMENT_SKIP + : '#' .*? '\n' -> channel(1) + ; + Blank : [ \t\r\n] -> channel(1) ; diff --git a/third-party/etransfer-cpp/grammar/oceanbase/OBParser.g4 b/third-party/etransfer-cpp/grammar/oceanbase/OBParser.g4 index 4c17681..3e3b30e 100644 --- a/third-party/etransfer-cpp/grammar/oceanbase/OBParser.g4 +++ b/third-party/etransfer-cpp/grammar/oceanbase/OBParser.g4 @@ -1,7 +1,15 @@ parser grammar OBParser; + options { tokenVocab=OBLexer; } + +@parser::members { +bool is_pl_parse_ = false; +bool is_pl_parse_expr_ = false; +} + + // start rule: sql_stmt sql_stmt @@ -21,6 +29,8 @@ stmt | create_table_stmt | create_function_stmt | drop_function_stmt + | drop_procedure_stmt + | drop_trigger_stmt | create_table_like_stmt | create_database_stmt | drop_database_stmt @@ -62,6 +72,7 @@ stmt | help_stmt | create_view_stmt | create_tenant_stmt + | create_standby_tenant_stmt | alter_tenant_stmt | drop_tenant_stmt | create_restore_point_stmt @@ -86,6 +97,8 @@ stmt | purge_stmt | analyze_stmt | load_data_stmt + | create_dblink_stmt + | drop_dblink_stmt | create_sequence_stmt | alter_sequence_stmt | drop_sequence_stmt @@ -94,18 +107,34 @@ stmt | xa_prepare_stmt | xa_commit_stmt | xa_rollback_stmt + | switchover_cluster_stmt + | disconnect_cluster_stmt + | alter_cluster_stmt | optimize_stmt | dump_memory_stmt + | protection_mode_stmt | get_diagnostics_stmt | pl_expr_stmt | method_opt | switchover_tenant_stmt + | recover_tenant_stmt ; pl_expr_stmt : DO expr ; +recover_tenant_stmt + : ALTER SYSTEM RECOVER STANDBY tenant_name? recover_point_clause? + ; + +recover_point_clause + : UNTIL TIME COMP_EQ STRING_VALUE + | UNTIL SCN COMP_EQ INTNUM + | UNTIL UNLIMITED + | CANCEL + ; + expr_list : expr (Comma expr)* ; @@ -134,15 +163,18 @@ complex_string_literal | charset_introducer HEX_STRING_VALUE | charset_introducer PARSER_SYNTAX_ERROR | STRING_VALUE string_val_list + | NATIONAL_LITERAL ; charset_introducer - : UnderlineUTF8 - | UnderlineUTF8MB4 - | UnderlineBINARY - | UnderlineGBK - | UnderlineGB18030 - | UnderlineUTF16 + : UNDER_LINE_UTF8 + | UNDER_LINE_UTF8MB4 + | UNDER_LINE_BINARY + | UNDER_LINE_GBK + | UNDER_LINE_LATIN1 + | UNDER_LINE_GB18030 + | UNDER_LINE_GB18030_2022 + | UNDER_LINE_UTF16 ; literal @@ -242,8 +274,10 @@ simple_expr | case_expr | func_expr | window_function + | LEFT_BRACE relation_name expr RIGHT_BRACE | USER_VARIABLE | column_definition_ref (JSON_EXTRACT|JSON_EXTRACT_UNQUOTED) complex_string_literal + | relation_name Dot relation_name (Dot relation_name)? USER_VARIABLE ; expr @@ -251,6 +285,7 @@ expr | bool_pri IS not? (BOOL_VALUE|UNKNOWN) | bool_pri | expr (AND|AND_OP|CNNOP|OR|XOR) expr + | LeftParen expr RightParen ; not @@ -592,6 +627,10 @@ ws_level_flag_reverse ; delete_stmt + : with_clause? delete_basic_stmt + ; + +delete_basic_stmt : delete_with_opt_hint FROM tbl_name (WHERE opt_hint_value expr)? order_by? limit_clause? | delete_with_opt_hint multi_delete_table (WHERE opt_hint_value expr)? ; @@ -602,6 +641,10 @@ multi_delete_table ; update_stmt + : with_clause? update_basic_stmt + ; + +update_basic_stmt : update_with_opt_hint IGNORE? table_references SET update_asgn_list (WHERE opt_hint_value expr)? order_by? limit_clause? ; @@ -610,7 +653,7 @@ update_asgn_list ; update_asgn_factor - : no_param_column_ref COMP_EQ expr_or_default + : column_definition_ref COMP_EQ expr_or_default ; create_resource_stmt @@ -637,7 +680,7 @@ resource_unit_option opt_create_resource_pool_option_list : create_resource_pool_option | empty - | opt_create_resource_pool_option_list Comma create_resource_pool_option + | create_resource_pool_option (Comma create_resource_pool_option)* ; create_resource_pool_option @@ -678,6 +721,14 @@ create_tenant_stmt : create_with_opt_hint TENANT (IF not EXISTS)? relation_name (tenant_option | (opt_tenant_option_list Comma tenant_option))? ((SET sys_var_and_val_list) | (SET VARIABLES sys_var_and_val_list) | (VARIABLES sys_var_and_val_list))? ; +create_standby_tenant_stmt + : CREATE STANDBY TENANT (IF not EXISTS)? relation_name log_restore_source_option? (tenant_option | (opt_tenant_option_list Comma tenant_option))? + ; + +log_restore_source_option + : LOG_RESTORE_SOURCE COMP_EQ? conf_const + ; + opt_tenant_option_list : tenant_option | empty @@ -690,6 +741,7 @@ tenant_option | REPLICA_NUM COMP_EQ? INTNUM | PRIMARY_ZONE COMP_EQ? primary_zone_name | RESOURCE_POOL_LIST COMP_EQ? LeftParen resource_pool_list RightParen + | ENABLE_ARBITRATION_SERVICE COMP_EQ? BOOL_VALUE | ZONE_LIST COMP_EQ? LeftParen zone_list RightParen | charset_key COMP_EQ? charset_name | COLLATE COMP_EQ? collation_name @@ -757,6 +809,7 @@ database_option : DEFAULT? charset_key COMP_EQ? charset_name | DEFAULT? COLLATE COMP_EQ? collation_name | REPLICA_NUM COMP_EQ? INTNUM + | PRIMARY_ZONE COMP_EQ? primary_zone_name | read_only_or_write | default_tablegroup | DATABASE_ID COMP_EQ? INTNUM @@ -821,7 +874,7 @@ use_database_stmt ; temporary_option - : TEMPORARY? + : (TEMPORARY | EXTERNAL)? ; create_table_like_stmt @@ -852,7 +905,15 @@ create_function_stmt ; drop_function_stmt - : DROP FUNCTION (IF EXISTS)? NAME_OB + : DROP FUNCTION (IF EXISTS)? relation_factor + ; + +drop_procedure_stmt + : DROP PROCEDURE (IF EXISTS)? relation_factor + ; + +drop_trigger_stmt + : DROP TRIGGER (IF EXISTS)? relation_factor ; table_element_list @@ -914,6 +975,7 @@ opt_generated_option_list opt_generated_column_attribute_list : opt_generated_column_attribute_list generated_column_attribute + | generated_column_attribute | empty ; @@ -926,6 +988,7 @@ generated_column_attribute | COMMENT STRING_VALUE | ID INTNUM | constraint_definition + | SRID INTNUM ; column_definition_ref @@ -1087,6 +1150,7 @@ collation opt_column_attribute_list : opt_column_attribute_list column_attribute + | column_attribute | empty ; @@ -1104,6 +1168,7 @@ column_attribute | ID INTNUM | constraint_definition | SRID INTNUM + | COLLATE collation_name ; now_or_signed_literal @@ -1178,6 +1243,9 @@ table_option | CHECKSUM COMP_EQ? INTNUM | AUTO_INCREMENT_MODE COMP_EQ? STRING_VALUE | ENABLE_EXTENDED_ROWID COMP_EQ? BOOL_VALUE + | LOCATION COMP_EQ? STRING_VALUE + | FORMAT COMP_EQ? LeftParen external_file_format_list RightParen + | PATTERN COMP_EQ? STRING_VALUE ; parallel_option @@ -1439,6 +1507,18 @@ row_format_option | DEFAULT ; +external_file_format_list + : external_file_format (Comma? external_file_format)* + ; + +external_file_format + : format_key=(ENCODING|TYPE) COMP_EQ STRING_VALUE + | format_key=(ESCAPE|FIELD_OPTIONALLY_ENCLOSED_BY|FIELD_DELIMITER|LINE_DELIMITER) COMP_EQ expr + | format_key=SKIP_HEADER COMP_EQ INTNUM + | format_key=(SKIP_BLANK_LINES|TRIM_SPACE|EMPTY_FIELD_AS_NULL) COMP_EQ BOOL_VALUE + | format_key=NULL_IF_EXETERNAL COMP_EQ LeftParen expr_list RightParen + ; + create_tablegroup_stmt : create_with_opt_hint TABLEGROUP (IF not EXISTS)? relation_name tablegroup_option_list? (tg_hash_partition_option | tg_key_partition_option | tg_range_partition_option | tg_list_partition_option)? ; @@ -1468,6 +1548,7 @@ tablegroup_option | TABLEGROUP_ID COMP_EQ? INTNUM | BINDING COMP_EQ? BOOL_VALUE | MAX_USED_PART_ID COMP_EQ? INTNUM + | SHARDING COMP_EQ? STRING_VALUE ; alter_tablegroup_actions @@ -1539,6 +1620,7 @@ sort_column_list sort_column_key : column_name (LeftParen INTNUM RightParen)? (ASC | DESC)? (ID INTNUM)? + | LeftParen expr RightParen (ASC | DESC)? (ID INTNUM)? ; opt_index_options @@ -1680,6 +1762,8 @@ select_clause | simple_select | simple_select_with_order_and_limit | select_with_parens_with_order_and_limit + | table_values_clause + | table_values_clause_with_order_by_and_limit ; select_clause_set_with_order_and_limit @@ -1698,6 +1782,7 @@ select_clause_set_right : no_table_select | simple_select | select_with_parens + | table_values_clause ; select_clause_set_left @@ -2019,6 +2104,7 @@ use_plan_cache_type distribute_method : MATCH_ALL + | ALL | NONE | PARTITION | RANDOM @@ -2027,6 +2113,8 @@ distribute_method | BROADCAST | LOCAL | BC2HOST + | RANGE + | LIST_ ; limit_expr @@ -2035,6 +2123,14 @@ limit_expr | column_ref ; +for_update_clause + : FOR UPDATE opt_for_update_wait + ; + +opt_lock_in_share_mode + : LOCK_ IN SHARE MODE + ; + opt_for_update_wait : empty | WAIT DECIMAL_VAL @@ -2104,6 +2200,13 @@ from_list table_references : table_reference (Comma table_reference)* + | table_references_paren (Comma table_references_paren)* + ; + +table_references_paren + : table_reference (Comma table_reference)* + | LeftParen table_reference (Comma table_reference)* RightParen + | LeftParen table_references_paren (Comma table_reference)* RightParen ; table_reference @@ -2116,6 +2219,9 @@ table_factor | table_subquery | select_with_parens use_flashback? | LeftParen table_references RightParen + | TABLE LeftParen simple_expr RightParen (AS relation_name|relation_name?) + | LEFT_BRACE OJ table_reference RIGHT_BRACE + | json_table_expr (AS? relation_name)? ; tbl_name @@ -2143,7 +2249,12 @@ sample_clause ; table_subquery - : select_with_parens use_flashback? AS? relation_name + : select_with_parens use_flashback? AS? table_subquery_alias + ; + +table_subquery_alias + : relation_name + | relation_name LeftParen alias_name_list RightParen ; use_partition @@ -2250,6 +2361,10 @@ intnum_list : INTNUM (relation_sep_option intnum_list)? ; +tracing_num_list + : INTNUM (relation_sep_option tracing_num_list)? + ; + join_condition : ON expr | USING LeftParen column_list RightParen @@ -2282,6 +2397,7 @@ natural_join_type inner_join_type : INNER? JOIN | CROSS JOIN + | STRAIGHT_JOIN ; outer_join_type @@ -2321,6 +2437,23 @@ column_alias_name : column_name ; +table_values_clause + : VALUES values_row_list + ; + +table_values_clause_with_order_by_and_limit + : table_values_clause order_by + | table_values_clause order_by? limit_clause + ; + +values_row_list + : row_value (Comma row_value)* + ; + +row_value + : ROW LeftParen insert_vals RightParen + ; + analyze_stmt : ANALYZE TABLE relation_factor UPDATE HISTOGRAM ON column_name_list WITH INTNUM BUCKETS | ANALYZE TABLE relation_factor DROP HISTOGRAM ON column_name_list @@ -2383,6 +2516,9 @@ explain_stmt | explain_or_desc PARTITIONS explainable_stmt | explain_or_desc PARTITIONS PRETTY explainable_stmt | explain_or_desc PARTITIONS PRETTY_COLOR explainable_stmt + | explain_or_desc SET STATEMENT_ID COMP_EQ literal explainable_stmt + | explain_or_desc INTO relation_name explainable_stmt + | explain_or_desc INTO relation_name SET STATEMENT_ID COMP_EQ literal explainable_stmt | explain_or_desc FORMAT COMP_EQ format_name explainable_stmt ; @@ -2410,7 +2546,7 @@ get_diagnostics_stmt ; get_condition_diagnostics_stmt - : GET (CURRENT?|STACKED) DIAGNOSTICS CONDITION condition_arg condition_information_item_list + : GET (CURRENT|STACKED)? DIAGNOSTICS CONDITION condition_arg condition_information_item_list ; condition_arg @@ -2712,7 +2848,7 @@ lock_type ; create_sequence_stmt - : create_with_opt_hint SEQUENCE relation_factor sequence_option_list? + : create_with_opt_hint SEQUENCE (IF not EXISTS)? relation_factor sequence_option_list? ; sequence_option_list @@ -2741,20 +2877,28 @@ simple_num ; drop_sequence_stmt - : DROP SEQUENCE relation_factor + : DROP SEQUENCE (IF EXISTS)? relation_factor ; alter_sequence_stmt : ALTER SEQUENCE relation_factor sequence_option_list? ; +create_dblink_stmt + : CREATE DATABASE LINK (IF not EXISTS)? relation_name CONNECT TO user USER_VARIABLE DATABASE database_factor IDENTIFIED BY password ip_port (CLUSTER STRING_VALUE)? + ; + +drop_dblink_stmt + : DROP DATABASE LINK (IF EXISTS)? relation_name + ; + begin_stmt - : BEGI WORK? - | START TRANSACTION ((WITH CONSISTENT SNAPSHOT) | transaction_access_mode | (WITH CONSISTENT SNAPSHOT Comma transaction_access_mode) | (transaction_access_mode Comma WITH CONSISTENT SNAPSHOT))? + : BEGIN HINT_VALUE? WORK? + | START HINT_VALUE? TRANSACTION ((WITH CONSISTENT SNAPSHOT) | transaction_access_mode | (WITH CONSISTENT SNAPSHOT Comma transaction_access_mode) | (transaction_access_mode Comma WITH CONSISTENT SNAPSHOT))? ; xa_begin_stmt - : XA (BEGI|START) STRING_VALUE + : XA (BEGIN|START) STRING_VALUE ; xa_end_stmt @@ -2774,11 +2918,12 @@ xa_rollback_stmt ; commit_stmt - : COMMIT WORK? + : COMMIT HINT_VALUE? WORK? ; rollback_stmt : ROLLBACK WORK? + | ROLLBACK HINT_VALUE WORK? ; kill_stmt @@ -2802,7 +2947,7 @@ priv_type : ALTER TENANT? | create_with_opt_hint (RESOURCE POOL|USER?) | DELETE - | DROP + | DROP (DATABASE LINK)? | GRANT OPTION | INSERT | UPDATE @@ -2818,6 +2963,7 @@ priv_type | ALTER SYSTEM | REPLICATION SLAVE | REPLICATION CLIENT + | CREATE DATABASE LINK ; priv_level @@ -3016,7 +3162,7 @@ rename_table_action ; alter_table_stmt - : ALTER TABLE relation_factor alter_table_actions + : ALTER EXTERNAL? TABLE relation_factor alter_table_actions ; alter_table_actions @@ -3036,12 +3182,14 @@ alter_table_action | alter_constraint_option | alter_foreign_key_action | DROP CONSTRAINT constraint_name + | REFRESH ; alter_constraint_option : DROP (CHECK|CONSTRAINT) LeftParen name_list RightParen | DROP CHECK constraint_name | ADD constraint_definition + | ALTER (CHECK | CONSTRAINT) constraint_name check_state ; alter_partition_option @@ -3121,6 +3269,7 @@ alter_column_option | CHANGE column_definition_ref column_definition | MODIFY COLUMN column_definition | MODIFY column_definition + | RENAME COLUMN column_definition_ref TO column_definition_ref ; alter_tablegroup_option @@ -3158,20 +3307,28 @@ dump_memory_stmt ; alter_system_stmt - : ALTER SYSTEM BOOTSTRAP server_info_list - | ALTER SYSTEM FLUSH cache_type CACHE namespace_expr? sql_id_expr? databases_expr? (TENANT COMP_EQ tenant_name_list)? flush_scope + : ALTER SYSTEM BOOTSTRAP (CLUSTER cluster_role)? server_info_list (PRIMARY_CLUSTER_ID INTNUM PRIMARY_ROOTSERVICE_LIST STRING_VALUE)? + | ALTER SYSTEM FLUSH cache_type CACHE sql_id_expr? databases_expr? (TENANT COMP_EQ tenant_name_list)? flush_scope | ALTER SYSTEM FLUSH SQL cache_type (TENANT COMP_EQ tenant_name_list)? flush_scope | ALTER SYSTEM FLUSH KVCACHE tenant_name? cache_name? | ALTER SYSTEM FLUSH DAG WARNINGS | ALTER SYSTEM FLUSH ILOGCACHE file_id? + | ALTER SYSTEM ALTER PLAN BASELINE tenant_name? sql_id_expr? baseline_id_expr? SET baseline_asgn_factor + | ALTER SYSTEM LOAD PLAN BASELINE FROM PLAN CACHE (TENANT COMP_EQ tenant_name_list)? sql_id_expr? | ALTER SYSTEM SWITCH REPLICA ls_role ls_server_or_server_or_zone_or_tenant | ALTER SYSTEM SWITCH ROOTSERVICE partition_role server_or_zone + | ALTER SYSTEM alter_or_change_or_modify REPLICA partition_id_desc ip_port alter_or_change_or_modify change_actions FORCE? + | ALTER SYSTEM DROP REPLICA partition_id_desc ip_port (CREATE_TIMESTAMP opt_equal_mark INTNUM)? zone_desc? FORCE? + | ALTER SYSTEM migrate_action REPLICA partition_id_desc SOURCE COMP_EQ? STRING_VALUE DESTINATION COMP_EQ? STRING_VALUE FORCE? | ALTER SYSTEM REPORT REPLICA server_or_zone? | ALTER SYSTEM RECYCLE REPLICA server_or_zone? | ALTER SYSTEM START MERGE zone_desc | ALTER SYSTEM suspend_or_resume MERGE tenant_list_tuple? | ALTER SYSTEM suspend_or_resume RECOVERY zone_desc? | ALTER SYSTEM CLEAR MERGE ERROR_P tenant_list_tuple? + | ALTER SYSTEM ADD ARBITRATION SERVICE STRING_VALUE + | ALTER SYSTEM REMOVE ARBITRATION SERVICE STRING_VALUE + | ALTER SYSTEM REPLACE ARBITRATION SERVICE STRING_VALUE WITH STRING_VALUE | ALTER SYSTEM CANCEL cancel_task_type TASK STRING_VALUE | ALTER SYSTEM MAJOR FREEZE tenant_list_tuple? | ALTER SYSTEM CHECKPOINT @@ -3199,7 +3356,7 @@ alter_system_stmt | ALTER SYSTEM UPGRADE VIRTUAL SCHEMA | ALTER SYSTEM RUN JOB STRING_VALUE server_or_zone? | ALTER SYSTEM upgrade_action UPGRADE - | ALTER SYSTEM RUN UPGRADE JOB STRING_VALUE + | ALTER SYSTEM RUN UPGRADE JOB STRING_VALUE tenant_list_tuple? | ALTER SYSTEM STOP UPGRADE JOB | ALTER SYSTEM upgrade_action ROLLING UPGRADE | ALTER SYSTEM REFRESH TIME_ZONE_INFO @@ -3209,8 +3366,9 @@ alter_system_stmt | ALTER SYSTEM SET NETWORK BANDWIDTH REGION relation_name_or_string TO relation_name_or_string conf_const | ALTER SYSTEM ADD RESTORE SOURCE STRING_VALUE | ALTER SYSTEM CLEAR RESTORE SOURCE - | ALTER SYSTEM RESTORE table_list FOR relation_name (FROM STRING_VALUE)? ((UNTIL TIME opt_equal_mark STRING_VALUE) | (UNTIL SCN opt_equal_mark INTNUM))? WITH STRING_VALUE (DESCRIPTION opt_equal_mark STRING_VALUE)? - | ALTER SYSTEM RESTORE relation_name (FROM STRING_VALUE)? ((UNTIL TIME opt_equal_mark STRING_VALUE) | (UNTIL SCN opt_equal_mark INTNUM))? WITH STRING_VALUE (DESCRIPTION opt_equal_mark STRING_VALUE)? PREVIEW? + | ALTER SYSTEM RESTORE tenant_name FROM STRING_VALUE + | ALTER SYSTEM RESTORE table_list FOR relation_name (FROM STRING_VALUE)? ((UNTIL TIME COMP_EQ STRING_VALUE) | (UNTIL SCN COMP_EQ INTNUM))? WITH STRING_VALUE (ENCRYPTED BY STRING_VALUE)? (WITH KEY FROM STRING_VALUE opt_encrypt_key)? (DESCRIPTION opt_equal_mark STRING_VALUE)? + | ALTER SYSTEM RESTORE relation_name (FROM STRING_VALUE)? ((UNTIL TIME COMP_EQ STRING_VALUE) | (UNTIL SCN COMP_EQ INTNUM))? WITH STRING_VALUE (ENCRYPTED BY STRING_VALUE)? (WITH KEY FROM STRING_VALUE opt_encrypt_key)? (DESCRIPTION opt_equal_mark STRING_VALUE)? PREVIEW? | ALTER SYSTEM CHANGE TENANT change_tenant_name_or_tenant_id | ALTER SYSTEM DROP TABLES IN SESSION INTNUM | ALTER SYSTEM REFRESH TABLES IN SESSION INTNUM @@ -3226,14 +3384,23 @@ alter_system_stmt | ALTER SYSTEM BACKUP INCREMENTAL DATABASE (TO opt_equal_mark STRING_VALUE)? PLUS ARCHIVELOG (DESCRIPTION opt_equal_mark STRING_VALUE)? | ALTER SYSTEM BACKUP (TENANT opt_equal_mark tenant_name_list)? (TO opt_equal_mark STRING_VALUE)? PLUS ARCHIVELOG (DESCRIPTION opt_equal_mark STRING_VALUE)? | ALTER SYSTEM BACKUP INCREMENTAL (TENANT opt_equal_mark tenant_name_list)? (TO opt_equal_mark STRING_VALUE)? PLUS ARCHIVELOG (DESCRIPTION opt_equal_mark STRING_VALUE)? + | ALTER SYSTEM BACKUP KEY (TO opt_equal_mark STRING_VALUE)? (ENCRYPTED BY STRING_VALUE)? + | ALTER SYSTEM BACKUP KEY tenant_list_tuple (TO opt_equal_mark STRING_VALUE)? (ENCRYPTED BY STRING_VALUE)? | ALTER SYSTEM CANCEL BACKUP (TENANT opt_equal_mark tenant_name_list)? + | ALTER SYSTEM CANCEL RESTORE relation_name | ALTER SYSTEM SUSPEND BACKUP | ALTER SYSTEM RESUME BACKUP + | ALTER SYSTEM DELETE EXPIRED BACKUP (COPY INTNUM)? + | ALTER SYSTEM DELETE BACKUPSET INTNUM (COPY INTNUM)? | ALTER SYSTEM VALIDATE DATABASE (COPY INTNUM)? | ALTER SYSTEM VALIDATE BACKUPSET INTNUM (COPY INTNUM)? | ALTER SYSTEM CANCEL VALIDATE INTNUM (COPY INTNUM)? + | ALTER SYSTEM DELETE OBSOLETE BACKUP + | ALTER SYSTEM CANCEL DELETE BACKUP | ALTER SYSTEM CANCEL BACKUP BACKUPSET + | ALTER SYSTEM DELETE BACKUPPIECE INTNUM (COPY INTNUM)? | ALTER SYSTEM CANCEL BACKUP BACKUPPIECE + | ALTER SYSTEM DELETE BACKUPROUND INTNUM (COPY INTNUM)? | ALTER SYSTEM CANCEL ALL BACKUP FORCE | ALTER SYSTEM DELETE BACKUPSET INTNUM (COPY INTNUM)? (TENANT opt_equal_mark tenant_name_list)? (DESCRIPTION opt_equal_mark STRING_VALUE)? | ALTER SYSTEM DELETE BACKUPPIECE INTNUM (COPY INTNUM)? (TENANT opt_equal_mark tenant_name_list)? (DESCRIPTION opt_equal_mark STRING_VALUE)? @@ -3251,6 +3418,7 @@ alter_system_stmt | ALTER SYSTEM BACKUP BACKUPPIECE ALL NOT BACKED UP INTNUM TIMES (WITH ACTIVE)? ((TENANT_ID opt_equal_mark INTNUM) | (TENANT opt_equal_mark relation_name_or_string))? (BACKUP_BACKUP_DEST opt_equal_mark STRING_VALUE)? | SET ENCRYPTION ON IDENTIFIED BY STRING_VALUE ONLY | SET DECRYPTION IDENTIFIED BY string_list + | ALTER SYSTEM BACKUP TENANT backup_tenant_name_list TO STRING_VALUE ; opt_sql_throttle_using_cond @@ -3296,13 +3464,18 @@ balance_task_type ; tenant_list_tuple - : TENANT COMP_EQ? tenant_name_list + : TENANT COMP_EQ? LeftParen tenant_name_list RightParen + | TENANT COMP_EQ? tenant_name_list ; tenant_name_list : relation_name_or_string (Comma relation_name_or_string)* ; +backup_tenant_name_list + : COMP_EQ? tenant_name_list + ; + flush_scope : GLOBAL? ; @@ -3337,6 +3510,7 @@ zone_action ip_port : SERVER COMP_EQ? STRING_VALUE + | HOST STRING_VALUE ; zone_desc @@ -3370,6 +3544,10 @@ alter_or_change_or_modify | MODIFY ; +partition_id_desc + : PARTITION_ID COMP_EQ? STRING_VALUE + ; + ls : LS COMP_EQ? INTNUM ; @@ -3385,11 +3563,37 @@ ls_server_or_server_or_zone_or_tenant | zone_desc tenant_name? ; +migrate_action + : MOVE + | COPY + ; + +change_actions + : change_action change_actions? + ; + +change_action + : replica_type + | memstore_percent + ; + +replica_type + : REPLICA_TYPE COMP_EQ? STRING_VALUE + ; + +memstore_percent + : MEMSTORE_PERCENT COMP_EQ? INTNUM + ; + suspend_or_resume : SUSPEND | RESUME ; +baseline_id_expr + : BASELINE_ID COMP_EQ? INTNUM + ; + sql_id_expr : SQL_ID COMP_EQ? STRING_VALUE ; @@ -3398,6 +3602,10 @@ namespace_expr : NAMESPACE COMP_EQ? STRING_VALUE ; +baseline_asgn_factor + : column_name COMP_EQ literal + ; + tenant_name : TENANT COMP_EQ? relation_name_or_string ; @@ -3426,6 +3634,8 @@ alter_system_set_parameter_action | ROOTSERVICE_LIST COMP_EQ STRING_VALUE (COMMENT STRING_VALUE)? ((SCOPE COMP_EQ MEMORY) | (SCOPE COMP_EQ SPFILE) | (SCOPE COMP_EQ BOTH))? server_or_zone? tenant_name? | BACKUP_BACKUP_DEST COMP_EQ STRING_VALUE (COMMENT STRING_VALUE)? ((SCOPE COMP_EQ MEMORY) | (SCOPE COMP_EQ SPFILE) | (SCOPE COMP_EQ BOTH))? server_or_zone? tenant_name? | OBCONFIG_URL COMP_EQ STRING_VALUE (COMMENT STRING_VALUE)? ((SCOPE COMP_EQ MEMORY) | (SCOPE COMP_EQ SPFILE) | (SCOPE COMP_EQ BOTH))? server_or_zone? tenant_name? + | LOG_DISK_SIZE COMP_EQ STRING_VALUE (COMMENT STRING_VALUE)? ((SCOPE COMP_EQ MEMORY) | (SCOPE COMP_EQ SPFILE) | (SCOPE COMP_EQ BOTH))? server_or_zone? tenant_name? + | LOG_RESTORE_SOURCE COMP_EQ STRING_VALUE (COMMENT STRING_VALUE)? ((SCOPE COMP_EQ MEMORY) | (SCOPE COMP_EQ SPFILE) | (SCOPE COMP_EQ BOTH))? server_or_zone? tenant_name? ; alter_system_settp_actions @@ -3440,6 +3650,12 @@ settp_option | OCCUR COMP_EQ? INTNUM | FREQUENCY COMP_EQ? INTNUM | ERROR_CODE COMP_EQ? INTNUM + | MATCH COMP_EQ? INTNUM + ; + +cluster_role + : PRIMARY + | STANDBY ; partition_role @@ -3454,7 +3670,7 @@ ls_role ; upgrade_action - : BEGI + : BEGIN | END ; @@ -3536,6 +3752,11 @@ isolation_level | SERIALIZABLE ; +opt_encrypt_key + : empty + | ENCRYPTED BY STRING_VALUE + ; + create_savepoint_stmt : SAVEPOINT var_name ; @@ -3553,10 +3774,66 @@ switchover_tenant_stmt : ALTER SYSTEM switchover_clause ; +alter_cluster_stmt + : ALTER SYSTEM cluster_action VERIFY + | ALTER SYSTEM cluster_action cluster_define FORCE? + | ALTER SYSTEM alter_or_change_or_modify CLUSTER cluster_define SET? cluster_option_list + ; + +cluster_define + : cluster_name CLUSTER_ID COMP_EQ? conf_const + ; + +cluster_option_list + : cluster_option (Comma cluster_option_list)? + ; + +cluster_option + : ROOTSERVICE_LIST COMP_EQ? STRING_VALUE + | REDO_TRANSPORT_OPTIONS COMP_EQ? relation_name_or_string + ; + +cluster_action + : ADD CLUSTER + | REMOVE CLUSTER + | (DISABLE|ENABLE) CLUSTER SYNCHRONIZATION + ; + +switchover_cluster_stmt + : ALTER SYSTEM commit_switchover_clause FORCE? + ; + switchover_clause : ACTIVATE STANDBY tenant_name? ; +commit_switchover_clause + : COMMIT TO SWITCHOVER TO PRIMARY (WITH SESSION SHUTDOWN)? + | COMMIT TO SWITCHOVER TO PHYSICAL STANDBY (WITH SESSION SHUTDOWN)? + | ACTIVATE PHYSICAL STANDBY CLUSTER + | CONVERT TO PHYSICAL STANDBY + | FAILOVER TO cluster_define + ; + +protection_mode_stmt + : ALTER SYSTEM SET STANDBY CLUSTER TO MAXIMIZE protection_mode_option + ; + +protection_mode_option + : AVAILABILITY + | PERFORMANCE + | PROTECTION + ; + +cluster_name + : relation_name + | STRING_VALUE + ; + +disconnect_cluster_stmt + : ALTER SYSTEM DISCONNECT STANDBY CLUSTER cluster_define SET CLUSTER_NAME cluster_name (OBCONFIG_URL STRING_VALUE)? FORCE? VERIFY? + ; + var_name : NAME_OB | unreserved_keyword_normal @@ -3584,6 +3861,7 @@ relation_name function_name : NAME_OB + | RANDOM | DUMP | CHARSET | COLLATION @@ -3602,6 +3880,7 @@ function_name | REPLACE | TRUNCATE | FORMAT + | NORMAL ; column_label @@ -3632,8 +3911,49 @@ date_unit | YEAR_MONTH ; +json_table_expr + : JSON_TABLE LeftParen simple_expr Comma literal COLUMNS LeftParen jt_column_list RightParen RightParen + ; + +jt_column_list + : json_table_column_def (Comma json_table_column_def)* + ; + +json_table_column_def + : json_table_ordinality_column_def + | json_table_exists_column_def + | json_table_value_column_def + | json_table_nested_column_def + ; + +json_table_ordinality_column_def + : column_name FOR ORDINALITY + ; + +json_table_exists_column_def + : column_name data_type collation? EXISTS PATH literal + ; + +json_table_value_column_def + : column_name data_type collation? PATH literal opt_value_on_empty_or_error_or_mismatch + ; + +json_table_nested_column_def + : NESTED PATH? literal COLUMNS LeftParen jt_column_list RightParen + ; + +opt_value_on_empty_or_error_or_mismatch + : opt_on_empty_or_error + ; + json_value_expr - : JSON_VALUE LeftParen simple_expr Comma complex_string_literal (RETURNING cast_data_type)? (on_empty | on_error | (on_empty on_error))? RightParen + : JSON_VALUE LeftParen simple_expr Comma complex_string_literal (RETURNING cast_data_type)? TRUNCATE? ASCII? (on_empty | on_error | (on_empty on_error))? RightParen + ; + +opt_on_empty_or_error + : empty + | on_empty on_error? + | on_error ; on_empty @@ -3672,6 +3992,7 @@ unreserved_keyword_normal | APPROX_COUNT_DISTINCT_SYNOPSIS | APPROX_COUNT_DISTINCT_SYNOPSIS_MERGE | ARCHIVELOG + | ARBITRATION | ASCII | AT | AUDIT @@ -3692,7 +4013,7 @@ unreserved_keyword_normal | BASIC | BALANCE | BANDWIDTH - | BEGI + | BEGIN | BINDING | BINLOG | BIT @@ -3813,8 +4134,12 @@ unreserved_keyword_normal | DEFAULT_TABLEGROUP | EFFECTIVE | EMPTY + | EMPTY_FIELD_AS_NULL | ENABLE + | ENABLE_ARBITRATION_SERVICE | ENABLE_EXTENDED_ROWID + | ENCODING + | ENCRYPTED | ENCRYPTION | END | ENDS @@ -3842,12 +4167,15 @@ unreserved_keyword_normal | EXTENDED | EXTENDED_NOADDR | EXTENT_SIZE + | EXTERNAL | FAILOVER | EXTRACT | FAST | FAULTS | FLASHBACK | FIELDS + | FIELD_DELIMITER + | FIELD_OPTIONALLY_ENCLOSED_BY | FILEX | FILE_ID | FINAL_COUNT @@ -3867,6 +4195,7 @@ unreserved_keyword_normal | FULL | GENERAL | GEOMETRY + | GEOMCOLLECTION | GEOMETRYCOLLECTION | GET_FORMAT | GLOBAL @@ -3929,6 +4258,7 @@ unreserved_keyword_normal | LEAVES | LESS | LEVEL + | LINE_DELIMITER | LINESTRING | LIST_ | LISTAGG @@ -3941,6 +4271,7 @@ unreserved_keyword_normal | LOGFILE | LOGONLY_REPLICA_NUM | LOGS + | LOG_RESTORE_SOURCE | MAJOR | MANUAL | MASTER @@ -4030,6 +4361,7 @@ unreserved_keyword_normal | NTILE | NTH_VALUE | NUMBER + | NULL_IF_EXETERNAL | NULLS | NVARCHAR | OCCUR @@ -4039,6 +4371,7 @@ unreserved_keyword_normal | OLD | OLD_PASSWORD | OLD_KEY + | OJ | OVER | OBCONFIG_URL | ONE @@ -4060,6 +4393,7 @@ unreserved_keyword_normal | LS | PARTITIONING | PARTITIONS + | PATTERN | PERCENT_RANK | PAUSE | PERCENTAGE @@ -4169,22 +4503,27 @@ unreserved_keyword_normal | SECURITY | SEED | SEQUENCE + | SEQUENCES | SERIAL | SERIALIZABLE | SERVER | SERVER_IP | SERVER_PORT | SERVER_TYPE + | SERVICE | SESSION | SESSION_USER | SET_MASTER_CLUSTER | SET_SLAVE_CLUSTER | SET_TP + | SHARDING | SHARE | SHUTDOWN | SIGNED | SIZE | SIMPLE + | SKIP_BLANK_LINES + | SKIP_HEADER | SLAVE | SLOW | SNAPSHOT @@ -4211,6 +4550,7 @@ unreserved_keyword_normal | SQL_TSI_SECOND | SQL_TSI_WEEK | SQL_TSI_YEAR + | SRID | STACKED | STANDBY | START @@ -4282,6 +4622,7 @@ unreserved_keyword_normal | TRADITIONAL | TRIGGERS | TRIM + | TRIM_SPACE | TRUNCATE | TYPE | TYPES @@ -4306,6 +4647,7 @@ unreserved_keyword_normal | USER | USER_RESOURCES | UNBOUNDED + | UNLIMITED | VALID | VALIDATE | VALUE @@ -4364,6 +4706,10 @@ unreserved_keyword_normal | BACKED | NAMESPACE | LIB + | LINK + | MY_NAME + | CONNECT + | STATEMENT_ID ; unreserved_keyword_special diff --git a/third-party/etransfer-cpp/src/object/rename_table_column_object.h b/third-party/etransfer-cpp/src/object/rename_table_column_object.h new file mode 100644 index 0000000..5f4b63b --- /dev/null +++ b/third-party/etransfer-cpp/src/object/rename_table_column_object.h @@ -0,0 +1,42 @@ +/** + * Copyright (c) 2024 OceanBase + * OceanBase Migration Service LogProxy is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PubL v2 for more details. + */ + +#pragma once +#include "object/object.h" + +namespace etransfer { +namespace object { +class RenameTableColumnObject : public Object { + private: + RawConstant origin_column_name_; + RawConstant current_column_name_; + + public: + RenameTableColumnObject(const Catalog& catalog, const RawConstant& object_name, + const std::string& raw_ddl, + const RawConstant& origin_column_name, + const RawConstant& current_column_name) + : Object(catalog, object_name, raw_ddl, ObjectType::RENAME_TABLE_COLUMN_OBJECT), + origin_column_name_(origin_column_name), + current_column_name_(current_column_name) {} + + std::string GetCurrentColumnName() { + return Util::RawConstantValue(current_column_name_); + } + + std::string GetOriginColumnName() { + return Util::RawConstantValue(origin_column_name_); + } +}; + +} +} \ No newline at end of file diff --git a/third-party/etransfer-cpp/src/sink/object_builder_mapper.cpp b/third-party/etransfer-cpp/src/sink/object_builder_mapper.cpp index 345c618..947e713 100644 --- a/third-party/etransfer-cpp/src/sink/object_builder_mapper.cpp +++ b/third-party/etransfer-cpp/src/sink/object_builder_mapper.cpp @@ -28,6 +28,7 @@ #include "sink/drop_table_object_builder.h" #include "sink/drop_table_partition_object_builder.h" #include "sink/rename_index_object_builder.h" +#include "sink/rename_table_column_object_builder.h" #include "sink/rename_table_object_builder.h" #include "sink/truncate_table_object_builder.h" #include "sink/truncate_table_partition_object_builder.h" @@ -73,6 +74,8 @@ BuilderMap ObjectBuilderMapper::InitMapper() { std::make_shared(); mapper[common::ObjectType::TABLE_REFERENCE_CONSTRAINT_OBJECT] = std::make_shared(); + mapper[common::ObjectType::RENAME_TABLE_COLUMN_OBJECT] = + std::make_shared(); return mapper; } const BuilderMap ObjectBuilderMapper::mysql_object_builder_mapper = diff --git a/third-party/etransfer-cpp/src/sink/rename_table_column_object_builder.cpp b/third-party/etransfer-cpp/src/sink/rename_table_column_object_builder.cpp new file mode 100644 index 0000000..103c1c1 --- /dev/null +++ b/third-party/etransfer-cpp/src/sink/rename_table_column_object_builder.cpp @@ -0,0 +1,37 @@ +/** + * Copyright (c) 2024 OceanBase + * OceanBase Migration Service LogProxy is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PubL v2 for more details. + */ + +#include "sink/rename_table_column_object_builder.h" + +#include "object/rename_table_column_object.h" +#include "sink/sql_builder_util.h" +namespace etransfer { +namespace sink { +Strings RenameTableColumnObjectBuilder::RealBuildSql( + ObjectPtr db_object, ObjectPtr parent_object, + std::shared_ptr sql_builder_context) { + std::shared_ptr rename_table_column_object = + std::dynamic_pointer_cast(db_object); + Strings res; + std::string line; + line.append("RENAME COLUMN "); + line.append(SqlBuilderUtil::EscapeNormalObjectName( + rename_table_column_object->GetOriginColumnName(), sql_builder_context)) + .append(" TO "); + line.append(SqlBuilderUtil::EscapeNormalObjectName( + rename_table_column_object->GetCurrentColumnName(), sql_builder_context)); + res.push_back(line); + return res; +} +} // namespace sink + +} // namespace etransfer diff --git a/third-party/etransfer-cpp/src/sink/rename_table_column_object_builder.h b/third-party/etransfer-cpp/src/sink/rename_table_column_object_builder.h new file mode 100644 index 0000000..2ac2f4c --- /dev/null +++ b/third-party/etransfer-cpp/src/sink/rename_table_column_object_builder.h @@ -0,0 +1,25 @@ +/** + * Copyright (c) 2024 OceanBase + * OceanBase Migration Service LogProxy is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PubL v2 for more details. + */ + +#pragma once +#include "sink/object_builder.h" + +namespace etransfer { +namespace sink { +class RenameTableColumnObjectBuilder : public ObjectBuilder { + public: + Strings RealBuildSql(ObjectPtr db_object, ObjectPtr parent_object, + std::shared_ptr sql_builder_context); +}; +} // namespace sink + +} // namespace etransfer diff --git a/third-party/etransfer-cpp/src/source/obmysql_object_parser.cpp b/third-party/etransfer-cpp/src/source/obmysql_object_parser.cpp index d970689..614b087 100644 --- a/third-party/etransfer-cpp/src/source/obmysql_object_parser.cpp +++ b/third-party/etransfer-cpp/src/source/obmysql_object_parser.cpp @@ -27,6 +27,7 @@ #include "object/drop_table_object.h" #include "object/partition_object.h" #include "object/rename_index_object.h" +#include "object/rename_table_column_object.h" #include "object/rename_table_object.h" #include "object/table_column_object.h" #include "object/table_constraint_object.h" @@ -1504,7 +1505,7 @@ void OBMySQLObjectParser::ProcessAlterTableAlterColumnAction( } } else if (ctx->DROP() != nullptr) { RawConstant column_name_to_drop = - GetColumnName(ctx->column_definition_ref()); + GetColumnName(ctx->column_definition_ref(0)); Strings drop_option; if (nullptr != ctx->CASCADE()) { drop_option.push_back(ctx->CASCADE()->getText()); @@ -1517,7 +1518,7 @@ void OBMySQLObjectParser::ProcessAlterTableAlterColumnAction( drop_option)); } else if (ctx->ALTER() != nullptr) { RawConstant column_name_to_drop = - GetColumnName(ctx->column_definition_ref()); + GetColumnName(ctx->column_definition_ref(0)); if (ctx->alter_column_behavior() != nullptr) { std::shared_ptr attributes = std::make_shared(); @@ -1567,8 +1568,12 @@ void OBMySQLObjectParser::ProcessAlterTableAlterColumnAction( ProcessColumnDefinition(ctx->column_definition(), alter_column_types); actions.push_back(std::make_shared( catalog, table_name, Util::GetCtxString(ctx), - GetColumnName(ctx->column_definition_ref()), table_column_object, + GetColumnName(ctx->column_definition_ref(0)), table_column_object, alter_column_types)); + } else if (ctx->RENAME() != nullptr) { + RawConstant old_col_name = GetColumnName(ctx->column_definition_ref(0)); + RawConstant new_col_name = GetColumnName(ctx->column_definition_ref(1)); + actions.push_back(std::make_shared(catalog, table_name, Util::GetCtxString(ctx), old_col_name, new_col_name)); } else { ddl_parse_context->SetErrMsg("unsupported " + Util::GetCtxString(ctx)); } diff --git a/third-party/etransfer-cpp/test/unit_test.cpp b/third-party/etransfer-cpp/test/unit_test.cpp index 93c8b99..e0e078e 100644 --- a/third-party/etransfer-cpp/test/unit_test.cpp +++ b/third-party/etransfer-cpp/test/unit_test.cpp @@ -3038,4 +3038,66 @@ TEST(PARSER_WITH_CONTEXT, CONTEXT_7) { ASSERT_EQ(etransfer::tool::ConvertTool::ParseWithContext(source, parse_context, builder_context, dest, err_msg), 0); std::cout << err_msg << std::endl; EXPECT_STREQ(expect.c_str(), dest.c_str()); +} + +TEST(RENAME_COLUMN, RENAME_COLUMN_1) { + std::string source = "ALTER TABLE t RENAME COLUMN d TO g;"; + std::string expect = "ALTER TABLE `t`\n\tRENAME COLUMN `d` TO `g`\n"; + std::string dest; + std::string err_msg; + std::shared_ptr parse_context = std::make_shared(source, "test", false); + std::shared_ptr builder_context = std::make_shared(); + ASSERT_EQ(etransfer::tool::ConvertTool::ParseWithContext(source, parse_context, builder_context, dest, err_msg), 0); + std::cout << err_msg << std::endl; + EXPECT_STREQ(expect.c_str(), dest.c_str()); +} + +TEST(COMMENT, COMMENT_1) { + std::string source = "--单行注释\ncreate table t(c1 int);"; + std::string expect = "CREATE TABLE `t`(\n" + "\t`c1` INTEGER\n" + ")"; + std::string dest; + std::string err_msg; + std::shared_ptr parse_context = std::make_shared(source, "test", false); + std::shared_ptr builder_context = std::make_shared(); + ASSERT_EQ(etransfer::tool::ConvertTool::ParseWithContext(source, parse_context, builder_context, dest, err_msg), 0); + std::cout << err_msg << std::endl; + EXPECT_STREQ(expect.c_str(), dest.c_str()); +} + +TEST(COMMENT, COMMENT_2) { + std::string source = "/* 多行\n" + "注释*/ create table t(c1 int);"; + std::string expect = "CREATE TABLE `t`(\n" + "\t`c1` INTEGER\n" + ")"; + std::string dest; + std::string err_msg; + std::shared_ptr parse_context = std::make_shared(source, "test", false); + std::shared_ptr builder_context = std::make_shared(); + ASSERT_EQ(etransfer::tool::ConvertTool::ParseWithContext(source, parse_context, builder_context, dest, err_msg), 0); + std::cout << err_msg << std::endl; + EXPECT_STREQ(expect.c_str(), dest.c_str()); +} + +TEST(COMMENT, COMMENT_3) { + std::string source = "-- 注释\n" + "create table test(c1 int, -- 注释\n" + "-- 注释\n" + "-- 注释\n" + "c2 int, #注释2\n" + "c3 int /*注释3*/); "; + std::string expect = "CREATE TABLE `test`(\n" + "\t`c1` INTEGER,\n" + "\t`c2` INTEGER,\n" + "\t`c3` INTEGER\n" + ")"; + std::string dest; + std::string err_msg; + std::shared_ptr parse_context = std::make_shared(source, "test", false); + std::shared_ptr builder_context = std::make_shared(); + ASSERT_EQ(etransfer::tool::ConvertTool::ParseWithContext(source, parse_context, builder_context, dest, err_msg), 0); + std::cout << err_msg << std::endl; + EXPECT_STREQ(expect.c_str(), dest.c_str()); } \ No newline at end of file