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            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}