Skip to content

Commit

Permalink
feat: add explain, truncate and alter/drop/create schema
Browse files Browse the repository at this point in the history
  • Loading branch information
matthias-Q committed Jul 30, 2023
1 parent 27cddda commit d4acced
Show file tree
Hide file tree
Showing 7 changed files with 368 additions and 97 deletions.
82 changes: 67 additions & 15 deletions grammar.js
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ module.exports = grammar({
keyword_insert: _ => make_keyword("insert"),
keyword_replace: _ => make_keyword("replace"),
keyword_update: _ => make_keyword("update"),
keyword_truncate: _ => make_keyword("truncate"),
keyword_merge: _ => make_keyword("merge"),
keyword_into: _ => make_keyword("into"),
keyword_overwrite: _ => make_keyword("overwrite"),
Expand Down Expand Up @@ -90,6 +91,8 @@ module.exports = grammar({
keyword_alter: _ => make_keyword("alter"),
keyword_change: _ => make_keyword("change"),
keyword_analyze: _ => make_keyword("analyze"),
keyword_explain: _ => make_keyword("explain"),
keyword_verbose: _ => make_keyword("verbose"),
keyword_modify: _ => make_keyword("modify"),
keyword_drop: _ => make_keyword("drop"),
keyword_add: _ => make_keyword("add"),
Expand Down Expand Up @@ -209,6 +212,7 @@ module.exports = grammar({
keyword_wait: _ => make_keyword("wait"),
keyword_nowait: _ => make_keyword("nowait"),
keyword_attribute: _ => make_keyword("attribute"),
keyword_authorization: _ => make_keyword("authorization"),

keyword_trigger: _ => make_keyword('trigger'),
keyword_function: _ => make_keyword("function"),
Expand Down Expand Up @@ -570,6 +574,7 @@ module.exports = grammar({
),

statement: $ => seq(
optional($._explain_statement),
choice(
$._ddl_statement,
$._dml_write,
Expand Down Expand Up @@ -606,6 +611,7 @@ module.exports = grammar({
$._delete_statement,
$._insert_statement,
$._update_statement,
$._truncate_statement,
),
),
),
Expand Down Expand Up @@ -690,6 +696,14 @@ module.exports = grammar({
optional($._alias),
),

_truncate_statement: $ => seq(
$.keyword_truncate,
optional($.keyword_table),
optional($.keyword_only),
comma_list($.object_reference),
optional($._drop_behavior),
),

_delete_statement: $ => seq(
$.delete,
alias($._delete_from, $.from),
Expand Down Expand Up @@ -720,6 +734,7 @@ module.exports = grammar({
$.create_index,
$.create_function,
$.create_type,
$.create_schema,
// TODO sequence
),
),
Expand Down Expand Up @@ -1056,6 +1071,23 @@ module.exports = grammar({
),
),

create_schema: $ => prec.left(seq(
$.keyword_create,
$.keyword_schema,
choice(
seq(
optional($._if_not_exists),
$.identifier,
optional(seq($.keyword_authorization, $.identifier)),
),
seq(
$.keyword_authorization,
$.identifier,
),
),
repeat($._create_statement),
)),

create_type: $ => seq(
$.keyword_create,
$.keyword_type,
Expand Down Expand Up @@ -1101,6 +1133,7 @@ module.exports = grammar({
choice(
$.alter_table,
$.alter_view,
$.alter_schema,
$.alter_type,
),
),
Expand Down Expand Up @@ -1288,6 +1321,18 @@ module.exports = grammar({
),
),

alter_schema: $ => seq(
$.keyword_alter,
$.keyword_schema,
$.identifier,
choice(
$.keyword_rename,
$.keyword_owner,
),
$.keyword_to,
$.identifier,
),

alter_type: $ => seq(
$.keyword_alter,
$.keyword_type,
Expand All @@ -1302,7 +1347,7 @@ module.exports = grammar({
$.identifier,
$.keyword_to,
$.identifier,
optional($._drop_bevavior)
optional($._drop_behavior)
),
seq(
$.keyword_add,
Expand Down Expand Up @@ -1345,12 +1390,12 @@ module.exports = grammar({
),
),
optional(seq($.keyword_collate, $.identifier)),
optional($._drop_bevavior)
optional($._drop_behavior)
)
),
),

_drop_bevavior: $ => choice(
_drop_behavior: $ => choice(
$.keyword_cascade,
$.keyword_restrict,
),
Expand All @@ -1361,6 +1406,7 @@ module.exports = grammar({
$.drop_view,
$.drop_index,
$.drop_type,
$.drop_schema,
),
),

Expand All @@ -1369,29 +1415,31 @@ module.exports = grammar({
$.keyword_table,
optional($._if_exists),
$.object_reference,
optional(
$._drop_bevavior
),
optional($._drop_behavior),
),

drop_view: $ => seq(
$.keyword_drop,
$.keyword_view,
optional($._if_exists),
$.object_reference,
optional(
$._drop_bevavior
),
optional($._drop_behavior),
),

drop_schema: $ => seq(
$.keyword_drop,
$.keyword_schema,
optional($._if_exists),
$.identifier,
optional($._drop_behavior)
),

drop_type: $ => seq(
$.keyword_drop,
$.keyword_type,
optional($._if_exists),
$.object_reference,
optional(
$._drop_bevavior
),
optional($._drop_behavior),
),

drop_index: $ => seq(
Expand All @@ -1400,9 +1448,7 @@ module.exports = grammar({
optional($.keyword_concurrently),
optional($._if_exists),
field("name", $.identifier),
optional(
$._drop_bevavior
),
optional($._drop_behavior),
optional(
seq(
$.keyword_on,
Expand Down Expand Up @@ -1522,6 +1568,12 @@ module.exports = grammar({
optional($.returning),
),

_explain_statement:$ => prec.right(seq(
$.keyword_explain,
optional($.keyword_analyze),
optional($.keyword_verbose),
)),

_merge_statement: $=> seq(
$.keyword_merge,
$.keyword_into,
Expand Down
4 changes: 4 additions & 0 deletions queries/highlights.scm
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,7 @@
(keyword_to)
(keyword_schema)
(keyword_owner)
(keyword_authorization)
(keyword_all)
(keyword_any)
(keyword_some)
Expand Down Expand Up @@ -207,6 +208,9 @@
(keyword_stored)
(keyword_partitioned)
(keyword_analyze)
(keyword_explain)
(keyword_verbose)
(keyword_truncate)
(keyword_rewrite)
(keyword_optimize)
(keyword_vacuum)
Expand Down
36 changes: 36 additions & 0 deletions test/corpus/alter.txt
Original file line number Diff line number Diff line change
Expand Up @@ -661,3 +661,39 @@ col2 VARCHAR(255) NOT NULL DEFAULT('EMPTY');
(keyword_default)
(list
(literal)))))))

================================================================================
ALTER SCHEMA RENAME
================================================================================

ALTER SCHEMA sales RENAME TO mysales;

--------------------------------------------------------------------------------

(program
(statement
(alter_schema
(keyword_alter)
(keyword_schema)
(identifier)
(keyword_rename)
(keyword_to)
(identifier))))

================================================================================
ALTER SCHEMA OWNER
================================================================================

ALTER SCHEMA sales OWNER TO CURRENT_USER;

--------------------------------------------------------------------------------

(program
(statement
(alter_schema
(keyword_alter)
(keyword_schema)
(identifier)
(keyword_owner)
(keyword_to)
(identifier))))
100 changes: 100 additions & 0 deletions test/corpus/create.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1622,3 +1622,103 @@ CREATE TABLE tab (
(literal)
(literal)
(literal)))))))

================================================================================
CREATE SCHEMA
================================================================================

CREATE SCHEMA myschema;

--------------------------------------------------------------------------------

(program
(statement
(create_schema
(keyword_create)
(keyword_schema)
(identifier))))

================================================================================
CREATE SCHEMA with authorization
================================================================================

CREATE SCHEMA IF NOT EXISTS test AUTHORIZATION joe;

--------------------------------------------------------------------------------

(program
(statement
(create_schema
(keyword_create)
(keyword_schema)
(keyword_if)
(keyword_not)
(keyword_exists)
(identifier)
(keyword_authorization)
(identifier))))

================================================================================
CREATE SCHEMA with subsequent creates
================================================================================

CREATE SCHEMA hollywood
CREATE TABLE films (title text, release date, awards text[])
CREATE VIEW winners AS
SELECT title, release FROM films WHERE awards IS NOT NULL;

--------------------------------------------------------------------------------

(program
(statement
(create_schema
(keyword_create)
(keyword_schema)
(identifier)
(create_table
(keyword_create)
(keyword_table)
(object_reference
(identifier))
(column_definitions
(column_definition
(identifier)
(keyword_text))
(column_definition
(identifier)
(keyword_date))
(column_definition
(identifier)
(keyword_text)
(array_size_definition))))
(create_view
(keyword_create)
(keyword_view)
(object_reference
(identifier))
(keyword_as)
(create_query
(select
(keyword_select)
(select_expression
(term
(field
(identifier)))
(term
(field
(identifier)))))
(from
(keyword_from)
(relation
(object_reference
(identifier)))
(where
(keyword_where)
(binary_expression
(field
(identifier))
(is_not
(keyword_is)
(keyword_not))
(literal
(keyword_null))))))))))
16 changes: 16 additions & 0 deletions test/corpus/delete.txt
Original file line number Diff line number Diff line change
Expand Up @@ -107,3 +107,19 @@ WHERE id = 9;
left: (field
name: (identifier))
right: (literal))))))

================================================================================
Truncate table
================================================================================

TRUNCATE TABLE employees CASCADE;

--------------------------------------------------------------------------------

(program
(statement
(keyword_truncate)
(keyword_table)
(object_reference
(identifier))
(keyword_cascade)))
Loading

0 comments on commit d4acced

Please sign in to comment.