Skip to content

Commit ebab516

Browse files
vsai12claude
andcommitted
feat(plsql): sync grammar with upstream antlr/grammars-v4
Add 51 lexer tokens and 20 parser rules from upstream for enhanced Oracle support while preserving all existing Bytebase customizations. New capabilities: - Oracle 21c+ annotations (ANNOTATIONS clause) - CREATE SCHEMA statement - DROP MATERIALIZED VIEW LOG statement - Compound triggers (COMPOUND TRIGGER) - MOVE PARTITION / RENAME PARTITION operations - SQL%BULK_ROWCOUNT / SQL%BULK_EXCEPTIONS expressions - Preprocessor directives ($IF, $ERROR, $ELSIF, etc.) - ACCESSIBLE BY clause for package visibility - PIPELINED USING clause - DEFAULT COLLATION clause Also fixes: - Sequence keywords for Oracle 19C+ (NOKEEP, NOSCALE, GLOBAL, etc.) - Extra semicolon in create_type.sql test file All 371 tests pass with no regressions. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent 5e19d5c commit ebab516

10 files changed

Lines changed: 49701 additions & 43226 deletions

plsql/PlSqlLexer.g4

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -538,6 +538,7 @@ EXPLOSION: 'EXPLOSION';
538538
EXPORT: 'EXPORT';
539539
EXPR_CORR_CHECK: 'EXPR_CORR_CHECK';
540540
EXPRESS: 'EXPRESS';
541+
EXTEND: 'EXTEND';
541542
EXTENDS: 'EXTENDS';
542543
EXTENT: 'EXTENT';
543544
EXTENTS: 'EXTENTS';
@@ -1055,6 +1056,7 @@ NO_ELIMINATE_JOIN: 'NO_ELIMINATE_JOIN';
10551056
NO_ELIMINATE_OBY: 'NO_ELIMINATE_OBY';
10561057
NO_ELIMINATE_OUTER_JOIN: 'NO_ELIMINATE_OUTER_JOIN';
10571058
NOENTITYESCAPING: 'NOENTITYESCAPING';
1059+
NOEXTEND: 'NOEXTEND';
10581060
NO_EXPAND_GSET_TO_UNION: 'NO_EXPAND_GSET_TO_UNION';
10591061
NO_EXPAND: 'NO_EXPAND';
10601062
NO_EXPAND_TABLE: 'NO_EXPAND_TABLE';
@@ -1137,6 +1139,8 @@ NO_ROOT_SW_FOR_LOCAL: 'NO_ROOT_SW_FOR_LOCAL';
11371139
NOROWDEPENDENCIES: 'NOROWDEPENDENCIES';
11381140
NOSCHEMACHECK: 'NOSCHEMACHECK';
11391141
NOSEGMENT: 'NOSEGMENT';
1142+
NOSCALE: 'NOSCALE';
1143+
NOSHARD: 'NOSHARD';
11401144
NO_SEMIJOIN: 'NO_SEMIJOIN';
11411145
NO_SEMI_TO_INNER: 'NO_SEMI_TO_INNER';
11421146
NO_SET_TO_JOIN: 'NO_SET_TO_JOIN';
@@ -1611,6 +1615,7 @@ SETTINGS: 'SETTINGS';
16111615
SET_TO_JOIN: 'SET_TO_JOIN';
16121616
SEVERE: 'SEVERE';
16131617
SHARDSPACE: 'SHARDSPACE';
1618+
SHARD: 'SHARD';
16141619
SHARED_POOL: 'SHARED_POOL';
16151620
SHARED: 'SHARED';
16161621
SHARE: 'SHARE';
@@ -2422,6 +2427,61 @@ BIT_STRING_LIT: 'B' ('\'' [01]* '\'')+;
24222427
// Lowercase 'x' is a usual addition to the standard
24232428

24242429
HEX_STRING_LIT: 'X' ('\'' [A-F0-9]* '\'')+;
2430+
2431+
// === Tokens added from upstream for grammar completeness ===
2432+
ACCESSIBLE: 'ACCESSIBLE';
2433+
ANNOTATIONS: 'ANNOTATIONS';
2434+
BLANKS: 'BLANKS';
2435+
CHARSETFORM: 'CHARSETFORM';
2436+
CHARSETID: 'CHARSETID';
2437+
COLLECTION: 'COLLECTION';
2438+
COMPATIBLE: 'COMPATIBLE';
2439+
COMPRESSION: 'COMPRESSION';
2440+
DAY_TO_SECOND: 'DAY_TO_SECOND';
2441+
// Note: DBLINK not added - conflicts with database link identifiers (e.g., func@dblink)
2442+
DISABLED: 'DISABLED';
2443+
DOLLAR_ELSE: '$ELSE';
2444+
DOLLAR_ELSIF: '$ELSIF';
2445+
DOLLAR_END: '$END';
2446+
DOLLAR_ERROR: '$ERROR';
2447+
DOLLAR_IF: '$IF';
2448+
DOLLAR_THEN: '$THEN';
2449+
DURATION: 'DURATION';
2450+
ENABLED: 'ENABLED';
2451+
ENCRYPTPASSWORDISNULL: 'ENCRYPTPASSWORDISNULL';
2452+
ERROR_CODE: 'ERROR_CODE';
2453+
ERROR_INDEX: 'ERROR_INDEX';
2454+
ESCAPED: 'ESCAPED';
2455+
FILE_EXT: 'PKB' | 'PKS';
2456+
HADOOP_TRAILERS: 'HADOOP_TRAILERS';
2457+
INPUTFORMAT: 'INPUTFORMAT';
2458+
INQUIRY_DIRECTIVE: '$$' (SIMPLE_LETTER | '_')+;
2459+
INTERNAL: 'INTERNAL';
2460+
ITEMS: 'ITEMS';
2461+
LATEST: 'LATEST';
2462+
LEFT_CURLY_PAREN: '{';
2463+
LINES: 'LINES';
2464+
MAXLEN: 'MAXLEN';
2465+
NOLOG: 'NOLOG';
2466+
ORC: 'ORC';
2467+
OUTPUTFORMAT: 'OUTPUTFORMAT';
2468+
PARQUET: 'PARQUET';
2469+
PERCENT_BULK_EXCEPTIONS: '%' SPACE* 'BULK_EXCEPTIONS';
2470+
PERCENT_BULK_ROWCOUNT: '%' SPACE* 'BULK_ROWCOUNT';
2471+
POLYMORPHIC: 'POLYMORPHIC';
2472+
RCFILE: 'RCFILE';
2473+
RIGHT_CURLY_PAREN: '}';
2474+
SEQUENCEFILE: 'SEQUENCEFILE';
2475+
SERDE: 'SERDE';
2476+
SERDEPROPERTIES: 'SERDEPROPERTIES';
2477+
STRUCT: 'STRUCT';
2478+
TDO: 'TDO';
2479+
TEMPLATE_TABLE: 'TEMPLATE_TABLE';
2480+
TEXTFILE: 'TEXTFILE';
2481+
USING_NLS_COMP: 'USING_NLS_COMP';
2482+
WORKERID: 'WORKERID';
2483+
YEAR_TO_MONTH: 'YEAR_TO_MONTH';
2484+
24252485
DOUBLE_PERIOD: '..';
24262486
PERIOD: '.';
24272487

plsql/PlSqlParser.g4

Lines changed: 110 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1042,13 +1042,14 @@ alter_session_set_clause
10421042
;
10431043

10441044
create_sequence
1045-
: CREATE SEQUENCE sequence_name (sequence_start_clause | sequence_spec)* SEMICOLON
1045+
: CREATE SEQUENCE (IF NOT EXISTS)? sequence_name sequence_spec* (SHARING EQUALS_OP (METADATA | DATA | NONE))? SEMICOLON
10461046
;
10471047

10481048
// Common Sequence
10491049

10501050
sequence_spec
10511051
: INCREMENT BY UNSIGNED_INTEGER
1052+
| sequence_start_clause
10521053
| MAXVALUE UNSIGNED_INTEGER
10531054
| NOMAXVALUE
10541055
| MINVALUE UNSIGNED_INTEGER
@@ -1059,6 +1060,14 @@ sequence_spec
10591060
| NOCACHE
10601061
| ORDER
10611062
| NOORDER
1063+
| KEEP
1064+
| NOKEEP
1065+
| SCALE (EXTEND | NOEXTEND)?
1066+
| NOSCALE
1067+
| SHARD (EXTEND | NOEXTEND)?
1068+
| NOSHARD
1069+
| SESSION
1070+
| GLOBAL
10621071
;
10631072

10641073
sequence_start_clause
@@ -7239,6 +7248,106 @@ outer_join_sign
72397248
: LEFT_PAREN PLUS_SIGN RIGHT_PAREN
72407249
;
72417250

7251+
// === Rules added from upstream for enhanced Oracle support ===
7252+
7253+
// Oracle 21c+ annotations support
7254+
annotations_clause
7255+
: ANNOTATIONS '(' annotations_list ')'
7256+
;
7257+
7258+
annotations_list
7259+
: (ADD (IF NOT EXISTS | OR REPLACE)? | DROP (IF EXISTS)? | REPLACE)? annotation (',' annotations_list)*
7260+
;
7261+
7262+
annotation
7263+
: identifier CHAR_STRING?
7264+
;
7265+
7266+
// CREATE SCHEMA statement
7267+
create_schema
7268+
: CREATE SCHEMA AUTHORIZATION schema_name (create_table | create_view | grant_statement)*
7269+
;
7270+
7271+
// DROP MATERIALIZED VIEW LOG statement
7272+
drop_materialized_view_log
7273+
: DROP MATERIALIZED VIEW LOG (IF EXISTS)? ON tableview_name
7274+
;
7275+
7276+
// Compound trigger support
7277+
compound_trigger_block
7278+
: COMPOUND TRIGGER seq_of_declare_specs? timing_point_section+ END trigger_name?
7279+
;
7280+
7281+
timing_point_section
7282+
: bk = BEFORE STATEMENT IS tps_block BEFORE STATEMENT ';'
7283+
| bk = BEFORE EACH ROW IS tps_block BEFORE EACH ROW ';'
7284+
| ak = AFTER STATEMENT IS tps_block AFTER STATEMENT ';'
7285+
| ak = AFTER EACH ROW IS tps_block AFTER EACH ROW ';'
7286+
;
7287+
7288+
tps_block
7289+
: declare_spec* body
7290+
;
7291+
7292+
// Partition operations
7293+
move_table_partition
7294+
: MOVE (partition_extended_names (MAPPING TABLE)? table_partition_description
7295+
| subpartition_extended_names indexing_clause? partitioning_storage_clause?)
7296+
(filter_condition | update_index_clauses | parallel_clause | allow_or_disallow CLUSTERING | ONLINE)*
7297+
;
7298+
7299+
rename_table_partition
7300+
: RENAME (partition_extended_names | subpartition_extended_names) TO partition_name
7301+
;
7302+
7303+
// Implicit cursor expressions (SQL%BULK_ROWCOUNT, SQL%BULK_EXCEPTIONS)
7304+
implicit_cursor_expression
7305+
: SQL (PERCENT_BULK_ROWCOUNT '(' expression ')'
7306+
| PERCENT_BULK_EXCEPTIONS ('.' COUNT | '(' expression ')' '.' (ERROR_INDEX | ERROR_CODE)))
7307+
;
7308+
7309+
// Preprocessor directives
7310+
inquiry_directive
7311+
: INQUIRY_DIRECTIVE
7312+
;
7313+
7314+
error_directive
7315+
: DOLLAR_ERROR concatenation DOLLAR_END
7316+
;
7317+
7318+
selection_directive
7319+
: DOLLAR_IF condition DOLLAR_THEN selection_directive_body
7320+
(DOLLAR_ELSIF selection_directive_body)* (DOLLAR_ELSE selection_directive_body)? DOLLAR_END
7321+
;
7322+
7323+
selection_directive_body
7324+
: (pragma_declaration? statement ';' | variable_declaration | error_directive | function_body | procedure_body)+
7325+
;
7326+
7327+
// Pipelined functions with USING clause
7328+
pipelined_using_clause
7329+
: PIPELINED ((ROW | TABLE) POLYMORPHIC)? USING implementation_type_name
7330+
;
7331+
7332+
// Accessible by clause for package visibility
7333+
accessible_by_clause
7334+
: ACCESSIBLE BY '(' accessor (',' accessor)* ')'
7335+
;
7336+
7337+
accessor
7338+
: (FUNCTION | PROCEDURE | PACKAGE | TRIGGER | TYPE) function_name
7339+
;
7340+
7341+
// Default collation clause
7342+
default_collation_clause
7343+
: DEFAULT COLLATION USING_NLS_COMP
7344+
;
7345+
7346+
// Helper rule for filter condition in partition operations
7347+
filter_condition
7348+
: INCLUDING ROWS where_clause
7349+
;
7350+
72427351
regular_id
72437352
: non_reserved_keywords_pre12c
72447353
| non_reserved_keywords_in_12c
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
-- Oracle 19C+ CREATE SEQUENCE with all options
2+
3+
-- Customer reported issue
4+
CREATE SEQUENCE owner.seq_name MINVALUE 1 MAXVALUE 999999 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER NOCYCLE NOKEEP NOSCALE GLOBAL;
5+
6+
-- Basic sequence
7+
CREATE SEQUENCE basic_seq START WITH 1 INCREMENT BY 1;
8+
9+
-- KEEP / NOKEEP (Oracle 12c+)
10+
CREATE SEQUENCE keep_seq KEEP;
11+
CREATE SEQUENCE nokeep_seq NOKEEP;
12+
13+
-- SCALE options (Oracle 18c+)
14+
CREATE SEQUENCE scale_seq SCALE;
15+
CREATE SEQUENCE scale_extend_seq SCALE EXTEND;
16+
CREATE SEQUENCE scale_noextend_seq SCALE NOEXTEND;
17+
CREATE SEQUENCE noscale_seq NOSCALE;
18+
19+
-- SHARD options (Oracle 12c Release 2+)
20+
CREATE SEQUENCE shard_seq SHARD;
21+
CREATE SEQUENCE shard_extend_seq SHARD EXTEND;
22+
CREATE SEQUENCE shard_noextend_seq SHARD NOEXTEND;
23+
CREATE SEQUENCE noshard_seq NOSHARD;
24+
25+
-- GLOBAL / SESSION (Oracle 18c+)
26+
CREATE SEQUENCE global_seq GLOBAL;
27+
CREATE SEQUENCE session_seq SESSION;
28+
29+
-- IF NOT EXISTS (Oracle 23c+)
30+
CREATE SEQUENCE IF NOT EXISTS new_seq START WITH 1;
31+
32+
-- SHARING clause
33+
CREATE SEQUENCE shared_meta_seq SHARING = METADATA;
34+
CREATE SEQUENCE shared_data_seq SHARING = DATA;
35+
CREATE SEQUENCE shared_none_seq SHARING = NONE;
36+
37+
-- Full example with all options
38+
CREATE SEQUENCE full_seq
39+
START WITH 1000
40+
INCREMENT BY 10
41+
MINVALUE 1
42+
MAXVALUE 999999999
43+
CACHE 50
44+
ORDER
45+
NOCYCLE
46+
NOKEEP
47+
NOSCALE
48+
GLOBAL
49+
SHARING = METADATA;

plsql/examples/create_type.sql

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,4 @@ CREATE TYPE person AS OBJECT
1111
dateofbirth DATE,
1212
homeaddress address_t,
1313
manager REF person );
14-
;
1514

0 commit comments

Comments
 (0)