diff --git a/ydb/core/kqp/ut/join/kqp_join_order_ut.cpp b/ydb/core/kqp/ut/join/kqp_join_order_ut.cpp index 866994afb431..ef7062a3dd2b 100644 --- a/ydb/core/kqp/ut/join/kqp_join_order_ut.cpp +++ b/ydb/core/kqp/ut/join/kqp_join_order_ut.cpp @@ -374,40 +374,15 @@ Y_UNIT_TEST_SUITE(KqpJoinOrder) { Y_UNIT_TEST_XOR_OR_BOTH_FALSE(TestJoinOrderHintsComplex, StreamLookupJoin, ColumnStore) { auto plan = ExecuteJoinOrderTestDataQueryWithStats("queries/join_order_hints_complex.sql", "stats/basic.json", StreamLookupJoin, ColumnStore); - UNIT_ASSERT_VALUES_EQUAL(GetJoinOrder(plan).GetStringRobust(), R"([[["R","S"],["T","U"]],"V"])") ; - } - - void TraverseJoinTree( - const NJson::TJsonValue& tree, - std::function joinVisitFunc - ) { - if (tree.IsArray()) { - auto join = tree.GetArray(); - Y_ENSURE(join.size() == 2, Sprintf("Incorrect join tree piece, expected 2 children for join, got : %s", tree.GetStringRobust().c_str())); - joinVisitFunc(join[0], join[1]); - TraverseJoinTree(join[0], joinVisitFunc); - TraverseJoinTree(join[1], joinVisitFunc); - } else if (tree.IsString()) { - } else { - Y_ENSURE(false, Sprintf("Incorrect join tree piece: %s", tree.GetStringRobust().c_str())); - } + auto joinOrder = GetJoinOrder(plan).GetStringRobust(); + UNIT_ASSERT_C(joinOrder.find(R"([["R","S"],["T","U"]])") != TString::npos, joinOrder); } Y_UNIT_TEST_XOR_OR_BOTH_FALSE(TestJoinOrderHintsManyHintTrees, StreamLookupJoin, ColumnStore) { auto plan = ExecuteJoinOrderTestDataQueryWithStats("queries/join_order_hints_many_hint_trees.sql", "stats/basic.json", StreamLookupJoin, ColumnStore); - auto joinOrder = GetJoinOrder(plan); - - THashSet expectedJoins = { "R, S", "T, U" }; - TraverseJoinTree( - joinOrder, - [&expectedJoins](const NJson::TJsonValue& joinLhs, const NJson::TJsonValue& joinRhs){ - if (joinLhs.IsString() && joinRhs.IsString()) { - expectedJoins.erase(Sprintf("%s, %s", joinLhs.GetString().c_str(), joinRhs.GetString().c_str())); - } - } - ); - - UNIT_ASSERT_C(expectedJoins.empty(), Sprintf("%s wasn't found in '%s' join order!", JoinSeq(", ", expectedJoins).c_str(), joinOrder.GetStringRobust().c_str())); + auto joinOrder = GetJoinOrder(plan).GetStringRobust(); + UNIT_ASSERT_C(joinOrder.find(R"(["R","S"])") != TString::npos, joinOrder); + UNIT_ASSERT_C(joinOrder.find(R"(["T","U"])") != TString::npos, joinOrder); } void JoinOrderTestWithOverridenStats(const TString& queryPath, const TString& statsPath, TString correctJoinOrderPath, bool useStreamLookupJoin, bool useColumnStore