From 6e2ebb2cfdf98b642ad2107613287e14f1319f22 Mon Sep 17 00:00:00 2001 From: pilik Date: Mon, 30 Sep 2024 13:27:07 +0300 Subject: [PATCH] [CBO] Hint syntax fix (#9875) --- .../data/queries/join_order_hints_complex.sql | 14 +++---- .../join_order_hints_many_hint_trees.sql | 12 +++--- .../data/queries/join_order_hints_simple.sql | 10 ++--- .../ut/join/data/queries/test_join_hint.sql | 6 +-- .../ut/join/data/queries/test_join_hint2.sql | 2 +- ydb/library/yql/core/cbo/cbo_hints.cpp | 37 ++++++++++--------- 6 files changed, 42 insertions(+), 39 deletions(-) diff --git a/ydb/core/kqp/ut/join/data/queries/join_order_hints_complex.sql b/ydb/core/kqp/ut/join/data/queries/join_order_hints_complex.sql index 12501dbbed40..f6e090f640d6 100644 --- a/ydb/core/kqp/ut/join/data/queries/join_order_hints_complex.sql +++ b/ydb/core/kqp/ut/join/data/queries/join_order_hints_complex.sql @@ -2,15 +2,15 @@ PRAGMA TablePathPrefix='/Root'; PRAGMA ydb.OptimizerHints = ' - Card(Unused # 10e8) + Rows(Unused # 10e8) JoinOrder( (Unused1 Unused2) (Unused3 Unused4) ) - Card(R # 10e8) - Card(T # 1) - Card(R T # 1) - Card(R S # 10e8) - Card(T U # 10e8) - Card(V # 1) + Rows(R # 10e8) + Rows(T # 1) + Rows(R T # 1) + Rows(R S # 10e8) + Rows(T U # 10e8) + Rows(V # 1) JoinOrder( (R S) (T U) ) '; diff --git a/ydb/core/kqp/ut/join/data/queries/join_order_hints_many_hint_trees.sql b/ydb/core/kqp/ut/join/data/queries/join_order_hints_many_hint_trees.sql index c1b8aaeb9935..6b1f6dc1583e 100644 --- a/ydb/core/kqp/ut/join/data/queries/join_order_hints_many_hint_trees.sql +++ b/ydb/core/kqp/ut/join/data/queries/join_order_hints_many_hint_trees.sql @@ -2,12 +2,12 @@ PRAGMA TablePathPrefix='/Root'; PRAGMA ydb.OptimizerHints = ' - Card(R # 10e8) - Card(T # 1) - Card(R T # 1) - Card(R S # 10e8) - Card(T U # 10e8) - Card(V # 1) + Rows(R # 10e8) + Rows(T # 1) + Rows(R T # 1) + Rows(R S # 10e8) + Rows(T U # 10e8) + Rows(V # 1) JoinOrder(T U) JoinOrder(R S) '; diff --git a/ydb/core/kqp/ut/join/data/queries/join_order_hints_simple.sql b/ydb/core/kqp/ut/join/data/queries/join_order_hints_simple.sql index 9c53e3ad07f8..d54e7fc58178 100644 --- a/ydb/core/kqp/ut/join/data/queries/join_order_hints_simple.sql +++ b/ydb/core/kqp/ut/join/data/queries/join_order_hints_simple.sql @@ -2,11 +2,11 @@ PRAGMA TablePathPrefix='/Root'; PRAGMA ydb.OptimizerHints = ' - Card(R # 10e8) - Card(T # 1) - Card(S # 10e8) - Card(R T # 1) - Card(R S # 10e8) + Rows(R # 10e8) + Rows(T # 1) + Rows(S # 10e8) + Rows(R T # 1) + Rows(R S # 10e8) JoinOrder(T (R S)) '; diff --git a/ydb/core/kqp/ut/join/data/queries/test_join_hint.sql b/ydb/core/kqp/ut/join/data/queries/test_join_hint.sql index bf61264170fd..c5900a1aa1ea 100644 --- a/ydb/core/kqp/ut/join/data/queries/test_join_hint.sql +++ b/ydb/core/kqp/ut/join/data/queries/test_join_hint.sql @@ -1,8 +1,8 @@ PRAGMA ydb.OptimizerHints = ' - JoinAlgo(R S Grace) - Card(R # 1) - Card(R S # 10e6) + JoinType(R S Shuffle) + Rows(R # 1) + Rows(R S # 10e6) '; SELECT * diff --git a/ydb/core/kqp/ut/join/data/queries/test_join_hint2.sql b/ydb/core/kqp/ut/join/data/queries/test_join_hint2.sql index e932682c3a30..9621162506ce 100644 --- a/ydb/core/kqp/ut/join/data/queries/test_join_hint2.sql +++ b/ydb/core/kqp/ut/join/data/queries/test_join_hint2.sql @@ -1,4 +1,4 @@ -PRAGMA ydb.OptimizerHints = 'Card(R S # 1)'; +PRAGMA ydb.OptimizerHints = 'Rows(R S # 1)'; SELECT * diff --git a/ydb/library/yql/core/cbo/cbo_hints.cpp b/ydb/library/yql/core/cbo/cbo_hints.cpp index 8d6e45de711b..8576954534da 100644 --- a/ydb/library/yql/core/cbo/cbo_hints.cpp +++ b/ydb/library/yql/core/cbo/cbo_hints.cpp @@ -22,13 +22,13 @@ class TOptimizerHintsParser { private: void Start() { while (Pos < Size) { - auto hintType = Keyword({"JoinOrder", "JoinAlgo", "Card"}); - if (hintType == "JoinOrder") { - JoinOrder(); - } else if (hintType == "JoinAlgo") { - JoinAlgo(); - } else if (hintType == "Card"){ - Card(); + auto hintType = Keyword({"JoinOrder", "Leading", "JoinType", "Rows"}); + if (hintType == "JoinOrder" || hintType == "Leading") { + JoinOrder(hintType == "Leading"); + } else if (hintType == "JoinType") { + JoinType(); + } else if (hintType == "Rows"){ + Rows(); } else { ParseError(Sprintf("Undefined hints type: %s", hintType.c_str()), Pos - hintType.Size()); } @@ -45,7 +45,7 @@ class TOptimizerHintsParser { return labels; } - void JoinAlgo() { + void JoinType() { i32 beginPos = Pos + 1; Keyword({"("}); @@ -53,7 +53,7 @@ class TOptimizerHintsParser { i32 labelsBeginPos = Pos + 1; TVector labels = CollectLabels(); if (labels.size() <= 1) { - ParseError(Sprintf("Bad labels for JoinAlgo hint: %s, example of the format: JoinAlgo(t1 t2 Grace)", JoinSeq(", ", labels).c_str()), labelsBeginPos); + ParseError(Sprintf("Bad labels for JoinType hint: %s, example of the format: JoinType(t1 t2 Shuffle)", JoinSeq(", ", labels).c_str()), labelsBeginPos); } TString reqJoinAlgoStr = std::move(labels.back()); labels.pop_back(); @@ -61,27 +61,30 @@ class TOptimizerHintsParser { Keyword({")"}); TVector joinAlgos = {EJoinAlgoType::GraceJoin, EJoinAlgoType::LookupJoin, EJoinAlgoType::MapJoin}; - TVector joinAlgosStr = {"Grace", "Lookup", "Map"}; + TVector joinAlgosStr = {"Shuffle", "Lookup", "Broadcast"}; - for (const auto& [joinAlgo, joinAlgoStr]: Zip(joinAlgos, joinAlgosStr)) { + for (const auto& [JoinType, joinAlgoStr]: Zip(joinAlgos, joinAlgosStr)) { if (reqJoinAlgoStr == joinAlgoStr) { - Hints.JoinAlgoHints->PushBack(std::move(labels), joinAlgo, "JoinAlgo" + Text.substr(beginPos, Pos - beginPos + 1)); + Hints.JoinAlgoHints->PushBack(std::move(labels), JoinType, "JoinType" + Text.substr(beginPos, Pos - beginPos + 1)); return; } } - ParseError(Sprintf("Unknown JoinAlgo: '%s', supported algos: [%s]", reqJoinAlgoStr.c_str(), JoinSeq(", ", joinAlgosStr).c_str()), Pos - reqJoinAlgoStr.Size()); + ParseError(Sprintf("Unknown JoinType: '%s', supported algos: [%s]", reqJoinAlgoStr.c_str(), JoinSeq(", ", joinAlgosStr).c_str()), Pos - reqJoinAlgoStr.Size()); Y_UNREACHABLE(); } - void JoinOrder() { + void JoinOrder(bool leading /* is keyword "Leading" or "JoinOrder" */) { i32 beginPos = Pos + 1; Keyword({"("}); auto joinOrderHintTree = JoinOrderLabels(); Keyword({")"}); - Hints.JoinOrderHints->PushBack(std::move(joinOrderHintTree), "JoinOrder" + Text.substr(beginPos, Pos - beginPos + 1)); + Hints.JoinOrderHints->PushBack( + std::move(joinOrderHintTree), + leading? "Leading" : "JoinOrder" + Text.substr(beginPos, Pos - beginPos + 1) + ); } std::shared_ptr JoinOrderLabels() { @@ -103,7 +106,7 @@ class TOptimizerHintsParser { Y_UNREACHABLE(); } - void Card() { + void Rows() { i32 beginPos = Pos + 1; Keyword({"("}); @@ -124,7 +127,7 @@ class TOptimizerHintsParser { default: {ParseError(Sprintf("Unknown operation: '%c'", sign), Pos - 1); Y_UNREACHABLE();} } - Hints.CardinalityHints->PushBack(std::move(labels), op, value, "Card" + Text.substr(beginPos, Pos - beginPos + 1)); + Hints.CardinalityHints->PushBack(std::move(labels), op, value, "Rows" + Text.substr(beginPos, Pos - beginPos + 1)); } private: