diff options
author | aneporada <[email protected]> | 2024-11-27 19:39:16 +0300 |
---|---|---|
committer | aneporada <[email protected]> | 2024-11-27 20:30:55 +0300 |
commit | 5ae93cf6a49513cc999774c6545bcfff16a32f59 (patch) | |
tree | 680c05eeb9c20a9859dc64aeb7c3453208751982 /yql/essentials/sql/v1 | |
parent | da01e3e90a5307aae60beecbbb94131a88d617be (diff) |
EmitUnionMerge - pragma to emit UnionMerge instead of UnionAll
commit_hash:ba3439438c76ed616e4f1059d0ff83ebb4a16b9a
Diffstat (limited to 'yql/essentials/sql/v1')
-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 |
6 files changed, 75 insertions, 5 deletions
diff --git a/yql/essentials/sql/v1/context.cpp b/yql/essentials/sql/v1/context.cpp index ab880f43151..64eca540d77 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 61b2e4def36..f40a8ec557f 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 552a74cb07a..d2e4c0a8749 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 4d9f30a4525..cc4c538a826 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 1bbdaada1ea..f2cde62e794 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 0f61449ae20..4781156091b 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); |