summaryrefslogtreecommitdiffstats
path: root/yql/essentials/sql/v1
diff options
context:
space:
mode:
authoraneporada <[email protected]>2024-11-27 19:39:16 +0300
committeraneporada <[email protected]>2024-11-27 20:30:55 +0300
commit5ae93cf6a49513cc999774c6545bcfff16a32f59 (patch)
tree680c05eeb9c20a9859dc64aeb7c3453208751982 /yql/essentials/sql/v1
parentda01e3e90a5307aae60beecbbb94131a88d617be (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.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
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);