aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorspuchin <spuchin@ydb.tech>2023-05-29 18:09:08 +0300
committerspuchin <spuchin@ydb.tech>2023-05-29 18:09:08 +0300
commit4597cb5b2afed2e2a3d316803ef7c23776258b40 (patch)
treedd44608104e5df9d8f654b43901f4b596e96e86a
parent0e07043ae62bc543d90237be4bfaf04fab67a318 (diff)
downloadydb-4597cb5b2afed2e2a3d316803ef7c23776258b40.tar.gz
Explain support for ExecuteQuery (QueryService). ()
-rw-r--r--ydb/core/grpc_services/query/rpc_execute_query.cpp44
-rw-r--r--ydb/core/kqp/host/kqp_host.cpp4
-rw-r--r--ydb/core/kqp/opt/kqp_query_plan.cpp123
-rw-r--r--ydb/core/kqp/opt/kqp_query_plan.h2
-rw-r--r--ydb/core/kqp/session_actor/kqp_query_state.cpp5
-rw-r--r--ydb/core/kqp/session_actor/kqp_session_actor.cpp34
-rw-r--r--ydb/core/kqp/ut/common/kqp_ut_common.cpp14
-rw-r--r--ydb/core/kqp/ut/common/kqp_ut_common.h1
-rw-r--r--ydb/core/kqp/ut/query/kqp_explain_ut.cpp14
-rw-r--r--ydb/core/kqp/ut/service/kqp_query_service_ut.cpp25
-rw-r--r--ydb/public/lib/experimental/ydb_logstore.cpp2
-rw-r--r--ydb/public/sdk/cpp/client/draft/ydb_query/CMakeLists.darwin-x86_64.txt2
-rw-r--r--ydb/public/sdk/cpp/client/draft/ydb_query/CMakeLists.linux-aarch64.txt2
-rw-r--r--ydb/public/sdk/cpp/client/draft/ydb_query/CMakeLists.linux-x86_64.txt2
-rw-r--r--ydb/public/sdk/cpp/client/draft/ydb_query/CMakeLists.windows-x86_64.txt2
-rw-r--r--ydb/public/sdk/cpp/client/draft/ydb_query/impl/exec_query.cpp42
-rw-r--r--ydb/public/sdk/cpp/client/draft/ydb_query/query.h19
-rw-r--r--ydb/public/sdk/cpp/client/draft/ydb_query/stats.cpp61
-rw-r--r--ydb/public/sdk/cpp/client/draft/ydb_query/stats.h43
-rw-r--r--ydb/public/sdk/cpp/client/draft/ydb_query/tx.h8
-rw-r--r--ydb/public/sdk/cpp/client/impl/ydb_internal/scheme_helpers/helpers.h17
-rw-r--r--ydb/public/sdk/cpp/client/impl/ydb_internal/table_helpers/helpers.h11
-rw-r--r--ydb/public/sdk/cpp/client/ydb_coordination/coordination.cpp2
-rw-r--r--ydb/public/sdk/cpp/client/ydb_proto/accessor.h1
-rw-r--r--ydb/public/sdk/cpp/client/ydb_scheme/scheme.cpp2
-rw-r--r--ydb/public/sdk/cpp/client/ydb_table/impl/CMakeLists.darwin-x86_64.txt1
-rw-r--r--ydb/public/sdk/cpp/client/ydb_table/impl/CMakeLists.linux-aarch64.txt1
-rw-r--r--ydb/public/sdk/cpp/client/ydb_table/impl/CMakeLists.linux-x86_64.txt1
-rw-r--r--ydb/public/sdk/cpp/client/ydb_table/impl/CMakeLists.windows-x86_64.txt1
-rw-r--r--ydb/public/sdk/cpp/client/ydb_table/query_stats/CMakeLists.darwin-x86_64.txt1
-rw-r--r--ydb/public/sdk/cpp/client/ydb_table/query_stats/CMakeLists.linux-aarch64.txt1
-rw-r--r--ydb/public/sdk/cpp/client/ydb_table/query_stats/CMakeLists.linux-x86_64.txt1
-rw-r--r--ydb/public/sdk/cpp/client/ydb_table/query_stats/CMakeLists.windows-x86_64.txt1
-rw-r--r--ydb/public/sdk/cpp/client/ydb_table/query_stats/stats.cpp62
-rw-r--r--ydb/public/sdk/cpp/client/ydb_table/query_stats/stats.h25
-rw-r--r--ydb/public/sdk/cpp/client/ydb_table/table.cpp1
-rw-r--r--ydb/public/sdk/cpp/client/ydb_topic/impl/topic.cpp2
-rw-r--r--ydb/tests/functional/canonical/canondata/test_sql.TestCanonicalFolder1.test_case_write_multi_usage.script-script_/write_multi_usage.script.plan4
38 files changed, 378 insertions, 206 deletions
diff --git a/ydb/core/grpc_services/query/rpc_execute_query.cpp b/ydb/core/grpc_services/query/rpc_execute_query.cpp
index 7e3081ecb8..47869cd383 100644
--- a/ydb/core/grpc_services/query/rpc_execute_query.cpp
+++ b/ydb/core/grpc_services/query/rpc_execute_query.cpp
@@ -131,11 +131,27 @@ bool FillTxControl(const Ydb::Query::TransactionControl& from, Ydb::Table::Trans
return true;
}
+bool NeedReportStats(const Ydb::Query::ExecuteQueryRequest& req) {
+ switch (req.exec_mode()) {
+ case Ydb::Query::EXEC_MODE_EXPLAIN:
+ return true;
+
+ default:
+ return false;
+ }
+}
+
std::tuple<Ydb::StatusIds::StatusCode, NYql::TIssues> FillKqpRequest(
const Ydb::Query::ExecuteQueryRequest& req, NKikimrKqp::TEvQueryRequest& kqpRequest)
{
kqpRequest.MutableRequest()->MutableYdbParameters()->insert(req.parameters().begin(), req.parameters().end());
switch (req.exec_mode()) {
+ case Ydb::Query::EXEC_MODE_VALIDATE:
+ kqpRequest.MutableRequest()->SetAction(NKikimrKqp::QUERY_ACTION_VALIDATE);
+ break;
+ case Ydb::Query::EXEC_MODE_EXPLAIN:
+ kqpRequest.MutableRequest()->SetAction(NKikimrKqp::QUERY_ACTION_EXPLAIN);
+ break;
case Ydb::Query::EXEC_MODE_EXECUTE:
kqpRequest.MutableRequest()->SetAction(NKikimrKqp::QUERY_ACTION_EXECUTE);
break;
@@ -198,7 +214,8 @@ private:
HFunc(TEvents::TEvWakeup, Handle);
HFunc(TRpcServices::TEvGrpcNextReply, Handle);
HFunc(NKqp::TEvKqpExecuter::TEvStreamData, Handle);
- hFunc(NKqp::TEvKqp::TEvQueryResponse, Handle);
+ HFunc(NKqp::TEvKqp::TEvQueryResponse, Handle);
+ HFunc(NKqp::TEvKqp::TEvProcessResponse, Handle);
default:
UnexpectedEvent(__func__, ev);
}
@@ -307,13 +324,36 @@ private:
ctx.Send(ev->Sender, resp.Release());
}
- void Handle(NKqp::TEvKqp::TEvQueryResponse::TPtr& ev) {
+ void Handle(NKqp::TEvKqp::TEvQueryResponse::TPtr& ev, const TActorContext&) {
auto& record = ev->Get()->Record.GetRef();
NYql::TIssues issues;
const auto& issueMessage = record.GetResponse().GetQueryIssues();
NYql::IssuesFromMessage(issueMessage, issues);
+ if (record.GetYdbStatus() == Ydb::StatusIds::SUCCESS && NeedReportStats(*Request_->GetProtoRequest())) {
+ Ydb::Query::ExecuteQueryResponsePart response;
+ response.set_status(Ydb::StatusIds::SUCCESS);
+
+ auto& kqpResponse = record.GetResponse();
+ FillQueryStats(*response.mutable_exec_stats(), kqpResponse);
+
+ TString out;
+ Y_PROTOBUF_SUPPRESS_NODISCARD response.SerializeToString(&out);
+ Request_->SendSerializedResult(std::move(out), record.GetYdbStatus());
+ }
+
+ ReplyFinishStream(record.GetYdbStatus(), issues);
+ }
+
+ void Handle(NKqp::TEvKqp::TEvProcessResponse::TPtr& ev, const TActorContext&) {
+ auto& record = ev->Get()->Record;
+
+ NYql::TIssues issues;
+ if (record.HasError()) {
+ issues.AddIssue(MakeIssue(NKikimrIssues::TIssuesIds::DEFAULT_ERROR, record.GetError()));
+ }
+
ReplyFinishStream(record.GetYdbStatus(), issues);
}
diff --git a/ydb/core/kqp/host/kqp_host.cpp b/ydb/core/kqp/host/kqp_host.cpp
index 07d0ee50af..e094aab28d 100644
--- a/ydb/core/kqp/host/kqp_host.cpp
+++ b/ydb/core/kqp/host/kqp_host.cpp
@@ -295,7 +295,7 @@ public:
void FillResult(TResult& queryResult) const override {
YQL_ENSURE(ExecuteCtx.QueryResults.size() == 1);
queryResult = std::move(ExecuteCtx.QueryResults[0]);
- queryResult.QueryPlan = SerializeExplainPlan(queryResult.PreparingQuery->GetPhysicalQuery());
+ queryResult.QueryPlan = queryResult.PreparingQuery->GetPhysicalQuery().GetQueryPlan();
}
private:
@@ -327,7 +327,7 @@ public:
prepareResult.SqlVersion = SqlVersion;
YQL_ENSURE(prepareResult.PreparingQuery->GetVersion() == NKikimrKqp::TPreparedQuery::VERSION_PHYSICAL_V1);
- prepareResult.QueryPlan = SerializeExplainPlan(prepareResult.PreparingQuery->GetPhysicalQuery());
+ prepareResult.QueryPlan = prepareResult.PreparingQuery->GetPhysicalQuery().GetQueryPlan();
prepareResult.QueryAst = prepareResult.PreparingQuery->GetPhysicalQuery().GetQueryAst();
}
diff --git a/ydb/core/kqp/opt/kqp_query_plan.cpp b/ydb/core/kqp/opt/kqp_query_plan.cpp
index 8e75bbd911..f4e4d1e3e1 100644
--- a/ydb/core/kqp/opt/kqp_query_plan.cpp
+++ b/ydb/core/kqp/opt/kqp_query_plan.cpp
@@ -1578,6 +1578,60 @@ void SetNonZero(NJson::TJsonValue& node, const TStringBuf& name, T value) {
}
}
+TString SerializeTxPlans(const TVector<const TString>& txPlans, const TString commonPlanInfo = "") {
+ NJsonWriter::TBuf writer;
+ writer.SetIndentSpaces(2);
+
+ writer.BeginObject();
+ writer.WriteKey("meta");
+ writer.BeginObject();
+ writer.WriteKey("version").WriteString("0.2");
+ writer.WriteKey("type").WriteString("query");
+ writer.EndObject();
+
+ if (!commonPlanInfo.Empty()) {
+ NJson::TJsonValue commonPlanJson;
+ NJson::ReadJsonTree(commonPlanInfo, &commonPlanJson, true);
+
+ writer.WriteKey("tables");
+ writer.WriteJsonValue(&commonPlanJson);
+ }
+
+ writer.WriteKey("Plan");
+ writer.BeginObject();
+ writer.WriteKey("Node Type").WriteString("Query");
+ writer.WriteKey("PlanNodeType").WriteString("Query");
+ writer.WriteKey("Plans");
+ writer.BeginList();
+
+ auto removeStageGuid = [](NJson::TJsonValue& node) {
+ auto& map = node.GetMapSafe();
+ if (map.contains("StageGuid")) {
+ map.erase("StageGuid");
+ }
+ };
+
+ for (auto txPlanIt = txPlans.rbegin(); txPlanIt != txPlans.rend(); ++txPlanIt) {
+ if (txPlanIt->empty()) {
+ continue;
+ }
+
+ NJson::TJsonValue txPlanJson;
+ NJson::ReadJsonTree(*txPlanIt, &txPlanJson, true);
+
+ for (auto& subplan : txPlanJson.GetMapSafe().at("Plans").GetArraySafe()) {
+ ModifyPlan(subplan, removeStageGuid);
+ writer.WriteJsonValue(&subplan, true);
+ }
+ }
+
+ writer.EndList();
+ writer.EndObject();
+ writer.EndObject();
+
+ return writer.Str();
+}
+
} // namespace
// TODO(sk): check prepared statements params in read ranges
@@ -1627,10 +1681,17 @@ void PhyQuerySetTxPlans(NKqpProto::TKqpPhyQuery& queryProto, const TKqpPhysicalQ
setPlan(id++, query.Transactions().Item(txId), (*queryProto.MutableTransactions())[txId]);
}
+ TVector<const TString> txPlans;
+ txPlans.reserve(queryProto.GetTransactions().size());
+ for (const auto& phyTx: queryProto.GetTransactions()) {
+ txPlans.emplace_back(phyTx.GetPlan());
+ }
+
NJsonWriter::TBuf writer;
writer.SetIndentSpaces(2);
WriteCommonTablesInfo(writer, serializerCtx.Tables);
- queryProto.SetQueryPlan(writer.Str());
+
+ queryProto.SetQueryPlan(SerializeTxPlans(txPlans, writer.Str()));
}
TString AddExecStatsToTxPlan(const TString& txPlanJson, const NYql::NDqProto::TDqExecutionStats& stats) {
@@ -1755,66 +1816,6 @@ TString AddExecStatsToTxPlan(const TString& txPlanJson, const NYql::NDqProto::TD
return txWriter.Str();
}
-TString SerializeTxPlans(const TVector<const TString>& txPlans, const TString commonPlanInfo = "") {
- NJsonWriter::TBuf writer;
- writer.SetIndentSpaces(2);
-
- writer.BeginObject();
- writer.WriteKey("meta");
- writer.BeginObject();
- writer.WriteKey("version").WriteString("0.2");
- writer.WriteKey("type").WriteString("query");
- writer.EndObject();
-
- if (!commonPlanInfo.Empty()) {
- writer.WriteKey("tables");
- writer.UnsafeWriteValue(commonPlanInfo);
- }
-
- writer.WriteKey("Plan");
- writer.BeginObject();
- writer.WriteKey("Node Type").WriteString("Query");
- writer.WriteKey("PlanNodeType").WriteString("Query");
- writer.WriteKey("Plans");
- writer.BeginList();
-
- auto removeStageGuid = [](NJson::TJsonValue& node) {
- auto& map = node.GetMapSafe();
- if (map.contains("StageGuid")) {
- map.erase("StageGuid");
- }
- };
-
- for (auto txPlanIt = txPlans.rbegin(); txPlanIt != txPlans.rend(); ++txPlanIt) {
- if (txPlanIt->empty()) {
- continue;
- }
-
- NJson::TJsonValue txPlanJson;
- NJson::ReadJsonTree(*txPlanIt, &txPlanJson, true);
-
- for (auto& subplan : txPlanJson.GetMapSafe().at("Plans").GetArraySafe()) {
- ModifyPlan(subplan, removeStageGuid);
- writer.WriteJsonValue(&subplan, true);
- }
- }
-
- writer.EndList();
- writer.EndObject();
- writer.EndObject();
-
- return writer.Str();
-}
-
-TString SerializeExplainPlan(const NKqpProto::TKqpPhyQuery& phyQuery) {
- TVector<const TString> txPlans;
- txPlans.reserve(phyQuery.GetTransactions().size());
- for (const auto& phyTx: phyQuery.GetTransactions()) {
- txPlans.emplace_back(phyTx.GetPlan());
- }
- return SerializeTxPlans(txPlans, phyQuery.GetQueryPlan());
-}
-
TString SerializeAnalyzePlan(const NKqpProto::TKqpStatsQuery& queryStats) {
TVector<const TString> txPlans;
for (const auto& execStats: queryStats.GetExecutions()) {
diff --git a/ydb/core/kqp/opt/kqp_query_plan.h b/ydb/core/kqp/opt/kqp_query_plan.h
index ad5b004504..5b08b9d496 100644
--- a/ydb/core/kqp/opt/kqp_query_plan.h
+++ b/ydb/core/kqp/opt/kqp_query_plan.h
@@ -42,8 +42,6 @@ void PhyQuerySetTxPlans(NKqpProto::TKqpPhyQuery& queryProto, const NYql::NNodes:
*/
TString AddExecStatsToTxPlan(const TString& txPlan, const NYql::NDqProto::TDqExecutionStats& stats);
-TString SerializeExplainPlan(const NKqpProto::TKqpPhyQuery& phyQuery);
-
TString SerializeAnalyzePlan(const NKqpProto::TKqpStatsQuery& queryStats);
TString SerializeScriptPlan(const TVector<const TString>& queryPlans);
diff --git a/ydb/core/kqp/session_actor/kqp_query_state.cpp b/ydb/core/kqp/session_actor/kqp_query_state.cpp
index a39209ee84..d2499049f7 100644
--- a/ydb/core/kqp/session_actor/kqp_query_state.cpp
+++ b/ydb/core/kqp/session_actor/kqp_query_state.cpp
@@ -141,6 +141,11 @@ std::unique_ptr<TEvKqp::TEvCompileRequest> TKqpQueryState::BuildCompileRequest()
keepInCache = GetQueryKeepInCache();
break;
+ case NKikimrKqp::QUERY_ACTION_EXPLAIN:
+ query = TKqpQueryId(Cluster, Database, GetQuery(), GetType(), GetQueryParameterTypes());
+ keepInCache = false;
+ break;
+
default:
YQL_ENSURE(false);
}
diff --git a/ydb/core/kqp/session_actor/kqp_session_actor.cpp b/ydb/core/kqp/session_actor/kqp_session_actor.cpp
index ef2b5dc0cd..8ed504fca4 100644
--- a/ydb/core/kqp/session_actor/kqp_session_actor.cpp
+++ b/ydb/core/kqp/session_actor/kqp_session_actor.cpp
@@ -216,6 +216,19 @@ public:
Cleanup();
}
+ void ForwardResponse(TEvKqp::TEvProcessResponse::TPtr& ev) {
+ QueryResponse = std::make_unique<TEvKqp::TEvQueryResponse>();
+ auto& record = QueryResponse->Record.GetRef();
+ record.SetYdbStatus(ev->Get()->Record.GetYdbStatus());
+
+ if (ev->Get()->Record.HasError()) {
+ auto issue = MakeIssue(NKikimrIssues::TIssuesIds::DEFAULT_ERROR, ev->Get()->Record.GetError());
+ IssueToMessage(issue, record.MutableResponse()->AddQueryIssues());
+ }
+
+ Cleanup();
+ }
+
void ReplyTransactionNotFound(const TString& txId) {
std::vector<TIssue> issues{YqlIssue(TPosition(), TIssuesIds::KIKIMR_TRANSACTION_NOT_FOUND,
TStringBuilder() << "Transaction not found: " << txId)};
@@ -384,8 +397,19 @@ public:
}
case NKikimrKqp::QUERY_ACTION_COMMIT_TX:
return CommitTx();
+
+ case NKikimrKqp::QUERY_ACTION_EXPLAIN: {
+ auto type = QueryState->GetType();
+ if (type != NKikimrKqp::QUERY_TYPE_SQL_GENERIC_QUERY &&
+ type != NKikimrKqp::QUERY_TYPE_SQL_GENERIC_SCRIPT)
+ {
+ return ForwardRequest(ev);
+ }
+
+ break;
+ }
+
// not supported yet
- case NKikimrKqp::QUERY_ACTION_EXPLAIN:
case NKikimrKqp::QUERY_ACTION_VALIDATE:
case NKikimrKqp::QUERY_ACTION_PARSE:
return ForwardRequest(ev);
@@ -473,7 +497,9 @@ public:
}
void OnSuccessCompileRequest() {
- if (QueryState->GetAction() == NKikimrKqp::QUERY_ACTION_PREPARE) {
+ if (QueryState->GetAction() == NKikimrKqp::QUERY_ACTION_PREPARE ||
+ QueryState->GetAction() == NKikimrKqp::QUERY_ACTION_EXPLAIN)
+ {
return ReplyPrepareResult();
}
@@ -1444,6 +1470,9 @@ public:
auto& preparedQuery = compileResult->PreparedQuery;
response.MutableQueryParameters()->CopyFrom(preparedQuery->GetParameters());
+
+ response.SetQueryPlan(preparedQuery->GetPhysicalQuery().GetQueryPlan());
+ response.SetQueryAst(preparedQuery->GetPhysicalQuery().GetQueryAst());
}
}
@@ -1769,6 +1798,7 @@ public:
// always come from WorkerActor
hFunc(TEvKqp::TEvQueryResponse, ForwardResponse);
+ hFunc(TEvKqp::TEvProcessResponse, ForwardResponse);
default:
UnexpectedEvent("ExecuteState", ev);
}
diff --git a/ydb/core/kqp/ut/common/kqp_ut_common.cpp b/ydb/core/kqp/ut/common/kqp_ut_common.cpp
index 351ef6a04f..62fdc57137 100644
--- a/ydb/core/kqp/ut/common/kqp_ut_common.cpp
+++ b/ydb/core/kqp/ut/common/kqp_ut_common.cpp
@@ -760,6 +760,20 @@ TString ReadTablePartToYson(NYdb::NTable::TSession session, const TString& table
return NYdb::FormatResultSetYson(streamPart.ExtractPart());
}
+bool ValidatePlanNodeIds(const NJson::TJsonValue& plan) {
+ ui32 planNodeId = 0;
+ ui32 count = 0;
+
+ do {
+ count = CountPlanNodesByKv(plan, "PlanNodeId", std::to_string(++planNodeId));
+ if (count > 1) {
+ return false;
+ }
+ } while (count > 0);
+
+ return true;
+}
+
ui32 CountPlanNodesByKv(const NJson::TJsonValue& plan, const TString& key, const TString& value) {
ui32 result = 0;
diff --git a/ydb/core/kqp/ut/common/kqp_ut_common.h b/ydb/core/kqp/ut/common/kqp_ut_common.h
index 98b08b2e1c..d92e1c8462 100644
--- a/ydb/core/kqp/ut/common/kqp_ut_common.h
+++ b/ydb/core/kqp/ut/common/kqp_ut_common.h
@@ -248,6 +248,7 @@ TString StreamResultToYson(NYdb::NTable::TScanQueryPartIterator& it, bool throwO
TString StreamResultToYson(NYdb::NScripting::TYqlResultPartIterator& it, bool throwOnTImeout = false);
TString StreamResultToYson(NYdb::NTable::TTablePartIterator& it, bool throwOnTImeout = false);
+bool ValidatePlanNodeIds(const NJson::TJsonValue& plan);
ui32 CountPlanNodesByKv(const NJson::TJsonValue& plan, const TString& key, const TString& value);
NJson::TJsonValue FindPlanNodeByKv(const NJson::TJsonValue& plan, const TString& key, const TString& value);
std::vector<NJson::TJsonValue> FindPlanNodes(const NJson::TJsonValue& plan, const TString& key);
diff --git a/ydb/core/kqp/ut/query/kqp_explain_ut.cpp b/ydb/core/kqp/ut/query/kqp_explain_ut.cpp
index 3b74b0e4ca..21180e5993 100644
--- a/ydb/core/kqp/ut/query/kqp_explain_ut.cpp
+++ b/ydb/core/kqp/ut/query/kqp_explain_ut.cpp
@@ -61,20 +61,6 @@ void CreateSampleTables(TKikimrRunner& kikimr) {
session.Close();
}
-bool ValidatePlanNodeIds(const NJson::TJsonValue& plan) {
- ui32 planNodeId = 0;
- ui32 count = 0;
-
- do {
- count = CountPlanNodesByKv(plan, "PlanNodeId", std::to_string(++planNodeId));
- if (count > 1) {
- return false;
- }
- } while (count > 0);
-
- return true;
-}
-
}
Y_UNIT_TEST_SUITE(KqpExplain) {
diff --git a/ydb/core/kqp/ut/service/kqp_query_service_ut.cpp b/ydb/core/kqp/ut/service/kqp_query_service_ut.cpp
index 33f917b03e..9457179b29 100644
--- a/ydb/core/kqp/ut/service/kqp_query_service_ut.cpp
+++ b/ydb/core/kqp/ut/service/kqp_query_service_ut.cpp
@@ -142,6 +142,31 @@ Y_UNIT_TEST_SUITE(KqpQueryService) {
CompareYson(R"([[6u]])", FormatResultSetYson(result.GetResultSet(1)));
}
+ Y_UNIT_TEST(ExplainQuery) {
+ auto kikimr = DefaultKikimrRunner();
+ auto db = kikimr.GetQueryClient();
+
+ auto params = TParamsBuilder()
+ .AddParam("$value").Int64(17).Build()
+ .Build();
+
+ auto settings = TExecuteQuerySettings()
+ .ExecMode(EExecMode::Explain);
+
+ auto result = db.ExecuteQuery(R"(
+ SELECT $value;
+ )", TTxControl::NoTx(), params, settings).ExtractValueSync();
+ UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString());
+ UNIT_ASSERT(result.GetResultSets().empty());
+
+ UNIT_ASSERT(result.GetStats().Defined());
+ UNIT_ASSERT(result.GetStats()->GetPlan().Defined());
+
+ NJson::TJsonValue plan;
+ NJson::ReadJsonTree(*result.GetStats()->GetPlan(), &plan, true);
+ UNIT_ASSERT(ValidatePlanNodeIds(plan));
+ }
+
NYdb::NQuery::TScriptExecutionOperation WaitScriptExecutionOperation(const NYdb::TOperation::TOperationId& operationId, const NYdb::TDriver& ydbDriver) {
NYdb::NOperation::TOperationClient client(ydbDriver);
NThreading::TFuture<NYdb::NQuery::TScriptExecutionOperation> op;
diff --git a/ydb/public/lib/experimental/ydb_logstore.cpp b/ydb/public/lib/experimental/ydb_logstore.cpp
index 0b96617433..7b7c332975 100644
--- a/ydb/public/lib/experimental/ydb_logstore.cpp
+++ b/ydb/public/lib/experimental/ydb_logstore.cpp
@@ -2,7 +2,7 @@
#define INCLUDE_YDB_INTERNAL_H
#include <ydb/public/sdk/cpp/client/impl/ydb_internal/make_request/make.h>
-#include <ydb/public/sdk/cpp/client/impl/ydb_internal/table_helpers/helpers.h>
+#include <ydb/public/sdk/cpp/client/impl/ydb_internal/scheme_helpers/helpers.h>
#undef INCLUDE_YDB_INTERNAL_H
#include <ydb/public/api/grpc/draft/ydb_logstore_v1.grpc.pb.h>
diff --git a/ydb/public/sdk/cpp/client/draft/ydb_query/CMakeLists.darwin-x86_64.txt b/ydb/public/sdk/cpp/client/draft/ydb_query/CMakeLists.darwin-x86_64.txt
index 646cde7da9..5ea0336e39 100644
--- a/ydb/public/sdk/cpp/client/draft/ydb_query/CMakeLists.darwin-x86_64.txt
+++ b/ydb/public/sdk/cpp/client/draft/ydb_query/CMakeLists.darwin-x86_64.txt
@@ -14,11 +14,11 @@ target_link_libraries(client-draft-ydb_query PUBLIC
yutil
draft-ydb_query-impl
cpp-client-ydb_common_client
- cpp-client-ydb_table
client-ydb_types-operation
)
target_sources(client-draft-ydb_query PRIVATE
${CMAKE_SOURCE_DIR}/ydb/public/sdk/cpp/client/draft/ydb_query/client.cpp
${CMAKE_SOURCE_DIR}/ydb/public/sdk/cpp/client/draft/ydb_query/query.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/public/sdk/cpp/client/draft/ydb_query/stats.cpp
${CMAKE_SOURCE_DIR}/ydb/public/sdk/cpp/client/draft/ydb_query/tx.cpp
)
diff --git a/ydb/public/sdk/cpp/client/draft/ydb_query/CMakeLists.linux-aarch64.txt b/ydb/public/sdk/cpp/client/draft/ydb_query/CMakeLists.linux-aarch64.txt
index 4f212f0f10..65fda29db5 100644
--- a/ydb/public/sdk/cpp/client/draft/ydb_query/CMakeLists.linux-aarch64.txt
+++ b/ydb/public/sdk/cpp/client/draft/ydb_query/CMakeLists.linux-aarch64.txt
@@ -15,11 +15,11 @@ target_link_libraries(client-draft-ydb_query PUBLIC
yutil
draft-ydb_query-impl
cpp-client-ydb_common_client
- cpp-client-ydb_table
client-ydb_types-operation
)
target_sources(client-draft-ydb_query PRIVATE
${CMAKE_SOURCE_DIR}/ydb/public/sdk/cpp/client/draft/ydb_query/client.cpp
${CMAKE_SOURCE_DIR}/ydb/public/sdk/cpp/client/draft/ydb_query/query.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/public/sdk/cpp/client/draft/ydb_query/stats.cpp
${CMAKE_SOURCE_DIR}/ydb/public/sdk/cpp/client/draft/ydb_query/tx.cpp
)
diff --git a/ydb/public/sdk/cpp/client/draft/ydb_query/CMakeLists.linux-x86_64.txt b/ydb/public/sdk/cpp/client/draft/ydb_query/CMakeLists.linux-x86_64.txt
index 4f212f0f10..65fda29db5 100644
--- a/ydb/public/sdk/cpp/client/draft/ydb_query/CMakeLists.linux-x86_64.txt
+++ b/ydb/public/sdk/cpp/client/draft/ydb_query/CMakeLists.linux-x86_64.txt
@@ -15,11 +15,11 @@ target_link_libraries(client-draft-ydb_query PUBLIC
yutil
draft-ydb_query-impl
cpp-client-ydb_common_client
- cpp-client-ydb_table
client-ydb_types-operation
)
target_sources(client-draft-ydb_query PRIVATE
${CMAKE_SOURCE_DIR}/ydb/public/sdk/cpp/client/draft/ydb_query/client.cpp
${CMAKE_SOURCE_DIR}/ydb/public/sdk/cpp/client/draft/ydb_query/query.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/public/sdk/cpp/client/draft/ydb_query/stats.cpp
${CMAKE_SOURCE_DIR}/ydb/public/sdk/cpp/client/draft/ydb_query/tx.cpp
)
diff --git a/ydb/public/sdk/cpp/client/draft/ydb_query/CMakeLists.windows-x86_64.txt b/ydb/public/sdk/cpp/client/draft/ydb_query/CMakeLists.windows-x86_64.txt
index 646cde7da9..5ea0336e39 100644
--- a/ydb/public/sdk/cpp/client/draft/ydb_query/CMakeLists.windows-x86_64.txt
+++ b/ydb/public/sdk/cpp/client/draft/ydb_query/CMakeLists.windows-x86_64.txt
@@ -14,11 +14,11 @@ target_link_libraries(client-draft-ydb_query PUBLIC
yutil
draft-ydb_query-impl
cpp-client-ydb_common_client
- cpp-client-ydb_table
client-ydb_types-operation
)
target_sources(client-draft-ydb_query PRIVATE
${CMAKE_SOURCE_DIR}/ydb/public/sdk/cpp/client/draft/ydb_query/client.cpp
${CMAKE_SOURCE_DIR}/ydb/public/sdk/cpp/client/draft/ydb_query/query.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/public/sdk/cpp/client/draft/ydb_query/stats.cpp
${CMAKE_SOURCE_DIR}/ydb/public/sdk/cpp/client/draft/ydb_query/tx.cpp
)
diff --git a/ydb/public/sdk/cpp/client/draft/ydb_query/impl/exec_query.cpp b/ydb/public/sdk/cpp/client/draft/ydb_query/impl/exec_query.cpp
index 0a342a423b..248f952ae3 100644
--- a/ydb/public/sdk/cpp/client/draft/ydb_query/impl/exec_query.cpp
+++ b/ydb/public/sdk/cpp/client/draft/ydb_query/impl/exec_query.cpp
@@ -60,7 +60,7 @@ public:
auto readCb = [self, promise](TGRpcStatus&& grpcStatus) mutable {
if (!grpcStatus.Ok()) {
self->Finished_ = true;
- promise.SetValue({TStatus(TPlainStatus(grpcStatus, self->Endpoint_))});
+ promise.SetValue({TStatus(TPlainStatus(grpcStatus, self->Endpoint_)), {}});
} else {
NYql::TIssues issues;
NYql::IssuesFromMessage(self->Response_.issues(), issues);
@@ -69,14 +69,20 @@ public:
TPlainStatus plainStatus{clientStatus, std::move(issues), self->Endpoint_, {}};
TStatus status{std::move(plainStatus)};
+ TMaybe<TExecStats> stats;
+ if (self->Response_.has_exec_stats()) {
+ stats = TExecStats(std::move(*self->Response_.mutable_exec_stats()));
+ }
+
if (self->Response_.has_result_set()) {
promise.SetValue({
std::move(status),
TResultSet(std::move(*self->Response_.mutable_result_set())),
- self->Response_.result_set_index()
+ self->Response_.result_set_index(),
+ std::move(stats)
});
} else {
- promise.SetValue({std::move(status)});
+ promise.SetValue({std::move(status), std::move(stats)});
}
}
};
@@ -112,6 +118,7 @@ struct TExecuteQueryBuffer : public TThrRefBase, TNonCopyable {
TExecuteQueryIterator Iterator_;
TVector<NYql::TIssue> Issues_;
TVector<Ydb::ResultSet> ResultSets_;
+ TMaybe<TExecStats> Stats_;
void Next() {
TPtr self(this);
@@ -123,9 +130,11 @@ struct TExecuteQueryBuffer : public TThrRefBase, TNonCopyable {
if (part.EOS()) {
TVector<NYql::TIssue> issues;
TVector<Ydb::ResultSet> resultProtos;
+ TMaybe<TExecStats> stats;
std::swap(self->Issues_, issues);
std::swap(self->ResultSets_, resultProtos);
+ std::swap(self->Stats_, stats);
TVector<TResultSet> resultSets;
for (auto& proto : resultProtos) {
@@ -134,10 +143,11 @@ struct TExecuteQueryBuffer : public TThrRefBase, TNonCopyable {
self->Promise_.SetValue(TExecuteQueryResult(
TStatus(EStatus::SUCCESS, NYql::TIssues(std::move(issues))),
- std::move(resultSets)
+ std::move(resultSets),
+ std::move(stats)
));
} else {
- self->Promise_.SetValue(TExecuteQueryResult(std::move(part), {}));
+ self->Promise_.SetValue(TExecuteQueryResult(std::move(part), {}, {}));
}
return;
@@ -160,6 +170,10 @@ struct TExecuteQueryBuffer : public TThrRefBase, TNonCopyable {
resultSet.mutable_rows()->Add(inRsProto.rows().begin(), inRsProto.rows().end());
}
+ if (part.GetStats().Defined()) {
+ self->Stats_ = part.GetStats();
+ }
+
self->Next();
});
}
@@ -171,16 +185,20 @@ TFuture<std::pair<TPlainStatus, TExecuteQueryProcessorPtr>> StreamExecuteQueryIm
const TExecuteQuerySettings& settings)
{
auto request = MakeRequest<Ydb::Query::ExecuteQueryRequest>();
- request.set_exec_mode(Ydb::Query::EXEC_MODE_EXECUTE);
+ request.set_exec_mode(::Ydb::Query::ExecMode(settings.ExecMode_));
request.mutable_query_content()->set_text(query);
- auto requestTxControl = request.mutable_tx_control();
- requestTxControl->set_commit_tx(txControl.CommitTx_);
- if (txControl.TxId_) {
- requestTxControl->set_tx_id(*txControl.TxId_);
+ if (txControl.HasTx()) {
+ auto requestTxControl = request.mutable_tx_control();
+ requestTxControl->set_commit_tx(txControl.CommitTx_);
+ if (txControl.TxId_) {
+ requestTxControl->set_tx_id(*txControl.TxId_);
+ } else {
+ Y_ASSERT(txControl.TxSettings_);
+ SetTxSettings(*txControl.TxSettings_, requestTxControl->mutable_begin_tx());
+ }
} else {
- Y_ASSERT(txControl.TxSettings_);
- SetTxSettings(*txControl.TxSettings_, requestTxControl->mutable_begin_tx());
+ Y_ASSERT(!txControl.CommitTx_);
}
if (params) {
diff --git a/ydb/public/sdk/cpp/client/draft/ydb_query/query.h b/ydb/public/sdk/cpp/client/draft/ydb_query/query.h
index b75b03053b..5214a6385c 100644
--- a/ydb/public/sdk/cpp/client/draft/ydb_query/query.h
+++ b/ydb/public/sdk/cpp/client/draft/ydb_query/query.h
@@ -2,6 +2,7 @@
#include <ydb/public/api/grpc/draft/ydb_query_v1.grpc.pb.h>
+#include <ydb/public/sdk/cpp/client/draft/ydb_query/stats.h>
#include <ydb/public/sdk/cpp/client/ydb_result/result.h>
#include <ydb/public/sdk/cpp/client/ydb_types/fluent_settings_helpers.h>
#include <ydb/public/sdk/cpp/client/ydb_types/operation/operation.h>
@@ -44,19 +45,24 @@ public:
const TResultSet& GetResultSet() const { return *ResultSet_; }
TResultSet ExtractResultSet() { return std::move(*ResultSet_); }
- TExecuteQueryPart(TStatus&& status)
+ const TMaybe<TExecStats>& GetStats() const { return Stats_; }
+
+ TExecuteQueryPart(TStatus&& status, TMaybe<TExecStats>&& queryStats)
: TStreamPartStatus(std::move(status))
+ , Stats_(std::move(queryStats))
{}
- TExecuteQueryPart(TStatus&& status, TResultSet&& resultSet, i64 resultSetIndex)
+ TExecuteQueryPart(TStatus&& status, TResultSet&& resultSet, i64 resultSetIndex, TMaybe<TExecStats>&& queryStats)
: TStreamPartStatus(std::move(status))
, ResultSet_(std::move(resultSet))
, ResultSetIndex_(resultSetIndex)
+ , Stats_(std::move(queryStats))
{}
private:
TMaybe<TResultSet> ResultSet_;
i64 ResultSetIndex_ = 0;
+ TMaybe<TExecStats> Stats_;
};
using TAsyncExecuteQueryPart = NThreading::TFuture<TExecuteQueryPart>;
@@ -81,31 +87,34 @@ private:
using TAsyncExecuteQueryIterator = NThreading::TFuture<TExecuteQueryIterator>;
struct TExecuteQuerySettings : public TRequestSettings<TExecuteQuerySettings> {
+ FLUENT_SETTING_DEFAULT(EExecMode, ExecMode, EExecMode::Execute);
};
class TExecuteQueryResult : public TStatus {
public:
const TVector<TResultSet>& GetResultSets() const;
TResultSet GetResultSet(size_t resultIndex) const;
-
TResultSetParser GetResultSetParser(size_t resultIndex) const;
+ const TMaybe<TExecStats>& GetStats() const { return Stats_; }
+
TExecuteQueryResult(TStatus&& status)
: TStatus(std::move(status))
{}
- TExecuteQueryResult(TStatus&& status, TVector<TResultSet>&& resultSets)
+ TExecuteQueryResult(TStatus&& status, TVector<TResultSet>&& resultSets, TMaybe<TExecStats>&& stats)
: TStatus(std::move(status))
, ResultSets_(std::move(resultSets))
+ , Stats_(std::move(stats))
{}
private:
TVector<TResultSet> ResultSets_;
+ TMaybe<TExecStats> Stats_;
};
using TAsyncExecuteQueryResult = NThreading::TFuture<TExecuteQueryResult>;
-
struct TExecuteScriptSettings : public TOperationRequestSettings<TExecuteScriptSettings> {
};
diff --git a/ydb/public/sdk/cpp/client/draft/ydb_query/stats.cpp b/ydb/public/sdk/cpp/client/draft/ydb_query/stats.cpp
new file mode 100644
index 0000000000..f5fbc9d6c0
--- /dev/null
+++ b/ydb/public/sdk/cpp/client/draft/ydb_query/stats.cpp
@@ -0,0 +1,61 @@
+#include "stats.h"
+
+#include <ydb/public/api/protos/ydb_table.pb.h>
+
+#include <util/datetime/base.h>
+
+#include <google/protobuf/text_format.h>
+
+namespace NYdb::NQuery {
+
+class TExecStats::TImpl {
+public:
+ Ydb::TableStats::QueryStats Proto;
+};
+
+TExecStats::TExecStats(const Ydb::TableStats::QueryStats& proto) {
+ Impl_ = std::make_shared<TImpl>();
+ Impl_->Proto = proto;
+}
+
+TExecStats::TExecStats(Ydb::TableStats::QueryStats&& proto) {
+ Impl_ = std::make_shared<TImpl>();
+ Impl_->Proto = std::move(proto);
+}
+
+TString TExecStats::ToString(bool withPlan) const {
+ auto proto = Impl_->Proto;
+
+ if (!withPlan) {
+ proto.clear_query_plan();
+ proto.clear_query_ast();
+ }
+
+ TString res;
+ ::google::protobuf::TextFormat::PrintToString(proto, &res);
+ return res;
+}
+
+TMaybe<TString> TExecStats::GetPlan() const {
+ auto proto = Impl_->Proto;
+
+ if (proto.query_plan().empty()) {
+ return {};
+ }
+
+ return proto.query_plan();
+}
+
+TDuration TExecStats::GetTotalDuration() const {
+ return TDuration::MicroSeconds(Impl_->Proto.total_duration_us());
+}
+
+TDuration TExecStats::GetTotalCpuTime() const {
+ return TDuration::MicroSeconds(Impl_->Proto.total_cpu_time_us());
+}
+
+const Ydb::TableStats::QueryStats& TExecStats::GetProto() const {
+ return Impl_->Proto;
+}
+
+} // namespace NYdb::NQuery
diff --git a/ydb/public/sdk/cpp/client/draft/ydb_query/stats.h b/ydb/public/sdk/cpp/client/draft/ydb_query/stats.h
new file mode 100644
index 0000000000..1fed19f6e3
--- /dev/null
+++ b/ydb/public/sdk/cpp/client/draft/ydb_query/stats.h
@@ -0,0 +1,43 @@
+#pragma once
+
+#include <util/datetime/base.h>
+#include <util/generic/maybe.h>
+#include <util/generic/string.h>
+
+#include <memory>
+
+class TDuration;
+
+namespace Ydb::TableStats {
+ class QueryStats;
+}
+
+namespace NYdb {
+ class TProtoAccessor;
+}
+
+namespace NYdb::NQuery {
+
+class TExecStats {
+ friend class NYdb::TProtoAccessor;
+
+public:
+ explicit TExecStats(Ydb::TableStats::QueryStats&& proto);
+ explicit TExecStats(const Ydb::TableStats::QueryStats& proto);
+
+ TString ToString(bool withPlan = false) const;
+
+ TMaybe<TString> GetPlan() const;
+
+ TDuration GetTotalDuration() const;
+ TDuration GetTotalCpuTime() const;
+
+private:
+ const Ydb::TableStats::QueryStats& GetProto() const;
+
+private:
+ class TImpl;
+ std::shared_ptr<TImpl> Impl_;
+};
+
+} // namespace NYdb::NQuery
diff --git a/ydb/public/sdk/cpp/client/draft/ydb_query/tx.h b/ydb/public/sdk/cpp/client/draft/ydb_query/tx.h
index 1e1517b02d..e32a5315d0 100644
--- a/ydb/public/sdk/cpp/client/draft/ydb_query/tx.h
+++ b/ydb/public/sdk/cpp/client/draft/ydb_query/tx.h
@@ -82,11 +82,19 @@ struct TTxControl {
return TTxControl(settings);
}
+ static TTxControl NoTx() {
+ return TTxControl();
+ }
+
const TMaybe<TString> TxId_;
const TMaybe<TTxSettings> TxSettings_;
FLUENT_SETTING_FLAG(CommitTx);
+ bool HasTx() const { return TxId_.Defined() || TxSettings_.Defined(); }
+
private:
+ TTxControl() {}
+
TTxControl(const TString& txId)
: TxId_(txId) {}
diff --git a/ydb/public/sdk/cpp/client/impl/ydb_internal/scheme_helpers/helpers.h b/ydb/public/sdk/cpp/client/impl/ydb_internal/scheme_helpers/helpers.h
new file mode 100644
index 0000000000..bd43f2b21d
--- /dev/null
+++ b/ydb/public/sdk/cpp/client/impl/ydb_internal/scheme_helpers/helpers.h
@@ -0,0 +1,17 @@
+#pragma once
+
+#include <ydb/public/sdk/cpp/client/ydb_scheme/scheme.h>
+
+namespace NYdb {
+
+template<typename TFrom>
+inline void PermissionToSchemeEntry(const TFrom& from, TVector<NScheme::TPermissions>* to) {
+ for (const auto& effPerm : from) {
+ to->push_back(NScheme::TPermissions{effPerm.subject(), TVector<TString>()});
+ for (const auto& permName : effPerm.permission_names()) {
+ to->back().PermissionNames.push_back(permName);
+ }
+ }
+}
+
+} // namespace NYdb
diff --git a/ydb/public/sdk/cpp/client/impl/ydb_internal/table_helpers/helpers.h b/ydb/public/sdk/cpp/client/impl/ydb_internal/table_helpers/helpers.h
index 96e8ee2801..c6fa2c2679 100644
--- a/ydb/public/sdk/cpp/client/impl/ydb_internal/table_helpers/helpers.h
+++ b/ydb/public/sdk/cpp/client/impl/ydb_internal/table_helpers/helpers.h
@@ -3,21 +3,10 @@
#include <ydb/public/sdk/cpp/client/impl/ydb_internal/internal_header.h>
#include <ydb/public/api/protos/ydb_table.pb.h>
-#include <ydb/public/sdk/cpp/client/ydb_scheme/scheme.h>
#include <ydb/public/sdk/cpp/client/ydb_table/query_stats/stats.h>
namespace NYdb {
-template<typename TFrom>
-inline void PermissionToSchemeEntry(const TFrom& from, TVector<NScheme::TPermissions>* to) {
- for (const auto& effPerm : from) {
- to->push_back(NScheme::TPermissions{effPerm.subject(), TVector<TString>()});
- for (const auto& permName : effPerm.permission_names()) {
- to->back().PermissionNames.push_back(permName);
- }
- }
-}
-
inline Ydb::Table::QueryStatsCollection::Mode GetStatsCollectionMode(TMaybe<NTable::ECollectQueryStatsMode> mode) {
if (mode) {
switch (*mode) {
diff --git a/ydb/public/sdk/cpp/client/ydb_coordination/coordination.cpp b/ydb/public/sdk/cpp/client/ydb_coordination/coordination.cpp
index 01828ddf99..8fe30d6734 100644
--- a/ydb/public/sdk/cpp/client/ydb_coordination/coordination.cpp
+++ b/ydb/public/sdk/cpp/client/ydb_coordination/coordination.cpp
@@ -2,7 +2,7 @@
#define INCLUDE_YDB_INTERNAL_H
#include <ydb/public/sdk/cpp/client/impl/ydb_internal/make_request/make.h>
-#include <ydb/public/sdk/cpp/client/impl/ydb_internal/table_helpers/helpers.h>
+#include <ydb/public/sdk/cpp/client/impl/ydb_internal/scheme_helpers/helpers.h>
#undef INCLUDE_YDB_INTERNAL_H
#include <ydb/public/api/grpc/ydb_coordination_v1.grpc.pb.h>
diff --git a/ydb/public/sdk/cpp/client/ydb_proto/accessor.h b/ydb/public/sdk/cpp/client/ydb_proto/accessor.h
index 33223c3bfc..541fc54809 100644
--- a/ydb/public/sdk/cpp/client/ydb_proto/accessor.h
+++ b/ydb/public/sdk/cpp/client/ydb_proto/accessor.h
@@ -25,7 +25,6 @@ class TType;
class TParams;
namespace NTable {
-class TQueryStats;
class TTableDescription;
class TIndexDescription;
}
diff --git a/ydb/public/sdk/cpp/client/ydb_scheme/scheme.cpp b/ydb/public/sdk/cpp/client/ydb_scheme/scheme.cpp
index 120b254444..98b7aa55b6 100644
--- a/ydb/public/sdk/cpp/client/ydb_scheme/scheme.cpp
+++ b/ydb/public/sdk/cpp/client/ydb_scheme/scheme.cpp
@@ -2,7 +2,7 @@
#define INCLUDE_YDB_INTERNAL_H
#include <ydb/public/sdk/cpp/client/impl/ydb_internal/make_request/make.h>
-#include <ydb/public/sdk/cpp/client/impl/ydb_internal/table_helpers/helpers.h>
+#include <ydb/public/sdk/cpp/client/impl/ydb_internal/scheme_helpers/helpers.h>
#undef INCLUDE_YDB_INTERNAL_H
#include <ydb/public/api/grpc/ydb_scheme_v1.grpc.pb.h>
diff --git a/ydb/public/sdk/cpp/client/ydb_table/impl/CMakeLists.darwin-x86_64.txt b/ydb/public/sdk/cpp/client/ydb_table/impl/CMakeLists.darwin-x86_64.txt
index 50213bcb6f..2569e1c3f0 100644
--- a/ydb/public/sdk/cpp/client/ydb_table/impl/CMakeLists.darwin-x86_64.txt
+++ b/ydb/public/sdk/cpp/client/ydb_table/impl/CMakeLists.darwin-x86_64.txt
@@ -15,6 +15,7 @@ target_link_libraries(client-ydb_table-impl PUBLIC
api-protos
lib-operation_id-protos
client-impl-ydb_endpoints
+ client-ydb_table-query_stats
public-issue-protos
)
target_sources(client-ydb_table-impl PRIVATE
diff --git a/ydb/public/sdk/cpp/client/ydb_table/impl/CMakeLists.linux-aarch64.txt b/ydb/public/sdk/cpp/client/ydb_table/impl/CMakeLists.linux-aarch64.txt
index 70b0b70fea..e56b888c90 100644
--- a/ydb/public/sdk/cpp/client/ydb_table/impl/CMakeLists.linux-aarch64.txt
+++ b/ydb/public/sdk/cpp/client/ydb_table/impl/CMakeLists.linux-aarch64.txt
@@ -16,6 +16,7 @@ target_link_libraries(client-ydb_table-impl PUBLIC
api-protos
lib-operation_id-protos
client-impl-ydb_endpoints
+ client-ydb_table-query_stats
public-issue-protos
)
target_sources(client-ydb_table-impl PRIVATE
diff --git a/ydb/public/sdk/cpp/client/ydb_table/impl/CMakeLists.linux-x86_64.txt b/ydb/public/sdk/cpp/client/ydb_table/impl/CMakeLists.linux-x86_64.txt
index 70b0b70fea..e56b888c90 100644
--- a/ydb/public/sdk/cpp/client/ydb_table/impl/CMakeLists.linux-x86_64.txt
+++ b/ydb/public/sdk/cpp/client/ydb_table/impl/CMakeLists.linux-x86_64.txt
@@ -16,6 +16,7 @@ target_link_libraries(client-ydb_table-impl PUBLIC
api-protos
lib-operation_id-protos
client-impl-ydb_endpoints
+ client-ydb_table-query_stats
public-issue-protos
)
target_sources(client-ydb_table-impl PRIVATE
diff --git a/ydb/public/sdk/cpp/client/ydb_table/impl/CMakeLists.windows-x86_64.txt b/ydb/public/sdk/cpp/client/ydb_table/impl/CMakeLists.windows-x86_64.txt
index 50213bcb6f..2569e1c3f0 100644
--- a/ydb/public/sdk/cpp/client/ydb_table/impl/CMakeLists.windows-x86_64.txt
+++ b/ydb/public/sdk/cpp/client/ydb_table/impl/CMakeLists.windows-x86_64.txt
@@ -15,6 +15,7 @@ target_link_libraries(client-ydb_table-impl PUBLIC
api-protos
lib-operation_id-protos
client-impl-ydb_endpoints
+ client-ydb_table-query_stats
public-issue-protos
)
target_sources(client-ydb_table-impl PRIVATE
diff --git a/ydb/public/sdk/cpp/client/ydb_table/query_stats/CMakeLists.darwin-x86_64.txt b/ydb/public/sdk/cpp/client/ydb_table/query_stats/CMakeLists.darwin-x86_64.txt
index 15f141ce6c..d7aff0e3a1 100644
--- a/ydb/public/sdk/cpp/client/ydb_table/query_stats/CMakeLists.darwin-x86_64.txt
+++ b/ydb/public/sdk/cpp/client/ydb_table/query_stats/CMakeLists.darwin-x86_64.txt
@@ -13,6 +13,7 @@ target_link_libraries(client-ydb_table-query_stats PUBLIC
yutil
contrib-libs-protobuf
api-protos
+ client-draft-ydb_query
)
target_sources(client-ydb_table-query_stats PRIVATE
${CMAKE_SOURCE_DIR}/ydb/public/sdk/cpp/client/ydb_table/query_stats/stats.cpp
diff --git a/ydb/public/sdk/cpp/client/ydb_table/query_stats/CMakeLists.linux-aarch64.txt b/ydb/public/sdk/cpp/client/ydb_table/query_stats/CMakeLists.linux-aarch64.txt
index 093bc872cc..5c45e2a70d 100644
--- a/ydb/public/sdk/cpp/client/ydb_table/query_stats/CMakeLists.linux-aarch64.txt
+++ b/ydb/public/sdk/cpp/client/ydb_table/query_stats/CMakeLists.linux-aarch64.txt
@@ -14,6 +14,7 @@ target_link_libraries(client-ydb_table-query_stats PUBLIC
yutil
contrib-libs-protobuf
api-protos
+ client-draft-ydb_query
)
target_sources(client-ydb_table-query_stats PRIVATE
${CMAKE_SOURCE_DIR}/ydb/public/sdk/cpp/client/ydb_table/query_stats/stats.cpp
diff --git a/ydb/public/sdk/cpp/client/ydb_table/query_stats/CMakeLists.linux-x86_64.txt b/ydb/public/sdk/cpp/client/ydb_table/query_stats/CMakeLists.linux-x86_64.txt
index 093bc872cc..5c45e2a70d 100644
--- a/ydb/public/sdk/cpp/client/ydb_table/query_stats/CMakeLists.linux-x86_64.txt
+++ b/ydb/public/sdk/cpp/client/ydb_table/query_stats/CMakeLists.linux-x86_64.txt
@@ -14,6 +14,7 @@ target_link_libraries(client-ydb_table-query_stats PUBLIC
yutil
contrib-libs-protobuf
api-protos
+ client-draft-ydb_query
)
target_sources(client-ydb_table-query_stats PRIVATE
${CMAKE_SOURCE_DIR}/ydb/public/sdk/cpp/client/ydb_table/query_stats/stats.cpp
diff --git a/ydb/public/sdk/cpp/client/ydb_table/query_stats/CMakeLists.windows-x86_64.txt b/ydb/public/sdk/cpp/client/ydb_table/query_stats/CMakeLists.windows-x86_64.txt
index 15f141ce6c..d7aff0e3a1 100644
--- a/ydb/public/sdk/cpp/client/ydb_table/query_stats/CMakeLists.windows-x86_64.txt
+++ b/ydb/public/sdk/cpp/client/ydb_table/query_stats/CMakeLists.windows-x86_64.txt
@@ -13,6 +13,7 @@ target_link_libraries(client-ydb_table-query_stats PUBLIC
yutil
contrib-libs-protobuf
api-protos
+ client-draft-ydb_query
)
target_sources(client-ydb_table-query_stats PRIVATE
${CMAKE_SOURCE_DIR}/ydb/public/sdk/cpp/client/ydb_table/query_stats/stats.cpp
diff --git a/ydb/public/sdk/cpp/client/ydb_table/query_stats/stats.cpp b/ydb/public/sdk/cpp/client/ydb_table/query_stats/stats.cpp
index 64e63194ff..7dd7622062 100644
--- a/ydb/public/sdk/cpp/client/ydb_table/query_stats/stats.cpp
+++ b/ydb/public/sdk/cpp/client/ydb_table/query_stats/stats.cpp
@@ -1,63 +1 @@
#include "stats.h"
-
-#include <ydb/public/api/protos/ydb_table.pb.h>
-
-#include <util/datetime/base.h>
-
-#include <google/protobuf/text_format.h>
-
-namespace NYdb {
-namespace NTable {
-
-class TQueryStats::TImpl {
-public:
- Ydb::TableStats::QueryStats Proto;
-};
-
-TQueryStats::TQueryStats(const Ydb::TableStats::QueryStats& proto) {
- Impl_ = std::make_shared<TImpl>();
- Impl_->Proto = proto;
-}
-
-TQueryStats::TQueryStats(Ydb::TableStats::QueryStats&& proto) {
- Impl_ = std::make_shared<TImpl>();
- Impl_->Proto = std::move(proto);
-}
-
-TString TQueryStats::ToString(bool withPlan) const {
- auto proto = Impl_->Proto;
-
- if (!withPlan) {
- proto.clear_query_plan();
- proto.clear_query_ast();
- }
-
- TString res;
- ::google::protobuf::TextFormat::PrintToString(proto, &res);
- return res;
-}
-
-TMaybe<TString> TQueryStats::GetPlan() const {
- auto proto = Impl_->Proto;
-
- if (proto.query_plan().empty()) {
- return {};
- }
-
- return proto.query_plan();
-}
-
-TDuration TQueryStats::GetTotalDuration() const {
- return TDuration::MicroSeconds(Impl_->Proto.total_duration_us());
-}
-
-TDuration TQueryStats::GetTotalCpuTime() const {
- return TDuration::MicroSeconds(Impl_->Proto.total_cpu_time_us());
-}
-
-const Ydb::TableStats::QueryStats& TQueryStats::GetProto() const {
- return Impl_->Proto;
-}
-
-} // namespace NTable
-} // namespace NYdb
diff --git a/ydb/public/sdk/cpp/client/ydb_table/query_stats/stats.h b/ydb/public/sdk/cpp/client/ydb_table/query_stats/stats.h
index a07773ba45..e8a5992159 100644
--- a/ydb/public/sdk/cpp/client/ydb_table/query_stats/stats.h
+++ b/ydb/public/sdk/cpp/client/ydb_table/query_stats/stats.h
@@ -1,5 +1,7 @@
#pragma once
+#include <ydb/public/sdk/cpp/client/draft/ydb_query/stats.h>
+
#include <util/generic/maybe.h>
#include <util/generic/string.h>
@@ -37,28 +39,7 @@ enum class ECollectQueryStatsMode {
Profile = 3 // Detailed execution stats including stats for individual tasks and channels
};
-class TQueryStats {
- friend class TTableClient;
- friend class NYdb::TProtoAccessor;
- friend class NYdb::NScripting::TScriptingClient;
- friend class NYdb::NScripting::TYqlResultPartIterator;
- friend class TScanQueryPartIterator;
-
-public:
- TQueryStats(Ydb::TableStats::QueryStats&& proto);
- TString ToString(bool withPlan = false) const;
- TMaybe<TString> GetPlan() const;
- TDuration GetTotalDuration() const;
- TDuration GetTotalCpuTime() const;
-
-private:
- explicit TQueryStats(const Ydb::TableStats::QueryStats& proto);
- const Ydb::TableStats::QueryStats& GetProto() const;
-
-private:
- class TImpl;
- std::shared_ptr<TImpl> Impl_;
-};
+using TQueryStats = NQuery::TExecStats;
} // namespace NTable
} // namespace NYdb
diff --git a/ydb/public/sdk/cpp/client/ydb_table/table.cpp b/ydb/public/sdk/cpp/client/ydb_table/table.cpp
index d210c752b9..922261d5ca 100644
--- a/ydb/public/sdk/cpp/client/ydb_table/table.cpp
+++ b/ydb/public/sdk/cpp/client/ydb_table/table.cpp
@@ -1,6 +1,7 @@
#include "table.h"
#define INCLUDE_YDB_INTERNAL_H
+#include <ydb/public/sdk/cpp/client/impl/ydb_internal/scheme_helpers/helpers.h>
#include <ydb/public/sdk/cpp/client/impl/ydb_internal/table_helpers/helpers.h>
#include <ydb/public/sdk/cpp/client/impl/ydb_internal/make_request/make.h>
#undef INCLUDE_YDB_INTERNAL_H
diff --git a/ydb/public/sdk/cpp/client/ydb_topic/impl/topic.cpp b/ydb/public/sdk/cpp/client/ydb_topic/impl/topic.cpp
index 2541430996..35869b47aa 100644
--- a/ydb/public/sdk/cpp/client/ydb_topic/impl/topic.cpp
+++ b/ydb/public/sdk/cpp/client/ydb_topic/impl/topic.cpp
@@ -1,7 +1,7 @@
#include <ydb/public/sdk/cpp/client/ydb_topic/topic.h>
#include <ydb/public/sdk/cpp/client/ydb_topic/impl/topic_impl.h>
#include <ydb/public/sdk/cpp/client/ydb_topic/impl/executor.h>
-#include <ydb/public/sdk/cpp/client/impl/ydb_internal/table_helpers/helpers.h>
+#include <ydb/public/sdk/cpp/client/impl/ydb_internal/scheme_helpers/helpers.h>
#include <ydb/public/sdk/cpp/client/ydb_persqueue_core/impl/common.h>
#include <ydb/library/persqueue/obfuscate/obfuscate.h>
diff --git a/ydb/tests/functional/canonical/canondata/test_sql.TestCanonicalFolder1.test_case_write_multi_usage.script-script_/write_multi_usage.script.plan b/ydb/tests/functional/canonical/canondata/test_sql.TestCanonicalFolder1.test_case_write_multi_usage.script-script_/write_multi_usage.script.plan
index eb9c3f9bc2..8d8c3f1b7e 100644
--- a/ydb/tests/functional/canonical/canondata/test_sql.TestCanonicalFolder1.test_case_write_multi_usage.script-script_/write_multi_usage.script.plan
+++ b/ydb/tests/functional/canonical/canondata/test_sql.TestCanonicalFolder1.test_case_write_multi_usage.script-script_/write_multi_usage.script.plan
@@ -16,11 +16,11 @@
"Group",
"Name"
],
- "limit": "1001",
"scan_by": [
"Group (-\u221e, +\u221e)",
"Name (-\u221e, +\u221e)"
],
+ "limit": "1001",
"type": "FullScan"
}
]
@@ -33,10 +33,10 @@
"Name",
"Value"
],
- "limit": "1001",
"scan_by": [
"Name (-\u221e, +\u221e)"
],
+ "limit": "1001",
"type": "FullScan"
}
]