diff --git a/ydb/core/kqp/session_actor/kqp_query_state.h b/ydb/core/kqp/session_actor/kqp_query_state.h index 425a7e0b8035..b5b6c10056fd 100644 --- a/ydb/core/kqp/session_actor/kqp_query_state.h +++ b/ydb/core/kqp/session_actor/kqp_query_state.h @@ -129,6 +129,7 @@ class TKqpQueryState : public TNonCopyable { TInstant ContinueTime; NYql::TKikimrQueryDeadlines QueryDeadlines; TKqpQueryStats QueryStats; + TString QueryAst; bool KeepSession = false; TIntrusiveConstPtr UserToken; TString ClientAddress; diff --git a/ydb/core/kqp/session_actor/kqp_session_actor.cpp b/ydb/core/kqp/session_actor/kqp_session_actor.cpp index 93117896a9c7..1e161150e7ef 100644 --- a/ydb/core/kqp/session_actor/kqp_session_actor.cpp +++ b/ydb/core/kqp/session_actor/kqp_session_actor.cpp @@ -2033,12 +2033,14 @@ class TKqpSessionActor : public TActorBootstrapped { auto stats = QueryState->QueryStats.ToProto(); if (QueryState->GetStatsMode() >= Ydb::Table::QueryStatsCollection::STATS_COLLECTION_FULL) { response->SetQueryPlan(SerializeAnalyzePlan(stats, QueryState->UserRequestContext->PoolId)); - if (QueryState->CompileResult) { - auto preparedQuery = QueryState->CompileResult->PreparedQuery; - if (preparedQuery) { - response->SetQueryAst(preparedQuery->GetPhysicalQuery().GetQueryAst()); + if (const auto compileResult = QueryState->CompileResult) { + if (const auto preparedQuery = compileResult->PreparedQuery) { + if (const auto& queryAst = preparedQuery->GetPhysicalQuery().GetQueryAst()) { + QueryState->QueryAst = queryAst; + } } } + response->SetQueryAst(QueryState->QueryAst); } response->MutableQueryStats()->Swap(&stats); } diff --git a/ydb/core/kqp/ut/federated_query/s3/kqp_federated_query_ut.cpp b/ydb/core/kqp/ut/federated_query/s3/kqp_federated_query_ut.cpp index c82487f47410..388bcf004b9c 100644 --- a/ydb/core/kqp/ut/federated_query/s3/kqp_federated_query_ut.cpp +++ b/ydb/core/kqp/ut/federated_query/s3/kqp_federated_query_ut.cpp @@ -2019,17 +2019,27 @@ Y_UNIT_TEST_SUITE(KqpFederatedQuery) { } void RunGenericQuery(const TString& query, TQueryClient& client, const TDriver&) { - auto result = client.ExecuteQuery(query, NYdb::NQuery::TTxControl::NoTx()).ExtractValueSync(); + auto result = client.ExecuteQuery( + query, + NYdb::NQuery::TTxControl::NoTx(), + NYdb::NQuery::TExecuteQuerySettings().StatsMode(NYdb::NQuery::EStatsMode::Profile) + ).ExtractValueSync(); UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString()); + UNIT_ASSERT(result.GetStats()); + UNIT_ASSERT(result.GetStats()->GetAst()); } void RunGenericScript(const TString& script, TQueryClient& client, const TDriver& driver) { - auto scriptExecutionOperation = client.ExecuteScript(script).ExtractValueSync(); + auto scriptExecutionOperation = client.ExecuteScript( + script, + NYdb::NQuery::TExecuteScriptSettings().StatsMode(NYdb::NQuery::EStatsMode::Profile) + ).ExtractValueSync(); UNIT_ASSERT_VALUES_EQUAL_C(scriptExecutionOperation.Status().GetStatus(), EStatus::SUCCESS, scriptExecutionOperation.Status().GetIssues().ToString()); UNIT_ASSERT(!scriptExecutionOperation.Metadata().ExecutionId.empty()); NYdb::NQuery::TScriptExecutionOperation readyOp = WaitScriptExecutionOperation(scriptExecutionOperation.Id(), driver); UNIT_ASSERT_VALUES_EQUAL_C(readyOp.Metadata().ExecStatus, EExecStatus::Completed, readyOp.Status().GetIssues().ToOneLineString()); + UNIT_ASSERT(readyOp.Metadata().ExecStats.GetAst()); } Y_UNIT_TEST(CreateTableAsSelectFromExternalDataSourceGenericQuery) {