sqruff_lib_dialects/
sqlite.rs

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}