summaryrefslogtreecommitdiffstats
path: root/yql/essentials/sql/v1/select.cpp
diff options
context:
space:
mode:
authorkndrvt <[email protected]>2025-06-20 15:36:52 +0300
committerkndrvt <[email protected]>2025-06-20 16:07:13 +0300
commit935e53d2a9ee4b43cc0548ba836b23c003c8078e (patch)
tree99fa1a3b091548f8f2d974f443b45847b9e66a1b /yql/essentials/sql/v1/select.cpp
parent532fb55c30629ecb7b2720b02d446ea89ac76917 (diff)
YQL-17269: support INTERSECT and EXCEPT without PositionalUnionAll
commit_hash:632e24794e8bcf6ef0502b7e8c031e964d28d36a
Diffstat (limited to 'yql/essentials/sql/v1/select.cpp')
-rw-r--r--yql/essentials/sql/v1/select.cpp39
1 files changed, 29 insertions, 10 deletions
diff --git a/yql/essentials/sql/v1/select.cpp b/yql/essentials/sql/v1/select.cpp
index 5a17bba297c..a2207d9ef76 100644
--- a/yql/essentials/sql/v1/select.cpp
+++ b/yql/essentials/sql/v1/select.cpp
@@ -2807,11 +2807,12 @@ TSourcePtr BuildSelectCore(
having, std::move(winSpecs), legacyHoppingWindowSpec, std::move(terms), distinct, std::move(without), forceWithout, selectStream, settings, std::move(uniqueSets), std::move(distinctSets));
}
-class TUnion: public IRealSource {
+class TSelectOp: public IRealSource {
public:
- TUnion(TPosition pos, TVector<TSourcePtr>&& sources, bool quantifierAll, const TWriteSettings& settings)
+ TSelectOp(TPosition pos, TVector<TSourcePtr>&& sources, const TString& op, bool quantifierAll, const TWriteSettings& settings)
: IRealSource(pos)
, Sources_(std::move(sources))
+ , Operator_(op)
, QuantifierAll_(quantifierAll)
, Settings_(settings)
{
@@ -2848,14 +2849,30 @@ public:
TNodePtr Build(TContext& ctx) override {
TPtr res;
- if (QuantifierAll_) {
- if (ctx.EmitUnionMerge) {
- res = ctx.PositionalUnionAll ? Y("UnionMergePositional") : Y("UnionMerge");
+ if (Operator_ == "union") {
+ if (QuantifierAll_) {
+ if (ctx.EmitUnionMerge) {
+ res = ctx.PositionalUnionAll ? Y("UnionMergePositional") : Y("UnionMerge");
+ } else {
+ res = ctx.PositionalUnionAll ? Y("UnionAllPositional") : Y("UnionAll");
+ }
+ } else {
+ res = ctx.PositionalUnionAll ? Y("UnionPositional") : Y("Union");
+ }
+ } else if (Operator_ == "intersect") {
+ if (QuantifierAll_) {
+ res = Y("IntersectAll");
+ } else {
+ res = Y("Intersect");
+ }
+ } else if (Operator_ == "except") {
+ if (QuantifierAll_) {
+ res = Y("ExceptAll");
} else {
- res = ctx.PositionalUnionAll ? Y("UnionAllPositional") : Y("UnionAll");
+ res = Y("Except");
}
} else {
- res = ctx.PositionalUnionAll ? Y("UnionPositional") : Y("Union");
+ Y_ABORT("Invalid operator: %s", Operator_.c_str());
}
for (auto& s: Sources_) {
@@ -2879,7 +2896,7 @@ public:
}
TNodePtr DoClone() const final {
- return MakeIntrusive<TUnion>(Pos_, CloneContainer(Sources_), QuantifierAll_, Settings_);
+ return MakeIntrusive<TSelectOp>(Pos_, CloneContainer(Sources_), Operator_, QuantifierAll_, Settings_);
}
bool IsSelect() const override {
@@ -2896,17 +2913,19 @@ public:
private:
TVector<TSourcePtr> Sources_;
+ const TString Operator_;
bool QuantifierAll_;
const TWriteSettings Settings_;
};
-TSourcePtr BuildUnion(
+TSourcePtr BuildSelectOp(
TPosition pos,
TVector<TSourcePtr>&& sources,
+ const TString& op,
bool quantifierAll,
const TWriteSettings& settings
) {
- return new TUnion(pos, std::move(sources), quantifierAll, settings);
+ return new TSelectOp(pos, std::move(sources), op, quantifierAll, settings);
}
class TOverWindowSource: public IProxySource {