From e8612bd4974dcf122351cef3d18b1888ffe776cb Mon Sep 17 00:00:00 2001 From: ygrek Date: Thu, 9 Nov 2023 09:52:23 +0900 Subject: [PATCH] sql: parse generated columns https://dev.mysql.com/doc/refman/8.0/en/create-table-generated-columns.html --- lib/sql_lexer.mll | 4 ++++ lib/sql_parser.mly | 7 ++++--- test/misc.sql | 11 +++++++++++ test/out/misc.xml | 10 ++++++++++ 4 files changed, 29 insertions(+), 3 deletions(-) diff --git a/lib/sql_lexer.mll b/lib/sql_lexer.mll index 3f2ed78..65196e7 100644 --- a/lib/sql_lexer.mll +++ b/lib/sql_lexer.mll @@ -178,6 +178,10 @@ let keywords = "with", WITH; "year", YEAR; "year_month", YEAR_MONTH; + "generated", GENERATED; + "always", ALWAYS; + "virtual", VIRTUAL; + "stored", STORED; ] in (* more *) let all token l = k := !k @ List.map (fun x -> x,token) l in all DATETIME_FUNC ["current_date";"current_timestamp";"current_time";"localtime";"localtimestamp";"now";]; diff --git a/lib/sql_parser.mly b/lib/sql_parser.mly index 85693af..41a14bf 100644 --- a/lib/sql_parser.mly +++ b/lib/sql_parser.mly @@ -42,7 +42,7 @@ CASE WHEN THEN ELSE END CHANGE MODIFY DELAYED ENUM FOR SHARE MODE LOCK OF WITH NOWAIT ACTION NO IS INTERVAL SUBSTRING DIV MOD CONVERT LAG LEAD OVER FIRST_VALUE LAST_VALUE NTH_VALUE PARTITION ROWS RANGE UNBOUNDED PRECEDING FOLLOWING CURRENT ROW - CAST + CAST GENERATED ALWAYS VIRTUAL STORED %token FUNCTION PROCEDURE LANGUAGE RETURNS OUT INOUT BEGIN COMMENT %token MICROSECOND SECOND MINUTE HOUR DAY WEEK MONTH QUARTER YEAR SECOND_MICROSECOND MINUTE_MICROSECOND MINUTE_SECOND @@ -325,15 +325,16 @@ reference_action: RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT { } on_conflict: ON CONFLICT algo=conflict_algo { algo } -column_def_extra: PRIMARY KEY { Some PrimaryKey } +column_def_extra: PRIMARY? KEY { Some PrimaryKey } | NOT NULL { Some NotNull } | NULL { Some Null } - | UNIQUE { Some Unique } + | UNIQUE KEY? { Some Unique } | AUTOINCREMENT { Some Autoincrement } | on_conflict { None } | CHECK LPAREN expr RPAREN { None } | DEFAULT e=default_value { if e = Value Any then Some Null else None } (* FIXME check type with column *) | COLLATE IDENT { None } + | pair(GENERATED,ALWAYS)? AS LPAREN expr RPAREN either(VIRTUAL,STORED)? { None } (* FIXME params and typing ignored *) default_value: e=single_literal_value | e=datetime_value { e } (* sub expr ? *) diff --git a/test/misc.sql b/test/misc.sql index 187253d..65b9384 100644 --- a/test/misc.sql +++ b/test/misc.sql @@ -105,3 +105,14 @@ select x <> 0 AS y from test; -- @select_alias_change_type select x <> 0 AS x from test; + +-- @create_oauth_tokens +CREATE TABLE IF NOT EXISTS `oauth_tokens` ( + `id` INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT, + `unique_value_google_drive` BINARY(16) AS ( + CASE WHEN `client_name` = "google-drive" THEN + UNHEX(MD5(CONCAT_WS("|", `creator_user_id`, `email`))) + ELSE + NULL + END) UNIQUE +); diff --git a/test/out/misc.xml b/test/out/misc.xml index 91d7ddd..8c2580e 100644 --- a/test/out/misc.xml +++ b/test/out/misc.xml @@ -255,6 +255,16 @@ + + + + + + + + + +
-- 2.11.4.GIT