diff options
author | aneporada <aneporada@yandex-team.com> | 2024-11-27 19:39:16 +0300 |
---|---|---|
committer | aneporada <aneporada@yandex-team.com> | 2024-11-27 20:30:55 +0300 |
commit | 5ae93cf6a49513cc999774c6545bcfff16a32f59 (patch) | |
tree | 680c05eeb9c20a9859dc64aeb7c3453208751982 /yql/essentials | |
parent | da01e3e90a5307aae60beecbbb94131a88d617be (diff) | |
download | ydb-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.cpp | 12 | ||||
-rw-r--r-- | yql/essentials/core/common_opt/yql_co_simple1.cpp | 2 | ||||
-rw-r--r-- | yql/essentials/core/type_ann/type_ann_core.cpp | 1 | ||||
-rw-r--r-- | yql/essentials/sql/v1/context.cpp | 1 | ||||
-rw-r--r-- | yql/essentials/sql/v1/context.h | 1 | ||||
-rw-r--r-- | yql/essentials/sql/v1/select.cpp | 10 | ||||
-rw-r--r-- | yql/essentials/sql/v1/sql_query.cpp | 6 | ||||
-rw-r--r-- | yql/essentials/sql/v1/sql_ut.cpp | 31 | ||||
-rw-r--r-- | yql/essentials/sql/v1/sql_ut_antlr4.cpp | 31 |
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); |