From 39980e89765041c194acfbb7e347291c9ed7f730 Mon Sep 17 00:00:00 2001 From: Joey Hain Date: Mon, 22 Apr 2024 13:17:50 -0700 Subject: [PATCH] Support Snowflake `MATCH_RECOGNIZE` syntax (#1222) --- src/ast/mod.rs | 16 +- src/ast/query.rs | 266 ++++++++++++++++++++++++++++++++++ src/dialect/generic.rs | 4 + src/dialect/mod.rs | 4 + src/dialect/snowflake.rs | 4 + src/keywords.rs | 11 ++ src/parser/mod.rs | 237 ++++++++++++++++++++++++++++++ src/test_utils.rs | 17 +++ tests/sqlparser_common.rs | 297 +++++++++++++++++++++++++++++++++++++- 9 files changed, 847 insertions(+), 9 deletions(-) diff --git a/src/ast/mod.rs b/src/ast/mod.rs index f02461e0..32c7f6e9 100644 --- a/src/ast/mod.rs +++ b/src/ast/mod.rs @@ -40,13 +40,15 @@ pub use self::ddl::{ pub use self::dml::{Delete, Insert}; pub use self::operator::{BinaryOperator, UnaryOperator}; pub use self::query::{ - Cte, CteAsMaterialized, Distinct, ExceptSelectItem, ExcludeSelectItem, Fetch, ForClause, - ForJson, ForXml, GroupByExpr, IdentWithAlias, IlikeSelectItem, Join, JoinConstraint, - JoinOperator, JsonTableColumn, JsonTableColumnErrorHandling, LateralView, LockClause, LockType, - NamedWindowDefinition, NonBlock, Offset, OffsetRows, OrderByExpr, Query, RenameSelectItem, - ReplaceSelectElement, ReplaceSelectItem, Select, SelectInto, SelectItem, SetExpr, SetOperator, - SetQuantifier, Table, TableAlias, TableFactor, TableVersion, TableWithJoins, Top, TopQuantity, - ValueTableMode, Values, WildcardAdditionalOptions, With, + AfterMatchSkip, Cte, CteAsMaterialized, Distinct, EmptyMatchesMode, ExceptSelectItem, + ExcludeSelectItem, Fetch, ForClause, ForJson, ForXml, GroupByExpr, IdentWithAlias, + IlikeSelectItem, Join, JoinConstraint, JoinOperator, JsonTableColumn, + JsonTableColumnErrorHandling, LateralView, LockClause, LockType, MatchRecognizePattern, + MatchRecognizeSymbol, Measure, NamedWindowDefinition, NonBlock, Offset, OffsetRows, + OrderByExpr, Query, RenameSelectItem, RepetitionQuantifier, ReplaceSelectElement, + ReplaceSelectItem, RowsPerMatch, Select, SelectInto, SelectItem, SetExpr, SetOperator, + SetQuantifier, SymbolDefinition, Table, TableAlias, TableFactor, TableVersion, TableWithJoins, + Top, TopQuantity, ValueTableMode, Values, WildcardAdditionalOptions, With, }; pub use self::value::{ escape_quoted_string, DateTimeField, DollarQuotedString, TrimWhereField, Value, diff --git a/src/ast/query.rs b/src/ast/query.rs index 391ef51d..5f5bca4c 100644 --- a/src/ast/query.rs +++ b/src/ast/query.rs @@ -852,6 +852,238 @@ pub enum TableFactor { columns: Vec, alias: Option, }, + /// A `MATCH_RECOGNIZE` operation on a table. + /// + /// See . + MatchRecognize { + table: Box, + /// `PARTITION BY [, ... ]` + partition_by: Vec, + /// `ORDER BY [, ... ]` + order_by: Vec, + /// `MEASURES [AS] [, ... ]` + measures: Vec, + /// `ONE ROW PER MATCH | ALL ROWS PER MATCH [