1use sqruff_lib_core::dialects::base::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::base::{Anything, Nothing, Ref};
7use sqruff_lib_core::parser::grammar::delimited::Delimited;
8use sqruff_lib_core::parser::grammar::sequence::{Bracketed, Sequence};
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(
302 SyntaxKind::SetOperator,
303 one_of(vec_of_erased![
304 Sequence::new(vec_of_erased![
305 Ref::keyword("UNION"),
306 one_of(vec_of_erased![
307 Ref::keyword("DISTINCT"),
308 Ref::keyword("ALL")
309 ])
310 .config(|config| {
311 config.optional();
312 })
313 ]),
314 Sequence::new(vec_of_erased![
315 one_of(vec_of_erased![
316 Ref::keyword("INTERSECT"),
317 Ref::keyword("EXCEPT")
318 ]),
319 Ref::keyword("ALL").optional()
320 ])
321 ])
322 .config(|config| {
323 config.exclude = Sequence::new(vec_of_erased![
324 Ref::keyword("EXCEPT"),
325 Bracketed::new(vec_of_erased![Anything::new()])
326 ])
327 .to_matchable()
328 .into();
329 })
330 .to_matchable(),
331 )
332 .to_matchable()
333 .into(),
334 )]);
335
336 sqlite_dialect.replace_grammar(
337 "DatatypeSegment",
338 one_of(vec_of_erased![
339 Sequence::new(vec_of_erased![
340 Ref::keyword("DOUBLE"),
341 Ref::keyword("PRECISION")
342 ]),
343 Sequence::new(vec_of_erased![
344 Ref::keyword("UNSIGNED"),
345 Ref::keyword("BIG"),
346 Ref::keyword("INT")
347 ]),
348 Sequence::new(vec_of_erased![
349 one_of(vec_of_erased![
350 Sequence::new(vec_of_erased![
351 one_of(vec_of_erased![
352 Ref::keyword("VARYING"),
353 Ref::keyword("NATIVE")
354 ]),
355 one_of(vec_of_erased![Ref::keyword("CHARACTER")])
356 ]),
357 Ref::new("DatatypeIdentifierSegment")
358 ]),
359 Ref::new("BracketedArguments").optional()
360 ])
361 ])
362 .to_matchable(),
363 );
364 sqlite_dialect.add([(
365 "TableEndClauseSegment".into(),
366 NodeMatcher::new(
367 SyntaxKind::TableEndClauseSegment,
368 Delimited::new(vec_of_erased![
369 Sequence::new(vec_of_erased![
370 Ref::keyword("WITHOUT"),
371 Ref::keyword("ROWID")
372 ]),
373 Ref::keyword("STRICT")
374 ])
375 .to_matchable(),
376 )
377 .to_matchable()
378 .into(),
379 )]);
380
381 sqlite_dialect.replace_grammar(
382 "ValuesClauseSegment",
383 Sequence::new(vec_of_erased![
384 Ref::keyword("VALUES"),
385 Delimited::new(vec_of_erased![Sequence::new(vec_of_erased![
386 Bracketed::new(vec_of_erased![Delimited::new(vec_of_erased![
387 Ref::keyword("DEFAULT"),
388 Ref::new("ExpressionSegment")
389 ])])
390 .config(|config| {
391 config.parse_mode(ParseMode::Greedy);
392 })
393 ])])
394 ])
395 .to_matchable(),
396 );
397 sqlite_dialect.add([
398 (
399 "IndexColumnDefinitionSegment".into(),
400 NodeMatcher::new(
401 SyntaxKind::IndexColumnDefinition,
402 Sequence::new(vec_of_erased![
403 one_of(vec_of_erased![
404 Ref::new("SingleIdentifierGrammar"),
405 Ref::new("ExpressionSegment")
406 ]),
407 one_of(vec_of_erased![Ref::keyword("ASC"), Ref::keyword("DESC")]).config(
408 |config| {
409 config.optional();
410 }
411 )
412 ])
413 .to_matchable(),
414 )
415 .to_matchable()
416 .into(),
417 ),
418 (
419 "InsertStatementSegment".into(),
420 NodeMatcher::new(
421 SyntaxKind::InsertStatement,
422 Sequence::new(vec_of_erased![
423 one_of(vec_of_erased![
424 Sequence::new(vec_of_erased![
425 Ref::keyword("INSERT"),
426 Sequence::new(vec_of_erased![
427 Ref::keyword("OR"),
428 one_of(vec_of_erased![
429 Ref::keyword("ABORT"),
430 Ref::keyword("FAIL"),
431 Ref::keyword("IGNORE"),
432 Ref::keyword("REPLACE"),
433 Ref::keyword("ROLLBACK")
434 ])
435 ])
436 .config(|config| {
437 config.optional();
438 })
439 ]),
440 Ref::keyword("REPLACE")
441 ]),
442 Ref::keyword("INTO"),
443 Ref::new("TableReferenceSegment"),
444 Ref::new("BracketedColumnReferenceListGrammar").optional(),
445 one_of(vec_of_erased![
446 Ref::new("ValuesClauseSegment"),
447 optionally_bracketed(vec_of_erased![Ref::new("SelectableGrammar")]),
448 Ref::new("DefaultValuesGrammar")
449 ]),
450 Ref::new("ReturningClauseSegment").optional()
451 ])
452 .to_matchable(),
453 )
454 .to_matchable()
455 .into(),
456 ),
457 (
458 "DeleteStatementSegment".into(),
459 NodeMatcher::new(
460 SyntaxKind::DeleteStatement,
461 Sequence::new(vec_of_erased![
462 Ref::keyword("DELETE"),
463 Ref::new("FromClauseSegment"),
464 Ref::new("WhereClauseSegment").optional(),
465 Ref::new("ReturningClauseSegment").optional()
466 ])
467 .to_matchable(),
468 )
469 .to_matchable()
470 .into(),
471 ),
472 (
473 "UpdateStatementSegment".into(),
474 NodeMatcher::new(
475 SyntaxKind::UpdateStatement,
476 Sequence::new(vec_of_erased![
477 Ref::keyword("UPDATE"),
478 Ref::new("TableReferenceSegment"),
479 Ref::new("AliasExpressionSegment")
480 .exclude(Ref::keyword("SET"))
481 .optional(),
482 Ref::new("SetClauseListSegment"),
483 Ref::new("FromClauseSegment").optional(),
484 Ref::new("WhereClauseSegment").optional(),
485 Ref::new("ReturningClauseSegment").optional()
486 ])
487 .to_matchable(),
488 )
489 .to_matchable()
490 .into(),
491 ),
492 ]);
493
494 let column_constraint = sqlite_dialect
495 .grammar("ColumnConstraintSegment")
496 .match_grammar()
497 .unwrap()
498 .copy(
499 Some(vec_of_erased![
500 one_of(vec_of_erased![
501 Ref::keyword("DEFERRABLE"),
502 Sequence::new(vec_of_erased![
503 Ref::keyword("NOT"),
504 Ref::keyword("DEFERRABLE")
505 ])
506 ])
507 .config(|config| {
508 config.optional();
509 }),
510 one_of(vec_of_erased![
511 Sequence::new(vec_of_erased![
512 Ref::keyword("INITIALLY"),
513 Ref::keyword("DEFERRED")
514 ]),
515 Sequence::new(vec_of_erased![
516 Ref::keyword("INITIALLY"),
517 Ref::keyword("IMMEDIATE")
518 ])
519 ])
520 .config(|config| {
521 config.optional();
522 })
523 ]),
524 None,
525 None,
526 None,
527 Vec::new(),
528 false,
529 );
530 sqlite_dialect.replace_grammar("ColumnConstraintSegment", column_constraint);
531
532 sqlite_dialect.replace_grammar(
533 "TableConstraintSegment",
534 Sequence::new(vec_of_erased![
535 Sequence::new(vec_of_erased![
536 Ref::keyword("CONSTRAINT"),
537 Ref::new("ObjectReferenceSegment")
538 ])
539 .config(|config| {
540 config.optional();
541 }),
542 one_of(vec_of_erased![
543 Sequence::new(vec_of_erased![
544 Ref::keyword("CHECK"),
545 Bracketed::new(vec_of_erased![Ref::new("ExpressionSegment")])
546 ]),
547 Sequence::new(vec_of_erased![
548 Ref::keyword("UNIQUE"),
549 Ref::new("BracketedColumnReferenceListGrammar")
550 ]),
551 Sequence::new(vec_of_erased![
552 Ref::new("PrimaryKeyGrammar"),
553 Ref::new("BracketedColumnReferenceListGrammar")
554 ]),
555 Sequence::new(vec_of_erased![
556 Ref::new("ForeignKeyGrammar"),
557 Ref::new("BracketedColumnReferenceListGrammar"),
558 Ref::new("ReferenceDefinitionGrammar")
559 ])
560 ]),
561 one_of(vec_of_erased![
562 Ref::keyword("DEFERRABLE"),
563 Sequence::new(vec_of_erased![
564 Ref::keyword("NOT"),
565 Ref::keyword("DEFERRABLE")
566 ])
567 ])
568 .config(|config| {
569 config.optional();
570 }),
571 one_of(vec_of_erased![
572 Sequence::new(vec_of_erased![
573 Ref::keyword("INITIALLY"),
574 Ref::keyword("DEFERRED")
575 ]),
576 Sequence::new(vec_of_erased![
577 Ref::keyword("INITIALLY"),
578 Ref::keyword("IMMEDIATE")
579 ])
580 ])
581 .config(|config| {
582 config.optional();
583 })
584 ])
585 .to_matchable(),
586 );
587
588 sqlite_dialect.replace_grammar(
589 "TransactionStatementSegment",
590 Sequence::new(vec_of_erased![
591 one_of(vec_of_erased![
592 Ref::keyword("BEGIN"),
593 Ref::keyword("COMMIT"),
594 Ref::keyword("ROLLBACK"),
595 Ref::keyword("END")
596 ]),
597 one_of(vec_of_erased![Ref::keyword("TRANSACTION")]).config(|config| {
598 config.optional();
599 }),
600 Sequence::new(vec_of_erased![
601 Ref::keyword("TO"),
602 Ref::keyword("SAVEPOINT"),
603 Ref::new("ObjectReferenceSegment")
604 ])
605 .config(|config| {
606 config.optional();
607 })
608 ])
609 .to_matchable(),
610 );
611
612 sqlite_dialect.add([(
613 "PragmaReferenceSegment".into(),
614 NodeMatcher::new(
615 SyntaxKind::PragmaReference,
616 sqlite_dialect
617 .grammar("ObjectReferenceSegment")
618 .match_grammar()
619 .unwrap(),
620 )
621 .to_matchable()
622 .into(),
623 )]);
624
625 sqlite_dialect.add([(
626 "PragmaStatementSegment".into(),
627 NodeMatcher::new(SyntaxKind::PragmaStatement, {
628 let pragma_value = one_of(vec_of_erased![
629 Ref::new("LiteralGrammar"),
630 Ref::new("BooleanLiteralGrammar"),
631 Ref::keyword("YES"),
632 Ref::keyword("NO"),
633 Ref::keyword("ON"),
634 Ref::keyword("OFF"),
635 Ref::keyword("NONE"),
636 Ref::keyword("FULL"),
637 Ref::keyword("INCREMENTAL"),
638 Ref::keyword("DELETE"),
639 Ref::keyword("TRUNCATE"),
640 Ref::keyword("PERSIST"),
641 Ref::keyword("MEMORY"),
642 Ref::keyword("WAL"),
643 Ref::keyword("NORMAL"),
644 Ref::keyword("EXCLUSIVE"),
645 Ref::keyword("FAST"),
646 Ref::keyword("EXTRA"),
647 Ref::keyword("DEFAULT"),
648 Ref::keyword("FILE"),
649 Ref::keyword("PASSIVE"),
650 Ref::keyword("RESTART"),
651 Ref::keyword("RESET")
652 ]);
653
654 Sequence::new(vec_of_erased![
655 Ref::keyword("PRAGMA"),
656 Ref::new("PragmaReferenceSegment"),
657 Bracketed::new(vec_of_erased![pragma_value.clone()]).config(|config| {
658 config.optional();
659 }),
660 Sequence::new(vec_of_erased![
661 Ref::new("EqualsSegment"),
662 optionally_bracketed(vec_of_erased![pragma_value])
663 ])
664 .config(|config| {
665 config.optional();
666 })
667 ])
668 .to_matchable()
669 })
670 .to_matchable()
671 .into(),
672 )]);
673
674 sqlite_dialect.replace_grammar(
675 "CreateTriggerStatementSegment",
676 Sequence::new(vec_of_erased![
677 Ref::keyword("CREATE"),
678 Ref::new("TemporaryGrammar").optional(),
679 Ref::keyword("TRIGGER"),
680 Ref::new("IfNotExistsGrammar").optional(),
681 Ref::new("TriggerReferenceSegment"),
682 one_of(vec_of_erased![
683 Ref::keyword("BEFORE"),
684 Ref::keyword("AFTER"),
685 Sequence::new(vec_of_erased![Ref::keyword("INSTEAD"), Ref::keyword("OF")])
686 ])
687 .config(|config| {
688 config.optional();
689 }),
690 one_of(vec_of_erased![
691 Ref::keyword("DELETE"),
692 Ref::keyword("INSERT"),
693 Sequence::new(vec_of_erased![
694 Ref::keyword("UPDATE"),
695 Sequence::new(vec_of_erased![
696 Ref::keyword("OF"),
697 Delimited::new(vec_of_erased![Ref::new("ColumnReferenceSegment")])
698 ])
699 .config(|config| {
700 config.optional();
701 })
702 ])
703 ]),
704 Ref::keyword("ON"),
705 Ref::new("TableReferenceSegment"),
706 Sequence::new(vec_of_erased![
707 Ref::keyword("FOR"),
708 Ref::keyword("EACH"),
709 Ref::keyword("ROW")
710 ])
711 .config(|config| {
712 config.optional();
713 }),
714 Sequence::new(vec_of_erased![
715 Ref::keyword("WHEN"),
716 Bracketed::new(vec_of_erased![Ref::new("ExpressionSegment")])
717 ])
718 .config(|config| {
719 config.optional();
720 }),
721 Ref::keyword("BEGIN"),
722 Delimited::new(vec_of_erased![
723 Ref::new("UpdateStatementSegment"),
724 Ref::new("InsertStatementSegment"),
725 Ref::new("DeleteStatementSegment"),
726 Ref::new("SelectableGrammar")
727 ])
728 .config(|config| {
729 config.delimiter(
730 AnyNumberOf::new(vec_of_erased![Ref::new("DelimiterGrammar")]).config(
731 |config| {
732 config.min_times = 1;
733 },
734 ),
735 );
736 config.allow_trailing = true;
737 }),
738 Ref::keyword("END")
739 ])
740 .to_matchable(),
741 );
742 sqlite_dialect.add([(
743 "UnorderedSelectStatementSegment".into(),
744 NodeMatcher::new(
745 SyntaxKind::SelectStatement,
746 Sequence::new(vec_of_erased![
747 Ref::new("SelectClauseSegment"),
748 MetaSegment::dedent(),
749 Ref::new("FromClauseSegment").optional(),
750 Ref::new("WhereClauseSegment").optional(),
751 Ref::new("GroupByClauseSegment").optional(),
752 Ref::new("HavingClauseSegment").optional(),
753 Ref::new("OverlapsClauseSegment").optional(),
754 Ref::new("NamedWindowSegment").optional()
755 ])
756 .to_matchable(),
757 )
758 .to_matchable()
759 .into(),
760 )]);
761
762 sqlite_dialect.add([(
763 "SelectStatementSegment".into(),
764 NodeMatcher::new(
765 SyntaxKind::SelectStatement,
766 sqlite_dialect
767 .grammar("UnorderedSelectStatementSegment")
768 .match_grammar()
769 .unwrap()
770 .copy(
771 Some(vec_of_erased![
772 Ref::new("OrderByClauseSegment").optional(),
773 Ref::new("FetchClauseSegment").optional(),
774 Ref::new("LimitClauseSegment").optional(),
775 Ref::new("NamedWindowSegment").optional(),
776 ]),
777 None,
778 None,
779 None,
780 Vec::new(),
781 false,
782 ),
783 )
784 .to_matchable()
785 .into(),
786 )]);
787
788 sqlite_dialect.replace_grammar(
789 "CreateIndexStatementSegment",
790 Sequence::new(vec_of_erased![
791 Ref::keyword("CREATE"),
792 Ref::keyword("UNIQUE").optional(),
793 Ref::keyword("INDEX"),
794 Ref::new("IfNotExistsGrammar").optional(),
795 Ref::new("IndexReferenceSegment"),
796 Ref::keyword("ON"),
797 Ref::new("TableReferenceSegment"),
798 Sequence::new(vec_of_erased![Bracketed::new(vec_of_erased![
799 Delimited::new(vec_of_erased![Ref::new("IndexColumnDefinitionSegment")])
800 ])]),
801 Ref::new("WhereClauseSegment").optional()
802 ])
803 .to_matchable(),
804 );
805
806 sqlite_dialect.replace_grammar(
807 "StatementSegment",
808 one_of(vec_of_erased![
809 Ref::new("AlterTableStatementSegment"),
810 Ref::new("CreateIndexStatementSegment"),
811 Ref::new("CreateTableStatementSegment"),
812 Ref::new("CreateTriggerStatementSegment"),
813 Ref::new("CreateViewStatementSegment"),
814 Ref::new("DeleteStatementSegment"),
815 Ref::new("DropIndexStatementSegment"),
816 Ref::new("DropTableStatementSegment"),
817 Ref::new("DropTriggerStatementSegment"),
818 Ref::new("DropViewStatementSegment"),
819 Ref::new("ExplainStatementSegment"),
820 Ref::new("InsertStatementSegment"),
821 Ref::new("PragmaStatementSegment"),
822 Ref::new("SelectableGrammar"),
823 Ref::new("TransactionStatementSegment"),
824 Ref::new("UpdateStatementSegment"),
825 Bracketed::new(vec_of_erased![Ref::new("StatementSegment")])
826 ])
827 .to_matchable(),
828 );
829
830 sqlite_dialect.replace_grammar(
831 "AlterTableStatementSegment",
832 Sequence::new(vec_of_erased![
833 Ref::keyword("ALTER"),
834 Ref::keyword("TABLE"),
835 Ref::new("TableReferenceSegment"),
836 one_of(vec_of_erased![
837 Sequence::new(vec_of_erased![
838 Ref::keyword("RENAME"),
839 Ref::keyword("TO"),
840 one_of(vec_of_erased![one_of(vec_of_erased![
841 Ref::new("ParameterNameSegment"),
842 Ref::new("QuotedIdentifierSegment")
843 ])])
844 ]),
845 Sequence::new(vec_of_erased![
846 Ref::keyword("RENAME"),
847 Ref::keyword("COLUMN").optional(),
848 Ref::new("ColumnReferenceSegment"),
849 Ref::keyword("TO"),
850 Ref::new("ColumnReferenceSegment")
851 ]),
852 Sequence::new(vec_of_erased![
853 Ref::keyword("ADD"),
854 Ref::keyword("COLUMN").optional(),
855 Ref::new("ColumnDefinitionSegment"),
856 ]),
857 Sequence::new(vec_of_erased![
858 Ref::keyword("DROP"),
859 Ref::keyword("COLUMN").optional(),
860 Ref::new("ColumnReferenceSegment")
861 ]),
862 ]),
863 ])
864 .to_matchable(),
865 );
866
867 sqlite_dialect.add([(
868 "ReturningClauseSegment".into(),
869 Sequence::new(vec_of_erased![
870 Ref::keyword("RETURNING"),
871 one_of(vec_of_erased![
872 Ref::new("StarSegment"),
873 Delimited::new(vec_of_erased![Sequence::new(vec_of_erased![
874 Ref::new("ExpressionSegment"),
875 Ref::new("AsAliasExpressionSegment").optional(),
876 ])])
877 ])
878 ])
879 .to_matchable()
880 .into(),
881 )]);
882
883 sqlite_dialect.add([(
884 "AsAliasExpressionSegment".into(),
885 NodeMatcher::new(
886 SyntaxKind::AliasExpression,
887 Sequence::new(vec_of_erased![
888 MetaSegment::indent(),
889 Ref::keyword("AS"),
890 Ref::new("SingleIdentifierGrammar"),
891 MetaSegment::dedent(),
892 ])
893 .to_matchable(),
894 )
895 .to_matchable()
896 .into(),
897 )]);
898
899 sqlite_dialect
900}