Skip to content

Commit 33a0dc6

Browse files
Merge pull request #1913 from ellieapi/new-types-for-snowflake
Added support for additional snowflake data types
2 parents a6b7aa4 + 263be9a commit 33a0dc6

File tree

2 files changed

+33
-5
lines changed

2 files changed

+33
-5
lines changed

pegjs/snowflake.pegjs

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4327,22 +4327,28 @@ KW_END = "END"i !ident_start
43274327

43284328
KW_CAST = "CAST"i !ident_start { return 'CAST' }
43294329

4330+
KW_BINARY = "BINARY"i !ident_start { return 'BINARY'; }
4331+
KW_VARBINARY = "VARBINARY"i !ident_start { return 'VARBINARY'; }
4332+
43304333
KW_BOOL = "BOOL"i !ident_start { return 'BOOL'; }
43314334
KW_BOOLEAN = "BOOLEAN"i !ident_start { return 'BOOLEAN'; }
43324335
KW_CHAR = "CHAR"i !ident_start { return 'CHAR'; }
43334336
KW_CHARACTER = "CHARACTER"i !ident_start { return 'CHARACTER'; }
43344337
KW_VARCHAR = "VARCHAR"i !ident_start { return 'VARCHAR';}
43354338
KW_NUMBER = "NUMBER"i !ident_start { return 'NUMBER'; }
4339+
KW_NUMERIC = "NUMERIC"i !ident_start { return 'NUMERIC'; }
43364340
KW_DECIMAL = "DECIMAL"i !ident_start { return 'DECIMAL'; }
43374341
KW_STRING = "STRING"i !ident_start { return 'STRING'; }
43384342
KW_SIGNED = "SIGNED"i !ident_start { return 'SIGNED'; }
43394343
KW_UNSIGNED = "UNSIGNED"i !ident_start { return 'UNSIGNED'; }
43404344
KW_INT = "INT"i !ident_start { return 'INT'; }
4345+
KW_BYTEINT = "BYTEINT"i !ident_start { return 'BYTEINT'; }
43414346
KW_ZEROFILL = "ZEROFILL"i !ident_start { return 'ZEROFILL'; }
43424347
KW_INTEGER = "INTEGER"i !ident_start { return 'INTEGER'; }
43434348
KW_JSON = "JSON"i !ident_start { return 'JSON'; }
43444349
KW_JSONB = "JSONB"i !ident_start { return 'JSONB'; }
43454350
KW_GEOMETRY = "GEOMETRY"i !ident_start { return 'GEOMETRY'; }
4351+
KW_GEOGRAPHY = "GEOGRAPHY"i !ident_start { return 'GEOGRAPHY'; }
43464352
KW_SMALLINT = "SMALLINT"i !ident_start { return 'SMALLINT'; }
43474353
KW_SERIAL = "SERIAL"i !ident_start { return 'SERIAL'; }
43484354
KW_TINYINT = "TINYINT"i !ident_start { return 'TINYINT'; }
@@ -4361,6 +4367,7 @@ KW_DATETIME = "DATETIME"i !ident_start { return 'DATETIME'; }
43614367
KW_ROWS = "ROWS"i !ident_start { return 'ROWS'; }
43624368
KW_TIME = "TIME"i !ident_start { return 'TIME'; }
43634369
KW_TIMESTAMP= "TIMESTAMP"i!ident_start { return 'TIMESTAMP'; }
4370+
KW_TIMESTAMP_TZ = "TIMESTAMP_TZ"i !ident_start { return 'TIMESTAMP_TZ'; }
43644371
KW_TRUNCATE = "TRUNCATE"i !ident_start { return 'TRUNCATE'; }
43654372
KW_USER = "USER"i !ident_start { return 'USER'; }
43664373
KW_UUID = "UUID"i !ident_start { return 'UUID'; }
@@ -4716,6 +4723,7 @@ data_type
47164723
/ enum_type
47174724
/ serial_interval_type
47184725
/ binary_type
4726+
/ geography_type
47194727
/ oid_type
47204728

47214729

@@ -4733,7 +4741,7 @@ boolean_type
47334741
= t:(KW_BOOL / KW_BOOLEAN) { /* => data_type */ return { dataType: t }}
47344742

47354743
binary_type
4736-
= 'bytea'i { /* => data_type */ return { dataType: 'BYTEA' }; }
4744+
= t:(KW_BINARY / KW_VARBINARY) { /* => data_type */ return { dataType: t }; }
47374745

47384746
character_string_type
47394747
= t:(KW_CHAR / KW_VARCHAR) __ LPAREN __ l:[0-9]+ __ RPAREN {
@@ -4751,9 +4759,9 @@ numeric_type_suffix
47514759
return result
47524760
}
47534761
numeric_type
4754-
= t:(KW_NUMBER / KW_DECIMAL / KW_INT / KW_INTEGER / KW_SMALLINT / KW_TINYINT / KW_BIGINT / KW_FLOAT / KW_DOUBLE / KW_SERIAL / KW_BIGSERIAL / KW_REAL) __ LPAREN __ l:[0-9]+ __ r:(COMMA __ [0-9]+)? __ RPAREN __ s:numeric_type_suffix? { /* => data_type */ return { dataType: t, length: parseInt(l.join(''), 10), scale: r && parseInt(r[2].join(''), 10), parentheses: true, suffix: s }; }
4755-
/ t:(KW_NUMBER / KW_DECIMAL / KW_INT / KW_INTEGER / KW_SMALLINT / KW_TINYINT / KW_BIGINT / KW_FLOAT / KW_DOUBLE / KW_SERIAL / KW_BIGSERIAL / KW_REAL)l:[0-9]+ __ s:numeric_type_suffix? { /* => data_type */ return { dataType: t, length: parseInt(l.join(''), 10), suffix: s }; }
4756-
/ t:(KW_NUMBER / KW_DECIMAL / KW_INT / KW_INTEGER / KW_SMALLINT / KW_TINYINT / KW_BIGINT / KW_FLOAT / KW_DOUBLE / KW_SERIAL / KW_BIGSERIAL / KW_REAL) __ s:numeric_type_suffix? __{ /* => data_type */ return { dataType: t, suffix: s }; }
4762+
= t:(KW_NUMBER / KW_DECIMAL / KW_INT / KW_BYTEINT / KW_INTEGER / KW_NUMERIC / KW_SMALLINT / KW_TINYINT / KW_BIGINT / KW_FLOAT / KW_DOUBLE / KW_SERIAL / KW_BIGSERIAL / KW_REAL) __ LPAREN __ l:[0-9]+ __ r:(COMMA __ [0-9]+)? __ RPAREN __ s:numeric_type_suffix? { /* => data_type */ return { dataType: t, length: parseInt(l.join(''), 10), scale: r && parseInt(r[2].join(''), 10), parentheses: true, suffix: s }; }
4763+
/ t:(KW_NUMBER / KW_DECIMAL / KW_INT / KW_BYTEINT / KW_INTEGER / KW_NUMERIC / KW_SMALLINT / KW_TINYINT / KW_BIGINT / KW_FLOAT / KW_DOUBLE / KW_SERIAL / KW_BIGSERIAL / KW_REAL)l:[0-9]+ __ s:numeric_type_suffix? { /* => data_type */ return { dataType: t, length: parseInt(l.join(''), 10), suffix: s }; }
4764+
/ t:(KW_NUMBER / KW_DECIMAL / KW_INT / KW_BYTEINT / KW_INTEGER / KW_NUMERIC / KW_SMALLINT / KW_TINYINT / KW_BIGINT / KW_FLOAT / KW_DOUBLE / KW_SERIAL / KW_BIGSERIAL / KW_REAL) __ s:numeric_type_suffix? __{ /* => data_type */ return { dataType: t, suffix: s }; }
47574765

47584766
oid_type
47594767
= t:(KW_OID / KW_REGCLASS / KW_REGCOLLATION / KW_REGCONFIG / KW_REGDICTIONARY / KW_REGNAMESPACE / KW_REGOPER / KW_REGOPERATOR / KW_REGPROC / KW_REGPROCEDURE / KW_REGROLE / KW_REGTYPE) { /* => data_type */ return { dataType: t }}
@@ -4770,7 +4778,7 @@ time_type
47704778

47714779
datetime_type
47724780
= t:(KW_DATE / KW_DATETIME) __ LPAREN __ l:[0-9]+ __ RPAREN { /* => data_type */ return { dataType: t, length: parseInt(l.join(''), 10), parentheses: true }; }
4773-
/ t:(KW_DATE / KW_DATETIME) { /* => data_type */ return { dataType: t }; }
4781+
/ t:(KW_DATE / KW_DATETIME / KW_TIMESTAMP_TZ) { /* => data_type */ return { dataType: t }; }
47744782
/ time_type
47754783

47764784
enum_type
@@ -4789,6 +4797,9 @@ json_type
47894797
geometry_type
47904798
= t:KW_GEOMETRY {/* => data_type */ return { dataType: t }; }
47914799

4800+
geography_type
4801+
= t:KW_GEOGRAPHY {/* => data_type */ return { dataType: t }; }
4802+
47924803
serial_interval_type
47934804
= t:(KW_SERIAL / KW_INTERVAL) { /* => data_type */ return { dataType: t }; }
47944805

test/snowflake.spec.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,23 @@ describe('snowflake', () => {
204204
`SELECT '1' || '_' || "tj"."ID" AS "JOB_KEY", "tj"."ID" AS "PAY_JOB_ID", "tj"."ID", CASE WHEN "tj"."transcription_job_split_id" IS NOT NULL THEN 1 ELSE 0 END AS "TRANSCRIPTION_IS_SPLIT", CASE WHEN "tjs"."transcription_job_id" IS NOT NULL THEN "tjs"."transcription_job_id" ELSE "tj"."id" END AS "PARENT_TRANSCRIPTION_JOB_ID", CASE WHEN "tjss"."transcription_job_id" IS NOT NULL THEN "tjss"."transcription_job_id" WHEN "tjss"."transcription_job_id" IS NULL AND "tjs"."transcription_job_id" IS NOT NULL THEN "tjs"."transcription_job_id" ELSE "tj"."id" END AS "TRANSCRIPTION_ORIGINAL_JOB_ID", CASE WHEN "tjss"."transcription_job_id" IS NOT NULL THEN "tjss"."transcription_job_id" WHEN "tjss"."transcription_job_id" IS NULL AND "tjs"."transcription_job_id" IS NOT NULL THEN "tjs"."transcription_job_id" ELSE "tj"."id" END AS "REV_JOB_ID", "tj"."catalog_item_id", PARSE_JSON("tj"."METADATA") AS "METADATA", PARSE_JSON("tj"."METADATA") :entry_id::STRING AS "ENTRY_ID", PARSE_JSON("tj"."METADATA") :partner_id::NUMBER AS "PARTNER_ID", PARSE_JSON("tj"."METADATA") :original_profile_id::NUMBER AS "ORIGINAL_PROFILE_ID", PARSE_JSON("tj"."config") :external_provider_captioning_provider::STRING AS "caption_provider", PARSE_JSON("tj"."config") :external_provider_transcription_provider::STRING AS "transcription_provider", "tj"."FRAUD_ISSUES", "tj"."OWNER_ID", "tj"."SANDBOX", coalesce("tj"."ORDER_ID", "tj"."ORDER_UUID") AS "ORDER_ID", coalesce("tj"."ORDER_ID", "tj"."ORDER_UUID") IS NOT NULL AS "ONE_ORDERING", "tj"."SOURCE_TABLE", coalesce("tj"."job_flow_id", "p"."job_flow_id") AS "JOB_FLOW_ID" FROM "MRR"."MRR_VERBIT_TRANSCRIPTION_JOBS" AS "tj" LEFT JOIN "MRR"."MRR_VERBIT_TRANSCRIPTION_JOB_SPLITS" AS "tjs" ON "tj"."transcription_job_split_id" = "tjs"."id" INNER JOIN "MRR"."MRR_VERBIT_PROFILES" AS "p" ON "tj"."profile_id" = "p"."id" LEFT JOIN "MRR"."MRR_VERBIT_TRANSCRIPTION_JOBS" AS "tjj" ON "tjs"."transcription_job_id" = "tjj"."id" LEFT JOIN "MRR"."MRR_VERBIT_TRANSCRIPTION_JOB_SPLITS" AS "tjss" ON "tjj"."transcription_job_split_id" = "tjss"."id"`
205205
]
206206
},
207+
{
208+
title: 'Support Snowflake types: NUMERIC, BYTEINT, BINARY, VARBINARY, GEOGRAPHY, TIMESTAMP_TZ',
209+
sql: [
210+
`
211+
CREATE TABLE TEST_SNOWFLAKE (
212+
"att1" NUMERIC(3,3),
213+
"att2" BYTEINT,
214+
"att3_SAMPLE_3" BINARY,
215+
"att4_SAMPLE_4" VARBINARY,
216+
"att5_SAMPLE_5" GEOGRAPHY,
217+
"att6_SAMPLE_6" TIMESTAMP_TZ,
218+
primary key ("att1")
219+
);
220+
`,
221+
`CREATE TABLE "TEST_SNOWFLAKE" ("att1" NUMERIC(3, 3), "att2" BYTEINT, "att3_SAMPLE_3" BINARY, "att4_SAMPLE_4" VARBINARY, "att5_SAMPLE_5" GEOGRAPHY, "att6_SAMPLE_6" TIMESTAMP_TZ, PRIMARY KEY ("att1"))`
222+
]
223+
}
207224
]
208225
SQL_LIST.forEach(sqlInfo => {
209226
const { title, sql } = sqlInfo

0 commit comments

Comments
 (0)