diff options
| author | kndrvt <[email protected]> | 2025-06-20 15:36:52 +0300 |
|---|---|---|
| committer | kndrvt <[email protected]> | 2025-06-20 16:07:13 +0300 |
| commit | 935e53d2a9ee4b43cc0548ba836b23c003c8078e (patch) | |
| tree | 99fa1a3b091548f8f2d974f443b45847b9e66a1b /yql/essentials/sql/v1/select.cpp | |
| parent | 532fb55c30629ecb7b2720b02d446ea89ac76917 (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.cpp | 39 |
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 { |
