summaryrefslogtreecommitdiffstats
path: root/yql/essentials/sql/v1/sql_select.h
diff options
context:
space:
mode:
authorvitya-smirnov <[email protected]>2025-07-09 14:16:01 +0300
committervitya-smirnov <[email protected]>2025-07-09 14:38:43 +0300
commit59c3167c208900bb714ff5cc477476e3ab14f4f0 (patch)
tree043a4d70e21ede0da9df08806fe5a8c0d656e201 /yql/essentials/sql/v1/sql_select.h
parent40a6e6e096b3533857b70c79a8ac9820655c7bf3 (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.h31
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);