sqruff_lib_dialects/
redshift.rs

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