@@ -145,14 +145,75 @@ start
145
145
146
146
stmt
147
147
= create_table_stmt
148
+ / create_domain_stmt
148
149
/ drop_table_stmt
149
150
/ alter_table_stmt
150
151
152
+ create_domain_stmt
153
+ = create_single_column_domain
154
+ // / create_multi_column_domain
155
+ // / create_flexible_domain
156
+
157
+ create_single_column_domain
158
+ = operation :KW_CREATE _
159
+ usecase :KW_USECASE ? _
160
+ object :KW_DOMAIN _
161
+ if_not_exists :if_not_exists ? _
162
+ name :schema_object _
163
+ KW_AS _ as :(data_type / enum ) _ SEMI_COLON {
164
+ return {
165
+ operation,
166
+ usecase,
167
+ object,
168
+ if_not_exists,
169
+ name,
170
+ as,
171
+ };
172
+ }
173
+
174
+ enum
175
+ = object :KW_ENUM _
176
+ LPAR _ enum_list :enum_list _ RPAR {
177
+ return {
178
+ object,
179
+ enum_list
180
+ };
181
+ }
182
+
183
+ enum_list
184
+ = x :enum_item_list _ xs :(COMMA _ e :enum_item_list { return e; } )* {
185
+ return [x, ... xs];
186
+ }
187
+
188
+ enum_item_list
189
+ = name :identifier_name _
190
+ enum_alias_list :enum_alias_list ? _
191
+ value :(EQ _ v :literal { return v; })? {
192
+ return {
193
+ name,
194
+ enum_alias_list,
195
+ value,
196
+ };
197
+ }
198
+
199
+ enum_alias_list
200
+ = name :identifier_name _ enum_alias_list :enum_item_list {
201
+ return {
202
+ name,
203
+ enum_alias_list,
204
+ };
205
+ }
206
+
207
+ if_not_exists
208
+ = KW_IF _ KW_NOT _ KW_EXISTS {
209
+ return ' if not exists' ;
210
+ }
211
+
151
212
create_table_stmt
152
213
= operation :KW_CREATE _
153
214
object :KW_TABLE _
154
215
type :table_type ? _
155
- name :schema_table _
216
+ name :schema_object _
156
217
sharing :table_sharing_clause ?
157
218
table :(relational_table / object_table / XMLType_table )
158
219
memoptimize_for :table_memoptimize_clauses ? _
@@ -202,7 +263,7 @@ table_memoptimize_clause
202
263
}
203
264
204
265
table_parent_clause
205
- = KW_PARENT _ table :schema_table {
266
+ = KW_PARENT _ table :schema_object {
206
267
return table;
207
268
}
208
269
@@ -365,7 +426,7 @@ clustering_column_group
365
426
}
366
427
367
428
clusering_join
368
- = table :schema_table _ joins :clusering_join_stmts {
429
+ = table :schema_object _ joins :clusering_join_stmts {
369
430
return { table, joins };
370
431
}
371
432
@@ -376,19 +437,19 @@ clusering_join_stmts
376
437
}
377
438
378
439
clusering_join_stmt
379
- = KW_JOIN _ join_table :schema_table _ KW_ON _ LPAR _ condition :equijoin_condition _ RPAR {
440
+ = KW_JOIN _ join_table :schema_object _ KW_ON _ LPAR _ condition :equijoin_condition _ RPAR {
380
441
return { join_table, condition };
381
442
}
382
443
383
444
equijoin_condition
384
- = left_table :schema_table _ EQ _ right_table :schema_table {
445
+ = left_table :schema_object _ EQ _ right_table :schema_object {
385
446
return { left_table, right_table };
386
447
}
387
448
388
449
// TODO: replace rest of the instances with this rule
389
- schema_table
390
- = schema :(s :identifier_name _ DOT { return s; })? _ table :identifier_name {
391
- return { schema, table };
450
+ schema_object
451
+ = schema :(s :identifier_name _ DOT { return s; })? _ name :identifier_name {
452
+ return { schema, name };
392
453
}
393
454
394
455
table_partitioning_clauses
@@ -2012,7 +2073,7 @@ XMLType_table = ""
2012
2073
drop_table_stmt
2013
2074
= operation: KW_DROP _
2014
2075
object: KW_TABLE _
2015
- name: schema_table _
2076
+ name: schema_object _
2016
2077
cascade_constraints: (KW_CASCADE _ KW_CONSTRAINTS { return ' cascade constraints' ; })? _
2017
2078
purge: KW_PURGE ? _ SEMI_COLON {
2018
2079
return {
@@ -2027,7 +2088,7 @@ drop_table_stmt
2027
2088
alter_table_stmt
2028
2089
= opertaion: KW_ALTER _
2029
2090
object: KW_TABLE _
2030
- name: schema_table _
2091
+ name: schema_object _
2031
2092
memoptimize_read: memoptimize_read_clause? _
2032
2093
memoptimize_write: memoptimize_write_clause? _
2033
2094
body: alter_table_stmt_body?
@@ -2788,6 +2849,11 @@ KW_BEFORE = 'before'i !ident_start { return '
2788
2849
KW_BEGINNING = 'beginning'i !ident_start { return 'beginning'; }
2789
2850
KW_OPAQUE = 'opaque'i !ident_start { return 'opaque'; }
2790
2851
KW_UNPACKED = 'unpacked'i !ident_start { return 'unpacked'; }
2852
+ KW_USECASE = 'usecase'i !ident_start { return 'usecase'; }
2853
+ KW_DOMAIN = 'domain'i !ident_start { return 'domain'; }
2854
+ KW_EXISTS = 'exists'i !ident_start { return 'exists'; }
2855
+ KW_IF = 'if'i !ident_start { return 'if'; }
2856
+ KW_ENUM = 'enum'i !ident_start { return 'enum'; }
2791
2857
2792
2858
KW_VARYING = 'varying'i !ident_start { return 'varying'; }
2793
2859
KW_VARCHAR = 'varchar'i !ident_start { return 'varchar'; }
0 commit comments