Compare commits

...

2 Commits

Author SHA1 Message Date
Dmitriy Pleshevskiy 09f0ec4c3f
grammar: fix foreign key 2023-01-08 23:54:06 +03:00
Dmitriy Pleshevskiy de04a49b20
grammar: add table constraint 2023-01-08 16:17:16 +03:00
7 changed files with 3616 additions and 2015 deletions

View File

@ -34,20 +34,12 @@ module.exports = grammar({
),
column_definitions: ($) =>
seq(
"(",
optional(
commaSepRepeat1(choice($.column_definition /*, $.table_constraint*/))
),
")"
parens(
optional(commaSep1(choice($.column_definition, $.table_constraint)))
),
column_definition: ($) =>
seq(
field("name", $.identifier),
field("datatype", $._type),
repeat($.column_constraint)
),
seq(field("name", $.identifier), $.type, repeat($.column_constraint)),
column_constraint: ($) =>
seq(
@ -57,17 +49,12 @@ module.exports = grammar({
$.keyword_null,
seq($.keyword_default, $._expression),
// TODO: add index_parameters in UNIQUE, PRIMARY KEY
seq(
$.keyword_unique,
optional(
seq($.keyword_nulls, optional($.keyword_not), $.keyword_distinct)
)
),
$._unique_constraint,
$._primary_key,
seq(
$.keyword_references,
$.table_reference,
optional(seq("(", field("refcolumn", $.identifier), ")")),
optional($.ref_column),
optional($._foreign_key_match),
optional(
choice(
@ -82,6 +69,44 @@ module.exports = grammar({
// TODO: DEFERRABLE
),
ref_column: ($) => parens(field("name", $.identifier)),
table_constraint: ($) =>
seq(
optional(seq($.keyword_constraint, field("name", $.identifier))),
choice(
seq($._unique_constraint, $.column_list),
seq($._primary_key, $.column_list),
seq(
$._foreign_key,
$.column_list,
$.keyword_references,
$.table_reference,
optional(alias($.column_list, $.ref_column_list)),
optional($._foreign_key_match),
optional(
choice(
seq($._foreign_key_on_delete, $._foreign_key_on_update),
seq($._foreign_key_on_update, $._foreign_key_on_delete)
)
)
)
// TODO: CHECK
// TODO: EXCLUDE
)
// TODO: DEFERRABLE
),
column_list: ($) => parens(commaSep1(field("name", $.identifier))),
_unique_constraint: ($) =>
seq(
$.keyword_unique,
optional(
seq($.keyword_nulls, optional($.keyword_not), $.keyword_distinct)
)
),
_foreign_key_match: ($) =>
seq(
$.keyword_match,
@ -100,7 +125,7 @@ module.exports = grammar({
seq(
$.keyword_set,
choice($.keyword_null, $.keyword_default),
optional(seq("(", commaSepRepeat1($.identifier), ")"))
optional(parens(commaSep1($.identifier)))
)
),
@ -126,8 +151,9 @@ module.exports = grammar({
),
// References: https://www.postgresql.org/docs/15/datatype.html
_type: ($) =>
type: ($) =>
choice(
field("name", $.identifier),
$._type_numeric,
$._type_character,
$._type_datetime,
@ -306,8 +332,16 @@ function mkKeyword(word) {
return new RegExp(word + "|" + word.toUpperCase());
}
function commaSepRepeat1(field) {
return seq(field, repeat(seq(",", field)));
function commaSep1(rule) {
return sep1(",", rule);
}
function sep1(separator, rule) {
return seq(rule, repeat(seq(separator, rule)));
}
function parens(rule) {
return seq("(", rule, ")");
}
function parametricType($, type, params = ["size"]) {

View File

@ -126,6 +126,10 @@
{
"type": "SYMBOL",
"name": "column_definition"
},
{
"type": "SYMBOL",
"name": "table_constraint"
}
]
},
@ -144,6 +148,10 @@
{
"type": "SYMBOL",
"name": "column_definition"
},
{
"type": "SYMBOL",
"name": "table_constraint"
}
]
}
@ -175,12 +183,8 @@
}
},
{
"type": "FIELD",
"name": "datatype",
"content": {
"type": "SYMBOL",
"name": "_type"
}
"type": "SYMBOL",
"name": "type"
},
{
"type": "REPEAT",
@ -244,46 +248,8 @@
]
},
{
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "keyword_unique"
},
{
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "keyword_nulls"
},
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "keyword_not"
},
{
"type": "BLANK"
}
]
},
{
"type": "SYMBOL",
"name": "keyword_distinct"
}
]
},
{
"type": "BLANK"
}
]
}
]
"type": "SYMBOL",
"name": "_unique_constraint"
},
{
"type": "SYMBOL",
@ -304,25 +270,8 @@
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "("
},
{
"type": "FIELD",
"name": "refcolumn",
"content": {
"type": "SYMBOL",
"name": "identifier"
}
},
{
"type": "STRING",
"value": ")"
}
]
"type": "SYMBOL",
"name": "ref_column"
},
{
"type": "BLANK"
@ -386,6 +335,265 @@
}
]
},
"ref_column": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "("
},
{
"type": "FIELD",
"name": "name",
"content": {
"type": "SYMBOL",
"name": "identifier"
}
},
{
"type": "STRING",
"value": ")"
}
]
},
"table_constraint": {
"type": "SEQ",
"members": [
{
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "keyword_constraint"
},
{
"type": "FIELD",
"name": "name",
"content": {
"type": "SYMBOL",
"name": "identifier"
}
}
]
},
{
"type": "BLANK"
}
]
},
{
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "_unique_constraint"
},
{
"type": "SYMBOL",
"name": "column_list"
}
]
},
{
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "_primary_key"
},
{
"type": "SYMBOL",
"name": "column_list"
}
]
},
{
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "_foreign_key"
},
{
"type": "SYMBOL",
"name": "column_list"
},
{
"type": "SYMBOL",
"name": "keyword_references"
},
{
"type": "SYMBOL",
"name": "table_reference"
},
{
"type": "CHOICE",
"members": [
{
"type": "ALIAS",
"content": {
"type": "SYMBOL",
"name": "column_list"
},
"named": true,
"value": "ref_column_list"
},
{
"type": "BLANK"
}
]
},
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_foreign_key_match"
},
{
"type": "BLANK"
}
]
},
{
"type": "CHOICE",
"members": [
{
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "_foreign_key_on_delete"
},
{
"type": "SYMBOL",
"name": "_foreign_key_on_update"
}
]
},
{
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "_foreign_key_on_update"
},
{
"type": "SYMBOL",
"name": "_foreign_key_on_delete"
}
]
}
]
},
{
"type": "BLANK"
}
]
}
]
}
]
}
]
},
"column_list": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "("
},
{
"type": "SEQ",
"members": [
{
"type": "FIELD",
"name": "name",
"content": {
"type": "SYMBOL",
"name": "identifier"
}
},
{
"type": "REPEAT",
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": ","
},
{
"type": "FIELD",
"name": "name",
"content": {
"type": "SYMBOL",
"name": "identifier"
}
}
]
}
}
]
},
{
"type": "STRING",
"value": ")"
}
]
},
"_unique_constraint": {
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "keyword_unique"
},
{
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "keyword_nulls"
},
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "keyword_not"
},
{
"type": "BLANK"
}
]
},
{
"type": "SYMBOL",
"name": "keyword_distinct"
}
]
},
{
"type": "BLANK"
}
]
}
]
},
"_foreign_key_match": {
"type": "SEQ",
"members": [
@ -612,9 +820,17 @@
}
]
},
"_type": {
"type": {
"type": "CHOICE",
"members": [
{
"type": "FIELD",
"name": "name",
"content": {
"type": "SYMBOL",
"name": "identifier"
}
},
{
"type": "SYMBOL",
"name": "_type_numeric"

View File

@ -43,16 +43,6 @@
"named": true
}
]
},
"refcolumn": {
"multiple": false,
"required": false,
"types": [
{
"type": "identifier",
"named": true
}
]
}
},
"children": {
@ -131,6 +121,10 @@
"type": "literal",
"named": true
},
{
"type": "ref_column",
"named": true
},
{
"type": "referencial_action",
"named": true
@ -146,104 +140,6 @@
"type": "column_definition",
"named": true,
"fields": {
"datatype": {
"multiple": false,
"required": true,
"types": [
{
"type": "char",
"named": true
},
{
"type": "decimal",
"named": true
},
{
"type": "double",
"named": true
},
{
"type": "keyword_bigint",
"named": true
},
{
"type": "keyword_bigserial",
"named": true
},
{
"type": "keyword_boolean",
"named": true
},
{
"type": "keyword_bytea",
"named": true
},
{
"type": "keyword_date",
"named": true
},
{
"type": "keyword_datetime",
"named": true
},
{
"type": "keyword_integer",
"named": true
},
{
"type": "keyword_money",
"named": true
},
{
"type": "keyword_real",
"named": true
},
{
"type": "keyword_serial",
"named": true
},
{
"type": "keyword_smallint",
"named": true
},
{
"type": "keyword_smallserial",
"named": true
},
{
"type": "keyword_text",
"named": true
},
{
"type": "keyword_time",
"named": true
},
{
"type": "keyword_timestamp",
"named": true
},
{
"type": "keyword_timestamptz",
"named": true
},
{
"type": "keyword_uuid",
"named": true
},
{
"type": "keyword_xml",
"named": true
},
{
"type": "numeric",
"named": true
},
{
"type": "varchar",
"named": true
}
]
},
"name": {
"multiple": false,
"required": true,
@ -257,11 +153,15 @@
},
"children": {
"multiple": true,
"required": false,
"required": true,
"types": [
{
"type": "column_constraint",
"named": true
},
{
"type": "type",
"named": true
}
]
}
@ -277,10 +177,30 @@
{
"type": "column_definition",
"named": true
},
{
"type": "table_constraint",
"named": true
}
]
}
},
{
"type": "column_list",
"named": true,
"fields": {
"name": {
"multiple": true,
"required": true,
"types": [
{
"type": "identifier",
"named": true
}
]
}
}
},
{
"type": "create_table",
"named": true,
@ -481,6 +401,38 @@
]
}
},
{
"type": "ref_column",
"named": true,
"fields": {
"name": {
"multiple": false,
"required": true,
"types": [
{
"type": "identifier",
"named": true
}
]
}
}
},
{
"type": "ref_column_list",
"named": true,
"fields": {
"name": {
"multiple": true,
"required": true,
"types": [
{
"type": "identifier",
"named": true
}
]
}
}
},
{
"type": "referencial_action",
"named": true,
@ -554,6 +506,108 @@
]
}
},
{
"type": "table_constraint",
"named": true,
"fields": {
"name": {
"multiple": false,
"required": false,
"types": [
{
"type": "identifier",
"named": true
}
]
}
},
"children": {
"multiple": true,
"required": true,
"types": [
{
"type": "column_list",
"named": true
},
{
"type": "keyword_constraint",
"named": true
},
{
"type": "keyword_delete",
"named": true
},
{
"type": "keyword_distinct",
"named": true
},
{
"type": "keyword_foreign",
"named": true
},
{
"type": "keyword_full",
"named": true
},
{
"type": "keyword_key",
"named": true
},
{
"type": "keyword_match",
"named": true
},
{
"type": "keyword_not",
"named": true
},
{
"type": "keyword_nulls",
"named": true
},
{
"type": "keyword_on",
"named": true
},
{
"type": "keyword_partial",
"named": true
},
{
"type": "keyword_primary",
"named": true
},
{
"type": "keyword_references",
"named": true
},
{
"type": "keyword_simple",
"named": true
},
{
"type": "keyword_unique",
"named": true
},
{
"type": "keyword_update",
"named": true
},
{
"type": "ref_column_list",
"named": true
},
{
"type": "referencial_action",
"named": true
},
{
"type": "table_reference",
"named": true
}
]
}
},
{
"type": "table_reference",
"named": true,
@ -580,6 +634,120 @@
}
}
},
{
"type": "type",
"named": true,
"fields": {
"name": {
"multiple": false,
"required": false,
"types": [
{
"type": "identifier",
"named": true
}
]
}
},
"children": {
"multiple": false,
"required": false,
"types": [
{
"type": "char",
"named": true
},
{
"type": "decimal",
"named": true
},
{
"type": "double",
"named": true
},
{
"type": "keyword_bigint",
"named": true
},
{
"type": "keyword_bigserial",
"named": true
},
{
"type": "keyword_boolean",
"named": true
},
{
"type": "keyword_bytea",
"named": true
},
{
"type": "keyword_date",
"named": true
},
{
"type": "keyword_datetime",
"named": true
},
{
"type": "keyword_integer",
"named": true
},
{
"type": "keyword_money",
"named": true
},
{
"type": "keyword_real",
"named": true
},
{
"type": "keyword_serial",
"named": true
},
{
"type": "keyword_smallint",
"named": true
},
{
"type": "keyword_smallserial",
"named": true
},
{
"type": "keyword_text",
"named": true
},
{
"type": "keyword_time",
"named": true
},
{
"type": "keyword_timestamp",
"named": true
},
{
"type": "keyword_timestamptz",
"named": true
},
{
"type": "keyword_uuid",
"named": true
},
{
"type": "keyword_xml",
"named": true
},
{
"type": "numeric",
"named": true
},
{
"type": "varchar",
"named": true
}
]
}
},
{
"type": "varchar",
"named": true,

File diff suppressed because it is too large Load Diff

View File

@ -135,33 +135,33 @@ create table foo (
(column_definitions
(column_definition
name: (identifier)
datatype: (keyword_text)
(type (keyword_text))
)
(column_definition
name: (identifier)
datatype: (keyword_boolean)
(type (keyword_boolean))
)
(column_definition
name: (identifier)
datatype: (numeric
(type (numeric
(keyword_numeric)
precision: (number)
)
))
)
(column_definition
name: (identifier)
datatype: (keyword_timestamptz)
(type (keyword_timestamptz))
)
(column_definition
name: (identifier)
datatype: (varchar
(type (varchar
(keyword_varchar)
size: (number)
)
))
)
(column_definition
name: (identifier)
datatype: (keyword_uuid)
(type (keyword_uuid))
)
)
)
@ -190,7 +190,7 @@ create table foo (
(column_definitions
(column_definition
name: (identifier)
datatype: (keyword_uuid)
(type (keyword_uuid))
(column_constraint
(keyword_primary)
(keyword_key)
@ -198,7 +198,7 @@ create table foo (
)
(column_definition
name: (identifier)
datatype: (keyword_text)
(type (keyword_text))
(column_constraint
(keyword_not)
(keyword_null)
@ -206,14 +206,14 @@ create table foo (
)
(column_definition
name: (identifier)
datatype: (keyword_text)
(type (keyword_text))
(column_constraint
(keyword_null)
)
)
(column_definition
name: (identifier)
datatype: (keyword_text)
(type (keyword_text))
(column_constraint
(keyword_not)
(keyword_null)
@ -250,7 +250,7 @@ create table foo (
(column_definitions
(column_definition
name: (identifier)
datatype: (keyword_uuid)
(type (keyword_uuid))
(column_constraint
(keyword_primary)
(keyword_key)
@ -258,7 +258,7 @@ create table foo (
)
(column_definition
name: (identifier)
datatype: (keyword_uuid)
(type (keyword_uuid))
(column_constraint
(keyword_null)
)
@ -267,7 +267,9 @@ create table foo (
(table_reference
name: (identifier)
)
refcolumn: (identifier)
(ref_column
name: (identifier)
)
(keyword_on)
(keyword_update)
(referencial_action
@ -309,7 +311,7 @@ create table foo (
(column_definitions
(column_definition
name: (identifier)
datatype: (keyword_uuid)
(type (keyword_uuid))
(column_constraint
(keyword_constraint)
name: (identifier)
@ -319,7 +321,7 @@ create table foo (
)
(column_definition
name: (identifier)
datatype: (keyword_text)
(type (keyword_text))
(column_constraint
(keyword_constraint)
name: (identifier)
@ -329,7 +331,7 @@ create table foo (
)
(column_definition
name: (identifier)
datatype: (keyword_text)
(type (keyword_text))
(column_constraint
(keyword_constraint)
name: (identifier)
@ -338,7 +340,7 @@ create table foo (
)
(column_definition
name: (identifier)
datatype: (keyword_text)
(type (keyword_text))
(column_constraint
(keyword_constraint)
name: (identifier)
@ -356,7 +358,7 @@ create table foo (
)
(column_definition
name: (identifier)
datatype: (keyword_text)
(type (keyword_text))
(column_constraint
(keyword_constraint)
name: (identifier)
@ -370,3 +372,310 @@ create table foo (
)
)
)
================================================================================
Create a table with table constraints
================================================================================
create table foo (
id uuid,
primary key (id),
c1 text not null,
c2 text null,
c3 text not null default 'hello',
unique (c1, c3)
);
--------------------------------------------------------------------------------
(source_file
(statement
(create_table
(keyword_create)
(keyword_table)
(table_reference
name: (identifier)
)
(column_definitions
(column_definition
name: (identifier)
(type (keyword_uuid))
)
(table_constraint
(keyword_primary)
(keyword_key)
(column_list
name: (identifier)
)
)
(column_definition
name: (identifier)
(type (keyword_text))
(column_constraint
(keyword_not)
(keyword_null)
)
)
(column_definition
name: (identifier)
(type (keyword_text))
(column_constraint
(keyword_null)
)
)
(column_definition
name: (identifier)
(type (keyword_text))
(column_constraint
(keyword_not)
(keyword_null)
)
(column_constraint
(keyword_default)
(literal
(literal_string)
)
)
)
(table_constraint
(keyword_unique)
(column_list
name: (identifier)
name: (identifier)
)
)
)
)
)
)
================================================================================
Create a table with primary key and foreign key
================================================================================
create table foo (
id uuid primary key,
bar_id uuid null references bar (id) on update set null on delete cascade
);
--------------------------------------------------------------------------------
(source_file
(statement
(create_table
(keyword_create)
(keyword_table)
(table_reference
name: (identifier)
)
(column_definitions
(column_definition
name: (identifier)
(type (keyword_uuid))
(column_constraint
(keyword_primary)
(keyword_key)
)
)
(column_definition
name: (identifier)
(type (keyword_uuid))
(column_constraint
(keyword_null)
)
(column_constraint
(keyword_references)
(table_reference
name: (identifier)
)
(ref_column
name: (identifier)
)
(keyword_on)
(keyword_update)
(referencial_action
(keyword_set)
(keyword_null)
)
(keyword_on)
(keyword_delete)
(referencial_action
(keyword_cascade)
)
)
)
)
)
)
)
================================================================================
Create a table with named column constraints
================================================================================
create table foo (
id uuid constraint foo_pkey primary key,
c1 text constraint strong_c1 not null,
c2 text constraint weak_c2 null,
c3 text constraint "c3 with power" not null constraint "c2 set default hello" default 'hello',
c4 text constraint "c4 unique" unique nulls not distinct
);
--------------------------------------------------------------------------------
(source_file
(statement
(create_table
(keyword_create)
(keyword_table)
(table_reference
name: (identifier)
)
(column_definitions
(column_definition
name: (identifier)
(type (keyword_uuid))
(column_constraint
(keyword_constraint)
name: (identifier)
(keyword_primary)
(keyword_key)
)
)
(column_definition
name: (identifier)
(type (keyword_text))
(column_constraint
(keyword_constraint)
name: (identifier)
(keyword_not)
(keyword_null)
)
)
(column_definition
name: (identifier)
(type (keyword_text))
(column_constraint
(keyword_constraint)
name: (identifier)
(keyword_null)
)
)
(column_definition
name: (identifier)
(type (keyword_text))
(column_constraint
(keyword_constraint)
name: (identifier)
(keyword_not)
(keyword_null)
)
(column_constraint
(keyword_constraint)
name: (identifier)
(keyword_default)
(literal
(literal_string)
)
)
)
(column_definition
name: (identifier)
(type (keyword_text))
(column_constraint
(keyword_constraint)
name: (identifier)
(keyword_unique)
(keyword_nulls)
(keyword_not)
(keyword_distinct)
)
)
)
)
)
)
================================================================================
Create a table with named table constraints
================================================================================
create table foo (
id uuid,
constraint foo_pkey primary key (id),
c3 uuid not null,
constraint foo_c3_fkey foreign key (c3) references bar (id) on update set null on delete cascade,
c4 text,
constraint "c4 unique" unique nulls not distinct (c4)
);
--------------------------------------------------------------------------------
(source_file
(statement
(create_table
(keyword_create)
(keyword_table)
(table_reference
name: (identifier)
)
(column_definitions
(column_definition
name: (identifier)
(type (keyword_uuid))
)
(table_constraint
(keyword_constraint)
name: (identifier)
(keyword_primary)
(keyword_key)
(column_list
name: (identifier)
)
)
(column_definition
name: (identifier)
(type (keyword_uuid))
(column_constraint
(keyword_not)
(keyword_null)
)
)
(table_constraint
(keyword_constraint)
name: (identifier)
(keyword_foreign)
(keyword_key)
(column_list
name: (identifier)
)
(keyword_references)
(table_reference
name: (identifier)
)
(ref_column_list
name: (identifier)
)
(keyword_on)
(keyword_update)
(referencial_action
(keyword_set)
(keyword_null)
)
(keyword_on)
(keyword_delete)
(referencial_action
(keyword_cascade)
)
)
(column_definition
name: (identifier)
(type (keyword_text))
)
(table_constraint
(keyword_constraint)
name: (identifier)
(keyword_unique)
(keyword_nulls)
(keyword_not)
(keyword_distinct)
(column_list
name: (identifier)
)
)
)
)
)
)

Binary file not shown.

Binary file not shown.