sqruff_lib_dialects/
redshift.rs

1use itertools::Itertools;
2use sqruff_lib_core::dialects::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::delimited::Delimited;
10use sqruff_lib_core::parser::grammar::sequence::{Bracketed, Sequence};
11use sqruff_lib_core::parser::grammar::{Anything, Nothing, Ref};
12use sqruff_lib_core::parser::lexer::Matcher;
13use sqruff_lib_core::parser::matchable::MatchableTrait;
14use sqruff_lib_core::parser::node_matcher::NodeMatcher;
15use sqruff_lib_core::parser::parsers::RegexParser;
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 crate::redshift_keywords::{REDSHIFT_RESERVED_KEYWORDS, REDSHIFT_UNRESERVED_KEYWORDS};
22
23pub fn dialect() -> Dialect {
24    raw_dialect().config(|this| this.expand())
25}
26
27pub fn raw_dialect() -> Dialect {
28    let postgres_dialect = super::postgres::raw_dialect();
29    let ansi_dialect = super::ansi::raw_dialect();
30    let mut redshift_dialect = postgres_dialect.clone();
31    redshift_dialect.name = DialectKind::Redshift;
32
33    redshift_dialect.sets_mut("unreserved_keywords").clear();
34    redshift_dialect.update_keywords_set_from_multiline_string(
35        "unreserved_keywords",
36        REDSHIFT_UNRESERVED_KEYWORDS,
37    );
38    redshift_dialect.sets_mut("reserved_keywords").clear();
39    redshift_dialect
40        .update_keywords_set_from_multiline_string("reserved_keywords", REDSHIFT_RESERVED_KEYWORDS);
41    redshift_dialect.sets_mut("bare_functions").clear();
42    redshift_dialect.sets_mut("bare_functions").extend([
43        "current_date",
44        "sysdate",
45        "current_time",
46        "current_timestamp",
47        "user",
48        "current_user",
49        "current_aws_account",
50        "current_namespace",
51        "current_user_id",
52    ]);
53    redshift_dialect
54        .sets_mut("date_part_function_name")
55        .extend(["DATEADD", "DATEDIFF", "EXTRACT", "DATE_PART"]);
56    redshift_dialect.sets_mut("datetime_units").extend([
57        "MILLENNIUM",
58        "MILLENNIA",
59        "MIL",
60        "MILS",
61        "CENTURY",
62        "CENTURIES",
63        "C",
64        "CENT",
65        "CENTS",
66        "DECADE",
67        "DECADES",
68        "DEC",
69        "DECS",
70        "EPOCH",
71        "YEAR",
72        "YEARS",
73        "Y",
74        "YR",
75        "YRS",
76        "QUARTER",
77        "QUARTERS",
78        "QTR",
79        "QTRS",
80        "MONTH",
81        "MONTHS",
82        "MON",
83        "MONS",
84        "WEEK",
85        "WEEKS",
86        "W",
87        "DAYOFWEEK",
88        "DOW",
89        "DW",
90        "WEEKDAY",
91        "DAYOFYEAR",
92        "DOY",
93        "DY",
94        "YEARDAY",
95        "DAY",
96        "DAYS",
97        "D",
98        "HOUR",
99        "HOURS",
100        "H",
101        "HR",
102        "HRS",
103        "MINUTE",
104        "MINUTES",
105        "M",
106        "MIN",
107        "MINS",
108        "SECOND",
109        "SECONDS",
110        "S",
111        "SEC",
112        "SECS",
113        "MILLISECOND",
114        "MILLISECONDS",
115        "MS",
116        "MSEC",
117        "MSECS",
118        "MSECOND",
119        "MSECONDS",
120        "MILLISEC",
121        "MILLISECS",
122        "MILLISECON",
123        "MICROSECOND",
124        "MICROSECONDS",
125        "MICROSEC",
126        "MICROSECS",
127        "MICROSECOND",
128        "USECOND",
129        "USECONDS",
130        "US",
131        "USEC",
132        "USECS",
133        "TIMEZONE",
134        "TIMEZONE_HOUR",
135        "TIMEZONE_MINUTE",
136    ]);
137    redshift_dialect.add([
138        (
139            "WellKnownTextGeometrySegment".into(),
140            Nothing::new().to_matchable().into(),
141        ),
142        (
143            "JoinLikeClauseGrammar".into(),
144            Sequence::new(vec_of_erased![
145                any_set_of(vec_of_erased![
146                    Ref::new("FromPivotExpressionSegment"),
147                    Ref::new("FromUnpivotExpressionSegment")
148                ])
149                .config(|this| {
150                    this.min_times = 1;
151                }),
152                Ref::new("AliasExpressionSegment").optional()
153            ])
154            .to_matchable()
155            .into(),
156        ),
157        (
158            "NakedIdentifierSegment".into(),
159            SegmentGenerator::new(|dialect| {
160                // Generate the anti template from the set of reserved keywords
161                let reserved_keywords = dialect.sets("reserved_keywords");
162                let pattern = reserved_keywords.iter().join("|");
163                let anti_template = format!("^({pattern})$");
164
165                RegexParser::new(
166                    "#?([A-Z_]+|[0-9]+[A-Z_$])[A-Z0-9_$]*",
167                    SyntaxKind::NakedIdentifier,
168                )
169                .anti_template(&anti_template)
170                .to_matchable()
171            })
172            .into(),
173        ),
174    ]);
175
176    redshift_dialect.patch_lexer_matchers(vec![Matcher::regex(
177        "word",
178        r"#?[0-9a-zA-Z_]+[0-9a-zA-Z_$]*",
179        SyntaxKind::Word,
180    )]);
181
182    redshift_dialect.add([
183        (
184            "CompressionTypeGrammar".into(),
185            one_of(vec_of_erased![
186                Ref::keyword("BZIP2"),
187                Ref::keyword("GZIP"),
188                Ref::keyword("LZOP"),
189                Ref::keyword("ZSTD")
190            ])
191            .to_matchable()
192            .into(),
193        ),
194        (
195            "ArgModeGrammar".into(),
196            one_of(vec_of_erased![
197                Ref::keyword("IN"),
198                Ref::keyword("OUT"),
199                Ref::keyword("INOUT")
200            ])
201            .to_matchable()
202            .into(),
203        ),
204        (
205            "ColumnEncodingGrammar".into(),
206            one_of(vec_of_erased![
207                Ref::keyword("RAW"),
208                Ref::keyword("AZ64"),
209                Ref::keyword("BYTEDICT"),
210                Ref::keyword("DELTA"),
211                Ref::keyword("DELTA32K"),
212                Ref::keyword("LZO"),
213                Ref::keyword("MOSTLY8"),
214                Ref::keyword("MOSTLY16"),
215                Ref::keyword("MOSTLY32"),
216                Ref::keyword("RUNLENGTH"),
217                Ref::keyword("TEXT255"),
218                Ref::keyword("TEXT32K"),
219                Ref::keyword("ZSTD")
220            ])
221            .to_matchable()
222            .into(),
223        ),
224        (
225            "QuotaGrammar".into(),
226            Sequence::new(vec_of_erased![
227                Ref::keyword("QUOTA"),
228                one_of(vec_of_erased![
229                    Sequence::new(vec_of_erased![
230                        Ref::new("NumericLiteralSegment"),
231                        one_of(vec_of_erased![
232                            Ref::keyword("MB"),
233                            Ref::keyword("GB"),
234                            Ref::keyword("TB")
235                        ])
236                    ]),
237                    Ref::keyword("UNLIMITED")
238                ])
239            ])
240            .to_matchable()
241            .into(),
242        ),
243    ]);
244
245    redshift_dialect.add([
246        (
247            "FromUnpivotExpressionSegment".into(),
248            NodeMatcher::new(SyntaxKind::FromUnpivotExpression, |_| {
249                Sequence::new(vec_of_erased![
250                    Ref::keyword("UNPIVOT"),
251                    Sequence::new(vec_of_erased![
252                        one_of(vec_of_erased![
253                            Ref::keyword("INCLUDE"),
254                            Ref::keyword("EXCLUDE")
255                        ]),
256                        Ref::keyword("NULLS")
257                    ])
258                    .config(|this| {
259                        this.optional();
260                    }),
261                    Bracketed::new(vec_of_erased![Sequence::new(vec_of_erased![
262                        Ref::new("ColumnReferenceSegment"),
263                        Ref::keyword("FOR"),
264                        Ref::new("ColumnReferenceSegment"),
265                        Ref::keyword("IN"),
266                        Bracketed::new(vec_of_erased![Delimited::new(vec_of_erased![
267                            Sequence::new(vec_of_erased![
268                                Ref::new("ColumnReferenceSegment"),
269                                Ref::new("AliasExpressionSegment").optional()
270                            ])
271                        ])])
272                    ])])
273                ])
274                .to_matchable()
275            })
276            .to_matchable()
277            .into(),
278        ),
279        (
280            "FromPivotExpressionSegment".into(),
281            NodeMatcher::new(SyntaxKind::FromPivotExpression, |_| {
282                Sequence::new(vec_of_erased![
283                    Ref::keyword("PIVOT"),
284                    Bracketed::new(vec_of_erased![Sequence::new(vec_of_erased![
285                        optionally_bracketed(vec_of_erased![Ref::new("FunctionSegment")]),
286                        Ref::new("AliasExpressionSegment").optional(),
287                        Ref::keyword("FOR"),
288                        Ref::new("ColumnReferenceSegment"),
289                        Ref::keyword("IN"),
290                        Bracketed::new(vec_of_erased![Delimited::new(vec_of_erased![
291                            Sequence::new(vec_of_erased![
292                                Ref::new("ExpressionSegment"),
293                                Ref::new("AliasExpressionSegment").optional()
294                            ])
295                        ])])
296                    ])])
297                ])
298                .to_matchable()
299            })
300            .to_matchable()
301            .into(),
302        ),
303        (
304            "DateTimeTypeIdentifier".into(),
305            NodeMatcher::new(SyntaxKind::DatetimeTypeIdentifier, |_| {
306                one_of(vec_of_erased![
307                    Ref::keyword("DATE"),
308                    Ref::keyword("DATETIME"),
309                    Sequence::new(vec_of_erased![
310                        one_of(vec_of_erased![
311                            Ref::keyword("TIME"),
312                            Ref::keyword("TIMESTAMP")
313                        ]),
314                        Sequence::new(vec_of_erased![
315                            one_of(vec_of_erased![
316                                Ref::keyword("WITH"),
317                                Ref::keyword("WITHOUT")
318                            ]),
319                            Ref::keyword("TIME"),
320                            Ref::keyword("ZONE")
321                        ])
322                        .config(|this| {
323                            this.optional();
324                        })
325                    ]),
326                    one_of(vec_of_erased![
327                        Ref::keyword("TIMETZ"),
328                        Ref::keyword("TIMESTAMPTZ")
329                    ])
330                ])
331                .to_matchable()
332            })
333            .to_matchable()
334            .into(),
335        ),
336    ]);
337    redshift_dialect.replace_grammar(
338        "BracketedArguments",
339        Bracketed::new(vec_of_erased![
340            Delimited::new(vec_of_erased![one_of(vec_of_erased![
341                Ref::new("LiteralGrammar"),
342                Ref::keyword("MAX")
343            ])])
344            .config(|this| {
345                this.optional();
346            })
347        ])
348        .to_matchable(),
349    );
350
351    redshift_dialect.add([
352        (
353            "DatatypeSegment".into(),
354            NodeMatcher::new(SyntaxKind::DataType, |_| {
355                one_of(vec_of_erased![
356                    Ref::keyword("SMALLINT"),
357                    Ref::keyword("INT2"),
358                    Ref::keyword("INTEGER"),
359                    Ref::keyword("INT"),
360                    Ref::keyword("INT4"),
361                    Ref::keyword("BIGINT"),
362                    Ref::keyword("INT8"),
363                    Ref::keyword("REAL"),
364                    Ref::keyword("FLOAT4"),
365                    Sequence::new(vec_of_erased![
366                        Ref::keyword("DOUBLE"),
367                        Ref::keyword("PRECISION")
368                    ]),
369                    Ref::keyword("FLOAT8"),
370                    Ref::keyword("FLOAT"),
371                    Sequence::new(vec_of_erased![
372                        one_of(vec_of_erased![
373                            Ref::keyword("DECIMAL"),
374                            Ref::keyword("NUMERIC")
375                        ]),
376                        Ref::new("BracketedArguments").optional()
377                    ]),
378                    one_of(vec_of_erased![
379                        Sequence::new(vec_of_erased![
380                            one_of(vec_of_erased![
381                                Ref::keyword("CHAR"),
382                                Ref::keyword("CHARACTER"),
383                                Ref::keyword("NCHAR"),
384                                Ref::keyword("VARCHAR"),
385                                Sequence::new(vec_of_erased![
386                                    Ref::keyword("CHARACTER"),
387                                    Ref::keyword("VARYING")
388                                ]),
389                                Ref::keyword("NVARCHAR")
390                            ]),
391                            Ref::new("BracketedArguments").optional()
392                        ]),
393                        Ref::keyword("BPCHAR"),
394                        Ref::keyword("TEXT")
395                    ]),
396                    Ref::new("DateTimeTypeIdentifier"),
397                    Ref::keyword("INTERVAL"),
398                    one_of(vec_of_erased![
399                        Ref::keyword("BOOLEAN"),
400                        Ref::keyword("BOOL")
401                    ]),
402                    Ref::keyword("HLLSKETCH"),
403                    Ref::keyword("SUPER"),
404                    Ref::keyword("GEOMETRY"),
405                    Ref::keyword("GEOGRAPHY"),
406                    Sequence::new(vec_of_erased![
407                        one_of(vec_of_erased![
408                            Ref::keyword("VARBYTE"),
409                            Ref::keyword("VARBINARY"),
410                            Sequence::new(vec_of_erased![
411                                Ref::keyword("BINARY"),
412                                Ref::keyword("VARYING")
413                            ])
414                        ]),
415                        Ref::new("BracketedArguments").optional()
416                    ]),
417                    Ref::keyword("ANYELEMENT")
418                ])
419                .to_matchable()
420            })
421            .to_matchable()
422            .into(),
423        ),
424        (
425            "DataFormatSegment".into(),
426            NodeMatcher::new(SyntaxKind::DataFormatSegment, |_| {
427                Sequence::new(vec_of_erased![
428                    Sequence::new(vec_of_erased![
429                        Ref::keyword("FORMAT"),
430                        Ref::keyword("AS").optional()
431                    ])
432                    .config(|this| {
433                        this.optional();
434                    }),
435                    one_of(vec_of_erased![
436                        Sequence::new(vec_of_erased![
437                            Ref::keyword("CSV"),
438                            Sequence::new(vec_of_erased![
439                                Ref::keyword("QUOTE"),
440                                Ref::keyword("AS").optional(),
441                                Ref::new("QuotedLiteralSegment")
442                            ])
443                            .config(|this| {
444                                this.optional();
445                            })
446                        ]),
447                        Sequence::new(vec_of_erased![
448                            Ref::keyword("SHAPEFILE"),
449                            Sequence::new(vec_of_erased![
450                                Ref::keyword("SIMPLIFY"),
451                                Ref::keyword("AUTO").optional(),
452                                Ref::new("NumericLiteralSegment").optional()
453                            ])
454                            .config(|this| {
455                                this.optional();
456                            })
457                        ]),
458                        Sequence::new(vec_of_erased![
459                            one_of(vec_of_erased![Ref::keyword("AVRO"), Ref::keyword("JSON")]),
460                            Sequence::new(vec_of_erased![
461                                Ref::keyword("AS").optional(),
462                                Ref::new("QuotedLiteralSegment")
463                            ])
464                            .config(|this| {
465                                this.optional();
466                            })
467                        ]),
468                        Ref::keyword("PARQUET"),
469                        Ref::keyword("ORC"),
470                        Ref::keyword("RCFILE"),
471                        Ref::keyword("SEQUENCEFILE")
472                    ])
473                ])
474                .to_matchable()
475            })
476            .to_matchable()
477            .into(),
478        ),
479        (
480            "AuthorizationSegment".into(),
481            NodeMatcher::new(SyntaxKind::AuthorizationSegment, |_| {
482                any_set_of(vec_of_erased![
483                    one_of(vec_of_erased![
484                        Sequence::new(vec_of_erased![
485                            Ref::keyword("IAM_ROLE"),
486                            one_of(vec_of_erased![
487                                Ref::keyword("DEFAULT"),
488                                Ref::new("QuotedLiteralSegment")
489                            ])
490                        ]),
491                        Sequence::new(vec_of_erased![
492                            Ref::keyword("WITH").optional(),
493                            Ref::keyword("CREDENTIALS"),
494                            Ref::keyword("AS").optional(),
495                            Ref::new("QuotedLiteralSegment")
496                        ]),
497                        Sequence::new(vec_of_erased![
498                            Ref::keyword("ACCESS_KEY_ID"),
499                            Ref::new("QuotedLiteralSegment"),
500                            Ref::keyword("SECRET_ACCESS_KEY"),
501                            Ref::new("QuotedLiteralSegment"),
502                            Sequence::new(vec_of_erased![
503                                Ref::keyword("SESSION_TOKEN"),
504                                Ref::new("QuotedLiteralSegment")
505                            ])
506                            .config(|this| {
507                                this.optional();
508                            })
509                        ])
510                    ]),
511                    Sequence::new(vec_of_erased![
512                        Ref::keyword("KMS_KEY_ID"),
513                        Ref::new("QuotedLiteralSegment")
514                    ])
515                    .config(|this| {
516                        this.optional();
517                    }),
518                    Sequence::new(vec_of_erased![
519                        Ref::keyword("MASTER_SYMMETRIC_KEY"),
520                        Ref::new("QuotedLiteralSegment")
521                    ])
522                    .config(|this| {
523                        this.optional();
524                    })
525                ])
526                .to_matchable()
527            })
528            .to_matchable()
529            .into(),
530        ),
531        (
532            "ColumnAttributeSegment".into(),
533            NodeMatcher::new(SyntaxKind::ColumnAttributeSegment, |_| {
534                any_set_of(vec_of_erased![
535                    Sequence::new(vec_of_erased![
536                        Ref::keyword("DEFAULT"),
537                        Ref::new("ExpressionSegment")
538                    ]),
539                    Sequence::new(vec_of_erased![
540                        Ref::keyword("IDENTITY"),
541                        Bracketed::new(vec_of_erased![Delimited::new(vec_of_erased![Ref::new(
542                            "NumericLiteralSegment"
543                        )])])
544                        .config(|this| {
545                            this.optional();
546                        })
547                    ]),
548                    Sequence::new(vec_of_erased![
549                        Ref::keyword("GENERATED"),
550                        Ref::keyword("BY"),
551                        Ref::keyword("DEFAULT"),
552                        Ref::keyword("AS"),
553                        Ref::keyword("IDENTITY"),
554                        Bracketed::new(vec_of_erased![Delimited::new(vec_of_erased![Ref::new(
555                            "NumericLiteralSegment"
556                        )])])
557                        .config(|this| {
558                            this.optional();
559                        })
560                    ]),
561                    Sequence::new(vec_of_erased![
562                        Ref::keyword("ENCODE"),
563                        Ref::new("ColumnEncodingGrammar")
564                    ]),
565                    Ref::keyword("DISTKEY"),
566                    Ref::keyword("SORTKEY"),
567                    Sequence::new(vec_of_erased![
568                        Ref::keyword("COLLATE"),
569                        one_of(vec_of_erased![
570                            Ref::keyword("CASE_SENSITIVE"),
571                            Ref::keyword("CASE_INSENSITIVE")
572                        ])
573                    ])
574                ])
575                .to_matchable()
576            })
577            .to_matchable()
578            .into(),
579        ),
580        (
581            "ColumnConstraintSegment".into(),
582            NodeMatcher::new(SyntaxKind::ColumnConstraintSegment, |_| {
583                any_set_of(vec_of_erased![
584                    one_of(vec_of_erased![
585                        Sequence::new(vec_of_erased![Ref::keyword("NOT"), Ref::keyword("NULL")]),
586                        Ref::keyword("NULL")
587                    ]),
588                    one_of(vec_of_erased![
589                        Ref::keyword("UNIQUE"),
590                        Ref::new("PrimaryKeyGrammar")
591                    ]),
592                    Sequence::new(vec_of_erased![
593                        Ref::keyword("REFERENCES"),
594                        Ref::new("TableReferenceSegment"),
595                        Bracketed::new(vec_of_erased![Ref::new("ColumnReferenceSegment")]).config(
596                            |this| {
597                                this.optional();
598                            }
599                        )
600                    ])
601                ])
602                .to_matchable()
603            })
604            .to_matchable()
605            .into(),
606        ),
607        (
608            "AlterTableActionSegment".into(),
609            NodeMatcher::new(SyntaxKind::AlterTableActionSegment, |_| {
610                one_of(vec_of_erased![
611                    Sequence::new(vec_of_erased![
612                        Ref::keyword("ADD"),
613                        Ref::new("TableConstraintSegment"),
614                        Sequence::new(vec_of_erased![Ref::keyword("NOT"), Ref::keyword("VALID")])
615                            .config(|this| {
616                                this.optional();
617                            })
618                    ]),
619                    Sequence::new(vec_of_erased![
620                        Ref::keyword("VALIDATE"),
621                        Ref::keyword("CONSTRAINT"),
622                        Ref::new("ParameterNameSegment")
623                    ]),
624                    Sequence::new(vec_of_erased![
625                        Ref::keyword("DROP"),
626                        Ref::keyword("CONSTRAINT"),
627                        Ref::new("ParameterNameSegment"),
628                        Ref::new("DropBehaviorGrammar").optional()
629                    ]),
630                    Sequence::new(vec_of_erased![
631                        Ref::keyword("OWNER"),
632                        Ref::keyword("TO"),
633                        one_of(vec_of_erased![one_of(vec_of_erased![
634                            Ref::new("ParameterNameSegment"),
635                            Ref::new("QuotedIdentifierSegment")
636                        ])])
637                    ]),
638                    Sequence::new(vec_of_erased![
639                        Ref::keyword("RENAME"),
640                        Ref::keyword("TO"),
641                        one_of(vec_of_erased![one_of(vec_of_erased![
642                            Ref::new("ParameterNameSegment"),
643                            Ref::new("QuotedIdentifierSegment")
644                        ])])
645                    ]),
646                    Sequence::new(vec_of_erased![
647                        Ref::keyword("RENAME"),
648                        Ref::keyword("COLUMN"),
649                        Ref::keyword("TO"),
650                        one_of(vec_of_erased![Ref::new("ColumnReferenceSegment")])
651                    ]),
652                    Sequence::new(vec_of_erased![
653                        Ref::keyword("ALTER"),
654                        Ref::keyword("COLUMN").optional(),
655                        Ref::new("ColumnReferenceSegment"),
656                        one_of(vec_of_erased![
657                            Sequence::new(vec_of_erased![
658                                Ref::keyword("TYPE"),
659                                Ref::new("DatatypeSegment")
660                            ]),
661                            Sequence::new(vec_of_erased![
662                                Ref::keyword("ENCODE"),
663                                Delimited::new(vec_of_erased![Ref::new("ColumnEncodingGrammar")])
664                            ])
665                        ])
666                    ]),
667                    Sequence::new(vec_of_erased![
668                        Ref::keyword("ALTER"),
669                        Ref::keyword("DISTKEY"),
670                        Ref::new("ColumnReferenceSegment")
671                    ]),
672                    Sequence::new(vec_of_erased![
673                        Ref::keyword("ALTER"),
674                        Ref::keyword("DISTSTYLE"),
675                        one_of(vec_of_erased![
676                            Ref::keyword("ALL"),
677                            Ref::keyword("EVEN"),
678                            Sequence::new(vec_of_erased![
679                                Ref::keyword("KEY"),
680                                Ref::keyword("DISTKEY"),
681                                Ref::new("ColumnReferenceSegment")
682                            ]),
683                            Ref::keyword("AUTO")
684                        ])
685                    ]),
686                    Sequence::new(vec_of_erased![
687                        Ref::keyword("ALTER"),
688                        Ref::keyword("COMPOUND").optional(),
689                        Ref::keyword("SORTKEY"),
690                        Bracketed::new(vec_of_erased![Delimited::new(vec_of_erased![Ref::new(
691                            "ColumnReferenceSegment"
692                        )])])
693                    ]),
694                    Sequence::new(vec_of_erased![
695                        Ref::keyword("ALTER"),
696                        Ref::keyword("SORTKEY"),
697                        one_of(vec_of_erased![Ref::keyword("AUTO"), Ref::keyword("NONE")])
698                    ]),
699                    Sequence::new(vec_of_erased![
700                        Ref::keyword("ALTER"),
701                        Ref::keyword("ENCODE"),
702                        Ref::keyword("AUTO")
703                    ]),
704                    Sequence::new(vec_of_erased![
705                        Ref::keyword("ADD"),
706                        Ref::keyword("COLUMN").optional(),
707                        Ref::new("ColumnReferenceSegment"),
708                        Ref::new("DatatypeSegment"),
709                        Sequence::new(vec_of_erased![
710                            Ref::keyword("DEFAULT"),
711                            Ref::new("ExpressionSegment")
712                        ])
713                        .config(|this| {
714                            this.optional();
715                        }),
716                        Sequence::new(vec_of_erased![
717                            Ref::keyword("COLLATE"),
718                            Ref::new("CollationReferenceSegment")
719                        ])
720                        .config(|this| {
721                            this.optional();
722                        }),
723                        AnyNumberOf::new(vec_of_erased![Ref::new("ColumnConstraintSegment")])
724                    ]),
725                    Sequence::new(vec_of_erased![
726                        Ref::keyword("DROP"),
727                        Ref::keyword("COLUMN").optional(),
728                        Ref::new("ColumnReferenceSegment"),
729                        Ref::new("DropBehaviorGrammar").optional()
730                    ])
731                ])
732                .to_matchable()
733            })
734            .to_matchable()
735            .into(),
736        ),
737        (
738            "TableAttributeSegment".into(),
739            NodeMatcher::new(SyntaxKind::TableConstraint, |_| {
740                any_set_of(vec_of_erased![
741                    Sequence::new(vec_of_erased![
742                        Ref::keyword("DISTSTYLE"),
743                        one_of(vec_of_erased![
744                            Ref::keyword("AUTO"),
745                            Ref::keyword("EVEN"),
746                            Ref::keyword("KEY"),
747                            Ref::keyword("ALL")
748                        ])
749                    ])
750                    .config(|this| {
751                        this.optional();
752                    }),
753                    Sequence::new(vec_of_erased![
754                        Ref::keyword("DISTKEY"),
755                        Bracketed::new(vec_of_erased![Ref::new("ColumnReferenceSegment")])
756                    ])
757                    .config(|this| {
758                        this.optional();
759                    }),
760                    one_of(vec_of_erased![
761                        Sequence::new(vec_of_erased![
762                            one_of(vec_of_erased![
763                                Ref::keyword("COMPOUND"),
764                                Ref::keyword("INTERLEAVED")
765                            ])
766                            .config(|this| {
767                                this.optional();
768                            }),
769                            Ref::keyword("SORTKEY"),
770                            Bracketed::new(vec_of_erased![Delimited::new(vec_of_erased![
771                                Ref::new("ColumnReferenceSegment")
772                            ])])
773                        ]),
774                        Sequence::new(vec_of_erased![
775                            Ref::keyword("SORTKEY"),
776                            Ref::keyword("AUTO")
777                        ])
778                    ])
779                    .config(|this| {
780                        this.optional();
781                    }),
782                    Sequence::new(vec_of_erased![Ref::keyword("ENCODE"), Ref::keyword("AUTO")])
783                        .config(|this| {
784                            this.optional();
785                        })
786                ])
787                .to_matchable()
788            })
789            .to_matchable()
790            .into(),
791        ),
792        (
793            "TableConstraintSegment".into(),
794            NodeMatcher::new(SyntaxKind::TableConstraint, |_| {
795                Sequence::new(vec_of_erased![
796                    Sequence::new(vec_of_erased![
797                        Ref::keyword("CONSTRAINT"),
798                        Ref::new("ObjectReferenceSegment")
799                    ])
800                    .config(|this| {
801                        this.optional();
802                    }),
803                    one_of(vec_of_erased![
804                        Sequence::new(vec_of_erased![
805                            Ref::keyword("UNIQUE"),
806                            Bracketed::new(vec_of_erased![Delimited::new(vec_of_erased![
807                                Ref::new("ColumnReferenceSegment")
808                            ])])
809                        ]),
810                        Sequence::new(vec_of_erased![
811                            Ref::keyword("PRIMARY"),
812                            Ref::keyword("KEY"),
813                            Bracketed::new(vec_of_erased![Delimited::new(vec_of_erased![
814                                Ref::new("ColumnReferenceSegment")
815                            ])])
816                        ]),
817                        Sequence::new(vec_of_erased![
818                            Ref::keyword("FOREIGN"),
819                            Ref::keyword("KEY"),
820                            Bracketed::new(vec_of_erased![Delimited::new(vec_of_erased![
821                                Ref::new("ColumnReferenceSegment")
822                            ])]),
823                            Ref::keyword("REFERENCES"),
824                            Ref::new("TableReferenceSegment"),
825                            Sequence::new(vec_of_erased![Bracketed::new(vec_of_erased![
826                                Ref::new("ColumnReferenceSegment")
827                            ])])
828                        ])
829                    ])
830                ])
831                .to_matchable()
832            })
833            .to_matchable()
834            .into(),
835        ),
836        (
837            "LikeOptionSegment".into(),
838            NodeMatcher::new(SyntaxKind::LikeOptionSegment, |_| {
839                Sequence::new(vec_of_erased![
840                    one_of(vec_of_erased![
841                        Ref::keyword("INCLUDING"),
842                        Ref::keyword("EXCLUDING")
843                    ]),
844                    Ref::keyword("DEFAULTS")
845                ])
846                .to_matchable()
847            })
848            .to_matchable()
849            .into(),
850        ),
851        (
852            "CreateTableStatementSegment".into(),
853            NodeMatcher::new(SyntaxKind::CreateTableStatement, |_| {
854                Sequence::new(vec_of_erased![
855                    Ref::keyword("CREATE"),
856                    Ref::keyword("LOCAL").optional(),
857                    Ref::new("TemporaryGrammar").optional(),
858                    Ref::keyword("TABLE"),
859                    Ref::new("IfNotExistsGrammar").optional(),
860                    Ref::new("TableReferenceSegment"),
861                    Bracketed::new(vec_of_erased![Delimited::new(vec_of_erased![
862                        AnyNumberOf::new(vec_of_erased![
863                            Sequence::new(vec_of_erased![
864                                Ref::new("ColumnReferenceSegment"),
865                                Ref::new("DatatypeSegment"),
866                                AnyNumberOf::new(vec_of_erased![
867                                    Ref::new("ColumnAttributeSegment"),
868                                    Ref::new("ColumnConstraintSegment")
869                                ])
870                                .config(|this| {
871                                    this.optional();
872                                })
873                            ]),
874                            Ref::new("TableConstraintSegment"),
875                            Sequence::new(vec_of_erased![
876                                Ref::keyword("LIKE"),
877                                Ref::new("TableReferenceSegment"),
878                                AnyNumberOf::new(vec_of_erased![Ref::new("LikeOptionSegment")])
879                                    .config(|this| {
880                                        this.optional();
881                                    })
882                            ])
883                        ])
884                    ])]),
885                    Sequence::new(vec_of_erased![
886                        Ref::keyword("BACKUP"),
887                        one_of(vec_of_erased![Ref::keyword("YES"), Ref::keyword("NO")]).config(
888                            |this| {
889                                this.optional();
890                            }
891                        )
892                    ])
893                    .config(|this| {
894                        this.optional();
895                    }),
896                    AnyNumberOf::new(vec_of_erased![Ref::new("TableAttributeSegment")]).config(
897                        |this| {
898                            this.optional();
899                        }
900                    )
901                ])
902                .to_matchable()
903            })
904            .to_matchable()
905            .into(),
906        ),
907        (
908            "CreateTableAsStatementSegment".into(),
909            NodeMatcher::new(SyntaxKind::CreateTableAsStatement, |_| {
910                Sequence::new(vec_of_erased![
911                    Ref::keyword("CREATE"),
912                    Sequence::new(vec_of_erased![
913                        Ref::keyword("LOCAL").optional(),
914                        one_of(vec_of_erased![
915                            Ref::keyword("TEMPORARY"),
916                            Ref::keyword("TEMP")
917                        ])
918                    ])
919                    .config(|this| {
920                        this.optional();
921                    }),
922                    Ref::keyword("TABLE"),
923                    Ref::new("ObjectReferenceSegment"),
924                    Bracketed::new(vec_of_erased![Delimited::new(vec_of_erased![Ref::new(
925                        "ColumnReferenceSegment"
926                    )])])
927                    .config(|this| {
928                        this.optional();
929                    }),
930                    Sequence::new(vec_of_erased![
931                        Ref::keyword("BACKUP"),
932                        one_of(vec_of_erased![Ref::keyword("YES"), Ref::keyword("NO")])
933                    ])
934                    .config(|this| {
935                        this.optional();
936                    }),
937                    Ref::new("TableAttributeSegment").optional(),
938                    Ref::keyword("AS"),
939                    optionally_bracketed(vec_of_erased![Ref::new("SelectableGrammar")])
940                ])
941                .to_matchable()
942            })
943            .to_matchable()
944            .into(),
945        ),
946        (
947            "CreateModelStatementSegment".into(),
948            NodeMatcher::new(SyntaxKind::CreateModelStatement, |_| {
949                Sequence::new(vec_of_erased![
950                    Ref::keyword("CREATE"),
951                    Ref::keyword("MODEL"),
952                    Ref::new("ObjectReferenceSegment"),
953                    Sequence::new(vec_of_erased![
954                        Ref::keyword("FROM"),
955                        one_of(vec_of_erased![
956                            Ref::new("QuotedLiteralSegment"),
957                            Bracketed::new(vec_of_erased![Ref::new("SelectableGrammar")]),
958                            Ref::new("ObjectReferenceSegment")
959                        ])
960                    ])
961                    .config(|this| {
962                        this.optional();
963                    }),
964                    Sequence::new(vec_of_erased![
965                        Ref::keyword("TARGET"),
966                        Ref::new("ColumnReferenceSegment")
967                    ])
968                    .config(|this| {
969                        this.optional();
970                    }),
971                    Sequence::new(vec_of_erased![
972                        Ref::keyword("FUNCTION"),
973                        Ref::new("ObjectReferenceSegment"),
974                        Bracketed::new(vec_of_erased![Delimited::new(vec_of_erased![Ref::new(
975                            "DatatypeSegment"
976                        )])])
977                        .config(|this| {
978                            this.optional();
979                        })
980                    ]),
981                    Sequence::new(vec_of_erased![
982                        Ref::keyword("RETURNS"),
983                        Ref::new("DatatypeSegment")
984                    ])
985                    .config(|this| {
986                        this.optional();
987                    }),
988                    Sequence::new(vec_of_erased![
989                        Ref::keyword("SAGEMAKER"),
990                        Ref::new("QuotedLiteralSegment")
991                    ])
992                    .config(|this| {
993                        this.optional();
994                    }),
995                    Sequence::new(vec_of_erased![
996                        Ref::keyword("IAM_ROLE"),
997                        one_of(vec_of_erased![
998                            Ref::keyword("DEFAULT"),
999                            Ref::new("QuotedLiteralSegment")
1000                        ])
1001                    ]),
1002                    Sequence::new(vec_of_erased![
1003                        Ref::keyword("AUTO"),
1004                        one_of(vec_of_erased![Ref::keyword("ON"), Ref::keyword("OFF")])
1005                    ])
1006                    .config(|this| {
1007                        this.optional();
1008                    }),
1009                    Sequence::new(vec_of_erased![
1010                        Ref::keyword("MODEL_TYPE"),
1011                        one_of(vec_of_erased![
1012                            Ref::keyword("XGBOOST"),
1013                            Ref::keyword("MLP"),
1014                            Ref::keyword("KMEANS")
1015                        ])
1016                    ])
1017                    .config(|this| {
1018                        this.optional();
1019                    }),
1020                    Sequence::new(vec_of_erased![
1021                        Ref::keyword("PROBLEM_TYPE"),
1022                        one_of(vec_of_erased![
1023                            Ref::keyword("REGRESSION"),
1024                            Ref::keyword("BINARY_CLASSIFICATION"),
1025                            Ref::keyword("MULTICLASS_CLASSIFICATION")
1026                        ])
1027                    ])
1028                    .config(|this| {
1029                        this.optional();
1030                    }),
1031                    Sequence::new(vec_of_erased![
1032                        Ref::keyword("OBJECTIVE"),
1033                        Ref::new("QuotedLiteralSegment")
1034                    ])
1035                    .config(|this| {
1036                        this.optional();
1037                    }),
1038                    Sequence::new(vec_of_erased![
1039                        Ref::keyword("PREPROCESSORS"),
1040                        Ref::new("QuotedLiteralSegment")
1041                    ])
1042                    .config(|this| {
1043                        this.optional();
1044                    }),
1045                    Sequence::new(vec_of_erased![
1046                        Ref::keyword("HYPERPARAMETERS"),
1047                        Ref::keyword("DEFAULT"),
1048                        Sequence::new(vec_of_erased![
1049                            Ref::keyword("EXCEPT"),
1050                            Bracketed::new(vec_of_erased![Delimited::new(vec_of_erased![
1051                                Anything::new()
1052                            ])])
1053                        ])
1054                        .config(|this| {
1055                            this.optional();
1056                        })
1057                    ])
1058                    .config(|this| {
1059                        this.optional();
1060                    }),
1061                    Sequence::new(vec_of_erased![
1062                        Ref::keyword("SETTINGS"),
1063                        Bracketed::new(vec_of_erased![Sequence::new(vec_of_erased![
1064                            Ref::keyword("S3_BUCKET"),
1065                            Ref::new("QuotedLiteralSegment"),
1066                            Sequence::new(vec_of_erased![
1067                                Ref::keyword("KMS_KEY_ID"),
1068                                Ref::new("QuotedLiteralSegment")
1069                            ])
1070                            .config(|this| {
1071                                this.optional();
1072                            }),
1073                            Sequence::new(vec_of_erased![
1074                                Ref::keyword("S3_GARBAGE_COLLECT"),
1075                                one_of(vec_of_erased![Ref::keyword("ON"), Ref::keyword("OFF")])
1076                            ])
1077                            .config(|this| {
1078                                this.optional();
1079                            }),
1080                            Sequence::new(vec_of_erased![
1081                                Ref::keyword("MAX_CELLS"),
1082                                Ref::new("NumericLiteralSegment")
1083                            ])
1084                            .config(|this| {
1085                                this.optional();
1086                            }),
1087                            Sequence::new(vec_of_erased![
1088                                Ref::keyword("MAX_RUNTIME"),
1089                                Ref::new("NumericLiteralSegment")
1090                            ])
1091                            .config(|this| {
1092                                this.optional();
1093                            })
1094                        ])])
1095                    ])
1096                    .config(|this| {
1097                        this.optional();
1098                    })
1099                ])
1100                .to_matchable()
1101            })
1102            .to_matchable()
1103            .into(),
1104        ),
1105        (
1106            "ShowModelStatementSegment".into(),
1107            NodeMatcher::new(SyntaxKind::ShowModelStatement, |_| {
1108                Sequence::new(vec_of_erased![
1109                    Ref::keyword("SHOW"),
1110                    Ref::keyword("MODEL"),
1111                    one_of(vec_of_erased![
1112                        Ref::keyword("ALL"),
1113                        Ref::new("ObjectReferenceSegment")
1114                    ])
1115                ])
1116                .to_matchable()
1117            })
1118            .to_matchable()
1119            .into(),
1120        ),
1121        (
1122            "CreateExternalTableStatementSegment".into(),
1123            NodeMatcher::new(SyntaxKind::CreateExternalTableStatement, |_| {
1124                Sequence::new(vec_of_erased![
1125                    Ref::keyword("CREATE"),
1126                    Ref::keyword("EXTERNAL"),
1127                    Ref::keyword("TABLE"),
1128                    Ref::new("TableReferenceSegment"),
1129                    Bracketed::new(vec_of_erased![Delimited::new(vec_of_erased![
1130                        Sequence::new(vec_of_erased![
1131                            Ref::new("ColumnReferenceSegment"),
1132                            Ref::new("DatatypeSegment")
1133                        ])
1134                    ])]),
1135                    Ref::new("PartitionedBySegment").optional(),
1136                    Sequence::new(vec_of_erased![
1137                        Ref::keyword("ROW"),
1138                        Ref::keyword("FORMAT"),
1139                        one_of(vec_of_erased![
1140                            Sequence::new(vec_of_erased![
1141                                Ref::keyword("DELIMITED"),
1142                                Ref::new("RowFormatDelimitedSegment")
1143                            ]),
1144                            Sequence::new(vec_of_erased![
1145                                Ref::keyword("SERDE"),
1146                                Ref::new("QuotedLiteralSegment"),
1147                                Sequence::new(vec_of_erased![
1148                                    Ref::keyword("WITH"),
1149                                    Ref::keyword("SERDEPROPERTIES"),
1150                                    Bracketed::new(vec_of_erased![Delimited::new(vec_of_erased![
1151                                        Sequence::new(vec_of_erased![
1152                                            Ref::new("QuotedLiteralSegment"),
1153                                            Ref::new("EqualsSegment"),
1154                                            Ref::new("QuotedLiteralSegment")
1155                                        ])
1156                                    ])])
1157                                ])
1158                                .config(|this| {
1159                                    this.optional();
1160                                })
1161                            ])
1162                        ])
1163                    ])
1164                    .config(|this| {
1165                        this.optional();
1166                    }),
1167                    Ref::keyword("STORED"),
1168                    Ref::keyword("AS"),
1169                    one_of(vec_of_erased![
1170                        Ref::keyword("PARQUET"),
1171                        Ref::keyword("RCFILE"),
1172                        Ref::keyword("SEQUENCEFILE"),
1173                        Ref::keyword("TEXTFILE"),
1174                        Ref::keyword("ORC"),
1175                        Ref::keyword("AVRO"),
1176                        Sequence::new(vec_of_erased![
1177                            Ref::keyword("INPUTFORMAT"),
1178                            Ref::new("QuotedLiteralSegment"),
1179                            Ref::keyword("OUTPUTFORMAT"),
1180                            Ref::new("QuotedLiteralSegment")
1181                        ])
1182                    ]),
1183                    Ref::keyword("LOCATION"),
1184                    Ref::new("QuotedLiteralSegment"),
1185                    Sequence::new(vec_of_erased![
1186                        Ref::keyword("TABLE"),
1187                        Ref::keyword("PROPERTIES"),
1188                        Bracketed::new(vec_of_erased![Delimited::new(vec_of_erased![
1189                            Sequence::new(vec_of_erased![
1190                                Ref::new("QuotedLiteralSegment"),
1191                                Ref::new("EqualsSegment"),
1192                                Ref::new("QuotedLiteralSegment")
1193                            ])
1194                        ])])
1195                    ])
1196                    .config(|this| {
1197                        this.optional();
1198                    })
1199                ])
1200                .to_matchable()
1201            })
1202            .to_matchable()
1203            .into(),
1204        ),
1205        (
1206            "CreateExternalTableAsStatementSegment".into(),
1207            NodeMatcher::new(SyntaxKind::CreateExternalTableStatement, |_| {
1208                Sequence::new(vec_of_erased![
1209                    Ref::keyword("CREATE"),
1210                    Ref::keyword("EXTERNAL"),
1211                    Ref::keyword("TABLE"),
1212                    Ref::new("TableReferenceSegment"),
1213                    Ref::new("PartitionedBySegment").optional(),
1214                    Sequence::new(vec_of_erased![
1215                        Ref::keyword("ROW"),
1216                        Ref::keyword("FORMAT"),
1217                        Ref::keyword("DELIMITED"),
1218                        Ref::new("RowFormatDelimitedSegment")
1219                    ])
1220                    .config(|this| {
1221                        this.optional();
1222                    }),
1223                    Ref::keyword("STORED"),
1224                    Ref::keyword("AS"),
1225                    one_of(vec_of_erased![
1226                        Ref::keyword("PARQUET"),
1227                        Ref::keyword("TEXTFILE")
1228                    ]),
1229                    Ref::keyword("LOCATION"),
1230                    Ref::new("QuotedLiteralSegment"),
1231                    Sequence::new(vec_of_erased![
1232                        Ref::keyword("TABLE"),
1233                        Ref::keyword("PROPERTIES"),
1234                        Bracketed::new(vec_of_erased![Delimited::new(vec_of_erased![
1235                            Sequence::new(vec_of_erased![
1236                                Ref::new("QuotedLiteralSegment"),
1237                                Ref::new("EqualsSegment"),
1238                                Ref::new("QuotedLiteralSegment")
1239                            ])
1240                        ])])
1241                    ])
1242                    .config(|this| {
1243                        this.optional();
1244                    }),
1245                    Ref::keyword("AS"),
1246                    optionally_bracketed(vec_of_erased![Ref::new("SelectableGrammar")])
1247                ])
1248                .to_matchable()
1249            })
1250            .to_matchable()
1251            .into(),
1252        ),
1253        (
1254            "CreateExternalSchemaStatementSegment".into(),
1255            NodeMatcher::new(SyntaxKind::CreateExternalSchemaStatement, |_| {
1256                Sequence::new(vec_of_erased![
1257                    Ref::keyword("CREATE"),
1258                    Ref::keyword("EXTERNAL"),
1259                    Ref::keyword("SCHEMA"),
1260                    Ref::new("IfNotExistsGrammar").optional(),
1261                    Ref::new("SchemaReferenceSegment"),
1262                    Ref::keyword("FROM"),
1263                    one_of(vec_of_erased![
1264                        Sequence::new(vec_of_erased![
1265                            Ref::keyword("DATA"),
1266                            Ref::keyword("CATALOG")
1267                        ]),
1268                        Sequence::new(vec_of_erased![
1269                            Ref::keyword("HIVE"),
1270                            Ref::keyword("METASTORE")
1271                        ]),
1272                        Ref::keyword("POSTGRES"),
1273                        Ref::keyword("MYSQL"),
1274                        Ref::keyword("KINESIS"),
1275                        Ref::keyword("REDSHIFT")
1276                    ]),
1277                    any_set_of(vec_of_erased![
1278                        Sequence::new(vec_of_erased![
1279                            Ref::keyword("DATABASE"),
1280                            Ref::new("QuotedLiteralSegment")
1281                        ]),
1282                        Sequence::new(vec_of_erased![
1283                            Ref::keyword("REGION"),
1284                            Ref::new("QuotedLiteralSegment")
1285                        ]),
1286                        Sequence::new(vec_of_erased![
1287                            Ref::keyword("SCHEMA"),
1288                            Ref::new("QuotedLiteralSegment")
1289                        ]),
1290                        Sequence::new(vec_of_erased![
1291                            Ref::keyword("URI"),
1292                            Ref::new("QuotedLiteralSegment"),
1293                            Sequence::new(vec_of_erased![
1294                                Ref::keyword("PORT"),
1295                                Ref::new("NumericLiteralSegment")
1296                            ])
1297                            .config(|this| {
1298                                this.optional();
1299                            })
1300                        ]),
1301                        Sequence::new(vec_of_erased![
1302                            Ref::keyword("IAM_ROLE"),
1303                            one_of(vec_of_erased![
1304                                Ref::keyword("DEFAULT"),
1305                                Ref::new("QuotedLiteralSegment")
1306                            ])
1307                        ]),
1308                        Sequence::new(vec_of_erased![
1309                            Ref::keyword("SECRET_ARN"),
1310                            Ref::new("QuotedLiteralSegment")
1311                        ]),
1312                        Sequence::new(vec_of_erased![
1313                            Ref::keyword("CATALOG_ROLE"),
1314                            Ref::new("QuotedLiteralSegment")
1315                        ]),
1316                        Sequence::new(vec_of_erased![
1317                            Ref::keyword("CREATE"),
1318                            Ref::keyword("EXTERNAL"),
1319                            Ref::keyword("DATABASE"),
1320                            Ref::keyword("IF"),
1321                            Ref::keyword("NOT"),
1322                            Ref::keyword("EXISTS")
1323                        ])
1324                    ])
1325                    .config(|this| {
1326                        this.optional();
1327                    })
1328                ])
1329                .to_matchable()
1330            })
1331            .to_matchable()
1332            .into(),
1333        ),
1334        (
1335            "CreateLibraryStatementSegment".into(),
1336            NodeMatcher::new(SyntaxKind::CreateLibraryStatement, |_| {
1337                Sequence::new(vec_of_erased![
1338                    Ref::keyword("CREATE"),
1339                    Ref::new("OrReplaceGrammar").optional(),
1340                    Ref::keyword("LIBRARY"),
1341                    Ref::new("ObjectReferenceSegment"),
1342                    Ref::keyword("LANGUAGE"),
1343                    Ref::keyword("PLPYTHONU"),
1344                    Ref::keyword("FROM"),
1345                    Ref::new("QuotedLiteralSegment"),
1346                    any_set_of(vec_of_erased![
1347                        Ref::new("AuthorizationSegment"),
1348                        Sequence::new(vec_of_erased![
1349                            Ref::keyword("REGION"),
1350                            Ref::keyword("AS").optional(),
1351                            Ref::new("QuotedLiteralSegment")
1352                        ])
1353                        .config(|this| {
1354                            this.optional();
1355                        })
1356                    ])
1357                ])
1358                .to_matchable()
1359            })
1360            .to_matchable()
1361            .into(),
1362        ),
1363        (
1364            "UnloadStatementSegment".into(),
1365            NodeMatcher::new(SyntaxKind::UnloadStatement, |_| {
1366                Sequence::new(vec_of_erased![
1367                    Ref::keyword("UNLOAD"),
1368                    Bracketed::new(vec_of_erased![Ref::new("QuotedLiteralSegment")]),
1369                    Ref::keyword("TO"),
1370                    Ref::new("QuotedLiteralSegment"),
1371                    any_set_of(vec_of_erased![
1372                        Ref::new("AuthorizationSegment"),
1373                        Sequence::new(vec_of_erased![
1374                            Ref::keyword("REGION"),
1375                            Ref::keyword("AS").optional(),
1376                            Ref::new("QuotedLiteralSegment")
1377                        ])
1378                        .config(|this| {
1379                            this.optional();
1380                        }),
1381                        Ref::new("CompressionTypeGrammar").optional(),
1382                        Sequence::new(vec_of_erased![
1383                            Sequence::new(vec_of_erased![
1384                                Ref::keyword("FORMAT"),
1385                                Ref::keyword("AS").optional()
1386                            ])
1387                            .config(|this| {
1388                                this.optional();
1389                            }),
1390                            one_of(vec_of_erased![
1391                                Ref::keyword("CSV"),
1392                                Ref::keyword("JSON"),
1393                                Ref::keyword("PARQUET")
1394                            ])
1395                        ])
1396                        .config(|this| {
1397                            this.optional();
1398                        }),
1399                        Sequence::new(vec_of_erased![
1400                            Ref::keyword("PARTITION"),
1401                            Ref::keyword("BY"),
1402                            Ref::new("BracketedColumnReferenceListGrammar"),
1403                            Ref::keyword("INCLUDE").optional()
1404                        ]),
1405                        Sequence::new(vec_of_erased![
1406                            Ref::keyword("PARALLEL"),
1407                            one_of(vec_of_erased![
1408                                Ref::keyword("PRESET"),
1409                                Ref::keyword("ON"),
1410                                Ref::keyword("OFF"),
1411                                Ref::keyword("TRUE"),
1412                                Ref::keyword("FALSE")
1413                            ])
1414                            .config(|this| {
1415                                this.optional();
1416                            })
1417                        ])
1418                        .config(|this| {
1419                            this.optional();
1420                        }),
1421                        one_of(vec_of_erased![
1422                            Sequence::new(vec_of_erased![
1423                                Ref::keyword("DELIMITER"),
1424                                Ref::keyword("AS").optional(),
1425                                Ref::new("QuotedLiteralSegment")
1426                            ]),
1427                            Sequence::new(vec_of_erased![
1428                                Ref::keyword("FIXEDWIDTH"),
1429                                Ref::keyword("AS").optional(),
1430                                Ref::new("QuotedLiteralSegment")
1431                            ])
1432                        ])
1433                        .config(|this| {
1434                            this.optional();
1435                        }),
1436                        Sequence::new(vec_of_erased![
1437                            Ref::keyword("MANIFEST"),
1438                            Ref::keyword("VERBOSE").optional()
1439                        ])
1440                        .config(|this| {
1441                            this.optional();
1442                        }),
1443                        Sequence::new(vec_of_erased![
1444                            Ref::keyword("NULL"),
1445                            Ref::keyword("AS"),
1446                            Ref::new("QuotedLiteralSegment")
1447                        ])
1448                        .config(|this| {
1449                            this.optional();
1450                        }),
1451                        Sequence::new(vec_of_erased![
1452                            Ref::keyword("NULL"),
1453                            Ref::keyword("AS"),
1454                            Ref::new("QuotedLiteralSegment")
1455                        ])
1456                        .config(|this| {
1457                            this.optional();
1458                        }),
1459                        any_set_of(vec_of_erased![
1460                            one_of(vec_of_erased![
1461                                Ref::keyword("MAXFILESIZE"),
1462                                Ref::keyword("ROWGROUPSIZE")
1463                            ]),
1464                            Ref::keyword("AS").optional(),
1465                            Ref::new("NumericLiteralSegment"),
1466                            one_of(vec_of_erased![Ref::keyword("MB"), Ref::keyword("GB")])
1467                        ])
1468                        .config(|this| {
1469                            this.optional();
1470                        }),
1471                        Sequence::new(vec_of_erased![
1472                            Ref::keyword("ENCRYPTED"),
1473                            Ref::keyword("AUTO").optional()
1474                        ])
1475                        .config(|this| {
1476                            this.optional();
1477                        }),
1478                        Ref::keyword("ALLOWOVERWRITE").optional(),
1479                        Ref::keyword("CLEANPATH").optional(),
1480                        Ref::keyword("ESCAPE").optional(),
1481                        Ref::keyword("ADDQUOTES").optional(),
1482                        Ref::keyword("HEADER").optional()
1483                    ])
1484                ])
1485                .to_matchable()
1486            })
1487            .to_matchable()
1488            .into(),
1489        ),
1490    ]);
1491    redshift_dialect.replace_grammar(
1492        "CopyStatementSegment",
1493        Sequence::new(vec_of_erased![
1494            Ref::keyword("COPY"),
1495            Ref::new("TableReferenceSegment"),
1496            Ref::new("BracketedColumnReferenceListGrammar").optional(),
1497            Ref::keyword("FROM"),
1498            Ref::new("QuotedLiteralSegment"),
1499            any_set_of(vec_of_erased![
1500                Ref::new("AuthorizationSegment"),
1501                Sequence::new(vec_of_erased![
1502                    Ref::keyword("REGION"),
1503                    Ref::keyword("AS").optional(),
1504                    Ref::new("QuotedLiteralSegment")
1505                ])
1506                .config(|this| {
1507                    this.optional();
1508                }),
1509                Ref::new("CompressionTypeGrammar").optional(),
1510                Ref::new("DataFormatSegment").optional(),
1511                one_of(vec_of_erased![
1512                    Sequence::new(vec_of_erased![
1513                        Ref::keyword("DELIMITER"),
1514                        Ref::keyword("AS").optional(),
1515                        Ref::new("QuotedLiteralSegment")
1516                    ]),
1517                    Sequence::new(vec_of_erased![
1518                        Ref::keyword("FIXEDWIDTH"),
1519                        Ref::keyword("AS").optional(),
1520                        Ref::new("QuotedLiteralSegment")
1521                    ])
1522                ])
1523                .config(|this| {
1524                    this.optional();
1525                }),
1526                Sequence::new(vec_of_erased![
1527                    Ref::keyword("ENCRYPTED"),
1528                    Ref::keyword("AUTO").optional()
1529                ])
1530                .config(|this| {
1531                    this.optional();
1532                }),
1533                Ref::keyword("MANIFEST").optional(),
1534                Sequence::new(vec_of_erased![
1535                    Ref::keyword("COMPROWS"),
1536                    Ref::new("NumericLiteralSegment")
1537                ])
1538                .config(|this| {
1539                    this.optional();
1540                }),
1541                Sequence::new(vec_of_erased![
1542                    Ref::keyword("MAXERROR"),
1543                    Ref::keyword("AS").optional(),
1544                    Ref::new("NumericLiteralSegment")
1545                ])
1546                .config(|this| {
1547                    this.optional();
1548                }),
1549                Sequence::new(vec_of_erased![
1550                    Ref::keyword("COMPUPDATE"),
1551                    one_of(vec_of_erased![
1552                        Ref::keyword("PRESET"),
1553                        Ref::keyword("ON"),
1554                        Ref::keyword("OFF"),
1555                        Ref::keyword("TRUE"),
1556                        Ref::keyword("FALSE")
1557                    ])
1558                    .config(|this| {
1559                        this.optional();
1560                    })
1561                ])
1562                .config(|this| {
1563                    this.optional();
1564                }),
1565                Sequence::new(vec_of_erased![
1566                    Ref::keyword("STATUPDATE"),
1567                    one_of(vec_of_erased![
1568                        Ref::keyword("ON"),
1569                        Ref::keyword("OFF"),
1570                        Ref::keyword("TRUE"),
1571                        Ref::keyword("FALSE")
1572                    ])
1573                    .config(|this| {
1574                        this.optional();
1575                    })
1576                ])
1577                .config(|this| {
1578                    this.optional();
1579                }),
1580                Ref::keyword("NOLOAD").optional(),
1581                Ref::keyword("ACCEPTANYDATE").optional(),
1582                Sequence::new(vec_of_erased![
1583                    Ref::keyword("ACCEPTINVCHARS"),
1584                    Ref::keyword("AS").optional(),
1585                    Ref::new("QuotedLiteralSegment").optional()
1586                ])
1587                .config(|this| {
1588                    this.optional();
1589                }),
1590                Ref::keyword("BLANKSASNULL").optional(),
1591                Sequence::new(vec_of_erased![
1592                    Ref::keyword("DATEFORMAT"),
1593                    Ref::keyword("AS").optional(),
1594                    one_of(vec_of_erased![
1595                        Ref::keyword("AUTO"),
1596                        Ref::new("QuotedLiteralSegment")
1597                    ])
1598                ])
1599                .config(|this| {
1600                    this.optional();
1601                }),
1602                Ref::keyword("EMPTYASNULL").optional(),
1603                Sequence::new(vec_of_erased![
1604                    Ref::keyword("ENCODING"),
1605                    Ref::keyword("AS").optional(),
1606                    one_of(vec_of_erased![
1607                        Ref::keyword("UTF8"),
1608                        Ref::keyword("UTF16"),
1609                        Ref::keyword("UTF16BE"),
1610                        Ref::keyword("UTF16LE")
1611                    ])
1612                ])
1613                .config(|this| {
1614                    this.optional();
1615                }),
1616                Ref::keyword("ESCAPE").optional(),
1617                Ref::keyword("EXPLICIT_IDS").optional(),
1618                Ref::keyword("FILLRECORD").optional(),
1619                Ref::keyword("IGNOREBLANKLINES").optional(),
1620                Sequence::new(vec_of_erased![
1621                    Ref::keyword("IGNOREHEADER"),
1622                    Ref::keyword("AS").optional(),
1623                    Ref::new("LiteralGrammar")
1624                ])
1625                .config(|this| {
1626                    this.optional();
1627                }),
1628                Sequence::new(vec_of_erased![
1629                    Ref::keyword("NULL"),
1630                    Ref::keyword("AS"),
1631                    Ref::new("QuotedLiteralSegment")
1632                ])
1633                .config(|this| {
1634                    this.optional();
1635                }),
1636                Sequence::new(vec_of_erased![
1637                    Ref::keyword("READRATIO"),
1638                    Ref::new("NumericLiteralSegment")
1639                ])
1640                .config(|this| {
1641                    this.optional();
1642                }),
1643                Ref::keyword("REMOVEQUOTES").optional(),
1644                Ref::keyword("ROUNDEC").optional(),
1645                Sequence::new(vec_of_erased![
1646                    Ref::keyword("TIMEFORMAT"),
1647                    Ref::keyword("AS").optional(),
1648                    one_of(vec_of_erased![
1649                        Ref::keyword("AUTO"),
1650                        Ref::keyword("EPOCHSECS"),
1651                        Ref::keyword("EPOCHMILLISECS"),
1652                        Ref::new("QuotedLiteralSegment")
1653                    ])
1654                ])
1655                .config(|this| {
1656                    this.optional();
1657                }),
1658                Ref::keyword("TRIMBLANKS").optional(),
1659                Ref::keyword("TRUNCATECOLUMNS").optional()
1660            ])
1661        ])
1662        .to_matchable(),
1663    );
1664    redshift_dialect.add([
1665        (
1666            "InsertStatementSegment".into(),
1667            NodeMatcher::new(SyntaxKind::InsertStatement, |_| {
1668                Sequence::new(vec_of_erased![
1669                    Ref::keyword("INSERT"),
1670                    Ref::keyword("INTO"),
1671                    Ref::new("TableReferenceSegment"),
1672                    one_of(vec_of_erased![
1673                        optionally_bracketed(vec_of_erased![Ref::new("SelectableGrammar")]),
1674                        Sequence::new(vec_of_erased![
1675                            Ref::keyword("DEFAULT"),
1676                            Ref::keyword("VALUES")
1677                        ]),
1678                        Sequence::new(vec_of_erased![
1679                            Ref::new("BracketedColumnReferenceListGrammar").optional(),
1680                            one_of(vec_of_erased![
1681                                Ref::new("ValuesClauseSegment"),
1682                                optionally_bracketed(vec_of_erased![Ref::new("SelectableGrammar")])
1683                            ])
1684                        ])
1685                    ])
1686                ])
1687                .to_matchable()
1688            })
1689            .to_matchable()
1690            .into(),
1691        ),
1692        (
1693            "CreateSchemaStatementSegment".into(),
1694            NodeMatcher::new(SyntaxKind::CreateSchemaStatement, |_| {
1695                Sequence::new(vec_of_erased![
1696                    Ref::keyword("CREATE"),
1697                    Ref::keyword("SCHEMA"),
1698                    one_of(vec_of_erased![
1699                        Sequence::new(vec_of_erased![
1700                            Ref::new("IfNotExistsGrammar").optional(),
1701                            Ref::new("SchemaReferenceSegment"),
1702                            Sequence::new(vec_of_erased![
1703                                Ref::keyword("AUTHORIZATION"),
1704                                Ref::new("RoleReferenceSegment")
1705                            ])
1706                            .config(|this| {
1707                                this.optional();
1708                            })
1709                        ]),
1710                        Sequence::new(vec_of_erased![
1711                            Ref::keyword("AUTHORIZATION"),
1712                            Ref::new("RoleReferenceSegment")
1713                        ])
1714                    ]),
1715                    Ref::new("QuotaGrammar").optional()
1716                ])
1717                .to_matchable()
1718            })
1719            .to_matchable()
1720            .into(),
1721        ),
1722        (
1723            "ProcedureParameterListSegment".into(),
1724            NodeMatcher::new(SyntaxKind::ProcedureParameterList, |_| {
1725                let param_type = one_of(vec_of_erased![
1726                    Ref::keyword("REFCURSOR"),
1727                    Ref::new("DatatypeSegment")
1728                ]);
1729                Bracketed::new(vec_of_erased![
1730                    Delimited::new(vec_of_erased![Sequence::new(vec_of_erased![
1731                        AnyNumberOf::new(vec_of_erased![
1732                            Ref::new("ParameterNameSegment")
1733                                .exclude(one_of(vec_of_erased![
1734                                    param_type.clone(),
1735                                    Ref::new("ArgModeGrammar")
1736                                ]))
1737                                .optional(),
1738                            Ref::new("ArgModeGrammar").optional()
1739                        ])
1740                        .config(|this| {
1741                            this.max_times_per_element = 1.into();
1742                        }),
1743                        param_type.clone()
1744                    ])])
1745                    .config(|this| {
1746                        this.optional();
1747                    })
1748                ])
1749                .to_matchable()
1750            })
1751            .to_matchable()
1752            .into(),
1753        ),
1754        (
1755            "CreateProcedureStatementSegment".into(),
1756            NodeMatcher::new(SyntaxKind::CreateProcedureStatement, |_| {
1757                Sequence::new(vec_of_erased![
1758                    Ref::keyword("CREATE"),
1759                    Ref::new("OrReplaceGrammar").optional(),
1760                    Ref::keyword("PROCEDURE"),
1761                    Ref::new("FunctionNameSegment"),
1762                    Ref::new("ProcedureParameterListSegment"),
1763                    Ref::new("FunctionDefinitionGrammar")
1764                ])
1765                .to_matchable()
1766            })
1767            .to_matchable()
1768            .into(),
1769        ),
1770        (
1771            "AlterProcedureStatementSegment".into(),
1772            NodeMatcher::new(SyntaxKind::AlterProcedureStatement, |_| {
1773                Sequence::new(vec_of_erased![
1774                    Ref::keyword("ALTER"),
1775                    Ref::keyword("PROCEDURE"),
1776                    Ref::new("FunctionNameSegment"),
1777                    Ref::new("ProcedureParameterListSegment").optional(),
1778                    one_of(vec_of_erased![
1779                        Sequence::new(vec_of_erased![
1780                            Ref::keyword("RENAME"),
1781                            Ref::keyword("TO"),
1782                            Ref::new("FunctionNameSegment")
1783                        ]),
1784                        Sequence::new(vec_of_erased![
1785                            Ref::keyword("OWNER"),
1786                            Ref::keyword("TO"),
1787                            one_of(vec_of_erased![
1788                                one_of(vec_of_erased![
1789                                    Ref::new("ParameterNameSegment"),
1790                                    Ref::new("QuotedIdentifierSegment")
1791                                ]),
1792                                Ref::keyword("CURRENT_USER"),
1793                                Ref::keyword("SESSION_USER")
1794                            ])
1795                        ])
1796                    ])
1797                ])
1798                .to_matchable()
1799            })
1800            .to_matchable()
1801            .into(),
1802        ),
1803        (
1804            "DropProcedureStatementSegment".into(),
1805            NodeMatcher::new(SyntaxKind::DropProcedureStatement, |_| {
1806                Sequence::new(vec_of_erased![
1807                    Ref::keyword("DROP"),
1808                    Ref::keyword("PROCEDURE"),
1809                    Ref::new("IfExistsGrammar").optional(),
1810                    Delimited::new(vec_of_erased![Sequence::new(vec_of_erased![
1811                        Ref::new("FunctionNameSegment"),
1812                        Ref::new("ProcedureParameterListSegment").optional()
1813                    ])])
1814                ])
1815                .to_matchable()
1816            })
1817            .to_matchable()
1818            .into(),
1819        ),
1820    ]);
1821
1822    redshift_dialect.replace_grammar(
1823        "AlterDefaultPrivilegesSchemaObjectsSegment",
1824        postgres_dialect
1825            .grammar("AlterDefaultPrivilegesSchemaObjectsSegment")
1826            .match_grammar(&postgres_dialect)
1827            .unwrap()
1828            .copy(
1829                Some(vec_of_erased![Sequence::new(vec_of_erased![Ref::keyword(
1830                    "PROCEDURES"
1831                )])]),
1832                None,
1833                None,
1834                None,
1835                Vec::new(),
1836                false,
1837            ),
1838    );
1839
1840    redshift_dialect.add([
1841        (
1842            "DeclareStatementSegment".into(),
1843            NodeMatcher::new(SyntaxKind::DeclareStatement, |_| {
1844                Sequence::new(vec_of_erased![
1845                    Ref::keyword("DECLARE"),
1846                    Ref::new("ObjectReferenceSegment"),
1847                    Ref::keyword("CURSOR"),
1848                    Ref::keyword("FOR"),
1849                    Ref::new("SelectableGrammar")
1850                ])
1851                .to_matchable()
1852            })
1853            .to_matchable()
1854            .into(),
1855        ),
1856        (
1857            "FetchStatementSegment".into(),
1858            NodeMatcher::new(SyntaxKind::FetchStatement, |_| {
1859                Sequence::new(vec_of_erased![
1860                    Ref::keyword("FETCH"),
1861                    one_of(vec_of_erased![
1862                        Ref::keyword("NEXT"),
1863                        Ref::keyword("ALL"),
1864                        Sequence::new(vec_of_erased![
1865                            Ref::keyword("FORWARD"),
1866                            one_of(vec_of_erased![
1867                                Ref::keyword("ALL"),
1868                                Ref::new("NumericLiteralSegment")
1869                            ])
1870                        ])
1871                    ]),
1872                    Ref::keyword("FROM"),
1873                    Ref::new("ObjectReferenceSegment")
1874                ])
1875                .to_matchable()
1876            })
1877            .to_matchable()
1878            .into(),
1879        ),
1880        (
1881            "CloseStatementSegment".into(),
1882            NodeMatcher::new(SyntaxKind::CloseStatement, |_| {
1883                Sequence::new(vec_of_erased![
1884                    Ref::keyword("CLOSE"),
1885                    Ref::new("ObjectReferenceSegment")
1886                ])
1887                .to_matchable()
1888            })
1889            .to_matchable()
1890            .into(),
1891        ),
1892        (
1893            "AltereDatashareStatementSegment".into(),
1894            NodeMatcher::new(SyntaxKind::CreateDatashareStatement, |_| {
1895                Sequence::new(vec_of_erased![
1896                    Ref::keyword("ALTER"),
1897                    Ref::keyword("DATASHARE"),
1898                    Ref::new("ObjectReferenceSegment"),
1899                    one_of(vec_of_erased![
1900                        Sequence::new(vec_of_erased![
1901                            one_of(vec_of_erased![Ref::keyword("ADD"), Ref::keyword("REMOVE")]),
1902                            one_of(vec_of_erased![
1903                                Sequence::new(vec_of_erased![
1904                                    Ref::keyword("TABLE"),
1905                                    Delimited::new(vec_of_erased![Ref::new(
1906                                        "TableReferenceSegment"
1907                                    )])
1908                                ]),
1909                                Sequence::new(vec_of_erased![
1910                                    Ref::keyword("SCHEMA"),
1911                                    Delimited::new(vec_of_erased![Ref::new(
1912                                        "SchemaReferenceSegment"
1913                                    )])
1914                                ]),
1915                                Sequence::new(vec_of_erased![
1916                                    Ref::keyword("FUNCTION"),
1917                                    Delimited::new(vec_of_erased![Ref::new("FunctionNameSegment")])
1918                                ]),
1919                                Sequence::new(vec_of_erased![
1920                                    Ref::keyword("ALL"),
1921                                    one_of(vec_of_erased![
1922                                        Ref::keyword("TABLES"),
1923                                        Ref::keyword("FUNCTIONS")
1924                                    ]),
1925                                    Ref::keyword("IN"),
1926                                    Ref::keyword("SCHEMA"),
1927                                    Delimited::new(vec_of_erased![Ref::new(
1928                                        "SchemaReferenceSegment"
1929                                    )])
1930                                ])
1931                            ])
1932                        ]),
1933                        Sequence::new(vec_of_erased![
1934                            Ref::keyword("SET"),
1935                            one_of(vec_of_erased![
1936                                Sequence::new(vec_of_erased![
1937                                    Ref::keyword("PUBLICACCESSIBLE"),
1938                                    Ref::new("EqualsSegment").optional(),
1939                                    Ref::new("BooleanLiteralGrammar")
1940                                ]),
1941                                Sequence::new(vec_of_erased![
1942                                    Ref::keyword("INCLUDENEW"),
1943                                    Ref::new("EqualsSegment").optional(),
1944                                    Ref::new("BooleanLiteralGrammar"),
1945                                    Ref::keyword("FOR"),
1946                                    Ref::keyword("SCHEMA"),
1947                                    Ref::new("SchemaReferenceSegment")
1948                                ])
1949                            ])
1950                        ])
1951                    ])
1952                ])
1953                .to_matchable()
1954            })
1955            .to_matchable()
1956            .into(),
1957        ),
1958        (
1959            "CreateDatashareStatementSegment".into(),
1960            NodeMatcher::new(SyntaxKind::CreateDatashareStatement, |_| {
1961                Sequence::new(vec_of_erased![
1962                    Ref::keyword("CREATE"),
1963                    Ref::keyword("DATASHARE"),
1964                    Ref::new("ObjectReferenceSegment"),
1965                    Sequence::new(vec_of_erased![
1966                        Ref::keyword("SET").optional(),
1967                        Ref::keyword("PUBLICACCESSIBLE"),
1968                        Ref::new("EqualsSegment").optional(),
1969                        one_of(vec_of_erased![Ref::keyword("TRUE"), Ref::keyword("FALSE")])
1970                    ])
1971                    .config(|this| {
1972                        this.optional();
1973                    })
1974                ])
1975                .to_matchable()
1976            })
1977            .to_matchable()
1978            .into(),
1979        ),
1980        (
1981            "DescDatashareStatementSegment".into(),
1982            NodeMatcher::new(SyntaxKind::DescDatashareStatement, |_| {
1983                Sequence::new(vec_of_erased![
1984                    Ref::keyword("DESC"),
1985                    Ref::keyword("DATASHARE"),
1986                    Ref::new("ObjectReferenceSegment"),
1987                    Sequence::new(vec_of_erased![
1988                        Ref::keyword("OF"),
1989                        Sequence::new(vec_of_erased![
1990                            Ref::keyword("ACCOUNT"),
1991                            Ref::new("QuotedLiteralSegment")
1992                        ])
1993                        .config(|this| {
1994                            this.optional();
1995                        }),
1996                        Ref::keyword("NAMESPACE"),
1997                        Ref::new("QuotedLiteralSegment")
1998                    ])
1999                    .config(|this| {
2000                        this.optional();
2001                    })
2002                ])
2003                .to_matchable()
2004            })
2005            .to_matchable()
2006            .into(),
2007        ),
2008        (
2009            "DropDatashareStatementSegment".into(),
2010            NodeMatcher::new(SyntaxKind::DropDatashareStatement, |_| {
2011                Sequence::new(vec_of_erased![
2012                    Ref::keyword("DROP"),
2013                    Ref::keyword("DATASHARE"),
2014                    Ref::new("ObjectReferenceSegment")
2015                ])
2016                .to_matchable()
2017            })
2018            .to_matchable()
2019            .into(),
2020        ),
2021        (
2022            "ShowDatasharesStatementSegment".into(),
2023            NodeMatcher::new(SyntaxKind::ShowDatasharesStatement, |_| {
2024                Sequence::new(vec_of_erased![
2025                    Ref::keyword("SHOW"),
2026                    Ref::keyword("DATASHARES"),
2027                    Sequence::new(vec_of_erased![
2028                        Ref::keyword("LIKE"),
2029                        Ref::new("QuotedLiteralSegment")
2030                    ])
2031                    .config(|this| {
2032                        this.optional();
2033                    })
2034                ])
2035                .to_matchable()
2036            })
2037            .to_matchable()
2038            .into(),
2039        ),
2040        (
2041            "GrantUsageDatashareStatementSegment".into(),
2042            NodeMatcher::new(SyntaxKind::GrantDatashareStatement, |_| {
2043                Sequence::new(vec_of_erased![
2044                    one_of(vec_of_erased![
2045                        Ref::keyword("GRANT"),
2046                        Ref::keyword("REVOKE")
2047                    ]),
2048                    Ref::keyword("USAGE"),
2049                    Ref::keyword("ON"),
2050                    Ref::keyword("DATASHARE"),
2051                    Ref::new("ObjectReferenceSegment"),
2052                    one_of(vec_of_erased![Ref::keyword("TO"), Ref::keyword("FROM")]),
2053                    one_of(vec_of_erased![
2054                        Sequence::new(vec_of_erased![
2055                            Ref::keyword("NAMESPACE"),
2056                            Ref::new("QuotedLiteralSegment")
2057                        ]),
2058                        Sequence::new(vec_of_erased![
2059                            Ref::keyword("ACCOUNT"),
2060                            Sequence::new(vec_of_erased![
2061                                Ref::new("QuotedLiteralSegment"),
2062                                Sequence::new(vec_of_erased![
2063                                    Ref::keyword("VIA"),
2064                                    Ref::keyword("DATA"),
2065                                    Ref::keyword("CATALOG")
2066                                ])
2067                                .config(|this| {
2068                                    this.optional();
2069                                })
2070                            ])
2071                        ])
2072                    ])
2073                ])
2074                .to_matchable()
2075            })
2076            .to_matchable()
2077            .into(),
2078        ),
2079        (
2080            "CreateRlsPolicyStatementSegment".into(),
2081            NodeMatcher::new(SyntaxKind::CreateRlsPolicyStatement, |_| {
2082                Sequence::new(vec_of_erased![
2083                    Ref::keyword("CREATE"),
2084                    Ref::keyword("RLS"),
2085                    Ref::keyword("POLICY"),
2086                    Ref::new("ObjectReferenceSegment"),
2087                    Sequence::new(vec_of_erased![
2088                        Ref::keyword("WITH"),
2089                        Bracketed::new(vec_of_erased![Delimited::new(vec_of_erased![
2090                            Sequence::new(vec_of_erased![
2091                                Ref::new("ColumnReferenceSegment"),
2092                                Ref::new("DatatypeSegment")
2093                            ])
2094                        ])]),
2095                        Sequence::new(vec_of_erased![
2096                            Ref::keyword("AS").optional(),
2097                            Ref::new("AliasExpressionSegment")
2098                        ])
2099                        .config(|this| {
2100                            this.optional();
2101                        })
2102                    ])
2103                    .config(|this| {
2104                        this.optional();
2105                    }),
2106                    Sequence::new(vec_of_erased![
2107                        Ref::keyword("USING"),
2108                        Bracketed::new(vec_of_erased![Ref::new("ExpressionSegment")])
2109                    ])
2110                ])
2111                .to_matchable()
2112            })
2113            .to_matchable()
2114            .into(),
2115        ),
2116        (
2117            "ManageRlsPolicyStatementSegment".into(),
2118            NodeMatcher::new(SyntaxKind::ManageRlsPolicyStatement, |_| {
2119                Sequence::new(vec_of_erased![
2120                    one_of(vec_of_erased![
2121                        Ref::keyword("ATTACH"),
2122                        Ref::keyword("DETACH")
2123                    ]),
2124                    Ref::keyword("RLS"),
2125                    Ref::keyword("POLICY"),
2126                    Ref::new("ObjectReferenceSegment"),
2127                    Ref::keyword("ON"),
2128                    Ref::keyword("TABLE").optional(),
2129                    Delimited::new(vec_of_erased![Ref::new("TableReferenceSegment")]),
2130                    one_of(vec_of_erased![Ref::keyword("TO"), Ref::keyword("FROM")]),
2131                    Delimited::new(vec_of_erased![one_of(vec_of_erased![
2132                        Sequence::new(vec_of_erased![
2133                            Ref::keyword("ROLE").optional(),
2134                            Ref::new("RoleReferenceSegment")
2135                        ]),
2136                        Ref::keyword("PUBLIC")
2137                    ])])
2138                ])
2139                .to_matchable()
2140            })
2141            .to_matchable()
2142            .into(),
2143        ),
2144        (
2145            "DropRlsPolicyStatementSegment".into(),
2146            NodeMatcher::new(SyntaxKind::DropRlsPolicyStatement, |_| {
2147                Sequence::new(vec_of_erased![
2148                    Ref::keyword("DROP"),
2149                    Ref::keyword("RLS"),
2150                    Ref::keyword("POLICY"),
2151                    Ref::new("IfExistsGrammar").optional(),
2152                    Ref::new("ObjectReferenceSegment"),
2153                    one_of(vec_of_erased![
2154                        Ref::keyword("CASCADE"),
2155                        Ref::keyword("RESTRICT")
2156                    ])
2157                    .config(|this| {
2158                        this.optional();
2159                    })
2160                ])
2161                .to_matchable()
2162            })
2163            .to_matchable()
2164            .into(),
2165        ),
2166        (
2167            "AnalyzeCompressionStatementSegment".into(),
2168            NodeMatcher::new(SyntaxKind::AnalyzeCompressionStatement, |_| {
2169                Sequence::new(vec_of_erased![
2170                    one_of(vec_of_erased![
2171                        Ref::keyword("ANALYZE"),
2172                        Ref::keyword("ANALYSE")
2173                    ]),
2174                    Ref::keyword("COMPRESSION"),
2175                    Sequence::new(vec_of_erased![
2176                        Ref::new("TableReferenceSegment"),
2177                        Bracketed::new(vec_of_erased![Delimited::new(vec_of_erased![Ref::new(
2178                            "ColumnReferenceSegment"
2179                        )])])
2180                        .config(|this| {
2181                            this.optional();
2182                        }),
2183                        Sequence::new(vec_of_erased![
2184                            Ref::keyword("COMPROWS"),
2185                            Ref::new("NumericLiteralSegment")
2186                        ])
2187                        .config(|this| {
2188                            this.optional();
2189                        })
2190                    ])
2191                    .config(|this| {
2192                        this.optional();
2193                    })
2194                ])
2195                .to_matchable()
2196            })
2197            .to_matchable()
2198            .into(),
2199        ),
2200    ]);
2201    redshift_dialect.replace_grammar(
2202        "VacuumStatementSegment",
2203        Sequence::new(vec_of_erased![
2204            Ref::keyword("VACUUM"),
2205            one_of(vec_of_erased![
2206                Ref::keyword("FULL"),
2207                Ref::keyword("REINDEX"),
2208                Ref::keyword("RECLUSTER"),
2209                Sequence::new(vec_of_erased![
2210                    one_of(vec_of_erased![Ref::keyword("SORT"), Ref::keyword("DELETE")]),
2211                    Ref::keyword("ONLY")
2212                ])
2213            ])
2214            .config(|this| {
2215                this.optional();
2216            }),
2217            Ref::new("TableReferenceSegment").optional(),
2218            Sequence::new(vec_of_erased![
2219                Ref::keyword("TO"),
2220                Ref::new("NumericLiteralSegment"),
2221                Ref::keyword("PERCENT")
2222            ])
2223            .config(|this| {
2224                this.optional();
2225            }),
2226            Ref::keyword("BOOST").optional()
2227        ])
2228        .to_matchable(),
2229    );
2230
2231    redshift_dialect.add([]);
2232
2233    redshift_dialect.replace_grammar(
2234        "StatementSegment",
2235        postgres_dialect
2236            .grammar("StatementSegment")
2237            .match_grammar(&postgres_dialect)
2238            .unwrap()
2239            .copy(
2240                Some(vec_of_erased![
2241                    Ref::new("CreateLibraryStatementSegment"),
2242                    Ref::new("CreateGroupStatementSegment"),
2243                    Ref::new("AlterUserStatementSegment"),
2244                    Ref::new("AlterGroupStatementSegment"),
2245                    Ref::new("CreateExternalTableAsStatementSegment"),
2246                    Ref::new("CreateExternalTableStatementSegment"),
2247                    Ref::new("CreateExternalSchemaStatementSegment"),
2248                    Ref::new("DataFormatSegment"),
2249                    Ref::new("UnloadStatementSegment"),
2250                    Ref::new("CopyStatementSegment"),
2251                    Ref::new("ShowModelStatementSegment"),
2252                    Ref::new("CreateDatashareStatementSegment"),
2253                    Ref::new("DescDatashareStatementSegment"),
2254                    Ref::new("DropDatashareStatementSegment"),
2255                    Ref::new("ShowDatasharesStatementSegment"),
2256                    Ref::new("AltereDatashareStatementSegment"),
2257                    Ref::new("DeclareStatementSegment"),
2258                    Ref::new("FetchStatementSegment"),
2259                    Ref::new("CloseStatementSegment"),
2260                    Ref::new("AnalyzeCompressionStatementSegment"),
2261                    Ref::new("AlterProcedureStatementSegment"),
2262                    Ref::new("CallStatementSegment"),
2263                    Ref::new("CreateRlsPolicyStatementSegment"),
2264                    Ref::new("ManageRlsPolicyStatementSegment"),
2265                    Ref::new("DropRlsPolicyStatementSegment"),
2266                    Ref::new("CreateExternalFunctionStatementSegment"),
2267                    Ref::new("GrantUsageDatashareStatementSegment"),
2268                ]),
2269                None,
2270                None,
2271                None,
2272                Vec::new(),
2273                false,
2274            ),
2275    );
2276
2277    redshift_dialect.add([
2278        (
2279            "PartitionedBySegment".into(),
2280            NodeMatcher::new(SyntaxKind::PartitionedBySegment, |_| {
2281                Sequence::new(vec_of_erased![
2282                    Ref::keyword("PARTITIONED"),
2283                    Ref::keyword("BY"),
2284                    Bracketed::new(vec_of_erased![Delimited::new(vec_of_erased![
2285                        Sequence::new(vec_of_erased![
2286                            Ref::new("ColumnReferenceSegment"),
2287                            Ref::new("DatatypeSegment").optional()
2288                        ])
2289                    ])])
2290                ])
2291                .to_matchable()
2292            })
2293            .to_matchable()
2294            .into(),
2295        ),
2296        (
2297            "RowFormatDelimitedSegment".into(),
2298            NodeMatcher::new(SyntaxKind::RowFormatDelimitedSegment, |_| {
2299                any_set_of(vec_of_erased![
2300                    Sequence::new(vec_of_erased![
2301                        Ref::keyword("FIELDS"),
2302                        Ref::keyword("TERMINATED"),
2303                        Ref::keyword("BY"),
2304                        Ref::new("QuotedLiteralSegment")
2305                    ]),
2306                    Sequence::new(vec_of_erased![
2307                        Ref::keyword("LINES"),
2308                        Ref::keyword("TERMINATED"),
2309                        Ref::keyword("BY"),
2310                        Ref::new("QuotedLiteralSegment")
2311                    ])
2312                ])
2313                .config(|this| {
2314                    this.optional();
2315                })
2316                .to_matchable()
2317            })
2318            .to_matchable()
2319            .into(),
2320        ),
2321    ]);
2322
2323    redshift_dialect.replace_grammar(
2324        "CreateUserStatementSegment",
2325        Sequence::new(vec_of_erased![
2326            Ref::keyword("CREATE"),
2327            Ref::keyword("USER"),
2328            Ref::new("RoleReferenceSegment"),
2329            Ref::keyword("WITH").optional(),
2330            Ref::keyword("PASSWORD"),
2331            one_of(vec_of_erased![
2332                Ref::new("QuotedLiteralSegment"),
2333                Ref::keyword("DISABLE")
2334            ]),
2335            any_set_of(vec_of_erased![
2336                one_of(vec_of_erased![
2337                    Ref::keyword("CREATEDB"),
2338                    Ref::keyword("NOCREATEDB")
2339                ]),
2340                one_of(vec_of_erased![
2341                    Ref::keyword("CREATEUSER"),
2342                    Ref::keyword("NOCREATEUSER")
2343                ]),
2344                Sequence::new(vec_of_erased![
2345                    Ref::keyword("SYSLOG"),
2346                    Ref::keyword("ACCESS"),
2347                    one_of(vec_of_erased![
2348                        Ref::keyword("RESTRICTED"),
2349                        Ref::keyword("UNRESTRICTED")
2350                    ])
2351                ]),
2352                Sequence::new(vec_of_erased![
2353                    Ref::keyword("IN"),
2354                    Ref::keyword("GROUP"),
2355                    Delimited::new(vec_of_erased![Ref::new("ObjectReferenceSegment")])
2356                ]),
2357                Sequence::new(vec_of_erased![
2358                    Ref::keyword("VALID"),
2359                    Ref::keyword("UNTIL"),
2360                    Ref::new("QuotedLiteralSegment")
2361                ]),
2362                Sequence::new(vec_of_erased![
2363                    Ref::keyword("CONNECTION"),
2364                    Ref::keyword("LIMIT"),
2365                    one_of(vec_of_erased![
2366                        Ref::new("NumericLiteralSegment"),
2367                        Ref::keyword("UNLIMITED")
2368                    ])
2369                ]),
2370                Sequence::new(vec_of_erased![
2371                    Ref::keyword("SESSION"),
2372                    Ref::keyword("TIMEOUT"),
2373                    Ref::new("NumericLiteralSegment")
2374                ])
2375            ])
2376        ])
2377        .to_matchable(),
2378    );
2379    redshift_dialect.add([
2380        (
2381            "CreateGroupStatementSegment".into(),
2382            NodeMatcher::new(SyntaxKind::CreateGroup, |_| {
2383                Sequence::new(vec_of_erased![
2384                    Ref::keyword("CREATE"),
2385                    Ref::keyword("GROUP"),
2386                    Ref::new("ObjectReferenceSegment"),
2387                    Sequence::new(vec_of_erased![
2388                        Ref::keyword("WITH").optional(),
2389                        Ref::keyword("USER"),
2390                        Delimited::new(vec_of_erased![Ref::new("ObjectReferenceSegment")])
2391                    ])
2392                    .config(|this| {
2393                        this.optional();
2394                    })
2395                ])
2396                .to_matchable()
2397            })
2398            .to_matchable()
2399            .into(),
2400        ),
2401        (
2402            "AlterUserStatementSegment".into(),
2403            NodeMatcher::new(SyntaxKind::AlterUserStatement, |_| {
2404                Sequence::new(vec_of_erased![
2405                    Ref::keyword("ALTER"),
2406                    Ref::keyword("USER"),
2407                    Ref::new("RoleReferenceSegment"),
2408                    Ref::keyword("WITH").optional(),
2409                    any_set_of(vec_of_erased![
2410                        one_of(vec_of_erased![
2411                            Ref::keyword("CREATEDB"),
2412                            Ref::keyword("NOCREATEDB")
2413                        ]),
2414                        one_of(vec_of_erased![
2415                            Ref::keyword("CREATEUSER"),
2416                            Ref::keyword("NOCREATEUSER")
2417                        ]),
2418                        Sequence::new(vec_of_erased![
2419                            Ref::keyword("SYSLOG"),
2420                            Ref::keyword("ACCESS"),
2421                            one_of(vec_of_erased![
2422                                Ref::keyword("RESTRICTED"),
2423                                Ref::keyword("UNRESTRICTED")
2424                            ])
2425                        ]),
2426                        Sequence::new(vec_of_erased![
2427                            Ref::keyword("PASSWORD"),
2428                            one_of(vec_of_erased![
2429                                Ref::new("QuotedLiteralSegment"),
2430                                Ref::keyword("DISABLE")
2431                            ]),
2432                            Sequence::new(vec_of_erased![
2433                                Ref::keyword("VALID"),
2434                                Ref::keyword("UNTIL"),
2435                                Ref::new("QuotedLiteralSegment")
2436                            ])
2437                            .config(|this| {
2438                                this.optional();
2439                            })
2440                        ]),
2441                        Sequence::new(vec_of_erased![
2442                            Ref::keyword("RENAME"),
2443                            Ref::keyword("TO"),
2444                            Ref::new("ObjectReferenceSegment")
2445                        ]),
2446                        Sequence::new(vec_of_erased![
2447                            Ref::keyword("CONNECTION"),
2448                            Ref::keyword("LIMIT"),
2449                            one_of(vec_of_erased![
2450                                Ref::new("NumericLiteralSegment"),
2451                                Ref::keyword("UNLIMITED")
2452                            ])
2453                        ]),
2454                        one_of(vec_of_erased![
2455                            Sequence::new(vec_of_erased![
2456                                Ref::keyword("SESSION"),
2457                                Ref::keyword("TIMEOUT"),
2458                                Ref::new("NumericLiteralSegment")
2459                            ]),
2460                            Sequence::new(vec_of_erased![
2461                                Ref::keyword("RESET"),
2462                                Ref::keyword("SESSION"),
2463                                Ref::keyword("TIMEOUT")
2464                            ])
2465                        ]),
2466                        one_of(vec_of_erased![
2467                            Sequence::new(vec_of_erased![
2468                                Ref::keyword("SET"),
2469                                Ref::new("ObjectReferenceSegment"),
2470                                one_of(vec_of_erased![
2471                                    Ref::keyword("TO"),
2472                                    Ref::new("EqualsSegment")
2473                                ]),
2474                                one_of(vec_of_erased![
2475                                    Ref::keyword("DEFAULT"),
2476                                    Ref::new("LiteralGrammar")
2477                                ])
2478                            ]),
2479                            Sequence::new(vec_of_erased![
2480                                Ref::keyword("RESET"),
2481                                Ref::new("ObjectReferenceSegment")
2482                            ])
2483                        ])
2484                    ])
2485                    .config(|this| {
2486                        this.min_times = 1;
2487                    })
2488                ])
2489                .to_matchable()
2490            })
2491            .to_matchable()
2492            .into(),
2493        ),
2494        (
2495            "AlterGroupStatementSegment".into(),
2496            NodeMatcher::new(SyntaxKind::AlterGroup, |_| {
2497                Sequence::new(vec_of_erased![
2498                    Ref::keyword("ALTER"),
2499                    Ref::keyword("GROUP"),
2500                    Ref::new("ObjectReferenceSegment"),
2501                    one_of(vec_of_erased![
2502                        Sequence::new(vec_of_erased![
2503                            one_of(vec_of_erased![Ref::keyword("ADD"), Ref::keyword("DROP")]),
2504                            Ref::keyword("USER"),
2505                            Delimited::new(vec_of_erased![Ref::new("ObjectReferenceSegment")])
2506                        ]),
2507                        Sequence::new(vec_of_erased![
2508                            Ref::keyword("RENAME"),
2509                            Ref::keyword("TO"),
2510                            Ref::new("ObjectReferenceSegment")
2511                        ])
2512                    ])
2513                ])
2514                .to_matchable()
2515            })
2516            .to_matchable()
2517            .into(),
2518        ),
2519        (
2520            "TransactionStatementSegment".into(),
2521            NodeMatcher::new(SyntaxKind::TransactionStatement, |_| {
2522                Sequence::new(vec_of_erased![
2523                    one_of(vec_of_erased![
2524                        Ref::keyword("BEGIN"),
2525                        Ref::keyword("START"),
2526                        Ref::keyword("COMMIT"),
2527                        Ref::keyword("END"),
2528                        Ref::keyword("ROLLBACK"),
2529                        Ref::keyword("ABORT")
2530                    ]),
2531                    one_of(vec_of_erased![
2532                        Ref::keyword("TRANSACTION"),
2533                        Ref::keyword("WORK")
2534                    ])
2535                    .config(|this| {
2536                        this.optional();
2537                    }),
2538                    Sequence::new(vec_of_erased![
2539                        Ref::keyword("ISOLATION"),
2540                        Ref::keyword("LEVEL"),
2541                        one_of(vec_of_erased![
2542                            Ref::keyword("SERIALIZABLE"),
2543                            Sequence::new(vec_of_erased![
2544                                Ref::keyword("READ"),
2545                                Ref::keyword("COMMITTED")
2546                            ]),
2547                            Sequence::new(vec_of_erased![
2548                                Ref::keyword("READ"),
2549                                Ref::keyword("UNCOMMITTED")
2550                            ]),
2551                            Sequence::new(vec_of_erased![
2552                                Ref::keyword("REPEATABLE"),
2553                                Ref::keyword("READ")
2554                            ])
2555                        ])
2556                    ])
2557                    .config(|this| {
2558                        this.optional();
2559                    }),
2560                    one_of(vec_of_erased![
2561                        Sequence::new(vec_of_erased![Ref::keyword("READ"), Ref::keyword("ONLY")]),
2562                        Sequence::new(vec_of_erased![Ref::keyword("READ"), Ref::keyword("WRITE")])
2563                    ])
2564                    .config(|this| {
2565                        this.optional();
2566                    })
2567                ])
2568                .to_matchable()
2569            })
2570            .to_matchable()
2571            .into(),
2572        ),
2573        (
2574            "AlterSchemaStatementSegment".into(),
2575            NodeMatcher::new(SyntaxKind::AlterSchemaStatement, |_| {
2576                Sequence::new(vec_of_erased![
2577                    Ref::keyword("ALTER"),
2578                    Ref::keyword("SCHEMA"),
2579                    Ref::new("SchemaReferenceSegment"),
2580                    one_of(vec_of_erased![
2581                        Sequence::new(vec_of_erased![
2582                            Ref::keyword("RENAME"),
2583                            Ref::keyword("TO"),
2584                            Ref::new("SchemaReferenceSegment")
2585                        ]),
2586                        Sequence::new(vec_of_erased![
2587                            Ref::keyword("OWNER"),
2588                            Ref::keyword("TO"),
2589                            Ref::new("RoleReferenceSegment")
2590                        ]),
2591                        Ref::new("QuotaGrammar")
2592                    ])
2593                ])
2594                .to_matchable()
2595            })
2596            .to_matchable()
2597            .into(),
2598        ),
2599        (
2600            "LockTableStatementSegment".into(),
2601            NodeMatcher::new(SyntaxKind::LockTableStatement, |_| {
2602                Sequence::new(vec_of_erased![
2603                    Ref::keyword("LOCK"),
2604                    Ref::keyword("TABLE").optional(),
2605                    Delimited::new(vec_of_erased![Ref::new("TableReferenceSegment")])
2606                ])
2607                .to_matchable()
2608            })
2609            .to_matchable()
2610            .into(),
2611        ),
2612    ]);
2613
2614    redshift_dialect.replace_grammar(
2615        "TableExpressionSegment",
2616        ansi_dialect
2617            .grammar("TableExpressionSegment")
2618            .match_grammar(&ansi_dialect)
2619            .unwrap()
2620            .copy(
2621                Some(vec_of_erased![
2622                    Ref::new("ObjectUnpivotSegment").optional(),
2623                    Ref::new("ArrayUnnestSegment").optional()
2624                ]),
2625                None,
2626                Some(Ref::new("TableReferenceSegment").to_matchable()),
2627                None,
2628                Vec::new(),
2629                false,
2630            ),
2631    );
2632
2633    redshift_dialect.add([(
2634        "ObjectUnpivotSegment".into(),
2635        NodeMatcher::new(SyntaxKind::ObjectUnpivoting, |_| {
2636            Sequence::new(vec_of_erased![
2637                Ref::keyword("UNPIVOT"),
2638                Ref::new("ObjectReferenceSegment"),
2639                Ref::keyword("AS"),
2640                Ref::new("SingleIdentifierGrammar"),
2641                Ref::keyword("AT"),
2642                Ref::new("SingleIdentifierGrammar")
2643            ])
2644            .to_matchable()
2645        })
2646        .to_matchable()
2647        .into(),
2648    )]);
2649
2650    redshift_dialect.replace_grammar(
2651        "ArrayAccessorSegment",
2652        Sequence::new(vec_of_erased![AnyNumberOf::new(vec_of_erased![
2653            Bracketed::new(vec_of_erased![one_of(vec_of_erased![
2654                Ref::new("NumericLiteralSegment"),
2655                Ref::new("ExpressionSegment")
2656            ])])
2657            .config(|this| {
2658                this.bracket_type = "square";
2659            })
2660        ])])
2661        .to_matchable(),
2662    );
2663
2664    redshift_dialect.add([
2665        (
2666            "ArrayUnnestSegment".into(),
2667            NodeMatcher::new(SyntaxKind::ArrayUnnesting, |_| {
2668                Sequence::new(vec_of_erased![
2669                    Ref::new("ObjectReferenceSegment"),
2670                    Ref::keyword("AS"),
2671                    Ref::new("SingleIdentifierGrammar"),
2672                    Ref::keyword("AT"),
2673                    Ref::new("SingleIdentifierGrammar")
2674                ])
2675                .to_matchable()
2676            })
2677            .to_matchable()
2678            .into(),
2679        ),
2680        (
2681            "CallStatementSegment".into(),
2682            NodeMatcher::new(SyntaxKind::CallStatement, |_| {
2683                Sequence::new(vec_of_erased![
2684                    Ref::keyword("CALL"),
2685                    Ref::new("FunctionSegment")
2686                ])
2687                .to_matchable()
2688            })
2689            .to_matchable()
2690            .into(),
2691        ),
2692    ]);
2693
2694    redshift_dialect.replace_grammar(
2695        "SelectClauseModifierSegment",
2696        postgres_dialect
2697            .grammar("SelectClauseModifierSegment")
2698            .match_grammar(&postgres_dialect)
2699            .unwrap()
2700            .copy(
2701                Some(vec_of_erased![Sequence::new(vec_of_erased![
2702                    Ref::keyword("TOP"),
2703                    Ref::new("NumericLiteralSegment")
2704                ])]),
2705                None,
2706                None,
2707                None,
2708                Vec::new(),
2709                false,
2710            ),
2711    );
2712
2713    redshift_dialect.add([(
2714        "ConvertFunctionNameSegment".into(),
2715        NodeMatcher::new(SyntaxKind::FunctionName, |_| {
2716            Sequence::new(vec_of_erased![Ref::keyword("CONVERT")]).to_matchable()
2717        })
2718        .to_matchable()
2719        .into(),
2720    )]);
2721
2722    redshift_dialect.replace_grammar(
2723        "FunctionSegment",
2724        one_of(vec_of_erased![
2725            Sequence::new(vec_of_erased![Sequence::new(vec_of_erased![
2726                Ref::new("DatePartFunctionNameSegment"),
2727                Bracketed::new(vec_of_erased![Delimited::new(vec_of_erased![
2728                    Ref::new("DatetimeUnitSegment"),
2729                    Ref::new("FunctionContentsGrammar").optional()
2730                ])])
2731                .config(|this| {
2732                    this.parse_mode = ParseMode::Greedy;
2733                })
2734            ])]),
2735            Sequence::new(vec_of_erased![
2736                Sequence::new(vec_of_erased![
2737                    one_of(vec_of_erased![
2738                        Ref::new("FunctionNameSegment").exclude(one_of(vec_of_erased![
2739                            Ref::new("DatePartFunctionNameSegment"),
2740                            Ref::new("ValuesClauseSegment"),
2741                            Ref::new("ConvertFunctionNameSegment")
2742                        ])),
2743                        Sequence::new(vec_of_erased![
2744                            Ref::keyword("APPROXIMATE"),
2745                            Ref::new("FunctionNameSegment").exclude(one_of(vec_of_erased![
2746                                Ref::new("DatePartFunctionNameSegment"),
2747                                Ref::new("ValuesClauseSegment"),
2748                                Ref::new("ConvertFunctionNameSegment")
2749                            ]))
2750                        ])
2751                    ]),
2752                    Bracketed::new(vec_of_erased![
2753                        Ref::new("FunctionContentsGrammar").optional()
2754                    ])
2755                    .config(|this| {
2756                        this.parse_mode = ParseMode::Greedy;
2757                    })
2758                ]),
2759                Ref::new("PostFunctionGrammar").optional()
2760            ]),
2761            Sequence::new(vec_of_erased![
2762                Ref::new("ConvertFunctionNameSegment"),
2763                Bracketed::new(vec_of_erased![
2764                    Ref::new("DatatypeSegment"),
2765                    Ref::new("CommaSegment"),
2766                    Ref::new("ExpressionSegment")
2767                ])
2768            ])
2769        ])
2770        .to_matchable(),
2771    );
2772
2773    redshift_dialect.add([]);
2774
2775    redshift_dialect.replace_grammar(
2776        "FromClauseSegment",
2777        Sequence::new(vec_of_erased![
2778            Ref::keyword("FROM"),
2779            Delimited::new(vec_of_erased![optionally_bracketed(vec_of_erased![
2780                Ref::new("FromExpressionSegment")
2781            ])])
2782        ])
2783        .to_matchable(),
2784    );
2785
2786    redshift_dialect.add([(
2787        "CreateViewStatementSegment".into(),
2788        NodeMatcher::new(SyntaxKind::CreateViewStatement, |_| {
2789            Sequence::new(vec_of_erased![
2790                Ref::keyword("CREATE"),
2791                Ref::new("OrReplaceGrammar").optional(),
2792                Ref::keyword("VIEW"),
2793                Ref::new("IfNotExistsGrammar").optional(),
2794                Ref::new("TableReferenceSegment"),
2795                Ref::new("BracketedColumnReferenceListGrammar").optional(),
2796                Ref::keyword("AS"),
2797                optionally_bracketed(vec_of_erased![Ref::new("SelectableGrammar")]),
2798                Ref::new("WithNoSchemaBindingClauseSegment").optional()
2799            ])
2800            .to_matchable()
2801        })
2802        .to_matchable()
2803        .into(),
2804    )]);
2805    redshift_dialect.replace_grammar(
2806        "CreateMaterializedViewStatementSegment",
2807        Sequence::new(vec_of_erased![
2808            Ref::keyword("CREATE"),
2809            Ref::keyword("MATERIALIZED"),
2810            Ref::keyword("VIEW"),
2811            Ref::new("TableReferenceSegment"),
2812            Sequence::new(vec_of_erased![
2813                Ref::keyword("BACKUP"),
2814                one_of(vec_of_erased![Ref::keyword("YES"), Ref::keyword("NO")])
2815            ])
2816            .config(|this| {
2817                this.optional();
2818            }),
2819            Ref::new("TableAttributeSegment").optional(),
2820            Sequence::new(vec_of_erased![
2821                Ref::keyword("AUTO"),
2822                Ref::keyword("REFRESH"),
2823                one_of(vec_of_erased![Ref::keyword("YES"), Ref::keyword("NO")])
2824            ])
2825            .config(|this| {
2826                this.optional();
2827            }),
2828            Ref::keyword("AS"),
2829            one_of(vec_of_erased![
2830                optionally_bracketed(vec_of_erased![Ref::new("SelectableGrammar")]),
2831                optionally_bracketed(vec_of_erased![Sequence::new(vec_of_erased![
2832                    Ref::keyword("TABLE"),
2833                    Ref::new("TableReferenceSegment")
2834                ])]),
2835                Ref::new("ValuesClauseSegment"),
2836                optionally_bracketed(vec_of_erased![Sequence::new(vec_of_erased![
2837                    Ref::keyword("EXECUTE"),
2838                    Ref::new("FunctionSegment")
2839                ])])
2840            ]),
2841            Ref::new("WithDataClauseSegment").optional()
2842        ])
2843        .to_matchable(),
2844    );
2845    redshift_dialect.add([
2846        (
2847            "CreateExternalFunctionStatementSegment".into(),
2848            NodeMatcher::new(SyntaxKind::CreateExternalFunctionStatement, |_| {
2849                Sequence::new(vec_of_erased![
2850                    Ref::keyword("CREATE"),
2851                    Ref::new("OrReplaceGrammar").optional(),
2852                    Ref::keyword("EXTERNAL"),
2853                    Ref::keyword("FUNCTION"),
2854                    Ref::new("FunctionNameSegment"),
2855                    Bracketed::new(vec_of_erased![
2856                        Delimited::new(vec_of_erased![Ref::new("DatatypeSegment")]).config(
2857                            |this| {
2858                                this.optional();
2859                            }
2860                        )
2861                    ]),
2862                    Ref::keyword("RETURNS"),
2863                    Ref::new("DatatypeSegment"),
2864                    one_of(vec_of_erased![
2865                        Ref::keyword("VOLATILE"),
2866                        Ref::keyword("STABLE"),
2867                        Ref::keyword("IMMUTABLE")
2868                    ]),
2869                    one_of(vec_of_erased![
2870                        Ref::keyword("LAMBDA"),
2871                        Ref::keyword("SAGEMAKER")
2872                    ]),
2873                    Ref::new("QuotedLiteralSegment"),
2874                    Ref::keyword("IAM_ROLE"),
2875                    one_of(vec_of_erased![
2876                        Ref::keyword("DEFAULT"),
2877                        Ref::new("QuotedLiteralSegment")
2878                    ]),
2879                    Sequence::new(vec_of_erased![
2880                        Ref::keyword("RETRY_TIMEOUT"),
2881                        Ref::new("NumericLiteralSegment")
2882                    ])
2883                    .config(|this| {
2884                        this.optional();
2885                    })
2886                ])
2887                .to_matchable()
2888            })
2889            .to_matchable()
2890            .into(),
2891        ),
2892        (
2893            "QualifyClauseSegment".into(),
2894            NodeMatcher::new(SyntaxKind::QualifyClause, |_| {
2895                Sequence::new(vec_of_erased![
2896                    Ref::keyword("QUALIFY"),
2897                    MetaSegment::indent(),
2898                    Ref::new("ExpressionSegment"),
2899                    MetaSegment::dedent(),
2900                ])
2901                .to_matchable()
2902            })
2903            .to_matchable()
2904            .into(),
2905        ),
2906    ]);
2907    redshift_dialect.replace_grammar(
2908        "SelectStatementSegment",
2909        postgres_dialect
2910            .grammar("SelectStatementSegment")
2911            .match_grammar(&postgres_dialect)
2912            .unwrap()
2913            .copy(
2914                Some(vec_of_erased![Ref::new("QualifyClauseSegment").optional()]),
2915                None,
2916                Some(Ref::new("OrderByClauseSegment").optional().to_matchable()),
2917                None,
2918                vec_of_erased![Ref::new("SetOperatorSegment")],
2919                false,
2920            ),
2921    );
2922    redshift_dialect.add([]);
2923    redshift_dialect.replace_grammar(
2924        "UnorderedSelectStatementSegment",
2925        ansi_dialect
2926            .grammar("UnorderedSelectStatementSegment")
2927            .match_grammar(&ansi_dialect)
2928            .unwrap()
2929            .copy(
2930                Some(vec_of_erased![Ref::new("QualifyClauseSegment").optional()]),
2931                None,
2932                Some(Ref::new("OverlapsClauseSegment").optional().to_matchable()),
2933                None,
2934                Vec::new(),
2935                false,
2936            ),
2937    );
2938
2939    redshift_dialect
2940}