aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVPolka <vpolka@nebius.com>2024-09-24 18:27:43 +0300
committerGitHub <noreply@github.com>2024-09-24 18:27:43 +0300
commitf768ce3f435d7838e95e2e798052466df8028d98 (patch)
treedc29f30702ac6c99e1f7e2f7bce25d3927808cfe
parent92d046ce0445dd5b11d7a097aad246f7c8767264 (diff)
downloadydb-f768ce3f435d7838e95e2e798052466df8028d98.tar.gz
recompilation with query id from compile result (#9593)
-rw-r--r--ydb/core/kqp/common/compilation/result.cpp7
-rw-r--r--ydb/core/kqp/common/compilation/result.h13
-rw-r--r--ydb/core/kqp/compile_service/kqp_compile_actor.cpp12
-rw-r--r--ydb/core/kqp/compile_service/kqp_compile_service.cpp29
-rw-r--r--ydb/core/kqp/session_actor/kqp_query_state.cpp10
-rw-r--r--ydb/core/kqp/session_actor/kqp_session_actor.cpp4
6 files changed, 38 insertions, 37 deletions
diff --git a/ydb/core/kqp/common/compilation/result.cpp b/ydb/core/kqp/common/compilation/result.cpp
index 292cd0d03c..02672db818 100644
--- a/ydb/core/kqp/common/compilation/result.cpp
+++ b/ydb/core/kqp/common/compilation/result.cpp
@@ -2,4 +2,11 @@
namespace NKikimr::NKqp {
+std::shared_ptr<NYql::TAstParseResult> TKqpCompileResult::GetAst() const {
+ if (QueryAst) {
+ return QueryAst->Ast;
+ }
+ return nullptr;
+}
+
} // namespace NKikimr::NKqp
diff --git a/ydb/core/kqp/common/compilation/result.h b/ydb/core/kqp/common/compilation/result.h
index e5ab7cfc7d..1f74b7f8f0 100644
--- a/ydb/core/kqp/common/compilation/result.h
+++ b/ydb/core/kqp/common/compilation/result.h
@@ -1,5 +1,6 @@
#pragma once
#include <memory>
+#include <ydb/core/kqp/common/simple/query_ast.h>
#include <ydb/core/kqp/common/simple/query_id.h>
#include <ydb/core/kqp/common/simple/helpers.h>
#include <ydb/library/yql/public/issue/yql_issue.h>
@@ -14,24 +15,26 @@ struct TKqpCompileResult {
using TConstPtr = std::shared_ptr<const TKqpCompileResult>;
TKqpCompileResult(const TString& uid, const Ydb::StatusIds::StatusCode& status, const NYql::TIssues& issues,
- ETableReadType maxReadType, TMaybe<TKqpQueryId> query = {}, std::shared_ptr<NYql::TAstParseResult> ast = {},
+ ETableReadType maxReadType, TMaybe<TKqpQueryId> query = {}, TMaybe<TQueryAst> queryAst = {},
bool needToSplit = false, const TMaybe<TString>& commandTagName = {})
: Status(status)
, Issues(issues)
, Query(std::move(query))
, Uid(uid)
, MaxReadType(maxReadType)
- , Ast(std::move(ast))
+ , QueryAst(std::move(queryAst))
, NeedToSplit(needToSplit)
, CommandTagName(commandTagName) {}
static std::shared_ptr<TKqpCompileResult> Make(const TString& uid, const Ydb::StatusIds::StatusCode& status,
const NYql::TIssues& issues, ETableReadType maxReadType, TMaybe<TKqpQueryId> query = {},
- std::shared_ptr<NYql::TAstParseResult> ast = {}, bool needToSplit = false, const TMaybe<TString>& commandTagName = {})
+ TMaybe<TQueryAst> queryAst = {}, bool needToSplit = false, const TMaybe<TString>& commandTagName = {})
{
- return std::make_shared<TKqpCompileResult>(uid, status, issues, maxReadType, std::move(query), std::move(ast), needToSplit, commandTagName);
+ return std::make_shared<TKqpCompileResult>(uid, status, issues, maxReadType, std::move(query), std::move(queryAst), needToSplit, commandTagName);
}
+ std::shared_ptr<NYql::TAstParseResult> GetAst() const;
+
Ydb::StatusIds::StatusCode Status;
NYql::TIssues Issues;
@@ -40,7 +43,7 @@ struct TKqpCompileResult {
ETableReadType MaxReadType;
bool AllowCache = true;
- std::shared_ptr<NYql::TAstParseResult> Ast;
+ TMaybe<TQueryAst> QueryAst;
bool NeedToSplit = false;
TMaybe<TString> CommandTagName = {};
diff --git a/ydb/core/kqp/compile_service/kqp_compile_actor.cpp b/ydb/core/kqp/compile_service/kqp_compile_actor.cpp
index c2ac518677..c41e850595 100644
--- a/ydb/core/kqp/compile_service/kqp_compile_actor.cpp
+++ b/ydb/core/kqp/compile_service/kqp_compile_actor.cpp
@@ -379,9 +379,9 @@ private:
void ReplyError(Ydb::StatusIds::StatusCode status, const TIssues& issues) {
if (!KqpCompileResult) {
- KqpCompileResult = TKqpCompileResult::Make(Uid, status, issues, ETableReadType::Other, std::move(QueryId));
+ KqpCompileResult = TKqpCompileResult::Make(Uid, status, issues, ETableReadType::Other, std::move(QueryId), std::move(QueryAst));
} else {
- KqpCompileResult = TKqpCompileResult::Make(Uid, status, issues, ETableReadType::Other, std::move(KqpCompileResult->Query));
+ KqpCompileResult = TKqpCompileResult::Make(Uid, status, issues, ETableReadType::Other, std::move(KqpCompileResult->Query), std::move(KqpCompileResult->QueryAst));
}
Reply();
@@ -456,10 +456,6 @@ private:
preparedQueryHolder->MutableLlvmSettings().Fill(Config, queryType);
KqpCompileResult->PreparedQuery = preparedQueryHolder;
KqpCompileResult->AllowCache = CanCacheQuery(KqpCompileResult->PreparedQuery->GetPhysicalQuery()) && allowCache;
-
- if (QueryAst) {
- KqpCompileResult->Ast = QueryAst->Ast;
- }
}
void Handle(TEvKqp::TEvContinueProcess::TPtr &ev, const TActorContext &ctx) {
@@ -478,7 +474,7 @@ private:
if (kqpResult.NeedToSplit) {
KqpCompileResult = TKqpCompileResult::Make(
- Uid, status, kqpResult.Issues(), ETableReadType::Other, std::move(QueryId), {}, true);
+ Uid, status, kqpResult.Issues(), ETableReadType::Other, std::move(QueryId), std::move(QueryAst), true);
Reply();
return;
}
@@ -496,7 +492,7 @@ private:
auto queryType = QueryId.Settings.QueryType;
- KqpCompileResult = TKqpCompileResult::Make(Uid, status, kqpResult.Issues(), maxReadType, std::move(QueryId));
+ KqpCompileResult = TKqpCompileResult::Make(Uid, status, kqpResult.Issues(), maxReadType, std::move(QueryId), std::move(QueryAst));
KqpCompileResult->CommandTagName = kqpResult.CommandTagName;
if (status == Ydb::StatusIds::SUCCESS) {
diff --git a/ydb/core/kqp/compile_service/kqp_compile_service.cpp b/ydb/core/kqp/compile_service/kqp_compile_service.cpp
index d42f50c030..5c94153437 100644
--- a/ydb/core/kqp/compile_service/kqp_compile_service.cpp
+++ b/ydb/core/kqp/compile_service/kqp_compile_service.cpp
@@ -50,16 +50,16 @@ public:
void InsertAst(const TKqpCompileResult::TConstPtr& compileResult) {
Y_ENSURE(compileResult->Query);
- Y_ENSURE(compileResult->Ast);
+ Y_ENSURE(compileResult->GetAst());
- AstIndex.emplace(GetQueryIdWithAst(*compileResult->Query, *compileResult->Ast), compileResult->Uid);
+ AstIndex.emplace(GetQueryIdWithAst(*compileResult->Query, *compileResult->GetAst()), compileResult->Uid);
}
bool Insert(const TKqpCompileResult::TConstPtr& compileResult, bool isEnableAstCache, bool isPerStatementExecution) {
if (!isPerStatementExecution) {
InsertQuery(compileResult);
}
- if (isEnableAstCache && compileResult->Ast) {
+ if (isEnableAstCache && compileResult->GetAst()) {
InsertAst(compileResult);
}
@@ -76,8 +76,8 @@ public:
auto queryId = *removedItem->Value.CompileResult->Query;
QueryIndex.erase(queryId);
- if (removedItem->Value.CompileResult->Ast) {
- AstIndex.erase(GetQueryIdWithAst(queryId, *removedItem->Value.CompileResult->Ast));
+ if (removedItem->Value.CompileResult->GetAst()) {
+ AstIndex.erase(GetQueryIdWithAst(queryId, *removedItem->Value.CompileResult->GetAst()));
}
auto indexIt = Index.find(*removedItem);
if (indexIt != Index.end()) {
@@ -190,8 +190,8 @@ public:
Y_ABORT_UNLESS(item->Value.CompileResult->Query);
auto queryId = *item->Value.CompileResult->Query;
QueryIndex.erase(queryId);
- if (item->Value.CompileResult->Ast) {
- AstIndex.erase(GetQueryIdWithAst(queryId, *item->Value.CompileResult->Ast));
+ if (item->Value.CompileResult->GetAst()) {
+ AstIndex.erase(GetQueryIdWithAst(queryId, *item->Value.CompileResult->GetAst()));
}
Index.erase(it);
@@ -327,6 +327,8 @@ struct TKqpCompileRequest {
NYql::TExprContext* SplitCtx;
NYql::TExprNode::TPtr SplitExpr;
+ bool FindInCache = true;
+
bool IsIntrestedInResult() const {
return IntrestedInResult->load();
}
@@ -769,8 +771,6 @@ private:
}
if (compileResult || request.Query) {
- QueryCache.EraseByUid(request.Uid);
-
Counters->ReportCompileRequestCompile(dbCounters);
NWilson::TSpan compileServiceSpan(TWilsonKqp::CompileService, ev->Get() ? std::move(ev->TraceId) : NWilson::TTraceId(), "CompileService");
@@ -795,12 +795,13 @@ private:
);
}
}
- TKqpCompileRequest compileRequest(ev->Sender, request.Uid, query,
+ TKqpCompileRequest compileRequest(ev->Sender, request.Uid, compileResult ? *compileResult->Query : *request.Query,
compileSettings, request.UserToken, dbCounters, request.GUCSettings, request.ApplicationName,
ev->Cookie, std::move(ev->Get()->IntrestedInResult),
ev->Get()->UserRequestContext,
ev->Get() ? std::move(ev->Get()->Orbit) : NLWTrace::TOrbit(),
std::move(compileServiceSpan), std::move(ev->Get()->TempTablesState));
+ compileRequest.FindInCache = false;
if (TableServiceConfig.GetEnableAstCache() && request.QueryAst) {
return CompileByAst(*request.QueryAst, compileRequest, ctx);
@@ -981,7 +982,7 @@ private:
<< ", ast: " << queryAst.Ast->Root->ToString());
auto compileResult = QueryCache.FindByAst(compileRequest.Query, *queryAst.Ast, compileRequest.CompileSettings.KeepInCache);
- if (HasTempTablesNameClashes(compileResult, compileRequest.TempTablesState)) {
+ if (!compileRequest.FindInCache || HasTempTablesNameClashes(compileResult, compileRequest.TempTablesState)) {
compileResult = nullptr;
}
@@ -992,7 +993,7 @@ private:
<< ", sender: " << compileRequest.Sender
<< ", queryUid: " << compileResult->Uid);
- compileResult->Ast->PgAutoParamValues = std::move(queryAst.Ast->PgAutoParamValues);
+ compileResult->GetAst()->PgAutoParamValues = std::move(queryAst.Ast->PgAutoParamValues);
ReplyFromCache(compileRequest.Sender, compileResult, ctx, compileRequest.Cookie, std::move(compileRequest.Orbit), std::move(compileRequest.CompileServiceSpan));
return;
@@ -1066,10 +1067,10 @@ private:
if (QueryCache.FindByQuery(query, keepInCache)) {
return false;
}
- if (compileResult->Ast && QueryCache.FindByAst(query, *compileResult->Ast, keepInCache)) {
+ if (compileResult->GetAst() && QueryCache.FindByAst(query, *compileResult->GetAst(), keepInCache)) {
return false;
}
- auto newCompileResult = TKqpCompileResult::Make(CreateGuidAsString(), compileResult->Status, compileResult->Issues, compileResult->MaxReadType, std::move(query), compileResult->Ast);
+ auto newCompileResult = TKqpCompileResult::Make(CreateGuidAsString(), compileResult->Status, compileResult->Issues, compileResult->MaxReadType, std::move(query), compileResult->QueryAst);
newCompileResult->AllowCache = compileResult->AllowCache;
newCompileResult->PreparedQuery = compileResult->PreparedQuery;
LOG_DEBUG_S(ctx, NKikimrServices::KQP_COMPILE_SERVICE, "Insert preparing query with params, queryId: " << query.SerializeToString());
diff --git a/ydb/core/kqp/session_actor/kqp_query_state.cpp b/ydb/core/kqp/session_actor/kqp_query_state.cpp
index 7aa59a3909..f45f214b04 100644
--- a/ydb/core/kqp/session_actor/kqp_query_state.cpp
+++ b/ydb/core/kqp/session_actor/kqp_query_state.cpp
@@ -161,7 +161,7 @@ bool TKqpQueryState::SaveAndCheckCompileResult(TEvKqp::TEvCompileResponse* ev) {
CommandTagName = CompileResult->CommandTagName;
}
for (const auto& param : PreparedQuery->GetParameters()) {
- const auto& ast = CompileResult->Ast;
+ const auto& ast = CompileResult->GetAst();
if (!ast || !ast->PgAutoParamValues || !ast->PgAutoParamValues->contains(param.GetName())) {
ResultParams.push_back(param);
}
@@ -276,15 +276,9 @@ std::unique_ptr<TEvKqp::TEvRecompileRequest> TKqpQueryState::BuildReCompileReque
compileDeadline = Min(compileDeadline, QueryDeadlines.CancelAt);
}
- TMaybe<TQueryAst> statementAst;
- if (!Statements.empty()) {
- YQL_ENSURE(CurrentStatementId < Statements.size());
- statementAst = Statements[CurrentStatementId];
- }
-
return std::make_unique<TEvKqp::TEvRecompileRequest>(UserToken, CompileResult->Uid, query, isQueryActionPrepare,
compileDeadline, DbCounters, gUCSettingsPtr, ApplicationName, std::move(cookie), UserRequestContext, std::move(Orbit), TempTablesState,
- statementAst);
+ CompileResult->QueryAst);
}
std::unique_ptr<TEvKqp::TEvCompileRequest> TKqpQueryState::BuildSplitRequest(std::shared_ptr<std::atomic<bool>> cookie, const TGUCSettings::TPtr& gUCSettingsPtr) {
diff --git a/ydb/core/kqp/session_actor/kqp_session_actor.cpp b/ydb/core/kqp/session_actor/kqp_session_actor.cpp
index 7c39e1cfab..c97381ba82 100644
--- a/ydb/core/kqp/session_actor/kqp_session_actor.cpp
+++ b/ydb/core/kqp/session_actor/kqp_session_actor.cpp
@@ -905,8 +905,8 @@ public:
try {
const auto& parameters = QueryState->GetYdbParameters();
QueryState->QueryData->ParseParameters(parameters);
- if (QueryState->CompileResult && QueryState->CompileResult->Ast && QueryState->CompileResult->Ast->PgAutoParamValues) {
- for(const auto& [name, param] : *QueryState->CompileResult->Ast->PgAutoParamValues) {
+ if (QueryState->CompileResult && QueryState->CompileResult->GetAst() && QueryState->CompileResult->GetAst()->PgAutoParamValues) {
+ for(const auto& [name, param] : *QueryState->CompileResult->GetAst()->PgAutoParamValues) {
if (!parameters.contains(name)) {
QueryState->QueryData->AddTypedValueParam(name, param);
}