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 Ref::new("FilterClauseGrammar").to_matchable().into(),
191 ),
192 (
193 "IgnoreRespectNullsGrammar".into(),
194 Nothing::new().to_matchable().into(),
195 ),
196 (
197 "SelectClauseTerminatorGrammar".into(),
198 one_of(vec_of_erased![
199 Ref::keyword("FROM"),
200 Ref::keyword("WHERE"),
201 Sequence::new(vec_of_erased![Ref::keyword("ORDER"), Ref::keyword("BY")]),
202 Ref::keyword("LIMIT"),
203 Ref::new("SetOperatorSegment")
204 ])
205 .to_matchable()
206 .into(),
207 ),
208 (
209 "FunctionContentsGrammar".into(),
210 AnyNumberOf::new(vec_of_erased![
211 Ref::new("ExpressionSegment"),
212 Sequence::new(vec_of_erased![
213 Ref::new("ExpressionSegment"),
214 Ref::keyword("AS"),
215 Ref::new("DatatypeSegment")
216 ]),
217 Sequence::new(vec_of_erased![
218 Ref::new("TrimParametersGrammar"),
219 Ref::new("ExpressionSegment")
220 .optional()
221 .exclude(Ref::keyword("FROM"))
222 .config(|config| {
223 config.exclude = Ref::keyword("FROM").to_matchable().into();
224 }),
225 Ref::keyword("FROM"),
226 Ref::new("ExpressionSegment")
227 ]),
228 Sequence::new(vec_of_erased![
229 one_of(vec_of_erased![
230 Ref::new("DatetimeUnitSegment"),
231 Ref::new("ExpressionSegment")
232 ]),
233 Ref::keyword("FROM"),
234 Ref::new("ExpressionSegment")
235 ]),
236 Sequence::new(vec_of_erased![
237 Ref::keyword("DISTINCT").optional(),
238 one_of(vec_of_erased![
239 Ref::new("StarSegment"),
240 Delimited::new(vec_of_erased![Ref::new(
241 "FunctionContentsExpressionGrammar"
242 )])
243 ])
244 ]),
245 Ref::new("OrderByClauseSegment"),
246 Sequence::new(vec_of_erased![
247 one_of(vec_of_erased![
248 Ref::new("QuotedLiteralSegment"),
249 Ref::new("SingleIdentifierGrammar"),
250 Ref::new("ColumnReferenceSegment")
251 ]),
252 Ref::keyword("IN"),
253 one_of(vec_of_erased![
254 Ref::new("QuotedLiteralSegment"),
255 Ref::new("SingleIdentifierGrammar"),
256 Ref::new("ColumnReferenceSegment")
257 ])
258 ]),
259 Ref::new("IndexColumnDefinitionSegment")
260 ])
261 .to_matchable()
262 .into(),
263 ),
264 (
265 "Expression_A_Unary_Operator_Grammar".into(),
266 one_of(vec_of_erased![
267 Ref::new("SignedSegmentGrammar")
268 .exclude(Sequence::new(vec_of_erased![Ref::new(
269 "QualifiedNumericLiteralSegment"
270 )]))
271 .config(|config| {
272 config.exclude = Sequence::new(vec_of_erased![Ref::new(
273 "QualifiedNumericLiteralSegment"
274 )])
275 .to_matchable()
276 .into();
277 }),
278 Ref::new("TildeSegment"),
279 Ref::new("NotOperatorGrammar")
280 ])
281 .to_matchable()
282 .into(),
283 ),
284 (
285 "IsClauseGrammar".into(),
286 one_of(vec_of_erased![
287 Ref::keyword("NULL"),
288 Ref::new("BooleanLiteralGrammar")
289 ])
290 .to_matchable()
291 .into(),
292 ),
293 ]);
294 sqlite_dialect.add([(
295 "SetOperatorSegment".into(),
296 NodeMatcher::new(
297 SyntaxKind::SetOperator,
298 one_of(vec_of_erased![
299 Sequence::new(vec_of_erased![
300 Ref::keyword("UNION"),
301 one_of(vec_of_erased![
302 Ref::keyword("DISTINCT"),
303 Ref::keyword("ALL")
304 ])
305 .config(|config| {
306 config.optional();
307 })
308 ]),
309 Sequence::new(vec_of_erased![
310 one_of(vec_of_erased![
311 Ref::keyword("INTERSECT"),
312 Ref::keyword("EXCEPT")
313 ]),
314 Ref::keyword("ALL").optional()
315 ])
316 ])
317 .config(|config| {
318 config.exclude = Sequence::new(vec_of_erased![
319 Ref::keyword("EXCEPT"),
320 Bracketed::new(vec_of_erased![Anything::new()])
321 ])
322 .to_matchable()
323 .into();
324 })
325 .to_matchable(),
326 )
327 .to_matchable()
328 .into(),
329 )]);
330
331 sqlite_dialect.replace_grammar(
332 "DatatypeSegment",
333 one_of(vec_of_erased![
334 Sequence::new(vec_of_erased![
335 Ref::keyword("DOUBLE"),
336 Ref::keyword("PRECISION")
337 ]),
338 Sequence::new(vec_of_erased![
339 Ref::keyword("UNSIGNED"),
340 Ref::keyword("BIG"),
341 Ref::keyword("INT")
342 ]),
343 Sequence::new(vec_of_erased![
344 one_of(vec_of_erased![
345 Sequence::new(vec_of_erased![
346 one_of(vec_of_erased![
347 Ref::keyword("VARYING"),
348 Ref::keyword("NATIVE")
349 ]),
350 one_of(vec_of_erased![Ref::keyword("CHARACTER")])
351 ]),
352 Ref::new("DatatypeIdentifierSegment")
353 ]),
354 Ref::new("BracketedArguments").optional()
355 ])
356 ])
357 .to_matchable(),
358 );
359 sqlite_dialect.add([(
360 "TableEndClauseSegment".into(),
361 NodeMatcher::new(
362 SyntaxKind::TableEndClauseSegment,
363 Delimited::new(vec_of_erased![
364 Sequence::new(vec_of_erased![
365 Ref::keyword("WITHOUT"),
366 Ref::keyword("ROWID")
367 ]),
368 Ref::keyword("STRICT")
369 ])
370 .to_matchable(),
371 )
372 .to_matchable()
373 .into(),
374 )]);
375
376 sqlite_dialect.replace_grammar(
377 "ValuesClauseSegment",
378 Sequence::new(vec_of_erased![
379 Ref::keyword("VALUES"),
380 Delimited::new(vec_of_erased![Sequence::new(vec_of_erased![
381 Bracketed::new(vec_of_erased![Delimited::new(vec_of_erased![
382 Ref::keyword("DEFAULT"),
383 Ref::new("ExpressionSegment")
384 ])])
385 .config(|config| {
386 config.parse_mode(ParseMode::Greedy);
387 })
388 ])])
389 ])
390 .to_matchable(),
391 );
392 sqlite_dialect.add([
393 (
394 "IndexColumnDefinitionSegment".into(),
395 NodeMatcher::new(
396 SyntaxKind::IndexColumnDefinition,
397 Sequence::new(vec_of_erased![
398 one_of(vec_of_erased![
399 Ref::new("SingleIdentifierGrammar"),
400 Ref::new("ExpressionSegment")
401 ]),
402 one_of(vec_of_erased![Ref::keyword("ASC"), Ref::keyword("DESC")]).config(
403 |config| {
404 config.optional();
405 }
406 )
407 ])
408 .to_matchable(),
409 )
410 .to_matchable()
411 .into(),
412 ),
413 (
414 "InsertStatementSegment".into(),
415 NodeMatcher::new(
416 SyntaxKind::InsertStatement,
417 Sequence::new(vec_of_erased![
418 one_of(vec_of_erased![
419 Sequence::new(vec_of_erased![
420 Ref::keyword("INSERT"),
421 Sequence::new(vec_of_erased![
422 Ref::keyword("OR"),
423 one_of(vec_of_erased![
424 Ref::keyword("ABORT"),
425 Ref::keyword("FAIL"),
426 Ref::keyword("IGNORE"),
427 Ref::keyword("REPLACE"),
428 Ref::keyword("ROLLBACK")
429 ])
430 ])
431 .config(|config| {
432 config.optional();
433 })
434 ]),
435 Ref::keyword("REPLACE")
436 ]),
437 Ref::keyword("INTO"),
438 Ref::new("TableReferenceSegment"),
439 Ref::new("BracketedColumnReferenceListGrammar").optional(),
440 one_of(vec_of_erased![
441 Ref::new("ValuesClauseSegment"),
442 optionally_bracketed(vec_of_erased![Ref::new("SelectableGrammar")]),
443 Ref::new("DefaultValuesGrammar")
444 ]),
445 Ref::new("ReturningClauseSegment").optional()
446 ])
447 .to_matchable(),
448 )
449 .to_matchable()
450 .into(),
451 ),
452 ]);
453
454 let column_constraint = sqlite_dialect
455 .grammar("ColumnConstraintSegment")
456 .match_grammar()
457 .unwrap()
458 .copy(
459 Some(vec_of_erased![
460 one_of(vec_of_erased![
461 Ref::keyword("DEFERRABLE"),
462 Sequence::new(vec_of_erased![
463 Ref::keyword("NOT"),
464 Ref::keyword("DEFERRABLE")
465 ])
466 ])
467 .config(|config| {
468 config.optional();
469 }),
470 one_of(vec_of_erased![
471 Sequence::new(vec_of_erased![
472 Ref::keyword("INITIALLY"),
473 Ref::keyword("DEFERRED")
474 ]),
475 Sequence::new(vec_of_erased![
476 Ref::keyword("INITIALLY"),
477 Ref::keyword("IMMEDIATE")
478 ])
479 ])
480 .config(|config| {
481 config.optional();
482 })
483 ]),
484 None,
485 None,
486 None,
487 Vec::new(),
488 false,
489 );
490 sqlite_dialect.replace_grammar("ColumnConstraintSegment", column_constraint);
491
492 sqlite_dialect.replace_grammar(
493 "TableConstraintSegment",
494 Sequence::new(vec_of_erased![
495 Sequence::new(vec_of_erased![
496 Ref::keyword("CONSTRAINT"),
497 Ref::new("ObjectReferenceSegment")
498 ])
499 .config(|config| {
500 config.optional();
501 }),
502 one_of(vec_of_erased![
503 Sequence::new(vec_of_erased![
504 Ref::keyword("CHECK"),
505 Bracketed::new(vec_of_erased![Ref::new("ExpressionSegment")])
506 ]),
507 Sequence::new(vec_of_erased![
508 Ref::keyword("UNIQUE"),
509 Ref::new("BracketedColumnReferenceListGrammar")
510 ]),
511 Sequence::new(vec_of_erased![
512 Ref::new("PrimaryKeyGrammar"),
513 Ref::new("BracketedColumnReferenceListGrammar")
514 ]),
515 Sequence::new(vec_of_erased![
516 Ref::new("ForeignKeyGrammar"),
517 Ref::new("BracketedColumnReferenceListGrammar"),
518 Ref::new("ReferenceDefinitionGrammar")
519 ])
520 ]),
521 one_of(vec_of_erased![
522 Ref::keyword("DEFERRABLE"),
523 Sequence::new(vec_of_erased![
524 Ref::keyword("NOT"),
525 Ref::keyword("DEFERRABLE")
526 ])
527 ])
528 .config(|config| {
529 config.optional();
530 }),
531 one_of(vec_of_erased![
532 Sequence::new(vec_of_erased![
533 Ref::keyword("INITIALLY"),
534 Ref::keyword("DEFERRED")
535 ]),
536 Sequence::new(vec_of_erased![
537 Ref::keyword("INITIALLY"),
538 Ref::keyword("IMMEDIATE")
539 ])
540 ])
541 .config(|config| {
542 config.optional();
543 })
544 ])
545 .to_matchable(),
546 );
547
548 sqlite_dialect.replace_grammar(
549 "TransactionStatementSegment",
550 Sequence::new(vec_of_erased![
551 one_of(vec_of_erased![
552 Ref::keyword("BEGIN"),
553 Ref::keyword("COMMIT"),
554 Ref::keyword("ROLLBACK"),
555 Ref::keyword("END")
556 ]),
557 one_of(vec_of_erased![Ref::keyword("TRANSACTION")]).config(|config| {
558 config.optional();
559 }),
560 Sequence::new(vec_of_erased![
561 Ref::keyword("TO"),
562 Ref::keyword("SAVEPOINT"),
563 Ref::new("ObjectReferenceSegment")
564 ])
565 .config(|config| {
566 config.optional();
567 })
568 ])
569 .to_matchable(),
570 );
571
572 sqlite_dialect.add([(
573 "PragmaReferenceSegment".into(),
574 NodeMatcher::new(
575 SyntaxKind::PragmaReference,
576 sqlite_dialect
577 .grammar("ObjectReferenceSegment")
578 .match_grammar()
579 .unwrap(),
580 )
581 .to_matchable()
582 .into(),
583 )]);
584
585 sqlite_dialect.add([(
586 "PragmaStatementSegment".into(),
587 NodeMatcher::new(SyntaxKind::PragmaStatement, {
588 let pragma_value = one_of(vec_of_erased![
589 Ref::new("LiteralGrammar"),
590 Ref::new("BooleanLiteralGrammar"),
591 Ref::keyword("YES"),
592 Ref::keyword("NO"),
593 Ref::keyword("ON"),
594 Ref::keyword("OFF"),
595 Ref::keyword("NONE"),
596 Ref::keyword("FULL"),
597 Ref::keyword("INCREMENTAL"),
598 Ref::keyword("DELETE"),
599 Ref::keyword("TRUNCATE"),
600 Ref::keyword("PERSIST"),
601 Ref::keyword("MEMORY"),
602 Ref::keyword("WAL"),
603 Ref::keyword("NORMAL"),
604 Ref::keyword("EXCLUSIVE"),
605 Ref::keyword("FAST"),
606 Ref::keyword("EXTRA"),
607 Ref::keyword("DEFAULT"),
608 Ref::keyword("FILE"),
609 Ref::keyword("PASSIVE"),
610 Ref::keyword("RESTART"),
611 Ref::keyword("RESET")
612 ]);
613
614 Sequence::new(vec_of_erased![
615 Ref::keyword("PRAGMA"),
616 Ref::new("PragmaReferenceSegment"),
617 Bracketed::new(vec_of_erased![pragma_value.clone()]).config(|config| {
618 config.optional();
619 }),
620 Sequence::new(vec_of_erased![
621 Ref::new("EqualsSegment"),
622 optionally_bracketed(vec_of_erased![pragma_value])
623 ])
624 .config(|config| {
625 config.optional();
626 })
627 ])
628 .to_matchable()
629 })
630 .to_matchable()
631 .into(),
632 )]);
633
634 sqlite_dialect.replace_grammar(
635 "CreateTriggerStatementSegment",
636 Sequence::new(vec_of_erased![
637 Ref::keyword("CREATE"),
638 Ref::new("TemporaryGrammar").optional(),
639 Ref::keyword("TRIGGER"),
640 Ref::new("IfNotExistsGrammar").optional(),
641 Ref::new("TriggerReferenceSegment"),
642 one_of(vec_of_erased![
643 Ref::keyword("BEFORE"),
644 Ref::keyword("AFTER"),
645 Sequence::new(vec_of_erased![Ref::keyword("INSTEAD"), Ref::keyword("OF")])
646 ])
647 .config(|config| {
648 config.optional();
649 }),
650 one_of(vec_of_erased![
651 Ref::keyword("DELETE"),
652 Ref::keyword("INSERT"),
653 Sequence::new(vec_of_erased![
654 Ref::keyword("UPDATE"),
655 Sequence::new(vec_of_erased![
656 Ref::keyword("OF"),
657 Delimited::new(vec_of_erased![Ref::new("ColumnReferenceSegment")])
658 ])
659 .config(|config| {
660 config.optional();
661 })
662 ])
663 ]),
664 Ref::keyword("ON"),
665 Ref::new("TableReferenceSegment"),
666 Sequence::new(vec_of_erased![
667 Ref::keyword("FOR"),
668 Ref::keyword("EACH"),
669 Ref::keyword("ROW")
670 ])
671 .config(|config| {
672 config.optional();
673 }),
674 Sequence::new(vec_of_erased![
675 Ref::keyword("WHEN"),
676 Bracketed::new(vec_of_erased![Ref::new("ExpressionSegment")])
677 ])
678 .config(|config| {
679 config.optional();
680 }),
681 Ref::keyword("BEGIN"),
682 Delimited::new(vec_of_erased![
683 Ref::new("UpdateStatementSegment"),
684 Ref::new("InsertStatementSegment"),
685 Ref::new("DeleteStatementSegment"),
686 Ref::new("SelectableGrammar")
687 ])
688 .config(|config| {
689 config.delimiter(
690 AnyNumberOf::new(vec_of_erased![Ref::new("DelimiterGrammar")]).config(
691 |config| {
692 config.min_times = 1;
693 },
694 ),
695 );
696 config.allow_trailing = true;
697 }),
698 Ref::keyword("END")
699 ])
700 .to_matchable(),
701 );
702 sqlite_dialect.add([(
703 "UnorderedSelectStatementSegment".into(),
704 NodeMatcher::new(
705 SyntaxKind::SelectStatement,
706 Sequence::new(vec_of_erased![
707 Ref::new("SelectClauseSegment"),
708 MetaSegment::dedent(),
709 Ref::new("FromClauseSegment").optional(),
710 Ref::new("WhereClauseSegment").optional(),
711 Ref::new("GroupByClauseSegment").optional(),
712 Ref::new("HavingClauseSegment").optional(),
713 Ref::new("OverlapsClauseSegment").optional(),
714 Ref::new("NamedWindowSegment").optional()
715 ])
716 .to_matchable(),
717 )
718 .to_matchable()
719 .into(),
720 )]);
721
722 sqlite_dialect.add([(
723 "SelectStatementSegment".into(),
724 NodeMatcher::new(
725 SyntaxKind::SelectStatement,
726 sqlite_dialect
727 .grammar("UnorderedSelectStatementSegment")
728 .match_grammar()
729 .unwrap()
730 .copy(
731 Some(vec_of_erased![
732 Ref::new("OrderByClauseSegment").optional(),
733 Ref::new("FetchClauseSegment").optional(),
734 Ref::new("LimitClauseSegment").optional(),
735 Ref::new("NamedWindowSegment").optional(),
736 ]),
737 None,
738 None,
739 None,
740 Vec::new(),
741 false,
742 ),
743 )
744 .to_matchable()
745 .into(),
746 )]);
747
748 sqlite_dialect.replace_grammar(
749 "CreateIndexStatementSegment",
750 Sequence::new(vec_of_erased![
751 Ref::keyword("CREATE"),
752 Ref::keyword("UNIQUE").optional(),
753 Ref::keyword("INDEX"),
754 Ref::new("IfNotExistsGrammar").optional(),
755 Ref::new("IndexReferenceSegment"),
756 Ref::keyword("ON"),
757 Ref::new("TableReferenceSegment"),
758 Sequence::new(vec_of_erased![Bracketed::new(vec_of_erased![
759 Delimited::new(vec_of_erased![Ref::new("IndexColumnDefinitionSegment")])
760 ])]),
761 Ref::new("WhereClauseSegment").optional()
762 ])
763 .to_matchable(),
764 );
765
766 sqlite_dialect.replace_grammar(
767 "StatementSegment",
768 one_of(vec_of_erased![
769 Ref::new("AlterTableStatementSegment"),
770 Ref::new("CreateIndexStatementSegment"),
771 Ref::new("CreateTableStatementSegment"),
772 Ref::new("CreateTriggerStatementSegment"),
773 Ref::new("CreateViewStatementSegment"),
774 Ref::new("DeleteStatementSegment"),
775 Ref::new("DropIndexStatementSegment"),
776 Ref::new("DropTableStatementSegment"),
777 Ref::new("DropTriggerStatementSegment"),
778 Ref::new("DropViewStatementSegment"),
779 Ref::new("ExplainStatementSegment"),
780 Ref::new("InsertStatementSegment"),
781 Ref::new("PragmaStatementSegment"),
782 Ref::new("SelectableGrammar"),
783 Ref::new("TransactionStatementSegment"),
784 Ref::new("UpdateStatementSegment"),
785 Bracketed::new(vec_of_erased![Ref::new("StatementSegment")])
786 ])
787 .to_matchable(),
788 );
789
790 sqlite_dialect.add([(
791 "ReturningClauseSegment".into(),
792 Sequence::new(vec_of_erased![
793 Ref::keyword("RETURNING"),
794 one_of(vec_of_erased![
795 Ref::new("StarSegment"),
796 Delimited::new(vec_of_erased![Sequence::new(vec_of_erased![
797 Ref::new("ExpressionSegment"),
798 Ref::new("AsAliasExpressionSegment").optional(),
799 ])])
800 ])
801 ])
802 .to_matchable()
803 .into(),
804 )]);
805
806 sqlite_dialect.add([(
807 "AsAliasExpressionSegment".into(),
808 NodeMatcher::new(
809 SyntaxKind::AliasExpression,
810 Sequence::new(vec_of_erased![
811 MetaSegment::indent(),
812 Ref::keyword("AS"),
813 Ref::new("SingleIdentifierGrammar"),
814 MetaSegment::dedent(),
815 ])
816 .to_matchable(),
817 )
818 .to_matchable()
819 .into(),
820 )]);
821
822 sqlite_dialect
823}