diff options
author | ulya-sidorina <yulia@ydb.tech> | 2022-07-07 18:54:51 +0300 |
---|---|---|
committer | ulya-sidorina <yulia@ydb.tech> | 2022-07-07 18:54:51 +0300 |
commit | 1ebea3a426fe7f05306ac0daeb294623e3f9db6a (patch) | |
tree | 79b4d4e0a601ea7c57c0d7f8c30af24544a2f626 | |
parent | 85e91b50e83808d4a04567711f77f21ccf0490fa (diff) | |
download | ydb-1ebea3a426fe7f05306ac0daeb294623e3f9db6a.tar.gz |
add CnMerge info to query plan
refactor(kqp_query_plan): add sort columns to query plan for merge connection
7 files changed, 64 insertions, 10 deletions
diff --git a/ydb/core/kqp/prepare/kqp_query_plan.cpp b/ydb/core/kqp/prepare/kqp_query_plan.cpp index 9799a9a394..9d4c6a515d 100644 --- a/ydb/core/kqp/prepare/kqp_query_plan.cpp +++ b/ydb/core/kqp/prepare/kqp_query_plan.cpp @@ -696,6 +696,16 @@ private: for (const auto& column : hashShuffle.Cast().KeyColumns()) { keyColumns.AppendValue(TString(column.Value())); } + } else if (auto merge = inputCn.Maybe<TDqCnMerge>()) { + inputPlanNode.TypeName = "Merge"; + auto& sortColumns = inputPlanNode.NodeInfo["SortColumns"]; + for (const auto& sortColumn : merge.Cast().SortColumns()) { + TStringBuilder sortColumnDesc; + sortColumnDesc << sortColumn.Column().Value() << " (" + << sortColumn.SortDirection().Value() << ")"; + + sortColumns.AppendValue(sortColumnDesc); + } } else { inputPlanNode.TypeName = inputCn.Ref().Content(); } @@ -1557,6 +1567,7 @@ TString SerializeTxPlans(const TVector<const TString>& txPlans, const TString co writer.WriteKey("Plan"); writer.BeginObject(); writer.WriteKey("Node Type").WriteString("Query"); + writer.WriteKey("PlanNodeType").WriteString("Query"); writer.WriteKey("Plans"); writer.BeginList(); diff --git a/ydb/core/kqp/ut/kqp_explain_ut.cpp b/ydb/core/kqp/ut/kqp_explain_ut.cpp index 7edaa89ba4..cd926b6aeb 100644 --- a/ydb/core/kqp/ut/kqp_explain_ut.cpp +++ b/ydb/core/kqp/ut/kqp_explain_ut.cpp @@ -712,6 +712,37 @@ Y_UNIT_TEST_SUITE(KqpExplain) { << " but received: " << filter.GetMapSafe().at("Predicate")); } } + + Y_UNIT_TEST_TWIN(MergeConnection, UseSessionActor) { + auto kikimr = KikimrRunnerEnableSessionActor(UseSessionActor); + TStreamExecScanQuerySettings settings; + settings.Explain(true); + + auto db = kikimr.GetTableClient(); + + auto it = db.StreamExecuteScanQuery(R"( + SELECT * FROM `/Root/KeyValue` ORDER BY Key; + )", settings).GetValueSync(); + + auto res = CollectStreamResult(it); + UNIT_ASSERT_C(it.IsSuccess(), it.GetIssues().ToString()); + UNIT_ASSERT(res.PlanJson); + + Cerr << res.PlanJson << Endl; + + NJson::TJsonValue plan; + NJson::ReadJsonTree(*res.PlanJson, &plan, true); + + auto merge = FindPlanNodeByKv( + plan, + "Node Type", + "Merge" + ); + UNIT_ASSERT(merge.IsDefined()); + const auto& sortColumns = merge.GetMapSafe().at("SortColumns").GetArraySafe(); + UNIT_ASSERT(sortColumns.size() == 1); + UNIT_ASSERT(sortColumns.at(0) == "Key (Asc)"); + } } } // namespace NKqp diff --git a/ydb/core/kqp/ut/kqp_merge_connection_ut.cpp b/ydb/core/kqp/ut/kqp_merge_connection_ut.cpp index 8ba8607165..5ad531a8d7 100644 --- a/ydb/core/kqp/ut/kqp_merge_connection_ut.cpp +++ b/ydb/core/kqp/ut/kqp_merge_connection_ut.cpp @@ -77,7 +77,7 @@ void CheckPlanForMergeCn(const TMaybe<TString>& planJson, bool hasChildSort, con NJson::TJsonValue plan; NJson::ReadJsonTree(*planJson, &plan, /* throwOnError */ true); - auto mergeCn = FindPlanNodeByKv(plan, "Node Type", "DqCnMerge"); + auto mergeCn = FindPlanNodeByKv(plan, "Node Type", "Merge"); UNIT_ASSERT(mergeCn.IsDefined()); auto childSort = FindPlanNodeByKv(mergeCn, "Name", sortOp); @@ -90,7 +90,7 @@ void CheckPlanForMergeCn(const TMaybe<TString>& planJson, bool hasChildSort, con // Check that TopSort has no Merge Connection in children auto topSort = FindPlanNodeByKv(plan, "Name", sortOp); if (topSort.IsDefined()) { - mergeCn = FindPlanNodeByKv(topSort, "Node Type", "DqCnMerge"); + mergeCn = FindPlanNodeByKv(topSort, "Node Type", "Merge"); UNIT_ASSERT(!mergeCn.IsDefined()); } } diff --git a/ydb/tests/functional/canonical/canondata/test_sql.TestCanonicalFolder1.test_case_explain.script-script_/explain.script.plan b/ydb/tests/functional/canonical/canondata/test_sql.TestCanonicalFolder1.test_case_explain.script-script_/explain.script.plan index fc376fbbb7..a0685b27cd 100644 --- a/ydb/tests/functional/canonical/canondata/test_sql.TestCanonicalFolder1.test_case_explain.script-script_/explain.script.plan +++ b/ydb/tests/functional/canonical/canondata/test_sql.TestCanonicalFolder1.test_case_explain.script-script_/explain.script.plan @@ -137,7 +137,8 @@ "PlanNodeType": "ResultSet" } ], - "Node Type": "Query" + "Node Type": "Query", + "PlanNodeType": "Query" } }, { @@ -252,7 +253,8 @@ "PlanNodeType": "ResultSet" } ], - "Node Type": "Query" + "Node Type": "Query", + "PlanNodeType": "Query" } }, { @@ -296,7 +298,8 @@ "PlanNodeType": "ResultSet" } ], - "Node Type": "Query" + "Node Type": "Query", + "PlanNodeType": "Query" } }, { diff --git a/ydb/tests/functional/canonical/canondata/test_sql.TestCanonicalFolder1.test_case_table_types.script-script_/table_types.script.plan b/ydb/tests/functional/canonical/canondata/test_sql.TestCanonicalFolder1.test_case_table_types.script-script_/table_types.script.plan index 23a6480962..2af3cb66ba 100644 --- a/ydb/tests/functional/canonical/canondata/test_sql.TestCanonicalFolder1.test_case_table_types.script-script_/table_types.script.plan +++ b/ydb/tests/functional/canonical/canondata/test_sql.TestCanonicalFolder1.test_case_table_types.script-script_/table_types.script.plan @@ -144,7 +144,8 @@ "PlanNodeType": "ResultSet" } ], - "Node Type": "Query" + "Node Type": "Query", + "PlanNodeType": "Query" } } ] diff --git a/ydb/tests/functional/canonical/canondata/test_sql.TestCanonicalFolder1.test_case_write_multi_usage_key.script-script_/write_multi_usage_key.script.plan b/ydb/tests/functional/canonical/canondata/test_sql.TestCanonicalFolder1.test_case_write_multi_usage_key.script-script_/write_multi_usage_key.script.plan index 9f8c3eb38b..ac73488fab 100644 --- a/ydb/tests/functional/canonical/canondata/test_sql.TestCanonicalFolder1.test_case_write_multi_usage_key.script-script_/write_multi_usage_key.script.plan +++ b/ydb/tests/functional/canonical/canondata/test_sql.TestCanonicalFolder1.test_case_write_multi_usage_key.script-script_/write_multi_usage_key.script.plan @@ -92,7 +92,10 @@ "Node Type": "Limit-TableFullScan" } ], - "Node Type": "DqCnMerge", + "Node Type": "Merge", + "SortColumns": [ + "Name (Asc)" + ], "PlanNodeType": "Connection" } ], @@ -109,7 +112,8 @@ "PlanNodeType": "ResultSet" } ], - "Node Type": "Query" + "Node Type": "Query", + "PlanNodeType": "Query" } } ] diff --git a/ydb/tests/functional/canonical/canondata/test_sql.TestCanonicalFolder1.test_case_write_write_group_by.script-script_/write_write_group_by.script.plan b/ydb/tests/functional/canonical/canondata/test_sql.TestCanonicalFolder1.test_case_write_write_group_by.script-script_/write_write_group_by.script.plan index 2c7ad86471..6bb6edf82e 100644 --- a/ydb/tests/functional/canonical/canondata/test_sql.TestCanonicalFolder1.test_case_write_write_group_by.script-script_/write_write_group_by.script.plan +++ b/ydb/tests/functional/canonical/canondata/test_sql.TestCanonicalFolder1.test_case_write_write_group_by.script-script_/write_write_group_by.script.plan @@ -95,7 +95,10 @@ "Node Type": "Limit-TableFullScan" } ], - "Node Type": "DqCnMerge", + "Node Type": "Merge", + "SortColumns": [ + "Group (Asc)" + ], "PlanNodeType": "Connection" } ], @@ -112,7 +115,8 @@ "PlanNodeType": "ResultSet" } ], - "Node Type": "Query" + "Node Type": "Query", + "PlanNodeType": "Query" } } ] |