sqruff_lib_dialects/
sqlite.rs

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}