diff options
author | vitya-smirnov <[email protected]> | 2025-07-09 14:16:01 +0300 |
---|---|---|
committer | vitya-smirnov <[email protected]> | 2025-07-09 14:38:43 +0300 |
commit | 59c3167c208900bb714ff5cc477476e3ab14f4f0 (patch) | |
tree | 043a4d70e21ede0da9df08806fe5a8c0d656e201 /yql/essentials/sql/v1/sql_select.h | |
parent | 40a6e6e096b3533857b70c79a8ac9820655c7bf3 (diff) |
YQL-17269: Support UNION/INTERSECT/EXCEPT combinations
Introduce `UNION` and `INTERSECT/EXCEPT` grammar rules
for precedence. Rewrote `Build` procedure into `BuildStmt`,
`BuildUnion`, `BuildIntersection`. Added tests, modify format.
It took a lot of time trying to adapt the existing `Build` procedure.
The I noticed that the logic for `union` and `intersection` is
different, since `union` groups arguments into bundles, but
`intersection` is a strictly binary operation.
commit_hash:70008ae3c2603364b6dfbeeb189fdc7f5237433d
Diffstat (limited to 'yql/essentials/sql/v1/sql_select.h')
-rw-r--r-- | yql/essentials/sql/v1/sql_select.h | 31 |
1 files changed, 29 insertions, 2 deletions
diff --git a/yql/essentials/sql/v1/sql_select.h b/yql/essentials/sql/v1/sql_select.h index fd6f0bece52..3224a3ca3b3 100644 --- a/yql/essentials/sql/v1/sql_select.h +++ b/yql/essentials/sql/v1/sql_select.h @@ -62,9 +62,36 @@ private: bool ValidateLimitOrderByWithSelectOp(TMaybe<TSelectKindPlacement> placement, TStringBuf what); bool NeedPassLimitOrderByToUnderlyingSelect(TMaybe<TSelectKindPlacement> placement); - template<typename TRule> - TSourcePtr Build(const TRule& node, TPosition pos, TSelectKindResult&& first); + struct TBuildExtra { + TSelectKindResult First; + TPosition FirstPos; + TSelectKindResult Last; + }; + template <typename TRule> + requires std::same_as<TRule, TRule_union_op> || + std::same_as<TRule, TRule_intersect_op> + bool IsAllQualifiedOp(const TRule& node); + + template <typename TRule> + requires std::same_as<TRule, TRule_select_stmt> || + std::same_as<TRule, TRule_select_unparenthesized_stmt> + TSourcePtr BuildStmt(const TRule& node, TPosition& pos); + + template <typename TRule> + requires std::same_as<TRule, TRule_select_stmt> || + std::same_as<TRule, TRule_select_unparenthesized_stmt> + TSourcePtr BuildUnion(const TRule& node, TPosition& pos, TBuildExtra& extra); + + template <typename TRule> + requires std::same_as<TRule, TRule_select_stmt_intersect> || + std::same_as<TRule, TRule_select_unparenthesized_stmt_intersect> + TSourcePtr BuildExceptionIntersection(const TRule& node, TPosition& pos, TSelectKindPlacement placement, TBuildExtra& extra); + + template <typename TRule> + requires std::same_as<TRule, TRule_select_kind_parenthesis> || + std::same_as<TRule, TRule_select_kind_partial> + TSelectKindResult BuildAtom(const TRule& node, TPosition& pos, TSelectKindPlacement placement, TBuildExtra& extra); TSelectKindResult SelectKind(const TRule_select_kind& node, TPosition& selectPos, TMaybe<TSelectKindPlacement> placement); TSelectKindResult SelectKind(const TRule_select_kind_partial& node, TPosition& selectPos, TMaybe<TSelectKindPlacement> placement); |