sqruff_lib_dialects/
snowflake.rs

1use itertools::Itertools;
2use sqruff_lib_core::dialects::base::Dialect;
3use sqruff_lib_core::dialects::init::DialectKind;
4use sqruff_lib_core::dialects::syntax::SyntaxKind;
5use sqruff_lib_core::helpers::{Config, ToMatchable};
6use sqruff_lib_core::parser::grammar::anyof::{
7    AnyNumberOf, any_set_of, one_of, optionally_bracketed,
8};
9use sqruff_lib_core::parser::grammar::base::{Nothing, Ref};
10use sqruff_lib_core::parser::grammar::delimited::Delimited;
11use sqruff_lib_core::parser::grammar::sequence::{Bracketed, Sequence};
12use sqruff_lib_core::parser::lexer::Matcher;
13use sqruff_lib_core::parser::matchable::{Matchable, MatchableTrait};
14use sqruff_lib_core::parser::node_matcher::NodeMatcher;
15use sqruff_lib_core::parser::parsers::{MultiStringParser, RegexParser, StringParser, TypedParser};
16use sqruff_lib_core::parser::segments::generator::SegmentGenerator;
17use sqruff_lib_core::parser::segments::meta::MetaSegment;
18use sqruff_lib_core::parser::types::ParseMode;
19use sqruff_lib_core::vec_of_erased;
20
21use super::ansi::{self, raw_dialect};
22use super::snowflake_keywords::{SNOWFLAKE_RESERVED_KEYWORDS, SNOWFLAKE_UNRESERVED_KEYWORDS};
23
24pub fn dialect() -> Dialect {
25    let mut snowflake_dialect = raw_dialect();
26    snowflake_dialect.name = DialectKind::Snowflake;
27
28    snowflake_dialect.replace_grammar(
29        "SelectClauseElementSegment",
30        ansi::select_clause_element().copy(
31            Some(vec_of_erased![Sequence::new(vec_of_erased![
32                Ref::new("SystemFunctionName"),
33                Bracketed::new(vec_of_erased![Ref::new("QuotedLiteralSegment")])
34            ])]),
35            None,
36            Some(Ref::new("WildcardExpressionSegment").to_matchable()),
37            None,
38            Vec::new(),
39            false,
40        ),
41    );
42
43    snowflake_dialect.replace_grammar(
44        "FromExpressionElementSegment",
45        Sequence::new(vec_of_erased![
46            Ref::new("PreTableFunctionKeywordsGrammar").optional(),
47            optionally_bracketed(vec_of_erased![Ref::new("TableExpressionSegment")]),
48            Ref::new("AliasExpressionSegment")
49                .exclude(one_of(vec_of_erased![
50                    Ref::new("FromClauseTerminatorGrammar"),
51                    Ref::new("SamplingExpressionSegment"),
52                    Ref::new("ChangesClauseSegment"),
53                    Ref::new("JoinLikeClauseGrammar"),
54                    Ref::keyword("CROSS"),
55                ]))
56                .optional(),
57            Sequence::new(vec_of_erased![
58                Ref::keyword("WITH"),
59                Ref::keyword("OFFSET"),
60                Ref::new("AliasExpressionSegment"),
61            ])
62            .config(|this| this.optional()),
63            Ref::new("SamplingExpressionSegment").optional(),
64            Ref::new("PostTableExpressionGrammar").optional(),
65        ])
66        .to_matchable(),
67    );
68
69    snowflake_dialect.patch_lexer_matchers(vec![
70        Matcher::regex(
71            "single_quote",
72            r"'([^'\\]|\\.|'')*'",
73            SyntaxKind::SingleQuote,
74        ),
75        Matcher::regex(
76            "inline_comment",
77            r"(--|#|//)[^\n]*",
78            SyntaxKind::InlineComment,
79        ),
80    ]);
81
82    snowflake_dialect.insert_lexer_matchers(
83        vec![
84            Matcher::string("parameter_assigner", "=>", SyntaxKind::ParameterAssigner),
85            Matcher::string("function_assigner", "->", SyntaxKind::FunctionAssigner),
86            Matcher::regex(
87                "stage_path",
88                r"(?:@[^\s;)]+|'@[^']+')",
89                SyntaxKind::StagePath,
90            ),
91            Matcher::regex("column_selector", r"\$[0-9]+", SyntaxKind::ColumnSelector),
92            Matcher::regex("dollar_quote", r"\$\$.*\$\$", SyntaxKind::DollarQuote),
93            Matcher::regex(
94                "dollar_literal",
95                r"[$][a-zA-Z0-9_.]*",
96                SyntaxKind::DollarLiteral,
97            ),
98            Matcher::regex(
99                "inline_dollar_sign",
100                r"[a-zA-Z_][a-zA-Z0-9_$]*\$[a-zA-Z0-9_$]*",
101                SyntaxKind::Raw,
102            ),
103            Matcher::regex(
104                "unquoted_file_path",
105                r"file://(?:[a-zA-Z]+:|/)+(?:[0-9a-zA-Z\\/_*?-]+)(?:\.[0-9a-zA-Z]+)?",
106                SyntaxKind::UnquotedFilePath,
107            ),
108            Matcher::string("question_mark", "?", SyntaxKind::QuestionMark),
109            Matcher::string("exclude_bracket_open", "{-", SyntaxKind::ExcludeBracketOpen),
110            Matcher::string(
111                "exclude_bracket_close",
112                "-}",
113                SyntaxKind::ExcludeBracketClose,
114            ),
115        ],
116        "like_operator",
117    );
118
119    snowflake_dialect.insert_lexer_matchers(
120        vec![Matcher::string(
121            "walrus_operator",
122            ":=",
123            SyntaxKind::WalrusOperator,
124        )],
125        "equals",
126    );
127
128    snowflake_dialect.bracket_sets_mut("bracket_pairs").insert((
129        "exclude",
130        "StartExcludeBracketSegment",
131        "EndExcludeBracketSegment",
132        true,
133    ));
134
135    snowflake_dialect.sets_mut("bare_functions").clear();
136    snowflake_dialect.sets_mut("bare_functions").extend([
137        "CURRENT_DATE",
138        "CURRENT_TIME",
139        "CURRENT_TIMESTAMP",
140        "CURRENT_USER",
141        "LOCALTIME",
142        "LOCALTIMESTAMP",
143    ]);
144
145    snowflake_dialect.sets_mut("compression_types").clear();
146    snowflake_dialect.sets_mut("compression_types").extend([
147        "AUTO",
148        "AUTO_DETECT",
149        "GZIP",
150        "BZ2",
151        "BROTLI",
152        "ZSTD",
153        "DEFLATE",
154        "RAW_DEFLATE",
155        "LZO",
156        "NONE",
157        "SNAPPY",
158    ]);
159
160    snowflake_dialect.sets_mut("files_types").clear();
161    snowflake_dialect
162        .sets_mut("files_types")
163        .extend(["CSV", "JSON", "AVRO", "ORC", "PARQUET", "XML"]);
164
165    snowflake_dialect.sets_mut("warehouse_types").clear();
166    snowflake_dialect
167        .sets_mut("warehouse_types")
168        .extend(["STANDARD", "SNOWPARK-OPTIMIZED"]);
169
170    snowflake_dialect.sets_mut("warehouse_sizes").clear();
171    snowflake_dialect.sets_mut("warehouse_sizes").extend([
172        "XSMALL", "SMALL", "MEDIUM", "LARGE", "XLARGE", "XXLARGE", "X2LARGE", "XXXLARGE",
173        "X3LARGE", "X4LARGE", "X5LARGE", "X6LARGE", "X-SMALL", "X-LARGE", "2X-LARGE", "3X-LARGE",
174        "4X-LARGE", "5X-LARGE", "6X-LARGE",
175    ]);
176
177    snowflake_dialect
178        .sets_mut("warehouse_scaling_policies")
179        .clear();
180    snowflake_dialect
181        .sets_mut("warehouse_scaling_policies")
182        .extend(["STANDARD", "ECONOMY"]);
183
184    snowflake_dialect.add([
185        (
186            "ParameterAssignerSegment".into(),
187            StringParser::new(
188                "=>",
189                SyntaxKind::ParameterAssigner
190            )
191            .to_matchable()
192            .into(),
193        ),
194        (
195            "FunctionAssignerSegment".into(),
196            StringParser::new(
197                "->",
198                SyntaxKind::FunctionAssigner
199            )
200            .to_matchable()
201            .into(),
202        ),
203        (
204            "WalrusOperatorSegment".into(),
205            StringParser::new(
206                ":=",
207                SyntaxKind::AssignmentOperator
208            )
209            .to_matchable()
210            .into(),
211        ),
212        (
213            "QuotedStarSegment".into(),
214            StringParser::new(
215                "'*'",
216                SyntaxKind::QuotedStar
217            )
218            .to_matchable()
219            .into(),
220        ),
221        (
222            "NakedSemiStructuredElementSegment".into(),
223            RegexParser::new(
224                "[A-Z0-9_]*",
225                SyntaxKind::SemiStructuredElement
226            )
227            .to_matchable()
228            .into(),
229        ),
230        (
231            "QuotedSemiStructuredElementSegment".into(),
232            TypedParser::new(
233                SyntaxKind::DoubleQuote,
234                SyntaxKind::SemiStructuredElement,
235            )
236            .to_matchable()
237            .into(),
238        ),
239        (
240            "ColumnIndexIdentifierSegment".into(),
241            RegexParser::new(
242                r"\$[0-9]+",
243                SyntaxKind::ColumnIndexIdentifierSegment
244            )
245            .to_matchable()
246            .into(),
247        ),
248        (
249            "LocalVariableNameSegment".into(),
250            RegexParser::new(
251                r"[a-zA-Z0-9_]*",
252                SyntaxKind::Variable
253            )
254            .to_matchable()
255            .into(),
256        ),
257        (
258            "ReferencedVariableNameSegment".into(),
259            RegexParser::new(
260                r"\$[A-Z_][A-Z0-9_]*",
261                SyntaxKind::Variable
262            )
263            .to_matchable()
264            .into(),
265        ),
266        (
267            "WarehouseType".into(),
268            one_of(vec_of_erased![
269                MultiStringParser::new(
270                    snowflake_dialect
271                        .sets("warehouse_types")
272                        .into_iter()
273                        .filter(|it| !it.contains('-'))
274                        .map_into()
275                        .collect_vec(),
276                    SyntaxKind::WarehouseSize
277                ),
278                MultiStringParser::new(
279                    snowflake_dialect
280                        .sets("warehouse_types")
281                        .into_iter()
282                        .map(|it| format!("'{it}'"))
283                        .collect_vec(),
284                    SyntaxKind::WarehouseSize
285                )
286            ])
287            .to_matchable()
288            .into(),
289        ),
290        (
291            "WarehouseSize".into(),
292            one_of(vec_of_erased![
293                MultiStringParser::new(
294                    snowflake_dialect
295                        .sets("warehouse_sizes")
296                        .into_iter()
297                        .filter(|it| !it.contains('-'))
298                        .map_into()
299                        .collect_vec(),
300                   SyntaxKind::WarehouseSize
301                ),
302                MultiStringParser::new(
303                    snowflake_dialect
304                        .sets("warehouse_sizes")
305                        .into_iter()
306                        .map(|it| format!("'{it}'"))
307                        .collect_vec(),
308                    SyntaxKind::WarehouseSize
309                )
310            ])
311            .to_matchable()
312            .into(),
313        ),
314        (
315            "CompressionType".into(),
316            one_of(vec_of_erased![
317                MultiStringParser::new(
318                    snowflake_dialect
319                        .sets("compression_types")
320                        .into_iter()
321                        .map_into()
322                        .collect_vec(),
323                   SyntaxKind::CompressionType
324
325                ),
326                MultiStringParser::new(
327                    snowflake_dialect
328                        .sets("compression_types")
329                        .into_iter()
330                        .map(|it| format!("'{it}'"))
331                        .collect_vec(),
332                   SyntaxKind::CompressionType
333                )
334            ])
335            .to_matchable()
336            .into(),
337        ),
338        (
339            "ScalingPolicy".into(),
340            one_of(vec_of_erased![
341                MultiStringParser::new(
342                    snowflake_dialect
343                        .sets("warehouse_scaling_policies")
344                        .into_iter()
345                        .filter(|it| !it.contains('-'))
346                        .map_into()
347                        .collect_vec(),
348                   SyntaxKind::ScalingPolicy
349                ),
350                MultiStringParser::new(
351                    snowflake_dialect
352                        .sets("warehouse_scaling_policies")
353                        .into_iter()
354                        .map(|it| format!("'{it}'"))
355                        .collect_vec(),
356                   SyntaxKind::ScalingPolicy
357                )
358            ])
359            .to_matchable()
360            .into(),
361        ),
362        (
363            "ValidationModeOptionSegment".into(),
364            RegexParser::new(
365                r"'?RETURN_(?:\d+_ROWS|ERRORS|ALL_ERRORS)'?",
366                SyntaxKind::ValidationModeOption
367            )
368            .to_matchable()
369            .into(),
370        ),
371        (
372            "CopyOptionOnErrorSegment".into(),
373            RegexParser::new(
374                r"'?CONTINUE'?|'?SKIP_FILE(?:_[0-9]+%?)?'?|'?ABORT_STATEMENT'?",
375                SyntaxKind::CopyOnErrorOption
376            )
377            .to_matchable()
378            .into(),
379        ),
380        (
381            "DoubleQuotedUDFBody".into(),
382            TypedParser::new(
383                SyntaxKind::DoubleQuote,
384                SyntaxKind::UdfBody,
385            )
386            .to_matchable()
387            .into(),
388        ),
389        (
390            "SingleQuotedUDFBody".into(),
391            TypedParser::new(
392                SyntaxKind::SingleQuote,
393                SyntaxKind::UdfBody,
394            )
395            .to_matchable()
396            .into(),
397        ),
398        (
399            "DollarQuotedUDFBody".into(),
400            TypedParser::new(
401                SyntaxKind::DollarQuote,
402                SyntaxKind::UdfBody,
403            )
404            .to_matchable()
405            .into(),
406        ),
407        (
408            "StagePath".into(),
409            RegexParser::new(
410                r"(?:@[^\s;)]+|'@[^']+')",
411                SyntaxKind::StagePath
412            )
413            .to_matchable()
414            .into(),
415        ),
416        (
417            "S3Path".into(),
418            RegexParser::new(
419                r"'s3://[a-z0-9][a-z0-9\.-]{1,61}[a-z0-9](?:/.*)?'",
420                SyntaxKind::BucketPath
421            )
422            .to_matchable()
423            .into(),
424        ),
425        (
426            "GCSPath".into(),
427            RegexParser::new(
428                r"'gcs://[a-z0-9][\w\.-]{1,61}[a-z0-9](?:/.+)?'",
429                SyntaxKind::BucketPath
430            )
431            .to_matchable()
432            .into(),
433        ),
434        (
435            "AzureBlobStoragePath".into(),
436            RegexParser::new(
437                r"'azure://[a-z0-9][a-z0-9-]{1,61}[a-z0-9]\.blob\.core\.windows\.net/[a-z0-9][a-z0-9\.-]{1,61}[a-z0-9](?:/.+)?'",
438                SyntaxKind::BucketPath
439            )
440            .to_matchable()
441            .into(),
442        ),
443        (
444            "UnquotedFilePath".into(),
445            TypedParser::new(
446                SyntaxKind::UnquotedFilePath,
447                SyntaxKind::UnquotedFilePath,
448            )
449            .to_matchable()
450            .into(),
451        ),
452        (
453            "SnowflakeEncryptionOption".into(),
454            MultiStringParser::new(
455                vec!["'SNOWFLAKE_FULL'".into(), "'SNOWFLAKE_SSE'".into()],
456                SyntaxKind::StageEncryptionOption
457            ).to_matchable().into(),
458        ),
459        (
460            "S3EncryptionOption".into(),
461            MultiStringParser::new(
462                vec!["'AWS_CSE'".into(), "'AWS_SSE_S3'".into(), "'AWS_SSE_KMS'".into()],
463                SyntaxKind::StageEncryptionOption
464            ).to_matchable().into(),
465        ),
466        (
467            "GCSEncryptionOption".into(),
468            MultiStringParser::new(
469                vec!["'GCS_SSE_KMS'".into()],
470                SyntaxKind::StageEncryptionOption
471            ).to_matchable().into(),
472        ),
473        (
474            "AzureBlobStorageEncryptionOption".into(),
475            MultiStringParser::new(
476                vec!["'AZURE_CSE'".into()],
477                SyntaxKind::StageEncryptionOption
478            ).to_matchable().into(),
479        ),
480        (
481            "FileType".into(),
482            one_of(vec_of_erased![
483                MultiStringParser::new(
484                    snowflake_dialect
485                        .sets("file_types")
486                        .into_iter()
487                        .filter(|it| !it.contains('-'))
488                        .map_into()
489                        .collect_vec(),
490                   SyntaxKind::FileType
491                ),
492                MultiStringParser::new(
493                    snowflake_dialect
494                        .sets("file_types")
495                        .into_iter()
496                        .map(|it| format!("'{it}'"))
497                        .collect_vec(),
498                  SyntaxKind::FileType
499                )
500            ])
501            .to_matchable()
502            .into(),
503        ),
504        (
505            "IntegerSegment".into(),
506            RegexParser::new(
507                r"[0-9]+",
508                SyntaxKind::IntegerLiteral
509            )
510            .to_matchable()
511            .into(),
512        ),
513        (
514            "SystemFunctionName".into(),
515            RegexParser::new(
516                r"SYSTEM\$([A-Za-z0-9_]*)",
517                SyntaxKind::SystemFunctionName
518            )
519            .to_matchable()
520            .into(),
521        ),
522        (
523            "GroupByContentsGrammar".into(),
524            Delimited::new(vec_of_erased![
525                one_of(vec_of_erased![
526                    Ref::new("ColumnReferenceSegment"),
527                    // Can `GROUP BY 1`
528                    Ref::new("NumericLiteralSegment"),
529                    // Can `GROUP BY coalesce(col, 1)`
530                    Ref::new("ExpressionSegment"),
531                ])
532            ]).config(|this|this.terminators = vec_of_erased![
533                Ref::keyword("ORDER"),
534                Ref::keyword("LIMIT"),
535                Ref::keyword("FETCH"),
536                Ref::keyword("OFFSET"),
537                Ref::keyword("HAVING"),
538                Ref::keyword("QUALIFY"),
539                Ref::keyword("WINDOW"),
540            ]).to_matchable().into()
541        ),
542        (
543            "LimitLiteralGrammar".into(),
544            one_of(vec_of_erased![
545                Ref::new("NumericLiteralSegment"),
546                Ref::keyword("NULL"),
547                Ref::new("QuotedLiteralSegment")
548            ]).to_matchable().into()
549        ),
550        (
551            "StartExcludeBracketSegment".into(),
552            StringParser::new(
553                "{-",
554                SyntaxKind::StartExcludeBracket
555            )
556            .to_matchable()
557            .into(),
558        ),
559        (
560            "EndExcludeBracketSegment".into(),
561            StringParser::new(
562                "-}",
563                SyntaxKind::EndExcludeBracket
564            )
565            .to_matchable()
566            .into(),
567        ),
568        (
569            "QuestionMarkSegment".into(),
570            StringParser::new(
571                "?",
572                SyntaxKind::QuestionMark
573            )
574            .to_matchable()
575            .into(),
576        ),
577        (
578            "CaretSegment".into(),
579            StringParser::new(
580                "^",
581                SyntaxKind::Caret
582            )
583            .to_matchable()
584            .into(),
585        ),
586        (
587            "DollarSegment".into(),
588            StringParser::new(
589                "$",
590                SyntaxKind::Dollar
591            )
592            .to_matchable()
593            .into(),
594        ),
595        (
596            "PatternQuantifierGrammar".into(),
597            Sequence::new(vec_of_erased![
598                one_of(vec_of_erased![
599                    Ref::new("PositiveSegment"),
600                    Ref::new("StarSegment"),
601                    Ref::new("QuestionMarkSegment"),
602                    Bracketed::new(vec_of_erased![
603                        one_of(vec_of_erased![
604                            Ref::new("NumericLiteralSegment"),
605                            Sequence::new(vec_of_erased![
606                                Ref::new("NumericLiteralSegment"),
607                                Ref::new("CommaSegment"),
608                            ]),
609                            Sequence::new(vec_of_erased![
610                                Ref::new("CommaSegment"),
611                                Ref::new("NumericLiteralSegment"),
612                            ]),
613                            Sequence::new(vec_of_erased![
614                                Ref::new("NumericLiteralSegment"),
615                                Ref::new("CommaSegment"),
616                                Ref::new("NumericLiteralSegment"),
617                            ]),
618                        ])
619                    ]).config(|this| {
620                        this.bracket_type = "curly";
621                        this.bracket_pairs_set = "bracket_pairs";
622                    })
623                ]),
624                Ref::new("QuestionMarkSegment").optional()
625            ]).config(|this| {
626                this.allow_gaps = false;
627            }).to_matchable().into()
628        ),
629        (
630            "PatternSymbolGrammar".into(),
631            Sequence::new(vec_of_erased![
632                Ref::new("SingleIdentifierGrammar"),
633                Ref::new("PatternQuantifierGrammar").optional()
634            ]).config(|this| {
635                this.allow_gaps = false;
636            }).to_matchable().into()
637        ),
638        (
639            "PatternOperatorGrammar".into(),
640            one_of(vec_of_erased![
641                Ref::new("PatternSymbolGrammar"),
642                Sequence::new(vec_of_erased![
643                    one_of(vec_of_erased![
644                        Bracketed::new(vec_of_erased![
645                            one_of(vec_of_erased![
646                                AnyNumberOf::new(vec_of_erased![Ref::new("PatternOperatorGrammar")]),
647                                Delimited::new(
648                                    vec_of_erased![
649                                        Ref::new("PatternOperatorGrammar"),
650                                    ]
651                                )
652                                .config(|this|this.delimiter(Ref::new("BitwiseOrSegment"))),
653                            ])
654                        ]).config(|this| {
655                            this.bracket_type = "exclude";
656                            this.bracket_pairs_set = "bracket_pairs";
657                        }),
658                        Bracketed::new(vec_of_erased![
659                            one_of(vec_of_erased![
660                                AnyNumberOf::new(vec_of_erased![Ref::new("PatternOperatorGrammar")]),
661                                Delimited::new(
662                                    vec_of_erased![
663                                        Ref::new("PatternOperatorGrammar"),
664                                    ]
665                                )
666                                .config(|this|this.delimiter(Ref::new("BitwiseOrSegment"))),
667                            ])
668                        ]),
669                        Sequence::new(vec_of_erased![
670                            Ref::keyword("PERMUTE"),
671                            Bracketed::new(vec_of_erased![Delimited::new(
672                                vec_of_erased![
673                                    Ref::new("PatternSymbolGrammar"),
674                                ]
675                            )]),
676                        ]),
677                    ]),
678                    Ref::new("PatternQuantifierGrammar").optional()
679                ]).config(|this| {
680                    this.allow_gaps = false;
681                }),
682            ]).to_matchable().into()
683        ),
684        (
685            "ContextHeadersGrammar".into(),
686            one_of(vec_of_erased![
687                Ref::keyword("CURRENT_ACCOUNT"),
688                Ref::keyword("CURRENT_CLIENT"),
689                Ref::keyword("CURRENT_DATABASE"),
690                Ref::keyword("CURRENT_DATE"),
691                Ref::keyword("CURRENT_IP_ADDRESS"),
692                Ref::keyword("CURRENT_REGION"),
693                Ref::keyword("CURRENT_ROLE"),
694                Ref::keyword("CURRENT_SCHEMA"),
695                Ref::keyword("CURRENT_SCHEMAS"),
696                Ref::keyword("CURRENT_SESSION"),
697                Ref::keyword("CURRENT_STATEMENT"),
698                Ref::keyword("CURRENT_TIME"),
699                Ref::keyword("CURRENT_TIMESTAMP"),
700                Ref::keyword("CURRENT_TRANSACTION"),
701                Ref::keyword("CURRENT_USER"),
702                Ref::keyword("CURRENT_VERSION"),
703                Ref::keyword("CURRENT_WAREHOUSE"),
704                Ref::keyword("LAST_QUERY_ID"),
705                Ref::keyword("LAST_TRANSACTION"),
706                Ref::keyword("LOCALTIME"),
707                Ref::keyword("LOCALTIMESTAMP"),
708            ]).to_matchable().into()
709        )
710    ]);
711
712    snowflake_dialect.add([
713        (
714            "NakedIdentifierSegment".into(),
715            SegmentGenerator::new(|dialect| {
716                // Generate the anti template from the set of reserved keywords
717                let reserved_keywords = dialect.sets("reserved_keywords");
718                let pattern = reserved_keywords.iter().join("|");
719                let anti_template = format!("^({})$", pattern);
720
721                RegexParser::new("[a-zA-Z_][a-zA-Z0-9_$]*", SyntaxKind::NakedIdentifier)
722                    .anti_template(&anti_template)
723                    .to_matchable()
724            })
725            .into(),
726        ),
727        (
728            "LiteralGrammar".into(),
729            snowflake_dialect
730                .grammar("LiteralGrammar")
731                .copy(
732                    Some(vec_of_erased![Ref::new("ReferencedVariableNameSegment")]),
733                    None,
734                    None,
735                    None,
736                    Vec::new(),
737                    false,
738                )
739                .into(),
740        ),
741        (
742            "AccessorGrammar".into(),
743            AnyNumberOf::new(vec_of_erased![
744                Ref::new("ArrayAccessorSegment"),
745                Ref::new("SemiStructuredAccessorSegment")
746            ])
747            .to_matchable()
748            .into(),
749        ),
750        (
751            "PreTableFunctionKeywordsGrammar".into(),
752            one_of(vec_of_erased![Ref::keyword("LATERAL")])
753                .to_matchable()
754                .into(),
755        ),
756        (
757            "FunctionContentsExpressionGrammar".into(),
758            one_of(vec_of_erased![
759                Ref::new("DatetimeUnitSegment"),
760                Ref::new("NamedParameterExpressionSegment"),
761                Ref::new("ReferencedVariableNameSegment"),
762                Sequence::new(vec_of_erased![
763                    Ref::new("ExpressionSegment"),
764                    Sequence::new(vec_of_erased![
765                        one_of(vec_of_erased![
766                            Ref::keyword("IGNORE"),
767                            Ref::keyword("RESPECT"),
768                        ]),
769                        Ref::keyword("NULLS")
770                    ])
771                    .config(|this| this.optional())
772                ])
773            ])
774            .to_matchable()
775            .into(),
776        ),
777        (
778            "JoinLikeClauseGrammar".into(),
779            Sequence::new(vec_of_erased![
780                any_set_of(vec_of_erased![
781                    Ref::new("MatchRecognizeClauseSegment"),
782                    Ref::new("ChangesClauseSegment"),
783                    Ref::new("ConnectByClauseSegment"),
784                    Ref::new("FromBeforeExpressionSegment"),
785                    Ref::new("FromPivotExpressionSegment"),
786                    AnyNumberOf::new(vec_of_erased![Ref::new("FromUnpivotExpressionSegment")]),
787                    Ref::new("SamplingExpressionSegment")
788                ])
789                .config(|this| this.min_times = 1),
790                Ref::new("AliasExpressionSegment").optional()
791            ])
792            .to_matchable()
793            .into(),
794        ),
795        (
796            "SingleIdentifierGrammar".into(),
797            one_of(vec_of_erased![
798                Ref::new("NakedIdentifierSegment"),
799                Ref::new("QuotedIdentifierSegment"),
800                Ref::new("ColumnIndexIdentifierSegment"),
801                Ref::new("ReferencedVariableNameSegment"),
802                Ref::new("StagePath"),
803                Sequence::new(vec_of_erased![
804                    Ref::keyword("IDENTIFIER"),
805                    Bracketed::new(vec_of_erased![one_of(vec_of_erased![
806                        Ref::new("SingleQuotedIdentifierSegment"),
807                        Ref::new("ReferencedVariableNameSegment"),
808                    ])]),
809                ]),
810            ])
811            .to_matchable()
812            .into(),
813        ),
814        (
815            "PostFunctionGrammar".into(),
816            Sequence::new(vec_of_erased![
817                Ref::new("WithinGroupClauseSegment").optional(),
818                Sequence::new(vec_of_erased![
819                    one_of(vec_of_erased![
820                        Ref::keyword("IGNORE"),
821                        Ref::keyword("RESPECT")
822                    ]),
823                    Ref::keyword("NULLS"),
824                ])
825                .config(|this| this.optional()),
826                Ref::new("OverClauseSegment").optional(),
827            ])
828            .to_matchable()
829            .into(),
830        ),
831        (
832            "TemporaryGrammar".into(),
833            Sequence::new(vec_of_erased![
834                one_of(vec_of_erased![
835                    Ref::keyword("LOCAL"),
836                    Ref::keyword("GLOBAL")
837                ])
838                .config(|this| this.optional()),
839                one_of(vec_of_erased![
840                    Ref::keyword("TEMP"),
841                    Ref::keyword("TEMPORARY")
842                ])
843                .config(|this| this.optional()),
844                Sequence::new(vec_of_erased![Ref::keyword("VOLATILE")])
845                    .config(|this| this.optional()),
846            ])
847            .config(|this| this.optional())
848            .to_matchable()
849            .into(),
850        ),
851        (
852            "TemporaryTransientGrammar".into(),
853            one_of(vec_of_erased![
854                Ref::new("TemporaryGrammar"),
855                Ref::keyword("TRANSIENT")
856            ])
857            .to_matchable()
858            .into(),
859        ),
860        (
861            "BaseExpressionElementGrammar".into(),
862            snowflake_dialect
863                .grammar("BaseExpressionElementGrammar")
864                .copy(
865                    Some(vec_of_erased![Sequence::new(vec_of_erased![
866                        Ref::keyword("CONNECT_BY_ROOT"),
867                        Ref::new("ColumnReferenceSegment")
868                    ])]),
869                    None,
870                    Some(Ref::new("LiteralGrammar").to_matchable()),
871                    None,
872                    Vec::new(),
873                    false,
874                )
875                .into(),
876        ),
877        (
878            "QuotedLiteralSegment".into(),
879            one_of(vec_of_erased![
880                TypedParser::new(SyntaxKind::SingleQuote, SyntaxKind::QuotedLiteral),
881                TypedParser::new(SyntaxKind::DollarQuote, SyntaxKind::QuotedLiteral)
882            ])
883            .to_matchable()
884            .into(),
885        ),
886        (
887            "LikeGrammar".into(),
888            one_of(vec_of_erased![
889                Sequence::new(vec_of_erased![
890                    Ref::keyword("LIKE"),
891                    one_of(vec_of_erased![Ref::keyword("ALL"), Ref::keyword("ANY"),])
892                        .config(|this| this.optional())
893                ]),
894                Ref::keyword("RLIKE"),
895                Sequence::new(vec_of_erased![
896                    Ref::keyword("ILIKE"),
897                    Ref::keyword("ANY").optional(),
898                ]),
899                Ref::keyword("REGEXP"),
900            ])
901            .to_matchable()
902            .into(),
903        ),
904        (
905            "SelectClauseTerminatorGrammar".into(),
906            one_of(vec_of_erased![
907                Ref::keyword("FROM"),
908                Ref::keyword("WHERE"),
909                Sequence::new(vec_of_erased![Ref::keyword("ORDER"), Ref::keyword("BY")]),
910                Ref::keyword("LIMIT"),
911                Ref::keyword("FETCH"),
912                Ref::keyword("OFFSET"),
913                Ref::new("SetOperatorSegment"),
914            ])
915            .to_matchable()
916            .into(),
917        ),
918        (
919            "FromClauseTerminatorGrammar".into(),
920            one_of(vec_of_erased![
921                Ref::keyword("WHERE"),
922                Ref::keyword("LIMIT"),
923                Ref::keyword("FETCH"),
924                Ref::keyword("OFFSET"),
925                Sequence::new(vec_of_erased![Ref::keyword("GROUP"), Ref::keyword("BY"),]),
926                Sequence::new(vec_of_erased![Ref::keyword("ORDER"), Ref::keyword("BY"),]),
927                Ref::keyword("HAVING"),
928                Ref::keyword("QUALIFY"),
929                Ref::keyword("WINDOW"),
930                Ref::new("SetOperatorSegment"),
931                Ref::new("WithNoSchemaBindingClauseSegment"),
932                Ref::new("WithDataClauseSegment"),
933            ])
934            .to_matchable()
935            .into(),
936        ),
937        (
938            "WhereClauseTerminatorGrammar".into(),
939            one_of(vec_of_erased![
940                Ref::keyword("LIMIT"),
941                Ref::keyword("FETCH"),
942                Ref::keyword("OFFSET"),
943                Sequence::new(vec_of_erased![Ref::keyword("GROUP"), Ref::keyword("BY"),]),
944                Sequence::new(vec_of_erased![Ref::keyword("ORDER"), Ref::keyword("BY"),]),
945                Ref::keyword("HAVING"),
946                Ref::keyword("QUALIFY"),
947                Ref::keyword("WINDOW"),
948                Ref::keyword("OVERLAPS"),
949            ])
950            .to_matchable()
951            .into(),
952        ),
953        (
954            "OrderByClauseTerminators".into(),
955            one_of(vec_of_erased![
956                Ref::keyword("LIMIT"),
957                Ref::keyword("HAVING"),
958                Ref::keyword("QUALIFY"),
959                Ref::keyword("WINDOW"),
960                Ref::new("FrameClauseUnitGrammar"),
961                Ref::keyword("SEPARATOR"),
962                Ref::keyword("FETCH"),
963                Ref::keyword("OFFSET"),
964                Ref::keyword("MEASURES"),
965            ])
966            .to_matchable()
967            .into(),
968        ),
969        (
970            "TrimParametersGrammar".into(),
971            Nothing::new().to_matchable().into(),
972        ),
973        (
974            "GroupByClauseTerminatorGrammar".into(),
975            one_of(vec_of_erased![
976                Ref::keyword("ORDER"),
977                Ref::keyword("LIMIT"),
978                Ref::keyword("FETCH"),
979                Ref::keyword("OFFSET"),
980                Ref::keyword("HAVING"),
981                Ref::keyword("QUALIFY"),
982                Ref::keyword("WINDOW"),
983            ])
984            .to_matchable()
985            .into(),
986        ),
987        (
988            "HavingClauseTerminatorGrammar".into(),
989            one_of(vec_of_erased![
990                Sequence::new(vec_of_erased![Ref::keyword("ORDER"), Ref::keyword("BY"),]),
991                Ref::keyword("LIMIT"),
992                Ref::keyword("QUALIFY"),
993                Ref::keyword("WINDOW"),
994                Ref::keyword("FETCH"),
995                Ref::keyword("OFFSET"),
996            ])
997            .to_matchable()
998            .into(),
999        ),
1000    ]);
1001
1002    snowflake_dialect.sets_mut("unreserved_keywords").clear();
1003    snowflake_dialect.update_keywords_set_from_multiline_string(
1004        "unreserved_keywords",
1005        SNOWFLAKE_UNRESERVED_KEYWORDS,
1006    );
1007
1008    snowflake_dialect.sets_mut("reserved_keywords").clear();
1009    snowflake_dialect.update_keywords_set_from_multiline_string(
1010        "reserved_keywords",
1011        SNOWFLAKE_RESERVED_KEYWORDS,
1012    );
1013
1014    snowflake_dialect.sets_mut("datetime_units").clear();
1015    snowflake_dialect.sets_mut("datetime_units").extend([
1016        "YEAR",
1017        "Y",
1018        "YY",
1019        "YYY",
1020        "YYYY",
1021        "YR",
1022        "YEARS",
1023        "YRS",
1024        "MONTH",
1025        "MM",
1026        "MON",
1027        "MONS",
1028        "MONTHS",
1029        "DAY",
1030        "D",
1031        "DD",
1032        "DAYS",
1033        "DAYOFMONTH",
1034        "DAYOFWEEK",
1035        "WEEKDAY",
1036        "DOW",
1037        "DW",
1038        "DAYOFWEEKISO",
1039        "WEEKDAY_ISO",
1040        "DOW_ISO",
1041        "DW_ISO",
1042        "DAYOFYEAR",
1043        "YEARDAY",
1044        "DOY",
1045        "DY",
1046        "WEEK",
1047        "W",
1048        "WK",
1049        "WEEKOFYEAR",
1050        "WOY",
1051        "WY",
1052        "WEEKISO",
1053        "WEEK_ISO",
1054        "WEEKOFYEARISO",
1055        "WEEKOFYEAR_ISO",
1056        "QUARTER",
1057        "Q",
1058        "QTR",
1059        "QTRS",
1060        "QUARTERS",
1061        "YEAROFWEEK",
1062        "YEAROFWEEKISO",
1063        "HOUR",
1064        "H",
1065        "HH",
1066        "HR",
1067        "HOURS",
1068        "HRS",
1069        "MINUTE",
1070        "M",
1071        "MI",
1072        "MIN",
1073        "MINUTES",
1074        "MINS",
1075        "SECOND",
1076        "S",
1077        "SEC",
1078        "SECONDS",
1079        "SECS",
1080        "MILLISECOND",
1081        "MS",
1082        "MSEC",
1083        "MILLISECONDS",
1084        "MICROSECOND",
1085        "US",
1086        "USEC",
1087        "MICROSECONDS",
1088        "NANOSECOND",
1089        "NS",
1090        "NSEC",
1091        "NANOSEC",
1092        "NSECOND",
1093        "NANOSECONDS",
1094        "NANOSECS",
1095        "NSECONDS",
1096        "EPOCH_SECOND",
1097        "EPOCH",
1098        "EPOCH_SECONDS",
1099        "EPOCH_MILLISECOND",
1100        "EPOCH_MILLISECONDS",
1101        "EPOCH_MICROSECOND",
1102        "EPOCH_MICROSECONDS",
1103        "EPOCH_NANOSECOND",
1104        "EPOCH_NANOSECONDS",
1105        "TIMEZONE_HOUR",
1106        "TZH",
1107        "TIMEZONE_MINUTE",
1108        "TZM",
1109    ]);
1110
1111    snowflake_dialect.replace_grammar(
1112        "FunctionNameSegment",
1113        Sequence::new(vec_of_erased![
1114            // Project name, schema identifier, etc.
1115            AnyNumberOf::new(vec_of_erased![Sequence::new(vec_of_erased![
1116                Ref::new("SingleIdentifierGrammar"),
1117                Ref::new("DotSegment"),
1118            ]),])
1119            .config(|this| {
1120                this.terminators = vec_of_erased![Ref::new("BracketedSegment")];
1121            }),
1122            // Base function name
1123            one_of(vec_of_erased![
1124                Ref::new("FunctionNameIdentifierSegment"),
1125                Ref::new("QuotedIdentifierSegment"),
1126                // Snowflake's IDENTIFIER pseudo-function
1127                Sequence::new(vec_of_erased![
1128                    Ref::keyword("IDENTIFIER"),
1129                    Bracketed::new(vec_of_erased![one_of(vec_of_erased![
1130                        Ref::new("SingleQuotedIdentifierSegment"),
1131                        Ref::new("ReferencedVariableNameSegment"),
1132                    ])]),
1133                ]),
1134            ]),
1135        ])
1136        .config(|this| {
1137            this.allow_gaps = false;
1138        })
1139        .to_matchable(),
1140    );
1141
1142    snowflake_dialect.add([(
1143        "ConnectByClauseSegment".into(),
1144        NodeMatcher::new(
1145            SyntaxKind::ConnectbyClause,
1146            Sequence::new(vec_of_erased![
1147                Ref::keyword("START"),
1148                Ref::keyword("WITH"),
1149                Ref::new("ExpressionSegment"),
1150                Ref::keyword("CONNECT"),
1151                Ref::keyword("BY"),
1152                Delimited::new(vec_of_erased![Sequence::new(vec_of_erased![
1153                    Ref::keyword("PRIOR").optional(),
1154                    Ref::new("ColumnReferenceSegment"),
1155                    Ref::new("EqualsSegment"),
1156                    Ref::keyword("PRIOR").optional(),
1157                    Ref::new("ColumnReferenceSegment"),
1158                ])])
1159            ])
1160            .to_matchable(),
1161        )
1162        .to_matchable()
1163        .into(),
1164    )]);
1165
1166    snowflake_dialect.replace_grammar(
1167        "GroupByClauseSegment",
1168        Sequence::new(vec_of_erased![
1169            Ref::keyword("GROUP"),
1170            Ref::keyword("BY"),
1171            MetaSegment::indent(),
1172            one_of(vec_of_erased![
1173                Sequence::new(vec_of_erased![
1174                    one_of(vec_of_erased![
1175                        Ref::keyword("CUBE"),
1176                        Ref::keyword("ROLLUP"),
1177                        Sequence::new(vec_of_erased![
1178                            Ref::keyword("GROUPING"),
1179                            Ref::keyword("SETS"),
1180                        ]),
1181                    ]),
1182                    Bracketed::new(vec_of_erased![Ref::new("GroupByContentsGrammar"),]),
1183                ]),
1184                Ref::keyword("ALL"),
1185                Ref::new("GroupByContentsGrammar"),
1186            ]),
1187            MetaSegment::dedent(),
1188        ])
1189        .to_matchable(),
1190    );
1191
1192    snowflake_dialect.replace_grammar(
1193        "ValuesClauseSegment",
1194        Sequence::new(vec_of_erased![
1195            Ref::keyword("VALUES"),
1196            Delimited::new(vec_of_erased![
1197                Bracketed::new(vec_of_erased![Delimited::new(vec_of_erased![
1198                    Ref::keyword("DEFAULT"),
1199                    Ref::keyword("NULL"),
1200                    Ref::new("ExpressionSegment"),
1201                ])])
1202                .config(|this| {
1203                    this.parse_mode = ParseMode::Greedy;
1204                }),
1205            ]),
1206        ])
1207        .to_matchable(),
1208    );
1209
1210    snowflake_dialect.add([(
1211        "InsertStatementSegment".into(),
1212        NodeMatcher::new(
1213            SyntaxKind::InsertStatement,
1214            Sequence::new(vec_of_erased![
1215                Ref::keyword("INSERT"),
1216                Ref::keyword("OVERWRITE").optional(),
1217                one_of(vec_of_erased![
1218                    // Single table INSERT INTO
1219                    Sequence::new(vec_of_erased![
1220                        Ref::keyword("INTO"),
1221                        Ref::new("TableReferenceSegment"),
1222                        Ref::new("BracketedColumnReferenceListGrammar").optional(),
1223                        Ref::new("SelectableGrammar"),
1224                    ]),
1225                    // Unconditional multi-table INSERT INTO
1226                    Sequence::new(vec_of_erased![
1227                        Ref::keyword("ALL"),
1228                        AnyNumberOf::new(vec_of_erased![Sequence::new(vec_of_erased![
1229                            Ref::keyword("INTO"),
1230                            Ref::new("TableReferenceSegment"),
1231                            Ref::new("BracketedColumnReferenceListGrammar").optional(),
1232                            Ref::new("ValuesClauseSegment").optional(),
1233                        ]),])
1234                        .config(|this| {
1235                            this.min_times = 1;
1236                        }),
1237                        Ref::new("SelectStatementSegment"),
1238                    ]),
1239                    // Conditional multi-table INSERT INTO
1240                    Sequence::new(vec_of_erased![
1241                        one_of(vec_of_erased![Ref::keyword("FIRST"), Ref::keyword("ALL")]),
1242                        AnyNumberOf::new(vec_of_erased![Sequence::new(vec_of_erased![
1243                            Ref::keyword("WHEN"),
1244                            Ref::new("ExpressionSegment"),
1245                            Ref::keyword("THEN"),
1246                            AnyNumberOf::new(vec_of_erased![Sequence::new(vec_of_erased![
1247                                Ref::keyword("INTO"),
1248                                Ref::new("TableReferenceSegment"),
1249                                Ref::new("BracketedColumnReferenceListGrammar").optional(),
1250                                Ref::new("ValuesClauseSegment").optional(),
1251                            ]),])
1252                            .config(|this| {
1253                                this.min_times = 1;
1254                            }),
1255                        ]),])
1256                        .config(|this| {
1257                            this.min_times = 1;
1258                        }),
1259                        Sequence::new(vec_of_erased![
1260                            Ref::keyword("ELSE"),
1261                            Ref::keyword("INTO"),
1262                            Ref::new("TableReferenceSegment"),
1263                            Ref::new("BracketedColumnReferenceListGrammar").optional(),
1264                            Ref::new("ValuesClauseSegment").optional(),
1265                        ])
1266                        .config(|this| this.optional()),
1267                        Ref::new("SelectStatementSegment"),
1268                    ]),
1269                ]),
1270            ])
1271            .to_matchable(),
1272        )
1273        .to_matchable()
1274        .into(),
1275    )]);
1276
1277    snowflake_dialect.replace_grammar(
1278        "FunctionDefinitionGrammar",
1279        Sequence::new(vec_of_erased![
1280            Ref::keyword("AS"),
1281            Ref::new("QuotedLiteralSegment"),
1282            Sequence::new(vec_of_erased![
1283                Ref::keyword("LANGUAGE"),
1284                Ref::new("NakedIdentifierSegment"),
1285            ])
1286            .config(|this| this.optional()),
1287        ])
1288        .to_matchable(),
1289    );
1290
1291    snowflake_dialect.replace_grammar(
1292        "StatementSegment",
1293        ansi::statement_segment().copy(
1294            Some(vec_of_erased![
1295                Ref::new("AccessStatementSegment"),
1296                Ref::new("CreateStatementSegment"),
1297                Ref::new("CreateTaskSegment"),
1298                Ref::new("CreateUserSegment"),
1299                Ref::new("CreateCloneStatementSegment"),
1300                Ref::new("CreateProcedureStatementSegment"),
1301                Ref::new("ScriptingBlockStatementSegment"),
1302                Ref::new("ScriptingLetStatementSegment"),
1303                Ref::new("ReturnStatementSegment"),
1304                Ref::new("ShowStatementSegment"),
1305                Ref::new("AlterUserStatementSegment"),
1306                Ref::new("AlterSessionStatementSegment"),
1307                Ref::new("AlterTaskStatementSegment"),
1308                Ref::new("SetAssignmentStatementSegment"),
1309                Ref::new("CallStoredProcedureSegment"),
1310                Ref::new("MergeStatementSegment"),
1311                Ref::new("CopyIntoTableStatementSegment"),
1312                Ref::new("CopyIntoLocationStatementSegment"),
1313                Ref::new("FormatTypeOptions"),
1314                Ref::new("AlterWarehouseStatementSegment"),
1315                Ref::new("AlterShareStatementSegment"),
1316                Ref::new("CreateExternalTableSegment"),
1317                Ref::new("AlterExternalTableStatementSegment"),
1318                Ref::new("CreateSchemaStatementSegment"),
1319                Ref::new("AlterSchemaStatementSegment"),
1320                Ref::new("CreateFunctionStatementSegment"),
1321                Ref::new("AlterFunctionStatementSegment"),
1322                Ref::new("CreateExternalFunctionStatementSegment"),
1323                Ref::new("CreateStageSegment"),
1324                Ref::new("AlterStageSegment"),
1325                Ref::new("CreateStreamStatementSegment"),
1326                Ref::new("AlterStreamStatementSegment"),
1327                Ref::new("UnsetStatementSegment"),
1328                Ref::new("UndropStatementSegment"),
1329                Ref::new("CommentStatementSegment"),
1330                Ref::new("CallStatementSegment"),
1331                Ref::new("AlterViewStatementSegment"),
1332                Ref::new("AlterMaterializedViewStatementSegment"),
1333                Ref::new("DropProcedureStatementSegment"),
1334                Ref::new("DropExternalTableStatementSegment"),
1335                Ref::new("DropMaterializedViewStatementSegment"),
1336                Ref::new("DropObjectStatementSegment"),
1337                Ref::new("CreateFileFormatSegment"),
1338                Ref::new("AlterFileFormatSegment"),
1339                Ref::new("AlterPipeSegment"),
1340                Ref::new("ListStatementSegment"),
1341                Ref::new("GetStatementSegment"),
1342                Ref::new("PutStatementSegment"),
1343                Ref::new("RemoveStatementSegment"),
1344                Ref::new("CreateDatabaseFromShareStatementSegment"),
1345                Ref::new("AlterRoleStatementSegment"),
1346                Ref::new("AlterStorageIntegrationSegment"),
1347                Ref::new("ExecuteTaskClauseSegment"),
1348            ]),
1349            None,
1350            None,
1351            Some(vec_of_erased![
1352                Ref::new("CreateIndexStatementSegment"),
1353                Ref::new("DropIndexStatementSegment"),
1354            ]),
1355            Vec::new(),
1356            false,
1357        ),
1358    );
1359
1360    snowflake_dialect.add([
1361        (
1362            "SetAssignmentStatementSegment".into(),
1363            NodeMatcher::new(
1364                SyntaxKind::SetStatement,
1365                one_of(vec_of_erased![
1366                    Sequence::new(vec_of_erased![
1367                        Ref::keyword("SET"),
1368                        Ref::new("LocalVariableNameSegment"),
1369                        Ref::new("EqualsSegment"),
1370                        Ref::new("ExpressionSegment"),
1371                    ]),
1372                    Sequence::new(vec_of_erased![
1373                        Ref::keyword("SET"),
1374                        Bracketed::new(vec_of_erased![Delimited::new(vec_of_erased![Ref::new(
1375                            "LocalVariableNameSegment"
1376                        ),]),]),
1377                        Ref::new("EqualsSegment"),
1378                        Bracketed::new(vec_of_erased![Delimited::new(vec_of_erased![Ref::new(
1379                            "ExpressionSegment"
1380                        ),]),]),
1381                    ]),
1382                ])
1383                .to_matchable(),
1384            )
1385            .to_matchable()
1386            .into(),
1387        ),
1388        (
1389            "CallStoredProcedureSegment".into(),
1390            NodeMatcher::new(
1391                SyntaxKind::CallSegment,
1392                Sequence::new(vec_of_erased![
1393                    Ref::keyword("CALL"),
1394                    Ref::new("FunctionSegment"),
1395                ])
1396                .to_matchable(),
1397            )
1398            .to_matchable()
1399            .into(),
1400        ),
1401        (
1402            "WithinGroupClauseSegment".into(),
1403            NodeMatcher::new(
1404                SyntaxKind::WithingroupClause,
1405                Sequence::new(vec_of_erased![
1406                    Ref::keyword("WITHIN"),
1407                    Ref::keyword("GROUP"),
1408                    Bracketed::new(vec_of_erased![Ref::new("OrderByClauseSegment").optional(),])
1409                        .config(|this| {
1410                            this.parse_mode = ParseMode::Greedy;
1411                        }),
1412                ])
1413                .to_matchable(),
1414            )
1415            .to_matchable()
1416            .into(),
1417        ),
1418        (
1419            "PatternSegment".into(),
1420            NodeMatcher::new(
1421                SyntaxKind::PatternExpression,
1422                Sequence::new(vec_of_erased![
1423                    Ref::new("CaretSegment").optional(),
1424                    one_of(vec_of_erased![
1425                        AnyNumberOf::new(vec_of_erased![Ref::new("PatternOperatorGrammar")]),
1426                        Delimited::new(vec_of_erased![Ref::new("PatternOperatorGrammar")])
1427                            .config(|this| this.delimiter(Ref::new("BitwiseOrSegment"))),
1428                    ]),
1429                    Ref::new("DollarSegment").optional(),
1430                ])
1431                .to_matchable(),
1432            )
1433            .to_matchable()
1434            .into(),
1435        ),
1436        (
1437            "MatchRecognizeClauseSegment".into(),
1438            NodeMatcher::new(
1439                SyntaxKind::MatchRecognizeClause,
1440                Sequence::new(vec_of_erased![
1441                    Ref::keyword("MATCH_RECOGNIZE"),
1442                    Bracketed::new(vec_of_erased![
1443                        Ref::new("PartitionClauseSegment").optional(),
1444                        Ref::new("OrderByClauseSegment").optional(),
1445                        Sequence::new(vec_of_erased![
1446                            Ref::keyword("MEASURES"),
1447                            Delimited::new(vec_of_erased![Sequence::new(vec_of_erased![
1448                                one_of(vec_of_erased![
1449                                    Ref::keyword("FINAL"),
1450                                    Ref::keyword("RUNNING"),
1451                                ])
1452                                .config(|this| this.optional()),
1453                                Ref::new("ExpressionSegment"),
1454                                Ref::new("AliasExpressionSegment"),
1455                            ]),]),
1456                        ])
1457                        .config(|this| this.optional()),
1458                        one_of(vec_of_erased![
1459                            Sequence::new(vec_of_erased![
1460                                Ref::keyword("ONE"),
1461                                Ref::keyword("ROW"),
1462                                Ref::keyword("PER"),
1463                                Ref::keyword("MATCH"),
1464                            ]),
1465                            Sequence::new(vec_of_erased![
1466                                Ref::keyword("ALL"),
1467                                Ref::keyword("ROWS"),
1468                                Ref::keyword("PER"),
1469                                Ref::keyword("MATCH"),
1470                                one_of(vec_of_erased![
1471                                    Sequence::new(vec_of_erased![
1472                                        Ref::keyword("SHOW"),
1473                                        Ref::keyword("EMPTY"),
1474                                        Ref::keyword("MATCHES"),
1475                                    ]),
1476                                    Sequence::new(vec_of_erased![
1477                                        Ref::keyword("OMIT"),
1478                                        Ref::keyword("EMPTY"),
1479                                        Ref::keyword("MATCHES"),
1480                                    ]),
1481                                    Sequence::new(vec_of_erased![
1482                                        Ref::keyword("WITH"),
1483                                        Ref::keyword("UNMATCHED"),
1484                                        Ref::keyword("ROWS"),
1485                                    ]),
1486                                ])
1487                                .config(|this| this.optional()),
1488                            ]),
1489                        ])
1490                        .config(|this| this.optional()),
1491                        Sequence::new(vec_of_erased![
1492                            Ref::keyword("AFTER"),
1493                            Ref::keyword("MATCH"),
1494                            Ref::keyword("SKIP"),
1495                            one_of(vec_of_erased![
1496                                Sequence::new(vec_of_erased![
1497                                    Ref::keyword("PAST"),
1498                                    Ref::keyword("LAST"),
1499                                    Ref::keyword("ROW"),
1500                                ]),
1501                                Sequence::new(vec_of_erased![
1502                                    Ref::keyword("TO"),
1503                                    Ref::keyword("NEXT"),
1504                                    Ref::keyword("ROW"),
1505                                ]),
1506                                Sequence::new(vec_of_erased![
1507                                    Ref::keyword("TO"),
1508                                    one_of(vec_of_erased![
1509                                        Ref::keyword("FIRST"),
1510                                        Ref::keyword("LAST"),
1511                                    ])
1512                                    .config(|this| this.optional()),
1513                                    Ref::new("SingleIdentifierGrammar"),
1514                                ]),
1515                            ]),
1516                        ])
1517                        .config(|this| this.optional()),
1518                        Ref::keyword("PATTERN"),
1519                        Bracketed::new(vec_of_erased![Ref::new("PatternSegment"),]),
1520                        Ref::keyword("DEFINE"),
1521                        Delimited::new(vec_of_erased![Sequence::new(vec_of_erased![
1522                            Ref::new("SingleIdentifierGrammar"),
1523                            Ref::keyword("AS"),
1524                            Ref::new("ExpressionSegment"),
1525                        ]),]),
1526                    ]),
1527                ])
1528                .to_matchable(),
1529            )
1530            .to_matchable()
1531            .into(),
1532        ),
1533        (
1534            "ChangesClauseSegment".into(),
1535            NodeMatcher::new(
1536                SyntaxKind::ChangesClause,
1537                Sequence::new(vec_of_erased![
1538                    Ref::keyword("CHANGES"),
1539                    Bracketed::new(vec_of_erased![
1540                        Ref::keyword("INFORMATION"),
1541                        Ref::new("ParameterAssignerSegment"),
1542                        one_of(vec_of_erased![
1543                            Ref::keyword("DEFAULT"),
1544                            Ref::keyword("APPEND_ONLY"),
1545                        ]),
1546                    ]),
1547                    one_of(vec_of_erased![
1548                        Sequence::new(vec_of_erased![
1549                            Ref::keyword("AT"),
1550                            Bracketed::new(vec_of_erased![
1551                                one_of(vec_of_erased![
1552                                    Ref::keyword("TIMESTAMP"),
1553                                    Ref::keyword("OFFSET"),
1554                                    Ref::keyword("STATEMENT"),
1555                                ]),
1556                                Ref::new("ParameterAssignerSegment"),
1557                                Ref::new("ExpressionSegment"),
1558                            ]),
1559                        ]),
1560                        Sequence::new(vec_of_erased![
1561                            Ref::keyword("BEFORE"),
1562                            Bracketed::new(vec_of_erased![
1563                                Ref::keyword("STATEMENT"),
1564                                Ref::new("ParameterAssignerSegment"),
1565                                Ref::new("ExpressionSegment"),
1566                            ]),
1567                        ]),
1568                    ]),
1569                    Sequence::new(vec_of_erased![
1570                        Ref::keyword("END"),
1571                        Bracketed::new(vec_of_erased![
1572                            one_of(vec_of_erased![
1573                                Ref::keyword("TIMESTAMP"),
1574                                Ref::keyword("OFFSET"),
1575                                Ref::keyword("STATEMENT"),
1576                            ]),
1577                            Ref::new("ParameterAssignerSegment"),
1578                            Ref::new("ExpressionSegment"),
1579                        ]),
1580                    ])
1581                    .config(|this| this.optional()),
1582                ])
1583                .to_matchable(),
1584            )
1585            .to_matchable()
1586            .into(),
1587        ),
1588        (
1589            "FromAtExpressionSegment".into(),
1590            NodeMatcher::new(
1591                SyntaxKind::FromAtExpression,
1592                Sequence::new(vec_of_erased![
1593                    Ref::keyword("AT"),
1594                    Bracketed::new(vec_of_erased![
1595                        one_of(vec_of_erased![
1596                            Ref::keyword("TIMESTAMP"),
1597                            Ref::keyword("OFFSET"),
1598                            Ref::keyword("STATEMENT"),
1599                        ]),
1600                        Ref::new("ParameterAssignerSegment"),
1601                        Ref::new("ExpressionSegment"),
1602                    ]),
1603                ])
1604                .to_matchable(),
1605            )
1606            .to_matchable()
1607            .into(),
1608        ),
1609        (
1610            "FromBeforeExpressionSegment".into(),
1611            NodeMatcher::new(
1612                SyntaxKind::FromBeforeExpression,
1613                Sequence::new(vec_of_erased![
1614                    Ref::keyword("BEFORE"),
1615                    Bracketed::new(vec_of_erased![
1616                        one_of(vec_of_erased![
1617                            Ref::keyword("TIMESTAMP"),
1618                            Ref::keyword("OFFSET"),
1619                            Ref::keyword("STATEMENT"),
1620                        ]),
1621                        Ref::new("ParameterAssignerSegment"),
1622                        Ref::new("ExpressionSegment"),
1623                    ])
1624                    .config(|this| {
1625                        this.parse_mode = ParseMode::Greedy;
1626                    }),
1627                ])
1628                .to_matchable(),
1629            )
1630            .to_matchable()
1631            .into(),
1632        ),
1633        (
1634            "FromPivotExpressionSegment".into(),
1635            NodeMatcher::new(
1636                SyntaxKind::FromPivotExpression,
1637                Sequence::new(vec_of_erased![
1638                    Ref::keyword("PIVOT"),
1639                    Bracketed::new(vec_of_erased![
1640                        Ref::new("FunctionSegment"),
1641                        Ref::keyword("FOR"),
1642                        Ref::new("SingleIdentifierGrammar"),
1643                        Ref::keyword("IN"),
1644                        Bracketed::new(vec_of_erased![Delimited::new(vec_of_erased![Ref::new(
1645                            "LiteralGrammar"
1646                        ),]),]),
1647                    ]),
1648                ])
1649                .to_matchable(),
1650            )
1651            .to_matchable()
1652            .into(),
1653        ),
1654        (
1655            "FromUnpivotExpressionSegment".into(),
1656            NodeMatcher::new(
1657                SyntaxKind::FromUnpivotExpression,
1658                Sequence::new(vec_of_erased![
1659                    Ref::keyword("UNPIVOT"),
1660                    Bracketed::new(vec_of_erased![
1661                        Ref::new("SingleIdentifierGrammar"),
1662                        Ref::keyword("FOR"),
1663                        Ref::new("SingleIdentifierGrammar"),
1664                        Ref::keyword("IN"),
1665                        Bracketed::new(vec_of_erased![Delimited::new(vec_of_erased![Ref::new(
1666                            "SingleIdentifierGrammar"
1667                        ),]),]),
1668                    ]),
1669                ])
1670                .to_matchable(),
1671            )
1672            .to_matchable()
1673            .into(),
1674        ),
1675    ]);
1676
1677    snowflake_dialect.replace_grammar(
1678        "SamplingExpressionSegment",
1679        Sequence::new(vec_of_erased![
1680            one_of(vec_of_erased![
1681                Ref::keyword("SAMPLE"),
1682                Ref::keyword("TABLESAMPLE"),
1683            ]),
1684            one_of(vec_of_erased![
1685                Ref::keyword("BERNOULLI"),
1686                Ref::keyword("ROW"),
1687                Ref::keyword("SYSTEM"),
1688                Ref::keyword("BLOCK"),
1689            ])
1690            .config(|this| this.optional()),
1691            Bracketed::new(vec_of_erased![
1692                one_of(vec_of_erased![
1693                    Ref::new("NumericLiteralSegment"),
1694                    Ref::new("ReferencedVariableNameSegment"),
1695                ]),
1696                Ref::keyword("ROWS").optional(),
1697            ]),
1698            Sequence::new(vec_of_erased![
1699                one_of(vec_of_erased![
1700                    Ref::keyword("REPEATABLE"),
1701                    Ref::keyword("SEED"),
1702                ]),
1703                Bracketed::new(vec_of_erased![Ref::new("NumericLiteralSegment"),]),
1704            ])
1705            .config(|this| this.optional()),
1706        ])
1707        .to_matchable(),
1708    );
1709
1710    snowflake_dialect.add([
1711        (
1712            "NamedParameterExpressionSegment".into(),
1713            NodeMatcher::new(
1714                SyntaxKind::SnowflakeKeywordExpression,
1715                Sequence::new(vec_of_erased![
1716                    Ref::new("ParameterNameSegment"),
1717                    Ref::new("ParameterAssignerSegment"),
1718                    one_of(vec_of_erased![
1719                        Ref::new("LiteralGrammar"),
1720                        Ref::new("ColumnReferenceSegment"),
1721                        Ref::new("ExpressionSegment"),
1722                    ]),
1723                ])
1724                .to_matchable(),
1725            )
1726            .to_matchable()
1727            .into(),
1728        ),
1729        (
1730            "SemiStructuredAccessorSegment".into(),
1731            NodeMatcher::new(
1732                SyntaxKind::SemiStructuredExpression,
1733                Sequence::new(vec_of_erased![
1734                    one_of(vec_of_erased![
1735                        Ref::new("DotSegment"),
1736                        Ref::new("ColonSegment"),
1737                    ]),
1738                    one_of(vec_of_erased![
1739                        Ref::new("NakedSemiStructuredElementSegment"),
1740                        Ref::new("QuotedSemiStructuredElementSegment"),
1741                    ]),
1742                    Ref::new("ArrayAccessorSegment").optional(),
1743                    AnyNumberOf::new(vec_of_erased![
1744                        Sequence::new(vec_of_erased![
1745                            one_of(vec_of_erased![
1746                                Ref::new("DotSegment"),
1747                                Ref::new("ColonSegment"),
1748                            ]),
1749                            one_of(vec_of_erased![
1750                                Ref::new("NakedSemiStructuredElementSegment"),
1751                                Ref::new("QuotedSemiStructuredElementSegment"),
1752                            ]),
1753                        ])
1754                        .config(|this| {
1755                            this.allow_gaps = true;
1756                        }),
1757                        Ref::new("ArrayAccessorSegment").optional(),
1758                    ])
1759                    .config(|this| {
1760                        this.allow_gaps = true;
1761                    }),
1762                ])
1763                .config(|this| {
1764                    this.allow_gaps = true;
1765                })
1766                .to_matchable(),
1767            )
1768            .to_matchable()
1769            .into(),
1770        ),
1771        (
1772            "QualifyClauseSegment".into(),
1773            NodeMatcher::new(
1774                SyntaxKind::QualifyClause,
1775                Sequence::new(vec_of_erased![
1776                    Ref::keyword("QUALIFY"),
1777                    MetaSegment::indent(),
1778                    one_of(vec_of_erased![
1779                        Bracketed::new(vec_of_erased![Ref::new("ExpressionSegment"),]),
1780                        Ref::new("ExpressionSegment"),
1781                    ]),
1782                    MetaSegment::dedent(),
1783                ])
1784                .to_matchable(),
1785            )
1786            .to_matchable()
1787            .into(),
1788        ),
1789    ]);
1790
1791    snowflake_dialect.replace_grammar(
1792        "SelectStatementSegment",
1793        ansi::select_statement().copy(
1794            Some(vec_of_erased![Ref::new("QualifyClauseSegment").optional()]),
1795            None,
1796            Some(Ref::new("OrderByClauseSegment").optional().to_matchable()),
1797            None,
1798            Vec::new(),
1799            false,
1800        ),
1801    );
1802
1803    snowflake_dialect.replace_grammar(
1804        "WildcardExpressionSegment",
1805        ansi::wildcard_expression_segment().copy(
1806            Some(vec_of_erased![
1807                Ref::new("ExcludeClauseSegment").optional(),
1808                Ref::new("ReplaceClauseSegment").optional(),
1809                Ref::new("RenameClauseSegment").optional(),
1810            ]),
1811            None,
1812            None,
1813            None,
1814            Vec::new(),
1815            false,
1816        ),
1817    );
1818
1819    snowflake_dialect.add([
1820        (
1821            "ExcludeClauseSegment".into(),
1822            NodeMatcher::new(
1823                SyntaxKind::SelectExcludeClause,
1824                Sequence::new(vec_of_erased![
1825                    Ref::keyword("EXCLUDE"),
1826                    one_of(vec_of_erased![
1827                        Bracketed::new(vec_of_erased![Delimited::new(vec_of_erased![Ref::new(
1828                            "SingleIdentifierGrammar"
1829                        ),]),]),
1830                        Ref::new("SingleIdentifierGrammar"),
1831                    ]),
1832                ])
1833                .to_matchable(),
1834            )
1835            .to_matchable()
1836            .into(),
1837        ),
1838        (
1839            "RenameClauseSegment".into(),
1840            NodeMatcher::new(
1841                SyntaxKind::SelectRenameClause,
1842                Sequence::new(vec_of_erased![
1843                    Ref::keyword("RENAME"),
1844                    one_of(vec_of_erased![
1845                        Sequence::new(vec_of_erased![
1846                            Ref::new("SingleIdentifierGrammar"),
1847                            Ref::keyword("AS"),
1848                            Ref::new("SingleIdentifierGrammar"),
1849                        ]),
1850                        Bracketed::new(vec_of_erased![Delimited::new(vec_of_erased![
1851                            Sequence::new(vec_of_erased![
1852                                Ref::new("SingleIdentifierGrammar"),
1853                                Ref::keyword("AS"),
1854                                Ref::new("SingleIdentifierGrammar"),
1855                            ]),
1856                        ]),]),
1857                    ]),
1858                ])
1859                .to_matchable(),
1860            )
1861            .to_matchable()
1862            .into(),
1863        ),
1864        (
1865            "ReplaceClauseSegment".into(),
1866            NodeMatcher::new(
1867                SyntaxKind::SelectReplaceClause,
1868                Sequence::new(vec_of_erased![
1869                    Ref::keyword("REPLACE"),
1870                    Bracketed::new(vec_of_erased![Delimited::new(vec_of_erased![
1871                        Sequence::new(vec_of_erased![
1872                            Ref::new("ExpressionSegment"),
1873                            Ref::keyword("AS"),
1874                            Ref::new("SingleIdentifierGrammar"),
1875                        ]),
1876                    ]),]),
1877                ])
1878                .to_matchable(),
1879            )
1880            .to_matchable()
1881            .into(),
1882        ),
1883    ]);
1884
1885    snowflake_dialect.replace_grammar(
1886        "SelectClauseModifierSegment",
1887        Sequence::new(vec_of_erased![
1888            one_of(vec_of_erased![
1889                Ref::keyword("DISTINCT"),
1890                Ref::keyword("ALL"),
1891            ])
1892            .config(|this| this.optional()),
1893            Sequence::new(vec_of_erased![
1894                Ref::keyword("TOP"),
1895                Ref::new("NumericLiteralSegment"),
1896            ])
1897            .config(|this| this.optional()),
1898        ])
1899        .to_matchable(),
1900    );
1901
1902    snowflake_dialect.replace_grammar(
1903        "AlterTableStatementSegment",
1904        Sequence::new(vec_of_erased![
1905            Ref::keyword("ALTER"),
1906            Ref::keyword("TABLE"),
1907            Ref::new("IfExistsGrammar").optional(),
1908            Ref::new("TableReferenceSegment"),
1909            one_of(vec_of_erased![
1910                // Rename
1911                Sequence::new(vec_of_erased![
1912                    Ref::keyword("RENAME"),
1913                    Ref::keyword("TO"),
1914                    Ref::new("TableReferenceSegment"),
1915                ]),
1916                // Swap With
1917                Sequence::new(vec_of_erased![
1918                    Ref::keyword("SWAP"),
1919                    Ref::keyword("WITH"),
1920                    Ref::new("TableReferenceSegment"),
1921                ]),
1922                // searchOptimizationAction
1923                Sequence::new(vec_of_erased![
1924                    one_of(vec_of_erased![Ref::keyword("ADD"), Ref::keyword("DROP"),]),
1925                    Ref::keyword("SEARCH"),
1926                    Ref::keyword("OPTIMIZATION"),
1927                ]),
1928                Ref::new("AlterTableClusteringActionSegment"),
1929                Ref::new("AlterTableConstraintActionSegment"),
1930                // SET Table options
1931                Sequence::new(vec_of_erased![
1932                    Ref::keyword("SET"),
1933                    one_of(vec_of_erased![
1934                        Ref::new("ParameterNameSegment"),
1935                        Ref::keyword("COMMENT"),
1936                    ]),
1937                    Ref::new("EqualsSegment").optional(),
1938                    one_of(vec_of_erased![
1939                        Ref::new("LiteralGrammar"),
1940                        Ref::new("NakedIdentifierSegment"),
1941                        Ref::new("QuotedLiteralSegment"),
1942                    ]),
1943                ]),
1944                // Drop primary key
1945                Sequence::new(vec_of_erased![
1946                    Ref::keyword("DROP"),
1947                    Ref::new("PrimaryKeyGrammar"),
1948                ]),
1949                // Add primary key
1950                Sequence::new(vec_of_erased![
1951                    Ref::keyword("ADD"),
1952                    Ref::new("PrimaryKeyGrammar"),
1953                    Bracketed::new(vec_of_erased![
1954                        Delimited::new(vec_of_erased![Ref::new("ColumnReferenceSegment"),])
1955                            .config(|this| this.optional()),
1956                    ]),
1957                ]),
1958                Ref::new("AlterTableTableColumnActionSegment"),
1959            ]),
1960        ])
1961        .to_matchable(),
1962    );
1963
1964    snowflake_dialect.add([
1965        (
1966            "AlterTableTableColumnActionSegment".into(),
1967            NodeMatcher::new(
1968                SyntaxKind::AlterTableTableColumnAction,
1969                one_of(vec_of_erased![
1970                    // Add Column
1971                    Sequence::new(vec_of_erased![
1972                        Ref::keyword("ADD"),
1973                        Ref::keyword("COLUMN").optional(),
1974                        Delimited::new(vec_of_erased![Sequence::new(vec_of_erased![
1975                            Ref::new("ColumnReferenceSegment"),
1976                            Ref::new("DatatypeSegment"),
1977                            one_of(vec_of_erased![
1978                                // Default
1979                                Sequence::new(vec_of_erased![
1980                                    Ref::keyword("DEFAULT"),
1981                                    Ref::new("ExpressionSegment"),
1982                                ]),
1983                                // Auto-increment/identity column
1984                                Sequence::new(vec_of_erased![
1985                                    one_of(vec_of_erased![
1986                                        Ref::keyword("AUTOINCREMENT"),
1987                                        Ref::keyword("IDENTITY"),
1988                                    ]),
1989                                    one_of(vec_of_erased![
1990                                        // ( <start_num>, <step_num> )
1991                                        Bracketed::new(vec_of_erased![
1992                                            Ref::new("NumericLiteralSegment"),
1993                                            Ref::new("CommaSegment"),
1994                                            Ref::new("NumericLiteralSegment"),
1995                                        ]),
1996                                        // START <num> INCREMENT <num>
1997                                        Sequence::new(vec_of_erased![
1998                                            Ref::keyword("START"),
1999                                            Ref::new("NumericLiteralSegment"),
2000                                            Ref::keyword("INCREMENT"),
2001                                            Ref::new("NumericLiteralSegment"),
2002                                        ]),
2003                                    ])
2004                                    .config(|this| this.optional()),
2005                                ])
2006                                .config(|this| this.optional()),
2007                            ])
2008                            .config(|this| this.optional()),
2009                            // Masking Policy
2010                            Sequence::new(vec_of_erased![
2011                                Ref::keyword("WITH").optional(),
2012                                Ref::keyword("MASKING"),
2013                                Ref::keyword("POLICY"),
2014                                Ref::new("FunctionNameSegment"),
2015                                Sequence::new(vec_of_erased![
2016                                    Ref::keyword("USING"),
2017                                    Bracketed::new(vec_of_erased![Delimited::new(vec_of_erased![
2018                                        one_of(vec_of_erased![
2019                                            Ref::new("ColumnReferenceSegment"),
2020                                            Ref::new("ExpressionSegment"),
2021                                        ]),
2022                                    ]),]),
2023                                ])
2024                                .config(|this| this.optional()),
2025                            ])
2026                            .config(|this| this.optional()),
2027                            Ref::new("CommentClauseSegment").optional(),
2028                        ]),]),
2029                    ]),
2030                    // Rename column
2031                    Sequence::new(vec_of_erased![
2032                        Ref::keyword("RENAME"),
2033                        Ref::keyword("COLUMN"),
2034                        Ref::new("ColumnReferenceSegment"),
2035                        Ref::keyword("TO"),
2036                        Ref::new("ColumnReferenceSegment"),
2037                    ]),
2038                    // Alter/Modify column(s)
2039                    Sequence::new(vec_of_erased![
2040                        one_of(vec_of_erased![
2041                            Ref::keyword("ALTER"),
2042                            Ref::keyword("MODIFY"),
2043                        ]),
2044                        optionally_bracketed(vec_of_erased![Delimited::new(vec_of_erased![
2045                            // Add things
2046                            Sequence::new(vec_of_erased![
2047                                Ref::keyword("COLUMN").optional(),
2048                                Ref::new("ColumnReferenceSegment"),
2049                                one_of(vec_of_erased![
2050                                    Sequence::new(vec_of_erased![
2051                                        Ref::keyword("DROP"),
2052                                        Ref::keyword("DEFAULT"),
2053                                    ]),
2054                                    Sequence::new(vec_of_erased![
2055                                        Ref::keyword("SET"),
2056                                        Ref::keyword("DEFAULT"),
2057                                        Ref::new("NakedIdentifierSegment"),
2058                                        Ref::new("DotSegment"),
2059                                        Ref::keyword("NEXTVAL"),
2060                                    ]),
2061                                    Sequence::new(vec_of_erased![
2062                                        one_of(vec_of_erased![
2063                                            Ref::keyword("SET"),
2064                                            Ref::keyword("DROP"),
2065                                        ])
2066                                        .config(|this| this.optional()),
2067                                        Ref::keyword("NOT"),
2068                                        Ref::keyword("NULL"),
2069                                    ]),
2070                                    Sequence::new(vec_of_erased![
2071                                        Sequence::new(vec_of_erased![
2072                                            Sequence::new(vec_of_erased![
2073                                                Ref::keyword("SET"),
2074                                                Ref::keyword("DATA").optional(),
2075                                            ]),
2076                                            Ref::keyword("TYPE").optional(),
2077                                        ]),
2078                                        Ref::new("DatatypeSegment"),
2079                                    ]),
2080                                    Ref::new("CommentClauseSegment"),
2081                                ]),
2082                            ]),
2083                            Sequence::new(vec_of_erased![
2084                                Ref::keyword("COLUMN"),
2085                                Ref::new("ColumnReferenceSegment"),
2086                                Ref::keyword("SET"),
2087                                Ref::keyword("MASKING"),
2088                                Ref::keyword("POLICY"),
2089                                Ref::new("FunctionNameSegment"),
2090                                Sequence::new(vec_of_erased![
2091                                    Ref::keyword("USING"),
2092                                    Bracketed::new(vec_of_erased![Delimited::new(vec_of_erased![
2093                                        one_of(vec_of_erased![
2094                                            Ref::new("ColumnReferenceSegment"),
2095                                            Ref::new("ExpressionSegment"),
2096                                        ]),
2097                                    ]),]),
2098                                ])
2099                                .config(|this| this.optional()),
2100                            ]),
2101                            Sequence::new(vec_of_erased![
2102                                Ref::keyword("COLUMN"),
2103                                Ref::new("ColumnReferenceSegment"),
2104                                Ref::keyword("UNSET"),
2105                                Ref::keyword("MASKING"),
2106                                Ref::keyword("POLICY"),
2107                            ]),
2108                            Sequence::new(vec_of_erased![
2109                                Ref::keyword("COLUMN"),
2110                                Ref::new("ColumnReferenceSegment"),
2111                                Ref::keyword("SET"),
2112                                Ref::keyword("TAG"),
2113                                Ref::new("TagReferenceSegment"),
2114                                Ref::new("EqualsSegment"),
2115                                Ref::new("QuotedLiteralSegment"),
2116                            ]),
2117                            Sequence::new(vec_of_erased![
2118                                Ref::keyword("COLUMN"),
2119                                Ref::new("ColumnReferenceSegment"),
2120                                Ref::keyword("UNSET"),
2121                                Ref::keyword("TAG"),
2122                                Ref::new("TagReferenceSegment"),
2123                            ]),
2124                        ]),]),
2125                    ]),
2126                    // Drop column
2127                    Sequence::new(vec_of_erased![
2128                        Ref::keyword("DROP"),
2129                        Ref::keyword("COLUMN").optional(),
2130                        Delimited::new(vec_of_erased![Ref::new("ColumnReferenceSegment"),]),
2131                    ]),
2132                    // Add or Modify column
2133                    Sequence::new(vec_of_erased![
2134                        one_of(vec_of_erased![Ref::keyword("ADD"), Ref::keyword("MODIFY"),]),
2135                        Ref::keyword("COLUMN").optional(),
2136                        Ref::new("ColumnDefinitionSegment"),
2137                        one_of(vec_of_erased![
2138                            Sequence::new(vec_of_erased![
2139                                one_of(vec_of_erased![
2140                                    Ref::keyword("FIRST"),
2141                                    Ref::keyword("AFTER"),
2142                                ]),
2143                                Ref::new("ColumnReferenceSegment"),
2144                            ]),
2145                            // Bracketed Version of the same
2146                            Ref::new("BracketedColumnReferenceListGrammar"),
2147                        ])
2148                        .config(|this| this.optional()),
2149                    ]),
2150                ])
2151                .to_matchable(),
2152            )
2153            .to_matchable()
2154            .into(),
2155        ),
2156        (
2157            "AlterTableClusteringActionSegment".into(),
2158            NodeMatcher::new(
2159                SyntaxKind::AlterTableClusteringAction,
2160                one_of(vec_of_erased![
2161                    Sequence::new(vec_of_erased![
2162                        Ref::keyword("CLUSTER"),
2163                        Ref::keyword("BY"),
2164                        one_of(vec_of_erased![
2165                            Ref::new("FunctionSegment"),
2166                            Bracketed::new(vec_of_erased![Delimited::new(vec_of_erased![
2167                                Ref::new("ExpressionSegment"),
2168                            ]),]),
2169                        ]),
2170                    ]),
2171                    Sequence::new(vec_of_erased![
2172                        Ref::keyword("RECLUSTER"),
2173                        Sequence::new(vec_of_erased![
2174                            Ref::keyword("MAX_SIZE"),
2175                            Ref::new("EqualsSegment"),
2176                            Ref::new("NumericLiteralSegment"),
2177                        ])
2178                        .config(|this| this.optional()),
2179                        Ref::new("WhereClauseSegment").optional(),
2180                    ]),
2181                    Sequence::new(vec_of_erased![
2182                        one_of(vec_of_erased![
2183                            Ref::keyword("SUSPEND"),
2184                            Ref::keyword("RESUME"),
2185                        ]),
2186                        Ref::keyword("RECLUSTER"),
2187                    ]),
2188                    Sequence::new(vec_of_erased![
2189                        Ref::keyword("DROP"),
2190                        Ref::keyword("CLUSTERING"),
2191                        Ref::keyword("KEY"),
2192                    ]),
2193                ])
2194                .to_matchable(),
2195            )
2196            .to_matchable()
2197            .into(),
2198        ),
2199        (
2200            "AlterTableConstraintActionSegment".into(),
2201            NodeMatcher::new(
2202                SyntaxKind::AlterTableConstraintAction,
2203                one_of(vec_of_erased![
2204                    // Add Column
2205                    Sequence::new(vec_of_erased![
2206                        Ref::keyword("ADD"),
2207                        Sequence::new(vec_of_erased![
2208                            Ref::keyword("CONSTRAINT"),
2209                            one_of(vec_of_erased![
2210                                Ref::new("NakedIdentifierSegment"),
2211                                Ref::new("QuotedIdentifierSegment"),
2212                            ])
2213                            .config(|this| this.optional()),
2214                        ]),
2215                        one_of(vec_of_erased![
2216                            Sequence::new(vec_of_erased![
2217                                Ref::new("PrimaryKeyGrammar"),
2218                                Bracketed::new(vec_of_erased![Delimited::new(vec_of_erased![
2219                                    Ref::new("ColumnReferenceSegment"),
2220                                ]),]),
2221                            ]),
2222                            Sequence::new(vec_of_erased![
2223                                Sequence::new(vec_of_erased![
2224                                    Ref::new("ForeignKeyGrammar"),
2225                                    Bracketed::new(vec_of_erased![Delimited::new(vec_of_erased![
2226                                        Ref::new("ColumnReferenceSegment"),
2227                                    ]),]),
2228                                ]),
2229                                Ref::keyword("REFERENCES"),
2230                                Ref::new("TableReferenceSegment"),
2231                                Bracketed::new(vec_of_erased![Delimited::new(vec_of_erased![
2232                                    Ref::new("ColumnReferenceSegment"),
2233                                ]),])
2234                                .config(|this| this.optional()),
2235                            ]),
2236                            Sequence::new(vec_of_erased![
2237                                Ref::keyword("UNIQUE"),
2238                                Bracketed::new(vec_of_erased![Ref::new("ColumnReferenceSegment"),])
2239                                    .config(|this| this.optional()),
2240                            ]),
2241                        ]),
2242                    ]),
2243                    Sequence::new(vec_of_erased![
2244                        Ref::keyword("DROP"),
2245                        Sequence::new(vec_of_erased![
2246                            Ref::keyword("CONSTRAINT"),
2247                            Ref::new("NakedIdentifierSegment"),
2248                        ])
2249                        .config(|this| this.optional()),
2250                        one_of(vec_of_erased![
2251                            Ref::new("PrimaryKeyGrammar"),
2252                            Ref::new("ForeignKeyGrammar"),
2253                            Ref::keyword("UNIQUE"),
2254                        ]),
2255                        Delimited::new(vec_of_erased![Ref::new("ColumnReferenceSegment"),]),
2256                    ]),
2257                    Sequence::new(vec_of_erased![
2258                        Ref::keyword("RENAME"),
2259                        Ref::keyword("CONSTRAINT"),
2260                        Ref::new("NakedIdentifierSegment"),
2261                        Ref::keyword("TO"),
2262                        Ref::new("NakedIdentifierSegment"),
2263                    ]),
2264                ])
2265                .to_matchable(),
2266            )
2267            .to_matchable()
2268            .into(),
2269        ),
2270        (
2271            "AlterWarehouseStatementSegment".into(),
2272            NodeMatcher::new(
2273                SyntaxKind::AlterWarehouseStatement,
2274                Sequence::new(vec_of_erased![
2275                    Ref::keyword("ALTER"),
2276                    Ref::keyword("WAREHOUSE"),
2277                    Sequence::new(vec_of_erased![Ref::keyword("IF"), Ref::keyword("EXISTS"),])
2278                        .config(|this| this.optional()),
2279                    one_of(vec_of_erased![
2280                        Sequence::new(vec_of_erased![
2281                            Ref::new("ObjectReferenceSegment").optional(),
2282                            one_of(vec_of_erased![
2283                                Ref::keyword("SUSPEND"),
2284                                Sequence::new(vec_of_erased![
2285                                    Ref::keyword("RESUME"),
2286                                    Sequence::new(vec_of_erased![
2287                                        Ref::keyword("IF"),
2288                                        Ref::keyword("SUSPENDED"),
2289                                    ])
2290                                    .config(|this| this.optional()),
2291                                ]),
2292                            ]),
2293                        ]),
2294                        Sequence::new(vec_of_erased![
2295                            Ref::new("ObjectReferenceSegment").optional(),
2296                            Sequence::new(vec_of_erased![
2297                                Ref::keyword("ABORT"),
2298                                Ref::keyword("ALL"),
2299                                Ref::keyword("QUERIES"),
2300                            ]),
2301                        ]),
2302                        Sequence::new(vec_of_erased![
2303                            Ref::new("ObjectReferenceSegment"),
2304                            Ref::keyword("RENAME"),
2305                            Ref::keyword("TO"),
2306                            Ref::new("ObjectReferenceSegment"),
2307                        ]),
2308                        Sequence::new(vec_of_erased![
2309                            Ref::new("ObjectReferenceSegment").optional(),
2310                            Ref::keyword("SET"),
2311                            one_of(vec_of_erased![
2312                                AnyNumberOf::new(vec_of_erased![
2313                                    Ref::new("WarehouseObjectPropertiesSegment"),
2314                                    Ref::new("CommentEqualsClauseSegment"),
2315                                    Ref::new("WarehouseObjectParamsSegment"),
2316                                ]),
2317                                Ref::new("TagEqualsSegment"),
2318                            ]),
2319                        ]),
2320                        Sequence::new(vec_of_erased![
2321                            Ref::new("ObjectReferenceSegment"),
2322                            Ref::keyword("UNSET"),
2323                            one_of(vec_of_erased![
2324                                Delimited::new(vec_of_erased![Ref::new("NakedIdentifierSegment"),]),
2325                                Sequence::new(vec_of_erased![
2326                                    Ref::keyword("TAG"),
2327                                    Delimited::new(
2328                                        vec_of_erased![Ref::new("TagReferenceSegment"),]
2329                                    ),
2330                                ]),
2331                            ]),
2332                        ]),
2333                    ]),
2334                ])
2335                .to_matchable(),
2336            )
2337            .to_matchable()
2338            .into(),
2339        ),
2340        (
2341            "AlterShareStatementSegment".into(),
2342            NodeMatcher::new(
2343                SyntaxKind::AlterShareStatement,
2344                Sequence::new(vec_of_erased![
2345                    Ref::keyword("ALTER"),
2346                    Ref::keyword("SHARE"),
2347                    Sequence::new(vec_of_erased![Ref::keyword("IF"), Ref::keyword("EXISTS"),])
2348                        .config(|this| this.optional()),
2349                    Ref::new("NakedIdentifierSegment"),
2350                    one_of(vec_of_erased![
2351                        Sequence::new(vec_of_erased![
2352                            one_of(vec_of_erased![Ref::keyword("ADD"), Ref::keyword("REMOVE"),]),
2353                            Ref::keyword("ACCOUNTS"),
2354                            Ref::new("EqualsSegment"),
2355                            Delimited::new(vec_of_erased![Ref::new("NakedIdentifierSegment"),]),
2356                            Sequence::new(vec_of_erased![
2357                                Ref::keyword("SHARE_RESTRICTIONS"),
2358                                Ref::new("EqualsSegment"),
2359                                Ref::new("BooleanLiteralGrammar"),
2360                            ])
2361                            .config(|this| this.optional()),
2362                        ]),
2363                        Sequence::new(vec_of_erased![
2364                            Ref::keyword("SET"),
2365                            Ref::keyword("ACCOUNTS"),
2366                            Ref::new("EqualsSegment"),
2367                            Delimited::new(vec_of_erased![Ref::new("NakedIdentifierSegment"),]),
2368                            Ref::new("CommentEqualsClauseSegment").optional(),
2369                        ]),
2370                        Sequence::new(vec_of_erased![
2371                            Ref::keyword("SET"),
2372                            Ref::new("TagEqualsSegment"),
2373                        ]),
2374                        Sequence::new(vec_of_erased![
2375                            Ref::keyword("UNSET"),
2376                            Ref::keyword("TAG"),
2377                            Ref::new("TagReferenceSegment"),
2378                            AnyNumberOf::new(vec_of_erased![
2379                                Ref::new("CommaSegment"),
2380                                Ref::new("TagReferenceSegment"),
2381                            ])
2382                            .config(|this| this.optional()),
2383                        ]),
2384                        Sequence::new(vec_of_erased![
2385                            Ref::keyword("UNSET"),
2386                            Ref::keyword("COMMENT"),
2387                        ]),
2388                    ]),
2389                ])
2390                .to_matchable(),
2391            )
2392            .to_matchable()
2393            .into(),
2394        ),
2395        (
2396            "AlterStorageIntegrationSegment".into(),
2397            NodeMatcher::new(
2398                SyntaxKind::AlterStorageIntegrationStatement,
2399                Sequence::new(vec_of_erased![
2400                    Ref::keyword("ALTER"),
2401                    Ref::keyword("STORAGE").optional(),
2402                    Ref::keyword("INTEGRATION"),
2403                    Ref::new("IfExistsGrammar").optional(),
2404                    Ref::new("ObjectReferenceSegment"),
2405                    one_of(vec_of_erased![
2406                        Sequence::new(vec_of_erased![
2407                            Ref::keyword("SET"),
2408                            one_of(vec_of_erased![
2409                                Ref::new("TagEqualsSegment").optional(),
2410                                any_set_of(vec_of_erased![
2411                                    Sequence::new(vec_of_erased![
2412                                        Ref::keyword("COMMENT"),
2413                                        Ref::new("EqualsSegment"),
2414                                        Ref::new("QuotedLiteralSegment"),
2415                                    ]),
2416                                    Sequence::new(vec_of_erased![
2417                                        Ref::keyword("ENABLED"),
2418                                        Ref::new("EqualsSegment"),
2419                                        Ref::new("BooleanLiteralGrammar"),
2420                                    ]),
2421                                    one_of(vec_of_erased![
2422                                        any_set_of(vec_of_erased![
2423                                            Sequence::new(vec_of_erased![
2424                                                Ref::keyword("STORAGE_AWS_ROLE_ARN"),
2425                                                Ref::new("EqualsSegment"),
2426                                                Ref::new("QuotedLiteralSegment"),
2427                                            ]),
2428                                            Sequence::new(vec_of_erased![
2429                                                Ref::keyword("STORAGE_AWS_OBJECT_ACL"),
2430                                                Ref::new("EqualsSegment"),
2431                                                Ref::new("QuotedLiteralSegment"),
2432                                            ]),
2433                                        ]),
2434                                        any_set_of(vec_of_erased![Sequence::new(vec_of_erased![
2435                                            Ref::keyword("AZURE_TENANT_ID"),
2436                                            Ref::new("EqualsSegment"),
2437                                            Ref::new("QuotedLiteralSegment"),
2438                                        ]),]),
2439                                    ]),
2440                                    Sequence::new(vec_of_erased![
2441                                        Ref::keyword("STORAGE_ALLOWED_LOCATIONS"),
2442                                        Ref::new("EqualsSegment"),
2443                                        one_of(vec_of_erased![
2444                                            Bracketed::new(vec_of_erased![Delimited::new(
2445                                                vec_of_erased![one_of(vec_of_erased![
2446                                                    Ref::new("S3Path"),
2447                                                    Ref::new("GCSPath"),
2448                                                    Ref::new("AzureBlobStoragePath"),
2449                                                ]),]
2450                                            ),]),
2451                                            Bracketed::new(vec_of_erased![Ref::new(
2452                                                "QuotedStarSegment"
2453                                            ),]),
2454                                        ]),
2455                                    ]),
2456                                    Sequence::new(vec_of_erased![
2457                                        Ref::keyword("STORAGE_BLOCKED_LOCATIONS"),
2458                                        Ref::new("EqualsSegment"),
2459                                        Bracketed::new(vec_of_erased![Delimited::new(
2460                                            vec_of_erased![one_of(vec_of_erased![
2461                                                Ref::new("S3Path"),
2462                                                Ref::new("GCSPath"),
2463                                                Ref::new("AzureBlobStoragePath"),
2464                                            ]),]
2465                                        ),]),
2466                                    ]),
2467                                ]),
2468                            ]),
2469                        ]),
2470                        Sequence::new(vec_of_erased![
2471                            Ref::keyword("UNSET"),
2472                            one_of(vec_of_erased![
2473                                Sequence::new(vec_of_erased![
2474                                    Ref::keyword("TAG"),
2475                                    Delimited::new(
2476                                        vec_of_erased![Ref::new("TagReferenceSegment"),]
2477                                    ),
2478                                ])
2479                                .config(|this| this.optional()),
2480                                Ref::keyword("COMMENT"),
2481                                Ref::keyword("ENABLED"),
2482                                Ref::keyword("STORAGE_BLOCKED_LOCATIONS"),
2483                            ]),
2484                        ]),
2485                    ]),
2486                ])
2487                .to_matchable(),
2488            )
2489            .to_matchable()
2490            .into(),
2491        ),
2492        (
2493            "AlterExternalTableStatementSegment".into(),
2494            NodeMatcher::new(
2495                SyntaxKind::AlterExternalTableStatement,
2496                Sequence::new(vec_of_erased![
2497                    Ref::keyword("ALTER"),
2498                    Ref::keyword("EXTERNAL"),
2499                    Ref::keyword("TABLE"),
2500                    Ref::new("IfExistsGrammar").optional(),
2501                    Ref::new("TableReferenceSegment"),
2502                    one_of(vec_of_erased![
2503                        Sequence::new(vec_of_erased![
2504                            Ref::keyword("REFRESH"),
2505                            Ref::new("QuotedLiteralSegment").optional(),
2506                        ]),
2507                        Sequence::new(vec_of_erased![
2508                            one_of(vec_of_erased![Ref::keyword("ADD"), Ref::keyword("REMOVE"),]),
2509                            Ref::keyword("FILES"),
2510                            Bracketed::new(vec_of_erased![Delimited::new(vec_of_erased![
2511                                Ref::new("QuotedLiteralSegment"),
2512                            ]),]),
2513                        ]),
2514                        Sequence::new(vec_of_erased![
2515                            Ref::keyword("SET"),
2516                            Sequence::new(vec_of_erased![
2517                                Ref::keyword("AUTO_REFRESH"),
2518                                Ref::new("EqualsSegment"),
2519                                Ref::new("BooleanLiteralGrammar"),
2520                            ])
2521                            .config(|this| this.optional()),
2522                            Ref::new("TagEqualsSegment").optional(),
2523                        ]),
2524                        Sequence::new(vec_of_erased![
2525                            Ref::keyword("UNSET"),
2526                            Ref::new("TagEqualsSegment"),
2527                        ]),
2528                        Sequence::new(vec_of_erased![
2529                            Ref::keyword("DROP"),
2530                            Ref::keyword("PARTITION"),
2531                            Ref::keyword("LOCATION"),
2532                            Ref::new("QuotedLiteralSegment"),
2533                        ]),
2534                        Sequence::new(vec_of_erased![
2535                            Ref::keyword("ADD"),
2536                            Ref::keyword("PARTITION"),
2537                            Bracketed::new(vec_of_erased![Delimited::new(vec_of_erased![
2538                                Sequence::new(vec_of_erased![
2539                                    Ref::new("ColumnReferenceSegment"),
2540                                    Ref::new("EqualsSegment"),
2541                                    Ref::new("QuotedLiteralSegment"),
2542                                ]),
2543                            ]),]),
2544                            Ref::keyword("LOCATION"),
2545                            Ref::new("QuotedLiteralSegment"),
2546                        ]),
2547                    ]),
2548                ])
2549                .to_matchable(),
2550            )
2551            .to_matchable()
2552            .into(),
2553        ),
2554        (
2555            "CommentEqualsClauseSegment".into(),
2556            NodeMatcher::new(
2557                SyntaxKind::CommentEqualsClause,
2558                Sequence::new(vec_of_erased![
2559                    Ref::keyword("COMMENT"),
2560                    Ref::new("EqualsSegment"),
2561                    Ref::new("QuotedLiteralSegment"),
2562                ])
2563                .to_matchable(),
2564            )
2565            .to_matchable()
2566            .into(),
2567        ),
2568        (
2569            "TagBracketedEqualsSegment".into(),
2570            NodeMatcher::new(
2571                SyntaxKind::TagBracketedEquals,
2572                Sequence::new(vec_of_erased![
2573                    Sequence::new(vec_of_erased![Ref::keyword("WITH"),])
2574                        .config(|this| this.optional()),
2575                    Ref::keyword("TAG"),
2576                    Bracketed::new(vec_of_erased![Delimited::new(vec_of_erased![
2577                        Sequence::new(vec_of_erased![
2578                            Ref::new("TagReferenceSegment"),
2579                            Ref::new("EqualsSegment"),
2580                            Ref::new("QuotedLiteralSegment"),
2581                        ])
2582                    ])]),
2583                ])
2584                .to_matchable(),
2585            )
2586            .to_matchable()
2587            .into(),
2588        ),
2589        (
2590            "TagEqualsSegment".into(),
2591            NodeMatcher::new(
2592                SyntaxKind::TagEquals,
2593                Sequence::new(vec_of_erased![
2594                    Ref::keyword("TAG"),
2595                    Delimited::new(vec_of_erased![Sequence::new(vec_of_erased![
2596                        Ref::new("TagReferenceSegment"),
2597                        Ref::new("EqualsSegment"),
2598                        Ref::new("QuotedLiteralSegment"),
2599                    ])])
2600                ])
2601                .to_matchable(),
2602            )
2603            .to_matchable()
2604            .into(),
2605        ),
2606    ]);
2607
2608    snowflake_dialect.replace_grammar(
2609        "UnorderedSelectStatementSegment",
2610        ansi::get_unordered_select_statement_segment_grammar().copy(
2611            Some(vec_of_erased![Ref::new("QualifyClauseSegment").optional()]),
2612            None,
2613            Some(Ref::new("OverlapsClauseSegment").optional().to_matchable()),
2614            None,
2615            Vec::new(),
2616            false,
2617        ),
2618    );
2619
2620    snowflake_dialect.add([
2621        (
2622            "AccessStatementSegment".into(),
2623            NodeMatcher::new(SyntaxKind::AccessStatement, {
2624                let global_permissions = one_of(vec_of_erased![
2625                    Sequence::new(vec_of_erased![
2626                        Ref::keyword("CREATE"),
2627                        one_of(vec_of_erased![
2628                            Ref::keyword("ACCOUNT"),
2629                            Ref::keyword("ROLE"),
2630                            Ref::keyword("USER"),
2631                            Ref::keyword("WAREHOUSE"),
2632                            Ref::keyword("DATABASE"),
2633                            Ref::keyword("INTEGRATION"),
2634                            Ref::keyword("SHARE"),
2635                            Sequence::new(vec_of_erased![
2636                                Ref::keyword("DATA"),
2637                                Ref::keyword("EXCHANGE"),
2638                                Ref::keyword("LISTING"),
2639                            ]),
2640                            Sequence::new(vec_of_erased![
2641                                Ref::keyword("NETWORK"),
2642                                Ref::keyword("POLICY"),
2643                            ]),
2644                        ]),
2645                    ]),
2646                    Sequence::new(vec_of_erased![
2647                        Ref::keyword("APPLY"),
2648                        Ref::keyword("MASKING"),
2649                        Ref::keyword("POLICY"),
2650                    ]),
2651                    Sequence::new(vec_of_erased![
2652                        Ref::keyword("APPLY"),
2653                        Ref::keyword("ROW"),
2654                        Ref::keyword("ACCESS"),
2655                        Ref::keyword("POLICY"),
2656                    ]),
2657                    Sequence::new(vec_of_erased![
2658                        Ref::keyword("APPLY"),
2659                        Ref::keyword("SESSION"),
2660                        Ref::keyword("POLICY"),
2661                    ]),
2662                    Sequence::new(vec_of_erased![Ref::keyword("APPLY"), Ref::keyword("TAG"),]),
2663                    Sequence::new(vec_of_erased![
2664                        Ref::keyword("ATTACH"),
2665                        Ref::keyword("POLICY"),
2666                    ]),
2667                    Sequence::new(vec_of_erased![
2668                        Ref::keyword("EXECUTE"),
2669                        Ref::keyword("TASK"),
2670                    ]),
2671                    Sequence::new(vec_of_erased![
2672                        Ref::keyword("IMPORT"),
2673                        Ref::keyword("SHARE"),
2674                    ]),
2675                    Sequence::new(vec_of_erased![
2676                        Ref::keyword("MANAGE"),
2677                        one_of(vec_of_erased![
2678                            Ref::keyword("GRANTS"),
2679                            Sequence::new(vec_of_erased![
2680                                one_of(vec_of_erased![
2681                                    Ref::keyword("ACCOUNT"),
2682                                    Ref::keyword("ORGANIZATION"),
2683                                    Ref::keyword("USER"),
2684                                ]),
2685                                Ref::keyword("SUPPORT"),
2686                                Ref::keyword("CASES"),
2687                            ]),
2688                        ]),
2689                    ]),
2690                    Sequence::new(vec_of_erased![
2691                        Ref::keyword("MONITOR"),
2692                        one_of(vec_of_erased![
2693                            Ref::keyword("EXECUTION"),
2694                            Ref::keyword("USAGE"),
2695                        ]),
2696                    ]),
2697                    Sequence::new(vec_of_erased![
2698                        Ref::keyword("OVERRIDE"),
2699                        Ref::keyword("SHARE"),
2700                        Ref::keyword("RESTRICTIONS"),
2701                    ]),
2702                ]);
2703
2704                let schema_object_names = [
2705                    "TABLE",
2706                    "VIEW",
2707                    "STAGE",
2708                    "FUNCTION",
2709                    "PROCEDURE",
2710                    "ROUTINE",
2711                    "SEQUENCE",
2712                    "STREAM",
2713                    "TASK",
2714                    "PIPE",
2715                ];
2716
2717                let schema_object_names_keywrods: Vec<Matchable> = schema_object_names
2718                    .iter()
2719                    .map(|name| Ref::keyword(name).to_matchable())
2720                    .collect();
2721
2722                let mut schema_object_types = schema_object_names_keywrods.clone();
2723                schema_object_types.append(&mut vec_of_erased![
2724                    Sequence::new(vec_of_erased![
2725                        Ref::keyword("MATERIALIZED"),
2726                        Ref::keyword("VIEW")
2727                    ]),
2728                    Sequence::new(vec_of_erased![
2729                        Ref::keyword("EXTERNAL"),
2730                        Ref::keyword("TABLE")
2731                    ]),
2732                    Sequence::new(vec_of_erased![
2733                        one_of(vec_of_erased![
2734                            Ref::keyword("TEMP"),
2735                            Ref::keyword("TEMPORARY")
2736                        ]),
2737                        Ref::keyword("TABLE"),
2738                    ]),
2739                    Sequence::new(vec_of_erased![Ref::keyword("FILE"), Ref::keyword("FORMAT")]),
2740                    Sequence::new(vec_of_erased![
2741                        Ref::keyword("SESSION"),
2742                        Ref::keyword("POLICY")
2743                    ]),
2744                    Sequence::new(vec_of_erased![
2745                        Ref::keyword("MASKING"),
2746                        Ref::keyword("POLICY")
2747                    ]),
2748                    Sequence::new(vec_of_erased![
2749                        Ref::keyword("ROW"),
2750                        Ref::keyword("ACCESS"),
2751                        Ref::keyword("POLICY"),
2752                    ]),
2753                ]);
2754
2755                let schema_object_types = one_of(schema_object_types);
2756
2757                let schema_object_types_plural = one_of(
2758                    schema_object_names
2759                        .iter()
2760                        .map(|name| Ref::keyword(&format!("{}S", name)).to_matchable())
2761                        .collect(),
2762                );
2763
2764                let permissions = Sequence::new(vec_of_erased![
2765                    one_of(vec_of_erased![
2766                        Sequence::new(vec_of_erased![
2767                            Ref::keyword("CREATE"),
2768                            one_of(vec_of_erased![
2769                                Ref::keyword("SCHEMA"),
2770                                schema_object_types.clone(),
2771                            ]),
2772                        ]),
2773                        Sequence::new(vec_of_erased![
2774                            Ref::keyword("IMPORTED"),
2775                            Ref::keyword("PRIVILEGES"),
2776                        ]),
2777                        Ref::keyword("APPLY"),
2778                        Ref::keyword("CONNECT"),
2779                        Ref::keyword("CREATE"),
2780                        Ref::keyword("DELETE"),
2781                        Ref::keyword("EXECUTE"),
2782                        Ref::keyword("INSERT"),
2783                        Ref::keyword("MODIFY"),
2784                        Ref::keyword("MONITOR"),
2785                        Ref::keyword("OPERATE"),
2786                        Ref::keyword("OWNERSHIP"),
2787                        Ref::keyword("READ"),
2788                        Ref::keyword("REFERENCE_USAGE"),
2789                        Ref::keyword("REFERENCES"),
2790                        Ref::keyword("SELECT"),
2791                        Ref::keyword("TEMP"),
2792                        Ref::keyword("TEMPORARY"),
2793                        Ref::keyword("TRIGGER"),
2794                        Ref::keyword("TRUNCATE"),
2795                        Ref::keyword("UPDATE"),
2796                        Ref::keyword("USAGE"),
2797                        Ref::keyword("USE_ANY_ROLE"),
2798                        Ref::keyword("WRITE"),
2799                        Sequence::new(vec_of_erased![
2800                            Ref::keyword("ALL"),
2801                            Ref::keyword("PRIVILEGES").optional(),
2802                        ]),
2803                    ]),
2804                    Ref::new("BracketedColumnReferenceListGrammar").optional(),
2805                ]);
2806
2807                let objects = one_of(vec_of_erased![
2808                    Ref::keyword("ACCOUNT"),
2809                    Sequence::new(vec_of_erased![
2810                        one_of(vec_of_erased![
2811                            Sequence::new(vec_of_erased![
2812                                Ref::keyword("RESOURCE"),
2813                                Ref::keyword("MONITOR"),
2814                            ]),
2815                            Ref::keyword("WAREHOUSE"),
2816                            Ref::keyword("DATABASE"),
2817                            Ref::keyword("DOMAIN"),
2818                            Ref::keyword("INTEGRATION"),
2819                            Ref::keyword("SCHEMA"),
2820                            Ref::keyword("ROLE"),
2821                            Sequence::new(vec_of_erased![
2822                                Ref::keyword("ALL"),
2823                                Ref::keyword("SCHEMAS"),
2824                                Ref::keyword("IN"),
2825                                Ref::keyword("DATABASE"),
2826                            ]),
2827                            Sequence::new(vec_of_erased![
2828                                Ref::keyword("FUTURE"),
2829                                Ref::keyword("SCHEMAS"),
2830                                Ref::keyword("IN"),
2831                                Ref::keyword("DATABASE"),
2832                            ]),
2833                            schema_object_types.clone(),
2834                            Sequence::new(vec_of_erased![
2835                                Ref::keyword("ALL"),
2836                                one_of(vec_of_erased![
2837                                    schema_object_types_plural.clone(),
2838                                    Sequence::new(vec_of_erased![
2839                                        Ref::keyword("MATERIALIZED"),
2840                                        Ref::keyword("VIEWS"),
2841                                    ]),
2842                                    Sequence::new(vec_of_erased![
2843                                        Ref::keyword("EXTERNAL"),
2844                                        Ref::keyword("TABLES"),
2845                                    ]),
2846                                    Sequence::new(vec_of_erased![
2847                                        Ref::keyword("FILE"),
2848                                        Ref::keyword("FORMATS"),
2849                                    ]),
2850                                ]),
2851                                Ref::keyword("IN"),
2852                                one_of(vec_of_erased![
2853                                    Ref::keyword("SCHEMA"),
2854                                    Ref::keyword("DATABASE"),
2855                                ]),
2856                            ]),
2857                            Sequence::new(vec_of_erased![
2858                                Ref::keyword("FUTURE"),
2859                                one_of(vec_of_erased![
2860                                    schema_object_types_plural.clone(),
2861                                    Sequence::new(vec_of_erased![
2862                                        Ref::keyword("MATERIALIZED"),
2863                                        Ref::keyword("VIEWS"),
2864                                    ]),
2865                                    Sequence::new(vec_of_erased![
2866                                        Ref::keyword("EXTERNAL"),
2867                                        Ref::keyword("TABLES"),
2868                                    ]),
2869                                    Sequence::new(vec_of_erased![
2870                                        Ref::keyword("FILE"),
2871                                        Ref::keyword("FORMATS"),
2872                                    ]),
2873                                ]),
2874                                Ref::keyword("IN"),
2875                                one_of(vec_of_erased![
2876                                    Ref::keyword("DATABASE"),
2877                                    Ref::keyword("SCHEMA"),
2878                                ]),
2879                            ]),
2880                        ])
2881                        .config(|this| this.optional()),
2882                        Delimited::new(vec_of_erased![
2883                            Ref::new("ObjectReferenceSegment"),
2884                            Sequence::new(vec_of_erased![
2885                                Ref::new("FunctionNameSegment"),
2886                                Ref::new("FunctionParameterListGrammar").optional(),
2887                            ]),
2888                        ])
2889                        .config(|this| this.terminators =
2890                            vec_of_erased![Ref::keyword("TO"), Ref::keyword("FROM")]),
2891                    ]),
2892                ]);
2893
2894                one_of(vec_of_erased![
2895                    // Grant statement
2896                    Sequence::new(vec_of_erased![
2897                        Ref::keyword("GRANT"),
2898                        one_of(vec_of_erased![
2899                            Sequence::new(vec_of_erased![
2900                                Delimited::new(vec_of_erased![one_of(vec_of_erased![
2901                                    global_permissions.clone(),
2902                                    permissions.clone()
2903                                ]),])
2904                                .config(
2905                                    |this| this.terminators = vec_of_erased![Ref::keyword("ON")]
2906                                ),
2907                                Ref::keyword("ON"),
2908                                objects.clone(),
2909                            ]),
2910                            Sequence::new(vec_of_erased![
2911                                Ref::keyword("ROLE"),
2912                                Ref::new("ObjectReferenceSegment"),
2913                            ]),
2914                            Sequence::new(vec_of_erased![
2915                                Ref::keyword("OWNERSHIP"),
2916                                Ref::keyword("ON"),
2917                                Ref::keyword("USER"),
2918                                Ref::new("ObjectReferenceSegment"),
2919                            ]),
2920                            Ref::new("ObjectReferenceSegment"),
2921                        ]),
2922                        Ref::keyword("TO"),
2923                        Ref::keyword("USER").optional(),
2924                        Ref::keyword("ROLE").optional(),
2925                        Ref::keyword("SHARE").optional(),
2926                        Delimited::new(vec_of_erased![one_of(vec_of_erased![
2927                            Ref::new("RoleReferenceSegment"),
2928                            Ref::new("FunctionSegment"),
2929                            Ref::keyword("PUBLIC"),
2930                        ]),]),
2931                        one_of(vec_of_erased![
2932                            Sequence::new(vec_of_erased![
2933                                Ref::keyword("WITH"),
2934                                Ref::keyword("GRANT"),
2935                                Ref::keyword("OPTION"),
2936                            ]),
2937                            Sequence::new(vec_of_erased![
2938                                Ref::keyword("WITH"),
2939                                Ref::keyword("ADMIN"),
2940                                Ref::keyword("OPTION"),
2941                            ]),
2942                            Sequence::new(vec_of_erased![
2943                                one_of(vec_of_erased![
2944                                    Ref::keyword("REVOKE"),
2945                                    Ref::keyword("COPY"),
2946                                ]),
2947                                Ref::keyword("CURRENT"),
2948                                Ref::keyword("GRANTS"),
2949                            ])
2950                            .config(|this| this.optional()),
2951                        ])
2952                        .config(|this| this.optional()),
2953                        Sequence::new(vec_of_erased![
2954                            Ref::keyword("GRANTED"),
2955                            Ref::keyword("BY"),
2956                            one_of(vec_of_erased![
2957                                Ref::keyword("CURRENT_USER"),
2958                                Ref::keyword("SESSION_USER"),
2959                                Ref::new("ObjectReferenceSegment"),
2960                            ])
2961                            .config(|this| this.optional()),
2962                        ])
2963                        .config(|this| this.optional()),
2964                    ]),
2965                    // Revoke statement
2966                    Sequence::new(vec_of_erased![
2967                        Ref::keyword("REVOKE"),
2968                        Sequence::new(vec_of_erased![
2969                            Ref::keyword("GRANT"),
2970                            Ref::keyword("OPTION"),
2971                            Ref::keyword("FOR"),
2972                        ])
2973                        .config(|this| this.optional()),
2974                        one_of(vec_of_erased![
2975                            Sequence::new(vec_of_erased![
2976                                Delimited::new(vec_of_erased![one_of(vec_of_erased![
2977                                    global_permissions.clone(),
2978                                    permissions.clone()
2979                                ]),])
2980                                .config(|this| {
2981                                    this.terminators = vec_of_erased![Ref::keyword("ON")];
2982                                }),
2983                                Ref::keyword("ON"),
2984                                objects.clone(),
2985                            ]),
2986                            Sequence::new(vec_of_erased![
2987                                Ref::keyword("ROLE"),
2988                                Ref::new("ObjectReferenceSegment"),
2989                            ]),
2990                            Sequence::new(vec_of_erased![
2991                                Ref::keyword("OWNERSHIP"),
2992                                Ref::keyword("ON"),
2993                                Ref::keyword("USER"),
2994                                Ref::new("ObjectReferenceSegment"),
2995                            ]),
2996                        ]),
2997                        Ref::keyword("FROM"),
2998                        Ref::keyword("USER").optional(),
2999                        Ref::keyword("ROLE").optional(),
3000                        Ref::keyword("SHARE").optional(),
3001                        Delimited::new(vec_of_erased![Ref::new("ObjectReferenceSegment"),]),
3002                        Ref::new("DropBehaviorGrammar").optional(),
3003                    ]),
3004                ])
3005                .to_matchable()
3006            })
3007            .to_matchable()
3008            .into(),
3009        ),
3010        (
3011            "CreateCloneStatementSegment".into(),
3012            NodeMatcher::new(
3013                SyntaxKind::CreateCloneStatement,
3014                Sequence::new(vec_of_erased![
3015                    Ref::keyword("CREATE"),
3016                    Sequence::new(vec_of_erased![Ref::keyword("OR"), Ref::keyword("REPLACE"),])
3017                        .config(|this| this.optional()),
3018                    one_of(vec_of_erased![
3019                        Ref::keyword("DATABASE"),
3020                        Ref::keyword("SCHEMA"),
3021                        Ref::keyword("TABLE"),
3022                        Ref::keyword("SEQUENCE"),
3023                        Sequence::new(
3024                            vec_of_erased![Ref::keyword("FILE"), Ref::keyword("FORMAT"),]
3025                        ),
3026                        Ref::keyword("STAGE"),
3027                        Ref::keyword("STREAM"),
3028                        Ref::keyword("TASK"),
3029                    ]),
3030                    Sequence::new(vec_of_erased![
3031                        Ref::keyword("IF"),
3032                        Ref::keyword("NOT"),
3033                        Ref::keyword("EXISTS"),
3034                    ])
3035                    .config(|this| this.optional()),
3036                    Ref::new("ObjectReferenceSegment"),
3037                    Ref::keyword("CLONE"),
3038                    Ref::new("ObjectReferenceSegment"),
3039                    one_of(vec_of_erased![
3040                        Ref::new("FromAtExpressionSegment"),
3041                        Ref::new("FromBeforeExpressionSegment"),
3042                    ])
3043                    .config(|this| this.optional()),
3044                ])
3045                .to_matchable(),
3046            )
3047            .to_matchable()
3048            .into(),
3049        ),
3050        (
3051            "CreateDatabaseFromShareStatementSegment".into(),
3052            NodeMatcher::new(
3053                SyntaxKind::CreateDatabaseFromShareStatement,
3054                Sequence::new(vec_of_erased![
3055                    Ref::keyword("CREATE"),
3056                    Ref::keyword("DATABASE"),
3057                    Ref::new("ObjectReferenceSegment"),
3058                    Sequence::new(vec_of_erased![Ref::keyword("FROM"), Ref::keyword("SHARE"),]),
3059                    Ref::new("ObjectReferenceSegment"),
3060                ])
3061                .to_matchable(),
3062            )
3063            .to_matchable()
3064            .into(),
3065        ),
3066        (
3067            "CreateProcedureStatementSegment".into(),
3068            NodeMatcher::new(
3069                SyntaxKind::CreateProcedureStatement,
3070                Sequence::new(vec_of_erased![
3071                    Ref::keyword("CREATE"),
3072                    Sequence::new(vec_of_erased![Ref::keyword("OR"), Ref::keyword("REPLACE"),])
3073                        .config(|this| this.optional()),
3074                    Sequence::new(vec_of_erased![Ref::keyword("SECURE"),])
3075                        .config(|this| this.optional()),
3076                    Ref::keyword("PROCEDURE"),
3077                    Ref::new("FunctionNameSegment"),
3078                    Ref::new("FunctionParameterListGrammar"),
3079                    Sequence::new(vec_of_erased![Ref::keyword("COPY"), Ref::keyword("GRANTS"),])
3080                        .config(|this| this.optional()),
3081                    Ref::keyword("RETURNS"),
3082                    one_of(vec_of_erased![
3083                        Ref::new("DatatypeSegment"),
3084                        Sequence::new(vec_of_erased![
3085                            Ref::keyword("TABLE"),
3086                            Bracketed::new(vec_of_erased![
3087                                Delimited::new(
3088                                    vec_of_erased![Ref::new("ColumnDefinitionSegment"),]
3089                                )
3090                                .config(|this| this.optional()),
3091                            ]),
3092                        ]),
3093                    ]),
3094                    any_set_of(vec_of_erased![
3095                        Sequence::new(vec_of_erased![Ref::keyword("NOT"), Ref::keyword("NULL"),])
3096                            .config(|this| this.optional()),
3097                        Sequence::new(vec_of_erased![
3098                            Ref::keyword("LANGUAGE"),
3099                            one_of(vec_of_erased![
3100                                Ref::keyword("JAVA"),
3101                                Ref::keyword("JAVASCRIPT"),
3102                                Ref::keyword("PYTHON"),
3103                                Ref::keyword("SCALA"),
3104                                Ref::keyword("SQL"),
3105                            ])
3106                            .config(|this| this.optional()),
3107                        ]),
3108                        one_of(vec_of_erased![
3109                            Sequence::new(vec_of_erased![
3110                                Ref::keyword("CALLED"),
3111                                Ref::keyword("ON"),
3112                                Ref::keyword("NULL"),
3113                                Ref::keyword("INPUT"),
3114                            ]),
3115                            Sequence::new(vec_of_erased![
3116                                Ref::keyword("RETURNS"),
3117                                Ref::keyword("NULL"),
3118                                Ref::keyword("ON"),
3119                                Ref::keyword("NULL"),
3120                                Ref::keyword("INPUT"),
3121                            ]),
3122                            Ref::keyword("STRICT"),
3123                        ])
3124                        .config(|this| this.optional()),
3125                        one_of(vec_of_erased![
3126                            Ref::keyword("VOLATILE"),
3127                            Ref::keyword("IMMUTABLE"),
3128                        ])
3129                        .config(|this| this.optional()),
3130                        Sequence::new(vec_of_erased![
3131                            Ref::keyword("RUNTIME_VERSION"),
3132                            Ref::new("EqualsSegment"),
3133                            Ref::new("QuotedLiteralSegment"),
3134                        ])
3135                        .config(|this| this.optional()),
3136                        Ref::new("CommentEqualsClauseSegment").optional(),
3137                        Sequence::new(vec_of_erased![
3138                            Ref::keyword("IMPORTS"),
3139                            Ref::new("EqualsSegment"),
3140                            Bracketed::new(vec_of_erased![Delimited::new(vec_of_erased![
3141                                Ref::new("QuotedLiteralSegment"),
3142                            ]),]),
3143                        ])
3144                        .config(|this| this.optional()),
3145                        Sequence::new(vec_of_erased![
3146                            Ref::keyword("PACKAGES"),
3147                            Ref::new("EqualsSegment"),
3148                            Bracketed::new(vec_of_erased![Delimited::new(vec_of_erased![
3149                                Ref::new("QuotedLiteralSegment"),
3150                            ]),]),
3151                        ])
3152                        .config(|this| this.optional()),
3153                        Sequence::new(vec_of_erased![
3154                            Ref::keyword("HANDLER"),
3155                            Ref::new("EqualsSegment"),
3156                            Ref::new("QuotedLiteralSegment"),
3157                        ])
3158                        .config(|this| this.optional()),
3159                        Sequence::new(vec_of_erased![
3160                            Ref::keyword("TARGET_PATH"),
3161                            Ref::new("EqualsSegment"),
3162                            Ref::new("QuotedLiteralSegment"),
3163                        ])
3164                        .config(|this| this.optional()),
3165                        Sequence::new(vec_of_erased![
3166                            Ref::keyword("EXECUTE"),
3167                            Ref::keyword("AS"),
3168                            one_of(vec_of_erased![
3169                                Ref::keyword("CALLER"),
3170                                Ref::keyword("OWNER"),
3171                            ]),
3172                        ])
3173                        .config(|this| this.optional()),
3174                    ])
3175                    .config(|this| this.optional()),
3176                    Ref::keyword("AS"),
3177                    one_of(vec_of_erased![
3178                        Ref::new("DoubleQuotedUDFBody"),
3179                        Ref::new("SingleQuotedUDFBody"),
3180                        Ref::new("DollarQuotedUDFBody"),
3181                        Ref::new("ScriptingBlockStatementSegment"),
3182                    ]),
3183                ])
3184                .to_matchable(),
3185            )
3186            .to_matchable()
3187            .into(),
3188        ),
3189        (
3190            "ReturnStatementSegment".into(),
3191            NodeMatcher::new(
3192                SyntaxKind::ReturnStatement,
3193                Sequence::new(vec_of_erased![
3194                    Ref::keyword("RETURN"),
3195                    Ref::new("ExpressionSegment"),
3196                ])
3197                .to_matchable(),
3198            )
3199            .to_matchable()
3200            .into(),
3201        ),
3202        (
3203            "ScriptingBlockStatementSegment".into(),
3204            NodeMatcher::new(
3205                SyntaxKind::ScriptingBlockStatement,
3206                one_of(vec_of_erased![
3207                    Sequence::new(vec_of_erased![
3208                        Ref::keyword("BEGIN"),
3209                        Delimited::new(vec_of_erased![Ref::new("StatementSegment"),]),
3210                    ]),
3211                    Sequence::new(vec_of_erased![Ref::keyword("END")]),
3212                ])
3213                .to_matchable(),
3214            )
3215            .to_matchable()
3216            .into(),
3217        ),
3218        (
3219            "ScriptingLetStatementSegment".into(),
3220            NodeMatcher::new(
3221                SyntaxKind::ScriptingLetStatement,
3222                one_of(vec_of_erased![
3223                    // Initial declaration and assignment
3224                    Sequence::new(vec_of_erased![
3225                        Ref::keyword("LET"),
3226                        Ref::new("LocalVariableNameSegment"),
3227                        one_of(vec_of_erased![
3228                            // Variable assignment
3229                            one_of(vec_of_erased![
3230                                Sequence::new(vec_of_erased![
3231                                    Ref::new("DatatypeSegment"),
3232                                    one_of(vec_of_erased![
3233                                        Ref::keyword("DEFAULT"),
3234                                        Ref::new("WalrusOperatorSegment"),
3235                                    ]),
3236                                    Ref::new("ExpressionSegment"),
3237                                ]),
3238                                Sequence::new(vec_of_erased![
3239                                    one_of(vec_of_erased![
3240                                        Ref::keyword("DEFAULT"),
3241                                        Ref::new("WalrusOperatorSegment"),
3242                                    ]),
3243                                    Ref::new("ExpressionSegment"),
3244                                ]),
3245                            ]),
3246                            // Cursor assignment
3247                            Sequence::new(vec_of_erased![
3248                                Ref::keyword("CURSOR"),
3249                                Ref::keyword("FOR"),
3250                                one_of(vec_of_erased![
3251                                    Ref::new("LocalVariableNameSegment"),
3252                                    Ref::new("SelectableGrammar"),
3253                                ]),
3254                            ]),
3255                            // Resultset assignment
3256                            Sequence::new(vec_of_erased![
3257                                Ref::keyword("RESULTSET"),
3258                                Ref::new("WalrusOperatorSegment"),
3259                                Bracketed::new(vec_of_erased![Ref::new("SelectableGrammar"),]),
3260                            ]),
3261                        ]),
3262                    ]),
3263                    // Subsequent assignment
3264                    Sequence::new(vec_of_erased![
3265                        Ref::new("LocalVariableNameSegment"),
3266                        Ref::new("WalrusOperatorSegment"),
3267                        one_of(vec_of_erased![
3268                            // Variable reassignment
3269                            Ref::new("ExpressionSegment"),
3270                            // Resultset reassignment
3271                            Bracketed::new(vec_of_erased![Ref::new("SelectableGrammar"),]),
3272                        ]),
3273                    ]),
3274                ])
3275                .to_matchable(),
3276            )
3277            .to_matchable()
3278            .into(),
3279        ),
3280        (
3281            "CreateFunctionStatementSegment".into(),
3282            NodeMatcher::new(
3283                SyntaxKind::CreateFunctionStatement,
3284                Sequence::new(vec_of_erased![
3285                    Ref::keyword("CREATE"),
3286                    Sequence::new(vec_of_erased![Ref::keyword("OR"), Ref::keyword("REPLACE"),])
3287                        .config(|this| this.optional()),
3288                    Sequence::new(vec_of_erased![Ref::keyword("SECURE"),])
3289                        .config(|this| this.optional()),
3290                    Ref::keyword("FUNCTION"),
3291                    Ref::new("IfNotExistsGrammar").optional(),
3292                    Ref::new("FunctionNameSegment"),
3293                    Ref::new("FunctionParameterListGrammar"),
3294                    Ref::keyword("RETURNS"),
3295                    one_of(vec_of_erased![
3296                        Ref::new("DatatypeSegment"),
3297                        Sequence::new(vec_of_erased![
3298                            Ref::keyword("TABLE"),
3299                            Bracketed::new(vec_of_erased![Delimited::new(vec_of_erased![
3300                                Ref::new("ColumnDefinitionSegment"),
3301                            ]),]),
3302                        ]),
3303                    ]),
3304                    any_set_of(vec_of_erased![
3305                        Sequence::new(vec_of_erased![Ref::keyword("NOT"), Ref::keyword("NULL"),])
3306                            .config(|this| this.optional()),
3307                        Sequence::new(vec_of_erased![
3308                            Ref::keyword("LANGUAGE"),
3309                            one_of(vec_of_erased![
3310                                Ref::keyword("JAVASCRIPT"),
3311                                Ref::keyword("SQL"),
3312                                Ref::keyword("PYTHON"),
3313                                Ref::keyword("JAVA"),
3314                                Ref::keyword("SCALA"),
3315                            ])
3316                            .config(|this| this.optional()),
3317                        ]),
3318                        one_of(vec_of_erased![
3319                            Sequence::new(vec_of_erased![
3320                                Ref::keyword("CALLED"),
3321                                Ref::keyword("ON"),
3322                                Ref::keyword("NULL"),
3323                                Ref::keyword("INPUT"),
3324                            ]),
3325                            Sequence::new(vec_of_erased![
3326                                Ref::keyword("RETURNS"),
3327                                Ref::keyword("NULL"),
3328                                Ref::keyword("ON"),
3329                                Ref::keyword("NULL"),
3330                                Ref::keyword("INPUT"),
3331                            ]),
3332                            Ref::keyword("STRICT"),
3333                        ])
3334                        .config(|this| this.optional()),
3335                        one_of(vec_of_erased![
3336                            Ref::keyword("VOLATILE"),
3337                            Ref::keyword("IMMUTABLE"),
3338                        ])
3339                        .config(|this| this.optional()),
3340                        Sequence::new(vec_of_erased![
3341                            Ref::keyword("RUNTIME_VERSION"),
3342                            Ref::new("EqualsSegment"),
3343                            Ref::new("QuotedLiteralSegment"),
3344                        ])
3345                        .config(|this| this.optional()),
3346                        Ref::new("CommentEqualsClauseSegment").optional(),
3347                        Sequence::new(vec_of_erased![
3348                            Ref::keyword("IMPORTS"),
3349                            Ref::new("EqualsSegment"),
3350                            Bracketed::new(vec_of_erased![Delimited::new(vec_of_erased![
3351                                Ref::new("QuotedLiteralSegment"),
3352                            ]),]),
3353                        ])
3354                        .config(|this| this.optional()),
3355                        Sequence::new(vec_of_erased![
3356                            Ref::keyword("PACKAGES"),
3357                            Ref::new("EqualsSegment"),
3358                            Bracketed::new(vec_of_erased![Delimited::new(vec_of_erased![
3359                                Ref::new("QuotedLiteralSegment"),
3360                            ]),]),
3361                        ])
3362                        .config(|this| this.optional()),
3363                        Sequence::new(vec_of_erased![
3364                            Ref::keyword("HANDLER"),
3365                            Ref::new("EqualsSegment"),
3366                            Ref::new("QuotedLiteralSegment"),
3367                        ])
3368                        .config(|this| this.optional()),
3369                        Sequence::new(vec_of_erased![
3370                            Ref::keyword("TARGET_PATH"),
3371                            Ref::new("EqualsSegment"),
3372                            Ref::new("QuotedLiteralSegment"),
3373                        ])
3374                        .config(|this| this.optional()),
3375                    ])
3376                    .config(|this| this.optional()),
3377                    Sequence::new(vec_of_erased![
3378                        Ref::keyword("AS"),
3379                        one_of(vec_of_erased![
3380                            // Either a foreign programming language UDF...
3381                            Ref::new("DoubleQuotedUDFBody"),
3382                            Ref::new("SingleQuotedUDFBody"),
3383                            Ref::new("DollarQuotedUDFBody"),
3384                            // ...or a SQL UDF
3385                            Ref::new("ScriptingBlockStatementSegment"),
3386                        ]),
3387                    ])
3388                    .config(|this| this.optional()),
3389                ])
3390                .to_matchable(),
3391            )
3392            .to_matchable()
3393            .into(),
3394        ),
3395        (
3396            "AlterFunctionStatementSegment".into(),
3397            NodeMatcher::new(
3398                SyntaxKind::AlterFunctionStatement,
3399                Sequence::new(vec_of_erased![
3400                    Ref::keyword("ALTER"),
3401                    Ref::keyword("FUNCTION"),
3402                    Sequence::new(vec_of_erased![Ref::keyword("IF"), Ref::keyword("EXISTS"),])
3403                        .config(|this| this.optional()),
3404                    Ref::new("FunctionNameSegment"),
3405                    Ref::new("FunctionParameterListGrammar"),
3406                    one_of(vec_of_erased![
3407                        Sequence::new(vec_of_erased![
3408                            Ref::keyword("RENAME"),
3409                            Ref::keyword("TO"),
3410                            Ref::new("FunctionNameSegment"),
3411                        ]),
3412                        Sequence::new(vec_of_erased![
3413                            Ref::keyword("SET"),
3414                            one_of(vec_of_erased![
3415                                Ref::new("CommentEqualsClauseSegment"),
3416                                Sequence::new(vec_of_erased![
3417                                    Ref::keyword("API_INTEGRATION"),
3418                                    Ref::new("EqualsSegment"),
3419                                    Ref::new("SingleIdentifierGrammar"),
3420                                ]),
3421                                Sequence::new(vec_of_erased![
3422                                    Ref::keyword("HEADERS"),
3423                                    Ref::new("EqualsSegment"),
3424                                    Bracketed::new(vec_of_erased![Delimited::new(vec_of_erased![
3425                                        Sequence::new(vec_of_erased![
3426                                            Ref::new("SingleQuotedIdentifierSegment"),
3427                                            Ref::new("EqualsSegment"),
3428                                            Ref::new("SingleQuotedIdentifierSegment"),
3429                                        ]),
3430                                    ]),]),
3431                                ]),
3432                                Sequence::new(vec_of_erased![
3433                                    Ref::keyword("CONTEXT_HEADERS"),
3434                                    Ref::new("EqualsSegment"),
3435                                    Bracketed::new(vec_of_erased![Delimited::new(vec_of_erased![
3436                                        Ref::new("ContextHeadersGrammar"),
3437                                    ]),]),
3438                                ]),
3439                                Sequence::new(vec_of_erased![
3440                                    Ref::keyword("MAX_BATCH_ROWS"),
3441                                    Ref::new("EqualsSegment"),
3442                                    Ref::new("NumericLiteralSegment"),
3443                                ]),
3444                                Sequence::new(vec_of_erased![
3445                                    Ref::keyword("COMPRESSION"),
3446                                    Ref::new("EqualsSegment"),
3447                                    Ref::new("CompressionType"),
3448                                ]),
3449                                Ref::keyword("SECURE"),
3450                                Sequence::new(vec_of_erased![
3451                                    one_of(vec_of_erased![
3452                                        Ref::keyword("REQUEST_TRANSLATOR"),
3453                                        Ref::keyword("RESPONSE_TRANSLATOR"),
3454                                    ]),
3455                                    Ref::new("EqualsSegment"),
3456                                    Ref::new("FunctionNameSegment"),
3457                                ]),
3458                            ]),
3459                        ]),
3460                        Sequence::new(vec_of_erased![
3461                            Ref::keyword("UNSET"),
3462                            one_of(vec_of_erased![
3463                                Ref::keyword("COMMENT"),
3464                                Ref::keyword("HEADERS"),
3465                                Ref::keyword("CONTEXT_HEADERS"),
3466                                Ref::keyword("MAX_BATCH_ROWS"),
3467                                Ref::keyword("COMPRESSION"),
3468                                Ref::keyword("SECURE"),
3469                                Ref::keyword("REQUEST_TRANSLATOR"),
3470                                Ref::keyword("RESPONSE_TRANSLATOR"),
3471                            ]),
3472                        ]),
3473                        Sequence::new(vec_of_erased![
3474                            Ref::keyword("RENAME"),
3475                            Ref::keyword("TO"),
3476                            Ref::new("SingleIdentifierGrammar"),
3477                        ]),
3478                    ]),
3479                ])
3480                .to_matchable(),
3481            )
3482            .to_matchable()
3483            .into(),
3484        ),
3485        (
3486            "CreateExternalFunctionStatementSegment".into(),
3487            NodeMatcher::new(
3488                SyntaxKind::CreateExternalFunctionStatement,
3489                Sequence::new(vec_of_erased![
3490                    Ref::keyword("CREATE"),
3491                    Sequence::new(vec_of_erased![Ref::keyword("OR"), Ref::keyword("REPLACE"),])
3492                        .config(|this| this.optional()),
3493                    Sequence::new(vec_of_erased![Ref::keyword("SECURE"),])
3494                        .config(|this| this.optional()),
3495                    Ref::keyword("EXTERNAL"),
3496                    Ref::keyword("FUNCTION"),
3497                    Ref::new("FunctionNameSegment"),
3498                    Ref::new("FunctionParameterListGrammar"),
3499                    Ref::keyword("RETURNS"),
3500                    Ref::new("DatatypeSegment"),
3501                    Sequence::new(vec_of_erased![
3502                        Ref::keyword("NOT").optional(),
3503                        Ref::keyword("NULL"),
3504                    ])
3505                    .config(|this| this.optional()),
3506                    one_of(vec_of_erased![
3507                        Sequence::new(vec_of_erased![
3508                            Ref::keyword("CALLED"),
3509                            Ref::keyword("ON"),
3510                            Ref::keyword("NULL"),
3511                            Ref::keyword("INPUT"),
3512                        ]),
3513                        Sequence::new(vec_of_erased![
3514                            Ref::keyword("RETURNS"),
3515                            Ref::keyword("NULL"),
3516                            Ref::keyword("ON"),
3517                            Ref::keyword("NULL"),
3518                            Ref::keyword("INPUT"),
3519                        ]),
3520                        Ref::keyword("STRICT"),
3521                    ])
3522                    .config(|this| this.optional()),
3523                    one_of(vec_of_erased![
3524                        Ref::keyword("VOLATILE"),
3525                        Ref::keyword("IMMUTABLE"),
3526                    ])
3527                    .config(|this| this.optional()),
3528                    Ref::new("CommentEqualsClauseSegment").optional(),
3529                    Ref::keyword("API_INTEGRATION"),
3530                    Ref::new("EqualsSegment"),
3531                    Ref::new("SingleIdentifierGrammar"),
3532                    Sequence::new(vec_of_erased![
3533                        Ref::keyword("HEADERS"),
3534                        Ref::new("EqualsSegment"),
3535                        Bracketed::new(vec_of_erased![Delimited::new(vec_of_erased![
3536                            Sequence::new(vec_of_erased![
3537                                Ref::new("SingleQuotedIdentifierSegment"),
3538                                Ref::new("EqualsSegment"),
3539                                Ref::new("SingleQuotedIdentifierSegment"),
3540                            ]),
3541                        ]),]),
3542                    ])
3543                    .config(|this| this.optional()),
3544                    Sequence::new(vec_of_erased![
3545                        Ref::keyword("CONTEXT_HEADERS"),
3546                        Ref::new("EqualsSegment"),
3547                        Bracketed::new(vec_of_erased![Delimited::new(vec_of_erased![Ref::new(
3548                            "ContextHeadersGrammar"
3549                        ),]),]),
3550                    ])
3551                    .config(|this| this.optional()),
3552                    Sequence::new(vec_of_erased![
3553                        Ref::keyword("MAX_BATCH_ROWS"),
3554                        Ref::new("EqualsSegment"),
3555                        Ref::new("NumericLiteralSegment"),
3556                    ])
3557                    .config(|this| this.optional()),
3558                    Sequence::new(vec_of_erased![
3559                        Ref::keyword("COMPRESSION"),
3560                        Ref::new("EqualsSegment"),
3561                        Ref::new("CompressionType"),
3562                    ])
3563                    .config(|this| this.optional()),
3564                    Sequence::new(vec_of_erased![
3565                        Ref::keyword("REQUEST_TRANSLATOR"),
3566                        Ref::new("EqualsSegment"),
3567                        Ref::new("FunctionNameSegment"),
3568                    ])
3569                    .config(|this| this.optional()),
3570                    Sequence::new(vec_of_erased![
3571                        Ref::keyword("RESPONSE_TRANSLATOR"),
3572                        Ref::new("EqualsSegment"),
3573                        Ref::new("FunctionNameSegment"),
3574                    ])
3575                    .config(|this| this.optional()),
3576                    Ref::keyword("AS"),
3577                    Ref::new("SingleQuotedIdentifierSegment"),
3578                ])
3579                .to_matchable(),
3580            )
3581            .to_matchable()
3582            .into(),
3583        ),
3584        (
3585            "WarehouseObjectPropertiesSegment".into(),
3586            NodeMatcher::new(
3587                SyntaxKind::WarehouseObjectProperties,
3588                any_set_of(vec_of_erased![
3589                    Sequence::new(vec_of_erased![
3590                        Ref::keyword("WAREHOUSE_TYPE"),
3591                        Ref::new("EqualsSegment"),
3592                        Ref::new("WarehouseType"),
3593                    ]),
3594                    Sequence::new(vec_of_erased![
3595                        Ref::keyword("WAREHOUSE_SIZE"),
3596                        Ref::new("EqualsSegment"),
3597                        Ref::new("WarehouseSize"),
3598                    ]),
3599                    Sequence::new(vec_of_erased![
3600                        Ref::keyword("WAIT_FOR_COMPLETION"),
3601                        Ref::new("EqualsSegment"),
3602                        Ref::new("BooleanLiteralGrammar"),
3603                    ]),
3604                    Sequence::new(vec_of_erased![
3605                        Ref::keyword("MAX_CLUSTER_COUNT"),
3606                        Ref::new("EqualsSegment"),
3607                        Ref::new("NumericLiteralSegment"),
3608                    ]),
3609                    Sequence::new(vec_of_erased![
3610                        Ref::keyword("MIN_CLUSTER_COUNT"),
3611                        Ref::new("EqualsSegment"),
3612                        Ref::new("NumericLiteralSegment"),
3613                    ]),
3614                    Sequence::new(vec_of_erased![
3615                        Ref::keyword("SCALING_POLICY"),
3616                        Ref::new("EqualsSegment"),
3617                        Ref::new("ScalingPolicy"),
3618                    ]),
3619                    Sequence::new(vec_of_erased![
3620                        Ref::keyword("AUTO_SUSPEND"),
3621                        Ref::new("EqualsSegment"),
3622                        one_of(vec_of_erased![
3623                            Ref::new("NumericLiteralSegment"),
3624                            Ref::keyword("NULL"),
3625                        ]),
3626                    ]),
3627                    Sequence::new(vec_of_erased![
3628                        Ref::keyword("AUTO_RESUME"),
3629                        Ref::new("EqualsSegment"),
3630                        Ref::new("BooleanLiteralGrammar"),
3631                    ]),
3632                    Sequence::new(vec_of_erased![
3633                        Ref::keyword("INITIALLY_SUSPENDED"),
3634                        Ref::new("EqualsSegment"),
3635                        Ref::new("BooleanLiteralGrammar"),
3636                    ]),
3637                    Sequence::new(vec_of_erased![
3638                        Ref::keyword("RESOURCE_MONITOR"),
3639                        Ref::new("EqualsSegment"),
3640                        Ref::new("NakedIdentifierSegment"),
3641                    ]),
3642                ])
3643                .to_matchable(),
3644            )
3645            .to_matchable()
3646            .into(),
3647        ),
3648        (
3649            "WarehouseObjectParamsSegment".into(),
3650            NodeMatcher::new(
3651                SyntaxKind::WarehouseObjectProperties,
3652                any_set_of(vec_of_erased![
3653                    Sequence::new(vec_of_erased![
3654                        Ref::keyword("MAX_CONCURRENCY_LEVEL"),
3655                        Ref::new("EqualsSegment"),
3656                        Ref::new("NumericLiteralSegment"),
3657                    ]),
3658                    Sequence::new(vec_of_erased![
3659                        Ref::keyword("STATEMENT_QUEUED_TIMEOUT_IN_SECONDS"),
3660                        Ref::new("EqualsSegment"),
3661                        Ref::new("NumericLiteralSegment"),
3662                    ]),
3663                    Sequence::new(vec_of_erased![
3664                        Ref::keyword("STATEMENT_TIMEOUT_IN_SECONDS"),
3665                        Ref::new("EqualsSegment"),
3666                        Ref::new("NumericLiteralSegment"),
3667                    ]),
3668                ])
3669                .to_matchable(),
3670            )
3671            .to_matchable()
3672            .into(),
3673        ),
3674        (
3675            "ConstraintPropertiesSegment".into(),
3676            NodeMatcher::new(
3677                SyntaxKind::ConstraintPropertiesSegment,
3678                Sequence::new(vec_of_erased![
3679                    Sequence::new(vec_of_erased![
3680                        Ref::keyword("CONSTRAINT"),
3681                        Ref::new("QuotedLiteralSegment"),
3682                    ])
3683                    .config(|this| this.optional()),
3684                    one_of(vec_of_erased![
3685                        Sequence::new(vec_of_erased![
3686                            Ref::keyword("UNIQUE"),
3687                            Bracketed::new(vec_of_erased![Ref::new("ColumnReferenceSegment"),])
3688                                .config(|this| this.optional()),
3689                        ]),
3690                        Sequence::new(vec_of_erased![
3691                            Ref::new("PrimaryKeyGrammar"),
3692                            Bracketed::new(vec_of_erased![Ref::new("ColumnReferenceSegment"),])
3693                                .config(|this| this.optional()),
3694                        ]),
3695                        Sequence::new(vec_of_erased![
3696                            Sequence::new(vec_of_erased![
3697                                Ref::new("ForeignKeyGrammar"),
3698                                Bracketed::new(vec_of_erased![Ref::new("ColumnReferenceSegment"),])
3699                                    .config(|this| this.optional()),
3700                            ]),
3701                            Ref::keyword("REFERENCES"),
3702                            Ref::new("TableReferenceSegment"),
3703                            Bracketed::new(vec_of_erased![Ref::new("ColumnReferenceSegment"),]),
3704                        ]),
3705                    ]),
3706                    any_set_of(vec_of_erased![one_of(vec_of_erased![
3707                        Sequence::new(vec_of_erased![
3708                            Ref::keyword("NOT").optional(),
3709                            Ref::keyword("ENFORCED"),
3710                        ]),
3711                        Sequence::new(vec_of_erased![
3712                            Ref::keyword("NOT").optional(),
3713                            Ref::keyword("DEFERRABLE"),
3714                        ]),
3715                        Sequence::new(vec_of_erased![
3716                            Ref::keyword("INITIALLY"),
3717                            one_of(vec_of_erased![
3718                                Ref::keyword("DEFERRED"),
3719                                Ref::keyword("IMMEDIATE"),
3720                            ]),
3721                        ]),
3722                    ]),]),
3723                ])
3724                .to_matchable(),
3725            )
3726            .to_matchable()
3727            .into(),
3728        ),
3729    ]);
3730
3731    snowflake_dialect.replace_grammar(
3732        "ColumnConstraintSegment",
3733        any_set_of(vec_of_erased![
3734            Sequence::new(vec_of_erased![
3735                Ref::keyword("COLLATE"),
3736                Ref::new("CollationReferenceSegment"),
3737            ]),
3738            Sequence::new(vec_of_erased![
3739                Ref::keyword("DEFAULT"),
3740                one_of(vec_of_erased![
3741                    Ref::new("QuotedLiteralSegment"),
3742                    Sequence::new(vec_of_erased![
3743                        Ref::keyword("CURRENT_TIMESTAMP"),
3744                        Bracketed::new(vec_of_erased![
3745                            Ref::new("NumericLiteralSegment").optional(),
3746                        ])
3747                        .config(|this| this.optional()),
3748                    ]),
3749                    Sequence::new(vec_of_erased![
3750                        Ref::keyword("SYSDATE"),
3751                        Bracketed::new(vec_of_erased![]),
3752                    ]),
3753                ]),
3754            ]),
3755            Sequence::new(vec_of_erased![
3756                one_of(vec_of_erased![
3757                    Ref::keyword("AUTOINCREMENT"),
3758                    Ref::keyword("IDENTITY"),
3759                ]),
3760                one_of(vec_of_erased![
3761                    Bracketed::new(vec_of_erased![Delimited::new(vec_of_erased![Ref::new(
3762                        "NumericLiteralSegment"
3763                    ),]),]),
3764                    Sequence::new(vec_of_erased![
3765                        Ref::keyword("START"),
3766                        Ref::new("NumericLiteralSegment"),
3767                        Ref::keyword("INCREMENT"),
3768                        Ref::new("NumericLiteralSegment"),
3769                    ]),
3770                ])
3771                .config(|this| this.optional()),
3772            ]),
3773            Sequence::new(vec_of_erased![
3774                Ref::keyword("NOT").optional(),
3775                Ref::keyword("NULL"),
3776            ]),
3777            Sequence::new(vec_of_erased![
3778                Ref::keyword("WITH").optional(),
3779                Ref::keyword("MASKING"),
3780                Ref::keyword("POLICY"),
3781                Ref::new("FunctionNameSegment"),
3782                Sequence::new(vec_of_erased![
3783                    Ref::keyword("USING"),
3784                    Bracketed::new(vec_of_erased![Delimited::new(vec_of_erased![one_of(
3785                        vec_of_erased![
3786                            Ref::new("ColumnReferenceSegment"),
3787                            Ref::new("ExpressionSegment"),
3788                        ]
3789                    ),]),]),
3790                ])
3791                .config(|this| this.optional()),
3792            ]),
3793            Ref::new("TagBracketedEqualsSegment").optional(),
3794            Ref::new("ConstraintPropertiesSegment"),
3795            Sequence::new(vec_of_erased![
3796                Ref::keyword("DEFAULT"),
3797                Ref::new("QuotedLiteralSegment"),
3798            ]),
3799            Sequence::new(vec_of_erased![
3800                Ref::keyword("CHECK"),
3801                Bracketed::new(vec_of_erased![Ref::new("ExpressionSegment"),]),
3802            ]),
3803            Sequence::new(vec_of_erased![
3804                Ref::keyword("DEFAULT"),
3805                one_of(vec_of_erased![
3806                    Ref::new("LiteralGrammar"),
3807                    Ref::new("FunctionSegment"),
3808                ]),
3809            ]),
3810            Sequence::new(vec_of_erased![
3811                Ref::keyword("REFERENCES"),
3812                Ref::new("ColumnReferenceSegment"),
3813                Ref::new("BracketedColumnReferenceListGrammar").optional(),
3814            ]),
3815        ])
3816        .to_matchable(),
3817    );
3818
3819    snowflake_dialect.add([(
3820        "CopyOptionsSegment".into(),
3821        NodeMatcher::new(
3822            SyntaxKind::CopyOptions,
3823            one_of(vec_of_erased![
3824                any_set_of(vec_of_erased![
3825                    Sequence::new(vec_of_erased![
3826                        Ref::keyword("ON_ERROR"),
3827                        Ref::new("EqualsSegment"),
3828                        Ref::new("CopyOptionOnErrorSegment"),
3829                    ]),
3830                    Sequence::new(vec_of_erased![
3831                        Ref::keyword("SIZE_LIMIT"),
3832                        Ref::new("EqualsSegment"),
3833                        Ref::new("NumericLiteralSegment"),
3834                    ]),
3835                    Sequence::new(vec_of_erased![
3836                        Ref::keyword("PURGE"),
3837                        Ref::new("EqualsSegment"),
3838                        Ref::new("BooleanLiteralGrammar"),
3839                    ]),
3840                    Sequence::new(vec_of_erased![
3841                        Ref::keyword("RETURN_FAILED_ONLY"),
3842                        Ref::new("EqualsSegment"),
3843                        Ref::new("BooleanLiteralGrammar"),
3844                    ]),
3845                    Sequence::new(vec_of_erased![
3846                        Ref::keyword("MATCH_BY_COLUMN_NAME"),
3847                        Ref::new("EqualsSegment"),
3848                        one_of(vec_of_erased![
3849                            Ref::keyword("CASE_SENSITIVE"),
3850                            Ref::keyword("CASE_INSENSITIVE"),
3851                            Ref::keyword("NONE"),
3852                        ]),
3853                    ]),
3854                    Sequence::new(vec_of_erased![
3855                        Ref::keyword("ENFORCE_LENGTH"),
3856                        Ref::new("EqualsSegment"),
3857                        Ref::new("BooleanLiteralGrammar"),
3858                    ]),
3859                    Sequence::new(vec_of_erased![
3860                        Ref::keyword("TRUNCATECOLUMNS"),
3861                        Ref::new("EqualsSegment"),
3862                        Ref::new("BooleanLiteralGrammar"),
3863                    ]),
3864                    Sequence::new(vec_of_erased![
3865                        Ref::keyword("FORCE"),
3866                        Ref::new("EqualsSegment"),
3867                        Ref::new("BooleanLiteralGrammar"),
3868                    ]),
3869                ]),
3870                any_set_of(vec_of_erased![
3871                    Sequence::new(vec_of_erased![
3872                        Ref::keyword("OVERWRITE"),
3873                        Ref::new("EqualsSegment"),
3874                        Ref::new("BooleanLiteralGrammar"),
3875                    ]),
3876                    Sequence::new(vec_of_erased![
3877                        Ref::keyword("SINGLE"),
3878                        Ref::new("EqualsSegment"),
3879                        Ref::new("BooleanLiteralGrammar"),
3880                    ]),
3881                    Sequence::new(vec_of_erased![
3882                        Ref::keyword("MAX_FILE_SIZE"),
3883                        Ref::new("EqualsSegment"),
3884                        Ref::new("NumericLiteralSegment"),
3885                    ]),
3886                    Sequence::new(vec_of_erased![
3887                        Ref::keyword("INCLUDE_QUERY_ID"),
3888                        Ref::new("EqualsSegment"),
3889                        Ref::new("BooleanLiteralGrammar"),
3890                    ]),
3891                    Sequence::new(vec_of_erased![
3892                        Ref::keyword("DETAILED_OUTPUT"),
3893                        Ref::new("EqualsSegment"),
3894                        Ref::new("BooleanLiteralGrammar"),
3895                    ]),
3896                ]),
3897            ])
3898            .to_matchable(),
3899        )
3900        .to_matchable()
3901        .into(),
3902    )]);
3903
3904    snowflake_dialect.replace_grammar(
3905        "CreateSchemaStatementSegment",
3906        Sequence::new(vec_of_erased![
3907            Ref::keyword("CREATE"),
3908            Ref::new("OrReplaceGrammar").optional(),
3909            Ref::new("TemporaryTransientGrammar").optional(),
3910            Ref::keyword("SCHEMA"),
3911            Ref::new("IfNotExistsGrammar").optional(),
3912            Ref::new("SchemaReferenceSegment"),
3913            Sequence::new(vec_of_erased![
3914                Ref::keyword("WITH"),
3915                Ref::keyword("MANAGED"),
3916                Ref::keyword("ACCESS"),
3917            ])
3918            .config(|this| this.optional()),
3919            Ref::new("SchemaObjectParamsSegment").optional(),
3920            Ref::new("TagBracketedEqualsSegment").optional(),
3921        ])
3922        .to_matchable(),
3923    );
3924
3925    snowflake_dialect.add([
3926        (
3927            "AlterRoleStatementSegment".into(),
3928            NodeMatcher::new(
3929                SyntaxKind::AlterRoleStatement,
3930                Sequence::new(vec_of_erased![
3931                    Ref::keyword("ALTER"),
3932                    Ref::keyword("ROLE"),
3933                    Ref::new("IfExistsGrammar").optional(),
3934                    Ref::new("RoleReferenceSegment"),
3935                    one_of(vec_of_erased![
3936                        Sequence::new(vec_of_erased![
3937                            Ref::keyword("SET"),
3938                            one_of(vec_of_erased![
3939                                Ref::new("RoleReferenceSegment"),
3940                                Ref::new("TagEqualsSegment"),
3941                                Sequence::new(vec_of_erased![
3942                                    Ref::keyword("COMMENT"),
3943                                    Ref::new("EqualsSegment"),
3944                                    Ref::new("QuotedLiteralSegment"),
3945                                ]),
3946                            ]),
3947                        ]),
3948                        Sequence::new(vec_of_erased![
3949                            Ref::keyword("UNSET"),
3950                            one_of(vec_of_erased![
3951                                Ref::new("RoleReferenceSegment"),
3952                                Sequence::new(vec_of_erased![
3953                                    Ref::keyword("TAG"),
3954                                    Delimited::new(
3955                                        vec_of_erased![Ref::new("TagReferenceSegment"),]
3956                                    ),
3957                                ]),
3958                                Sequence::new(vec_of_erased![Ref::keyword("COMMENT"),]),
3959                            ]),
3960                        ]),
3961                        Sequence::new(vec_of_erased![
3962                            Ref::keyword("RENAME"),
3963                            Ref::keyword("TO"),
3964                            one_of(vec_of_erased![Ref::new("RoleReferenceSegment"),]),
3965                        ]),
3966                    ]),
3967                ])
3968                .to_matchable(),
3969            )
3970            .to_matchable()
3971            .into(),
3972        ),
3973        (
3974            "AlterSchemaStatementSegment".into(),
3975            NodeMatcher::new(
3976                SyntaxKind::AlterSchemaStatement,
3977                Sequence::new(vec_of_erased![
3978                    Ref::keyword("ALTER"),
3979                    Ref::keyword("SCHEMA"),
3980                    Sequence::new(vec_of_erased![Ref::keyword("IF"), Ref::keyword("EXISTS"),])
3981                        .config(|this| this.optional()),
3982                    Ref::new("SchemaReferenceSegment"),
3983                    one_of(vec_of_erased![
3984                        Sequence::new(vec_of_erased![
3985                            Ref::keyword("RENAME"),
3986                            Ref::keyword("TO"),
3987                            Ref::new("SchemaReferenceSegment"),
3988                        ]),
3989                        Sequence::new(vec_of_erased![
3990                            Ref::keyword("SWAP"),
3991                            Ref::keyword("WITH"),
3992                            Ref::new("SchemaReferenceSegment"),
3993                        ]),
3994                        Sequence::new(vec_of_erased![
3995                            Ref::keyword("SET"),
3996                            one_of(vec_of_erased![
3997                                Ref::new("SchemaObjectParamsSegment"),
3998                                Ref::new("TagEqualsSegment"),
3999                            ]),
4000                        ]),
4001                        Sequence::new(vec_of_erased![
4002                            Ref::keyword("UNSET"),
4003                            one_of(vec_of_erased![
4004                                Delimited::new(vec_of_erased![
4005                                    Ref::keyword("DATA_RETENTION_TIME_IN_DAYS"),
4006                                    Ref::keyword("MAX_DATA_EXTENSION_TIME_IN_DAYS"),
4007                                    Ref::keyword("DEFAULT_DDL_COLLATION"),
4008                                    Ref::keyword("COMMENT"),
4009                                ]),
4010                                Sequence::new(vec_of_erased![
4011                                    Ref::keyword("TAG"),
4012                                    Delimited::new(
4013                                        vec_of_erased![Ref::new("TagReferenceSegment"),]
4014                                    ),
4015                                ]),
4016                            ]),
4017                        ]),
4018                        Sequence::new(vec_of_erased![
4019                            one_of(vec_of_erased![
4020                                Ref::keyword("ENABLE"),
4021                                Ref::keyword("DISABLE"),
4022                            ]),
4023                            Sequence::new(vec_of_erased![
4024                                Ref::keyword("MANAGED"),
4025                                Ref::keyword("ACCESS"),
4026                            ]),
4027                        ]),
4028                    ]),
4029                ])
4030                .to_matchable(),
4031            )
4032            .to_matchable()
4033            .into(),
4034        ),
4035        (
4036            "SchemaObjectParamsSegment".into(),
4037            NodeMatcher::new(
4038                SyntaxKind::SchemaObjectProperties,
4039                any_set_of(vec_of_erased![
4040                    Sequence::new(vec_of_erased![
4041                        Ref::keyword("DATA_RETENTION_TIME_IN_DAYS"),
4042                        Ref::new("EqualsSegment"),
4043                        Ref::new("NumericLiteralSegment"),
4044                    ]),
4045                    Sequence::new(vec_of_erased![
4046                        Ref::keyword("MAX_DATA_EXTENSION_TIME_IN_DAYS"),
4047                        Ref::new("EqualsSegment"),
4048                        Ref::new("NumericLiteralSegment"),
4049                    ]),
4050                    Sequence::new(vec_of_erased![
4051                        Ref::keyword("DEFAULT_DDL_COLLATION"),
4052                        Ref::new("EqualsSegment"),
4053                        Ref::new("QuotedLiteralSegment"),
4054                    ]),
4055                    Ref::new("CommentEqualsClauseSegment"),
4056                ])
4057                .to_matchable(),
4058            )
4059            .to_matchable()
4060            .into(),
4061        ),
4062    ]);
4063
4064    snowflake_dialect.replace_grammar(
4065        "CreateTableStatementSegment",
4066        Sequence::new(vec_of_erased![
4067            Ref::keyword("CREATE"),
4068            Ref::new("OrReplaceGrammar").optional(),
4069            Ref::new("TemporaryTransientGrammar").optional(),
4070            Ref::keyword("TABLE"),
4071            Ref::new("IfNotExistsGrammar").optional(),
4072            Ref::new("TableReferenceSegment"),
4073            any_set_of(vec_of_erased![
4074                Sequence::new(vec_of_erased![Bracketed::new(vec_of_erased![
4075                    Delimited::new(vec_of_erased![Sequence::new(vec_of_erased![
4076                        one_of(vec_of_erased![
4077                            Ref::new("TableConstraintSegment"),
4078                            Ref::new("ColumnDefinitionSegment"),
4079                            Ref::new("SingleIdentifierGrammar"),
4080                        ]),
4081                        Ref::new("CommentClauseSegment").optional(),
4082                    ]),]),
4083                ]),])
4084                .config(|this| this.optional()),
4085                Sequence::new(vec_of_erased![
4086                    Ref::keyword("CLUSTER"),
4087                    Ref::keyword("BY"),
4088                    one_of(vec_of_erased![
4089                        Ref::new("FunctionSegment"),
4090                        Bracketed::new(vec_of_erased![Delimited::new(vec_of_erased![Ref::new(
4091                            "ExpressionSegment"
4092                        ),]),]),
4093                    ]),
4094                ])
4095                .config(|this| this.optional()),
4096                Sequence::new(vec_of_erased![
4097                    Ref::keyword("STAGE_FILE_FORMAT"),
4098                    Ref::new("EqualsSegment"),
4099                    Ref::new("FileFormatSegment"),
4100                ])
4101                .config(|this| this.optional()),
4102                Sequence::new(vec_of_erased![
4103                    Ref::keyword("STAGE_COPY_OPTIONS"),
4104                    Ref::new("EqualsSegment"),
4105                    Bracketed::new(vec_of_erased![Ref::new("CopyOptionsSegment"),]),
4106                ])
4107                .config(|this| this.optional()),
4108                Sequence::new(vec_of_erased![
4109                    Ref::keyword("DATA_RETENTION_TIME_IN_DAYS"),
4110                    Ref::new("EqualsSegment"),
4111                    Ref::new("NumericLiteralSegment"),
4112                ])
4113                .config(|this| this.optional()),
4114                Sequence::new(vec_of_erased![
4115                    Ref::keyword("MAX_DATA_EXTENSION_TIME_IN_DAYS"),
4116                    Ref::new("EqualsSegment"),
4117                    Ref::new("NumericLiteralSegment"),
4118                ])
4119                .config(|this| this.optional()),
4120                Sequence::new(vec_of_erased![
4121                    Ref::keyword("CHANGE_TRACKING"),
4122                    Ref::new("EqualsSegment"),
4123                    Ref::new("BooleanLiteralGrammar"),
4124                ])
4125                .config(|this| this.optional()),
4126                Sequence::new(vec_of_erased![
4127                    Ref::keyword("DEFAULT_DDL_COLLATION"),
4128                    Ref::new("EqualsSegment"),
4129                    Ref::new("QuotedLiteralGrammar"),
4130                ])
4131                .config(|this| this.optional()),
4132                Sequence::new(vec_of_erased![Ref::keyword("COPY"), Ref::keyword("GRANTS"),])
4133                    .config(|this| this.optional()),
4134                Sequence::new(vec_of_erased![
4135                    Ref::keyword("WITH").optional(),
4136                    Ref::keyword("ROW"),
4137                    Ref::keyword("ACCESS"),
4138                    Ref::keyword("POLICY"),
4139                    Ref::new("NakedIdentifierSegment"),
4140                    Ref::keyword("ON"),
4141                    Bracketed::new(vec_of_erased![Delimited::new(vec_of_erased![Ref::new(
4142                        "ColumnReferenceSegment"
4143                    ),]),]),
4144                ])
4145                .config(|this| this.optional()),
4146                Ref::new("TagBracketedEqualsSegment").optional(),
4147                Ref::new("CommentEqualsClauseSegment").optional(),
4148                one_of(vec_of_erased![
4149                    Sequence::new(vec_of_erased![
4150                        Ref::keyword("AS"),
4151                        optionally_bracketed(vec_of_erased![Ref::new("SelectableGrammar"),]),
4152                    ]),
4153                    Sequence::new(vec_of_erased![
4154                        Ref::keyword("LIKE"),
4155                        Ref::new("TableReferenceSegment"),
4156                    ]),
4157                    Sequence::new(vec_of_erased![
4158                        Ref::keyword("CLONE"),
4159                        Ref::new("TableReferenceSegment"),
4160                    ]),
4161                    Sequence::new(vec_of_erased![
4162                        Ref::keyword("USING"),
4163                        Ref::keyword("TEMPLATE"),
4164                        Ref::new("SelectableGrammar"),
4165                    ]),
4166                ])
4167                .config(|this| this.optional()),
4168            ]),
4169        ])
4170        .to_matchable(),
4171    );
4172
4173    snowflake_dialect.add([
4174        (
4175            "CreateTaskSegment".into(),
4176            NodeMatcher::new(
4177                SyntaxKind::CreateTaskStatement,
4178                Sequence::new(vec_of_erased![
4179                    Ref::keyword("CREATE"),
4180                    Sequence::new(vec_of_erased![Ref::keyword("OR"), Ref::keyword("REPLACE"),])
4181                        .config(|this| this.optional()),
4182                    Ref::keyword("TASK"),
4183                    Sequence::new(vec_of_erased![
4184                        Ref::keyword("IF"),
4185                        Ref::keyword("NOT"),
4186                        Ref::keyword("EXISTS"),
4187                    ])
4188                    .config(|this| this.optional()),
4189                    Ref::new("ObjectReferenceSegment"),
4190                    MetaSegment::indent(),
4191                    AnyNumberOf::new(vec_of_erased![
4192                        one_of(vec_of_erased![
4193                            Sequence::new(vec_of_erased![
4194                                Ref::keyword("WAREHOUSE"),
4195                                Ref::new("EqualsSegment"),
4196                                Ref::new("ObjectReferenceSegment"),
4197                            ]),
4198                            Sequence::new(vec_of_erased![
4199                                Ref::keyword("USER_TASK_MANAGED_INITIAL_WAREHOUSE_SIZE"),
4200                                Ref::new("EqualsSegment"),
4201                                Ref::new("WarehouseSize"),
4202                            ]),
4203                        ]),
4204                        Sequence::new(vec_of_erased![
4205                            Ref::keyword("SCHEDULE"),
4206                            Ref::new("EqualsSegment"),
4207                            Ref::new("QuotedLiteralSegment"),
4208                        ]),
4209                        Sequence::new(vec_of_erased![
4210                            Ref::keyword("ALLOW_OVERLAPPING_EXECUTION"),
4211                            Ref::new("EqualsSegment"),
4212                            Ref::new("BooleanLiteralGrammar"),
4213                        ]),
4214                        Sequence::new(vec_of_erased![
4215                            Ref::keyword("USER_TASK_TIMEOUT_MS"),
4216                            Ref::new("EqualsSegment"),
4217                            Ref::new("NumericLiteralSegment"),
4218                        ]),
4219                        Delimited::new(vec_of_erased![Sequence::new(vec_of_erased![
4220                            Ref::new("ParameterNameSegment"),
4221                            Ref::new("EqualsSegment"),
4222                            one_of(vec_of_erased![
4223                                Ref::new("BooleanLiteralGrammar"),
4224                                Ref::new("QuotedLiteralSegment"),
4225                                Ref::new("NumericLiteralSegment"),
4226                            ]),
4227                        ]),]),
4228                        Sequence::new(
4229                            vec_of_erased![Ref::keyword("COPY"), Ref::keyword("GRANTS"),]
4230                        ),
4231                        Ref::new("CommentEqualsClauseSegment"),
4232                    ]),
4233                    Sequence::new(vec_of_erased![
4234                        Ref::keyword("AFTER"),
4235                        Ref::new("ObjectReferenceSegment"),
4236                    ])
4237                    .config(|this| this.optional()),
4238                    MetaSegment::dedent(),
4239                    Sequence::new(vec_of_erased![
4240                        Ref::keyword("WHEN"),
4241                        MetaSegment::indent(),
4242                        Ref::new("TaskExpressionSegment"),
4243                        MetaSegment::dedent(),
4244                    ])
4245                    .config(|this| this.optional()),
4246                    Sequence::new(vec_of_erased![
4247                        Ref::keyword("AS"),
4248                        MetaSegment::indent(),
4249                        Ref::new("StatementSegment"),
4250                        MetaSegment::dedent(),
4251                    ]),
4252                ])
4253                .to_matchable(),
4254            )
4255            .to_matchable()
4256            .into(),
4257        ),
4258        (
4259            "TaskExpressionSegment".into(),
4260            NodeMatcher::new(
4261                SyntaxKind::SnowflakeTaskExpressionSegment,
4262                Sequence::new(vec_of_erased![
4263                    Delimited::new(vec_of_erased![one_of(vec_of_erased![
4264                        Ref::new("ExpressionSegment"),
4265                        Sequence::new(vec_of_erased![
4266                            Ref::new("SystemFunctionName"),
4267                            Bracketed::new(vec_of_erased![Ref::new("QuotedLiteralSegment"),]),
4268                        ]),
4269                    ]),],)
4270                    .config(|this| this.delimiter(one_of(vec_of_erased![Ref::new(
4271                        "BooleanBinaryOperatorGrammar"
4272                    ),]))),
4273                ])
4274                .to_matchable(),
4275            )
4276            .to_matchable()
4277            .into(),
4278        ),
4279        (
4280            "CreateStatementSegment".into(),
4281            NodeMatcher::new(
4282                SyntaxKind::CreateStatement,
4283                Sequence::new(vec_of_erased![
4284                    Ref::keyword("CREATE"),
4285                    Ref::new("OrReplaceGrammar").optional(),
4286                    one_of(vec_of_erased![
4287                        Sequence::new(vec_of_erased![
4288                            Ref::keyword("NETWORK"),
4289                            Ref::keyword("POLICY"),
4290                        ]),
4291                        Sequence::new(vec_of_erased![
4292                            Ref::keyword("RESOURCE"),
4293                            Ref::keyword("MONITOR"),
4294                        ]),
4295                        Ref::keyword("SHARE"),
4296                        Ref::keyword("ROLE"),
4297                        Ref::keyword("USER"),
4298                        Ref::keyword("TAG"),
4299                        Ref::keyword("WAREHOUSE"),
4300                        Sequence::new(vec_of_erased![
4301                            Ref::keyword("NOTIFICATION"),
4302                            Ref::keyword("INTEGRATION"),
4303                        ]),
4304                        Sequence::new(vec_of_erased![
4305                            Ref::keyword("SECURITY"),
4306                            Ref::keyword("INTEGRATION"),
4307                        ]),
4308                        Sequence::new(vec_of_erased![
4309                            Ref::keyword("STORAGE"),
4310                            Ref::keyword("INTEGRATION"),
4311                        ]),
4312                        Sequence::new(vec_of_erased![
4313                            Ref::keyword("MATERIALIZED"),
4314                            Ref::keyword("VIEW"),
4315                        ]),
4316                        Sequence::new(vec_of_erased![
4317                            Ref::keyword("MASKING"),
4318                            Ref::keyword("POLICY"),
4319                        ]),
4320                        Ref::keyword("PIPE"),
4321                        Sequence::new(vec_of_erased![
4322                            Ref::keyword("EXTERNAL"),
4323                            Ref::keyword("FUNCTION"),
4324                        ]),
4325                        Ref::keyword("DATABASE"),
4326                        Ref::keyword("SEQUENCE"),
4327                    ]),
4328                    Ref::new("IfNotExistsGrammar").optional(),
4329                    Ref::new("ObjectReferenceSegment"),
4330                    any_set_of(vec_of_erased![
4331                        Sequence::new(vec_of_erased![
4332                            Ref::keyword("TYPE"),
4333                            Ref::new("EqualsSegment"),
4334                            Ref::keyword("QUEUE"),
4335                        ]),
4336                        Sequence::new(vec_of_erased![
4337                            Ref::keyword("ENABLED"),
4338                            Ref::new("EqualsSegment"),
4339                            Ref::new("BooleanLiteralGrammar"),
4340                        ]),
4341                        Sequence::new(vec_of_erased![
4342                            Ref::keyword("NOTIFICATION_PROVIDER"),
4343                            Ref::new("EqualsSegment"),
4344                            one_of(vec_of_erased![
4345                                Ref::keyword("AWS_SNS"),
4346                                Ref::keyword("AZURE_EVENT_GRID"),
4347                                Ref::keyword("GCP_PUBSUB"),
4348                                Ref::keyword("AZURE_STORAGE_QUEUE"),
4349                                Ref::new("QuotedLiteralSegment"),
4350                            ]),
4351                        ]),
4352                        Sequence::new(vec_of_erased![
4353                            Ref::keyword("AWS_SNS_TOPIC_ARN"),
4354                            Ref::new("EqualsSegment"),
4355                            Ref::new("QuotedLiteralSegment"),
4356                        ]),
4357                        Sequence::new(vec_of_erased![
4358                            Ref::keyword("AWS_SNS_ROLE_ARN"),
4359                            Ref::new("EqualsSegment"),
4360                            Ref::new("QuotedLiteralSegment"),
4361                        ]),
4362                        Sequence::new(vec_of_erased![
4363                            Ref::keyword("AZURE_TENANT_ID"),
4364                            Ref::new("EqualsSegment"),
4365                            Ref::new("QuotedLiteralSegment"),
4366                        ]),
4367                        one_of(vec_of_erased![
4368                            Sequence::new(vec_of_erased![
4369                                Ref::keyword("AZURE_STORAGE_QUEUE_PRIMARY_URI"),
4370                                Ref::new("EqualsSegment"),
4371                                Ref::new("QuotedLiteralSegment"),
4372                            ]),
4373                            Sequence::new(vec_of_erased![
4374                                Ref::keyword("AZURE_EVENT_GRID_TOPIC_ENDPOINT"),
4375                                Ref::new("EqualsSegment"),
4376                                Ref::new("QuotedLiteralSegment"),
4377                            ]),
4378                        ]),
4379                        one_of(vec_of_erased![
4380                            Sequence::new(vec_of_erased![
4381                                Ref::keyword("GCP_PUBSUB_SUBSCRIPTION_NAME"),
4382                                Ref::new("EqualsSegment"),
4383                                Ref::new("QuotedLiteralSegment"),
4384                            ]),
4385                            Sequence::new(vec_of_erased![
4386                                Ref::keyword("GCP_PUBSUB_TOPIC_NAME"),
4387                                Ref::new("EqualsSegment"),
4388                                Ref::new("QuotedLiteralSegment"),
4389                            ]),
4390                        ]),
4391                        Sequence::new(vec_of_erased![
4392                            Ref::keyword("DIRECTION"),
4393                            Ref::new("EqualsSegment"),
4394                            Ref::keyword("OUTBOUND"),
4395                        ])
4396                        .config(|this| this.optional()),
4397                        Sequence::new(vec_of_erased![
4398                            Ref::keyword("COMMENT"),
4399                            Ref::new("EqualsSegment"),
4400                            Ref::new("QuotedLiteralSegment"),
4401                        ]),
4402                        Sequence::new(vec_of_erased![
4403                            Ref::keyword("ALLOWED_VALUES"),
4404                            Delimited::new(vec_of_erased![Ref::new("QuotedLiteralSegment"),]),
4405                        ]),
4406                        Sequence::new(vec_of_erased![
4407                            Ref::keyword("ALLOWED_IP_LIST"),
4408                            Ref::new("EqualsSegment"),
4409                            Bracketed::new(vec_of_erased![Delimited::new(vec_of_erased![
4410                                Ref::new("QuotedLiteralSegment"),
4411                            ]),]),
4412                        ]),
4413                        Sequence::new(vec_of_erased![
4414                            Ref::keyword("BLOCKED_IP_LIST"),
4415                            Ref::new("EqualsSegment"),
4416                            Bracketed::new(vec_of_erased![Delimited::new(vec_of_erased![
4417                                Ref::new("QuotedLiteralSegment"),
4418                            ]),]),
4419                        ]),
4420                    ]),
4421                    any_set_of(vec_of_erased![
4422                        Sequence::new(vec_of_erased![
4423                            Ref::keyword("TYPE"),
4424                            Ref::new("EqualsSegment"),
4425                            Ref::keyword("EXTERNAL_STAGE"),
4426                        ]),
4427                        Sequence::new(vec_of_erased![
4428                            Ref::keyword("ENABLED"),
4429                            Ref::new("EqualsSegment"),
4430                            Ref::new("BooleanLiteralGrammar"),
4431                        ]),
4432                        Sequence::new(vec_of_erased![
4433                            Ref::keyword("STORAGE_PROVIDER"),
4434                            Ref::new("EqualsSegment"),
4435                            one_of(vec_of_erased![
4436                                Ref::keyword("S3"),
4437                                Ref::keyword("AZURE"),
4438                                Ref::keyword("GCS"),
4439                                Ref::new("QuotedLiteralSegment"),
4440                            ]),
4441                        ]),
4442                        Sequence::new(vec_of_erased![
4443                            Ref::keyword("AZURE_TENANT_ID"),
4444                            Ref::new("EqualsSegment"),
4445                            Ref::new("QuotedLiteralSegment"),
4446                        ]),
4447                        Sequence::new(vec_of_erased![
4448                            Ref::keyword("STORAGE_AWS_ROLE_ARN"),
4449                            Ref::new("EqualsSegment"),
4450                            Ref::new("QuotedLiteralSegment"),
4451                        ]),
4452                        Sequence::new(vec_of_erased![
4453                            Ref::keyword("STORAGE_AWS_OBJECT_ACL"),
4454                            Ref::new("EqualsSegment"),
4455                            StringParser::new("'bucket-owner-full-control'", SyntaxKind::Literal)
4456                        ]),
4457                        Sequence::new(vec_of_erased![
4458                            Ref::keyword("STORAGE_ALLOWED_LOCATIONS"),
4459                            Ref::new("EqualsSegment"),
4460                            one_of(vec_of_erased![
4461                                Bracketed::new(vec_of_erased![Delimited::new(vec_of_erased![
4462                                    one_of(vec_of_erased![
4463                                        Ref::new("S3Path"),
4464                                        Ref::new("GCSPath"),
4465                                        Ref::new("AzureBlobStoragePath"),
4466                                    ]),
4467                                ]),]),
4468                                Bracketed::new(vec_of_erased![Ref::new("QuotedStarSegment"),]),
4469                            ]),
4470                        ]),
4471                        Sequence::new(vec_of_erased![
4472                            Ref::keyword("STORAGE_BLOCKED_LOCATIONS"),
4473                            Ref::new("EqualsSegment"),
4474                            Bracketed::new(vec_of_erased![Delimited::new(vec_of_erased![one_of(
4475                                vec_of_erased![
4476                                    Ref::new("S3Path"),
4477                                    Ref::new("GCSPath"),
4478                                    Ref::new("AzureBlobStoragePath"),
4479                                ]
4480                            ),]),]),
4481                        ]),
4482                        Sequence::new(vec_of_erased![
4483                            Ref::keyword("COMMENT"),
4484                            Ref::new("EqualsSegment"),
4485                            Ref::new("QuotedLiteralSegment"),
4486                        ]),
4487                    ]),
4488                    Sequence::new(vec_of_erased![
4489                        Sequence::new(vec_of_erased![
4490                            Ref::keyword("AUTO_INGEST"),
4491                            Ref::new("EqualsSegment"),
4492                            Ref::new("BooleanLiteralGrammar"),
4493                        ])
4494                        .config(|this| this.optional()),
4495                        Sequence::new(vec_of_erased![
4496                            Ref::keyword("ERROR_INTEGRATION"),
4497                            Ref::new("EqualsSegment"),
4498                            Ref::new("ObjectReferenceSegment"),
4499                        ])
4500                        .config(|this| this.optional()),
4501                        Sequence::new(vec_of_erased![
4502                            Ref::keyword("AWS_SNS_TOPIC"),
4503                            Ref::new("EqualsSegment"),
4504                            Ref::new("QuotedLiteralSegment"),
4505                        ])
4506                        .config(|this| this.optional()),
4507                        Sequence::new(vec_of_erased![
4508                            Ref::keyword("INTEGRATION"),
4509                            Ref::new("EqualsSegment"),
4510                            one_of(vec_of_erased![
4511                                Ref::new("QuotedLiteralSegment"),
4512                                Ref::new("ObjectReferenceSegment"),
4513                            ]),
4514                        ])
4515                        .config(|this| this.optional()),
4516                    ])
4517                    .config(|this| this.optional()),
4518                    Sequence::new(vec_of_erased![
4519                        Sequence::new(vec_of_erased![Ref::keyword("WITH"),])
4520                            .config(|this| this.optional()),
4521                        AnyNumberOf::new(vec_of_erased![
4522                            Ref::new("WarehouseObjectPropertiesSegment"),
4523                            Ref::new("CommentEqualsClauseSegment"),
4524                            Ref::new("WarehouseObjectParamsSegment"),
4525                        ]),
4526                        Ref::new("TagBracketedEqualsSegment").optional(),
4527                    ])
4528                    .config(|this| this.optional()),
4529                    Ref::new("CommentEqualsClauseSegment").optional(),
4530                    Ref::keyword("AS").optional(),
4531                    one_of(vec_of_erased![
4532                        Ref::new("SelectStatementSegment"),
4533                        Sequence::new(vec_of_erased![
4534                            Bracketed::new(vec_of_erased![Ref::new("FunctionContentsGrammar"),])
4535                                .config(|this| this.optional()),
4536                            Ref::keyword("RETURNS"),
4537                            Ref::new("DatatypeSegment"),
4538                            Ref::new("FunctionAssignerSegment"),
4539                            Ref::new("ExpressionSegment"),
4540                            Sequence::new(vec_of_erased![
4541                                Ref::keyword("COMMENT"),
4542                                Ref::new("EqualsSegment"),
4543                                Ref::new("QuotedLiteralSegment"),
4544                            ])
4545                            .config(|this| this.optional()),
4546                        ])
4547                        .config(|this| this.optional()),
4548                        Ref::new("CopyIntoTableStatementSegment"),
4549                    ])
4550                    .config(|this| this.optional()),
4551                ])
4552                .to_matchable(),
4553            )
4554            .to_matchable()
4555            .into(),
4556        ),
4557        (
4558            "CreateUserSegment".into(),
4559            NodeMatcher::new(
4560                SyntaxKind::CreateUserStatement,
4561                Sequence::new(vec_of_erased![
4562                    Ref::keyword("CREATE"),
4563                    Sequence::new(vec_of_erased![Ref::keyword("OR"), Ref::keyword("REPLACE"),])
4564                        .config(|this| this.optional()),
4565                    Ref::keyword("USER"),
4566                    Sequence::new(vec_of_erased![
4567                        Ref::keyword("IF"),
4568                        Ref::keyword("NOT"),
4569                        Ref::keyword("EXISTS"),
4570                    ])
4571                    .config(|this| this.optional()),
4572                    Ref::new("ObjectReferenceSegment"),
4573                    MetaSegment::indent(),
4574                    AnyNumberOf::new(vec_of_erased![
4575                        Sequence::new(vec_of_erased![
4576                            Ref::keyword("PASSWORD"),
4577                            Ref::new("EqualsSegment"),
4578                            Ref::new("QuotedLiteralSegment"),
4579                        ]),
4580                        Sequence::new(vec_of_erased![
4581                            Ref::keyword("LOGIN_NAME"),
4582                            Ref::new("EqualsSegment"),
4583                            one_of(vec_of_erased![
4584                                Ref::new("ObjectReferenceSegment"),
4585                                Ref::new("QuotedLiteralSegment"),
4586                            ]),
4587                        ]),
4588                        Sequence::new(vec_of_erased![
4589                            Ref::keyword("DISPLAY_NAME"),
4590                            Ref::new("EqualsSegment"),
4591                            one_of(vec_of_erased![
4592                                Ref::new("ObjectReferenceSegment"),
4593                                Ref::new("QuotedLiteralSegment"),
4594                            ]),
4595                        ]),
4596                        Sequence::new(vec_of_erased![
4597                            Ref::keyword("FIRST_NAME"),
4598                            Ref::new("EqualsSegment"),
4599                            one_of(vec_of_erased![
4600                                Ref::new("ObjectReferenceSegment"),
4601                                Ref::new("QuotedLiteralSegment"),
4602                            ]),
4603                        ]),
4604                        Sequence::new(vec_of_erased![
4605                            Ref::keyword("MIDDLE_NAME"),
4606                            Ref::new("EqualsSegment"),
4607                            one_of(vec_of_erased![
4608                                Ref::new("ObjectReferenceSegment"),
4609                                Ref::new("QuotedLiteralSegment"),
4610                            ]),
4611                        ]),
4612                        Sequence::new(vec_of_erased![
4613                            Ref::keyword("LAST_NAME"),
4614                            Ref::new("EqualsSegment"),
4615                            one_of(vec_of_erased![
4616                                Ref::new("ObjectReferenceSegment"),
4617                                Ref::new("QuotedLiteralSegment"),
4618                            ]),
4619                        ]),
4620                        Sequence::new(vec_of_erased![
4621                            Ref::keyword("EMAIL"),
4622                            Ref::new("EqualsSegment"),
4623                            Ref::new("QuotedLiteralSegment"),
4624                        ]),
4625                        Sequence::new(vec_of_erased![
4626                            Ref::keyword("MUST_CHANGE_PASSWORD"),
4627                            Ref::new("EqualsSegment"),
4628                            Ref::new("BooleanLiteralGrammar"),
4629                        ]),
4630                        Sequence::new(vec_of_erased![
4631                            Ref::keyword("DISABLED"),
4632                            Ref::new("EqualsSegment"),
4633                            Ref::new("BooleanLiteralGrammar"),
4634                        ]),
4635                        Sequence::new(vec_of_erased![
4636                            Ref::keyword("DAYS_TO_EXPIRY"),
4637                            Ref::new("EqualsSegment"),
4638                            Ref::new("NumericLiteralSegment"),
4639                        ]),
4640                        Sequence::new(vec_of_erased![
4641                            Ref::keyword("MINS_TO_UNLOCK"),
4642                            Ref::new("EqualsSegment"),
4643                            Ref::new("NumericLiteralSegment"),
4644                        ]),
4645                        Sequence::new(vec_of_erased![
4646                            Ref::keyword("DEFAULT_WAREHOUSE"),
4647                            Ref::new("EqualsSegment"),
4648                            one_of(vec_of_erased![
4649                                Ref::new("ObjectReferenceSegment"),
4650                                Ref::new("QuotedLiteralSegment"),
4651                            ]),
4652                        ]),
4653                        Sequence::new(vec_of_erased![
4654                            Ref::keyword("DEFAULT_NAMESPACE"),
4655                            Ref::new("EqualsSegment"),
4656                            one_of(vec_of_erased![
4657                                Ref::new("ObjectReferenceSegment"),
4658                                Ref::new("QuotedLiteralSegment"),
4659                            ]),
4660                        ]),
4661                        Sequence::new(vec_of_erased![
4662                            Ref::keyword("DEFAULT_ROLE"),
4663                            Ref::new("EqualsSegment"),
4664                            one_of(vec_of_erased![
4665                                Ref::new("ObjectReferenceSegment"),
4666                                Ref::new("QuotedLiteralSegment"),
4667                            ]),
4668                        ]),
4669                        Sequence::new(vec_of_erased![
4670                            Ref::keyword("DEFAULT_SECONDARY_ROLES"),
4671                            Ref::new("EqualsSegment"),
4672                            Bracketed::new(vec_of_erased![Ref::new("QuotedLiteralSegment"),]),
4673                        ]),
4674                        Sequence::new(vec_of_erased![
4675                            Ref::keyword("MINS_TO_BYPASS_MFA"),
4676                            Ref::new("EqualsSegment"),
4677                            Ref::new("NumericLiteralSegment"),
4678                        ]),
4679                        Sequence::new(vec_of_erased![
4680                            Ref::keyword("RSA_PUBLIC_KEY"),
4681                            Ref::new("EqualsSegment"),
4682                            Ref::new("ObjectReferenceSegment"),
4683                        ]),
4684                        Sequence::new(vec_of_erased![
4685                            Ref::keyword("RSA_PUBLIC_KEY_2"),
4686                            Ref::new("EqualsSegment"),
4687                            Ref::new("ObjectReferenceSegment"),
4688                        ]),
4689                        Ref::new("CommentEqualsClauseSegment"),
4690                    ]),
4691                    MetaSegment::dedent(),
4692                ])
4693                .to_matchable(),
4694            )
4695            .to_matchable()
4696            .into(),
4697        ),
4698    ]);
4699
4700    snowflake_dialect.replace_grammar(
4701        "CreateViewStatementSegment",
4702        Sequence::new(vec_of_erased![
4703            Ref::keyword("CREATE"),
4704            Ref::new("OrReplaceGrammar").optional(),
4705            any_set_of(vec_of_erased![
4706                Ref::keyword("SECURE"),
4707                Ref::keyword("RECURSIVE"),
4708            ]),
4709            Ref::new("TemporaryGrammar").optional(),
4710            Ref::keyword("VIEW"),
4711            Ref::new("IfNotExistsGrammar").optional(),
4712            Ref::new("TableReferenceSegment"),
4713            any_set_of(vec_of_erased![
4714                Bracketed::new(vec_of_erased![Delimited::new(vec_of_erased![
4715                    Sequence::new(vec_of_erased![
4716                        Ref::new("ColumnReferenceSegment"),
4717                        Ref::new("CommentClauseSegment").optional(),
4718                    ]),
4719                ]),]),
4720                Sequence::new(vec_of_erased![
4721                    Ref::keyword("WITH").optional(),
4722                    Ref::keyword("ROW"),
4723                    Ref::keyword("ACCESS"),
4724                    Ref::keyword("POLICY"),
4725                    Ref::new("NakedIdentifierSegment"),
4726                    Ref::keyword("ON"),
4727                    Bracketed::new(vec_of_erased![Delimited::new(vec_of_erased![Ref::new(
4728                        "ColumnReferenceSegment"
4729                    ),]),]),
4730                ]),
4731                Ref::new("TagBracketedEqualsSegment"),
4732                Sequence::new(vec_of_erased![Ref::keyword("COPY"), Ref::keyword("GRANTS"),]),
4733                Ref::new("CommentEqualsClauseSegment"),
4734            ]),
4735            Ref::keyword("AS"),
4736            optionally_bracketed(vec_of_erased![Ref::new("SelectableGrammar"),]),
4737        ])
4738        .to_matchable(),
4739    );
4740
4741    snowflake_dialect.add([
4742        (
4743            "AlterViewStatementSegment".into(),
4744            NodeMatcher::new(
4745                SyntaxKind::AlterViewStatement,
4746                Sequence::new(vec_of_erased![
4747                    Ref::keyword("ALTER"),
4748                    Ref::keyword("VIEW"),
4749                    Ref::new("IfExistsGrammar").optional(),
4750                    Ref::new("TableReferenceSegment"),
4751                    one_of(vec_of_erased![
4752                        Sequence::new(vec_of_erased![
4753                            Ref::keyword("RENAME"),
4754                            Ref::keyword("TO"),
4755                            Ref::new("TableReferenceSegment"),
4756                        ]),
4757                        Sequence::new(vec_of_erased![
4758                            Ref::keyword("COMMENT"),
4759                            Ref::new("EqualsSegment"),
4760                            Ref::new("QuotedLiteralSegment"),
4761                        ]),
4762                        Sequence::new(vec_of_erased![
4763                            Ref::keyword("UNSET"),
4764                            Ref::keyword("COMMENT"),
4765                        ]),
4766                        Sequence::new(vec_of_erased![
4767                            one_of(vec_of_erased![Ref::keyword("SET"), Ref::keyword("UNSET"),]),
4768                            Ref::keyword("SECURE"),
4769                        ]),
4770                        Sequence::new(vec_of_erased![
4771                            Ref::keyword("SET"),
4772                            Ref::new("TagEqualsSegment"),
4773                        ]),
4774                        Sequence::new(vec_of_erased![
4775                            Ref::keyword("UNSET"),
4776                            Ref::keyword("TAG"),
4777                            Delimited::new(vec_of_erased![Ref::new("TagReferenceSegment"),]),
4778                        ]),
4779                        Delimited::new(vec_of_erased![
4780                            Sequence::new(vec_of_erased![
4781                                Ref::keyword("ADD"),
4782                                Ref::keyword("ROW"),
4783                                Ref::keyword("ACCESS"),
4784                                Ref::keyword("POLICY"),
4785                                Ref::new("FunctionNameSegment"),
4786                                Ref::keyword("ON"),
4787                                Bracketed::new(vec_of_erased![Delimited::new(vec_of_erased![
4788                                    Ref::new("ColumnReferenceSegment"),
4789                                ]),]),
4790                            ]),
4791                            Sequence::new(vec_of_erased![
4792                                Ref::keyword("DROP"),
4793                                Ref::keyword("ROW"),
4794                                Ref::keyword("ACCESS"),
4795                                Ref::keyword("POLICY"),
4796                                Ref::new("FunctionNameSegment"),
4797                            ]),
4798                        ]),
4799                        Sequence::new(vec_of_erased![
4800                            one_of(vec_of_erased![
4801                                Ref::keyword("ALTER"),
4802                                Ref::keyword("MODIFY"),
4803                            ]),
4804                            one_of(vec_of_erased![Delimited::new(vec_of_erased![
4805                                Sequence::new(vec_of_erased![
4806                                    Ref::keyword("COLUMN").optional(),
4807                                    Ref::new("ColumnReferenceSegment"),
4808                                    one_of(vec_of_erased![
4809                                        Sequence::new(vec_of_erased![
4810                                            Ref::keyword("SET"),
4811                                            Ref::keyword("MASKING"),
4812                                            Ref::keyword("POLICY"),
4813                                            Ref::new("FunctionNameSegment"),
4814                                            Sequence::new(vec_of_erased![
4815                                                Ref::keyword("USING"),
4816                                                Bracketed::new(vec_of_erased![Delimited::new(
4817                                                    vec_of_erased![Ref::new(
4818                                                        "ColumnReferenceSegment"
4819                                                    ),]
4820                                                ),])
4821                                                .config(|this| this.optional()),
4822                                            ])
4823                                            .config(|this| this.optional()),
4824                                        ]),
4825                                        Sequence::new(vec_of_erased![
4826                                            Ref::keyword("UNSET"),
4827                                            Ref::keyword("MASKING"),
4828                                            Ref::keyword("POLICY"),
4829                                        ]),
4830                                        Sequence::new(vec_of_erased![
4831                                            Ref::keyword("SET"),
4832                                            Ref::new("TagEqualsSegment"),
4833                                        ]),
4834                                    ]),
4835                                ]),
4836                                Sequence::new(vec_of_erased![
4837                                    Ref::keyword("COLUMN"),
4838                                    Ref::new("ColumnReferenceSegment"),
4839                                    Ref::keyword("UNSET"),
4840                                    Ref::keyword("TAG"),
4841                                    Delimited::new(
4842                                        vec_of_erased![Ref::new("TagReferenceSegment"),]
4843                                    ),
4844                                ]),
4845                            ]),]),
4846                        ]),
4847                    ]),
4848                ])
4849                .to_matchable(),
4850            )
4851            .to_matchable()
4852            .into(),
4853        ),
4854        (
4855            "AlterMaterializedViewStatementSegment".into(),
4856            NodeMatcher::new(
4857                SyntaxKind::AlterMaterializedViewStatement,
4858                Sequence::new(vec_of_erased![
4859                    Ref::keyword("ALTER"),
4860                    Ref::keyword("MATERIALIZED"),
4861                    Ref::keyword("VIEW"),
4862                    Ref::new("TableReferenceSegment"),
4863                    one_of(vec_of_erased![
4864                        Sequence::new(vec_of_erased![
4865                            Ref::keyword("RENAME"),
4866                            Ref::keyword("TO"),
4867                            Ref::new("TableReferenceSegment"),
4868                        ]),
4869                        Sequence::new(vec_of_erased![
4870                            Ref::keyword("CLUSTER"),
4871                            Ref::keyword("BY"),
4872                            Delimited::new(vec_of_erased![Ref::new("ExpressionSegment"),]),
4873                        ]),
4874                        Sequence::new(vec_of_erased![
4875                            Ref::keyword("DROP"),
4876                            Ref::keyword("CLUSTERING"),
4877                            Ref::keyword("KEY"),
4878                        ]),
4879                        Sequence::new(vec_of_erased![
4880                            Ref::keyword("SUSPEND"),
4881                            Ref::keyword("RECLUSTER"),
4882                        ]),
4883                        Sequence::new(vec_of_erased![
4884                            Ref::keyword("RESUME"),
4885                            Ref::keyword("RECLUSTER"),
4886                        ]),
4887                        Ref::keyword("SUSPEND"),
4888                        Ref::keyword("RESUME"),
4889                        Sequence::new(vec_of_erased![
4890                            one_of(vec_of_erased![Ref::keyword("SET"), Ref::keyword("UNSET"),]),
4891                            one_of(vec_of_erased![
4892                                Ref::keyword("SECURE"),
4893                                Ref::new("CommentEqualsClauseSegment"),
4894                                Ref::new("TagEqualsSegment"),
4895                            ]),
4896                        ]),
4897                    ]),
4898                ])
4899                .to_matchable(),
4900            )
4901            .to_matchable()
4902            .into(),
4903        ),
4904        (
4905            "CreateFileFormatSegment".into(),
4906            NodeMatcher::new(
4907                SyntaxKind::CreateFileFormatSegment,
4908                Sequence::new(vec_of_erased![
4909                    Ref::keyword("CREATE"),
4910                    Ref::new("OrReplaceGrammar").optional(),
4911                    Sequence::new(vec_of_erased![Ref::keyword("FILE"), Ref::keyword("FORMAT"),]),
4912                    Ref::new("IfNotExistsGrammar").optional(),
4913                    Ref::new("ObjectReferenceSegment"),
4914                    one_of(vec_of_erased![
4915                        Ref::new("CsvFileFormatTypeParameters"),
4916                        Ref::new("JsonFileFormatTypeParameters"),
4917                        Ref::new("AvroFileFormatTypeParameters"),
4918                        Ref::new("OrcFileFormatTypeParameters"),
4919                        Ref::new("ParquetFileFormatTypeParameters"),
4920                        Ref::new("XmlFileFormatTypeParameters"),
4921                    ]),
4922                    Sequence::new(vec_of_erased![
4923                        Ref::new("CommaSegment").optional(),
4924                        Ref::new("CommentEqualsClauseSegment"),
4925                    ])
4926                    .config(|this| this.optional()),
4927                ])
4928                .to_matchable(),
4929            )
4930            .to_matchable()
4931            .into(),
4932        ),
4933        (
4934            "AlterFileFormatSegment".into(),
4935            NodeMatcher::new(
4936                SyntaxKind::AlterFileFormatSegment,
4937                Sequence::new(vec_of_erased![
4938                    Ref::keyword("ALTER"),
4939                    Sequence::new(vec_of_erased![Ref::keyword("FILE"), Ref::keyword("FORMAT"),]),
4940                    Ref::new("IfExistsGrammar").optional(),
4941                    Ref::new("ObjectReferenceSegment"),
4942                    one_of(vec_of_erased![
4943                        Sequence::new(vec_of_erased![
4944                            Ref::keyword("RENAME"),
4945                            Ref::keyword("TO"),
4946                            Ref::new("ObjectReferenceSegment"),
4947                        ]),
4948                        Sequence::new(vec_of_erased![
4949                            Ref::keyword("SET"),
4950                            one_of(vec_of_erased![
4951                                Ref::new("CsvFileFormatTypeParameters"),
4952                                Ref::new("JsonFileFormatTypeParameters"),
4953                                Ref::new("AvroFileFormatTypeParameters"),
4954                                Ref::new("OrcFileFormatTypeParameters"),
4955                                Ref::new("ParquetFileFormatTypeParameters"),
4956                                Ref::new("XmlFileFormatTypeParameters"),
4957                            ]),
4958                        ]),
4959                    ]),
4960                    Sequence::new(vec_of_erased![
4961                        Ref::new("CommaSegment").optional(),
4962                        Ref::new("CommentEqualsClauseSegment"),
4963                    ])
4964                    .config(|this| this.optional()),
4965                ])
4966                .to_matchable(),
4967            )
4968            .to_matchable()
4969            .into(),
4970        ),
4971        (
4972            "CsvFileFormatTypeParameters".into(),
4973            NodeMatcher::new(SyntaxKind::CsvFileFormatTypeParameters, {
4974                let file_format_type_parameter = one_of(vec_of_erased![
4975                    Sequence::new(vec_of_erased![
4976                        Ref::keyword("TYPE"),
4977                        Ref::new("EqualsSegment"),
4978                        one_of(vec_of_erased![
4979                            StringParser::new("'CSV'", SyntaxKind::FileType),
4980                            StringParser::new("CSV", SyntaxKind::FileType),
4981                        ]),
4982                    ]),
4983                    Sequence::new(vec_of_erased![
4984                        Ref::keyword("COMPRESSION"),
4985                        Ref::new("EqualsSegment"),
4986                        Ref::new("CompressionType"),
4987                    ]),
4988                    Sequence::new(vec_of_erased![
4989                        Ref::keyword("FILE_EXTENSION"),
4990                        Ref::new("EqualsSegment"),
4991                        Ref::new("QuotedLiteralSegment"),
4992                    ]),
4993                    Sequence::new(vec_of_erased![
4994                        Ref::keyword("SKIP_HEADER"),
4995                        Ref::new("EqualsSegment"),
4996                        Ref::new("IntegerSegment"),
4997                    ]),
4998                    Sequence::new(vec_of_erased![
4999                        one_of(vec_of_erased![
5000                            Ref::keyword("DATE_FORMAT"),
5001                            Ref::keyword("TIME_FORMAT"),
5002                            Ref::keyword("TIMESTAMP_FORMAT"),
5003                        ]),
5004                        Ref::new("EqualsSegment"),
5005                        one_of(vec_of_erased![
5006                            Ref::keyword("AUTO"),
5007                            Ref::new("QuotedLiteralSegment"),
5008                        ]),
5009                    ]),
5010                    Sequence::new(vec_of_erased![
5011                        Ref::keyword("BINARY_FORMAT"),
5012                        Ref::new("EqualsSegment"),
5013                        one_of(vec_of_erased![
5014                            Ref::keyword("HEX"),
5015                            Ref::keyword("BASE64"),
5016                            Ref::keyword("UTF8"),
5017                        ]),
5018                    ]),
5019                    Sequence::new(vec_of_erased![
5020                        one_of(vec_of_erased![
5021                            Ref::keyword("RECORD_DELIMITER"),
5022                            Ref::keyword("FIELD_DELIMITER"),
5023                            Ref::keyword("ESCAPE"),
5024                            Ref::keyword("ESCAPE_UNENCLOSED_FIELD"),
5025                            Ref::keyword("FIELD_OPTIONALLY_ENCLOSED_BY"),
5026                        ]),
5027                        Ref::new("EqualsSegment"),
5028                        one_of(vec_of_erased![
5029                            Ref::keyword("NONE"),
5030                            Ref::new("QuotedLiteralSegment"),
5031                        ]),
5032                    ]),
5033                    Sequence::new(vec_of_erased![
5034                        Ref::keyword("NULL_IF"),
5035                        Ref::new("EqualsSegment"),
5036                        Bracketed::new(vec_of_erased![
5037                            Delimited::new(vec_of_erased![Ref::new("QuotedLiteralSegment"),])
5038                                .config(|this| this.optional()),
5039                        ]),
5040                    ]),
5041                    Sequence::new(vec_of_erased![
5042                        one_of(vec_of_erased![
5043                            Ref::keyword("SKIP_BLANK_LINES"),
5044                            Ref::keyword("ERROR_ON_COLUMN_COUNT_MISMATCH"),
5045                            Ref::keyword("REPLACE_INVALID_CHARACTERS"),
5046                            Ref::keyword("VALIDATE_UTF8"),
5047                            Ref::keyword("EMPTY_FIELD_AS_NULL"),
5048                            Ref::keyword("SKIP_BYTE_ORDER_MARK"),
5049                            Ref::keyword("TRIM_SPACE"),
5050                        ]),
5051                        Ref::new("EqualsSegment"),
5052                        Ref::new("BooleanLiteralGrammar"),
5053                    ]),
5054                    Sequence::new(vec_of_erased![
5055                        Ref::keyword("ENCODING"),
5056                        Ref::new("EqualsSegment"),
5057                        one_of(vec_of_erased![
5058                            Ref::keyword("UTF8"),
5059                            Ref::new("QuotedLiteralSegment"),
5060                        ]),
5061                    ]),
5062                ]);
5063
5064                one_of(vec_of_erased![
5065                    Delimited::new(vec_of_erased![file_format_type_parameter.clone()]),
5066                    AnyNumberOf::new(vec_of_erased![file_format_type_parameter]),
5067                ])
5068                .to_matchable()
5069            })
5070            .to_matchable()
5071            .into(),
5072        ),
5073        (
5074            "JsonFileFormatTypeParameters".into(),
5075            NodeMatcher::new(SyntaxKind::JsonFileFormatTypeParameters, {
5076                let file_format_type_parameter = one_of(vec_of_erased![
5077                    Sequence::new(vec_of_erased![
5078                        Ref::keyword("TYPE"),
5079                        Ref::new("EqualsSegment"),
5080                        one_of(vec_of_erased![
5081                            StringParser::new("'JSON'", SyntaxKind::FileType),
5082                            StringParser::new("JSON", SyntaxKind::FileType),
5083                        ]),
5084                    ]),
5085                    Sequence::new(vec_of_erased![
5086                        Ref::keyword("COMPRESSION"),
5087                        Ref::new("EqualsSegment"),
5088                        Ref::new("CompressionType"),
5089                    ]),
5090                    Sequence::new(vec_of_erased![
5091                        one_of(vec_of_erased![
5092                            Ref::keyword("DATE_FORMAT"),
5093                            Ref::keyword("TIME_FORMAT"),
5094                            Ref::keyword("TIMESTAMP_FORMAT"),
5095                        ]),
5096                        Ref::new("EqualsSegment"),
5097                        one_of(vec_of_erased![
5098                            Ref::new("QuotedLiteralSegment"),
5099                            Ref::keyword("AUTO"),
5100                        ]),
5101                    ]),
5102                    Sequence::new(vec_of_erased![
5103                        Ref::keyword("BINARY_FORMAT"),
5104                        Ref::new("EqualsSegment"),
5105                        one_of(vec_of_erased![
5106                            Ref::keyword("HEX"),
5107                            Ref::keyword("BASE64"),
5108                            Ref::keyword("UTF8"),
5109                        ]),
5110                    ]),
5111                    Sequence::new(vec_of_erased![
5112                        Ref::keyword("NULL_IF"),
5113                        Ref::new("EqualsSegment"),
5114                        Bracketed::new(vec_of_erased![
5115                            Delimited::new(vec_of_erased![Ref::new("QuotedLiteralSegment"),])
5116                                .config(|this| this.optional()),
5117                        ]),
5118                    ]),
5119                    Sequence::new(vec_of_erased![
5120                        Ref::keyword("FILE_EXTENSION"),
5121                        Ref::new("EqualsSegment"),
5122                        Ref::new("QuotedLiteralSegment"),
5123                    ]),
5124                    Sequence::new(vec_of_erased![
5125                        one_of(vec_of_erased![
5126                            Ref::keyword("TRIM_SPACE"),
5127                            Ref::keyword("ENABLE_OCTAL"),
5128                            Ref::keyword("ALLOW_DUPLICATE"),
5129                            Ref::keyword("STRIP_OUTER_ARRAY"),
5130                            Ref::keyword("STRIP_NULL_VALUES"),
5131                            Ref::keyword("REPLACE_INVALID_CHARACTERS"),
5132                            Ref::keyword("IGNORE_UTF8_ERRORS"),
5133                            Ref::keyword("SKIP_BYTE_ORDER_MARK"),
5134                        ]),
5135                        Ref::new("EqualsSegment"),
5136                        Ref::new("BooleanLiteralGrammar"),
5137                    ]),
5138                ]);
5139
5140                one_of(vec_of_erased![
5141                    Delimited::new(vec_of_erased![file_format_type_parameter.clone()]),
5142                    AnyNumberOf::new(vec_of_erased![file_format_type_parameter]),
5143                ])
5144                .to_matchable()
5145            })
5146            .to_matchable()
5147            .into(),
5148        ),
5149        (
5150            "AvroFileFormatTypeParameters".into(),
5151            NodeMatcher::new(SyntaxKind::AvroFileFormatTypeParameters, {
5152                let file_format_type_parameter = one_of(vec_of_erased![
5153                    Sequence::new(vec_of_erased![
5154                        Ref::keyword("TYPE"),
5155                        Ref::new("EqualsSegment"),
5156                        one_of(vec_of_erased![
5157                            StringParser::new("'AVRO'", SyntaxKind::FileType),
5158                            StringParser::new("AVRO", SyntaxKind::FileType),
5159                        ]),
5160                    ]),
5161                    Sequence::new(vec_of_erased![
5162                        Ref::keyword("COMPRESSION"),
5163                        Ref::new("EqualsSegment"),
5164                        Ref::new("CompressionType"),
5165                    ]),
5166                    Sequence::new(vec_of_erased![
5167                        Ref::keyword("TRIM_SPACE"),
5168                        Ref::new("EqualsSegment"),
5169                        Ref::new("BooleanLiteralGrammar"),
5170                    ]),
5171                    Sequence::new(vec_of_erased![
5172                        Ref::keyword("NULL_IF"),
5173                        Ref::new("EqualsSegment"),
5174                        Bracketed::new(vec_of_erased![
5175                            Delimited::new(vec_of_erased![Ref::new("QuotedLiteralSegment"),])
5176                                .config(|this| this.optional()),
5177                        ]),
5178                    ]),
5179                ]);
5180
5181                one_of(vec_of_erased![
5182                    Delimited::new(vec_of_erased![file_format_type_parameter.clone()]),
5183                    AnyNumberOf::new(vec_of_erased![file_format_type_parameter]),
5184                ])
5185                .to_matchable()
5186            })
5187            .to_matchable()
5188            .into(),
5189        ),
5190        (
5191            "OrcFileFormatTypeParameters".into(),
5192            NodeMatcher::new(SyntaxKind::OrcFileFormatTypeParameters, {
5193                let file_format_type_parameter = one_of(vec_of_erased![
5194                    Sequence::new(vec_of_erased![
5195                        Ref::keyword("TYPE"),
5196                        Ref::new("EqualsSegment"),
5197                        one_of(vec_of_erased![
5198                            StringParser::new("'ORC'", SyntaxKind::FileType),
5199                            StringParser::new("ORC", SyntaxKind::FileType),
5200                        ]),
5201                    ]),
5202                    Sequence::new(vec_of_erased![
5203                        Ref::keyword("TRIM_SPACE"),
5204                        Ref::new("EqualsSegment"),
5205                        Ref::new("BooleanLiteralGrammar"),
5206                    ]),
5207                    Sequence::new(vec_of_erased![
5208                        Ref::keyword("NULL_IF"),
5209                        Ref::new("EqualsSegment"),
5210                        Bracketed::new(vec_of_erased![
5211                            Delimited::new(vec_of_erased![Ref::new("QuotedLiteralSegment"),])
5212                                .config(|this| this.optional()),
5213                        ]),
5214                    ]),
5215                ]);
5216
5217                one_of(vec_of_erased![
5218                    Delimited::new(vec_of_erased![file_format_type_parameter.clone()]),
5219                    AnyNumberOf::new(vec_of_erased![file_format_type_parameter]),
5220                ])
5221                .to_matchable()
5222            })
5223            .to_matchable()
5224            .into(),
5225        ),
5226        (
5227            "ParquetFileFormatTypeParameters".into(),
5228            NodeMatcher::new(SyntaxKind::ParquetFileFormatTypeParameters, {
5229                let file_format_type_parameter = one_of(vec_of_erased![
5230                    Sequence::new(vec_of_erased![
5231                        Ref::keyword("TYPE"),
5232                        Ref::new("EqualsSegment"),
5233                        one_of(vec_of_erased![
5234                            StringParser::new("'PARQUET'", SyntaxKind::FileType),
5235                            StringParser::new("PARQUET", SyntaxKind::FileType),
5236                        ]),
5237                    ]),
5238                    Sequence::new(vec_of_erased![
5239                        Ref::keyword("COMPRESSION"),
5240                        Ref::new("EqualsSegment"),
5241                        Ref::new("CompressionType"),
5242                    ]),
5243                    Sequence::new(vec_of_erased![
5244                        one_of(vec_of_erased![
5245                            Ref::keyword("SNAPPY_COMPRESSION"),
5246                            Ref::keyword("BINARY_AS_TEXT"),
5247                            Ref::keyword("TRIM_SPACE"),
5248                        ]),
5249                        Ref::new("EqualsSegment"),
5250                        Ref::new("BooleanLiteralGrammar"),
5251                    ]),
5252                    Sequence::new(vec_of_erased![
5253                        Ref::keyword("NULL_IF"),
5254                        Ref::new("EqualsSegment"),
5255                        Bracketed::new(vec_of_erased![
5256                            Delimited::new(vec_of_erased![Ref::new("QuotedLiteralSegment"),])
5257                                .config(|this| this.optional()),
5258                        ]),
5259                    ]),
5260                ]);
5261
5262                one_of(vec_of_erased![
5263                    Delimited::new(vec_of_erased![file_format_type_parameter.clone()]),
5264                    AnyNumberOf::new(vec_of_erased![file_format_type_parameter]),
5265                ])
5266                .to_matchable()
5267            })
5268            .to_matchable()
5269            .into(),
5270        ),
5271        (
5272            "XmlFileFormatTypeParameters".into(),
5273            NodeMatcher::new(SyntaxKind::XmlFileFormatTypeParameters, {
5274                let file_format_type_parameter = one_of(vec_of_erased![
5275                    Sequence::new(vec_of_erased![
5276                        Ref::keyword("TYPE"),
5277                        Ref::new("EqualsSegment"),
5278                        one_of(vec_of_erased![
5279                            StringParser::new("'XML'", SyntaxKind::FileType),
5280                            StringParser::new("XML", SyntaxKind::FileType),
5281                        ]),
5282                    ]),
5283                    Sequence::new(vec_of_erased![
5284                        Ref::keyword("COMPRESSION"),
5285                        Ref::new("EqualsSegment"),
5286                        Ref::new("CompressionType"),
5287                    ]),
5288                    Sequence::new(vec_of_erased![
5289                        one_of(vec_of_erased![
5290                            Ref::keyword("IGNORE_UTF8_ERRORS"),
5291                            Ref::keyword("PRESERVE_SPACE"),
5292                            Ref::keyword("STRIP_OUTER_ELEMENT"),
5293                            Ref::keyword("DISABLE_SNOWFLAKE_DATA"),
5294                            Ref::keyword("DISABLE_AUTO_CONVERT"),
5295                            Ref::keyword("SKIP_BYTE_ORDER_MARK"),
5296                        ]),
5297                        Ref::new("EqualsSegment"),
5298                        Ref::new("BooleanLiteralGrammar"),
5299                    ]),
5300                ]);
5301
5302                one_of(vec_of_erased![
5303                    Delimited::new(vec_of_erased![file_format_type_parameter.clone()]),
5304                    AnyNumberOf::new(vec_of_erased![file_format_type_parameter]),
5305                ])
5306                .to_matchable()
5307            })
5308            .to_matchable()
5309            .into(),
5310        ),
5311        (
5312            "AlterPipeSegment".into(),
5313            NodeMatcher::new(
5314                SyntaxKind::AlterPipeSegment,
5315                Sequence::new(vec_of_erased![
5316                    Ref::keyword("ALTER"),
5317                    Ref::keyword("PIPE"),
5318                    Ref::new("IfExistsGrammar").optional(),
5319                    Ref::new("ObjectReferenceSegment"),
5320                    one_of(vec_of_erased![
5321                        Sequence::new(vec_of_erased![
5322                            Ref::keyword("SET"),
5323                            AnyNumberOf::new(vec_of_erased![
5324                                Sequence::new(vec_of_erased![
5325                                    Ref::keyword("PIPE_EXECUTION_PAUSED"),
5326                                    Ref::new("EqualsSegment"),
5327                                    Ref::new("BooleanLiteralGrammar"),
5328                                ]),
5329                                Ref::new("CommentEqualsClauseSegment"),
5330                            ]),
5331                        ]),
5332                        Sequence::new(vec_of_erased![
5333                            Ref::keyword("UNSET"),
5334                            one_of(vec_of_erased![
5335                                Ref::keyword("PIPE_EXECUTION_PAUSED"),
5336                                Ref::keyword("COMMENT"),
5337                            ]),
5338                        ]),
5339                        Sequence::new(vec_of_erased![
5340                            Ref::keyword("SET"),
5341                            Ref::new("TagEqualsSegment"),
5342                        ]),
5343                        Sequence::new(vec_of_erased![
5344                            Ref::keyword("UNSET"),
5345                            Sequence::new(vec_of_erased![
5346                                Ref::keyword("TAG"),
5347                                Delimited::new(vec_of_erased![Ref::new("TagReferenceSegment"),]),
5348                            ]),
5349                        ]),
5350                        Sequence::new(vec_of_erased![
5351                            Ref::keyword("REFRESH"),
5352                            Sequence::new(vec_of_erased![
5353                                Ref::keyword("PREFIX"),
5354                                Ref::new("EqualsSegment"),
5355                                Ref::new("QuotedLiteralSegment"),
5356                            ])
5357                            .config(|this| this.optional()),
5358                            Sequence::new(vec_of_erased![
5359                                Ref::keyword("MODIFIED_AFTER"),
5360                                Ref::new("EqualsSegment"),
5361                                Ref::new("QuotedLiteralSegment"),
5362                            ])
5363                            .config(|this| this.optional()),
5364                        ]),
5365                    ]),
5366                    Ref::new("CommaSegment").optional(),
5367                ])
5368                .to_matchable(),
5369            )
5370            .to_matchable()
5371            .into(),
5372        ),
5373        (
5374            "FileFormatSegment".into(),
5375            NodeMatcher::new(
5376                SyntaxKind::FileFormatSegment,
5377                one_of(vec_of_erased![
5378                    one_of(vec_of_erased![
5379                        Ref::new("QuotedLiteralSegment"),
5380                        Ref::new("ObjectReferenceSegment"),
5381                    ]),
5382                    Bracketed::new(vec_of_erased![Sequence::new(vec_of_erased![
5383                        one_of(vec_of_erased![
5384                            Sequence::new(vec_of_erased![
5385                                Ref::keyword("FORMAT_NAME"),
5386                                Ref::new("EqualsSegment"),
5387                                one_of(vec_of_erased![
5388                                    Ref::new("QuotedLiteralSegment"),
5389                                    Ref::new("ObjectReferenceSegment"),
5390                                ]),
5391                            ]),
5392                            one_of(vec_of_erased![
5393                                Ref::new("CsvFileFormatTypeParameters"),
5394                                Ref::new("JsonFileFormatTypeParameters"),
5395                                Ref::new("AvroFileFormatTypeParameters"),
5396                                Ref::new("OrcFileFormatTypeParameters"),
5397                                Ref::new("ParquetFileFormatTypeParameters"),
5398                                Ref::new("XmlFileFormatTypeParameters"),
5399                            ]),
5400                        ]),
5401                        Ref::new("FormatTypeOptions").optional(),
5402                    ]),]),
5403                ])
5404                .to_matchable(),
5405            )
5406            .to_matchable()
5407            .into(),
5408        ),
5409        (
5410            "FormatTypeOptions".into(),
5411            NodeMatcher::new(
5412                SyntaxKind::FormatTypeOptions,
5413                one_of(vec_of_erased![
5414                    // COPY INTO <location>, open for extension
5415                    any_set_of(vec_of_erased![
5416                        Sequence::new(vec_of_erased![
5417                            Ref::keyword("COMPRESSION"),
5418                            Ref::new("EqualsSegment"),
5419                            Ref::new("CompressionType"),
5420                        ]),
5421                        Sequence::new(vec_of_erased![
5422                            Ref::keyword("RECORD_DELIMITER"),
5423                            Ref::new("EqualsSegment"),
5424                            one_of(vec_of_erased![
5425                                Ref::keyword("NONE"),
5426                                Ref::new("QuotedLiteralSegment"),
5427                            ]),
5428                        ]),
5429                        Sequence::new(vec_of_erased![
5430                            Ref::keyword("FIELD_DELIMITER"),
5431                            Ref::new("EqualsSegment"),
5432                            one_of(vec_of_erased![
5433                                Ref::keyword("NONE"),
5434                                Ref::new("QuotedLiteralSegment"),
5435                            ]),
5436                        ]),
5437                        Sequence::new(vec_of_erased![
5438                            Ref::keyword("ESCAPE"),
5439                            Ref::new("EqualsSegment"),
5440                            one_of(vec_of_erased![
5441                                Ref::keyword("NONE"),
5442                                Ref::new("QuotedLiteralSegment"),
5443                            ]),
5444                        ]),
5445                        Sequence::new(vec_of_erased![
5446                            Ref::keyword("ESCAPE_UNENCLOSED_FIELD"),
5447                            Ref::new("EqualsSegment"),
5448                            one_of(vec_of_erased![
5449                                Ref::keyword("NONE"),
5450                                Ref::new("QuotedLiteralSegment"),
5451                            ]),
5452                        ]),
5453                        Sequence::new(vec_of_erased![
5454                            Ref::keyword("DATA_FORMAT"),
5455                            Ref::new("EqualsSegment"),
5456                            one_of(vec_of_erased![
5457                                Ref::keyword("AUTO"),
5458                                Ref::new("QuotedLiteralSegment"),
5459                            ]),
5460                        ]),
5461                        Sequence::new(vec_of_erased![
5462                            Ref::keyword("TIME_FORMAT"),
5463                            Ref::new("EqualsSegment"),
5464                            one_of(vec_of_erased![
5465                                Ref::keyword("NONE"),
5466                                Ref::new("QuotedLiteralSegment"),
5467                            ]),
5468                        ]),
5469                        Sequence::new(vec_of_erased![
5470                            Ref::keyword("TIMESTAMP_FORMAT"),
5471                            Ref::new("EqualsSegment"),
5472                            one_of(vec_of_erased![
5473                                Ref::keyword("NONE"),
5474                                Ref::new("QuotedLiteralSegment"),
5475                            ]),
5476                        ]),
5477                        Sequence::new(vec_of_erased![
5478                            Ref::keyword("BINARY_FORMAT"),
5479                            Ref::new("EqualsSegment"),
5480                            one_of(vec_of_erased![
5481                                Ref::keyword("HEX"),
5482                                Ref::keyword("BASE64"),
5483                                Ref::keyword("UTF8"),
5484                            ]),
5485                        ]),
5486                        Sequence::new(vec_of_erased![
5487                            Ref::keyword("FIELD_OPTIONALITY_ENCLOSED_BY"),
5488                            Ref::new("EqualsSegment"),
5489                            one_of(vec_of_erased![
5490                                Ref::keyword("NONE"),
5491                                Ref::new("QuotedLiteralSegment"),
5492                            ]),
5493                        ]),
5494                        Sequence::new(vec_of_erased![
5495                            Ref::keyword("NULL_IF"),
5496                            Ref::new("EqualsSegment"),
5497                            Bracketed::new(vec_of_erased![
5498                                Delimited::new(vec_of_erased![Ref::new("QuotedLiteralSegment"),])
5499                                    .config(|this| this.optional()),
5500                            ]),
5501                        ]),
5502                        Sequence::new(vec_of_erased![
5503                            Ref::keyword("EMPTY_FIELD_AS_NULL"),
5504                            Ref::new("EqualsSegment"),
5505                            Ref::new("BooleanLiteralGrammar"),
5506                        ]),
5507                        Sequence::new(vec_of_erased![
5508                            Ref::keyword("SNAPPY_COMPRESSION"),
5509                            Ref::new("EqualsSegment"),
5510                            Ref::new("BooleanLiteralGrammar"),
5511                        ]),
5512                    ]),
5513                    // COPY INTO <table>, open for extension
5514                    any_set_of(vec_of_erased![]),
5515                ])
5516                .to_matchable(),
5517            )
5518            .to_matchable()
5519            .into(),
5520        ),
5521        (
5522            "CreateExternalTableSegment".into(),
5523            NodeMatcher::new(
5524                SyntaxKind::CreateExternalTableStatement,
5525                Sequence::new(vec_of_erased![
5526                    Ref::keyword("CREATE"),
5527                    Sequence::new(vec_of_erased![Ref::keyword("OR"), Ref::keyword("REPLACE"),])
5528                        .config(|this| this.optional()),
5529                    Ref::keyword("EXTERNAL"),
5530                    Ref::keyword("TABLE"),
5531                    Sequence::new(vec_of_erased![
5532                        Ref::keyword("IF"),
5533                        Ref::keyword("NOT"),
5534                        Ref::keyword("EXISTS"),
5535                    ])
5536                    .config(|this| this.optional()),
5537                    Ref::new("TableReferenceSegment"),
5538                    Bracketed::new(vec_of_erased![Delimited::new(vec_of_erased![
5539                        Sequence::new(vec_of_erased![
5540                            Ref::new("SingleIdentifierGrammar"),
5541                            Ref::new("DatatypeSegment"),
5542                            Ref::keyword("AS"),
5543                            optionally_bracketed(vec_of_erased![Sequence::new(vec_of_erased![
5544                                Ref::new("ExpressionSegment"),
5545                                Ref::new("TableConstraintSegment").optional(),
5546                                Sequence::new(vec_of_erased![
5547                                    Ref::keyword("NOT").optional(),
5548                                    Ref::keyword("NULL").optional(),
5549                                ])
5550                                .config(|this| this.optional()),
5551                            ])]),
5552                        ])
5553                    ])])
5554                    .config(|this| this.optional()),
5555                    any_set_of(vec_of_erased![
5556                        Sequence::new(vec_of_erased![
5557                            Ref::keyword("INTEGRATION"),
5558                            Ref::new("EqualsSegment"),
5559                            Ref::new("QuotedLiteralSegment"),
5560                        ]),
5561                        Sequence::new(vec_of_erased![
5562                            Ref::keyword("PARTITION"),
5563                            Ref::keyword("BY"),
5564                            Bracketed::new(vec_of_erased![Delimited::new(vec_of_erased![
5565                                Ref::new("SingleIdentifierGrammar"),
5566                            ]),]),
5567                        ]),
5568                        Sequence::new(vec_of_erased![
5569                            Sequence::new(vec_of_erased![Ref::keyword("WITH")])
5570                                .config(|this| this.optional()),
5571                            Ref::keyword("LOCATION"),
5572                            Ref::new("EqualsSegment"),
5573                            Ref::new("StagePath"),
5574                        ]),
5575                        Sequence::new(vec_of_erased![
5576                            Ref::keyword("REFRESH_ON_CREATE"),
5577                            Ref::new("EqualsSegment"),
5578                            Ref::new("BooleanLiteralGrammar"),
5579                        ]),
5580                        Sequence::new(vec_of_erased![
5581                            Ref::keyword("AUTO_REFRESH"),
5582                            Ref::new("EqualsSegment"),
5583                            Ref::new("BooleanLiteralGrammar"),
5584                        ]),
5585                        Sequence::new(vec_of_erased![
5586                            Ref::keyword("PATTERN"),
5587                            Ref::new("EqualsSegment"),
5588                            Ref::new("QuotedLiteralSegment"),
5589                        ]),
5590                        Sequence::new(vec_of_erased![
5591                            Ref::keyword("FILE_FORMAT"),
5592                            Ref::new("EqualsSegment"),
5593                            Ref::new("FileFormatSegment"),
5594                        ]),
5595                        Sequence::new(vec_of_erased![
5596                            Ref::keyword("AWS_SNS_TOPIC"),
5597                            Ref::new("EqualsSegment"),
5598                            Ref::new("QuotedLiteralSegment"),
5599                        ]),
5600                        Sequence::new(
5601                            vec_of_erased![Ref::keyword("COPY"), Ref::keyword("GRANTS"),]
5602                        ),
5603                        Sequence::new(vec_of_erased![
5604                            Sequence::new(vec_of_erased![Ref::keyword("WITH")])
5605                                .config(|this| this.optional()),
5606                            Ref::keyword("ROW"),
5607                            Ref::keyword("ACCESS"),
5608                            Ref::keyword("POLICY"),
5609                            Ref::new("NakedIdentifierSegment"),
5610                        ]),
5611                        Ref::new("TagBracketedEqualsSegment"),
5612                        Ref::new("CommentEqualsClauseSegment"),
5613                    ]),
5614                ])
5615                .to_matchable(),
5616            )
5617            .to_matchable()
5618            .into(),
5619        ),
5620    ]);
5621
5622    snowflake_dialect.replace_grammar(
5623        "TableExpressionSegment",
5624        one_of(vec_of_erased![
5625            Ref::new("BareFunctionSegment"),
5626            Ref::new("FunctionSegment"),
5627            Ref::new("TableReferenceSegment"),
5628            Bracketed::new(vec_of_erased![Ref::new("SelectableGrammar")]),
5629            Ref::new("ValuesClauseSegment"),
5630            Sequence::new(vec_of_erased![
5631                Ref::new("StagePath"),
5632                Bracketed::new(vec_of_erased![Delimited::new(vec_of_erased![
5633                    Sequence::new(vec_of_erased![
5634                        Ref::keyword("FILE_FORMAT"),
5635                        Ref::new("ParameterAssignerSegment"),
5636                        Ref::new("FileFormatSegment"),
5637                    ]),
5638                    Sequence::new(vec_of_erased![
5639                        Ref::keyword("PATTERN"),
5640                        Ref::new("ParameterAssignerSegment"),
5641                        Ref::new("QuotedLiteralSegment"),
5642                    ]),
5643                ]),])
5644                .config(|this| this.optional()),
5645            ]),
5646        ])
5647        .to_matchable(),
5648    );
5649
5650    snowflake_dialect.add([
5651        (
5652            "PartitionBySegment".into(),
5653            NodeMatcher::new(
5654                SyntaxKind::PartitionBySegment,
5655                Sequence::new(vec_of_erased![
5656                    Ref::keyword("PARTITION"),
5657                    Ref::keyword("BY"),
5658                    MetaSegment::indent(),
5659                    optionally_bracketed(vec_of_erased![Delimited::new(vec_of_erased![Ref::new(
5660                        "ExpressionSegment"
5661                    )]),]),
5662                    MetaSegment::dedent(),
5663                ])
5664                .to_matchable(),
5665            )
5666            .to_matchable()
5667            .into(),
5668        ),
5669        (
5670            "CopyIntoLocationStatementSegment".into(),
5671            NodeMatcher::new(
5672                SyntaxKind::CopyIntoLocationStatement,
5673                Sequence::new(vec_of_erased![
5674                    Ref::keyword("COPY"),
5675                    Ref::keyword("INTO"),
5676                    Ref::new("StorageLocation"),
5677                    Bracketed::new(vec_of_erased![Delimited::new(vec_of_erased![Ref::new(
5678                        "ColumnReferenceSegment"
5679                    )]),])
5680                    .config(|this| this.optional()),
5681                    Sequence::new(vec_of_erased![
5682                        Ref::keyword("FROM"),
5683                        one_of(vec_of_erased![
5684                            Ref::new("TableReferenceSegment"),
5685                            Bracketed::new(vec_of_erased![Ref::new("SelectStatementSegment")]),
5686                        ]),
5687                    ])
5688                    .config(|this| this.optional()),
5689                    one_of(vec_of_erased![
5690                        Ref::new("S3ExternalStageParameters"),
5691                        Ref::new("AzureBlobStorageExternalStageParameters"),
5692                    ])
5693                    .config(|this| this.optional()),
5694                    Ref::new("InternalStageParameters").optional(),
5695                    any_set_of(vec_of_erased![
5696                        Ref::new("PartitionBySegment"),
5697                        Sequence::new(vec_of_erased![
5698                            Ref::keyword("FILE_FORMAT"),
5699                            Ref::new("EqualsSegment"),
5700                            Ref::new("FileFormatSegment"),
5701                        ]),
5702                        Ref::new("CopyOptionsSegment"),
5703                        Sequence::new(vec_of_erased![
5704                            Ref::keyword("VALIDATION_MODE"),
5705                            Ref::new("EqualsSegment"),
5706                            Ref::new("ValidationModeOptionSegment"),
5707                        ]),
5708                        Sequence::new(vec_of_erased![
5709                            Ref::keyword("HEADER"),
5710                            Ref::new("EqualsSegment"),
5711                            Ref::new("BooleanLiteralGrammar"),
5712                        ]),
5713                    ]),
5714                ])
5715                .to_matchable(),
5716            )
5717            .to_matchable()
5718            .into(),
5719        ),
5720        (
5721            "CopyIntoTableStatementSegment".into(),
5722            NodeMatcher::new(
5723                SyntaxKind::CopyIntoTableStatement,
5724                Sequence::new(vec_of_erased![
5725                    Ref::keyword("COPY"),
5726                    Ref::keyword("INTO"),
5727                    Ref::new("TableReferenceSegment"),
5728                    Bracketed::new(vec_of_erased![Delimited::new(vec_of_erased![Ref::new(
5729                        "ColumnReferenceSegment"
5730                    )]),])
5731                    .config(|this| this.optional()),
5732                    Sequence::new(vec_of_erased![
5733                        Ref::keyword("FROM"),
5734                        one_of(vec_of_erased![
5735                            Ref::new("StorageLocation"),
5736                            Bracketed::new(vec_of_erased![Ref::new("SelectStatementSegment")]),
5737                        ]),
5738                    ])
5739                    .config(|this| this.optional()),
5740                    one_of(vec_of_erased![
5741                        Ref::new("S3ExternalStageParameters"),
5742                        Ref::new("AzureBlobStorageExternalStageParameters"),
5743                    ])
5744                    .config(|this| this.optional()),
5745                    Ref::new("InternalStageParameters").optional(),
5746                    any_set_of(vec_of_erased![
5747                        Sequence::new(vec_of_erased![
5748                            Ref::keyword("FILES"),
5749                            Ref::new("EqualsSegment"),
5750                            Bracketed::new(vec_of_erased![Delimited::new(vec_of_erased![
5751                                Ref::new("QuotedLiteralSegment")
5752                            ]),]),
5753                        ]),
5754                        Sequence::new(vec_of_erased![
5755                            Ref::keyword("PATTERN"),
5756                            Ref::new("EqualsSegment"),
5757                            one_of(vec_of_erased![
5758                                Ref::new("QuotedLiteralSegment"),
5759                                Ref::new("ReferencedVariableNameSegment"),
5760                            ]),
5761                        ]),
5762                        Sequence::new(vec_of_erased![
5763                            Ref::keyword("FILE_FORMAT"),
5764                            Ref::new("EqualsSegment"),
5765                            Ref::new("FileFormatSegment"),
5766                        ]),
5767                        Ref::new("CopyOptionsSegment"),
5768                    ]),
5769                    Sequence::new(vec_of_erased![
5770                        Ref::keyword("VALIDATION_MODE"),
5771                        Ref::new("EqualsSegment"),
5772                        Ref::new("ValidationModeOptionSegment"),
5773                    ])
5774                    .config(|this| this.optional()),
5775                ])
5776                .to_matchable(),
5777            )
5778            .to_matchable()
5779            .into(),
5780        ),
5781        (
5782            "StorageLocation".into(),
5783            NodeMatcher::new(
5784                SyntaxKind::StorageLocation,
5785                one_of(vec_of_erased![
5786                    Ref::new("StagePath"),
5787                    Ref::new("S3Path"),
5788                    Ref::new("GCSPath"),
5789                    Ref::new("AzureBlobStoragePath"),
5790                ])
5791                .to_matchable(),
5792            )
5793            .to_matchable()
5794            .into(),
5795        ),
5796        (
5797            "InternalStageParameters".into(),
5798            NodeMatcher::new(
5799                SyntaxKind::StageParameters,
5800                Sequence::new(vec_of_erased![
5801                    Sequence::new(vec_of_erased![
5802                        Ref::keyword("ENCRYPTION"),
5803                        Ref::new("EqualsSegment"),
5804                        Bracketed::new(vec_of_erased![
5805                            Ref::keyword("TYPE"),
5806                            Ref::new("EqualsSegment"),
5807                            Ref::new("SnowflakeEncryptionOption"),
5808                        ]),
5809                    ])
5810                    .config(|this| this.optional()),
5811                ])
5812                .to_matchable(),
5813            )
5814            .to_matchable()
5815            .into(),
5816        ),
5817        (
5818            "S3ExternalStageParameters".into(),
5819            NodeMatcher::new(
5820                SyntaxKind::S3ExternalStageParameters,
5821                Sequence::new(vec_of_erased![
5822                    one_of(vec_of_erased![
5823                        Sequence::new(vec_of_erased![
5824                            Ref::keyword("STORAGE_INTEGRATION"),
5825                            Ref::new("EqualsSegment"),
5826                            Ref::new("ObjectReferenceSegment"),
5827                        ]),
5828                        Sequence::new(vec_of_erased![
5829                            Ref::keyword("CREDENTIALS"),
5830                            Ref::new("EqualsSegment"),
5831                            Bracketed::new(vec_of_erased![one_of(vec_of_erased![
5832                                Sequence::new(vec_of_erased![
5833                                    Ref::keyword("AWS_KEY_ID"),
5834                                    Ref::new("EqualsSegment"),
5835                                    Ref::new("QuotedLiteralSegment"),
5836                                    Ref::keyword("AWS_SECRET_KEY"),
5837                                    Ref::new("EqualsSegment"),
5838                                    Ref::new("QuotedLiteralSegment"),
5839                                    Sequence::new(vec_of_erased![
5840                                        Ref::keyword("AWS_TOKEN"),
5841                                        Ref::new("EqualsSegment"),
5842                                        Ref::new("QuotedLiteralSegment"),
5843                                    ])
5844                                    .config(|this| this.optional()),
5845                                ]),
5846                                Sequence::new(vec_of_erased![
5847                                    Ref::keyword("AWS_ROLE"),
5848                                    Ref::new("EqualsSegment"),
5849                                    Ref::new("QuotedLiteralSegment"),
5850                                ]),
5851                            ]),]),
5852                        ]),
5853                    ])
5854                    .config(|this| this.optional()),
5855                    Sequence::new(vec_of_erased![
5856                        Ref::keyword("ENCRYPTION"),
5857                        Ref::new("EqualsSegment"),
5858                        Bracketed::new(vec_of_erased![one_of(vec_of_erased![
5859                            Sequence::new(vec_of_erased![
5860                                Sequence::new(vec_of_erased![
5861                                    Ref::keyword("TYPE"),
5862                                    Ref::new("EqualsSegment"),
5863                                    Ref::new("S3EncryptionOption"),
5864                                ])
5865                                .config(|this| this.optional()),
5866                                Ref::keyword("MASTER_KEY"),
5867                                Ref::new("EqualsSegment"),
5868                                Ref::new("QuotedLiteralSegment"),
5869                            ]),
5870                            Sequence::new(vec_of_erased![
5871                                Ref::keyword("TYPE"),
5872                                Ref::new("EqualsSegment"),
5873                                Ref::new("S3EncryptionOption"),
5874                            ]),
5875                            Sequence::new(vec_of_erased![
5876                                Ref::keyword("TYPE"),
5877                                Ref::new("EqualsSegment"),
5878                                Ref::new("S3EncryptionOption"),
5879                                Sequence::new(vec_of_erased![
5880                                    Ref::keyword("KMS_KEY_ID"),
5881                                    Ref::new("EqualsSegment"),
5882                                    Ref::new("QuotedLiteralSegment"),
5883                                ])
5884                                .config(|this| this.optional()),
5885                            ]),
5886                            Sequence::new(vec_of_erased![
5887                                Ref::keyword("TYPE"),
5888                                Ref::new("EqualsSegment"),
5889                                Ref::keyword("NONE"),
5890                            ]),
5891                        ]),]),
5892                    ])
5893                    .config(|this| this.optional()),
5894                ])
5895                .to_matchable(),
5896            )
5897            .to_matchable()
5898            .into(),
5899        ),
5900        (
5901            "GCSExternalStageParameters".into(),
5902            NodeMatcher::new(
5903                SyntaxKind::GcsExternalStageParameters,
5904                Sequence::new(vec_of_erased![
5905                    Sequence::new(vec_of_erased![
5906                        Ref::keyword("STORAGE_INTEGRATION"),
5907                        Ref::new("EqualsSegment"),
5908                        Ref::new("ObjectReferenceSegment"),
5909                    ])
5910                    .config(|this| this.optional()),
5911                    Sequence::new(vec_of_erased![
5912                        Ref::keyword("ENCRYPTION"),
5913                        Ref::new("EqualsSegment"),
5914                        Bracketed::new(vec_of_erased![Sequence::new(vec_of_erased![
5915                            Ref::keyword("TYPE"),
5916                            Ref::new("EqualsSegment"),
5917                            one_of(vec_of_erased![
5918                                Sequence::new(vec_of_erased![
5919                                    Ref::new("GCSEncryptionOption"),
5920                                    Sequence::new(vec_of_erased![
5921                                        Ref::keyword("KMS_KEY_ID"),
5922                                        Ref::new("EqualsSegment"),
5923                                        Ref::new("QuotedLiteralSegment"),
5924                                    ])
5925                                    .config(|this| this.optional()),
5926                                ]),
5927                                Ref::keyword("NONE"),
5928                            ]),
5929                        ]),]),
5930                    ])
5931                    .config(|this| this.optional()),
5932                ])
5933                .to_matchable(),
5934            )
5935            .to_matchable()
5936            .into(),
5937        ),
5938        (
5939            "AzureBlobStorageExternalStageParameters".into(),
5940            NodeMatcher::new(
5941                SyntaxKind::AzureBlobStorageExternalStageParameters,
5942                Sequence::new(vec_of_erased![
5943                    one_of(vec_of_erased![
5944                        Sequence::new(vec_of_erased![
5945                            Ref::keyword("STORAGE_INTEGRATION"),
5946                            Ref::new("EqualsSegment"),
5947                            Ref::new("ObjectReferenceSegment"),
5948                        ]),
5949                        Sequence::new(vec_of_erased![
5950                            Ref::keyword("CREDENTIALS"),
5951                            Ref::new("EqualsSegment"),
5952                            Bracketed::new(vec_of_erased![Sequence::new(vec_of_erased![
5953                                Ref::keyword("AZURE_SAS_TOKEN"),
5954                                Ref::new("EqualsSegment"),
5955                                Ref::new("QuotedLiteralSegment"),
5956                            ]),]),
5957                        ]),
5958                    ])
5959                    .config(|this| this.optional()),
5960                    Sequence::new(vec_of_erased![
5961                        Ref::keyword("ENCRYPTION"),
5962                        Ref::new("EqualsSegment"),
5963                        Bracketed::new(vec_of_erased![Sequence::new(vec_of_erased![
5964                            Ref::keyword("TYPE"),
5965                            Ref::new("EqualsSegment"),
5966                            one_of(vec_of_erased![
5967                                Sequence::new(vec_of_erased![
5968                                    Ref::new("AzureBlobStorageEncryptionOption"),
5969                                    Sequence::new(vec_of_erased![
5970                                        Ref::keyword("MASTER_KEY"),
5971                                        Ref::new("EqualsSegment"),
5972                                        Ref::new("QuotedLiteralSegment"),
5973                                    ])
5974                                    .config(|this| this.optional()),
5975                                ]),
5976                                Ref::keyword("NONE"),
5977                            ]),
5978                        ]),]),
5979                    ])
5980                    .config(|this| this.optional()),
5981                ])
5982                .to_matchable(),
5983            )
5984            .to_matchable()
5985            .into(),
5986        ),
5987        (
5988            "CreateStageSegment".into(),
5989            NodeMatcher::new(
5990                SyntaxKind::CreateStageStatement,
5991                Sequence::new(vec_of_erased![
5992                    Ref::keyword("CREATE"),
5993                    Sequence::new(vec_of_erased![Ref::keyword("OR"), Ref::keyword("REPLACE"),])
5994                        .config(|this| this.optional()),
5995                    Ref::keyword("TEMPORARY").optional(),
5996                    Ref::keyword("STAGE"),
5997                    Sequence::new(vec_of_erased![
5998                        Ref::keyword("IF"),
5999                        Ref::keyword("NOT"),
6000                        Ref::keyword("EXISTS"),
6001                    ])
6002                    .config(|this| this.optional()),
6003                    Ref::new("ObjectReferenceSegment"),
6004                    MetaSegment::indent(),
6005                    one_of(vec_of_erased![
6006                        // Internal stages
6007                        Sequence::new(vec_of_erased![
6008                            Ref::new("InternalStageParameters").optional(),
6009                            Sequence::new(vec_of_erased![
6010                                Ref::keyword("DIRECTORY"),
6011                                Ref::new("EqualsSegment"),
6012                                Bracketed::new(vec_of_erased![Sequence::new(vec_of_erased![
6013                                    Ref::keyword("ENABLE"),
6014                                    Ref::new("EqualsSegment"),
6015                                    Ref::new("BooleanLiteralGrammar"),
6016                                ]),]),
6017                            ])
6018                            .config(|this| this.optional()),
6019                        ]),
6020                        // External S3 stage
6021                        Sequence::new(vec_of_erased![
6022                            Ref::keyword("URL"),
6023                            Ref::new("EqualsSegment"),
6024                            Ref::new("S3Path"),
6025                            Ref::new("S3ExternalStageParameters").optional(),
6026                            Sequence::new(vec_of_erased![
6027                                Ref::keyword("DIRECTORY"),
6028                                Ref::new("EqualsSegment"),
6029                                Bracketed::new(vec_of_erased![
6030                                    Sequence::new(vec_of_erased![
6031                                        Ref::keyword("ENABLE"),
6032                                        Ref::new("EqualsSegment"),
6033                                        Ref::new("BooleanLiteralGrammar"),
6034                                    ]),
6035                                    Sequence::new(vec_of_erased![
6036                                        Ref::keyword("AUTO_REFRESH"),
6037                                        Ref::new("EqualsSegment"),
6038                                        Ref::new("BooleanLiteralGrammar"),
6039                                    ])
6040                                    .config(|this| this.optional()),
6041                                ]),
6042                            ])
6043                            .config(|this| this.optional()),
6044                        ]),
6045                        // External GCS stage
6046                        Sequence::new(vec_of_erased![
6047                            Ref::keyword("URL"),
6048                            Ref::new("EqualsSegment"),
6049                            Ref::new("GCSPath"),
6050                            Ref::new("GCSExternalStageParameters").optional(),
6051                            Sequence::new(vec_of_erased![
6052                                Ref::keyword("DIRECTORY"),
6053                                Ref::new("EqualsSegment"),
6054                                Bracketed::new(vec_of_erased![
6055                                    Sequence::new(vec_of_erased![
6056                                        Ref::keyword("ENABLE"),
6057                                        Ref::new("EqualsSegment"),
6058                                        Ref::new("BooleanLiteralGrammar"),
6059                                    ]),
6060                                    Sequence::new(vec_of_erased![
6061                                        Ref::keyword("AUTO_REFRESH"),
6062                                        Ref::new("EqualsSegment"),
6063                                        Ref::new("BooleanLiteralGrammar"),
6064                                    ])
6065                                    .config(|this| this.optional()),
6066                                    Sequence::new(vec_of_erased![
6067                                        Ref::keyword("NOTIFICATION_INTEGRATION"),
6068                                        Ref::new("EqualsSegment"),
6069                                        one_of(vec_of_erased![
6070                                            Ref::new("NakedIdentifierSegment"),
6071                                            Ref::new("QuotedLiteralSegment"),
6072                                        ]),
6073                                    ])
6074                                    .config(|this| this.optional()),
6075                                ]),
6076                            ])
6077                            .config(|this| this.optional()),
6078                        ]),
6079                        // External Azure Blob Storage stage
6080                        Sequence::new(vec_of_erased![
6081                            Ref::keyword("URL"),
6082                            Ref::new("EqualsSegment"),
6083                            Ref::new("AzureBlobStoragePath"),
6084                            Ref::new("AzureBlobStorageExternalStageParameters").optional(),
6085                            Sequence::new(vec_of_erased![
6086                                Ref::keyword("DIRECTORY"),
6087                                Ref::new("EqualsSegment"),
6088                                Bracketed::new(vec_of_erased![
6089                                    Sequence::new(vec_of_erased![
6090                                        Ref::keyword("ENABLE"),
6091                                        Ref::new("EqualsSegment"),
6092                                        Ref::new("BooleanLiteralGrammar"),
6093                                    ]),
6094                                    Sequence::new(vec_of_erased![
6095                                        Ref::keyword("AUTO_REFRESH"),
6096                                        Ref::new("EqualsSegment"),
6097                                        Ref::new("BooleanLiteralGrammar"),
6098                                    ])
6099                                    .config(|this| this.optional()),
6100                                    Sequence::new(vec_of_erased![
6101                                        Ref::keyword("NOTIFICATION_INTEGRATION"),
6102                                        Ref::new("EqualsSegment"),
6103                                        one_of(vec_of_erased![
6104                                            Ref::new("NakedIdentifierSegment"),
6105                                            Ref::new("QuotedLiteralSegment"),
6106                                        ]),
6107                                    ])
6108                                    .config(|this| this.optional()),
6109                                ]),
6110                            ])
6111                            .config(|this| this.optional()),
6112                        ]),
6113                    ])
6114                    .config(|this| this.optional()),
6115                    Sequence::new(vec_of_erased![
6116                        Ref::keyword("FILE_FORMAT"),
6117                        Ref::new("EqualsSegment"),
6118                        Ref::new("FileFormatSegment"),
6119                    ])
6120                    .config(|this| this.optional()),
6121                    Sequence::new(vec_of_erased![
6122                        Ref::keyword("COPY_OPTIONS"),
6123                        Ref::new("EqualsSegment"),
6124                        Bracketed::new(vec_of_erased![Ref::new("CopyOptionsSegment")]),
6125                    ])
6126                    .config(|this| this.optional()),
6127                    Ref::new("TagBracketedEqualsSegment").optional(),
6128                    Ref::new("CommentEqualsClauseSegment").optional(),
6129                    MetaSegment::dedent(),
6130                ])
6131                .to_matchable(),
6132            )
6133            .to_matchable()
6134            .into(),
6135        ),
6136        (
6137            "AlterStageSegment".into(),
6138            NodeMatcher::new(
6139                SyntaxKind::AlterStageStatement,
6140                Sequence::new(vec_of_erased![
6141                    Ref::keyword("ALTER"),
6142                    Ref::keyword("STAGE"),
6143                    Sequence::new(vec_of_erased![Ref::keyword("IF"), Ref::keyword("EXISTS"),])
6144                        .config(|this| this.optional()),
6145                    Ref::new("ObjectReferenceSegment"),
6146                    one_of(vec_of_erased![
6147                        Sequence::new(vec_of_erased![
6148                            Ref::keyword("RENAME"),
6149                            Ref::keyword("TO"),
6150                            Ref::new("ObjectReferenceSegment"),
6151                        ]),
6152                        Sequence::new(vec_of_erased![
6153                            Ref::keyword("SET"),
6154                            MetaSegment::indent(),
6155                            one_of(vec_of_erased![
6156                                Sequence::new(vec_of_erased![
6157                                    one_of(vec_of_erased![
6158                                        Ref::new("InternalStageParameters"),
6159                                        Sequence::new(vec_of_erased![
6160                                            Sequence::new(vec_of_erased![
6161                                                Ref::keyword("URL"),
6162                                                Ref::new("EqualsSegment"),
6163                                                Ref::new("S3Path"),
6164                                            ])
6165                                            .config(|this| this.optional()),
6166                                            Ref::new("S3ExternalStageParameters").optional(),
6167                                        ]),
6168                                        Sequence::new(vec_of_erased![
6169                                            Sequence::new(vec_of_erased![
6170                                                Ref::keyword("URL"),
6171                                                Ref::new("EqualsSegment"),
6172                                                Ref::new("GCSPath"),
6173                                            ])
6174                                            .config(|this| this.optional()),
6175                                            Ref::new("GCSExternalStageParameters").optional(),
6176                                        ]),
6177                                        Sequence::new(vec_of_erased![
6178                                            Sequence::new(vec_of_erased![
6179                                                Ref::keyword("URL"),
6180                                                Ref::new("EqualsSegment"),
6181                                                Ref::new("AzureBlobStoragePath"),
6182                                            ])
6183                                            .config(|this| this.optional()),
6184                                            Ref::new("AzureBlobStorageExternalStageParameters")
6185                                                .optional(),
6186                                        ]),
6187                                    ])
6188                                    .config(|this| this.optional()),
6189                                    Sequence::new(vec_of_erased![
6190                                        Ref::keyword("FILE_FORMAT"),
6191                                        Ref::new("EqualsSegment"),
6192                                        Ref::new("FileFormatSegment"),
6193                                    ])
6194                                    .config(|this| this.optional()),
6195                                    Sequence::new(vec_of_erased![
6196                                        Ref::keyword("COPY_OPTIONS"),
6197                                        Ref::new("EqualsSegment"),
6198                                        Bracketed::new(vec_of_erased![Ref::new(
6199                                            "CopyOptionsSegment"
6200                                        )]),
6201                                    ])
6202                                    .config(|this| this.optional()),
6203                                    Ref::new("CommentEqualsClauseSegment").optional(),
6204                                ]),
6205                                Ref::new("TagEqualsSegment"),
6206                            ]),
6207                            MetaSegment::dedent(),
6208                        ]),
6209                        Sequence::new(vec_of_erased![
6210                            Ref::keyword("REFRESH"),
6211                            Sequence::new(vec_of_erased![
6212                                Ref::keyword("SUBPATH"),
6213                                Ref::new("EqualsSegment"),
6214                                Ref::new("QuotedLiteralSegment"),
6215                            ])
6216                            .config(|this| this.optional()),
6217                        ]),
6218                    ]),
6219                ])
6220                .to_matchable(),
6221            )
6222            .to_matchable()
6223            .into(),
6224        ),
6225        (
6226            "CreateStreamStatementSegment".into(),
6227            NodeMatcher::new(
6228                SyntaxKind::CreateStreamStatement,
6229                Sequence::new(vec_of_erased![
6230                    Ref::keyword("CREATE"),
6231                    Ref::new("OrReplaceGrammar").optional(),
6232                    Ref::keyword("STREAM"),
6233                    Ref::new("IfNotExistsGrammar").optional(),
6234                    Ref::new("ObjectReferenceSegment"),
6235                    Sequence::new(vec_of_erased![Ref::keyword("COPY"), Ref::keyword("GRANTS"),])
6236                        .config(|this| this.optional()),
6237                    Ref::keyword("ON"),
6238                    one_of(vec_of_erased![
6239                        Sequence::new(vec_of_erased![
6240                            one_of(vec_of_erased![Ref::keyword("TABLE"), Ref::keyword("VIEW"),]),
6241                            Ref::new("ObjectReferenceSegment"),
6242                            one_of(vec_of_erased![
6243                                Ref::new("FromAtExpressionSegment"),
6244                                Ref::new("FromBeforeExpressionSegment"),
6245                            ])
6246                            .config(|this| this.optional()),
6247                            Sequence::new(vec_of_erased![
6248                                Ref::keyword("APPEND_ONLY"),
6249                                Ref::new("EqualsSegment"),
6250                                Ref::new("BooleanLiteralGrammar"),
6251                            ])
6252                            .config(|this| this.optional()),
6253                            Sequence::new(vec_of_erased![
6254                                Ref::keyword("SHOW_INITIAL_ROWS"),
6255                                Ref::new("EqualsSegment"),
6256                                Ref::new("BooleanLiteralGrammar"),
6257                            ])
6258                            .config(|this| this.optional()),
6259                        ]),
6260                        Sequence::new(vec_of_erased![
6261                            Ref::keyword("EXTERNAL"),
6262                            Ref::keyword("TABLE"),
6263                            Ref::new("ObjectReferenceSegment"),
6264                            one_of(vec_of_erased![
6265                                Ref::new("FromAtExpressionSegment"),
6266                                Ref::new("FromBeforeExpressionSegment"),
6267                            ])
6268                            .config(|this| this.optional()),
6269                            Sequence::new(vec_of_erased![
6270                                Ref::keyword("INSERT_ONLY"),
6271                                Ref::new("EqualsSegment"),
6272                                Ref::new("TrueSegment"),
6273                            ])
6274                            .config(|this| this.optional()),
6275                        ]),
6276                        Sequence::new(vec_of_erased![
6277                            Ref::keyword("STAGE"),
6278                            Ref::new("ObjectReferenceSegment"),
6279                        ]),
6280                    ]),
6281                    Ref::new("CommentEqualsClauseSegment").optional(),
6282                ])
6283                .to_matchable(),
6284            )
6285            .to_matchable()
6286            .into(),
6287        ),
6288        (
6289            "AlterStreamStatementSegment".into(),
6290            NodeMatcher::new(
6291                SyntaxKind::AlterStreamStatement,
6292                Sequence::new(vec_of_erased![
6293                    Ref::keyword("ALTER"),
6294                    Ref::keyword("STREAM"),
6295                    Ref::new("IfExistsGrammar").optional(),
6296                    Ref::new("ObjectReferenceSegment"),
6297                    one_of(vec_of_erased![
6298                        Sequence::new(vec_of_erased![
6299                            Ref::keyword("SET"),
6300                            Sequence::new(vec_of_erased![
6301                                Ref::keyword("APPEND_ONLY"),
6302                                Ref::new("EqualsSegment"),
6303                                Ref::new("BooleanLiteralGrammar"),
6304                            ])
6305                            .config(|this| this.optional()),
6306                            Sequence::new(vec_of_erased![
6307                                Ref::keyword("INSERT_ONLY"),
6308                                Ref::new("EqualsSegment"),
6309                                Ref::new("TrueSegment"),
6310                            ])
6311                            .config(|this| this.optional()),
6312                            Ref::new("TagEqualsSegment").optional(),
6313                            Ref::new("CommentEqualsClauseSegment").optional(),
6314                        ]),
6315                        Sequence::new(vec_of_erased![
6316                            Ref::keyword("UNSET"),
6317                            one_of(vec_of_erased![
6318                                Sequence::new(vec_of_erased![
6319                                    Ref::keyword("TAG"),
6320                                    Delimited::new(vec_of_erased![Ref::new("TagReferenceSegment")]),
6321                                ]),
6322                                Ref::keyword("COMMENT"),
6323                            ]),
6324                        ]),
6325                    ]),
6326                ])
6327                .to_matchable(),
6328            )
6329            .to_matchable()
6330            .into(),
6331        ),
6332        (
6333            "ShowStatementSegment".into(),
6334            NodeMatcher::new(SyntaxKind::ShowStatement, {
6335                let object_types_plural = one_of(vec_of_erased![
6336                    Ref::keyword("PARAMETERS"),
6337                    Sequence::new(vec_of_erased![
6338                        Ref::keyword("GLOBAL"),
6339                        Ref::keyword("ACCOUNTS"),
6340                    ]),
6341                    Ref::keyword("REGIONS"),
6342                    Sequence::new(vec_of_erased![
6343                        Ref::keyword("REPLICATION"),
6344                        Ref::keyword("ACCOUNTS"),
6345                    ]),
6346                    Sequence::new(vec_of_erased![
6347                        Ref::keyword("REPLICATION"),
6348                        Ref::keyword("DATABASES"),
6349                    ]),
6350                    Ref::keyword("PARAMETERS"),
6351                    Ref::keyword("VARIABLES"),
6352                    Ref::keyword("TRANSACTIONS"),
6353                    Ref::keyword("LOCKS"),
6354                    Ref::keyword("PARAMETERS"),
6355                    Ref::keyword("FUNCTIONS"),
6356                    Sequence::new(vec_of_erased![
6357                        Ref::keyword("NETWORK"),
6358                        Ref::keyword("POLICIES"),
6359                    ]),
6360                    Ref::keyword("SHARES"),
6361                    Ref::keyword("ROLES"),
6362                    Ref::keyword("GRANTS"),
6363                    Ref::keyword("USERS"),
6364                    Ref::keyword("WAREHOUSES"),
6365                    Ref::keyword("DATABASES"),
6366                    Sequence::new(vec_of_erased![
6367                        one_of(vec_of_erased![
6368                            Ref::keyword("API"),
6369                            Ref::keyword("NOTIFICATION"),
6370                            Ref::keyword("SECURITY"),
6371                            Ref::keyword("STORAGE"),
6372                        ])
6373                        .config(|this| this.optional()),
6374                        Ref::keyword("INTEGRATIONS"),
6375                    ]),
6376                    Ref::keyword("SCHEMAS"),
6377                    Ref::keyword("OBJECTS"),
6378                    Ref::keyword("TABLES"),
6379                    Sequence::new(vec_of_erased![
6380                        Ref::keyword("EXTERNAL"),
6381                        Ref::keyword("TABLES"),
6382                    ]),
6383                    Ref::keyword("VIEWS"),
6384                    Sequence::new(vec_of_erased![
6385                        Ref::keyword("MATERIALIZED"),
6386                        Ref::keyword("VIEWS"),
6387                    ]),
6388                    Sequence::new(vec_of_erased![
6389                        Ref::keyword("MASKING"),
6390                        Ref::keyword("POLICIES"),
6391                    ]),
6392                    Ref::keyword("COLUMNS"),
6393                    Sequence::new(vec_of_erased![
6394                        Ref::keyword("FILE"),
6395                        Ref::keyword("FORMATS"),
6396                    ]),
6397                    Ref::keyword("SEQUENCES"),
6398                    Ref::keyword("STAGES"),
6399                    Ref::keyword("PIPES"),
6400                    Ref::keyword("STREAMS"),
6401                    Ref::keyword("TASKS"),
6402                    Sequence::new(vec_of_erased![
6403                        Ref::keyword("USER"),
6404                        Ref::keyword("FUNCTIONS"),
6405                    ]),
6406                    Sequence::new(vec_of_erased![
6407                        Ref::keyword("EXTERNAL"),
6408                        Ref::keyword("FUNCTIONS"),
6409                    ]),
6410                    Ref::keyword("PROCEDURES"),
6411                    Sequence::new(vec_of_erased![
6412                        Ref::keyword("FUTURE"),
6413                        Ref::keyword("GRANTS"),
6414                    ]),
6415                ]);
6416
6417                let object_scope_types = one_of(vec_of_erased![
6418                    Ref::keyword("ACCOUNT"),
6419                    Ref::keyword("SESSION"),
6420                    Sequence::new(vec_of_erased![
6421                        one_of(vec_of_erased![
6422                            Ref::keyword("DATABASE"),
6423                            Ref::keyword("SCHEMA"),
6424                            Ref::keyword("SHARE"),
6425                            Ref::keyword("ROLE"),
6426                            Ref::keyword("TABLE"),
6427                            Ref::keyword("TASK"),
6428                            Ref::keyword("USER"),
6429                            Ref::keyword("WAREHOUSE"),
6430                            Ref::keyword("VIEW"),
6431                        ]),
6432                        Ref::new("ObjectReferenceSegment").optional(),
6433                    ]),
6434                ]);
6435
6436                Sequence::new(vec_of_erased![
6437                    Ref::keyword("SHOW"),
6438                    Ref::keyword("TERSE").optional(),
6439                    object_types_plural,
6440                    Ref::keyword("HISTORY").optional(),
6441                    Sequence::new(vec_of_erased![
6442                        Ref::keyword("LIKE"),
6443                        Ref::new("QuotedLiteralSegment"),
6444                    ])
6445                    .config(|this| this.optional()),
6446                    Sequence::new(vec_of_erased![
6447                        one_of(vec_of_erased![
6448                            Ref::keyword("ON"),
6449                            Ref::keyword("TO"),
6450                            Ref::keyword("OF"),
6451                            Ref::keyword("IN"),
6452                        ]),
6453                        one_of(vec_of_erased![
6454                            Sequence::new(vec_of_erased![object_scope_types]),
6455                            Ref::new("ObjectReferenceSegment"),
6456                        ]),
6457                    ])
6458                    .config(|this| this.optional()),
6459                    Sequence::new(vec_of_erased![
6460                        Ref::keyword("STARTS"),
6461                        Ref::keyword("WITH"),
6462                        Ref::new("QuotedLiteralSegment"),
6463                    ])
6464                    .config(|this| this.optional()),
6465                    Sequence::new(vec_of_erased![
6466                        Ref::keyword("WITH"),
6467                        Ref::keyword("PRIMARY"),
6468                        Ref::new("ObjectReferenceSegment"),
6469                    ])
6470                    .config(|this| this.optional()),
6471                    Sequence::new(vec_of_erased![
6472                        Ref::new("LimitClauseSegment"),
6473                        Sequence::new(vec_of_erased![
6474                            Ref::keyword("FROM"),
6475                            Ref::new("QuotedLiteralSegment"),
6476                        ])
6477                        .config(|this| this.optional()),
6478                    ])
6479                    .config(|this| this.optional()),
6480                ])
6481                .to_matchable()
6482            })
6483            .to_matchable()
6484            .into(),
6485        ),
6486        (
6487            "AlterUserStatementSegment".into(),
6488            NodeMatcher::new(
6489                SyntaxKind::AlterUserStatement,
6490                Sequence::new(vec_of_erased![
6491                    Ref::keyword("ALTER"),
6492                    Ref::keyword("USER"),
6493                    Sequence::new(vec_of_erased![Ref::keyword("IF"), Ref::keyword("EXISTS"),])
6494                        .config(|this| this.optional()),
6495                    Ref::new("RoleReferenceSegment"),
6496                    one_of(vec_of_erased![
6497                        Sequence::new(vec_of_erased![
6498                            Ref::keyword("RENAME"),
6499                            Ref::keyword("TO"),
6500                            Ref::new("ObjectReferenceSegment"),
6501                        ]),
6502                        Sequence::new(vec_of_erased![
6503                            Ref::keyword("RESET"),
6504                            Ref::keyword("PASSWORD"),
6505                        ]),
6506                        Sequence::new(vec_of_erased![
6507                            Ref::keyword("ABORT"),
6508                            Ref::keyword("ALL"),
6509                            Ref::keyword("QUERIES"),
6510                        ]),
6511                        Sequence::new(vec_of_erased![
6512                            Ref::keyword("ADD"),
6513                            Ref::keyword("DELEGATED"),
6514                            Ref::keyword("AUTHORIZATION"),
6515                            Ref::keyword("OF"),
6516                            Ref::keyword("ROLE"),
6517                            Ref::new("ObjectReferenceSegment"),
6518                            Ref::keyword("TO"),
6519                            Ref::keyword("SECURITY"),
6520                            Ref::keyword("INTEGRATION"),
6521                            Ref::new("ObjectReferenceSegment"),
6522                        ]),
6523                        Sequence::new(vec_of_erased![
6524                            Ref::keyword("REMOVE"),
6525                            Ref::keyword("DELEGATED"),
6526                            one_of(vec_of_erased![
6527                                Sequence::new(vec_of_erased![
6528                                    Ref::keyword("AUTHORIZATION"),
6529                                    Ref::keyword("OF"),
6530                                    Ref::keyword("ROLE"),
6531                                    Ref::new("ObjectReferenceSegment"),
6532                                ]),
6533                                Ref::keyword("AUTHORIZATIONS"),
6534                            ]),
6535                            Ref::keyword("FROM"),
6536                            Ref::keyword("SECURITY"),
6537                            Ref::keyword("INTEGRATION"),
6538                            Ref::new("ObjectReferenceSegment"),
6539                        ]),
6540                        Sequence::new(vec_of_erased![
6541                            Ref::keyword("SET"),
6542                            Delimited::new(vec_of_erased![Sequence::new(vec_of_erased![
6543                                Ref::new("ParameterNameSegment"),
6544                                Ref::new("EqualsSegment"),
6545                                one_of(vec_of_erased![
6546                                    Ref::new("LiteralGrammar"),
6547                                    Ref::new("ObjectReferenceSegment"),
6548                                ]),
6549                            ]),]),
6550                        ]),
6551                        Sequence::new(vec_of_erased![
6552                            Ref::keyword("UNSET"),
6553                            Delimited::new(vec_of_erased![Ref::new("ParameterNameSegment")]),
6554                        ]),
6555                    ]),
6556                ])
6557                .to_matchable(),
6558            )
6559            .to_matchable()
6560            .into(),
6561        ),
6562    ]);
6563
6564    snowflake_dialect.replace_grammar(
6565        "CreateRoleStatementSegment",
6566        Sequence::new(vec_of_erased![
6567            Ref::keyword("CREATE"),
6568            Sequence::new(vec_of_erased![Ref::keyword("OR"), Ref::keyword("REPLACE"),])
6569                .config(|this| this.optional()),
6570            Ref::keyword("ROLE"),
6571            Sequence::new(vec_of_erased![
6572                Ref::keyword("IF"),
6573                Ref::keyword("NOT"),
6574                Ref::keyword("EXISTS"),
6575            ])
6576            .config(|this| this.optional()),
6577            Ref::new("RoleReferenceSegment"),
6578            Sequence::new(vec_of_erased![
6579                Ref::keyword("COMMENT"),
6580                Ref::new("EqualsSegment"),
6581                Ref::new("QuotedLiteralSegment"),
6582            ])
6583            .config(|this| this.optional()),
6584        ])
6585        .to_matchable(),
6586    );
6587
6588    snowflake_dialect.replace_grammar(
6589        "ExplainStatementSegment",
6590        Sequence::new(vec_of_erased![
6591            Ref::keyword("EXPLAIN"),
6592            Sequence::new(vec_of_erased![
6593                Ref::keyword("USING"),
6594                one_of(vec_of_erased![
6595                    Ref::keyword("TABULAR"),
6596                    Ref::keyword("JSON"),
6597                    Ref::keyword("TEXT"),
6598                ]),
6599            ])
6600            .config(|this| this.optional()),
6601            ansi::explainable_stmt(),
6602        ])
6603        .to_matchable(),
6604    );
6605
6606    snowflake_dialect.add([
6607        (
6608            "AlterSessionStatementSegment".into(),
6609            NodeMatcher::new(
6610                SyntaxKind::AlterSessionStatement,
6611                Sequence::new(vec_of_erased![
6612                    Ref::keyword("ALTER"),
6613                    Ref::keyword("SESSION"),
6614                    one_of(vec_of_erased![
6615                        Ref::new("AlterSessionSetClauseSegment"),
6616                        Ref::new("AlterSessionUnsetClauseSegment"),
6617                    ]),
6618                ])
6619                .to_matchable(),
6620            )
6621            .to_matchable()
6622            .into(),
6623        ),
6624        (
6625            "AlterSessionSetClauseSegment".into(),
6626            NodeMatcher::new(
6627                SyntaxKind::AlterSessionSetStatement,
6628                Sequence::new(vec_of_erased![
6629                    Ref::keyword("SET"),
6630                    Ref::new("ParameterNameSegment"),
6631                    Ref::new("EqualsSegment"),
6632                    one_of(vec_of_erased![
6633                        Ref::new("BooleanLiteralGrammar"),
6634                        Ref::new("QuotedLiteralSegment"),
6635                        Ref::new("NumericLiteralSegment"),
6636                    ]),
6637                ])
6638                .to_matchable(),
6639            )
6640            .to_matchable()
6641            .into(),
6642        ),
6643        (
6644            "AlterSessionUnsetClauseSegment".into(),
6645            NodeMatcher::new(
6646                SyntaxKind::AlterSessionUnsetClause,
6647                Sequence::new(vec_of_erased![
6648                    Ref::keyword("UNSET"),
6649                    Delimited::new(vec_of_erased![Ref::new("ParameterNameSegment")]),
6650                ])
6651                .to_matchable(),
6652            )
6653            .to_matchable()
6654            .into(),
6655        ),
6656        (
6657            "AlterTaskStatementSegment".into(),
6658            NodeMatcher::new(
6659                SyntaxKind::AlterTaskStatement,
6660                Sequence::new(vec_of_erased![
6661                    Ref::keyword("ALTER"),
6662                    Ref::keyword("TASK"),
6663                    Sequence::new(vec_of_erased![Ref::keyword("IF"), Ref::keyword("EXISTS"),])
6664                        .config(|this| this.optional()),
6665                    Ref::new("ObjectReferenceSegment"),
6666                    one_of(vec_of_erased![
6667                        Ref::keyword("RESUME"),
6668                        Ref::keyword("SUSPEND"),
6669                        Sequence::new(vec_of_erased![
6670                            Ref::keyword("REMOVE"),
6671                            Ref::keyword("AFTER"),
6672                            Ref::new("ObjectReferenceSegment"),
6673                        ]),
6674                        Sequence::new(vec_of_erased![
6675                            Ref::keyword("ADD"),
6676                            Ref::keyword("AFTER"),
6677                            Ref::new("ObjectReferenceSegment"),
6678                        ]),
6679                        Ref::new("AlterTaskSpecialSetClauseSegment"),
6680                        Ref::new("AlterTaskSetClauseSegment"),
6681                        Ref::new("AlterTaskUnsetClauseSegment"),
6682                        Sequence::new(vec_of_erased![
6683                            Ref::keyword("MODIFY"),
6684                            Ref::keyword("AS"),
6685                            ansi::explainable_stmt(),
6686                        ]),
6687                        Sequence::new(vec_of_erased![
6688                            Ref::keyword("MODIFY"),
6689                            Ref::keyword("WHEN"),
6690                            Ref::new("BooleanLiteralGrammar"),
6691                        ]),
6692                    ]),
6693                ])
6694                .to_matchable(),
6695            )
6696            .to_matchable()
6697            .into(),
6698        ),
6699        (
6700            "AlterTaskSpecialSetClauseSegment".into(),
6701            NodeMatcher::new(
6702                SyntaxKind::AlterTaskSpecialSetClause,
6703                Sequence::new(vec_of_erased![
6704                    Ref::keyword("SET"),
6705                    any_set_of(vec_of_erased![
6706                        Sequence::new(vec_of_erased![
6707                            Ref::keyword("WAREHOUSE"),
6708                            Ref::new("EqualsSegment"),
6709                            Ref::new("ObjectReferenceSegment"),
6710                        ])
6711                        .config(|this| this.optional()),
6712                        Sequence::new(vec_of_erased![
6713                            Ref::keyword("SCHEDULE"),
6714                            Ref::new("EqualsSegment"),
6715                            Ref::new("QuotedLiteralSegment"),
6716                        ])
6717                        .config(|this| this.optional()),
6718                        Sequence::new(vec_of_erased![
6719                            Ref::keyword("ALLOW_OVERLAPPING_EXECUTION"),
6720                            Ref::new("EqualsSegment"),
6721                            Ref::new("BooleanLiteralGrammar"),
6722                        ])
6723                        .config(|this| this.optional()),
6724                    ])
6725                    .config(|this| this.min_times(1)),
6726                ])
6727                .to_matchable(),
6728            )
6729            .to_matchable()
6730            .into(),
6731        ),
6732        (
6733            "AlterTaskSetClauseSegment".into(),
6734            NodeMatcher::new(
6735                SyntaxKind::AlterTaskSetClause,
6736                Sequence::new(vec_of_erased![
6737                    Ref::keyword("SET"),
6738                    Delimited::new(vec_of_erased![Sequence::new(vec_of_erased![
6739                        Ref::new("ParameterNameSegment"),
6740                        Ref::new("EqualsSegment"),
6741                        one_of(vec_of_erased![
6742                            Ref::new("BooleanLiteralGrammar"),
6743                            Ref::new("QuotedLiteralSegment"),
6744                            Ref::new("NumericLiteralSegment"),
6745                        ]),
6746                    ]),]),
6747                ])
6748                .to_matchable(),
6749            )
6750            .to_matchable()
6751            .into(),
6752        ),
6753        (
6754            "AlterTaskUnsetClauseSegment".into(),
6755            NodeMatcher::new(
6756                SyntaxKind::AlterTaskUnsetClause,
6757                Sequence::new(vec_of_erased![
6758                    Ref::keyword("UNSET"),
6759                    Delimited::new(vec_of_erased![Ref::new("ParameterNameSegment")]),
6760                ])
6761                .to_matchable(),
6762            )
6763            .to_matchable()
6764            .into(),
6765        ),
6766        (
6767            "ExecuteTaskClauseSegment".into(),
6768            NodeMatcher::new(
6769                SyntaxKind::ExecuteTaskClause,
6770                Sequence::new(vec_of_erased![
6771                    Ref::keyword("EXECUTE"),
6772                    Ref::keyword("TASK"),
6773                    Ref::new("ObjectReferenceSegment"),
6774                ])
6775                .to_matchable(),
6776            )
6777            .to_matchable()
6778            .into(),
6779        ),
6780    ]);
6781
6782    snowflake_dialect.replace_grammar(
6783        "MergeUpdateClauseSegment",
6784        Sequence::new(vec_of_erased![
6785            Ref::keyword("UPDATE"),
6786            Ref::new("SetClauseListSegment"),
6787            Ref::new("WhereClauseSegment").optional(),
6788        ])
6789        .to_matchable(),
6790    );
6791
6792    snowflake_dialect.replace_grammar(
6793        "MergeDeleteClauseSegment",
6794        Sequence::new(vec_of_erased![
6795            Ref::keyword("DELETE"),
6796            Ref::new("WhereClauseSegment").optional(),
6797        ])
6798        .to_matchable(),
6799    );
6800
6801    snowflake_dialect.replace_grammar(
6802        "MergeInsertClauseSegment",
6803        Sequence::new(vec_of_erased![
6804            Ref::keyword("INSERT"),
6805            MetaSegment::indent(),
6806            Ref::new("BracketedColumnReferenceListGrammar").optional(),
6807            MetaSegment::dedent(),
6808            Ref::new("ValuesClauseSegment").optional(),
6809            Ref::new("WhereClauseSegment").optional(),
6810        ])
6811        .to_matchable(),
6812    );
6813
6814    snowflake_dialect.add([
6815        (
6816            "DeleteStatementSegment".into(),
6817            NodeMatcher::new(
6818                SyntaxKind::DeleteStatement,
6819                Sequence::new(vec_of_erased![
6820                    Ref::keyword("DELETE"),
6821                    Ref::keyword("FROM"),
6822                    Ref::new("TableReferenceSegment"),
6823                    Ref::new("AliasExpressionSegment").optional(),
6824                    Sequence::new(vec_of_erased![
6825                        Ref::keyword("USING"),
6826                        MetaSegment::indent(),
6827                        Delimited::new(vec_of_erased![Sequence::new(vec_of_erased![
6828                            Ref::new("TableExpressionSegment"),
6829                            Ref::new("AliasExpressionSegment").optional(),
6830                        ]),]),
6831                        MetaSegment::dedent(),
6832                    ])
6833                    .config(|this| this.optional()),
6834                    Ref::new("WhereClauseSegment").optional(),
6835                ])
6836                .to_matchable(),
6837            )
6838            .to_matchable()
6839            .into(),
6840        ),
6841        (
6842            "DescribeStatementSegment".into(),
6843            NodeMatcher::new(
6844                SyntaxKind::DescribeStatement,
6845                Sequence::new(vec_of_erased![
6846                    one_of(vec_of_erased![
6847                        Ref::keyword("DESCRIBE"),
6848                        Ref::keyword("DESC"),
6849                    ]),
6850                    one_of(vec_of_erased![
6851                        Sequence::new(vec_of_erased![
6852                            Ref::keyword("RESULT"),
6853                            one_of(vec_of_erased![
6854                                Ref::new("QuotedLiteralSegment"),
6855                                Sequence::new(vec_of_erased![
6856                                    Ref::keyword("LAST_QUERY_ID"),
6857                                    Bracketed::new(vec_of_erased![]),
6858                                ]),
6859                            ]),
6860                        ]),
6861                        Sequence::new(vec_of_erased![
6862                            Ref::keyword("NETWORK"),
6863                            Ref::keyword("POLICY"),
6864                            Ref::new("ObjectReferenceSegment"),
6865                        ]),
6866                        Sequence::new(vec_of_erased![
6867                            Ref::keyword("SHARE"),
6868                            Ref::new("ObjectReferenceSegment"),
6869                            Sequence::new(vec_of_erased![
6870                                Ref::new("DotSegment"),
6871                                Ref::new("ObjectReferenceSegment"),
6872                            ])
6873                            .config(|this| this.optional()),
6874                        ]),
6875                        Sequence::new(vec_of_erased![
6876                            Ref::keyword("USER"),
6877                            Ref::new("ObjectReferenceSegment"),
6878                        ]),
6879                        Sequence::new(vec_of_erased![
6880                            Ref::keyword("WAREHOUSE"),
6881                            Ref::new("ObjectReferenceSegment"),
6882                        ]),
6883                        Sequence::new(vec_of_erased![
6884                            Ref::keyword("DATABASE"),
6885                            Ref::new("DatabaseReferenceSegment"),
6886                        ]),
6887                        Sequence::new(vec_of_erased![
6888                            one_of(vec_of_erased![
6889                                Ref::keyword("API"),
6890                                Ref::keyword("NOTIFICATION"),
6891                                Ref::keyword("SECURITY"),
6892                                Ref::keyword("STORAGE"),
6893                            ])
6894                            .config(|this| this.optional()),
6895                            Ref::keyword("INTEGRATION"),
6896                            Ref::new("ObjectReferenceSegment"),
6897                        ]),
6898                        Sequence::new(vec_of_erased![
6899                            Ref::keyword("SESSION"),
6900                            Ref::keyword("POLICY"),
6901                            Ref::new("ObjectReferenceSegment"),
6902                        ]),
6903                        Sequence::new(vec_of_erased![
6904                            Ref::keyword("SCHEMA"),
6905                            Ref::new("SchemaReferenceSegment"),
6906                        ]),
6907                        Sequence::new(vec_of_erased![
6908                            Ref::keyword("TABLE"),
6909                            Ref::new("TableReferenceSegment"),
6910                            Sequence::new(vec_of_erased![
6911                                Ref::keyword("TYPE"),
6912                                Ref::new("EqualsSegment"),
6913                                one_of(vec_of_erased![
6914                                    Ref::keyword("COLUMNS"),
6915                                    Ref::keyword("STAGE"),
6916                                ]),
6917                            ])
6918                            .config(|this| this.optional()),
6919                        ]),
6920                        Sequence::new(vec_of_erased![
6921                            Ref::keyword("EXTERNAL"),
6922                            Ref::keyword("TABLE"),
6923                            Ref::new("TableReferenceSegment"),
6924                            Sequence::new(vec_of_erased![
6925                                Ref::keyword("TYPE"),
6926                                Ref::new("EqualsSegment"),
6927                                one_of(vec_of_erased![
6928                                    Ref::keyword("COLUMNS"),
6929                                    Ref::keyword("STAGE"),
6930                                ]),
6931                            ])
6932                            .config(|this| this.optional()),
6933                        ]),
6934                        Sequence::new(vec_of_erased![
6935                            Ref::keyword("VIEW"),
6936                            Ref::new("TableReferenceSegment"),
6937                        ]),
6938                        Sequence::new(vec_of_erased![
6939                            Ref::keyword("MATERIALIZED"),
6940                            Ref::keyword("VIEW"),
6941                            Ref::new("TableReferenceSegment"),
6942                        ]),
6943                        Sequence::new(vec_of_erased![
6944                            Ref::keyword("SEQUENCE"),
6945                            Ref::new("SequenceReferenceSegment"),
6946                        ]),
6947                        Sequence::new(vec_of_erased![
6948                            Ref::keyword("MASKING"),
6949                            Ref::keyword("POLICY"),
6950                            Ref::new("ObjectReferenceSegment"),
6951                        ]),
6952                        Sequence::new(vec_of_erased![
6953                            Ref::keyword("ROW"),
6954                            Ref::keyword("ACCESS"),
6955                            Ref::keyword("POLICY"),
6956                            Ref::new("ObjectReferenceSegment"),
6957                        ]),
6958                        Sequence::new(vec_of_erased![
6959                            Ref::keyword("FILE"),
6960                            Ref::keyword("FORMAT"),
6961                            Ref::new("ObjectReferenceSegment"),
6962                        ]),
6963                        Sequence::new(vec_of_erased![
6964                            Ref::keyword("STAGE"),
6965                            Ref::new("ObjectReferenceSegment"),
6966                        ]),
6967                        Sequence::new(vec_of_erased![
6968                            Ref::keyword("PIPE"),
6969                            Ref::new("ObjectReferenceSegment"),
6970                        ]),
6971                        Sequence::new(vec_of_erased![
6972                            Ref::keyword("STREAM"),
6973                            Ref::new("ObjectReferenceSegment"),
6974                        ]),
6975                        Sequence::new(vec_of_erased![
6976                            Ref::keyword("TASK"),
6977                            Ref::new("ObjectReferenceSegment"),
6978                        ]),
6979                        Sequence::new(vec_of_erased![
6980                            Ref::keyword("FUNCTION"),
6981                            Ref::new("FunctionNameSegment"),
6982                            Bracketed::new(vec_of_erased![
6983                                Delimited::new(vec_of_erased![Ref::new("DatatypeSegment"),])
6984                                    .config(|this| this.optional()),
6985                            ]),
6986                        ]),
6987                        Sequence::new(vec_of_erased![
6988                            Ref::keyword("PROCEDURE"),
6989                            Ref::new("FunctionNameSegment"),
6990                            Bracketed::new(vec_of_erased![
6991                                Delimited::new(vec_of_erased![Ref::new("DatatypeSegment"),])
6992                                    .config(|this| this.optional()),
6993                            ]),
6994                        ]),
6995                    ]),
6996                ])
6997                .to_matchable(),
6998            )
6999            .to_matchable()
7000            .into(),
7001        ),
7002    ]);
7003
7004    snowflake_dialect.replace_grammar(
7005        "TransactionStatementSegment",
7006        one_of(vec_of_erased![
7007            Sequence::new(vec_of_erased![
7008                Ref::keyword("BEGIN"),
7009                one_of(vec_of_erased![
7010                    Ref::keyword("WORK"),
7011                    Ref::keyword("TRANSACTION"),
7012                ])
7013                .config(|this| this.optional()),
7014                Sequence::new(vec_of_erased![
7015                    Ref::keyword("NAME"),
7016                    Ref::new("ObjectReferenceSegment"),
7017                ])
7018                .config(|this| this.optional()),
7019            ]),
7020            Sequence::new(vec_of_erased![
7021                Ref::keyword("START"),
7022                Ref::keyword("TRANSACTION"),
7023                Sequence::new(vec_of_erased![
7024                    Ref::keyword("NAME"),
7025                    Ref::new("ObjectReferenceSegment"),
7026                ])
7027                .config(|this| this.optional()),
7028            ]),
7029            Sequence::new(vec_of_erased![
7030                Ref::keyword("COMMIT"),
7031                Ref::keyword("WORK").optional(),
7032            ]),
7033            Ref::keyword("ROLLBACK"),
7034        ])
7035        .to_matchable(),
7036    );
7037
7038    snowflake_dialect.replace_grammar(
7039        "TruncateStatementSegment",
7040        Sequence::new(vec_of_erased![
7041            Ref::keyword("TRUNCATE"),
7042            Ref::keyword("TABLE").optional(),
7043            Sequence::new(vec_of_erased![Ref::keyword("IF"), Ref::keyword("EXISTS"),])
7044                .config(|this| this.optional()),
7045            Ref::new("TableReferenceSegment"),
7046        ])
7047        .to_matchable(),
7048    );
7049
7050    snowflake_dialect.add([
7051        (
7052            "UnsetStatementSegment".into(),
7053            NodeMatcher::new(
7054                SyntaxKind::UnsetStatement,
7055                Sequence::new(vec_of_erased![
7056                    Ref::keyword("UNSET"),
7057                    one_of(vec_of_erased![
7058                        Ref::new("LocalVariableNameSegment"),
7059                        Bracketed::new(vec_of_erased![Delimited::new(vec_of_erased![Ref::new(
7060                            "LocalVariableNameSegment"
7061                        ),]),]),
7062                    ]),
7063                ])
7064                .to_matchable(),
7065            )
7066            .to_matchable()
7067            .into(),
7068        ),
7069        (
7070            "UndropStatementSegment".into(),
7071            NodeMatcher::new(
7072                SyntaxKind::UndropStatement,
7073                Sequence::new(vec_of_erased![
7074                    Ref::keyword("UNDROP"),
7075                    one_of(vec_of_erased![
7076                        Sequence::new(vec_of_erased![
7077                            Ref::keyword("DATABASE"),
7078                            Ref::new("DatabaseReferenceSegment"),
7079                        ]),
7080                        Sequence::new(vec_of_erased![
7081                            Ref::keyword("SCHEMA"),
7082                            Ref::new("SchemaReferenceSegment"),
7083                        ]),
7084                        Sequence::new(vec_of_erased![
7085                            Ref::keyword("TABLE"),
7086                            Ref::new("TableReferenceSegment"),
7087                        ]),
7088                    ]),
7089                ])
7090                .to_matchable(),
7091            )
7092            .to_matchable()
7093            .into(),
7094        ),
7095        (
7096            "CommentStatementSegment".into(),
7097            NodeMatcher::new(
7098                SyntaxKind::CommentStatement,
7099                Sequence::new(vec_of_erased![
7100                    Ref::keyword("COMMENT"),
7101                    Sequence::new(vec_of_erased![Ref::keyword("IF"), Ref::keyword("EXISTS"),])
7102                        .config(|this| this.optional()),
7103                    Ref::keyword("ON"),
7104                    one_of(vec_of_erased![
7105                        Ref::keyword("COLUMN"),
7106                        Ref::keyword("TABLE"),
7107                        Ref::keyword("VIEW"),
7108                        Ref::keyword("SCHEMA"),
7109                        Ref::keyword("DATABASE"),
7110                        Ref::keyword("WAREHOUSE"),
7111                        Ref::keyword("USER"),
7112                        Ref::keyword("STAGE"),
7113                        Ref::keyword("FUNCTION"),
7114                        Ref::keyword("PROCEDURE"),
7115                        Ref::keyword("SEQUENCE"),
7116                        Ref::keyword("SHARE"),
7117                        Ref::keyword("PIPE"),
7118                        Ref::keyword("STREAM"),
7119                        Ref::keyword("TASK"),
7120                        Sequence::new(vec_of_erased![
7121                            Ref::keyword("NETWORK"),
7122                            Ref::keyword("POLICY"),
7123                        ]),
7124                        Sequence::new(vec_of_erased![
7125                            one_of(vec_of_erased![
7126                                Ref::keyword("API"),
7127                                Ref::keyword("NOTIFICATION"),
7128                                Ref::keyword("SECURITY"),
7129                                Ref::keyword("STORAGE"),
7130                            ]),
7131                            Ref::keyword("INTEGRATION"),
7132                        ]),
7133                        Sequence::new(vec_of_erased![
7134                            Ref::keyword("SESSION"),
7135                            Ref::keyword("POLICY"),
7136                        ]),
7137                        Sequence::new(vec_of_erased![
7138                            Ref::keyword("EXTERNAL"),
7139                            Ref::keyword("TABLE"),
7140                        ]),
7141                        Sequence::new(vec_of_erased![
7142                            Ref::keyword("MATERIALIZED"),
7143                            Ref::keyword("VIEW"),
7144                        ]),
7145                        Sequence::new(vec_of_erased![
7146                            Ref::keyword("MASKING"),
7147                            Ref::keyword("POLICY"),
7148                        ]),
7149                        Sequence::new(vec_of_erased![
7150                            Ref::keyword("ROW"),
7151                            Ref::keyword("ACCESS"),
7152                            Ref::keyword("POLICY"),
7153                        ]),
7154                        Sequence::new(
7155                            vec_of_erased![Ref::keyword("FILE"), Ref::keyword("FORMAT"),]
7156                        ),
7157                    ]),
7158                    Ref::new("ObjectReferenceSegment"),
7159                    Ref::keyword("IS"),
7160                    Ref::new("QuotedLiteralSegment"),
7161                ])
7162                .to_matchable(),
7163            )
7164            .to_matchable()
7165            .into(),
7166        ),
7167    ]);
7168
7169    snowflake_dialect.replace_grammar(
7170        "UseStatementSegment",
7171        Sequence::new(vec_of_erased![
7172            Ref::keyword("USE"),
7173            one_of(vec_of_erased![
7174                Sequence::new(vec_of_erased![
7175                    Ref::keyword("ROLE"),
7176                    Ref::new("ObjectReferenceSegment"),
7177                ]),
7178                Sequence::new(vec_of_erased![
7179                    Ref::keyword("WAREHOUSE"),
7180                    Ref::new("ObjectReferenceSegment"),
7181                ]),
7182                Sequence::new(vec_of_erased![
7183                    Ref::keyword("DATABASE").optional(),
7184                    Ref::new("DatabaseReferenceSegment"),
7185                ]),
7186                Sequence::new(vec_of_erased![
7187                    Ref::keyword("SCHEMA").optional(),
7188                    Ref::new("SchemaReferenceSegment"),
7189                ]),
7190                Sequence::new(vec_of_erased![
7191                    Ref::keyword("SECONDARY"),
7192                    Ref::keyword("ROLES"),
7193                    one_of(vec_of_erased![Ref::keyword("ALL"), Ref::keyword("NONE"),]),
7194                ]),
7195            ]),
7196        ])
7197        .to_matchable(),
7198    );
7199
7200    snowflake_dialect.add([(
7201        "CallStatementSegment".into(),
7202        NodeMatcher::new(
7203            SyntaxKind::CallStatement,
7204            Sequence::new(vec_of_erased![
7205                Ref::keyword("CALL"),
7206                Sequence::new(vec_of_erased![
7207                    Ref::new("FunctionNameSegment"),
7208                    Bracketed::new(vec_of_erased![
7209                        Ref::new("FunctionContentsGrammar").optional(),
7210                    ])
7211                    .config(|this| this.parse_mode(ParseMode::Greedy)),
7212                ]),
7213            ])
7214            .to_matchable(),
7215        )
7216        .to_matchable()
7217        .into(),
7218    )]);
7219
7220    snowflake_dialect.replace_grammar(
7221        "LimitClauseSegment",
7222        one_of(vec_of_erased![
7223            Sequence::new(vec_of_erased![
7224                Ref::keyword("LIMIT"),
7225                MetaSegment::indent(),
7226                Ref::new("LimitLiteralGrammar"),
7227                MetaSegment::dedent(),
7228                Sequence::new(vec_of_erased![
7229                    Ref::keyword("OFFSET"),
7230                    MetaSegment::indent(),
7231                    Ref::new("LimitLiteralGrammar"),
7232                    MetaSegment::dedent(),
7233                ])
7234                .config(|this| this.optional()),
7235            ]),
7236            Sequence::new(vec_of_erased![
7237                Sequence::new(vec_of_erased![
7238                    Ref::keyword("OFFSET"),
7239                    MetaSegment::indent(),
7240                    Ref::new("LimitLiteralGrammar"),
7241                    one_of(vec_of_erased![Ref::keyword("ROW"), Ref::keyword("ROWS"),])
7242                        .config(|this| this.optional()),
7243                    MetaSegment::dedent(),
7244                ])
7245                .config(|this| this.optional()),
7246                Ref::keyword("FETCH"),
7247                MetaSegment::indent(),
7248                one_of(vec_of_erased![Ref::keyword("FIRST"), Ref::keyword("NEXT"),])
7249                    .config(|this| this.optional()),
7250                Ref::new("LimitLiteralGrammar"),
7251                one_of(vec_of_erased![Ref::keyword("ROW"), Ref::keyword("ROWS"),])
7252                    .config(|this| this.optional()),
7253                Ref::keyword("ONLY").optional(),
7254                MetaSegment::dedent(),
7255            ]),
7256        ])
7257        .to_matchable(),
7258    );
7259
7260    snowflake_dialect.replace_grammar(
7261        "SelectClauseSegment",
7262        ansi::select_clause_segment().copy(
7263            None,
7264            None,
7265            None,
7266            None,
7267            vec_of_erased![Ref::keyword("FETCH"), Ref::keyword("OFFSET")],
7268            false,
7269        ),
7270    );
7271
7272    snowflake_dialect.replace_grammar(
7273        "OrderByClauseSegment",
7274        Sequence::new(vec_of_erased![
7275            Ref::keyword("ORDER"),
7276            Ref::keyword("BY"),
7277            MetaSegment::indent(),
7278            Delimited::new(vec_of_erased![Sequence::new(vec_of_erased![
7279                one_of(vec_of_erased![
7280                    Ref::new("ColumnReferenceSegment"),
7281                    Ref::new("NumericLiteralSegment"),
7282                    Ref::new("ExpressionSegment"),
7283                ]),
7284                one_of(vec_of_erased![Ref::keyword("ASC"), Ref::keyword("DESC"),])
7285                    .config(|this| this.optional()),
7286                Sequence::new(vec_of_erased![
7287                    Ref::keyword("NULLS"),
7288                    one_of(vec_of_erased![Ref::keyword("FIRST"), Ref::keyword("LAST"),]),
7289                ])
7290                .config(|this| this.optional()),
7291            ]),])
7292            .config(|this| this.terminators = vec_of_erased![
7293                Ref::keyword("LIMIT"),
7294                Ref::keyword("FETCH"),
7295                Ref::keyword("OFFSET"),
7296                Ref::new("FrameClauseUnitGrammar")
7297            ]),
7298            MetaSegment::dedent(),
7299        ])
7300        .to_matchable(),
7301    );
7302
7303    snowflake_dialect.replace_grammar("FrameClauseSegment", {
7304        let frame_extent = one_of(vec_of_erased![
7305            Sequence::new(vec_of_erased![Ref::keyword("CURRENT"), Ref::keyword("ROW"),]),
7306            Sequence::new(vec_of_erased![
7307                one_of(vec_of_erased![
7308                    Ref::new("NumericLiteralSegment"),
7309                    Ref::new("ReferencedVariableNameSegment"),
7310                    Ref::keyword("UNBOUNDED"),
7311                ]),
7312                one_of(vec_of_erased![
7313                    Ref::keyword("PRECEDING"),
7314                    Ref::keyword("FOLLOWING"),
7315                ]),
7316            ]),
7317        ]);
7318
7319        Sequence::new(vec_of_erased![
7320            Ref::new("FrameClauseUnitGrammar"),
7321            one_of(vec_of_erased![
7322                frame_extent.clone(),
7323                Sequence::new(vec_of_erased![
7324                    Ref::keyword("BETWEEN"),
7325                    frame_extent.clone(),
7326                    Ref::keyword("AND"),
7327                    frame_extent,
7328                ]),
7329            ]),
7330        ])
7331        .to_matchable()
7332    });
7333
7334    snowflake_dialect.add([
7335        (
7336            "DropProcedureStatementSegment".into(),
7337            NodeMatcher::new(
7338                SyntaxKind::DropProcedureStatement,
7339                Sequence::new(vec_of_erased![
7340                    Ref::keyword("DROP"),
7341                    Ref::keyword("PROCEDURE"),
7342                    Ref::new("IfExistsGrammar").optional(),
7343                    Ref::new("FunctionNameSegment"),
7344                    Ref::new("FunctionParameterListGrammar"),
7345                ])
7346                .to_matchable(),
7347            )
7348            .to_matchable()
7349            .into(),
7350        ),
7351        (
7352            "DropExternalTableStatementSegment".into(),
7353            NodeMatcher::new(
7354                SyntaxKind::DropExternalTableStatement,
7355                Sequence::new(vec_of_erased![
7356                    Ref::keyword("DROP"),
7357                    Ref::keyword("EXTERNAL"),
7358                    Ref::keyword("TABLE"),
7359                    Ref::new("IfExistsGrammar").optional(),
7360                    Ref::new("TableReferenceSegment"),
7361                    Ref::new("DropBehaviorGrammar").optional(),
7362                ])
7363                .to_matchable(),
7364            )
7365            .to_matchable()
7366            .into(),
7367        ),
7368        (
7369            "DropFunctionStatementSegment".into(),
7370            NodeMatcher::new(
7371                SyntaxKind::DropFunctionStatement,
7372                Sequence::new(vec_of_erased![
7373                    Ref::keyword("DROP"),
7374                    Ref::keyword("EXTERNAL").optional(),
7375                    Ref::keyword("FUNCTION"),
7376                    Ref::new("IfExistsGrammar").optional(),
7377                    Ref::new("FunctionNameSegment"),
7378                    Ref::new("FunctionParameterListGrammar"),
7379                ])
7380                .to_matchable(),
7381            )
7382            .to_matchable()
7383            .into(),
7384        ),
7385        (
7386            "DropMaterializedViewStatementSegment".into(),
7387            NodeMatcher::new(
7388                SyntaxKind::DropMaterializedViewStatement,
7389                Sequence::new(vec_of_erased![
7390                    Ref::keyword("DROP"),
7391                    Ref::keyword("MATERIALIZED"),
7392                    Ref::keyword("VIEW"),
7393                    Ref::new("IfExistsGrammar").optional(),
7394                    Ref::new("TableReferenceSegment"),
7395                ])
7396                .to_matchable(),
7397            )
7398            .to_matchable()
7399            .into(),
7400        ),
7401        (
7402            "DropObjectStatementSegment".into(),
7403            NodeMatcher::new(
7404                SyntaxKind::DropObjectStatement,
7405                Sequence::new(vec_of_erased![
7406                    Ref::keyword("DROP"),
7407                    one_of(vec_of_erased![
7408                        Sequence::new(vec_of_erased![
7409                            one_of(vec_of_erased![
7410                                Ref::keyword("CONNECTION"),
7411                                Sequence::new(vec_of_erased![
7412                                    Ref::keyword("FILE"),
7413                                    Ref::keyword("FORMAT"),
7414                                ]),
7415                                Sequence::new(vec_of_erased![
7416                                    one_of(vec_of_erased![
7417                                        Ref::keyword("API"),
7418                                        Ref::keyword("NOTIFICATION"),
7419                                        Ref::keyword("SECURITY"),
7420                                        Ref::keyword("STORAGE"),
7421                                    ])
7422                                    .config(|this| this.optional()),
7423                                    Ref::keyword("INTEGRATION"),
7424                                ]),
7425                                Ref::keyword("PIPE"),
7426                                Sequence::new(vec_of_erased![
7427                                    Ref::keyword("ROW"),
7428                                    Ref::keyword("ACCESS"),
7429                                    Ref::keyword("POLICY"),
7430                                ]),
7431                                Ref::keyword("STAGE"),
7432                                Ref::keyword("STREAM"),
7433                                Ref::keyword("TAG"),
7434                                Ref::keyword("TASK"),
7435                            ]),
7436                            Ref::new("IfExistsGrammar").optional(),
7437                            Ref::new("ObjectReferenceSegment"),
7438                        ]),
7439                        Sequence::new(vec_of_erased![
7440                            one_of(vec_of_erased![
7441                                Sequence::new(vec_of_erased![
7442                                    Ref::keyword("RESOURCE"),
7443                                    Ref::keyword("MONITOR"),
7444                                ]),
7445                                Ref::keyword("SHARE"),
7446                            ]),
7447                            Ref::new("ObjectReferenceSegment"),
7448                        ]),
7449                        Sequence::new(vec_of_erased![
7450                            one_of(vec_of_erased![
7451                                Sequence::new(vec_of_erased![
7452                                    Ref::keyword("MANAGED"),
7453                                    Ref::keyword("ACCOUNT"),
7454                                ]),
7455                                Sequence::new(vec_of_erased![
7456                                    Ref::keyword("MASKING"),
7457                                    Ref::keyword("POLICY"),
7458                                ]),
7459                            ]),
7460                            Ref::new("SingleIdentifierGrammar"),
7461                        ]),
7462                        Sequence::new(vec_of_erased![
7463                            one_of(vec_of_erased![Sequence::new(vec_of_erased![
7464                                Ref::keyword("NETWORK"),
7465                                Ref::keyword("POLICY"),
7466                            ]),]),
7467                            Ref::new("IfExistsGrammar").optional(),
7468                            Ref::new("SingleIdentifierGrammar"),
7469                        ]),
7470                        Sequence::new(vec_of_erased![
7471                            one_of(vec_of_erased![
7472                                Ref::keyword("WAREHOUSE"),
7473                                Sequence::new(vec_of_erased![
7474                                    Ref::keyword("SESSION"),
7475                                    Ref::keyword("POLICY"),
7476                                ]),
7477                            ]),
7478                            Ref::new("IfExistsGrammar").optional(),
7479                            Ref::new("SingleIdentifierGrammar"),
7480                        ]),
7481                        Sequence::new(vec_of_erased![
7482                            Ref::keyword("SEQUENCE"),
7483                            Ref::new("IfExistsGrammar").optional(),
7484                            Ref::new("ObjectReferenceSegment"),
7485                            Ref::new("DropBehaviorGrammar").optional(),
7486                        ]),
7487                    ]),
7488                ])
7489                .to_matchable(),
7490            )
7491            .to_matchable()
7492            .into(),
7493        ),
7494        (
7495            "ListStatementSegment".into(),
7496            NodeMatcher::new(
7497                SyntaxKind::ListStatement,
7498                Sequence::new(vec_of_erased![
7499                    one_of(vec_of_erased![Ref::keyword("LIST"), Ref::keyword("LS"),]),
7500                    Ref::new("StagePath"),
7501                    Sequence::new(vec_of_erased![
7502                        Ref::keyword("PATTERN"),
7503                        Ref::new("EqualsSegment"),
7504                        Ref::new("QuotedLiteralSegment"),
7505                    ])
7506                    .config(|this| this.optional()),
7507                ])
7508                .to_matchable(),
7509            )
7510            .to_matchable()
7511            .into(),
7512        ),
7513        (
7514            "GetStatementSegment".into(),
7515            NodeMatcher::new(
7516                SyntaxKind::GetStatement,
7517                Sequence::new(vec_of_erased![
7518                    Ref::keyword("GET"),
7519                    Ref::new("StagePath"),
7520                    one_of(vec_of_erased![
7521                        Ref::new("UnquotedFilePath"),
7522                        Ref::new("QuotedLiteralSegment"),
7523                    ]),
7524                    any_set_of(vec_of_erased![
7525                        Sequence::new(vec_of_erased![
7526                            Ref::keyword("PARALLEL"),
7527                            Ref::new("EqualsSegment"),
7528                            Ref::new("IntegerSegment"),
7529                        ]),
7530                        Sequence::new(vec_of_erased![
7531                            Ref::keyword("PATTERN"),
7532                            Ref::new("EqualsSegment"),
7533                            one_of(vec_of_erased![
7534                                Ref::new("QuotedLiteralSegment"),
7535                                Ref::new("ReferencedVariableNameSegment"),
7536                            ]),
7537                        ]),
7538                    ]),
7539                ])
7540                .to_matchable(),
7541            )
7542            .to_matchable()
7543            .into(),
7544        ),
7545        (
7546            "PutStatementSegment".into(),
7547            NodeMatcher::new(
7548                SyntaxKind::PutStatement,
7549                Sequence::new(vec_of_erased![
7550                    Ref::keyword("PUT"),
7551                    one_of(vec_of_erased![
7552                        Ref::new("UnquotedFilePath"),
7553                        Ref::new("QuotedLiteralSegment"),
7554                    ]),
7555                    Ref::new("StagePath"),
7556                    any_set_of(vec_of_erased![
7557                        Sequence::new(vec_of_erased![
7558                            Ref::keyword("PARALLEL"),
7559                            Ref::new("EqualsSegment"),
7560                            Ref::new("IntegerSegment"),
7561                        ]),
7562                        Sequence::new(vec_of_erased![
7563                            Ref::keyword("AUTO_COMPRESS"),
7564                            Ref::new("EqualsSegment"),
7565                            Ref::new("BooleanLiteralGrammar"),
7566                        ]),
7567                        Sequence::new(vec_of_erased![
7568                            Ref::keyword("SOURCE_COMPRESSION"),
7569                            Ref::new("EqualsSegment"),
7570                            Ref::new("CompressionType"),
7571                        ]),
7572                        Sequence::new(vec_of_erased![
7573                            Ref::keyword("OVERWRITE"),
7574                            Ref::new("EqualsSegment"),
7575                            Ref::new("BooleanLiteralGrammar"),
7576                        ]),
7577                    ]),
7578                ])
7579                .to_matchable(),
7580            )
7581            .to_matchable()
7582            .into(),
7583        ),
7584        (
7585            "RemoveStatementSegment".into(),
7586            NodeMatcher::new(
7587                SyntaxKind::RemoveStatement,
7588                Sequence::new(vec_of_erased![
7589                    one_of(vec_of_erased![Ref::keyword("REMOVE"), Ref::keyword("RM"),]),
7590                    Ref::new("StagePath"),
7591                    Sequence::new(vec_of_erased![
7592                        Ref::keyword("PATTERN"),
7593                        Ref::new("EqualsSegment"),
7594                        one_of(vec_of_erased![
7595                            Ref::new("QuotedLiteralSegment"),
7596                            Ref::new("ReferencedVariableNameSegment"),
7597                        ]),
7598                    ])
7599                    .config(|this| this.optional()),
7600                ])
7601                .to_matchable(),
7602            )
7603            .to_matchable()
7604            .into(),
7605        ),
7606    ]);
7607
7608    snowflake_dialect.replace_grammar(
7609        "SetOperatorSegment",
7610        one_of(vec_of_erased![
7611            Sequence::new(vec_of_erased![
7612                Ref::keyword("UNION"),
7613                one_of(vec_of_erased![
7614                    Ref::keyword("DISTINCT"),
7615                    Ref::keyword("ALL"),
7616                ])
7617                .config(|this| this.optional()),
7618            ]),
7619            Sequence::new(vec_of_erased![
7620                one_of(vec_of_erased![
7621                    Ref::keyword("INTERSECT"),
7622                    Ref::keyword("EXCEPT"),
7623                ]),
7624                Ref::keyword("ALL").optional(),
7625            ]),
7626            Ref::keyword("MINUS"),
7627        ])
7628        .to_matchable(),
7629    );
7630
7631    snowflake_dialect.add([(
7632        "ShorthandCastSegment".into(),
7633        NodeMatcher::new(
7634            SyntaxKind::CastExpression,
7635            Sequence::new(vec_of_erased![
7636                one_of(vec_of_erased![
7637                    Ref::new("Expression_D_Grammar"),
7638                    Ref::new("CaseExpressionSegment"),
7639                ]),
7640                AnyNumberOf::new(vec_of_erased![Sequence::new(vec_of_erased![
7641                    Ref::new("CastOperatorSegment"),
7642                    Ref::new("DatatypeSegment"),
7643                    one_of(vec_of_erased![
7644                        Ref::new("TimeZoneGrammar"),
7645                        AnyNumberOf::new(vec_of_erased![Ref::new("ArrayAccessorSegment"),]),
7646                    ])
7647                    .config(|this| this.optional()),
7648                ]),])
7649                .config(|this| this.min_times(1)),
7650            ])
7651            .to_matchable(),
7652        )
7653        .to_matchable()
7654        .into(),
7655    )]);
7656
7657    snowflake_dialect.expand();
7658    snowflake_dialect
7659}