Skip to content

Commit a5ce381

Browse files
author
zhaoge
committed
feat(postgre): #412 update merge and copy's option's syntax and then update unit test
1 parent 7324c27 commit a5ce381

12 files changed

+15652
-15277
lines changed

src/grammar/postgresql/PostgreSqlLexer.g4

+127-124
Original file line numberDiff line numberDiff line change
@@ -356,130 +356,133 @@ KW_LAST : 'LAST';
356356
//LC_COLLATE : 'LC'_'COLLATE;
357357

358358
//LC_CTYPE : 'LC'_'CTYPE;
359-
KW_LEAKPROOF : 'LEAKPROOF';
360-
KW_LEVEL : 'LEVEL';
361-
KW_LISTEN : 'LISTEN';
362-
KW_LOAD : 'LOAD';
363-
KW_LOCAL : 'LOCAL';
364-
KW_LOCATION : 'LOCATION';
365-
KW_LOCK : 'LOCK';
366-
KW_MAPPING : 'MAPPING';
367-
KW_MATCH : 'MATCH';
368-
KW_MATERIALIZED : 'MATERIALIZED';
369-
KW_MAXVALUE : 'MAXVALUE';
370-
KW_MINUTE : 'MINUTE';
371-
KW_MINVALUE : 'MINVALUE';
372-
KW_MODE : 'MODE';
373-
KW_MONTH : 'MONTH';
374-
KW_MOVE : 'MOVE';
375-
KW_NAME : 'NAME';
376-
KW_NAMES : 'NAMES';
377-
KW_NEXT : 'NEXT';
378-
KW_NO : 'NO';
379-
KW_NOTHING : 'NOTHING';
380-
KW_NOTIFY : 'NOTIFY';
381-
KW_NOWAIT : 'NOWAIT';
382-
KW_NULLS : 'NULLS';
383-
KW_OBJECT : 'OBJECT';
384-
KW_OF : 'OF';
385-
KW_OFF : 'OFF';
386-
KW_OIDS : 'OIDS';
387-
KW_OPERATOR : 'OPERATOR';
388-
KW_OPTION : 'OPTION';
389-
KW_OPTIONS : 'OPTIONS';
390-
KW_OWNED : 'OWNED';
391-
KW_OWNER : 'OWNER';
392-
KW_PARSER : 'PARSER';
393-
KW_PARTIAL : 'PARTIAL';
394-
KW_PARTITION : 'PARTITION';
395-
KW_PASSING : 'PASSING';
396-
KW_PASSWORD : 'PASSWORD';
397-
KW_PLANS : 'PLANS';
398-
KW_PRECEDING : 'PRECEDING';
399-
KW_PREPARE : 'PREPARE';
400-
KW_PREPARED : 'PREPARED';
401-
KW_PRESERVE : 'PRESERVE';
402-
KW_PRIOR : 'PRIOR';
403-
KW_PRIVILEGES : 'PRIVILEGES';
404-
KW_PROCEDURAL : 'PROCEDURAL';
405-
KW_PROCEDURE : 'PROCEDURE';
406-
KW_PROGRAM : 'PROGRAM';
407-
KW_QUOTE : 'QUOTE';
408-
KW_RANGE : 'RANGE';
409-
KW_READ : 'READ';
410-
KW_REASSIGN : 'REASSIGN';
411-
KW_RECHECK : 'RECHECK';
412-
KW_RECURSIVE : 'RECURSIVE';
413-
KW_REF : 'REF';
414-
KW_REFRESH : 'REFRESH';
415-
KW_REINDEX : 'REINDEX';
416-
KW_RELATIVE : 'RELATIVE';
417-
KW_RELEASE : 'RELEASE';
418-
KW_RENAME : 'RENAME';
419-
KW_REPEATABLE : 'REPEATABLE';
420-
KW_REPLACE : 'REPLACE';
421-
KW_REPLICA : 'REPLICA';
422-
KW_RESET : 'RESET';
423-
KW_RESTART : 'RESTART';
424-
KW_RESTRICT : 'RESTRICT';
425-
KW_RETURNS : 'RETURNS';
426-
KW_REVOKE : 'REVOKE';
427-
KW_ROLE : 'ROLE';
428-
KW_ROLLBACK : 'ROLLBACK';
429-
KW_ROWS : 'ROWS';
430-
KW_RULE : 'RULE';
431-
KW_SAVEPOINT : 'SAVEPOINT';
432-
KW_SCHEMA : 'SCHEMA';
433-
KW_SCROLL : 'SCROLL';
434-
KW_SEARCH : 'SEARCH';
435-
KW_SECOND : 'SECOND';
436-
KW_SECURITY : 'SECURITY';
437-
KW_SEQUENCE : 'SEQUENCE';
438-
KW_SEQUENCES : 'SEQUENCES';
439-
KW_SERIALIZABLE : 'SERIALIZABLE';
440-
KW_SERVER : 'SERVER';
441-
KW_SESSION : 'SESSION';
442-
KW_SET : 'SET';
443-
KW_SHARE : 'SHARE';
444-
KW_SHOW : 'SHOW';
445-
KW_SIMPLE : 'SIMPLE';
446-
KW_SNAPSHOT : 'SNAPSHOT';
447-
KW_STABLE : 'STABLE';
448-
KW_STANDALONE : 'STANDALONE';
449-
KW_START : 'START';
450-
KW_STATEMENT : 'STATEMENT';
451-
KW_STATISTICS : 'STATISTICS';
452-
KW_STDIN : 'STDIN';
453-
KW_STDOUT : 'STDOUT';
454-
KW_STORAGE : 'STORAGE';
455-
KW_STRICT : 'STRICT';
456-
KW_STRIP : 'STRIP';
457-
KW_SYSID : 'SYSID';
458-
KW_SYSTEM : 'SYSTEM';
459-
KW_TABLES : 'TABLES';
460-
KW_TABLESPACE : 'TABLESPACE';
461-
KW_TEMP : 'TEMP';
462-
KW_TEMPLATE : 'TEMPLATE';
463-
KW_TEMPORARY : 'TEMPORARY';
464-
KW_TEXT : 'TEXT';
465-
KW_TRANSACTION : 'TRANSACTION';
466-
KW_TRIGGER : 'TRIGGER';
467-
KW_TRUNCATE : 'TRUNCATE';
468-
KW_TRUSTED : 'TRUSTED';
469-
KW_TYPE : 'TYPE';
470-
KW_TYPES : 'TYPES';
471-
KW_UNBOUNDED : 'UNBOUNDED';
472-
KW_UNCOMMITTED : 'UNCOMMITTED';
473-
KW_UNENCRYPTED : 'UNENCRYPTED';
474-
KW_UNKNOWN : 'UNKNOWN';
475-
KW_UNLISTEN : 'UNLISTEN';
476-
KW_UNLOGGED : 'UNLOGGED';
477-
KW_UNTIL : 'UNTIL';
478-
KW_UPDATE : 'UPDATE';
479-
KW_VACUUM : 'VACUUM';
480-
KW_VALID : 'VALID';
481-
KW_VALIDATE : 'VALIDATE';
482-
KW_VALIDATOR : 'VALIDATOR';
359+
KW_LEAKPROOF : 'LEAKPROOF';
360+
KW_LEVEL : 'LEVEL';
361+
KW_LISTEN : 'LISTEN';
362+
KW_LOAD : 'LOAD';
363+
KW_LOCAL : 'LOCAL';
364+
KW_LOCATION : 'LOCATION';
365+
KW_LOCK : 'LOCK';
366+
KW_MAPPING : 'MAPPING';
367+
KW_MATCH : 'MATCH';
368+
KW_MATERIALIZED : 'MATERIALIZED';
369+
KW_MAXVALUE : 'MAXVALUE';
370+
KW_MINUTE : 'MINUTE';
371+
KW_MINVALUE : 'MINVALUE';
372+
KW_MODE : 'MODE';
373+
KW_MONTH : 'MONTH';
374+
KW_MOVE : 'MOVE';
375+
KW_NAME : 'NAME';
376+
KW_NAMES : 'NAMES';
377+
KW_NEXT : 'NEXT';
378+
KW_NO : 'NO';
379+
KW_NOTHING : 'NOTHING';
380+
KW_NOTIFY : 'NOTIFY';
381+
KW_NOWAIT : 'NOWAIT';
382+
KW_NULLS : 'NULLS';
383+
KW_OBJECT : 'OBJECT';
384+
KW_OF : 'OF';
385+
KW_OFF : 'OFF';
386+
KW_OIDS : 'OIDS';
387+
KW_OPERATOR : 'OPERATOR';
388+
KW_OPTION : 'OPTION';
389+
KW_OPTIONS : 'OPTIONS';
390+
KW_OWNED : 'OWNED';
391+
KW_OWNER : 'OWNER';
392+
KW_PARSER : 'PARSER';
393+
KW_PARTIAL : 'PARTIAL';
394+
KW_PARTITION : 'PARTITION';
395+
KW_PASSING : 'PASSING';
396+
KW_PASSWORD : 'PASSWORD';
397+
KW_PLANS : 'PLANS';
398+
KW_PRECEDING : 'PRECEDING';
399+
KW_PREPARE : 'PREPARE';
400+
KW_PREPARED : 'PREPARED';
401+
KW_PRESERVE : 'PRESERVE';
402+
KW_PRIOR : 'PRIOR';
403+
KW_PRIVILEGES : 'PRIVILEGES';
404+
KW_PROCEDURAL : 'PROCEDURAL';
405+
KW_PROCEDURE : 'PROCEDURE';
406+
KW_PROGRAM : 'PROGRAM';
407+
KW_QUOTE : 'QUOTE';
408+
KW_FORCE_QUOTE : 'FORCE_QUOTE';
409+
KW_FORCE_NOT_NULL : 'FORCE_NOT_NULL';
410+
KW_FORCE_NULL : 'FORCE_NULL';
411+
KW_RANGE : 'RANGE';
412+
KW_READ : 'READ';
413+
KW_REASSIGN : 'REASSIGN';
414+
KW_RECHECK : 'RECHECK';
415+
KW_RECURSIVE : 'RECURSIVE';
416+
KW_REF : 'REF';
417+
KW_REFRESH : 'REFRESH';
418+
KW_REINDEX : 'REINDEX';
419+
KW_RELATIVE : 'RELATIVE';
420+
KW_RELEASE : 'RELEASE';
421+
KW_RENAME : 'RENAME';
422+
KW_REPEATABLE : 'REPEATABLE';
423+
KW_REPLACE : 'REPLACE';
424+
KW_REPLICA : 'REPLICA';
425+
KW_RESET : 'RESET';
426+
KW_RESTART : 'RESTART';
427+
KW_RESTRICT : 'RESTRICT';
428+
KW_RETURNS : 'RETURNS';
429+
KW_REVOKE : 'REVOKE';
430+
KW_ROLE : 'ROLE';
431+
KW_ROLLBACK : 'ROLLBACK';
432+
KW_ROWS : 'ROWS';
433+
KW_RULE : 'RULE';
434+
KW_SAVEPOINT : 'SAVEPOINT';
435+
KW_SCHEMA : 'SCHEMA';
436+
KW_SCROLL : 'SCROLL';
437+
KW_SEARCH : 'SEARCH';
438+
KW_SECOND : 'SECOND';
439+
KW_SECURITY : 'SECURITY';
440+
KW_SEQUENCE : 'SEQUENCE';
441+
KW_SEQUENCES : 'SEQUENCES';
442+
KW_SERIALIZABLE : 'SERIALIZABLE';
443+
KW_SERVER : 'SERVER';
444+
KW_SESSION : 'SESSION';
445+
KW_SET : 'SET';
446+
KW_SHARE : 'SHARE';
447+
KW_SHOW : 'SHOW';
448+
KW_SIMPLE : 'SIMPLE';
449+
KW_SNAPSHOT : 'SNAPSHOT';
450+
KW_STABLE : 'STABLE';
451+
KW_STANDALONE : 'STANDALONE';
452+
KW_START : 'START';
453+
KW_STATEMENT : 'STATEMENT';
454+
KW_STATISTICS : 'STATISTICS';
455+
KW_STDIN : 'STDIN';
456+
KW_STDOUT : 'STDOUT';
457+
KW_STORAGE : 'STORAGE';
458+
KW_STRICT : 'STRICT';
459+
KW_STRIP : 'STRIP';
460+
KW_SYSID : 'SYSID';
461+
KW_SYSTEM : 'SYSTEM';
462+
KW_TABLES : 'TABLES';
463+
KW_TABLESPACE : 'TABLESPACE';
464+
KW_TEMP : 'TEMP';
465+
KW_TEMPLATE : 'TEMPLATE';
466+
KW_TEMPORARY : 'TEMPORARY';
467+
KW_TEXT : 'TEXT';
468+
KW_TRANSACTION : 'TRANSACTION';
469+
KW_TRIGGER : 'TRIGGER';
470+
KW_TRUNCATE : 'TRUNCATE';
471+
KW_TRUSTED : 'TRUSTED';
472+
KW_TYPE : 'TYPE';
473+
KW_TYPES : 'TYPES';
474+
KW_UNBOUNDED : 'UNBOUNDED';
475+
KW_UNCOMMITTED : 'UNCOMMITTED';
476+
KW_UNENCRYPTED : 'UNENCRYPTED';
477+
KW_UNKNOWN : 'UNKNOWN';
478+
KW_UNLISTEN : 'UNLISTEN';
479+
KW_UNLOGGED : 'UNLOGGED';
480+
KW_UNTIL : 'UNTIL';
481+
KW_UPDATE : 'UPDATE';
482+
KW_VACUUM : 'VACUUM';
483+
KW_VALID : 'VALID';
484+
KW_VALIDATE : 'VALIDATE';
485+
KW_VALIDATOR : 'VALIDATOR';
483486
//VALUE : 'VALUE;
484487

485488
KW_VARYING : 'VARYING';

src/grammar/postgresql/PostgreSqlParser.g4

+15-2
Original file line numberDiff line numberDiff line change
@@ -559,7 +559,7 @@ copystmt
559559
) KW_WITH? copy_options
560560
;
561561

562-
copy_options
562+
copy_options_noparens
563563
: (
564564
KW_BINARY
565565
| KW_FREEZE
@@ -569,8 +569,17 @@ copy_options
569569
| KW_FORCE KW_QUOTE (column_list | STAR)
570570
| KW_FORCE KW_NOT? KW_NULL column_list
571571
| KW_ENCODING sconst
572+
| (KW_FORCE_QUOTE | KW_FORCE_NOT_NULL | KW_FORCE_NULL) (
573+
OPEN_PAREN (column_list | STAR) (COMMA (column_list | STAR))* CLOSE_PAREN
574+
)?
572575
)*
573-
| OPEN_PAREN copy_generic_opt_elem (COMMA copy_generic_opt_elem)* CLOSE_PAREN
576+
;
577+
578+
copy_options
579+
: copy_options_noparens
580+
| OPEN_PAREN (copy_options_noparens | copy_generic_opt_elem) (
581+
COMMA (copy_options_noparens | copy_generic_opt_elem)
582+
)* CLOSE_PAREN
574583
;
575584

576585
copy_generic_opt_elem
@@ -1911,11 +1920,13 @@ prep_type_clause
19111920
: OPEN_PAREN typename (COMMA typename)* CLOSE_PAREN
19121921
;
19131922

1923+
// https://www.postgresql.org/docs/17/sql-select.html
19141924
preparablestmt
19151925
: selectstmt
19161926
| insertstmt
19171927
| updatestmt
19181928
| deletestmt
1929+
| mergestmt
19191930
;
19201931

19211932
executestmt
@@ -3558,8 +3569,10 @@ stmt_move
35583569
: KW_MOVE opt_fetch_direction? cursor_variable SEMI
35593570
;
35603571

3572+
// https://www.postgresql.org/docs/17/sql-merge.html
35613573
mergestmt
35623574
: with_clause? KW_MERGE KW_INTO (KW_ONLY)? table_name (STAR)? (KW_AS? colid)? KW_USING data_source KW_ON expression merge_when_clause+
3575+
returning_clause?
35633576
;
35643577

35653578
data_source

src/lib/postgresql/PostgreSqlLexer.interp

+10-1
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)