feat: pgsql collect column name (#216)

* feat(pgsql: collect column name): pgsql: collect column name

* feat(pgsql): repair column name's unit test and sql

* feat(pgsql): pgsql: collect expression's column

* feat(update column's collect of some expression): pgsql: update column's collect of some expression

---------

Co-authored-by: zhaoge <>
This commit is contained in:
XCynthia 2023-11-28 10:07:29 +08:00 committed by GitHub
parent 428d851913
commit db05cb3e4f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 21365 additions and 18524 deletions

View File

@ -295,6 +295,12 @@ iso_level:
| KW_REPEATABLE KW_READ | KW_REPEATABLE KW_READ
| KW_SERIALIZABLE; | KW_SERIALIZABLE;
opt_boolean_or_string_column:
KW_TRUE
| KW_FALSE
| KW_ON
| nonreservedword_or_sconst_column;
opt_boolean_or_string: opt_boolean_or_string:
KW_TRUE KW_TRUE
| KW_FALSE | KW_FALSE
@ -312,6 +318,8 @@ zone_value:
opt_encoding: sconst | KW_DEFAULT; opt_encoding: sconst | KW_DEFAULT;
nonreservedword_or_sconst_column: nonreservedword_column | sconst;
nonreservedword_or_sconst: nonreservedword | sconst; nonreservedword_or_sconst: nonreservedword | sconst;
variableresetstmt: KW_RESET reset_rest; variableresetstmt: KW_RESET reset_rest;
@ -389,25 +397,23 @@ partition_cmd:
index_partition_cmd: KW_ATTACH KW_PARTITION qualified_name; index_partition_cmd: KW_ATTACH KW_PARTITION qualified_name;
alter_table_cmd: alter_table_cmd:
KW_ADD columnDef KW_ADD opt_column? opt_if_not_exists? columnDefCluase
| KW_ADD opt_if_not_exists? columnDef | KW_ALTER opt_column? column_name alter_column_default
| KW_ADD KW_COLUMN opt_if_not_exists columnDef | KW_ALTER opt_column? column_name KW_DROP KW_NOT KW_NULL
| KW_ALTER opt_column? colid alter_column_default | KW_ALTER opt_column? column_name KW_SET KW_NOT KW_NULL
| KW_ALTER opt_column? colid KW_DROP KW_NOT KW_NULL | KW_ALTER opt_column? column_name KW_DROP KW_EXPRESSION opt_if_exists?
| KW_ALTER opt_column? colid KW_SET KW_NOT KW_NULL | KW_ALTER opt_column? column_name KW_SET KW_STATISTICS signediconst
| KW_ALTER opt_column? colid KW_DROP KW_EXPRESSION opt_if_exists? | KW_ALTER opt_column? column_name KW_SET KW_STATISTICS signediconst
| KW_ALTER opt_column? colid KW_SET KW_STATISTICS signediconst | KW_ALTER opt_column? column_name KW_SET reloptions
| KW_ALTER opt_column? iconst KW_SET KW_STATISTICS signediconst | KW_ALTER opt_column? column_name KW_RESET reloptions
| KW_ALTER opt_column? colid KW_SET reloptions | KW_ALTER opt_column? column_name KW_SET KW_STORAGE colid
| KW_ALTER opt_column? colid KW_RESET reloptions | KW_ALTER opt_column? column_name KW_ADD KW_GENERATED generated_when KW_AS KW_IDENTITY
| KW_ALTER opt_column? colid KW_SET KW_STORAGE colid
| KW_ALTER opt_column? colid KW_ADD KW_GENERATED generated_when KW_AS KW_IDENTITY
optparenthesizedseqoptlist? optparenthesizedseqoptlist?
| KW_ALTER opt_column? colid alter_identity_column_option_list | KW_ALTER opt_column? column_name alter_identity_column_option_list
| KW_ALTER opt_column? colid KW_DROP KW_IDENTITY opt_if_exists? | KW_ALTER opt_column? column_name KW_DROP KW_IDENTITY opt_if_exists?
| KW_DROP opt_column? opt_if_exists? colid opt_drop_behavior? | KW_DROP opt_column? opt_if_exists? column_name opt_drop_behavior?
| KW_ALTER opt_column? colid opt_set_data? KW_TYPE typename opt_collate_clause? alter_using? | KW_ALTER opt_column? column_name opt_set_data? KW_TYPE typename opt_collate_clause? alter_using?
| KW_ALTER opt_column? colid alter_generic_options | KW_ALTER opt_column? column_name alter_generic_options
| KW_ADD tableconstraint | KW_ADD tableconstraint
| KW_ALTER KW_CONSTRAINT name constraintattributespec | KW_ALTER KW_CONSTRAINT name constraintattributespec
| KW_VALIDATE KW_CONSTRAINT name | KW_VALIDATE KW_CONSTRAINT name
@ -493,7 +499,7 @@ alter_type_cmd:
closeportalstmt: KW_CLOSE (cursor_name | KW_ALL); closeportalstmt: KW_CLOSE (cursor_name | KW_ALL);
copystmt: copystmt:
KW_COPY opt_binary? qualified_name opt_column_list? copy_from opt_program? copy_file_name KW_COPY opt_binary? table_name opt_column_list? copy_from opt_program? copy_file_name
copy_delimiter? opt_with? copy_options where_clause? copy_delimiter? opt_with? copy_options where_clause?
| KW_COPY OPEN_PAREN preparablestmt CLOSE_PAREN KW_TO opt_program? copy_file_name opt_with? | KW_COPY OPEN_PAREN preparablestmt CLOSE_PAREN KW_TO opt_program? copy_file_name opt_with?
copy_options; copy_options;
@ -547,7 +553,7 @@ copy_generic_opt_arg_list:
COMMA copy_generic_opt_arg_list_item COMMA copy_generic_opt_arg_list_item
)*; )*;
copy_generic_opt_arg_list_item: opt_boolean_or_string; copy_generic_opt_arg_list_item: opt_boolean_or_string_column;
createstmt: createstmt:
KW_CREATE opttemp? KW_TABLE opt_if_not_exists? table_name_create ( KW_CREATE opttemp? KW_TABLE opt_if_not_exists? table_name_create (
@ -582,13 +588,15 @@ tableelement: columnDef | tablelikeclause | tableconstraint;
typedtableelement: columnOptions | tableconstraint; typedtableelement: columnOptions | tableconstraint;
columnDef: colid typename create_generic_options? storageCluase? compressionCluase? (KW_COLLATE any_name)? (KW_WITH KW_OPTIONS)? colquallist; columnDefCluase: column_name typename create_generic_options? storageCluase? compressionCluase? (KW_COLLATE any_name)? (KW_WITH KW_OPTIONS)? colquallist;
columnDef: column_name typename create_generic_options? storageCluase? compressionCluase? (KW_COLLATE any_name)? (KW_WITH KW_OPTIONS)? colquallist;
compressionCluase: KW_COMPRESSION colid; compressionCluase: KW_COMPRESSION colid;
storageCluase: KW_STORAGE (KW_PLAIN | KW_EXTERNAL | KW_EXTENDED | KW_MAIN | KW_DEFAULT | colid); storageCluase: KW_STORAGE (KW_PLAIN | KW_EXTERNAL | KW_EXTENDED | KW_MAIN | KW_DEFAULT | colid);
columnOptions: colid (KW_WITH KW_OPTIONS)? colquallist; columnOptions: column_name (KW_WITH KW_OPTIONS)? colquallist;
colquallist: colconstraint*; colquallist: colconstraint*;
@ -662,9 +670,7 @@ opt_no_inherit: KW_NO KW_INHERIT;
opt_column_list: OPEN_PAREN columnlist CLOSE_PAREN; opt_column_list: OPEN_PAREN columnlist CLOSE_PAREN;
columnlist: columnElem (COMMA columnElem)*; columnlist: column_name (COMMA column_name)*;
columnElem: colid;
opt_c_include: KW_INCLUDE OPEN_PAREN columnlist CLOSE_PAREN; opt_c_include: KW_INCLUDE OPEN_PAREN columnlist CLOSE_PAREN;
@ -695,7 +701,7 @@ key_action:
KW_NO KW_ACTION KW_NO KW_ACTION
| KW_RESTRICT | KW_RESTRICT
| KW_CASCADE | KW_CASCADE
| KW_SET (KW_NULL | KW_DEFAULT); | KW_SET (KW_NULL | KW_DEFAULT) columnlist?;
optinherit: KW_INHERITS OPEN_PAREN qualified_name_list CLOSE_PAREN; optinherit: KW_INHERITS OPEN_PAREN qualified_name_list CLOSE_PAREN;
@ -707,7 +713,7 @@ partitionspec:
part_params: part_elem (COMMA part_elem)*; part_params: part_elem (COMMA part_elem)*;
part_elem: part_elem:
colid opt_collate? opt_class? column_name opt_collate? opt_class?
| func_expr_windowless opt_collate? opt_class? | func_expr_windowless opt_collate? opt_class?
| OPEN_PAREN a_expr CLOSE_PAREN opt_collate? opt_class?; | OPEN_PAREN a_expr CLOSE_PAREN opt_collate? opt_class?;
@ -773,7 +779,7 @@ seqoptelem:
| KW_MAXVALUE numericonly | KW_MAXVALUE numericonly
| KW_MINVALUE numericonly | KW_MINVALUE numericonly
| KW_NO (KW_MAXVALUE | KW_MINVALUE | KW_CYCLE) | KW_NO (KW_MAXVALUE | KW_MINVALUE | KW_CYCLE)
| KW_OWNED KW_BY any_name | KW_OWNED KW_BY table_column_name
| KW_SEQUENCE KW_NAME any_name | KW_SEQUENCE KW_NAME any_name
| KW_START opt_with? numericonly | KW_START opt_with? numericonly
| KW_RESTART opt_with? numericonly?; | KW_RESTART opt_with? numericonly?;
@ -1211,6 +1217,12 @@ object_type_name_on_any_name: KW_POLICY | KW_RULE | KW_TRIGGER;
any_name_list: any_name (COMMA any_name)*; any_name_list: any_name (COMMA any_name)*;
table_column_name: table_name DOT column_name;
relation_column_name: relation_name DOT column_name;
relation_name: colid attrs?;
any_name: colid attrs?; any_name: colid attrs?;
attrs: (DOT attr_name)+; attrs: (DOT attr_name)+;
@ -1224,13 +1236,14 @@ opt_restart_seqs: KW_CONTINUE KW_IDENTITY | KW_RESTART KW_IDENTITY;
commentstmt: commentstmt:
KW_COMMENT KW_ON object_type_any_name KW_IS comment_text KW_COMMENT KW_ON object_type_any_name KW_IS comment_text
| KW_COMMENT KW_ON KW_COLUMN any_name KW_IS comment_text | KW_COMMENT KW_ON KW_COLUMN relation_column_name KW_IS comment_text
| KW_COMMENT KW_ON object_type_name KW_IS comment_text | KW_COMMENT KW_ON object_type_name KW_IS comment_text
| KW_COMMENT KW_ON KW_TYPE typename KW_IS comment_text | KW_COMMENT KW_ON KW_TYPE typename KW_IS comment_text
| KW_COMMENT KW_ON KW_DOMAIN typename KW_IS comment_text | KW_COMMENT KW_ON KW_DOMAIN typename KW_IS comment_text
| KW_COMMENT KW_ON KW_AGGREGATE aggregate_with_argtypes KW_IS comment_text | KW_COMMENT KW_ON KW_AGGREGATE aggregate_with_argtypes KW_IS comment_text
| KW_COMMENT KW_ON KW_FUNCTION function_with_argtypes KW_IS comment_text | KW_COMMENT KW_ON KW_FUNCTION function_with_argtypes KW_IS comment_text
| KW_COMMENT KW_ON KW_OPERATOR operator_with_argtypes KW_IS comment_text | KW_COMMENT KW_ON KW_OPERATOR operator_with_argtypes KW_IS comment_text
| KW_COMMENT KW_ON KW_CONSTRAINT name KW_ON table_name KW_IS comment_text
| KW_COMMENT KW_ON KW_CONSTRAINT name KW_ON KW_DOMAIN? any_name KW_IS comment_text | KW_COMMENT KW_ON KW_CONSTRAINT name KW_ON KW_DOMAIN? any_name KW_IS comment_text
| KW_COMMENT KW_ON KW_POLICY name KW_ON any_name KW_IS comment_text | KW_COMMENT KW_ON KW_POLICY name KW_ON any_name KW_IS comment_text
| KW_COMMENT KW_ON KW_RULE name KW_ON any_name KW_IS comment_text | KW_COMMENT KW_ON KW_RULE name KW_ON any_name KW_IS comment_text
@ -1247,7 +1260,7 @@ comment_text: sconst | KW_NULL;
seclabelstmt: seclabelstmt:
KW_SECURITY KW_LABEL opt_provider? KW_ON object_type_any_name KW_IS security_label KW_SECURITY KW_LABEL opt_provider? KW_ON object_type_any_name KW_IS security_label
| KW_SECURITY KW_LABEL opt_provider? KW_ON KW_COLUMN any_name KW_IS security_label | KW_SECURITY KW_LABEL opt_provider? KW_ON KW_COLUMN table_column_name KW_IS security_label
| KW_SECURITY KW_LABEL opt_provider? KW_ON object_type_name KW_IS security_label | KW_SECURITY KW_LABEL opt_provider? KW_ON object_type_name KW_IS security_label
| KW_SECURITY KW_LABEL opt_provider? KW_ON KW_TYPE typename KW_IS security_label | KW_SECURITY KW_LABEL opt_provider? KW_ON KW_TYPE typename KW_IS security_label
| KW_SECURITY KW_LABEL opt_provider? KW_ON KW_DOMAIN typename KW_IS security_label | KW_SECURITY KW_LABEL opt_provider? KW_ON KW_DOMAIN typename KW_IS security_label
@ -1411,7 +1424,7 @@ index_elem_options:
| opt_collate? any_name reloptions opt_asc_desc? opt_nulls_order?; | opt_collate? any_name reloptions opt_asc_desc? opt_nulls_order?;
index_elem: index_elem:
colid index_elem_options column_name index_elem_options
| func_expr_windowless index_elem_options | func_expr_windowless index_elem_options
| OPEN_PAREN a_expr CLOSE_PAREN index_elem_options; | OPEN_PAREN a_expr CLOSE_PAREN index_elem_options;
@ -1552,7 +1565,7 @@ transform_type_list:
opt_definition: KW_WITH definition; opt_definition: KW_WITH definition;
table_func_column: param_name func_type; table_func_column: column_name func_type;
table_func_column_list: table_func_column_list:
table_func_column (COMMA table_func_column)*; table_func_column (COMMA table_func_column)*;
@ -1663,11 +1676,11 @@ renamestmt:
| KW_ALTER KW_MATERIALIZED KW_VIEW opt_if_exists? view_name KW_RENAME KW_TO view_name_create | KW_ALTER KW_MATERIALIZED KW_VIEW opt_if_exists? view_name KW_RENAME KW_TO view_name_create
| KW_ALTER KW_INDEX opt_if_exists? qualified_name KW_RENAME KW_TO name | KW_ALTER KW_INDEX opt_if_exists? qualified_name KW_RENAME KW_TO name
| KW_ALTER KW_FOREIGN KW_TABLE opt_if_exists? relation_expr KW_RENAME KW_TO table_name_create | KW_ALTER KW_FOREIGN KW_TABLE opt_if_exists? relation_expr KW_RENAME KW_TO table_name_create
| KW_ALTER KW_TABLE opt_if_exists? relation_expr KW_RENAME opt_column? name KW_TO name | KW_ALTER KW_TABLE opt_if_exists? relation_expr KW_RENAME opt_column? column_name KW_TO column_name_create
| KW_ALTER KW_VIEW opt_if_exists? view_name KW_RENAME opt_column? name KW_TO name | KW_ALTER KW_VIEW opt_if_exists? view_name KW_RENAME opt_column? column_name KW_TO column_name_create
| KW_ALTER KW_MATERIALIZED KW_VIEW opt_if_exists? view_name KW_RENAME opt_column? name KW_TO name | KW_ALTER KW_MATERIALIZED KW_VIEW opt_if_exists? view_name KW_RENAME opt_column? column_name KW_TO column_name_create
| KW_ALTER KW_TABLE opt_if_exists? relation_expr KW_RENAME KW_CONSTRAINT name KW_TO name | KW_ALTER KW_TABLE opt_if_exists? relation_expr KW_RENAME KW_CONSTRAINT name KW_TO name
| KW_ALTER KW_FOREIGN KW_TABLE opt_if_exists? relation_expr KW_RENAME opt_column? name KW_TO name | KW_ALTER KW_FOREIGN KW_TABLE opt_if_exists? relation_expr KW_RENAME opt_column? column_name KW_TO column_name_create
| KW_ALTER KW_RULE name KW_ON qualified_name KW_RENAME KW_TO name | KW_ALTER KW_RULE name KW_ON qualified_name KW_RENAME KW_TO name
| KW_ALTER KW_TRIGGER name KW_ON qualified_name KW_RENAME KW_TO name | KW_ALTER KW_TRIGGER name KW_ON qualified_name KW_RENAME KW_TO name
| KW_ALTER KW_EVENT KW_TRIGGER name KW_RENAME KW_TO name | KW_ALTER KW_EVENT KW_TRIGGER name KW_RENAME KW_TO name
@ -1964,7 +1977,7 @@ cluster_index_specification: KW_USING name;
vacuumstmt: vacuumstmt:
KW_VACUUM opt_full? opt_freeze? opt_verbose? opt_analyze? opt_vacuum_relation_list? KW_VACUUM opt_full? opt_freeze? opt_verbose? opt_analyze? opt_vacuum_relation_list?
| KW_VACUUM OPEN_PAREN vac_analyze_option_list CLOSE_PAREN opt_vacuum_relation_list?; | KW_VACUUM (OPEN_PAREN vac_analyze_option_list CLOSE_PAREN)? opt_vacuum_relation_list?;
analyzestmt: analyzestmt:
analyze_keyword opt_verbose? opt_vacuum_relation_list? analyze_keyword opt_verbose? opt_vacuum_relation_list?
@ -1990,9 +2003,9 @@ opt_full: KW_FULL;
opt_freeze: KW_FREEZE; opt_freeze: KW_FREEZE;
opt_name_list: OPEN_PAREN name_list CLOSE_PAREN; opt_name_list: OPEN_PAREN columnlist CLOSE_PAREN;
vacuum_relation: qualified_name opt_name_list?; vacuum_relation: table_name opt_name_list?;
vacuum_relation_list: vacuum_relation (COMMA vacuum_relation)*; vacuum_relation_list: vacuum_relation (COMMA vacuum_relation)*;
@ -2053,19 +2066,16 @@ insertstmt:
insert_target: table_name (KW_AS colid)?; insert_target: table_name (KW_AS colid)?;
insert_rest: insert_rest:
selectstmt (OPEN_PAREN insert_column_list CLOSE_PAREN)? (
| KW_OVERRIDING override_kind KW_VALUE selectstmt
| OPEN_PAREN insert_column_list CLOSE_PAREN (
KW_OVERRIDING override_kind KW_VALUE KW_OVERRIDING override_kind KW_VALUE
)? selectstmt )? (default_values_or_values | selectstmt);
| KW_DEFAULT KW_VALUES;
override_kind: KW_USER | KW_SYSTEM; override_kind: KW_USER | KW_SYSTEM;
insert_column_list: insert_column_list:
insert_column_item (COMMA insert_column_item)*; insert_column_item (COMMA insert_column_item)*;
insert_column_item: colid opt_indirection; insert_column_item: column_name opt_indirection;
opt_on_conflict: opt_on_conflict:
KW_ON KW_CONFLICT opt_conf_expr? KW_DO ( KW_ON KW_CONFLICT opt_conf_expr? KW_DO (
@ -2110,7 +2120,7 @@ set_clause:
set_target EQUAL a_expr set_target EQUAL a_expr
| OPEN_PAREN set_target_list CLOSE_PAREN EQUAL (KW_ROW? a_expr | OPEN_PAREN select_clause CLOSE_PAREN); | OPEN_PAREN set_target_list CLOSE_PAREN EQUAL (KW_ROW? a_expr | OPEN_PAREN select_clause CLOSE_PAREN);
set_target: colid opt_indirection; set_target: column_name opt_indirection;
set_target_list: set_target (COMMA set_target)*; set_target_list: set_target (COMMA set_target)*;
@ -2184,9 +2194,9 @@ common_table_expr:
name opt_name_list? KW_AS opt_materialized? OPEN_PAREN preparablestmt CLOSE_PAREN search_cluase? cycle_cluase?; name opt_name_list? KW_AS opt_materialized? OPEN_PAREN preparablestmt CLOSE_PAREN search_cluase? cycle_cluase?;
search_cluase: search_cluase:
KW_SEARCH (KW_BREADTH | KW_DEPTH) KW_FIRST KW_BY name_list KW_SET name; KW_SEARCH (KW_BREADTH | KW_DEPTH) KW_FIRST KW_BY columnlist KW_SET column_name;
cycle_cluase: KW_CYCLE name_list KW_SET name KW_TO name KW_DEFAULT name KW_USING name; cycle_cluase: KW_CYCLE columnlist KW_SET column_name (KW_TO name KW_DEFAULT name)? KW_USING column_name;
opt_materialized: KW_MATERIALIZED | KW_NOT KW_MATERIALIZED; opt_materialized: KW_MATERIALIZED | KW_NOT KW_MATERIALIZED;
@ -2217,7 +2227,7 @@ sort_clause: KW_ORDER KW_BY sortby_list;
sortby_list: sortby (COMMA sortby)*; sortby_list: sortby (COMMA sortby)*;
sortby: sortby:
a_expr (KW_USING qual_all_op | opt_asc_desc)? opt_nulls_order?; column_expr_noparen (KW_USING qual_all_op | opt_asc_desc)? opt_nulls_order?;
select_limit: select_limit:
limit_clause offset_clause? limit_clause offset_clause?
@ -2258,17 +2268,18 @@ group_clause: KW_GROUP KW_BY group_by_list;
group_by_list: group_by_item (COMMA group_by_item)*; group_by_list: group_by_item (COMMA group_by_item)*;
group_by_item: group_by_item:
a_expr column_expr_noparen
| empty_grouping_set | empty_grouping_set
| cube_clause | cube_clause
| rollup_clause | rollup_clause
| grouping_sets_clause; | grouping_sets_clause
| OPEN_PAREN column_expr_list_noparen CLOSE_PAREN;
empty_grouping_set: OPEN_PAREN CLOSE_PAREN; empty_grouping_set: OPEN_PAREN CLOSE_PAREN;
rollup_clause: KW_ROLLUP OPEN_PAREN expr_list CLOSE_PAREN; rollup_clause: KW_ROLLUP OPEN_PAREN column_expr_list_noparen CLOSE_PAREN;
cube_clause: KW_CUBE OPEN_PAREN expr_list CLOSE_PAREN; cube_clause: KW_CUBE OPEN_PAREN column_expr_list_noparen CLOSE_PAREN;
grouping_sets_clause: grouping_sets_clause:
KW_GROUPING KW_SETS OPEN_PAREN group_by_list CLOSE_PAREN; KW_GROUPING KW_SETS OPEN_PAREN group_by_list CLOSE_PAREN;
@ -2328,7 +2339,7 @@ func_alias_clause:
join_type: (KW_FULL | KW_LEFT | KW_RIGHT | KW_INNER) KW_OUTER?; join_type: (KW_FULL | KW_LEFT | KW_RIGHT | KW_INNER) KW_OUTER?;
join_qual: KW_USING OPEN_PAREN name_list CLOSE_PAREN | KW_ON a_expr; join_qual: KW_USING OPEN_PAREN columnlist CLOSE_PAREN | KW_ON a_expr;
relation_expr: relation_expr:
KW_ONLY? table_name STAR? columnlist? where_clause? KW_ONLY? table_name STAR? columnlist? where_clause?
@ -2370,7 +2381,7 @@ opt_col_def_list:
opt_ordinality: KW_WITH KW_ORDINALITY; opt_ordinality: KW_WITH KW_ORDINALITY;
where_clause: KW_WHERE a_expr; where_clause: KW_WHERE column_expr_noparen;
where_or_current_clause: where_or_current_clause:
KW_WHERE (KW_CURRENT KW_OF cursor_name | a_expr); KW_WHERE (KW_CURRENT KW_OF cursor_name | a_expr);
@ -2834,9 +2845,13 @@ subquery_Op:
expr_list: a_expr (COMMA a_expr)*; expr_list: a_expr (COMMA a_expr)*;
column_expr_list_noparen: column_expr_noparen (COMMA column_expr_noparen)*;
column_expr_list: column_expr (COMMA column_expr)*; column_expr_list: column_expr (COMMA column_expr)*;
column_expr: columnElem | (OPEN_PAREN a_expr CLOSE_PAREN); column_expr: column_name | (OPEN_PAREN a_expr CLOSE_PAREN);
column_expr_noparen: column_name | a_expr;
func_arg_list: func_arg_expr (COMMA func_arg_expr)*; func_arg_list: func_arg_expr (COMMA func_arg_expr)*;
@ -2913,7 +2928,7 @@ opt_target_list: target_list;
target_list: target_el (COMMA target_el)*; target_list: target_el (COMMA target_el)*;
target_el: target_el:
a_expr (KW_AS collabel | identifier |) # target_label column_expr_noparen (KW_AS collabel | identifier |) # target_label
| STAR # target_star; | STAR # target_star;
qualified_name_list: qualified_name (COMMA qualified_name)*; qualified_name_list: qualified_name (COMMA qualified_name)*;
@ -2958,6 +2973,10 @@ procedure_name: type_function_name | colid indirection;
procedure_name_create: type_function_name | colid indirection; procedure_name_create: type_function_name | colid indirection;
column_name: colid;
column_name_create: colid;
name: colid; name: colid;
attr_name: collabel; attr_name: collabel;
@ -3044,6 +3063,8 @@ type_usual_name:
| plsql_unreserved_keyword | plsql_unreserved_keyword
| type_func_name_keyword; | type_func_name_keyword;
nonreservedword_column: column_name | type_func_name_keyword;
nonreservedword: nonreservedword:
identifier identifier
| unreserved_keyword | unreserved_keyword
@ -3857,9 +3878,9 @@ opt_fetch_direction:
stmt_move: KW_MOVE opt_fetch_direction? cursor_variable SEMI; stmt_move: KW_MOVE opt_fetch_direction? cursor_variable SEMI;
mergestmt: with_clause? KW_MERGE KW_INTO (KW_ONLY)? table_name (STAR)? (KW_AS colid?)? KW_USING data_source KW_ON join_condition merge_when_clause+; mergestmt: with_clause? KW_MERGE KW_INTO (KW_ONLY)? table_name (STAR)? (KW_AS? colid)? KW_USING data_source KW_ON join_condition merge_when_clause+;
data_source: (KW_ONLY)? table_name (STAR)? | ( select_no_parens | values_clause ) (KW_AS? colid)?; data_source: ((KW_ONLY)? table_name (STAR)? | ( select_no_parens | values_clause ) )(KW_AS? colid)?;
join_condition: a_expr; join_condition: a_expr;
@ -3868,13 +3889,15 @@ merge_when_clause:
| KW_WHEN KW_NOT KW_MATCHED (KW_AND a_expr)? KW_THEN (merge_insert | KW_DO KW_NOTHING); | KW_WHEN KW_NOT KW_MATCHED (KW_AND a_expr)? KW_THEN (merge_insert | KW_DO KW_NOTHING);
merge_insert: merge_insert:
KW_INSERT columnlist? (KW_OVERRIDING (KW_SYSTEM | KW_USER) KW_VALUE)? (KW_VALUES exprofdefaultlist | KW_DEFAULT KW_VALUES) ; KW_INSERT (OPEN_PAREN columnlist CLOSE_PAREN)? (KW_OVERRIDING (KW_SYSTEM | KW_USER) KW_VALUE)? default_values_or_values ;
merge_update: merge_update:
KW_UPDATE KW_SET (columnElem EQUAL exprofdefault KW_UPDATE KW_SET (column_name EQUAL exprofdefault
| columnlist EQUAL exprofdefaultlist)+ | OPEN_PAREN columnlist CLOSE_PAREN EQUAL OPEN_PAREN exprofdefaultlist CLOSE_PAREN)+
; ;
default_values_or_values: KW_VALUES exprofdefaultlist | KW_DEFAULT KW_VALUES;
exprofdefaultlist: OPEN_PAREN exprofdefault (COMMA exprofdefault)* CLOSE_PAREN; exprofdefaultlist: OPEN_PAREN exprofdefault (COMMA exprofdefault)* CLOSE_PAREN;
exprofdefault: sortby | KW_DEFAULT; exprofdefault: sortby | KW_DEFAULT;

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -48,9 +48,11 @@ import { Var_nameContext } from "./PostgreSQLParser";
import { Var_listContext } from "./PostgreSQLParser"; import { Var_listContext } from "./PostgreSQLParser";
import { Var_valueContext } from "./PostgreSQLParser"; import { Var_valueContext } from "./PostgreSQLParser";
import { Iso_levelContext } from "./PostgreSQLParser"; import { Iso_levelContext } from "./PostgreSQLParser";
import { Opt_boolean_or_string_columnContext } from "./PostgreSQLParser";
import { Opt_boolean_or_stringContext } from "./PostgreSQLParser"; import { Opt_boolean_or_stringContext } from "./PostgreSQLParser";
import { Zone_valueContext } from "./PostgreSQLParser"; import { Zone_valueContext } from "./PostgreSQLParser";
import { Opt_encodingContext } from "./PostgreSQLParser"; import { Opt_encodingContext } from "./PostgreSQLParser";
import { Nonreservedword_or_sconst_columnContext } from "./PostgreSQLParser";
import { Nonreservedword_or_sconstContext } from "./PostgreSQLParser"; import { Nonreservedword_or_sconstContext } from "./PostgreSQLParser";
import { VariableresetstmtContext } from "./PostgreSQLParser"; import { VariableresetstmtContext } from "./PostgreSQLParser";
import { Reset_restContext } from "./PostgreSQLParser"; import { Reset_restContext } from "./PostgreSQLParser";
@ -114,6 +116,7 @@ import { TableelementlistContext } from "./PostgreSQLParser";
import { TypedtableelementlistContext } from "./PostgreSQLParser"; import { TypedtableelementlistContext } from "./PostgreSQLParser";
import { TableelementContext } from "./PostgreSQLParser"; import { TableelementContext } from "./PostgreSQLParser";
import { TypedtableelementContext } from "./PostgreSQLParser"; import { TypedtableelementContext } from "./PostgreSQLParser";
import { ColumnDefCluaseContext } from "./PostgreSQLParser";
import { ColumnDefContext } from "./PostgreSQLParser"; import { ColumnDefContext } from "./PostgreSQLParser";
import { CompressionCluaseContext } from "./PostgreSQLParser"; import { CompressionCluaseContext } from "./PostgreSQLParser";
import { StorageCluaseContext } from "./PostgreSQLParser"; import { StorageCluaseContext } from "./PostgreSQLParser";
@ -133,7 +136,6 @@ import { ConstraintelemContext } from "./PostgreSQLParser";
import { Opt_no_inheritContext } from "./PostgreSQLParser"; import { Opt_no_inheritContext } from "./PostgreSQLParser";
import { Opt_column_listContext } from "./PostgreSQLParser"; import { Opt_column_listContext } from "./PostgreSQLParser";
import { ColumnlistContext } from "./PostgreSQLParser"; import { ColumnlistContext } from "./PostgreSQLParser";
import { ColumnElemContext } from "./PostgreSQLParser";
import { Opt_c_includeContext } from "./PostgreSQLParser"; import { Opt_c_includeContext } from "./PostgreSQLParser";
import { Key_matchContext } from "./PostgreSQLParser"; import { Key_matchContext } from "./PostgreSQLParser";
import { ExclusionconstraintlistContext } from "./PostgreSQLParser"; import { ExclusionconstraintlistContext } from "./PostgreSQLParser";
@ -287,6 +289,9 @@ import { Object_type_any_nameContext } from "./PostgreSQLParser";
import { Object_type_nameContext } from "./PostgreSQLParser"; import { Object_type_nameContext } from "./PostgreSQLParser";
import { Object_type_name_on_any_nameContext } from "./PostgreSQLParser"; import { Object_type_name_on_any_nameContext } from "./PostgreSQLParser";
import { Any_name_listContext } from "./PostgreSQLParser"; import { Any_name_listContext } from "./PostgreSQLParser";
import { Table_column_nameContext } from "./PostgreSQLParser";
import { Relation_column_nameContext } from "./PostgreSQLParser";
import { Relation_nameContext } from "./PostgreSQLParser";
import { Any_nameContext } from "./PostgreSQLParser"; import { Any_nameContext } from "./PostgreSQLParser";
import { AttrsContext } from "./PostgreSQLParser"; import { AttrsContext } from "./PostgreSQLParser";
import { Type_name_listContext } from "./PostgreSQLParser"; import { Type_name_listContext } from "./PostgreSQLParser";
@ -668,8 +673,10 @@ import { Qual_opContext } from "./PostgreSQLParser";
import { Qual_all_opContext } from "./PostgreSQLParser"; import { Qual_all_opContext } from "./PostgreSQLParser";
import { Subquery_OpContext } from "./PostgreSQLParser"; import { Subquery_OpContext } from "./PostgreSQLParser";
import { Expr_listContext } from "./PostgreSQLParser"; import { Expr_listContext } from "./PostgreSQLParser";
import { Column_expr_list_noparenContext } from "./PostgreSQLParser";
import { Column_expr_listContext } from "./PostgreSQLParser"; import { Column_expr_listContext } from "./PostgreSQLParser";
import { Column_exprContext } from "./PostgreSQLParser"; import { Column_exprContext } from "./PostgreSQLParser";
import { Column_expr_noparenContext } from "./PostgreSQLParser";
import { Func_arg_listContext } from "./PostgreSQLParser"; import { Func_arg_listContext } from "./PostgreSQLParser";
import { Func_arg_exprContext } from "./PostgreSQLParser"; import { Func_arg_exprContext } from "./PostgreSQLParser";
import { Type_listContext } from "./PostgreSQLParser"; import { Type_listContext } from "./PostgreSQLParser";
@ -717,6 +724,8 @@ import { Routine_name_createContext } from "./PostgreSQLParser";
import { Routine_nameContext } from "./PostgreSQLParser"; import { Routine_nameContext } from "./PostgreSQLParser";
import { Procedure_nameContext } from "./PostgreSQLParser"; import { Procedure_nameContext } from "./PostgreSQLParser";
import { Procedure_name_createContext } from "./PostgreSQLParser"; import { Procedure_name_createContext } from "./PostgreSQLParser";
import { Column_nameContext } from "./PostgreSQLParser";
import { Column_name_createContext } from "./PostgreSQLParser";
import { NameContext } from "./PostgreSQLParser"; import { NameContext } from "./PostgreSQLParser";
import { Attr_nameContext } from "./PostgreSQLParser"; import { Attr_nameContext } from "./PostgreSQLParser";
import { File_nameContext } from "./PostgreSQLParser"; import { File_nameContext } from "./PostgreSQLParser";
@ -742,6 +751,7 @@ import { Exclude_elementContext } from "./PostgreSQLParser";
import { Index_paramentersContext } from "./PostgreSQLParser"; import { Index_paramentersContext } from "./PostgreSQLParser";
import { Type_function_nameContext } from "./PostgreSQLParser"; import { Type_function_nameContext } from "./PostgreSQLParser";
import { Type_usual_nameContext } from "./PostgreSQLParser"; import { Type_usual_nameContext } from "./PostgreSQLParser";
import { Nonreservedword_columnContext } from "./PostgreSQLParser";
import { NonreservedwordContext } from "./PostgreSQLParser"; import { NonreservedwordContext } from "./PostgreSQLParser";
import { CollabelContext } from "./PostgreSQLParser"; import { CollabelContext } from "./PostgreSQLParser";
import { IdentifierContext } from "./PostgreSQLParser"; import { IdentifierContext } from "./PostgreSQLParser";
@ -845,6 +855,7 @@ import { Join_conditionContext } from "./PostgreSQLParser";
import { Merge_when_clauseContext } from "./PostgreSQLParser"; import { Merge_when_clauseContext } from "./PostgreSQLParser";
import { Merge_insertContext } from "./PostgreSQLParser"; import { Merge_insertContext } from "./PostgreSQLParser";
import { Merge_updateContext } from "./PostgreSQLParser"; import { Merge_updateContext } from "./PostgreSQLParser";
import { Default_values_or_valuesContext } from "./PostgreSQLParser";
import { ExprofdefaultlistContext } from "./PostgreSQLParser"; import { ExprofdefaultlistContext } from "./PostgreSQLParser";
import { ExprofdefaultContext } from "./PostgreSQLParser"; import { ExprofdefaultContext } from "./PostgreSQLParser";
import { Stmt_closeContext } from "./PostgreSQLParser"; import { Stmt_closeContext } from "./PostgreSQLParser";
@ -1394,6 +1405,17 @@ export interface PostgreSQLParserListener extends ParseTreeListener {
*/ */
exitIso_level?: (ctx: Iso_levelContext) => void; exitIso_level?: (ctx: Iso_levelContext) => void;
/**
* Enter a parse tree produced by `PostgreSQLParser.opt_boolean_or_string_column`.
* @param ctx the parse tree
*/
enterOpt_boolean_or_string_column?: (ctx: Opt_boolean_or_string_columnContext) => void;
/**
* Exit a parse tree produced by `PostgreSQLParser.opt_boolean_or_string_column`.
* @param ctx the parse tree
*/
exitOpt_boolean_or_string_column?: (ctx: Opt_boolean_or_string_columnContext) => void;
/** /**
* Enter a parse tree produced by `PostgreSQLParser.opt_boolean_or_string`. * Enter a parse tree produced by `PostgreSQLParser.opt_boolean_or_string`.
* @param ctx the parse tree * @param ctx the parse tree
@ -1427,6 +1449,17 @@ export interface PostgreSQLParserListener extends ParseTreeListener {
*/ */
exitOpt_encoding?: (ctx: Opt_encodingContext) => void; exitOpt_encoding?: (ctx: Opt_encodingContext) => void;
/**
* Enter a parse tree produced by `PostgreSQLParser.nonreservedword_or_sconst_column`.
* @param ctx the parse tree
*/
enterNonreservedword_or_sconst_column?: (ctx: Nonreservedword_or_sconst_columnContext) => void;
/**
* Exit a parse tree produced by `PostgreSQLParser.nonreservedword_or_sconst_column`.
* @param ctx the parse tree
*/
exitNonreservedword_or_sconst_column?: (ctx: Nonreservedword_or_sconst_columnContext) => void;
/** /**
* Enter a parse tree produced by `PostgreSQLParser.nonreservedword_or_sconst`. * Enter a parse tree produced by `PostgreSQLParser.nonreservedword_or_sconst`.
* @param ctx the parse tree * @param ctx the parse tree
@ -2120,6 +2153,17 @@ export interface PostgreSQLParserListener extends ParseTreeListener {
*/ */
exitTypedtableelement?: (ctx: TypedtableelementContext) => void; exitTypedtableelement?: (ctx: TypedtableelementContext) => void;
/**
* Enter a parse tree produced by `PostgreSQLParser.columnDefCluase`.
* @param ctx the parse tree
*/
enterColumnDefCluase?: (ctx: ColumnDefCluaseContext) => void;
/**
* Exit a parse tree produced by `PostgreSQLParser.columnDefCluase`.
* @param ctx the parse tree
*/
exitColumnDefCluase?: (ctx: ColumnDefCluaseContext) => void;
/** /**
* Enter a parse tree produced by `PostgreSQLParser.columnDef`. * Enter a parse tree produced by `PostgreSQLParser.columnDef`.
* @param ctx the parse tree * @param ctx the parse tree
@ -2329,17 +2373,6 @@ export interface PostgreSQLParserListener extends ParseTreeListener {
*/ */
exitColumnlist?: (ctx: ColumnlistContext) => void; exitColumnlist?: (ctx: ColumnlistContext) => void;
/**
* Enter a parse tree produced by `PostgreSQLParser.columnElem`.
* @param ctx the parse tree
*/
enterColumnElem?: (ctx: ColumnElemContext) => void;
/**
* Exit a parse tree produced by `PostgreSQLParser.columnElem`.
* @param ctx the parse tree
*/
exitColumnElem?: (ctx: ColumnElemContext) => void;
/** /**
* Enter a parse tree produced by `PostgreSQLParser.opt_c_include`. * Enter a parse tree produced by `PostgreSQLParser.opt_c_include`.
* @param ctx the parse tree * @param ctx the parse tree
@ -4023,6 +4056,39 @@ export interface PostgreSQLParserListener extends ParseTreeListener {
*/ */
exitAny_name_list?: (ctx: Any_name_listContext) => void; exitAny_name_list?: (ctx: Any_name_listContext) => void;
/**
* Enter a parse tree produced by `PostgreSQLParser.table_column_name`.
* @param ctx the parse tree
*/
enterTable_column_name?: (ctx: Table_column_nameContext) => void;
/**
* Exit a parse tree produced by `PostgreSQLParser.table_column_name`.
* @param ctx the parse tree
*/
exitTable_column_name?: (ctx: Table_column_nameContext) => void;
/**
* Enter a parse tree produced by `PostgreSQLParser.relation_column_name`.
* @param ctx the parse tree
*/
enterRelation_column_name?: (ctx: Relation_column_nameContext) => void;
/**
* Exit a parse tree produced by `PostgreSQLParser.relation_column_name`.
* @param ctx the parse tree
*/
exitRelation_column_name?: (ctx: Relation_column_nameContext) => void;
/**
* Enter a parse tree produced by `PostgreSQLParser.relation_name`.
* @param ctx the parse tree
*/
enterRelation_name?: (ctx: Relation_nameContext) => void;
/**
* Exit a parse tree produced by `PostgreSQLParser.relation_name`.
* @param ctx the parse tree
*/
exitRelation_name?: (ctx: Relation_nameContext) => void;
/** /**
* Enter a parse tree produced by `PostgreSQLParser.any_name`. * Enter a parse tree produced by `PostgreSQLParser.any_name`.
* @param ctx the parse tree * @param ctx the parse tree
@ -8214,6 +8280,17 @@ export interface PostgreSQLParserListener extends ParseTreeListener {
*/ */
exitExpr_list?: (ctx: Expr_listContext) => void; exitExpr_list?: (ctx: Expr_listContext) => void;
/**
* Enter a parse tree produced by `PostgreSQLParser.column_expr_list_noparen`.
* @param ctx the parse tree
*/
enterColumn_expr_list_noparen?: (ctx: Column_expr_list_noparenContext) => void;
/**
* Exit a parse tree produced by `PostgreSQLParser.column_expr_list_noparen`.
* @param ctx the parse tree
*/
exitColumn_expr_list_noparen?: (ctx: Column_expr_list_noparenContext) => void;
/** /**
* Enter a parse tree produced by `PostgreSQLParser.column_expr_list`. * Enter a parse tree produced by `PostgreSQLParser.column_expr_list`.
* @param ctx the parse tree * @param ctx the parse tree
@ -8236,6 +8313,17 @@ export interface PostgreSQLParserListener extends ParseTreeListener {
*/ */
exitColumn_expr?: (ctx: Column_exprContext) => void; exitColumn_expr?: (ctx: Column_exprContext) => void;
/**
* Enter a parse tree produced by `PostgreSQLParser.column_expr_noparen`.
* @param ctx the parse tree
*/
enterColumn_expr_noparen?: (ctx: Column_expr_noparenContext) => void;
/**
* Exit a parse tree produced by `PostgreSQLParser.column_expr_noparen`.
* @param ctx the parse tree
*/
exitColumn_expr_noparen?: (ctx: Column_expr_noparenContext) => void;
/** /**
* Enter a parse tree produced by `PostgreSQLParser.func_arg_list`. * Enter a parse tree produced by `PostgreSQLParser.func_arg_list`.
* @param ctx the parse tree * @param ctx the parse tree
@ -8753,6 +8841,28 @@ export interface PostgreSQLParserListener extends ParseTreeListener {
*/ */
exitProcedure_name_create?: (ctx: Procedure_name_createContext) => void; exitProcedure_name_create?: (ctx: Procedure_name_createContext) => void;
/**
* Enter a parse tree produced by `PostgreSQLParser.column_name`.
* @param ctx the parse tree
*/
enterColumn_name?: (ctx: Column_nameContext) => void;
/**
* Exit a parse tree produced by `PostgreSQLParser.column_name`.
* @param ctx the parse tree
*/
exitColumn_name?: (ctx: Column_nameContext) => void;
/**
* Enter a parse tree produced by `PostgreSQLParser.column_name_create`.
* @param ctx the parse tree
*/
enterColumn_name_create?: (ctx: Column_name_createContext) => void;
/**
* Exit a parse tree produced by `PostgreSQLParser.column_name_create`.
* @param ctx the parse tree
*/
exitColumn_name_create?: (ctx: Column_name_createContext) => void;
/** /**
* Enter a parse tree produced by `PostgreSQLParser.name`. * Enter a parse tree produced by `PostgreSQLParser.name`.
* @param ctx the parse tree * @param ctx the parse tree
@ -9028,6 +9138,17 @@ export interface PostgreSQLParserListener extends ParseTreeListener {
*/ */
exitType_usual_name?: (ctx: Type_usual_nameContext) => void; exitType_usual_name?: (ctx: Type_usual_nameContext) => void;
/**
* Enter a parse tree produced by `PostgreSQLParser.nonreservedword_column`.
* @param ctx the parse tree
*/
enterNonreservedword_column?: (ctx: Nonreservedword_columnContext) => void;
/**
* Exit a parse tree produced by `PostgreSQLParser.nonreservedword_column`.
* @param ctx the parse tree
*/
exitNonreservedword_column?: (ctx: Nonreservedword_columnContext) => void;
/** /**
* Enter a parse tree produced by `PostgreSQLParser.nonreservedword`. * Enter a parse tree produced by `PostgreSQLParser.nonreservedword`.
* @param ctx the parse tree * @param ctx the parse tree
@ -10161,6 +10282,17 @@ export interface PostgreSQLParserListener extends ParseTreeListener {
*/ */
exitMerge_update?: (ctx: Merge_updateContext) => void; exitMerge_update?: (ctx: Merge_updateContext) => void;
/**
* Enter a parse tree produced by `PostgreSQLParser.default_values_or_values`.
* @param ctx the parse tree
*/
enterDefault_values_or_values?: (ctx: Default_values_or_valuesContext) => void;
/**
* Exit a parse tree produced by `PostgreSQLParser.default_values_or_values`.
* @param ctx the parse tree
*/
exitDefault_values_or_values?: (ctx: Default_values_or_valuesContext) => void;
/** /**
* Enter a parse tree produced by `PostgreSQLParser.exprofdefaultlist`. * Enter a parse tree produced by `PostgreSQLParser.exprofdefaultlist`.
* @param ctx the parse tree * @param ctx the parse tree

View File

@ -48,9 +48,11 @@ import { Var_nameContext } from "./PostgreSQLParser";
import { Var_listContext } from "./PostgreSQLParser"; import { Var_listContext } from "./PostgreSQLParser";
import { Var_valueContext } from "./PostgreSQLParser"; import { Var_valueContext } from "./PostgreSQLParser";
import { Iso_levelContext } from "./PostgreSQLParser"; import { Iso_levelContext } from "./PostgreSQLParser";
import { Opt_boolean_or_string_columnContext } from "./PostgreSQLParser";
import { Opt_boolean_or_stringContext } from "./PostgreSQLParser"; import { Opt_boolean_or_stringContext } from "./PostgreSQLParser";
import { Zone_valueContext } from "./PostgreSQLParser"; import { Zone_valueContext } from "./PostgreSQLParser";
import { Opt_encodingContext } from "./PostgreSQLParser"; import { Opt_encodingContext } from "./PostgreSQLParser";
import { Nonreservedword_or_sconst_columnContext } from "./PostgreSQLParser";
import { Nonreservedword_or_sconstContext } from "./PostgreSQLParser"; import { Nonreservedword_or_sconstContext } from "./PostgreSQLParser";
import { VariableresetstmtContext } from "./PostgreSQLParser"; import { VariableresetstmtContext } from "./PostgreSQLParser";
import { Reset_restContext } from "./PostgreSQLParser"; import { Reset_restContext } from "./PostgreSQLParser";
@ -114,6 +116,7 @@ import { TableelementlistContext } from "./PostgreSQLParser";
import { TypedtableelementlistContext } from "./PostgreSQLParser"; import { TypedtableelementlistContext } from "./PostgreSQLParser";
import { TableelementContext } from "./PostgreSQLParser"; import { TableelementContext } from "./PostgreSQLParser";
import { TypedtableelementContext } from "./PostgreSQLParser"; import { TypedtableelementContext } from "./PostgreSQLParser";
import { ColumnDefCluaseContext } from "./PostgreSQLParser";
import { ColumnDefContext } from "./PostgreSQLParser"; import { ColumnDefContext } from "./PostgreSQLParser";
import { CompressionCluaseContext } from "./PostgreSQLParser"; import { CompressionCluaseContext } from "./PostgreSQLParser";
import { StorageCluaseContext } from "./PostgreSQLParser"; import { StorageCluaseContext } from "./PostgreSQLParser";
@ -133,7 +136,6 @@ import { ConstraintelemContext } from "./PostgreSQLParser";
import { Opt_no_inheritContext } from "./PostgreSQLParser"; import { Opt_no_inheritContext } from "./PostgreSQLParser";
import { Opt_column_listContext } from "./PostgreSQLParser"; import { Opt_column_listContext } from "./PostgreSQLParser";
import { ColumnlistContext } from "./PostgreSQLParser"; import { ColumnlistContext } from "./PostgreSQLParser";
import { ColumnElemContext } from "./PostgreSQLParser";
import { Opt_c_includeContext } from "./PostgreSQLParser"; import { Opt_c_includeContext } from "./PostgreSQLParser";
import { Key_matchContext } from "./PostgreSQLParser"; import { Key_matchContext } from "./PostgreSQLParser";
import { ExclusionconstraintlistContext } from "./PostgreSQLParser"; import { ExclusionconstraintlistContext } from "./PostgreSQLParser";
@ -287,6 +289,9 @@ import { Object_type_any_nameContext } from "./PostgreSQLParser";
import { Object_type_nameContext } from "./PostgreSQLParser"; import { Object_type_nameContext } from "./PostgreSQLParser";
import { Object_type_name_on_any_nameContext } from "./PostgreSQLParser"; import { Object_type_name_on_any_nameContext } from "./PostgreSQLParser";
import { Any_name_listContext } from "./PostgreSQLParser"; import { Any_name_listContext } from "./PostgreSQLParser";
import { Table_column_nameContext } from "./PostgreSQLParser";
import { Relation_column_nameContext } from "./PostgreSQLParser";
import { Relation_nameContext } from "./PostgreSQLParser";
import { Any_nameContext } from "./PostgreSQLParser"; import { Any_nameContext } from "./PostgreSQLParser";
import { AttrsContext } from "./PostgreSQLParser"; import { AttrsContext } from "./PostgreSQLParser";
import { Type_name_listContext } from "./PostgreSQLParser"; import { Type_name_listContext } from "./PostgreSQLParser";
@ -668,8 +673,10 @@ import { Qual_opContext } from "./PostgreSQLParser";
import { Qual_all_opContext } from "./PostgreSQLParser"; import { Qual_all_opContext } from "./PostgreSQLParser";
import { Subquery_OpContext } from "./PostgreSQLParser"; import { Subquery_OpContext } from "./PostgreSQLParser";
import { Expr_listContext } from "./PostgreSQLParser"; import { Expr_listContext } from "./PostgreSQLParser";
import { Column_expr_list_noparenContext } from "./PostgreSQLParser";
import { Column_expr_listContext } from "./PostgreSQLParser"; import { Column_expr_listContext } from "./PostgreSQLParser";
import { Column_exprContext } from "./PostgreSQLParser"; import { Column_exprContext } from "./PostgreSQLParser";
import { Column_expr_noparenContext } from "./PostgreSQLParser";
import { Func_arg_listContext } from "./PostgreSQLParser"; import { Func_arg_listContext } from "./PostgreSQLParser";
import { Func_arg_exprContext } from "./PostgreSQLParser"; import { Func_arg_exprContext } from "./PostgreSQLParser";
import { Type_listContext } from "./PostgreSQLParser"; import { Type_listContext } from "./PostgreSQLParser";
@ -717,6 +724,8 @@ import { Routine_name_createContext } from "./PostgreSQLParser";
import { Routine_nameContext } from "./PostgreSQLParser"; import { Routine_nameContext } from "./PostgreSQLParser";
import { Procedure_nameContext } from "./PostgreSQLParser"; import { Procedure_nameContext } from "./PostgreSQLParser";
import { Procedure_name_createContext } from "./PostgreSQLParser"; import { Procedure_name_createContext } from "./PostgreSQLParser";
import { Column_nameContext } from "./PostgreSQLParser";
import { Column_name_createContext } from "./PostgreSQLParser";
import { NameContext } from "./PostgreSQLParser"; import { NameContext } from "./PostgreSQLParser";
import { Attr_nameContext } from "./PostgreSQLParser"; import { Attr_nameContext } from "./PostgreSQLParser";
import { File_nameContext } from "./PostgreSQLParser"; import { File_nameContext } from "./PostgreSQLParser";
@ -742,6 +751,7 @@ import { Exclude_elementContext } from "./PostgreSQLParser";
import { Index_paramentersContext } from "./PostgreSQLParser"; import { Index_paramentersContext } from "./PostgreSQLParser";
import { Type_function_nameContext } from "./PostgreSQLParser"; import { Type_function_nameContext } from "./PostgreSQLParser";
import { Type_usual_nameContext } from "./PostgreSQLParser"; import { Type_usual_nameContext } from "./PostgreSQLParser";
import { Nonreservedword_columnContext } from "./PostgreSQLParser";
import { NonreservedwordContext } from "./PostgreSQLParser"; import { NonreservedwordContext } from "./PostgreSQLParser";
import { CollabelContext } from "./PostgreSQLParser"; import { CollabelContext } from "./PostgreSQLParser";
import { IdentifierContext } from "./PostgreSQLParser"; import { IdentifierContext } from "./PostgreSQLParser";
@ -845,6 +855,7 @@ import { Join_conditionContext } from "./PostgreSQLParser";
import { Merge_when_clauseContext } from "./PostgreSQLParser"; import { Merge_when_clauseContext } from "./PostgreSQLParser";
import { Merge_insertContext } from "./PostgreSQLParser"; import { Merge_insertContext } from "./PostgreSQLParser";
import { Merge_updateContext } from "./PostgreSQLParser"; import { Merge_updateContext } from "./PostgreSQLParser";
import { Default_values_or_valuesContext } from "./PostgreSQLParser";
import { ExprofdefaultlistContext } from "./PostgreSQLParser"; import { ExprofdefaultlistContext } from "./PostgreSQLParser";
import { ExprofdefaultContext } from "./PostgreSQLParser"; import { ExprofdefaultContext } from "./PostgreSQLParser";
import { Stmt_closeContext } from "./PostgreSQLParser"; import { Stmt_closeContext } from "./PostgreSQLParser";
@ -1207,6 +1218,13 @@ export interface PostgreSQLParserVisitor<Result> extends ParseTreeVisitor<Result
*/ */
visitIso_level?: (ctx: Iso_levelContext) => Result; visitIso_level?: (ctx: Iso_levelContext) => Result;
/**
* Visit a parse tree produced by `PostgreSQLParser.opt_boolean_or_string_column`.
* @param ctx the parse tree
* @return the visitor result
*/
visitOpt_boolean_or_string_column?: (ctx: Opt_boolean_or_string_columnContext) => Result;
/** /**
* Visit a parse tree produced by `PostgreSQLParser.opt_boolean_or_string`. * Visit a parse tree produced by `PostgreSQLParser.opt_boolean_or_string`.
* @param ctx the parse tree * @param ctx the parse tree
@ -1228,6 +1246,13 @@ export interface PostgreSQLParserVisitor<Result> extends ParseTreeVisitor<Result
*/ */
visitOpt_encoding?: (ctx: Opt_encodingContext) => Result; visitOpt_encoding?: (ctx: Opt_encodingContext) => Result;
/**
* Visit a parse tree produced by `PostgreSQLParser.nonreservedword_or_sconst_column`.
* @param ctx the parse tree
* @return the visitor result
*/
visitNonreservedword_or_sconst_column?: (ctx: Nonreservedword_or_sconst_columnContext) => Result;
/** /**
* Visit a parse tree produced by `PostgreSQLParser.nonreservedword_or_sconst`. * Visit a parse tree produced by `PostgreSQLParser.nonreservedword_or_sconst`.
* @param ctx the parse tree * @param ctx the parse tree
@ -1669,6 +1694,13 @@ export interface PostgreSQLParserVisitor<Result> extends ParseTreeVisitor<Result
*/ */
visitTypedtableelement?: (ctx: TypedtableelementContext) => Result; visitTypedtableelement?: (ctx: TypedtableelementContext) => Result;
/**
* Visit a parse tree produced by `PostgreSQLParser.columnDefCluase`.
* @param ctx the parse tree
* @return the visitor result
*/
visitColumnDefCluase?: (ctx: ColumnDefCluaseContext) => Result;
/** /**
* Visit a parse tree produced by `PostgreSQLParser.columnDef`. * Visit a parse tree produced by `PostgreSQLParser.columnDef`.
* @param ctx the parse tree * @param ctx the parse tree
@ -1802,13 +1834,6 @@ export interface PostgreSQLParserVisitor<Result> extends ParseTreeVisitor<Result
*/ */
visitColumnlist?: (ctx: ColumnlistContext) => Result; visitColumnlist?: (ctx: ColumnlistContext) => Result;
/**
* Visit a parse tree produced by `PostgreSQLParser.columnElem`.
* @param ctx the parse tree
* @return the visitor result
*/
visitColumnElem?: (ctx: ColumnElemContext) => Result;
/** /**
* Visit a parse tree produced by `PostgreSQLParser.opt_c_include`. * Visit a parse tree produced by `PostgreSQLParser.opt_c_include`.
* @param ctx the parse tree * @param ctx the parse tree
@ -2880,6 +2905,27 @@ export interface PostgreSQLParserVisitor<Result> extends ParseTreeVisitor<Result
*/ */
visitAny_name_list?: (ctx: Any_name_listContext) => Result; visitAny_name_list?: (ctx: Any_name_listContext) => Result;
/**
* Visit a parse tree produced by `PostgreSQLParser.table_column_name`.
* @param ctx the parse tree
* @return the visitor result
*/
visitTable_column_name?: (ctx: Table_column_nameContext) => Result;
/**
* Visit a parse tree produced by `PostgreSQLParser.relation_column_name`.
* @param ctx the parse tree
* @return the visitor result
*/
visitRelation_column_name?: (ctx: Relation_column_nameContext) => Result;
/**
* Visit a parse tree produced by `PostgreSQLParser.relation_name`.
* @param ctx the parse tree
* @return the visitor result
*/
visitRelation_name?: (ctx: Relation_nameContext) => Result;
/** /**
* Visit a parse tree produced by `PostgreSQLParser.any_name`. * Visit a parse tree produced by `PostgreSQLParser.any_name`.
* @param ctx the parse tree * @param ctx the parse tree
@ -5547,6 +5593,13 @@ export interface PostgreSQLParserVisitor<Result> extends ParseTreeVisitor<Result
*/ */
visitExpr_list?: (ctx: Expr_listContext) => Result; visitExpr_list?: (ctx: Expr_listContext) => Result;
/**
* Visit a parse tree produced by `PostgreSQLParser.column_expr_list_noparen`.
* @param ctx the parse tree
* @return the visitor result
*/
visitColumn_expr_list_noparen?: (ctx: Column_expr_list_noparenContext) => Result;
/** /**
* Visit a parse tree produced by `PostgreSQLParser.column_expr_list`. * Visit a parse tree produced by `PostgreSQLParser.column_expr_list`.
* @param ctx the parse tree * @param ctx the parse tree
@ -5561,6 +5614,13 @@ export interface PostgreSQLParserVisitor<Result> extends ParseTreeVisitor<Result
*/ */
visitColumn_expr?: (ctx: Column_exprContext) => Result; visitColumn_expr?: (ctx: Column_exprContext) => Result;
/**
* Visit a parse tree produced by `PostgreSQLParser.column_expr_noparen`.
* @param ctx the parse tree
* @return the visitor result
*/
visitColumn_expr_noparen?: (ctx: Column_expr_noparenContext) => Result;
/** /**
* Visit a parse tree produced by `PostgreSQLParser.func_arg_list`. * Visit a parse tree produced by `PostgreSQLParser.func_arg_list`.
* @param ctx the parse tree * @param ctx the parse tree
@ -5890,6 +5950,20 @@ export interface PostgreSQLParserVisitor<Result> extends ParseTreeVisitor<Result
*/ */
visitProcedure_name_create?: (ctx: Procedure_name_createContext) => Result; visitProcedure_name_create?: (ctx: Procedure_name_createContext) => Result;
/**
* Visit a parse tree produced by `PostgreSQLParser.column_name`.
* @param ctx the parse tree
* @return the visitor result
*/
visitColumn_name?: (ctx: Column_nameContext) => Result;
/**
* Visit a parse tree produced by `PostgreSQLParser.column_name_create`.
* @param ctx the parse tree
* @return the visitor result
*/
visitColumn_name_create?: (ctx: Column_name_createContext) => Result;
/** /**
* Visit a parse tree produced by `PostgreSQLParser.name`. * Visit a parse tree produced by `PostgreSQLParser.name`.
* @param ctx the parse tree * @param ctx the parse tree
@ -6065,6 +6139,13 @@ export interface PostgreSQLParserVisitor<Result> extends ParseTreeVisitor<Result
*/ */
visitType_usual_name?: (ctx: Type_usual_nameContext) => Result; visitType_usual_name?: (ctx: Type_usual_nameContext) => Result;
/**
* Visit a parse tree produced by `PostgreSQLParser.nonreservedword_column`.
* @param ctx the parse tree
* @return the visitor result
*/
visitNonreservedword_column?: (ctx: Nonreservedword_columnContext) => Result;
/** /**
* Visit a parse tree produced by `PostgreSQLParser.nonreservedword`. * Visit a parse tree produced by `PostgreSQLParser.nonreservedword`.
* @param ctx the parse tree * @param ctx the parse tree
@ -6786,6 +6867,13 @@ export interface PostgreSQLParserVisitor<Result> extends ParseTreeVisitor<Result
*/ */
visitMerge_update?: (ctx: Merge_updateContext) => Result; visitMerge_update?: (ctx: Merge_updateContext) => Result;
/**
* Visit a parse tree produced by `PostgreSQLParser.default_values_or_values`.
* @param ctx the parse tree
* @return the visitor result
*/
visitDefault_values_or_values?: (ctx: Default_values_or_valuesContext) => Result;
/** /**
* Visit a parse tree produced by `PostgreSQLParser.exprofdefaultlist`. * Visit a parse tree produced by `PostgreSQLParser.exprofdefaultlist`.
* @param ctx the parse tree * @param ctx the parse tree

View File

@ -33,6 +33,8 @@ export default class PostgresSQL extends BasicParser<
PostgreSQLParser.RULE_database_name, // database name PostgreSQLParser.RULE_database_name, // database name
PostgreSQLParser.RULE_procedure_name_create, // procedure name that will be created PostgreSQLParser.RULE_procedure_name_create, // procedure name that will be created
PostgreSQLParser.RULE_procedure_name, // procedure name PostgreSQLParser.RULE_procedure_name, // procedure name
PostgreSQLParser.RULE_column_name_create, // column name that will be created
PostgreSQLParser.RULE_column_name, // column name
]); ]);
protected get splitListener() { protected get splitListener() {
@ -105,6 +107,14 @@ export default class PostgresSQL extends BasicParser<
syntaxContextType = SyntaxContextType.PROCEDURE; syntaxContextType = SyntaxContextType.PROCEDURE;
break; break;
} }
case PostgreSQLParser.RULE_column_name_create: {
syntaxContextType = SyntaxContextType.COLUMN_CREATE;
break;
}
case PostgreSQLParser.RULE_column_name: {
syntaxContextType = SyntaxContextType.COLUMN;
break;
}
default: default:
break; break;
} }

View File

@ -1,10 +1,10 @@
CREATE TABLE db. (); CREATE TABLE db.s (column_name int) PARTITION BY LIST (column_name);
INSERT INTO db.tb ; INSERT INTO db.tb ;
SELECT * FROM db. ; SELECT * FROM db. ;
ALTER TABLE db ; ALTER TABLE db ALTER column_name DROP NOT NULL;
CREATE OR REPLACE VIEW db.v; CREATE OR REPLACE VIEW db.v;
@ -28,4 +28,50 @@ DROP SCHEMA IF EXISTS sch;
ALTER SCHEMA name RENAME TO new_name; ALTER SCHEMA name RENAME TO new_name;
ALTER FOREIGN TABLE table_name RENAME column_name TO new_column_name;
ALTER MATERIALIZED VIEW view_name RENAME COLUMN column_name TO new_column_name;
ALTER MATERIALIZED VIEW view_name ALTER column_name SET STATISTICS 45;
ALTER PUBLICATION name ADD TABLE table_name ( column_name);
ALTER SEQUENCE name OWNED BY table_name.column_name;
ALTER TABLE db RENAME column_name TO new_column_name;
ANALYZE table_name (column_name);
COMMENT ON COLUMN relation_name.column_name IS NULL;
COPY table_name (col_name, col_name2) FROM 'filename' WITH (FORCE_QUOTE (clumn_name));
CREATE FOREIGN TABLE table_name (column_name int) SERVER server_name;
CREATE FUNCTION name (int) RETURNS TABLE (column_name column_type) LANGUAGE lang_name;
CREATE INDEX ON table_name (column_name) INCLUDE (col_name1, col_name2);
CREATE MATERIALIZED VIEW table_name (col_name);
CREATE STATISTICS ON column_name FROM table_name;
CREATE TRIGGER name AFTER UPDATE OF column_name ON table_name EXECUTE FUNCTION function_name;
GRANT SELECT ( column_name) ON table_name TO role_specification;
INSERT INTO table_name (column_name) DEFAULT VALUES ON CONFLICT (index_column_name) DO UPDATE SET column_name_exp = DEFAULT;
MERGE INTO wines w USING wine_stock_changes s ON s.winename = w.winename WHEN NOT MATCHED AND stock_delta > 0 THEN INSERT (col_name) VALUES(s.winename, s.stock_delta);
REVOKE SELECT (co_name) ON table_name FROM PUBLIC;
SECURITY LABEL ON COLUMN tablename.columnname IS string_literal;
WITH with_query_name (col_name) AS (SELECT id FROM table_expression) SEARCH DEPTH FIRST BY column_name SET column_name CYCLE col_name SET col_name USING col_name SELECT;
UPDATE tablename SET columnname = a + b, (col1, col2) = (a+3, b+4);
VACUUM tablename (col1, col2);
SELECT * FROM db.tbs GROUP BY (col1, col2) ORDER BY col3;

View File

@ -52,7 +52,7 @@ describe('Postgre SQL Syntax Suggestion', () => {
expect(suggestion?.wordRanges.map((token) => token.text)).toEqual(['db']); expect(suggestion?.wordRanges.map((token) => token.text)).toEqual(['db']);
}); });
test('Select table ', () => { test('Select table', () => {
const pos: CaretPosition = { const pos: CaretPosition = {
lineNumber: 5, lineNumber: 5,
column: 18, column: 18,
@ -72,18 +72,44 @@ describe('Postgre SQL Syntax Suggestion', () => {
test('Create table ', () => { test('Create table ', () => {
const pos: CaretPosition = { const pos: CaretPosition = {
lineNumber: 1, lineNumber: 1,
column: 17, column: 18,
};
const pos1: CaretPosition = {
lineNumber: 1,
column: 31,
};
const pos2: CaretPosition = {
lineNumber: 1,
column: 67,
}; };
const syntaxes = parser.getSuggestionAtCaretPosition( const syntaxes = parser.getSuggestionAtCaretPosition(
commentOtherLine(syntaxSql, pos.lineNumber), commentOtherLine(syntaxSql, pos.lineNumber),
pos pos
)?.syntax; )?.syntax;
const syntaxes1 = parser.getSuggestionAtCaretPosition(
commentOtherLine(syntaxSql, pos1.lineNumber),
pos1
)?.syntax;
const syntaxes2 = parser.getSuggestionAtCaretPosition(
commentOtherLine(syntaxSql, pos2.lineNumber),
pos2
)?.syntax;
const suggestion = syntaxes?.find( const suggestion = syntaxes?.find(
(syn) => syn.syntaxContextType === SyntaxContextType.TABLE_CREATE (syn) => syn.syntaxContextType === SyntaxContextType.TABLE_CREATE
); );
const suggestion1 = syntaxes1?.find(
(syn) => syn.syntaxContextType === SyntaxContextType.COLUMN
);
const suggestion2 = syntaxes2?.find(
(syn) => syn.syntaxContextType === SyntaxContextType.COLUMN
);
expect(suggestion).not.toBeUndefined(); expect(suggestion).not.toBeUndefined();
expect(suggestion?.wordRanges.map((token) => token.text)).toEqual(['db', '.']); expect(suggestion?.wordRanges.map((token) => token.text)).toEqual(['db', '.', 's']);
expect(suggestion1).not.toBeUndefined();
expect(suggestion1?.wordRanges.map((token) => token.text)).toEqual(['column_name']);
expect(suggestion2).not.toBeUndefined();
expect(suggestion2?.wordRanges.map((token) => token.text)).toEqual(['column_name']);
}); });
test('Create view ', () => { test('Create view ', () => {
@ -272,4 +298,668 @@ describe('Postgre SQL Syntax Suggestion', () => {
expect(suggestion).not.toBeUndefined(); expect(suggestion).not.toBeUndefined();
expect(suggestion?.wordRanges.map((token) => token.text)).toEqual(['name']); expect(suggestion?.wordRanges.map((token) => token.text)).toEqual(['name']);
}); });
test('Alter Foreign Table With Column', () => {
const pos: CaretPosition = {
lineNumber: 31,
column: 50,
};
const posCreate: CaretPosition = {
lineNumber: 31,
column: 69,
};
const syntaxes = parser.getSuggestionAtCaretPosition(
commentOtherLine(syntaxSql, pos.lineNumber),
pos
)?.syntax;
const syntaxesCreate = parser.getSuggestionAtCaretPosition(
commentOtherLine(syntaxSql, posCreate.lineNumber),
posCreate
)?.syntax;
const suggestion = syntaxes?.find(
(syn) => syn.syntaxContextType === SyntaxContextType.COLUMN
);
const suggestionCreate = syntaxesCreate?.find(
(syn) => syn.syntaxContextType === SyntaxContextType.COLUMN_CREATE
);
expect(suggestion).not.toBeUndefined();
expect(suggestion?.wordRanges.map((token) => token.text)).toEqual(['column_name']);
expect(suggestionCreate).not.toBeUndefined();
expect(suggestionCreate?.wordRanges.map((token) => token.text)).toEqual([
'new_column_name',
]);
});
test('Alter MATERIALIZED VIEW With Column', () => {
const pos: CaretPosition = {
lineNumber: 33,
column: 60,
};
const posCreate: CaretPosition = {
lineNumber: 33,
column: 79,
};
const posAction: CaretPosition = {
lineNumber: 35,
column: 52,
};
const syntaxes = parser.getSuggestionAtCaretPosition(
commentOtherLine(syntaxSql, pos.lineNumber),
pos
)?.syntax;
const syntaxesCreate = parser.getSuggestionAtCaretPosition(
commentOtherLine(syntaxSql, posCreate.lineNumber),
posCreate
)?.syntax;
const syntaxesAction = parser.getSuggestionAtCaretPosition(
commentOtherLine(syntaxSql, posAction.lineNumber),
posAction
)?.syntax;
const suggestion = syntaxes?.find(
(syn) => syn.syntaxContextType === SyntaxContextType.COLUMN
);
const suggestionCreate = syntaxesCreate?.find(
(syn) => syn.syntaxContextType === SyntaxContextType.COLUMN_CREATE
);
const suggestionAction = syntaxesAction?.find(
(syn) => syn.syntaxContextType === SyntaxContextType.COLUMN
);
expect(suggestion).not.toBeUndefined();
expect(suggestion?.wordRanges.map((token) => token.text)).toEqual(['column_name']);
expect(suggestionCreate).not.toBeUndefined();
expect(suggestionCreate?.wordRanges.map((token) => token.text)).toEqual([
'new_column_name',
]);
expect(suggestionAction).not.toBeUndefined();
expect(suggestionAction?.wordRanges.map((token) => token.text)).toEqual(['column_name']);
});
test('Alter PUBLICATION With Column', () => {
const pos: CaretPosition = {
lineNumber: 37,
column: 58,
};
const syntaxes = parser.getSuggestionAtCaretPosition(
commentOtherLine(syntaxSql, pos.lineNumber),
pos
)?.syntax;
const suggestion = syntaxes?.find(
(syn) => syn.syntaxContextType === SyntaxContextType.COLUMN
);
expect(suggestion).not.toBeUndefined();
expect(suggestion?.wordRanges.map((token) => token.text)).toEqual(['column_name']);
});
test('Alter SEQUENCE With Column', () => {
const pos: CaretPosition = {
lineNumber: 39,
column: 52,
};
const syntaxes = parser.getSuggestionAtCaretPosition(
commentOtherLine(syntaxSql, pos.lineNumber),
pos
)?.syntax;
const suggestion = syntaxes?.find(
(syn) => syn.syntaxContextType === SyntaxContextType.COLUMN
);
expect(suggestion).not.toBeUndefined();
expect(suggestion?.wordRanges.map((token) => token.text)).toEqual(['column_name']);
});
test('Alter Table With Column', () => {
const pos: CaretPosition = {
lineNumber: 7,
column: 33,
};
const posCreate: CaretPosition = {
lineNumber: 41,
column: 34,
};
const posAction: CaretPosition = {
lineNumber: 41,
column: 53,
};
const syntaxes = parser.getSuggestionAtCaretPosition(
commentOtherLine(syntaxSql, pos.lineNumber),
pos
)?.syntax;
const syntaxesCreate = parser.getSuggestionAtCaretPosition(
commentOtherLine(syntaxSql, posCreate.lineNumber),
posCreate
)?.syntax;
const syntaxesAction = parser.getSuggestionAtCaretPosition(
commentOtherLine(syntaxSql, posAction.lineNumber),
posAction
)?.syntax;
const suggestion = syntaxes?.find(
(syn) => syn.syntaxContextType === SyntaxContextType.COLUMN
);
const suggestionCreate = syntaxesCreate?.find(
(syn) => syn.syntaxContextType === SyntaxContextType.COLUMN
);
const suggestionAction = syntaxesAction?.find(
(syn) => syn.syntaxContextType === SyntaxContextType.COLUMN_CREATE
);
expect(suggestion).not.toBeUndefined();
expect(suggestion?.wordRanges.map((token) => token.text)).toEqual(['column_name']);
expect(suggestionCreate).not.toBeUndefined();
expect(suggestionCreate?.wordRanges.map((token) => token.text)).toEqual(['column_name']);
expect(suggestionAction).not.toBeUndefined();
expect(suggestionAction?.wordRanges.map((token) => token.text)).toEqual([
'new_column_name',
]);
});
test('ANALYZE With Column', () => {
const pos: CaretPosition = {
lineNumber: 43,
column: 32,
};
const syntaxes = parser.getSuggestionAtCaretPosition(
commentOtherLine(syntaxSql, pos.lineNumber),
pos
)?.syntax;
const suggestion = syntaxes?.find(
(syn) => syn.syntaxContextType === SyntaxContextType.COLUMN
);
expect(suggestion).not.toBeUndefined();
expect(suggestion?.wordRanges.map((token) => token.text)).toEqual(['column_name']);
});
test('Comment On With Column', () => {
const pos: CaretPosition = {
lineNumber: 45,
column: 44,
};
const syntaxes = parser.getSuggestionAtCaretPosition(
commentOtherLine(syntaxSql, pos.lineNumber),
pos
)?.syntax;
const suggestion = syntaxes?.find(
(syn) => syn.syntaxContextType === SyntaxContextType.COLUMN
);
expect(suggestion).not.toBeUndefined();
expect(suggestion?.wordRanges.map((token) => token.text)).toEqual(['column_name']);
});
test('Copy With Column', () => {
const pos: CaretPosition = {
lineNumber: 47,
column: 26,
};
const pos1: CaretPosition = {
lineNumber: 47,
column: 37,
};
const pos2: CaretPosition = {
lineNumber: 47,
column: 84,
};
const syntaxes = parser.getSuggestionAtCaretPosition(
commentOtherLine(syntaxSql, pos.lineNumber),
pos
)?.syntax;
const syntaxes1 = parser.getSuggestionAtCaretPosition(
commentOtherLine(syntaxSql, pos1.lineNumber),
pos1
)?.syntax;
const syntaxes2 = parser.getSuggestionAtCaretPosition(
commentOtherLine(syntaxSql, pos2.lineNumber),
pos2
)?.syntax;
const suggestion = syntaxes?.find(
(syn) => syn.syntaxContextType === SyntaxContextType.COLUMN
);
const suggestion1 = syntaxes1?.find(
(syn) => syn.syntaxContextType === SyntaxContextType.COLUMN
);
const suggestion2 = syntaxes2?.find(
(syn) => syn.syntaxContextType === SyntaxContextType.COLUMN
);
expect(suggestion).not.toBeUndefined();
expect(suggestion?.wordRanges.map((token) => token.text)).toEqual(['col_name']);
expect(suggestion1).not.toBeUndefined();
expect(suggestion1?.wordRanges.map((token) => token.text)).toEqual(['col_name2']);
expect(suggestion2).not.toBeUndefined();
expect(suggestion2?.wordRanges.map((token) => token.text)).toEqual(['clumn_name']);
});
test('Create Foreign Table With Column', () => {
const pos: CaretPosition = {
lineNumber: 49,
column: 45,
};
const syntaxes = parser.getSuggestionAtCaretPosition(
commentOtherLine(syntaxSql, pos.lineNumber),
pos
)?.syntax;
const suggestion = syntaxes?.find(
(syn) => syn.syntaxContextType === SyntaxContextType.COLUMN
);
expect(suggestion).not.toBeUndefined();
expect(suggestion?.wordRanges.map((token) => token.text)).toEqual(['column_name']);
});
test('Create Function With Column', () => {
const pos: CaretPosition = {
lineNumber: 51,
column: 54,
};
const syntaxes = parser.getSuggestionAtCaretPosition(
commentOtherLine(syntaxSql, pos.lineNumber),
pos
)?.syntax;
const suggestion = syntaxes?.find(
(syn) => syn.syntaxContextType === SyntaxContextType.COLUMN
);
expect(suggestion).not.toBeUndefined();
expect(suggestion?.wordRanges.map((token) => token.text)).toEqual(['column_name']);
});
test('Create Index With Column', () => {
const pos: CaretPosition = {
lineNumber: 53,
column: 40,
};
const pos1: CaretPosition = {
lineNumber: 53,
column: 60,
};
const pos2: CaretPosition = {
lineNumber: 53,
column: 71,
};
const syntaxes = parser.getSuggestionAtCaretPosition(
commentOtherLine(syntaxSql, pos.lineNumber),
pos
)?.syntax;
const syntaxes1 = parser.getSuggestionAtCaretPosition(
commentOtherLine(syntaxSql, pos1.lineNumber),
pos1
)?.syntax;
const syntaxes2 = parser.getSuggestionAtCaretPosition(
commentOtherLine(syntaxSql, pos2.lineNumber),
pos2
)?.syntax;
const suggestion = syntaxes?.find(
(syn) => syn.syntaxContextType === SyntaxContextType.COLUMN
);
const suggestion1 = syntaxes1?.find(
(syn) => syn.syntaxContextType === SyntaxContextType.COLUMN
);
const suggestion2 = syntaxes2?.find(
(syn) => syn.syntaxContextType === SyntaxContextType.COLUMN
);
expect(suggestion).not.toBeUndefined();
expect(suggestion?.wordRanges.map((token) => token.text)).toEqual(['column_name']);
expect(suggestion1).not.toBeUndefined();
expect(suggestion1?.wordRanges.map((token) => token.text)).toEqual(['col_name1']);
expect(suggestion2).not.toBeUndefined();
expect(suggestion2?.wordRanges.map((token) => token.text)).toEqual(['col_name2']);
});
test('Create MATERIALIZED VIEW With Column', () => {
const pos: CaretPosition = {
lineNumber: 55,
column: 46,
};
const syntaxes = parser.getSuggestionAtCaretPosition(
commentOtherLine(syntaxSql, pos.lineNumber),
pos
)?.syntax;
const suggestion = syntaxes?.find(
(syn) => syn.syntaxContextType === SyntaxContextType.COLUMN
);
expect(suggestion).not.toBeUndefined();
expect(suggestion?.wordRanges.map((token) => token.text)).toEqual(['col_name']);
});
test('Create STATISTICS With Column', () => {
const pos: CaretPosition = {
lineNumber: 57,
column: 33,
};
const syntaxes = parser.getSuggestionAtCaretPosition(
commentOtherLine(syntaxSql, pos.lineNumber),
pos
)?.syntax;
const suggestion = syntaxes?.find(
(syn) => syn.syntaxContextType === SyntaxContextType.COLUMN
);
expect(suggestion).not.toBeUndefined();
expect(suggestion?.wordRanges.map((token) => token.text)).toEqual(['column_name']);
});
test('Create TRIGGER With Column', () => {
const pos: CaretPosition = {
lineNumber: 59,
column: 48,
};
const pos1: CaretPosition = {
lineNumber: 59,
column: 93,
};
const syntaxes = parser.getSuggestionAtCaretPosition(
commentOtherLine(syntaxSql, pos.lineNumber),
pos
)?.syntax;
const syntaxes1 = parser.getSuggestionAtCaretPosition(
commentOtherLine(syntaxSql, pos1.lineNumber),
pos1
)?.syntax;
const suggestion = syntaxes?.find(
(syn) => syn.syntaxContextType === SyntaxContextType.COLUMN
);
const suggestion1 = syntaxes1?.find(
(syn) => syn.syntaxContextType === SyntaxContextType.FUNCTION
);
expect(suggestion).not.toBeUndefined();
expect(suggestion?.wordRanges.map((token) => token.text)).toEqual(['column_name']);
expect(suggestion1).not.toBeUndefined();
expect(suggestion1?.wordRanges.map((token) => token.text)).toEqual(['function_name']);
});
test('GRANT With Column', () => {
const pos: CaretPosition = {
lineNumber: 61,
column: 27,
};
const syntaxes = parser.getSuggestionAtCaretPosition(
commentOtherLine(syntaxSql, pos.lineNumber),
pos
)?.syntax;
const suggestion = syntaxes?.find(
(syn) => syn.syntaxContextType === SyntaxContextType.COLUMN
);
expect(suggestion).not.toBeUndefined();
expect(suggestion?.wordRanges.map((token) => token.text)).toEqual(['column_name']);
});
test('Insert Into With Column', () => {
const pos: CaretPosition = {
lineNumber: 63,
column: 36,
};
const pos1: CaretPosition = {
lineNumber: 63,
column: 83,
};
const pos2: CaretPosition = {
lineNumber: 63,
column: 114,
};
const syntaxes = parser.getSuggestionAtCaretPosition(
commentOtherLine(syntaxSql, pos.lineNumber),
pos
)?.syntax;
const syntaxes1 = parser.getSuggestionAtCaretPosition(
commentOtherLine(syntaxSql, pos1.lineNumber),
pos1
)?.syntax;
const syntaxes2 = parser.getSuggestionAtCaretPosition(
commentOtherLine(syntaxSql, pos2.lineNumber),
pos2
)?.syntax;
const suggestion = syntaxes?.find(
(syn) => syn.syntaxContextType === SyntaxContextType.COLUMN
);
const suggestion1 = syntaxes1?.find(
(syn) => syn.syntaxContextType === SyntaxContextType.COLUMN
);
const suggestion2 = syntaxes2?.find(
(syn) => syn.syntaxContextType === SyntaxContextType.COLUMN
);
expect(suggestion).not.toBeUndefined();
expect(suggestion?.wordRanges.map((token) => token.text)).toEqual(['column_name']);
expect(suggestion1).not.toBeUndefined();
expect(suggestion1?.wordRanges.map((token) => token.text)).toEqual(['index_column_name']);
expect(suggestion2).not.toBeUndefined();
expect(suggestion2?.wordRanges.map((token) => token.text)).toEqual(['column_name_exp']);
});
test('Merge With Column', () => {
const pos: CaretPosition = {
lineNumber: 65,
column: 132,
};
const syntaxes = parser.getSuggestionAtCaretPosition(
commentOtherLine(syntaxSql, pos.lineNumber),
pos
)?.syntax;
const suggestion = syntaxes?.find(
(syn) => syn.syntaxContextType === SyntaxContextType.COLUMN
);
expect(suggestion).not.toBeUndefined();
expect(suggestion?.wordRanges.map((token) => token.text)).toEqual(['col_name']);
});
test('REVOKE With Column', () => {
const pos: CaretPosition = {
lineNumber: 67,
column: 23,
};
const syntaxes = parser.getSuggestionAtCaretPosition(
commentOtherLine(syntaxSql, pos.lineNumber),
pos
)?.syntax;
const suggestion = syntaxes?.find(
(syn) => syn.syntaxContextType === SyntaxContextType.COLUMN
);
expect(suggestion).not.toBeUndefined();
expect(suggestion?.wordRanges.map((token) => token.text)).toEqual(['co_name']);
});
test('SECURITY With Column', () => {
const pos: CaretPosition = {
lineNumber: 69,
column: 46,
};
const syntaxes = parser.getSuggestionAtCaretPosition(
commentOtherLine(syntaxSql, pos.lineNumber),
pos
)?.syntax;
const suggestion = syntaxes?.find(
(syn) => syn.syntaxContextType === SyntaxContextType.COLUMN
);
expect(suggestion).not.toBeUndefined();
expect(suggestion?.wordRanges.map((token) => token.text)).toEqual(['columnname']);
});
test('Select With Column', () => {
const pos: CaretPosition = {
lineNumber: 71,
column: 31,
};
const pos1: CaretPosition = {
lineNumber: 71,
column: 103,
};
const pos2: CaretPosition = {
lineNumber: 71,
column: 119,
};
const pos3: CaretPosition = {
lineNumber: 71,
column: 134,
};
const pos4: CaretPosition = {
lineNumber: 71,
column: 147,
};
const pos5: CaretPosition = {
lineNumber: 71,
column: 162,
};
const syntaxes = parser.getSuggestionAtCaretPosition(
commentOtherLine(syntaxSql, pos.lineNumber),
pos
)?.syntax;
const syntaxes1 = parser.getSuggestionAtCaretPosition(
commentOtherLine(syntaxSql, pos1.lineNumber),
pos1
)?.syntax;
const syntaxes2 = parser.getSuggestionAtCaretPosition(
commentOtherLine(syntaxSql, pos2.lineNumber),
pos2
)?.syntax;
const syntaxes3 = parser.getSuggestionAtCaretPosition(
commentOtherLine(syntaxSql, pos3.lineNumber),
pos3
)?.syntax;
const syntaxes4 = parser.getSuggestionAtCaretPosition(
commentOtherLine(syntaxSql, pos4.lineNumber),
pos4
)?.syntax;
const syntaxes5 = parser.getSuggestionAtCaretPosition(
commentOtherLine(syntaxSql, pos5.lineNumber),
pos5
)?.syntax;
const suggestion = syntaxes?.find(
(syn) => syn.syntaxContextType === SyntaxContextType.COLUMN
);
const suggestion1 = syntaxes1?.find(
(syn) => syn.syntaxContextType === SyntaxContextType.COLUMN
);
const suggestion2 = syntaxes2?.find(
(syn) => syn.syntaxContextType === SyntaxContextType.COLUMN
);
const suggestion3 = syntaxes3?.find(
(syn) => syn.syntaxContextType === SyntaxContextType.COLUMN
);
const suggestion4 = syntaxes4?.find(
(syn) => syn.syntaxContextType === SyntaxContextType.COLUMN
);
const suggestion5 = syntaxes5?.find(
(syn) => syn.syntaxContextType === SyntaxContextType.COLUMN
);
expect(suggestion).not.toBeUndefined();
expect(suggestion?.wordRanges.map((token) => token.text)).toEqual(['col_name']);
expect(suggestion1).not.toBeUndefined();
expect(suggestion1?.wordRanges.map((token) => token.text)).toEqual(['column_name']);
expect(suggestion2).not.toBeUndefined();
expect(suggestion2?.wordRanges.map((token) => token.text)).toEqual(['column_name']);
expect(suggestion3).not.toBeUndefined();
expect(suggestion3?.wordRanges.map((token) => token.text)).toEqual(['col_name']);
expect(suggestion4).not.toBeUndefined();
expect(suggestion4?.wordRanges.map((token) => token.text)).toEqual(['col_name']);
expect(suggestion5).not.toBeUndefined();
expect(suggestion5?.wordRanges.map((token) => token.text)).toEqual(['col_name']);
});
test('Update With Column', () => {
const pos: CaretPosition = {
lineNumber: 73,
column: 32,
};
const pos1: CaretPosition = {
lineNumber: 73,
column: 47,
};
const pos2: CaretPosition = {
lineNumber: 73,
column: 53,
};
const syntaxes = parser.getSuggestionAtCaretPosition(
commentOtherLine(syntaxSql, pos.lineNumber),
pos
)?.syntax;
const syntaxes1 = parser.getSuggestionAtCaretPosition(
commentOtherLine(syntaxSql, pos1.lineNumber),
pos1
)?.syntax;
const syntaxes2 = parser.getSuggestionAtCaretPosition(
commentOtherLine(syntaxSql, pos2.lineNumber),
pos2
)?.syntax;
const suggestion = syntaxes?.find(
(syn) => syn.syntaxContextType === SyntaxContextType.COLUMN
);
const suggestion1 = syntaxes1?.find(
(syn) => syn.syntaxContextType === SyntaxContextType.COLUMN
);
const suggestion2 = syntaxes2?.find(
(syn) => syn.syntaxContextType === SyntaxContextType.COLUMN
);
expect(suggestion).not.toBeUndefined();
expect(suggestion?.wordRanges.map((token) => token.text)).toEqual(['columnname']);
expect(suggestion1).not.toBeUndefined();
expect(suggestion1?.wordRanges.map((token) => token.text)).toEqual(['col1']);
expect(suggestion2).not.toBeUndefined();
expect(suggestion2?.wordRanges.map((token) => token.text)).toEqual(['col2']);
});
test('Vacuum With Column', () => {
const pos: CaretPosition = {
lineNumber: 75,
column: 23,
};
const pos1: CaretPosition = {
lineNumber: 75,
column: 29,
};
const syntaxes = parser.getSuggestionAtCaretPosition(
commentOtherLine(syntaxSql, pos.lineNumber),
pos
)?.syntax;
const syntaxes1 = parser.getSuggestionAtCaretPosition(
commentOtherLine(syntaxSql, pos1.lineNumber),
pos1
)?.syntax;
const suggestion = syntaxes?.find(
(syn) => syn.syntaxContextType === SyntaxContextType.COLUMN
);
const suggestion1 = syntaxes1?.find(
(syn) => syn.syntaxContextType === SyntaxContextType.COLUMN
);
expect(suggestion).not.toBeUndefined();
expect(suggestion?.wordRanges.map((token) => token.text)).toEqual(['col1']);
expect(suggestion1).not.toBeUndefined();
expect(suggestion1?.wordRanges.map((token) => token.text)).toEqual(['col2']);
});
test('Select table with expression', () => {
const pos1: CaretPosition = {
lineNumber: 77,
column: 36,
};
const pos2: CaretPosition = {
lineNumber: 77,
column: 42,
};
const pos3: CaretPosition = {
lineNumber: 77,
column: 57,
};
const syntaxes1 = parser.getSuggestionAtCaretPosition(
commentOtherLine(syntaxSql, pos1.lineNumber),
pos1
)?.syntax;
const syntaxes2 = parser.getSuggestionAtCaretPosition(
commentOtherLine(syntaxSql, pos2.lineNumber),
pos2
)?.syntax;
const syntaxes3 = parser.getSuggestionAtCaretPosition(
commentOtherLine(syntaxSql, pos3.lineNumber),
pos3
)?.syntax;
const suggestion1 = syntaxes1?.find(
(syn) => syn.syntaxContextType === SyntaxContextType.COLUMN
);
const suggestion2 = syntaxes2?.find(
(syn) => syn.syntaxContextType === SyntaxContextType.COLUMN
);
const suggestion3 = syntaxes3?.find(
(syn) => syn.syntaxContextType === SyntaxContextType.COLUMN
);
expect(suggestion1).not.toBeUndefined();
expect(suggestion1?.wordRanges.map((token) => token.text)).toEqual(['col1']);
expect(suggestion2).not.toBeUndefined();
expect(suggestion2?.wordRanges.map((token) => token.text)).toEqual(['col2']);
expect(suggestion3).not.toBeUndefined();
expect(suggestion3?.wordRanges.map((token) => token.text)).toEqual(['col3']);
});
}); });

View File

@ -181,7 +181,9 @@ MOVE NEXT FROM cursor_name;
WITH query_name (id) AS (SELECT id FROM table_expression) WITH query_name (id) AS (SELECT id FROM table_expression)
MERGE INTO ONLY target_table_name * AS target_alias MERGE INTO ONLY target_table_name * AS target_alias
USING ONLY source_table_name * ON s.winename = w.winename USING ONLY source_table_name * ON s.winename = w.winename
WHEN MATCHED AND s.winename = w.winename THEN UPDATE SET column_name = DEFAULT; WHEN MATCHED AND s.winename = w.winename THEN UPDATE SET column_name = stock + 3
WHEN NOT MATCHED AND stock_delta + stock > 0 THEN INSERT ( column_name) OVERRIDING SYSTEM VALUE VALUES (s.winename)
WHEN MATCHED THEN DELETE;
-- NOTIFY -- NOTIFY
NOTIFY virtual, 'This is the payload'; NOTIFY virtual, 'This is the payload';

View File

@ -13,6 +13,8 @@ WINDOW w AS (PARTITION BY depname ORDER BY salary DESC)
FOR UPDATE OF table_name, table_name2 NOWAIT; FOR UPDATE OF table_name, table_name2 NOWAIT;
SELECT; SELECT;
SELECT * FROM db.tbs GROUP BY (col1 > 3, col2 < 8) ORDER BY col3 > 9;
WITH query_name (id) AS (SELECT id FROM table_expression) SELECT DISTINCT random() AS name1 FROM table_expression WHERE name1=name1 GROUP BY id HAVING sum(len) < interval '5 hours' WINDOW w AS (PARTITION BY depname ORDER BY salary DESC) INTERSECT DISTINCT (SELECT * FROM others) ORDER BY salary ASC LIMIT ALL OFFSET start FETCH NEXT ROW ONLY FOR NO KEY UPDATE; WITH query_name (id) AS (SELECT id FROM table_expression) SELECT DISTINCT random() AS name1 FROM table_expression WHERE name1=name1 GROUP BY id HAVING sum(len) < interval '5 hours' WINDOW w AS (PARTITION BY depname ORDER BY salary DESC) INTERSECT DISTINCT (SELECT * FROM others) ORDER BY salary ASC LIMIT ALL OFFSET start FETCH NEXT ROW ONLY FOR NO KEY UPDATE;
WITH query_name (id) AS (SELECT id FROM table_expression) SELECT DISTINCT ON (col1) random() AS name1 FROM table_expression WHERE name1=name1 GROUP BY id HAVING sum(len) < interval '5 hours' WINDOW w AS (PARTITION BY depname ORDER BY salary DESC) EXCEPT (SELECT * FROM others) ORDER BY salary USING > NULL FIRST LIMIT 40 OFFSET start FETCH NEXT ROW ONLY FOR SHARE; WITH query_name (id) AS (SELECT id FROM table_expression) SELECT DISTINCT ON (col1) random() AS name1 FROM table_expression WHERE name1=name1 GROUP BY id HAVING sum(len) < interval '5 hours' WINDOW w AS (PARTITION BY depname ORDER BY salary DESC) EXCEPT (SELECT * FROM others) ORDER BY salary USING > NULL FIRST LIMIT 40 OFFSET start FETCH NEXT ROW ONLY FOR SHARE;