aboutsummaryrefslogtreecommitdiffstats
path: root/yql/essentials
diff options
context:
space:
mode:
authoraneporada <aneporada@yandex-team.com>2024-11-27 19:39:16 +0300
committeraneporada <aneporada@yandex-team.com>2024-11-27 20:30:55 +0300
commit5ae93cf6a49513cc999774c6545bcfff16a32f59 (patch)
tree680c05eeb9c20a9859dc64aeb7c3453208751982 /yql/essentials
parentda01e3e90a5307aae60beecbbb94131a88d617be (diff)
downloadydb-5ae93cf6a49513cc999774c6545bcfff16a32f59.tar.gz
EmitUnionMerge - pragma to emit UnionMerge instead of UnionAll
commit_hash:ba3439438c76ed616e4f1059d0ff83ebb4a16b9a
Diffstat (limited to 'yql/essentials')
-rw-r--r--yql/essentials/core/common_opt/yql_co_pgselect.cpp12
-rw-r--r--yql/essentials/core/common_opt/yql_co_simple1.cpp2
-rw-r--r--yql/essentials/core/type_ann/type_ann_core.cpp1
-rw-r--r--yql/essentials/sql/v1/context.cpp1
-rw-r--r--yql/essentials/sql/v1/context.h1
-rw-r--r--yql/essentials/sql/v1/select.cpp10
-rw-r--r--yql/essentials/sql/v1/sql_query.cpp6
-rw-r--r--yql/essentials/sql/v1/sql_ut.cpp31
-rw-r--r--yql/essentials/sql/v1/sql_ut_antlr4.cpp31
9 files changed, 84 insertions, 11 deletions
diff --git a/yql/essentials/core/common_opt/yql_co_pgselect.cpp b/yql/essentials/core/common_opt/yql_co_pgselect.cpp
index 23bda07d7a..93b307aab7 100644
--- a/yql/essentials/core/common_opt/yql_co_pgselect.cpp
+++ b/yql/essentials/core/common_opt/yql_co_pgselect.cpp
@@ -818,7 +818,9 @@ TExprNode::TPtr NormalizeColumnOrder(const TExprNode::TPtr& node, const TColumnO
}
TExprNode::TPtr ExpandPositionalUnionAll(const TExprNode& node, const TVector<TColumnOrder>& columnOrders,
- TExprNode::TListType children, TExprContext& ctx, TOptimizeContext& optCtx) {
+ TExprNode::TListType children, TExprContext& ctx, TOptimizeContext& optCtx)
+{
+ YQL_ENSURE(node.IsCallable({"UnionAllPositional", "UnionMergePositional"}));
auto targetColumnOrder = optCtx.Types->LookupColumnOrder(node);
YQL_ENSURE(targetColumnOrder);
@@ -828,7 +830,7 @@ TExprNode::TPtr ExpandPositionalUnionAll(const TExprNode& node, const TVector<TC
child = NormalizeColumnOrder(child, childColumnOrder, *targetColumnOrder, ctx);
}
- auto res = ctx.NewCallable(node.Pos(), "UnionAll", std::move(children));
+ auto res = ctx.NewCallable(node.Pos(), node.IsCallable("UnionAllPositional") ? "UnionAll" : "UnionMerge", std::move(children));
return KeepColumnOrder(res, node, ctx, *optCtx.Types);
}
@@ -1575,7 +1577,7 @@ std::tuple<TVector<ui32>, TExprNode::TListType> BuildJoinGroups(TPositionHandle
for (auto e: leftIdxs) {
newIndexes.emplace(e);
}
-
+
auto cartesian = JoinColumns(pos, current, with, nullptr, {}, ctx);
if (joinType == "cross") {
stackInputIdxs.emplace_back(std::move(newIndexes));
@@ -3222,7 +3224,7 @@ TExprNode::TPtr EnumerateForExtColumns(TPositionHandle pos, const TExprNode::TPt
TExprNode::TPtr ApplyOffsetLimitOverEnumerated(TPositionHandle pos, const TExprNode::TPtr& list,
const TExprNode::TPtr& offsetValue, const TExprNode::TPtr& limitValue, TExprContext& ctx) {
auto arg = ctx.NewArgument(pos, "row");
- auto member = ctx.NewCallable(pos, "SafeCast", {
+ auto member = ctx.NewCallable(pos, "SafeCast", {
ctx.NewCallable(pos, "Member", { arg, ctx.NewAtom(pos, "_yql_row_number") }),
ctx.NewAtom(pos, "Int64")});
auto int8type = ctx.NewCallable(pos, "PgType", { ctx.NewAtom(pos, "int8")});
@@ -3898,7 +3900,7 @@ TExprNode::TPtr ExpandPgSelectImpl(const TExprNode::TPtr& node, TExprContext& ct
auto directions = BuildSortDirections(node->Pos(), sort, ctx);
if (!finalExtTypes) {
- list = BuildSort(node->Pos(), list, directions, sortLambdaRoot, sortLambda->HeadPtr(), ctx);
+ list = BuildSort(node->Pos(), list, directions, sortLambdaRoot, sortLambda->HeadPtr(), ctx);
} else if (onlyOneSetItem && finalExtTypes) {
finalSortDirections = directions;
finalSortLambda = sortLambda;
diff --git a/yql/essentials/core/common_opt/yql_co_simple1.cpp b/yql/essentials/core/common_opt/yql_co_simple1.cpp
index 00432ffc5b..76c39f5f82 100644
--- a/yql/essentials/core/common_opt/yql_co_simple1.cpp
+++ b/yql/essentials/core/common_opt/yql_co_simple1.cpp
@@ -6505,7 +6505,7 @@ void RegisterCoSimpleCallables1(TCallableOptimizerMap& map) {
return node;
};
- map["UnionAllPositional"] = [](const TExprNode::TPtr& node, TExprContext& ctx, TOptimizeContext& optCtx) {
+ map["UnionAllPositional"] = map["UnionMergePositional"] = [](const TExprNode::TPtr& node, TExprContext& ctx, TOptimizeContext& optCtx) {
YQL_CLOG(DEBUG, Core) << "Expand " << node->Content();
if (node->ChildrenSize() == 1) {
return node->HeadPtr();
diff --git a/yql/essentials/core/type_ann/type_ann_core.cpp b/yql/essentials/core/type_ann/type_ann_core.cpp
index 810f5f70be..2474f046ae 100644
--- a/yql/essentials/core/type_ann/type_ann_core.cpp
+++ b/yql/essentials/core/type_ann/type_ann_core.cpp
@@ -12741,6 +12741,7 @@ template <NKikimr::NUdf::EDataSlot DataSlot>
ExtFunctions["AssumeColumnOrderPartial"] = &AssumeColumnOrderWrapper;
ExtFunctions["UnionAllPositional"] = &UnionAllPositionalWrapper;
ExtFunctions["UnionPositional"] = &UnionAllPositionalWrapper;
+ ExtFunctions["UnionMergePositional"] = &UnionAllPositionalWrapper;
ExtFunctions["SafeCast"] = &CastWrapper<false>;
ExtFunctions["StrictCast"] = &CastWrapper<true>;
ExtFunctions["Version"] = &VersionWrapper;
diff --git a/yql/essentials/sql/v1/context.cpp b/yql/essentials/sql/v1/context.cpp
index ab880f4315..64eca540d7 100644
--- a/yql/essentials/sql/v1/context.cpp
+++ b/yql/essentials/sql/v1/context.cpp
@@ -65,6 +65,7 @@ THashMap<TStringBuf, TPragmaField> CTX_PRAGMA_FIELDS = {
{"ValidateUnusedExprs", &TContext::ValidateUnusedExprs},
{"AnsiImplicitCrossJoin", &TContext::AnsiImplicitCrossJoin},
{"DistinctOverWindow", &TContext::DistinctOverWindow},
+ {"EmitUnionMerge", &TContext::EmitUnionMerge},
{"SeqMode", &TContext::SeqMode},
};
diff --git a/yql/essentials/sql/v1/context.h b/yql/essentials/sql/v1/context.h
index 61b2e4def3..f40a8ec557 100644
--- a/yql/essentials/sql/v1/context.h
+++ b/yql/essentials/sql/v1/context.h
@@ -326,6 +326,7 @@ namespace NSQLTranslationV1 {
bool AnsiImplicitCrossJoin = false; // select * from A,B
bool DistinctOverWindow = false;
bool SeqMode = false;
+ bool EmitUnionMerge = false;
};
class TColumnRefScope {
diff --git a/yql/essentials/sql/v1/select.cpp b/yql/essentials/sql/v1/select.cpp
index 552a74cb07..d2e4c0a874 100644
--- a/yql/essentials/sql/v1/select.cpp
+++ b/yql/essentials/sql/v1/select.cpp
@@ -2800,7 +2800,11 @@ public:
TNodePtr Build(TContext& ctx) override {
TPtr res;
if (QuantifierAll) {
- res = ctx.PositionalUnionAll ? Y("UnionAllPositional") : Y("UnionAll");
+ 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");
}
@@ -2848,8 +2852,8 @@ private:
};
TSourcePtr BuildUnion(
- TPosition pos,
- TVector<TSourcePtr>&& sources,
+ TPosition pos,
+ TVector<TSourcePtr>&& sources,
bool quantifierAll,
const TWriteSettings& settings
) {
diff --git a/yql/essentials/sql/v1/sql_query.cpp b/yql/essentials/sql/v1/sql_query.cpp
index 4d9f30a452..cc4c538a82 100644
--- a/yql/essentials/sql/v1/sql_query.cpp
+++ b/yql/essentials/sql/v1/sql_query.cpp
@@ -3073,6 +3073,12 @@ TNodePtr TSqlQuery::PragmaStatement(const TRule_pragma_stmt& stmt, bool& success
} else if (normalizedPragma == "disableseqmode") {
Ctx.SeqMode = false;
Ctx.IncrementMonCounter("sql_pragma", "DisableSeqMode");
+ } else if (normalizedPragma == "emitunionmerge") {
+ Ctx.EmitUnionMerge = true;
+ Ctx.IncrementMonCounter("sql_pragma", "EmitUnionMerge");
+ } else if (normalizedPragma == "disableemitunionmerge") {
+ Ctx.EmitUnionMerge = false;
+ Ctx.IncrementMonCounter("sql_pragma", "DisableEmitUnionMerge");
} else {
Error() << "Unknown pragma: " << pragma;
Ctx.IncrementMonCounter("sql_errors", "UnknownPragma");
diff --git a/yql/essentials/sql/v1/sql_ut.cpp b/yql/essentials/sql/v1/sql_ut.cpp
index 1bbdaada1e..f2cde62e79 100644
--- a/yql/essentials/sql/v1/sql_ut.cpp
+++ b/yql/essentials/sql/v1/sql_ut.cpp
@@ -1385,7 +1385,7 @@ Y_UNIT_TEST_SUITE(SqlParsingOnly) {
}
Y_UNIT_TEST(UnionAllTest) {
- NYql::TAstParseResult res = SqlToYql("SELECT key FROM plato.Input UNION ALL select subkey FROM plato.Input;");
+ NYql::TAstParseResult res = SqlToYql("PRAGMA DisableEmitUnionMerge; SELECT key FROM plato.Input UNION ALL select subkey FROM plato.Input;");
UNIT_ASSERT(res.Root);
TWordCountHive elementStat = {{TString("UnionAll"), 0}};
@@ -1393,6 +1393,15 @@ Y_UNIT_TEST_SUITE(SqlParsingOnly) {
UNIT_ASSERT_VALUES_EQUAL(1, elementStat["UnionAll"]);
}
+ Y_UNIT_TEST(UnionAllMergeTest) {
+ NYql::TAstParseResult res = SqlToYql("PRAGMA EmitUnionMerge; SELECT key FROM plato.Input UNION ALL select subkey FROM plato.Input;");
+ UNIT_ASSERT(res.Root);
+
+ TWordCountHive elementStat = {{TString("UnionMerge"), 0}};
+ VerifyProgram(res, elementStat, {});
+ UNIT_ASSERT_VALUES_EQUAL(1, elementStat["UnionMerge"]);
+ }
+
Y_UNIT_TEST(UnionTest) {
NYql::TAstParseResult res = SqlToYql("SELECT key FROM plato.Input UNION select subkey FROM plato.Input;");
UNIT_ASSERT(res.Root);
@@ -1404,6 +1413,7 @@ Y_UNIT_TEST_SUITE(SqlParsingOnly) {
Y_UNIT_TEST(UnionAggregationTest) {
NYql::TAstParseResult res = SqlToYql(R"(
+ PRAGMA DisableEmitUnionMerge;
SELECT 1
UNION ALL
SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1
@@ -1420,6 +1430,25 @@ Y_UNIT_TEST_SUITE(SqlParsingOnly) {
UNIT_ASSERT_VALUES_EQUAL(3, elementStat["Union"]);
}
+ Y_UNIT_TEST(UnionMergeAggregationTest) {
+ NYql::TAstParseResult res = SqlToYql(R"(
+ PRAGMA EmitUnionMerge;
+ SELECT 1
+ UNION ALL
+ SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1
+ UNION
+ SELECT 1 UNION SELECT 1 UNION SELECT 1 UNION SELECT 1
+ UNION ALL
+ SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1;
+ )");
+ UNIT_ASSERT(res.Root);
+
+ TWordCountHive elementStat = {{TString("Union"), 0}, {TString("UnionMerge"), 0}};
+ VerifyProgram(res, elementStat, {});
+ UNIT_ASSERT_VALUES_EQUAL(2, elementStat["UnionMerge"]);
+ UNIT_ASSERT_VALUES_EQUAL(3, elementStat["Union"]);
+ }
+
Y_UNIT_TEST(DeclareDecimalParameter) {
NYql::TAstParseResult res = SqlToYql("declare $value as Decimal(22,9); select $value as cnt;");
UNIT_ASSERT(res.Root);
diff --git a/yql/essentials/sql/v1/sql_ut_antlr4.cpp b/yql/essentials/sql/v1/sql_ut_antlr4.cpp
index 0f61449ae2..4781156091 100644
--- a/yql/essentials/sql/v1/sql_ut_antlr4.cpp
+++ b/yql/essentials/sql/v1/sql_ut_antlr4.cpp
@@ -1385,7 +1385,7 @@ Y_UNIT_TEST_SUITE(SqlParsingOnly) {
}
Y_UNIT_TEST(UnionAllTest) {
- NYql::TAstParseResult res = SqlToYql("SELECT key FROM plato.Input UNION ALL select subkey FROM plato.Input;");
+ NYql::TAstParseResult res = SqlToYql("PRAGMA DisableEmitUnionMerge; SELECT key FROM plato.Input UNION ALL select subkey FROM plato.Input;");
UNIT_ASSERT(res.Root);
TWordCountHive elementStat = {{TString("UnionAll"), 0}};
@@ -1393,6 +1393,15 @@ Y_UNIT_TEST_SUITE(SqlParsingOnly) {
UNIT_ASSERT_VALUES_EQUAL(1, elementStat["UnionAll"]);
}
+ Y_UNIT_TEST(UnionAllMergeTest) {
+ NYql::TAstParseResult res = SqlToYql("PRAGMA EmitUnionMerge; SELECT key FROM plato.Input UNION ALL select subkey FROM plato.Input;");
+ UNIT_ASSERT(res.Root);
+
+ TWordCountHive elementStat = {{TString("UnionMerge"), 0}};
+ VerifyProgram(res, elementStat, {});
+ UNIT_ASSERT_VALUES_EQUAL(1, elementStat["UnionMerge"]);
+ }
+
Y_UNIT_TEST(UnionTest) {
NYql::TAstParseResult res = SqlToYql("SELECT key FROM plato.Input UNION select subkey FROM plato.Input;");
UNIT_ASSERT(res.Root);
@@ -1404,6 +1413,7 @@ Y_UNIT_TEST_SUITE(SqlParsingOnly) {
Y_UNIT_TEST(UnionAggregationTest) {
NYql::TAstParseResult res = SqlToYql(R"(
+ PRAGMA DisableEmitUnionMerge;
SELECT 1
UNION ALL
SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1
@@ -1420,6 +1430,25 @@ Y_UNIT_TEST_SUITE(SqlParsingOnly) {
UNIT_ASSERT_VALUES_EQUAL(3, elementStat["Union"]);
}
+ Y_UNIT_TEST(UnionMergeAggregationTest) {
+ NYql::TAstParseResult res = SqlToYql(R"(
+ PRAGMA EmitUnionMerge;
+ SELECT 1
+ UNION ALL
+ SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1
+ UNION
+ SELECT 1 UNION SELECT 1 UNION SELECT 1 UNION SELECT 1
+ UNION ALL
+ SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1;
+ )");
+ UNIT_ASSERT(res.Root);
+
+ TWordCountHive elementStat = {{TString("Union"), 0}, {TString("UnionMerge"), 0}};
+ VerifyProgram(res, elementStat, {});
+ UNIT_ASSERT_VALUES_EQUAL(2, elementStat["UnionMerge"]);
+ UNIT_ASSERT_VALUES_EQUAL(3, elementStat["Union"]);
+ }
+
Y_UNIT_TEST(DeclareDecimalParameter) {
NYql::TAstParseResult res = SqlToYql("declare $value as Decimal(22,9); select $value as cnt;");
UNIT_ASSERT(res.Root);