diff --git a/debezium-ddl-parser/src/main/antlr4/io/debezium/ddl/parser/oracle/generated/PlSqlLexer.g4 b/debezium-ddl-parser/src/main/antlr4/io/debezium/ddl/parser/oracle/generated/PlSqlLexer.g4 index 7371c0bee..e088f562f 100644 --- a/debezium-ddl-parser/src/main/antlr4/io/debezium/ddl/parser/oracle/generated/PlSqlLexer.g4 +++ b/debezium-ddl-parser/src/main/antlr4/io/debezium/ddl/parser/oracle/generated/PlSqlLexer.g4 @@ -2471,26 +2471,3 @@ fragment SIMPLE_LETTER : [A-Z]; fragment FLOAT_FRAGMENT : UNSIGNED_INTEGER* '.'? UNSIGNED_INTEGER+; fragment NEWLINE : '\r'? '\n'; fragment SPACE : [ \t]; - - -// ORACLE HDFS & HIVE rules - -COM_ORACLE_HDFS_HIVE_BIGDATA_COLMAP : 'com.oracle.bigdata.colMap'; -COM_ORACLE_HDFS_HIVE_BIGDATA_ERROROPT : 'com.oracle.bigdata.errorOpt'; -COM_ORACLE_HDFS_HIVE_BIGDATA_FIELDS : 'com.oracle.bigdata.fields'; -COM_ORACLE_HDFS_HIVE_BIGDATA_FILEFORMAT : 'com.oracle.bigdata.fileFormat'; -COM_ORACLE_HDFS_HIVE_BIGDATA_EXEC : 'com.oracle.bigdata.exec'; -COM_ORACLE_HDFS_HIVE_BIGDATA_QC : 'com.oracle.bigdata.qc'; -COM_ORACLE_HDFS_HIVE_BIGDATA_OVERFLOW : 'com.oracle.bigdata.overflow'; -COM_ORACLE_HDFS_HIVE_BIGDATA_ROWFORMAT : 'com.oracle.bigdata.rowFormat'; -COM_ORACLE_HDFS_HIVE_BIGDATA_TABLENAME : 'com.oracle.bigdata.tableName'; - -ET_COL : '"col"'; -ET_FIELD : '"fields"'; -ET_ACTION : '"action"'; -ET_REJECT : '"reject"'; -ET_SETNULL : '"setnull"'; -ET_REPLACE : '"replace"'; -ET_VALUE : '"value"'; -ET_TRUNCATE : '"truncate"'; -ET_ERROR : '"error"'; \ No newline at end of file diff --git a/debezium-ddl-parser/src/main/antlr4/io/debezium/ddl/parser/oracle/generated/PlSqlParser.g4 b/debezium-ddl-parser/src/main/antlr4/io/debezium/ddl/parser/oracle/generated/PlSqlParser.g4 index 9a80d7573..5d907a3dd 100644 --- a/debezium-ddl-parser/src/main/antlr4/io/debezium/ddl/parser/oracle/generated/PlSqlParser.g4 +++ b/debezium-ddl-parser/src/main/antlr4/io/debezium/ddl/parser/oracle/generated/PlSqlParser.g4 @@ -2183,57 +2183,55 @@ et_oracle_datapump ; et_oracle_hdfs_hive - : COM_ORACLE_HDFS_HIVE_BIGDATA_COLMAP ( '=' | ':' ) ( - colmap_entry | ('[' colmap_entry ( ',' colmap_entry)* ']')) et_oracle_hdfs_hive* - | COM_ORACLE_HDFS_HIVE_BIGDATA_ERROROPT ( '=' | ':' ) ( - error_element | ('[' error_element ( ',' error_element)* ']' )) et_oracle_hdfs_hive* - | COM_ORACLE_HDFS_HIVE_BIGDATA_FIELDS ( '=' | ':' ) ( - field_spec et_data_type - ( COMMENT col_comment )? (',' COMMENT col_comment )* ) et_oracle_hdfs_hive* - | COM_ORACLE_HDFS_HIVE_BIGDATA_FILEFORMAT ( '=' | ':' ) ( - SEQUENCEFILE - | TEXTFILE - | RCFILE - | ORC - | PARQUET - | INPUTFORMAT quoted_string OUTPUTFORMAT quoted_string ) et_oracle_hdfs_hive* - | COM_ORACLE_HDFS_HIVE_BIGDATA_EXEC ( '=' | ':' ) ( - et_directory_spec? et_file_spec ) et_oracle_hdfs_hive* - | COM_ORACLE_HDFS_HIVE_BIGDATA_QC ( '=' | ':' ) ( - et_directory_spec? et_file_spec ) et_oracle_hdfs_hive* - | COM_ORACLE_HDFS_HIVE_BIGDATA_OVERFLOW ( '=' | ':' ) ( - overflow_element | ('[' overflow_element ( ',' overflow_element)* ']')) et_oracle_hdfs_hive* - | COM_ORACLE_HDFS_HIVE_BIGDATA_ROWFORMAT ( '=' | ':' ) ( - DELIMITED? - ( FIELDS TERMINATED BY CHARACTER ( ESCAPED BY CHARACTER ) - | COLLECTION ITEMS TERMINATED BY CHARACTER - | MAP KEYS TERMINATED BY CHARACTER - | LINES TERMINATED BY CHARACTER - | NULL_ DEFINED AS CHARACTER + : et_oracle_hdfs_hive_parameter_name ('=' | ':') + ( + // com.oracle.bigdata.tablename + tableview_name + // com.oracle.bigdata.colmap + // com.oracle.bigdata.erroropt + // com.oracle.bigdata.overflow + | et_oracle_hdfs_hive_parameter_map + | '[' et_oracle_hdfs_hive_parameter_map (',' et_oracle_hdfs_hive_parameter_map)* ']' + // com.oracle.bigdata.fields + | field_spec et_data_type ( COMMENT col_comment )?(',' COMMENT col_comment)* + // com.oracle.bigdata.fileformat + | SEQUENCEFILE + | TEXTFILE + | RCFILE + | ORC + | PARQUET + | INPUTFORMAT quoted_string OUTPUTFORMAT quoted_string + // com.oracle.bigdata.exec + // co.oracle.bigdata.qc + | et_directory_spec? et_file_spec + // com.oracle.bigdata.rowformat + | DELIMITED? + ( + FIELDS TERMINATED BY CHARACTER ( ESCAPED BY CHARACTER ) + | COLLECTION ITEMS TERMINATED BY CHARACTER + | MAP KEYS TERMINATED BY CHARACTER + | LINES TERMINATED BY CHARACTER + | NULL_ DEFINED AS CHARACTER + ) + | SERDE quoted_string ( WITH SERDEPROPERTIES ( quoted_string '=' quoted_string ( ',' quoted_string '=' quoted_string )* ) )? ) - | SERDE quoted_string ( WITH SERDEPROPERTIES ( quoted_string '=' quoted_string ( ',' quoted_string '=' quoted_string)*))? ) et_oracle_hdfs_hive* - | COM_ORACLE_HDFS_HIVE_BIGDATA_TABLENAME ( '=' | ':' ) ( - tableview_name ) et_oracle_hdfs_hive* + et_oracle_hdfs_hive? ; -colmap_entry - : LEFT_CURLY_PAREN ET_COL BINDVAR ',' ET_FIELD BINDVAR RIGHT_CURLY_PAREN +et_oracle_hdfs_hive_parameter_map + : LEFT_CURLY_PAREN ( et_oracle_hdfs_hive_parameter_mapentry (',' et_oracle_hdfs_hive_parameter_mapentry)* ) RIGHT_CURLY_PAREN ; -error_element - : LEFT_CURLY_PAREN ET_ACTION ':' ( ET_REJECT | ET_SETNULL | ET_REPLACE) (',' ET_VALUE BINDVAR ) - ( ',' ET_COL ':'? ( BINDVAR | '[' quoted_string ( ',' quoted_string )* ']' ))? RIGHT_CURLY_PAREN +et_oracle_hdfs_hive_parameter_mapentry + : quoted_string BINDVAR + | quoted_string ':' '[' quoted_string (',' quoted_string)* ']' + | '[' quoted_string (',' quoted_string)* ']' ; col_comment : quoted_string ; -overflow_element - : LEFT_CURLY_PAREN ET_ACTION ':' ( ET_TRUNCATE | ET_ERROR ) - ( ',' ET_COL ':'? ( BINDVAR | '[' quoted_string ( ',' quoted_string )* ']' ))? RIGHT_CURLY_PAREN - ; - et_data_type : ( et_primitive_type ARRAY '<' et_data_type '>' @@ -2330,11 +2328,15 @@ field_definitions ; et_field_list - : ( field_spec et_pos_spec? et_datatype_spec? et_init_spec? et_LLS_spec? ) ( ',' et_field_list )* + : field_spec (et_pos_spec? et_datatype_spec? et_init_spec? et_LLS_spec?) (',' et_field_list)* ; et_pos_spec - : POSITION? '(' (( UNSIGNED_INTEGER | '*' | ( '+' | '-' ) (UNSIGNED_INTEGER | '*' | '-' )) ( ':' | '-' ) ( UNSIGNED_INTEGER | UNSIGNED_INTEGER )) ')' + : POSITION? + '(' + ( '*'? ('+'|'-')? UNSIGNED_INTEGER? ) + ( BINDVAR | ( ':' ('+'|'-')? UNSIGNED_INTEGER ) ) + ')' ; et_datatype_spec @@ -2348,7 +2350,7 @@ et_datatype_spec | BINARY_FLOAT EXTERNAL? UNSIGNED_INTEGER? et_delim_spec? | BINARY_DOUBLE | RAW UNSIGNED_INTEGER? - | CHAR EXTERNAL? UNSIGNED_INTEGER? et_delim_spec? et_trim_spec? et_date_format_spec? + | CHAR EXTERNAL? ( '(' UNSIGNED_INTEGER ')' )? et_delim_spec? et_trim_spec? et_date_format_spec? | ( VARCHAR | VARRAW | VARCHARC | VARRAWC ) ('('( UNSIGNED_INTEGER ',')? UNSIGNED_INTEGER ')') ) ; @@ -4816,6 +4818,10 @@ paren_column_list : LEFT_PAREN column_list RIGHT_PAREN ; +et_oracle_hdfs_hive_parameter_name + : id_expression ('.' id_expression)* + ; + // PL/SQL Specs // NOTE: In reality this applies to aggregate functions only diff --git a/debezium-ddl-parser/src/test/resources/oracle/examples/ddl_create.sql b/debezium-ddl-parser/src/test/resources/oracle/examples/ddl_create.sql index 86e06f630..bd5dbc129 100644 --- a/debezium-ddl-parser/src/test/resources/oracle/examples/ddl_create.sql +++ b/debezium-ddl-parser/src/test/resources/oracle/examples/ddl_create.sql @@ -40,10 +40,10 @@ CREATE TABLE emp_load (first_name CHAR(15), last_name CHAR(20), resume CHAR(2000 FIELDS (first_name VARCHAR(2,12), last_name VARCHAR(2,20), resume VARCHAR(4,10000), picture VARRAW(4,100000))) LOCATION ('info.dat')); ---CREATE TABLE emp_load (first_name CHAR(15), last_name CHAR(20), year_of_birth INT, phone CHAR(12), area_code CHAR(3), exchange CHAR(3), extension CHAR(4)) --- ORGANIZATION EXTERNAL ( TYPE ORACLE_LOADER DEFAULT DIRECTORY ext_tab_dir --- ACCESS PARAMETERS ( FIELDS RTRIM (first_name (1:15) CHAR(15), last_name (*:+20), year_of_birth (36:39), phone (40:52), area_code (*-12: +3), exchange (*+1: +3), extension (*+1: +4))) --- LOCATION ('info.dat')); +CREATE TABLE emp_load (first_name CHAR(15), last_name CHAR(20), year_of_birth INT, phone CHAR(12), area_code CHAR(3), exchange CHAR(3), extension CHAR(4)) + ORGANIZATION EXTERNAL ( TYPE ORACLE_LOADER DEFAULT DIRECTORY ext_tab_dir + ACCESS PARAMETERS ( FIELDS RTRIM (first_name (1:15) CHAR(15), last_name (*:+20), year_of_birth (36:39), phone (40:52), area_code (*-12: +3), exchange (*+1: +3), extension (*+1: +4))) + LOCATION ('info.dat')); CREATE TABLE emp_load (first_name CHAR(15), last_name CHAR(20), year_of_birth CHAR(4)) ORGANIZATION EXTERNAL ( TYPE ORACLE_LOADER DEFAULT DIRECTORY ext_tab_dir @@ -86,14 +86,14 @@ CREATE TABLE emp_load (first_name CHAR(15), last_name CHAR(20), year_of_birth CH ACCESS PARAMETERS (RECORDS FIXED 20 FIELDS (first_name CHAR(7), last_name CHAR(8), year_of_birth CHAR(4))) LOCATION ('info.dat')); ---CREATE TABLE CUSTOMER_TABLE (cust_num VARCHAR2(10), order_num VARCHAR2(20), order_date DATE, item_cnt NUMBER, description VARCHAR2(100), order_total NUMBER(8,2)) --- ORGANIZATION EXTERNAL ( TYPE ORACLE_HIVE --- ACCESS PARAMETERS ( --- com.oracle.bigdata.tableName: order_db.order_summary --- com.oracle.bigdata.colMap: {"col":"ITEM_CNT", "field":"order_line_item_count"} --- com.oracle.bigdata.overflow: {"action":"ERROR", "col":"DESCRIPTION"} --- com.oracle.bigdata.errorOpt: [{"action":"replace", "value":"INV_NUM" , "col":["CUST_NUM","ORDER_NUM"]} , {"action":"reject", "col":"ORDER_TOTAL"}] --- )); +CREATE TABLE CUSTOMER_TABLE (cust_num VARCHAR2(10), order_num VARCHAR2(20), order_date DATE, item_cnt NUMBER, description VARCHAR2(100), order_total NUMBER(8,2)) + ORGANIZATION EXTERNAL ( TYPE ORACLE_HIVE + ACCESS PARAMETERS ( + com.oracle.bigdata.tableName: order_db.order_summary + com.oracle.bigdata.colMap: {"col":"ITEM_CNT", "field":"order_line_item_count"} + com.oracle.bigdata.overflow: {"action":"ERROR", "col":"DESCRIPTION"} + com.oracle.bigdata.errorOpt: [{"action":"replace", "value":"INV_NUM" , "col":["CUST_NUM","ORDER_NUM"]} , {"action":"reject", "col":"ORDER_TOTAL"}] + )); -- Create index create index hr.name on hr.table (id,data) tablespace ts; create unique index idx_eshp_auction_file_history_id on eshp_auction_file_history(history_id);