1use sqruff_lib_core::dialects::Dialect;
2use sqruff_lib_core::dialects::init::DialectKind;
3use sqruff_lib_core::dialects::syntax::SyntaxKind;
4use sqruff_lib_core::helpers::{Config, ToMatchable};
5use sqruff_lib_core::parser::grammar::anyof::{AnyNumberOf, one_of, optionally_bracketed};
6use sqruff_lib_core::parser::grammar::delimited::Delimited;
7use sqruff_lib_core::parser::grammar::sequence::{Bracketed, Sequence};
8use sqruff_lib_core::parser::grammar::{Anything, Nothing, Ref};
9use sqruff_lib_core::parser::matchable::MatchableTrait;
10use sqruff_lib_core::parser::node_matcher::NodeMatcher;
11use sqruff_lib_core::parser::parsers::TypedParser;
12use sqruff_lib_core::parser::segments::meta::MetaSegment;
13use sqruff_lib_core::parser::types::ParseMode;
14use sqruff_lib_core::vec_of_erased;
15
16use crate::sqlite_keywords::{RESERVED_KEYWORDS, UNRESERVED_KEYWORDS};
17
18pub fn dialect() -> Dialect {
19 raw_dialect().config(|dialect| dialect.expand())
20}
21
22pub fn raw_dialect() -> Dialect {
23 let sqlite_dialect = super::ansi::raw_dialect();
24 let mut sqlite_dialect = sqlite_dialect;
25 sqlite_dialect.name = DialectKind::Sqlite;
26
27 sqlite_dialect.sets_mut("reserved_keywords").clear();
28 sqlite_dialect
29 .sets_mut("reserved_keywords")
30 .extend(RESERVED_KEYWORDS);
31 sqlite_dialect.sets_mut("unreserved_keywords").clear();
32 sqlite_dialect
33 .sets_mut("unreserved_keywords")
34 .extend(UNRESERVED_KEYWORDS);
35
36 sqlite_dialect.add([
37 (
38 "ColumnConstraintDefaultGrammar".into(),
39 Ref::new("ExpressionSegment").to_matchable().into(),
40 ),
41 (
42 "BooleanBinaryOperatorGrammar".into(),
43 one_of(vec_of_erased![
44 Ref::new("AndOperatorGrammar"),
45 Ref::new("OrOperatorGrammar"),
46 Ref::keyword("REGEXP")
47 ])
48 .to_matchable()
49 .into(),
50 ),
51 (
52 "PrimaryKeyGrammar".into(),
53 Sequence::new(vec_of_erased![
54 Ref::keyword("PRIMARY"),
55 Ref::keyword("KEY"),
56 Sequence::new(vec_of_erased![Ref::keyword("AUTOINCREMENT")]).config(|config| {
57 config.optional();
58 })
59 ])
60 .to_matchable()
61 .into(),
62 ),
63 (
64 "TemporaryTransientGrammar".into(),
65 Ref::new("TemporaryGrammar").to_matchable().into(),
66 ),
67 (
68 "DateTimeLiteralGrammar".into(),
69 Sequence::new(vec_of_erased![
70 one_of(vec_of_erased![
71 Ref::keyword("DATE"),
72 Ref::keyword("DATETIME")
73 ]),
74 TypedParser::new(SyntaxKind::SingleQuote, SyntaxKind::DateConstructorLiteral)
75 ])
76 .to_matchable()
77 .into(),
78 ),
79 (
80 "BaseExpressionElementGrammar".into(),
81 one_of(vec_of_erased![
82 Ref::new("LiteralGrammar"),
83 Ref::new("BareFunctionSegment"),
84 Ref::new("FunctionSegment"),
85 Ref::new("ColumnReferenceSegment"),
86 Ref::new("ExpressionSegment"),
87 Sequence::new(vec_of_erased![
88 Ref::new("DatatypeSegment"),
89 Ref::new("LiteralGrammar")
90 ])
91 ])
92 .to_matchable()
93 .into(),
94 ),
95 (
96 "AutoIncrementGrammar".into(),
97 Nothing::new().to_matchable().into(),
98 ),
99 (
100 "CommentClauseSegment".into(),
101 Nothing::new().to_matchable().into(),
102 ),
103 (
104 "IntervalExpressionSegment".into(),
105 Nothing::new().to_matchable().into(),
106 ),
107 (
108 "TimeZoneGrammar".into(),
109 Nothing::new().to_matchable().into(),
110 ),
111 (
112 "FetchClauseSegment".into(),
113 Nothing::new().to_matchable().into(),
114 ),
115 (
116 "TrimParametersGrammar".into(),
117 Nothing::new().to_matchable().into(),
118 ),
119 (
120 "LikeGrammar".into(),
121 Sequence::new(vec_of_erased![Ref::keyword("LIKE")])
122 .to_matchable()
123 .into(),
124 ),
125 (
126 "OverlapsClauseSegment".into(),
127 Nothing::new().to_matchable().into(),
128 ),
129 (
130 "MLTableExpressionSegment".into(),
131 Nothing::new().to_matchable().into(),
132 ),
133 (
134 "MergeIntoLiteralGrammar".into(),
135 Nothing::new().to_matchable().into(),
136 ),
137 (
138 "SamplingExpressionSegment".into(),
139 Nothing::new().to_matchable().into(),
140 ),
141 (
142 "OrderByClauseTerminators".into(),
143 one_of(vec_of_erased![
144 Ref::keyword("LIMIT"),
145 Ref::keyword("WINDOW"),
146 Ref::new("FrameClauseUnitGrammar")
147 ])
148 .to_matchable()
149 .into(),
150 ),
151 (
152 "WhereClauseTerminatorGrammar".into(),
153 one_of(vec_of_erased![
154 Ref::keyword("LIMIT"),
155 Sequence::new(vec_of_erased![Ref::keyword("GROUP"), Ref::keyword("BY")]),
156 Sequence::new(vec_of_erased![Ref::keyword("ORDER"), Ref::keyword("BY")]),
157 Ref::keyword("WINDOW")
158 ])
159 .to_matchable()
160 .into(),
161 ),
162 (
163 "FromClauseTerminatorGrammar".into(),
164 one_of(vec_of_erased![
165 Ref::keyword("WHERE"),
166 Ref::keyword("LIMIT"),
167 Sequence::new(vec_of_erased![Ref::keyword("GROUP"), Ref::keyword("BY")]),
168 Sequence::new(vec_of_erased![Ref::keyword("ORDER"), Ref::keyword("BY")]),
169 Ref::keyword("WINDOW"),
170 Ref::new("SetOperatorSegment"),
171 Ref::new("WithNoSchemaBindingClauseSegment"),
172 Ref::new("WithDataClauseSegment")
173 ])
174 .to_matchable()
175 .into(),
176 ),
177 (
178 "GroupByClauseTerminatorGrammar".into(),
179 one_of(vec_of_erased![
180 Sequence::new(vec_of_erased![Ref::keyword("ORDER"), Ref::keyword("BY")]),
181 Ref::keyword("LIMIT"),
182 Ref::keyword("HAVING"),
183 Ref::keyword("WINDOW")
184 ])
185 .to_matchable()
186 .into(),
187 ),
188 (
189 "PostFunctionGrammar".into(),
190 Sequence::new(vec_of_erased![
191 Ref::new("FilterClauseGrammar").optional(),
192 Ref::new("OverClauseSegment"),
193 ])
194 .to_matchable()
195 .into(),
196 ),
197 (
198 "IgnoreRespectNullsGrammar".into(),
199 Nothing::new().to_matchable().into(),
200 ),
201 (
202 "SelectClauseTerminatorGrammar".into(),
203 one_of(vec_of_erased![
204 Ref::keyword("FROM"),
205 Ref::keyword("WHERE"),
206 Sequence::new(vec_of_erased![Ref::keyword("ORDER"), Ref::keyword("BY")]),
207 Ref::keyword("LIMIT"),
208 Ref::new("SetOperatorSegment")
209 ])
210 .to_matchable()
211 .into(),
212 ),
213 (
214 "FunctionContentsGrammar".into(),
215 AnyNumberOf::new(vec_of_erased![
216 Ref::new("ExpressionSegment"),
217 Sequence::new(vec_of_erased![
218 Ref::new("ExpressionSegment"),
219 Ref::keyword("AS"),
220 Ref::new("DatatypeSegment")
221 ]),
222 Sequence::new(vec_of_erased![
223 Ref::new("TrimParametersGrammar"),
224 Ref::new("ExpressionSegment")
225 .optional()
226 .exclude(Ref::keyword("FROM"))
227 .config(|config| {
228 config.exclude = Ref::keyword("FROM").to_matchable().into();
229 }),
230 Ref::keyword("FROM"),
231 Ref::new("ExpressionSegment")
232 ]),
233 Sequence::new(vec_of_erased![
234 one_of(vec_of_erased![
235 Ref::new("DatetimeUnitSegment"),
236 Ref::new("ExpressionSegment")
237 ]),
238 Ref::keyword("FROM"),
239 Ref::new("ExpressionSegment")
240 ]),
241 Sequence::new(vec_of_erased![
242 Ref::keyword("DISTINCT").optional(),
243 one_of(vec_of_erased![
244 Ref::new("StarSegment"),
245 Delimited::new(vec_of_erased![Ref::new(
246 "FunctionContentsExpressionGrammar"
247 )])
248 ])
249 ]),
250 Ref::new("OrderByClauseSegment"),
251 Sequence::new(vec_of_erased![
252 one_of(vec_of_erased![
253 Ref::new("QuotedLiteralSegment"),
254 Ref::new("SingleIdentifierGrammar"),
255 Ref::new("ColumnReferenceSegment")
256 ]),
257 Ref::keyword("IN"),
258 one_of(vec_of_erased![
259 Ref::new("QuotedLiteralSegment"),
260 Ref::new("SingleIdentifierGrammar"),
261 Ref::new("ColumnReferenceSegment")
262 ])
263 ]),
264 Ref::new("IndexColumnDefinitionSegment")
265 ])
266 .to_matchable()
267 .into(),
268 ),
269 (
270 "Expression_A_Unary_Operator_Grammar".into(),
271 one_of(vec_of_erased![
272 Ref::new("SignedSegmentGrammar")
273 .exclude(Sequence::new(vec_of_erased![Ref::new(
274 "QualifiedNumericLiteralSegment"
275 )]))
276 .config(|config| {
277 config.exclude = Sequence::new(vec_of_erased![Ref::new(
278 "QualifiedNumericLiteralSegment"
279 )])
280 .to_matchable()
281 .into();
282 }),
283 Ref::new("TildeSegment"),
284 Ref::new("NotOperatorGrammar")
285 ])
286 .to_matchable()
287 .into(),
288 ),
289 (
290 "IsClauseGrammar".into(),
291 one_of(vec_of_erased![
292 Ref::keyword("NULL"),
293 Ref::new("BooleanLiteralGrammar")
294 ])
295 .to_matchable()
296 .into(),
297 ),
298 ]);
299 sqlite_dialect.add([(
300 "SetOperatorSegment".into(),
301 NodeMatcher::new(SyntaxKind::SetOperator, |_| {
302 one_of(vec_of_erased![
303 Sequence::new(vec_of_erased![
304 Ref::keyword("UNION"),
305 one_of(vec_of_erased![
306 Ref::keyword("DISTINCT"),
307 Ref::keyword("ALL")
308 ])
309 .config(|config| {
310 config.optional();
311 })
312 ]),
313 Sequence::new(vec_of_erased![
314 one_of(vec_of_erased![
315 Ref::keyword("INTERSECT"),
316 Ref::keyword("EXCEPT")
317 ]),
318 Ref::keyword("ALL").optional()
319 ])
320 ])
321 .config(|config| {
322 config.exclude = Sequence::new(vec_of_erased![
323 Ref::keyword("EXCEPT"),
324 Bracketed::new(vec_of_erased![Anything::new()])
325 ])
326 .to_matchable()
327 .into();
328 })
329 .to_matchable()
330 })
331 .to_matchable()
332 .into(),
333 )]);
334
335 sqlite_dialect.replace_grammar(
336 "DatatypeSegment",
337 one_of(vec_of_erased![
338 Sequence::new(vec_of_erased![
339 Ref::keyword("DOUBLE"),
340 Ref::keyword("PRECISION")
341 ]),
342 Sequence::new(vec_of_erased![
343 Ref::keyword("UNSIGNED"),
344 Ref::keyword("BIG"),
345 Ref::keyword("INT")
346 ]),
347 Sequence::new(vec_of_erased![
348 one_of(vec_of_erased![
349 Sequence::new(vec_of_erased![
350 one_of(vec_of_erased![
351 Ref::keyword("VARYING"),
352 Ref::keyword("NATIVE")
353 ]),
354 one_of(vec_of_erased![Ref::keyword("CHARACTER")])
355 ]),
356 Ref::new("DatatypeIdentifierSegment")
357 ]),
358 Ref::new("BracketedArguments").optional()
359 ])
360 ])
361 .to_matchable(),
362 );
363 sqlite_dialect.add([(
364 "TableEndClauseSegment".into(),
365 NodeMatcher::new(SyntaxKind::TableEndClauseSegment, |_| {
366 Delimited::new(vec_of_erased![
367 Sequence::new(vec_of_erased![
368 Ref::keyword("WITHOUT"),
369 Ref::keyword("ROWID")
370 ]),
371 Ref::keyword("STRICT")
372 ])
373 .to_matchable()
374 })
375 .to_matchable()
376 .into(),
377 )]);
378
379 sqlite_dialect.replace_grammar(
380 "ValuesClauseSegment",
381 Sequence::new(vec_of_erased![
382 Ref::keyword("VALUES"),
383 Delimited::new(vec_of_erased![Sequence::new(vec_of_erased![
384 Bracketed::new(vec_of_erased![Delimited::new(vec_of_erased![
385 Ref::keyword("DEFAULT"),
386 Ref::new("ExpressionSegment")
387 ])])
388 .config(|config| {
389 config.parse_mode(ParseMode::Greedy);
390 })
391 ])])
392 ])
393 .to_matchable(),
394 );
395 sqlite_dialect.add([
396 (
397 "IndexColumnDefinitionSegment".into(),
398 NodeMatcher::new(SyntaxKind::IndexColumnDefinition, |_| {
399 Sequence::new(vec_of_erased![
400 one_of(vec_of_erased![
401 Ref::new("SingleIdentifierGrammar"),
402 Ref::new("ExpressionSegment")
403 ]),
404 one_of(vec_of_erased![Ref::keyword("ASC"), Ref::keyword("DESC")]).config(
405 |config| {
406 config.optional();
407 }
408 )
409 ])
410 .to_matchable()
411 })
412 .to_matchable()
413 .into(),
414 ),
415 (
416 "InsertStatementSegment".into(),
417 NodeMatcher::new(SyntaxKind::InsertStatement, |_| {
418 Sequence::new(vec_of_erased![
419 one_of(vec_of_erased![
420 Sequence::new(vec_of_erased![
421 Ref::keyword("INSERT"),
422 Sequence::new(vec_of_erased![
423 Ref::keyword("OR"),
424 one_of(vec_of_erased![
425 Ref::keyword("ABORT"),
426 Ref::keyword("FAIL"),
427 Ref::keyword("IGNORE"),
428 Ref::keyword("REPLACE"),
429 Ref::keyword("ROLLBACK")
430 ])
431 ])
432 .config(|config| {
433 config.optional();
434 })
435 ]),
436 Ref::keyword("REPLACE")
437 ]),
438 Ref::keyword("INTO"),
439 Ref::new("TableReferenceSegment"),
440 Ref::new("BracketedColumnReferenceListGrammar").optional(),
441 one_of(vec_of_erased![
442 Ref::new("ValuesClauseSegment"),
443 optionally_bracketed(vec_of_erased![Ref::new("SelectableGrammar")]),
444 Ref::new("DefaultValuesGrammar")
445 ]),
446 Ref::new("ReturningClauseSegment").optional()
447 ])
448 .to_matchable()
449 })
450 .to_matchable()
451 .into(),
452 ),
453 (
454 "DeleteStatementSegment".into(),
455 NodeMatcher::new(SyntaxKind::DeleteStatement, |_| {
456 Sequence::new(vec_of_erased![
457 Ref::keyword("DELETE"),
458 Ref::new("FromClauseSegment"),
459 Ref::new("WhereClauseSegment").optional(),
460 Ref::new("ReturningClauseSegment").optional()
461 ])
462 .to_matchable()
463 })
464 .to_matchable()
465 .into(),
466 ),
467 (
468 "UpdateStatementSegment".into(),
469 NodeMatcher::new(SyntaxKind::UpdateStatement, |_| {
470 Sequence::new(vec_of_erased![
471 Ref::keyword("UPDATE"),
472 Ref::new("TableReferenceSegment"),
473 Ref::new("AliasExpressionSegment")
474 .exclude(Ref::keyword("SET"))
475 .optional(),
476 Ref::new("SetClauseListSegment"),
477 Ref::new("FromClauseSegment").optional(),
478 Ref::new("WhereClauseSegment").optional(),
479 Ref::new("ReturningClauseSegment").optional()
480 ])
481 .to_matchable()
482 })
483 .to_matchable()
484 .into(),
485 ),
486 ]);
487
488 let column_constraint = sqlite_dialect
489 .grammar("ColumnConstraintSegment")
490 .match_grammar(&sqlite_dialect)
491 .unwrap()
492 .copy(
493 Some(vec_of_erased![
494 one_of(vec_of_erased![
495 Ref::keyword("DEFERRABLE"),
496 Sequence::new(vec_of_erased![
497 Ref::keyword("NOT"),
498 Ref::keyword("DEFERRABLE")
499 ])
500 ])
501 .config(|config| {
502 config.optional();
503 }),
504 one_of(vec_of_erased![
505 Sequence::new(vec_of_erased![
506 Ref::keyword("INITIALLY"),
507 Ref::keyword("DEFERRED")
508 ]),
509 Sequence::new(vec_of_erased![
510 Ref::keyword("INITIALLY"),
511 Ref::keyword("IMMEDIATE")
512 ])
513 ])
514 .config(|config| {
515 config.optional();
516 })
517 ]),
518 None,
519 None,
520 None,
521 Vec::new(),
522 false,
523 );
524 sqlite_dialect.replace_grammar("ColumnConstraintSegment", column_constraint);
525
526 sqlite_dialect.replace_grammar(
527 "TableConstraintSegment",
528 Sequence::new(vec_of_erased![
529 Sequence::new(vec_of_erased![
530 Ref::keyword("CONSTRAINT"),
531 Ref::new("ObjectReferenceSegment")
532 ])
533 .config(|config| {
534 config.optional();
535 }),
536 one_of(vec_of_erased![
537 Sequence::new(vec_of_erased![
538 Ref::keyword("CHECK"),
539 Bracketed::new(vec_of_erased![Ref::new("ExpressionSegment")])
540 ]),
541 Sequence::new(vec_of_erased![
542 Ref::keyword("UNIQUE"),
543 Ref::new("BracketedColumnReferenceListGrammar")
544 ]),
545 Sequence::new(vec_of_erased![
546 Ref::new("PrimaryKeyGrammar"),
547 Ref::new("BracketedColumnReferenceListGrammar")
548 ]),
549 Sequence::new(vec_of_erased![
550 Ref::new("ForeignKeyGrammar"),
551 Ref::new("BracketedColumnReferenceListGrammar"),
552 Ref::new("ReferenceDefinitionGrammar")
553 ])
554 ]),
555 one_of(vec_of_erased![
556 Ref::keyword("DEFERRABLE"),
557 Sequence::new(vec_of_erased![
558 Ref::keyword("NOT"),
559 Ref::keyword("DEFERRABLE")
560 ])
561 ])
562 .config(|config| {
563 config.optional();
564 }),
565 one_of(vec_of_erased![
566 Sequence::new(vec_of_erased![
567 Ref::keyword("INITIALLY"),
568 Ref::keyword("DEFERRED")
569 ]),
570 Sequence::new(vec_of_erased![
571 Ref::keyword("INITIALLY"),
572 Ref::keyword("IMMEDIATE")
573 ])
574 ])
575 .config(|config| {
576 config.optional();
577 })
578 ])
579 .to_matchable(),
580 );
581
582 sqlite_dialect.replace_grammar(
583 "TransactionStatementSegment",
584 Sequence::new(vec_of_erased![
585 one_of(vec_of_erased![
586 Ref::keyword("BEGIN"),
587 Ref::keyword("COMMIT"),
588 Ref::keyword("ROLLBACK"),
589 Ref::keyword("END")
590 ]),
591 one_of(vec_of_erased![Ref::keyword("TRANSACTION")]).config(|config| {
592 config.optional();
593 }),
594 Sequence::new(vec_of_erased![
595 Ref::keyword("TO"),
596 Ref::keyword("SAVEPOINT"),
597 Ref::new("ObjectReferenceSegment")
598 ])
599 .config(|config| {
600 config.optional();
601 })
602 ])
603 .to_matchable(),
604 );
605
606 sqlite_dialect.add([(
607 "PragmaReferenceSegment".into(),
608 NodeMatcher::new(SyntaxKind::PragmaReference, |sqlite_dialect| {
609 sqlite_dialect
610 .grammar("ObjectReferenceSegment")
611 .match_grammar(sqlite_dialect)
612 .unwrap()
613 })
614 .to_matchable()
615 .into(),
616 )]);
617
618 sqlite_dialect.add([(
619 "PragmaStatementSegment".into(),
620 NodeMatcher::new(SyntaxKind::PragmaStatement, |_| {
621 let pragma_value = one_of(vec_of_erased![
622 Ref::new("LiteralGrammar"),
623 Ref::new("BooleanLiteralGrammar"),
624 Ref::keyword("YES"),
625 Ref::keyword("NO"),
626 Ref::keyword("ON"),
627 Ref::keyword("OFF"),
628 Ref::keyword("NONE"),
629 Ref::keyword("FULL"),
630 Ref::keyword("INCREMENTAL"),
631 Ref::keyword("DELETE"),
632 Ref::keyword("TRUNCATE"),
633 Ref::keyword("PERSIST"),
634 Ref::keyword("MEMORY"),
635 Ref::keyword("WAL"),
636 Ref::keyword("NORMAL"),
637 Ref::keyword("EXCLUSIVE"),
638 Ref::keyword("FAST"),
639 Ref::keyword("EXTRA"),
640 Ref::keyword("DEFAULT"),
641 Ref::keyword("FILE"),
642 Ref::keyword("PASSIVE"),
643 Ref::keyword("RESTART"),
644 Ref::keyword("RESET")
645 ]);
646
647 Sequence::new(vec_of_erased![
648 Ref::keyword("PRAGMA"),
649 Ref::new("PragmaReferenceSegment"),
650 Bracketed::new(vec_of_erased![pragma_value.clone()]).config(|config| {
651 config.optional();
652 }),
653 Sequence::new(vec_of_erased![
654 Ref::new("EqualsSegment"),
655 optionally_bracketed(vec_of_erased![pragma_value])
656 ])
657 .config(|config| {
658 config.optional();
659 })
660 ])
661 .to_matchable()
662 })
663 .to_matchable()
664 .into(),
665 )]);
666
667 sqlite_dialect.replace_grammar(
668 "CreateTriggerStatementSegment",
669 Sequence::new(vec_of_erased![
670 Ref::keyword("CREATE"),
671 Ref::new("TemporaryGrammar").optional(),
672 Ref::keyword("TRIGGER"),
673 Ref::new("IfNotExistsGrammar").optional(),
674 Ref::new("TriggerReferenceSegment"),
675 one_of(vec_of_erased![
676 Ref::keyword("BEFORE"),
677 Ref::keyword("AFTER"),
678 Sequence::new(vec_of_erased![Ref::keyword("INSTEAD"), Ref::keyword("OF")])
679 ])
680 .config(|config| {
681 config.optional();
682 }),
683 one_of(vec_of_erased![
684 Ref::keyword("DELETE"),
685 Ref::keyword("INSERT"),
686 Sequence::new(vec_of_erased![
687 Ref::keyword("UPDATE"),
688 Sequence::new(vec_of_erased![
689 Ref::keyword("OF"),
690 Delimited::new(vec_of_erased![Ref::new("ColumnReferenceSegment")])
691 ])
692 .config(|config| {
693 config.optional();
694 })
695 ])
696 ]),
697 Ref::keyword("ON"),
698 Ref::new("TableReferenceSegment"),
699 Sequence::new(vec_of_erased![
700 Ref::keyword("FOR"),
701 Ref::keyword("EACH"),
702 Ref::keyword("ROW")
703 ])
704 .config(|config| {
705 config.optional();
706 }),
707 Sequence::new(vec_of_erased![
708 Ref::keyword("WHEN"),
709 Bracketed::new(vec_of_erased![Ref::new("ExpressionSegment")])
710 ])
711 .config(|config| {
712 config.optional();
713 }),
714 Ref::keyword("BEGIN"),
715 Delimited::new(vec_of_erased![
716 Ref::new("UpdateStatementSegment"),
717 Ref::new("InsertStatementSegment"),
718 Ref::new("DeleteStatementSegment"),
719 Ref::new("SelectableGrammar")
720 ])
721 .config(|config| {
722 config.delimiter(
723 AnyNumberOf::new(vec_of_erased![Ref::new("DelimiterGrammar")]).config(
724 |config| {
725 config.min_times = 1;
726 },
727 ),
728 );
729 config.allow_trailing = true;
730 }),
731 Ref::keyword("END")
732 ])
733 .to_matchable(),
734 );
735 sqlite_dialect.add([(
736 "UnorderedSelectStatementSegment".into(),
737 NodeMatcher::new(SyntaxKind::SelectStatement, |_| {
738 Sequence::new(vec_of_erased![
739 Ref::new("SelectClauseSegment"),
740 MetaSegment::dedent(),
741 Ref::new("FromClauseSegment").optional(),
742 Ref::new("WhereClauseSegment").optional(),
743 Ref::new("GroupByClauseSegment").optional(),
744 Ref::new("HavingClauseSegment").optional(),
745 Ref::new("OverlapsClauseSegment").optional(),
746 Ref::new("NamedWindowSegment").optional()
747 ])
748 .to_matchable()
749 })
750 .to_matchable()
751 .into(),
752 )]);
753
754 sqlite_dialect.add([(
755 "SelectStatementSegment".into(),
756 NodeMatcher::new(SyntaxKind::SelectStatement, |sqlite_dialect| {
757 sqlite_dialect
758 .grammar("UnorderedSelectStatementSegment")
759 .match_grammar(sqlite_dialect)
760 .unwrap()
761 .copy(
762 Some(vec_of_erased![
763 Ref::new("OrderByClauseSegment").optional(),
764 Ref::new("FetchClauseSegment").optional(),
765 Ref::new("LimitClauseSegment").optional(),
766 Ref::new("NamedWindowSegment").optional(),
767 ]),
768 None,
769 None,
770 None,
771 Vec::new(),
772 false,
773 )
774 })
775 .to_matchable()
776 .into(),
777 )]);
778
779 sqlite_dialect.replace_grammar(
780 "CreateIndexStatementSegment",
781 Sequence::new(vec_of_erased![
782 Ref::keyword("CREATE"),
783 Ref::keyword("UNIQUE").optional(),
784 Ref::keyword("INDEX"),
785 Ref::new("IfNotExistsGrammar").optional(),
786 Ref::new("IndexReferenceSegment"),
787 Ref::keyword("ON"),
788 Ref::new("TableReferenceSegment"),
789 Sequence::new(vec_of_erased![Bracketed::new(vec_of_erased![
790 Delimited::new(vec_of_erased![Ref::new("IndexColumnDefinitionSegment")])
791 ])]),
792 Ref::new("WhereClauseSegment").optional()
793 ])
794 .to_matchable(),
795 );
796
797 sqlite_dialect.replace_grammar(
798 "StatementSegment",
799 one_of(vec_of_erased![
800 Ref::new("AlterTableStatementSegment"),
801 Ref::new("CreateIndexStatementSegment"),
802 Ref::new("CreateTableStatementSegment"),
803 Ref::new("CreateTriggerStatementSegment"),
804 Ref::new("CreateViewStatementSegment"),
805 Ref::new("DeleteStatementSegment"),
806 Ref::new("DropIndexStatementSegment"),
807 Ref::new("DropTableStatementSegment"),
808 Ref::new("DropTriggerStatementSegment"),
809 Ref::new("DropViewStatementSegment"),
810 Ref::new("ExplainStatementSegment"),
811 Ref::new("InsertStatementSegment"),
812 Ref::new("PragmaStatementSegment"),
813 Ref::new("SelectableGrammar"),
814 Ref::new("TransactionStatementSegment"),
815 Ref::new("UpdateStatementSegment"),
816 Bracketed::new(vec_of_erased![Ref::new("StatementSegment")])
817 ])
818 .to_matchable(),
819 );
820
821 sqlite_dialect.replace_grammar(
822 "AlterTableStatementSegment",
823 Sequence::new(vec_of_erased![
824 Ref::keyword("ALTER"),
825 Ref::keyword("TABLE"),
826 Ref::new("TableReferenceSegment"),
827 one_of(vec_of_erased![
828 Sequence::new(vec_of_erased![
829 Ref::keyword("RENAME"),
830 Ref::keyword("TO"),
831 one_of(vec_of_erased![one_of(vec_of_erased![
832 Ref::new("ParameterNameSegment"),
833 Ref::new("QuotedIdentifierSegment")
834 ])])
835 ]),
836 Sequence::new(vec_of_erased![
837 Ref::keyword("RENAME"),
838 Ref::keyword("COLUMN").optional(),
839 Ref::new("ColumnReferenceSegment"),
840 Ref::keyword("TO"),
841 Ref::new("ColumnReferenceSegment")
842 ]),
843 Sequence::new(vec_of_erased![
844 Ref::keyword("ADD"),
845 Ref::keyword("COLUMN").optional(),
846 Ref::new("ColumnDefinitionSegment"),
847 ]),
848 Sequence::new(vec_of_erased![
849 Ref::keyword("DROP"),
850 Ref::keyword("COLUMN").optional(),
851 Ref::new("ColumnReferenceSegment")
852 ]),
853 ]),
854 ])
855 .to_matchable(),
856 );
857
858 sqlite_dialect.add([(
859 "ReturningClauseSegment".into(),
860 Sequence::new(vec_of_erased![
861 Ref::keyword("RETURNING"),
862 one_of(vec_of_erased![
863 Ref::new("StarSegment"),
864 Delimited::new(vec_of_erased![Sequence::new(vec_of_erased![
865 Ref::new("ExpressionSegment"),
866 Ref::new("AsAliasExpressionSegment").optional(),
867 ])])
868 ])
869 ])
870 .to_matchable()
871 .into(),
872 )]);
873
874 sqlite_dialect.add([(
875 "AsAliasExpressionSegment".into(),
876 NodeMatcher::new(SyntaxKind::AliasExpression, |_| {
877 Sequence::new(vec_of_erased![
878 MetaSegment::indent(),
879 Ref::keyword("AS"),
880 Ref::new("SingleIdentifierGrammar"),
881 MetaSegment::dedent(),
882 ])
883 .to_matchable()
884 })
885 .to_matchable()
886 .into(),
887 )]);
888
889 sqlite_dialect
890}