Improve support of INSERT, COMMENT expressions

pull/315/head
Maksim Novikov 2022-06-12 16:10:27 +07:00
parent 2bce477da0
commit 2685131425
No known key found for this signature in database
GPG Key ID: 2F1C320B72DA6C55
6 changed files with 36514 additions and 34472 deletions

@ -14,6 +14,7 @@ const comparative_operators = [
"<",
"<=",
"<>",
"!=",
"=",
">",
">=",
@ -106,7 +107,7 @@ module.exports = grammar({
kw("COMMENT ON"),
choice(
seq(
choice(kw("EXTENSION"), kw("SCHEMA"), kw("TABLE")),
choice(kw("COLUMN"), kw("EXTENSION"), kw("SCHEMA"), kw("TABLE")),
$._identifier,
),
seq(kw("FUNCTION"), $.function_call),
@ -395,7 +396,11 @@ module.exports = grammar({
choice($._column_default_expression, $.type_cast),
),
table_parameters: $ =>
seq("(", commaSep1(choice($.table_column, $._table_constraint)), ")"),
seq(
"(",
optional(commaSep1(choice($.table_column, $._table_constraint))),
")",
),
mode: $ => choice(kw("NOT DEFERRABLE"), kw("DEFERRABLE")),
initial_mode: $ =>
seq(kw("INITIALLY"), choice(kw("DEFERRED"), kw("IMMEDIATE"))),
@ -449,6 +454,7 @@ module.exports = grammar({
optional(kw("IF NOT EXISTS")),
$._identifier,
$.table_parameters,
optional(kw("WITHOUT OIDS")),
),
using_clause: $ => seq(kw("USING"), field("method", $.identifier)),
index_table_parameters: $ =>
@ -520,6 +526,7 @@ module.exports = grammar({
kw("INSERT"),
kw("INTO"),
$._identifier,
optional(seq("(", commaSep1($._identifier), ")")),
choice($.values_clause, $.select_statement),
),
values_clause: $ => seq(kw("VALUES"), "(", $.values_clause_body, ")"),
@ -610,7 +617,7 @@ module.exports = grammar({
field_access: $ => seq($.identifier, "->>", $.string),
ordered_expression: $ =>
seq($._expression, field("order", choice(kw("ASC"), kw("DESC")))),
array_type: $ => seq($._type, "[", "]"),
array_type: $ => seq($._type, "[", optional($.number), "]"),
_type: $ => choice($.type, $.array_type),
type_cast: $ =>
seq(

157
src/grammar.json vendored

@ -144,6 +144,15 @@
{
"type": "CHOICE",
"members": [
{
"type": "ALIAS",
"content": {
"type": "PATTERN",
"value": "[cC][oO][lL][uU][mM][nN]"
},
"named": false,
"value": "COLUMN"
},
{
"type": "ALIAS",
"content": {
@ -2739,45 +2748,53 @@
"value": "("
},
{
"type": "SEQ",
"type": "CHOICE",
"members": [
{
"type": "CHOICE",
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "table_column"
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "table_column"
},
{
"type": "SYMBOL",
"name": "_table_constraint"
}
]
},
{
"type": "SYMBOL",
"name": "_table_constraint"
}
]
},
{
"type": "REPEAT",
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": ","
},
{
"type": "CHOICE",
"type": "REPEAT",
"content": {
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "table_column"
"type": "STRING",
"value": ","
},
{
"type": "SYMBOL",
"name": "_table_constraint"
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "table_column"
},
{
"type": "SYMBOL",
"name": "_table_constraint"
}
]
}
]
}
]
}
}
]
},
{
"type": "BLANK"
}
]
},
@ -3363,6 +3380,32 @@
{
"type": "SYMBOL",
"name": "table_parameters"
},
{
"type": "CHOICE",
"members": [
{
"type": "ALIAS",
"content": {
"type": "SEQ",
"members": [
{
"type": "PATTERN",
"value": "[wW][iI][tT][hH][oO][uU][tT]"
},
{
"type": "PATTERN",
"value": "[oO][iI][dD][sS]"
}
]
},
"named": false,
"value": "WITHOUT_OIDS"
},
{
"type": "BLANK"
}
]
}
]
},
@ -4071,6 +4114,52 @@
"type": "SYMBOL",
"name": "_identifier"
},
{
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "("
},
{
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "_identifier"
},
{
"type": "REPEAT",
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": ","
},
{
"type": "SYMBOL",
"name": "_identifier"
}
]
}
}
]
},
{
"type": "STRING",
"value": ")"
}
]
},
{
"type": "BLANK"
}
]
},
{
"type": "CHOICE",
"members": [
@ -5085,6 +5174,18 @@
"type": "STRING",
"value": "["
},
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "number"
},
{
"type": "BLANK"
}
]
},
{
"type": "STRING",
"value": "]"
@ -5440,6 +5541,10 @@
"type": "STRING",
"value": "<>"
},
{
"type": "STRING",
"value": "!="
},
{
"type": "STRING",
"value": "="

@ -565,13 +565,17 @@
"named": true,
"fields": {},
"children": {
"multiple": false,
"multiple": true,
"required": true,
"types": [
{
"type": "array_type",
"named": true
},
{
"type": "number",
"named": true
},
{
"type": "type",
"named": true
@ -801,6 +805,10 @@
"multiple": false,
"required": true,
"types": [
{
"type": "!=",
"named": false
},
{
"type": "!~",
"named": false
@ -4059,7 +4067,7 @@
},
"children": {
"multiple": true,
"required": true,
"required": false,
"types": [
{
"type": "check",
@ -4748,6 +4756,10 @@
"type": "!!",
"named": false
},
{
"type": "!=",
"named": false
},
{
"type": "!~",
"named": false
@ -5384,6 +5396,10 @@
"type": "WITHOUT",
"named": false
},
{
"type": "WITHOUT_OIDS",
"named": false
},
{
"type": "WITH_GRANT_OPTION",
"named": false

70787
src/parser.c vendored

File diff suppressed because it is too large Load Diff

@ -3,6 +3,9 @@ INSERT statement
================================================================================
INSERT INTO table1 VALUES (1, 'test')
INSERT INTO table1 (col1) VALUES (1)
INSERT INTO table1 ("Foo 1") VALUES (1)
INSERT INTO table1 ("Foo 1", bar) VALUES (1, 2)
INSERT INTO table2 SELECT * FROM generate_series(1, 100, 1);
--------------------------------------------------------------------------------

@ -868,8 +868,9 @@ CREATE INDEX foo_idx ON table1 (col2 DESC);
CREATE TABLE
================================================================================
CREATE TABLE my_table (col1 INT, col2 INT)
CREATE TEMPORARY TABLE my_table2 (col1 INT, col2 INT)
CREATE TABLE my_table (col1 INT, col2 INT);
CREATE TABLE my_table () WITHOUT OIDS;
CREATE TEMPORARY TABLE my_table2 (col1 INT, col2 INT);
--------------------------------------------------------------------------------
@ -2296,6 +2297,7 @@ COMMENT ON TABLE mytable IS 'This is my table.';
COMMENT ON TABLE mytable IS NULL;
COMMENT ON SCHEMA myschema IS 'my schema tables';
COMMENT ON FUNCTION public."Test]()&*^!@""'`\/#"() IS 'some comment';
COMMENT ON COLUMN foo.bar.baz IS 'This is a comment.';
--------------------------------------------------------------------------------