diff --git a/ydb/tests/tools/kqprun/.gitignore b/ydb/tests/tools/kqprun/.gitignore index 9aec6451388c..0733e58da5be 100644 --- a/ydb/tests/tools/kqprun/.gitignore +++ b/ydb/tests/tools/kqprun/.gitignore @@ -1,3 +1,6 @@ sync_dir +example +udfs *.log *.sql +*.bin diff --git a/ydb/tests/tools/kqprun/kqprun.cpp b/ydb/tests/tools/kqprun/kqprun.cpp index 5b250f2734da..d2b620d1dae6 100644 --- a/ydb/tests/tools/kqprun/kqprun.cpp +++ b/ydb/tests/tools/kqprun/kqprun.cpp @@ -1,5 +1,7 @@ #include "src/kqp_runner.h" +#include + #include #include @@ -22,7 +24,7 @@ struct TExecutionOptions { TString ScriptTraceId = "kqprun"; bool HasResults() const { - return ScriptQuery && ScriptQueryAction == NKikimrKqp::QUERY_ACTION_EXECUTE && !ClearExecution; + return ScriptQuery && ScriptQueryAction == NKikimrKqp::QUERY_ACTION_EXECUTE; } }; @@ -46,6 +48,9 @@ void RunScript(const TExecutionOptions& executionOptions, const NKqpRun::TRunner if (!runner.ExecuteScript(executionOptions.ScriptQuery, executionOptions.ScriptQueryAction, executionOptions.ScriptTraceId)) { ythrow yexception() << "Script execution failed"; } + if (!runner.FetchScriptResults()) { + ythrow yexception() << "Fetch script results failed"; + } } else { if (!runner.ExecuteQuery(executionOptions.ScriptQuery, executionOptions.ScriptQueryAction, executionOptions.ScriptTraceId)) { ythrow yexception() << "Query execution failed"; @@ -54,10 +59,7 @@ void RunScript(const TExecutionOptions& executionOptions, const NKqpRun::TRunner } if (executionOptions.HasResults()) { - Cout << colors.Yellow() << "Writing script results..." << colors.Default() << Endl; - if (!runner.WriteScriptResults()) { - ythrow yexception() << "Writing script results failed"; - } + runner.PrintScriptResults(); } } @@ -74,6 +76,20 @@ THolder SetupDefaultFileOutput(const TString& filePath, IOutputStre } +TIntrusivePtr CreateFunctionRegistry(const TString& udfsDirectory, TVector udfsPaths) { + if (!udfsDirectory.empty() || !udfsPaths.empty()) { + NColorizer::TColors colors = NColorizer::AutoColors(Cout); + Cout << colors.Yellow() << "Fetching udfs..." << colors.Default() << Endl; + } + + NKikimr::NMiniKQL::FindUdfsInDir(udfsDirectory, &udfsPaths); + auto functionRegistry = NKikimr::NMiniKQL::CreateFunctionRegistry(&NYql::NBacktrace::KikimrBackTrace, NKikimr::NMiniKQL::CreateBuiltinRegistry(), false, udfsPaths)->Clone(); + NKikimr::NMiniKQL::FillStaticModules(*functionRegistry); + + return functionRegistry; +} + + void RunMain(int argc, const char* argv[]) { TExecutionOptions executionOptions; NKqpRun::TRunnerOptions runnerOptions; @@ -87,9 +103,11 @@ void RunMain(int argc, const char* argv[]) { TString logFile = "-"; TString appConfigFile = "./configuration/app_config.conf"; + TString traceOptType = "disabled"; TString scriptQueryAction = "execute"; TString planOutputFormat = "pretty"; TString resultOutputFormat = "rows"; + i64 resultsRowsLimit = 1000; TVector udfsPaths; TString udfsDirectory; @@ -103,7 +121,7 @@ void RunMain(int argc, const char* argv[]) { .Optional() .RequiredArgument("FILE") .StoreResult(&schemeQueryFile); - options.AddLongOption("app-config", "File with app config (TAppConfig)") + options.AddLongOption('c', "app-config", "File with app config (TAppConfig)") .Optional() .RequiredArgument("FILE") .DefaultValue(appConfigFile) @@ -135,33 +153,33 @@ void RunMain(int argc, const char* argv[]) { .NoArgument() .DefaultValue(executionOptions.ClearExecution) .SetFlag(&executionOptions.ClearExecution); - options.AddLongOption("trace-opt", "print AST in the begin of each transformation") + options.AddLongOption('T', "trace-opt", "print AST in the begin of each transformation, one of { scheme | script | all }") .Optional() - .NoArgument() - .DefaultValue(runnerOptions.YdbSettings.TraceOpt) - .SetFlag(&runnerOptions.YdbSettings.TraceOpt); - options.AddLongOption("script-action", "Script query execute action, one of { execute | explain }") + .RequiredArgument("STR") + .DefaultValue(traceOptType) + .StoreResult(&traceOptType); + options.AddLongOption('A', "script-action", "Script query execute action, one of { execute | explain }") .Optional() .RequiredArgument("STR") .DefaultValue(scriptQueryAction) .StoreResult(&scriptQueryAction); - options.AddLongOption("plan-format", "Script query plan format, one of { pretty | table | json }") + options.AddLongOption('P', "plan-format", "Script query plan format, one of { pretty | table | json }") .Optional() .RequiredArgument("STR") .DefaultValue(planOutputFormat) .StoreResult(&planOutputFormat); - options.AddLongOption("result-format", "Script query result format, one of { rows | full }") + options.AddLongOption('R', "result-format", "Script query result format, one of { rows | full }") .Optional() .RequiredArgument("STR") .DefaultValue(resultOutputFormat) .StoreResult(&resultOutputFormat); - options.AddLongOption("result-rows-limit", "Rows limit for script execution results") + options.AddLongOption('L', "result-rows-limit", "Rows limit for script execution results") .Optional() .RequiredArgument("INT") - .DefaultValue(runnerOptions.ResultsRowsLimit) - .StoreResult(&runnerOptions.ResultsRowsLimit); + .DefaultValue(resultsRowsLimit) + .StoreResult(&resultsRowsLimit); - options.AddLongOption("udf", "Load shared library with UDF by given path") + options.AddLongOption('u', "udf", "Load shared library with UDF by given path") .Optional() .RequiredArgument("FILE") .AppendTo(&udfsPaths); @@ -191,15 +209,19 @@ void RunMain(int argc, const char* argv[]) { // Runner options - if (runnerOptions.ResultsRowsLimit < 0) { - ythrow yexception() << "Results rows limit less than zero"; - } - THolder resultFileHolder = SetupDefaultFileOutput(resultOutputFile, runnerOptions.ResultOutput); THolder schemeQueryAstFileHolder = SetupDefaultFileOutput(schemeQueryAstFile, runnerOptions.SchemeQueryAstOutput); THolder scriptQueryAstFileHolder = SetupDefaultFileOutput(scriptQueryAstFile, runnerOptions.ScriptQueryAstOutput); THolder scriptQueryPlanFileHolder = SetupDefaultFileOutput(scriptQueryPlanFile, runnerOptions.ScriptQueryPlanOutput); + runnerOptions.TraceOptType = + (traceOptType == TStringBuf("all")) ? NKqpRun::TRunnerOptions::ETraceOptType::All + : (traceOptType == TStringBuf("scheme")) ? NKqpRun::TRunnerOptions::ETraceOptType::Scheme + : (traceOptType == TStringBuf("script")) ? NKqpRun::TRunnerOptions::ETraceOptType::Script + : (traceOptType == TStringBuf("disabled")) ? NKqpRun::TRunnerOptions::ETraceOptType::Disabled + : NKqpRun::TRunnerOptions::ETraceOptType::All; + runnerOptions.YdbSettings.TraceOptEnabled = runnerOptions.TraceOptType != NKqpRun::TRunnerOptions::ETraceOptType::Disabled; + runnerOptions.ResultOutputFormat = (resultOutputFormat == TStringBuf("rows")) ? NKqpRun::TRunnerOptions::EResultOutputFormat::RowsJson : (resultOutputFormat == TStringBuf("full")) ? NKqpRun::TRunnerOptions::EResultOutputFormat::FullJson @@ -215,20 +237,22 @@ void RunMain(int argc, const char* argv[]) { if (logFile != "-") { runnerOptions.YdbSettings.LogOutputFile = logFile; + std::remove(logFile.c_str()); } runnerOptions.YdbSettings.YqlToken = GetEnv("YQL_TOKEN"); - - NKikimr::NMiniKQL::FindUdfsInDir(udfsDirectory, &udfsPaths); - auto functionRegistry = NKikimr::NMiniKQL::CreateFunctionRegistry(&NYql::NBacktrace::KikimrBackTrace, NKikimr::NMiniKQL::CreateBuiltinRegistry(), false, udfsPaths)->Clone(); - NKikimr::NMiniKQL::FillStaticModules(*functionRegistry); - runnerOptions.YdbSettings.FunctionRegistry = functionRegistry.Get(); + runnerOptions.YdbSettings.FunctionRegistry = CreateFunctionRegistry(udfsDirectory, udfsPaths).Get(); TString appConfigData = TFileInput(appConfigFile).ReadAll(); if (!google::protobuf::TextFormat::ParseFromString(appConfigData, &runnerOptions.YdbSettings.AppConfig)) { ythrow yexception() << "Bad format of app configuration"; } + if (resultsRowsLimit < 0) { + ythrow yexception() << "Results rows limit less than zero"; + } + runnerOptions.YdbSettings.AppConfig.MutableQueryServiceConfig()->SetScriptResultRowsLimit(resultsRowsLimit); + RunScript(executionOptions, runnerOptions); } diff --git a/ydb/tests/tools/kqprun/src/actors.cpp b/ydb/tests/tools/kqprun/src/actors.cpp index c8c31e99151f..48f73e4cabfc 100644 --- a/ydb/tests/tools/kqprun/src/actors.cpp +++ b/ydb/tests/tools/kqprun/src/actors.cpp @@ -9,12 +9,19 @@ namespace { class TRunScriptActorMock : public NActors::TActorBootstrapped { public: - TRunScriptActorMock(THolder request, NThreading::TPromise promise, ui64 resultSizeLimit) + TRunScriptActorMock(THolder request, + NThreading::TPromise promise, + ui64 resultRowsLimit, ui64 resultSizeLimit, std::vector& resultSets) : Request_(std::move(request)) , Promise_(promise) + , ResultRowsLimit_(std::numeric_limits::max()) , ResultSizeLimit_(std::numeric_limits::max()) + , ResultSets_(resultSets) { - if (resultSizeLimit && resultSizeLimit < std::numeric_limits::max()) { + if (resultRowsLimit) { + ResultRowsLimit_ = resultRowsLimit; + } + if (resultSizeLimit) { ResultSizeLimit_ = resultSizeLimit; } } @@ -36,6 +43,28 @@ class TRunScriptActorMock : public NActors::TActorBootstrappedRecord.SetSeqNo(ev->Get()->Record.GetSeqNo()); response->Record.SetFreeSpace(ResultSizeLimit_); + auto resultSetIndex = ev->Get()->Record.GetQueryResultIndex(); + if (resultSetIndex >= ResultSets_.size()) { + ResultSets_.resize(resultSetIndex + 1); + } + + if (!ResultSets_[resultSetIndex].truncated()) { + for (auto& row : *ev->Get()->Record.MutableResultSet()->mutable_rows()) { + if (static_cast(ResultSets_[resultSetIndex].rows_size()) >= ResultRowsLimit_) { + ResultSets_[resultSetIndex].set_truncated(true); + break; + } + + if (ResultSets_[resultSetIndex].ByteSizeLong() + row.ByteSizeLong() > ResultSizeLimit_) { + ResultSets_[resultSetIndex].set_truncated(true); + break; + } + + *ResultSets_[resultSetIndex].add_rows() = std::move(row); + } + *ResultSets_[resultSetIndex].mutable_columns() = ev->Get()->Record.GetResultSet().columns(); + } + Send(ev->Sender, response.Release()); } @@ -47,13 +76,17 @@ class TRunScriptActorMock : public NActors::TActorBootstrapped Request_; NThreading::TPromise Promise_; - i64 ResultSizeLimit_; + ui64 ResultRowsLimit_; + ui64 ResultSizeLimit_; + std::vector& ResultSets_; }; } // anonymous namespace -NActors::IActor* CreateRunScriptActorMock(THolder request, NThreading::TPromise promise, ui64 resultSizeLimit) { - return new TRunScriptActorMock(std::move(request), promise, resultSizeLimit); +NActors::IActor* CreateRunScriptActorMock(THolder request, + NThreading::TPromise promise, + ui64 resultRowsLimit, ui64 resultSizeLimit, std::vector& resultSets) { + return new TRunScriptActorMock(std::move(request), promise, resultRowsLimit, resultSizeLimit, resultSets); } } // namespace NKqpRun diff --git a/ydb/tests/tools/kqprun/src/actors.h b/ydb/tests/tools/kqprun/src/actors.h index f6cbf8b43bef..9e7a251d14ff 100644 --- a/ydb/tests/tools/kqprun/src/actors.h +++ b/ydb/tests/tools/kqprun/src/actors.h @@ -4,6 +4,8 @@ namespace NKqpRun { -NActors::IActor* CreateRunScriptActorMock(THolder request, NThreading::TPromise promise, ui64 resultSizeLimit); +NActors::IActor* CreateRunScriptActorMock(THolder request, + NThreading::TPromise promise, + ui64 resultRowsLimit, ui64 resultSizeLimit, std::vector& resultSets); } // namespace NKqpRun diff --git a/ydb/tests/tools/kqprun/src/common.h b/ydb/tests/tools/kqprun/src/common.h index ef4b490f8bd1..1d57272b2dd9 100644 --- a/ydb/tests/tools/kqprun/src/common.h +++ b/ydb/tests/tools/kqprun/src/common.h @@ -12,23 +12,28 @@ namespace NKqpRun { struct TYdbSetupSettings { TString DomainName = "Root"; - bool TraceOpt = false; + bool TraceOptEnabled = false; TMaybe LogOutputFile; TString YqlToken; - NKikimr::NMiniKQL::IFunctionRegistry* FunctionRegistry = nullptr; + TIntrusivePtr FunctionRegistry = nullptr; NKikimrConfig::TAppConfig AppConfig; }; struct TRunnerOptions { + enum class ETraceOptType { + Disabled, + Scheme, + Script, + All, + }; + enum class EResultOutputFormat { RowsJson, // Rows in json format FullJson, // Columns, rows and types in json format }; - i64 ResultsRowsLimit = 1000; - IOutputStream* ResultOutput = &Cout; IOutputStream* SchemeQueryAstOutput = nullptr; IOutputStream* ScriptQueryAstOutput = nullptr; @@ -36,6 +41,7 @@ struct TRunnerOptions { EResultOutputFormat ResultOutputFormat = EResultOutputFormat::RowsJson; NYdb::NConsoleClient::EOutputFormat PlanOutputFormat = NYdb::NConsoleClient::EOutputFormat::Default; + ETraceOptType TraceOptType = ETraceOptType::Disabled; TYdbSetupSettings YdbSettings; }; diff --git a/ydb/tests/tools/kqprun/src/kqp_runner.cpp b/ydb/tests/tools/kqprun/src/kqp_runner.cpp index d72d461c9c58..b4eacc1895fe 100644 --- a/ydb/tests/tools/kqprun/src/kqp_runner.cpp +++ b/ydb/tests/tools/kqprun/src/kqp_runner.cpp @@ -21,8 +21,11 @@ class TKqpRunner::TImpl { {} bool ExecuteSchemeQuery(const TString& query) const { + StartSchemeTraceOpt(); + TSchemeMeta meta; TRequestResult status = YdbSetup_.SchemeQueryRequest(query, meta); + TYdbSetup::StopTraceOpt(); PrintSchemeQueryAst(meta.Ast); @@ -35,6 +38,8 @@ class TKqpRunner::TImpl { } bool ExecuteScript(const TString& script, NKikimrKqp::EQueryAction action, const TString& traceId) { + StartScriptTraceOpt(); + TRequestResult status = YdbSetup_.ScriptRequest(script, action, traceId, ExecutionOperation_); if (!status.IsSuccess()) { @@ -45,9 +50,12 @@ class TKqpRunner::TImpl { return WaitScriptExecutionOperation(); } - bool ExecuteQuery(const TString& query, NKikimrKqp::EQueryAction action, const TString& traceId) const { + bool ExecuteQuery(const TString& query, NKikimrKqp::EQueryAction action, const TString& traceId) { + StartScriptTraceOpt(); + TQueryMeta meta; - TRequestResult status = YdbSetup_.QueryRequest(query, action, traceId, meta); + TRequestResult status = YdbSetup_.QueryRequest(query, action, traceId, meta, ResultSets_); + TYdbSetup::StopTraceOpt(); PrintScriptAst(meta.Ast); @@ -61,22 +69,32 @@ class TKqpRunner::TImpl { return true; } - bool WriteScriptResults() const { + bool FetchScriptResults() { + TYdbSetup::StopTraceOpt(); + + ResultSets_.resize(ExecutionMeta_.ResultSetsCount); for (i32 resultSetId = 0; resultSetId < ExecutionMeta_.ResultSetsCount; ++resultSetId) { - Ydb::ResultSet resultSet; - TRequestResult status = YdbSetup_.FetchScriptExecutionResultsRequest(ExecutionOperation_, resultSetId, Options_.ResultsRowsLimit, resultSet); + TRequestResult status = YdbSetup_.FetchScriptExecutionResultsRequest(ExecutionOperation_, resultSetId, ResultSets_[resultSetId]); if (!status.IsSuccess()) { Cerr << CerrColors_.Red() << "Failed to fetch result set with id " << resultSetId << ", reason:" << CerrColors_.Default() << Endl << status.ToString() << Endl; return false; } - - PrintScriptResult(resultSet); } return true; } + void PrintScriptResults() const { + Cout << CoutColors_.Cyan() << "Writing script query results" << CoutColors_.Default() << Endl; + for (size_t i = 0; i < ResultSets_.size(); ++i) { + if (ResultSets_.size() > 1) { + *Options_.ResultOutput << CoutColors_.Cyan() << "Result set " << i + 1 << ":" << CoutColors_.Default() << Endl; + } + PrintScriptResult(ResultSets_[i]); + } + } + private: bool WaitScriptExecutionOperation() { TRequestResult status; @@ -107,6 +125,18 @@ class TKqpRunner::TImpl { return true; } + void StartSchemeTraceOpt() const { + if (Options_.TraceOptType == TRunnerOptions::ETraceOptType::All || Options_.TraceOptType == TRunnerOptions::ETraceOptType::Scheme) { + YdbSetup_.StartTraceOpt(); + } + } + + void StartScriptTraceOpt() const { + if (Options_.TraceOptType == TRunnerOptions::ETraceOptType::All || Options_.TraceOptType == TRunnerOptions::ETraceOptType::Script) { + YdbSetup_.StartTraceOpt(); + } + } + void PrintSchemeQueryAst(const TString& ast) const { if (Options_.SchemeQueryAstOutput) { Cout << CoutColors_.Cyan() << "Writing scheme query ast" << CoutColors_.Default() << Endl; @@ -122,7 +152,7 @@ class TKqpRunner::TImpl { } void PrintScriptPlan(const TString& plan) const { - if (Options_.ScriptQueryAstOutput) { + if (Options_.ScriptQueryPlanOutput) { Cout << CoutColors_.Cyan() << "Writing script query plan" << CoutColors_.Default() << Endl; NYdb::NConsoleClient::TQueryPlanPrinter printer(Options_.PlanOutputFormat, true, *Options_.ScriptQueryPlanOutput); @@ -132,9 +162,17 @@ class TKqpRunner::TImpl { void PrintScriptResult(const Ydb::ResultSet& resultSet) const { switch (Options_.ResultOutputFormat) { - case TRunnerOptions::EResultOutputFormat::RowsJson: - Options_.ResultOutput->Write(NYdb::FormatResultSetJson(resultSet, NYdb::EBinaryStringEncoding::Unicode)); + case TRunnerOptions::EResultOutputFormat::RowsJson: { + NYdb::TResultSet result(resultSet); + NYdb::TResultSetParser parser(result); + while (parser.TryNextRow()) { + NJsonWriter::TBuf writer(NJsonWriter::HEM_UNSAFE, Options_.ResultOutput); + writer.SetWriteNanAsString(true); + NYdb::FormatResultRowJson(parser, result.GetColumnsMeta(), writer, NYdb::EBinaryStringEncoding::Unicode); + *Options_.ResultOutput << Endl; + } break; + } case TRunnerOptions::EResultOutputFormat::FullJson: resultSet.PrintJSON(*Options_.ResultOutput); @@ -151,6 +189,7 @@ class TKqpRunner::TImpl { TString ExecutionOperation_; TExecutionMeta ExecutionMeta_; + std::vector ResultSets_; }; @@ -172,8 +211,12 @@ bool TKqpRunner::ExecuteQuery(const TString& query, NKikimrKqp::EQueryAction act return Impl_->ExecuteQuery(query, action, traceId); } -bool TKqpRunner::WriteScriptResults() const { - return Impl_->WriteScriptResults(); +bool TKqpRunner::FetchScriptResults() { + return Impl_->FetchScriptResults(); +} + +void TKqpRunner::PrintScriptResults() const { + Impl_->PrintScriptResults(); } } // namespace NKqpRun diff --git a/ydb/tests/tools/kqprun/src/kqp_runner.h b/ydb/tests/tools/kqprun/src/kqp_runner.h index f2eef77bb076..de01588dce74 100644 --- a/ydb/tests/tools/kqprun/src/kqp_runner.h +++ b/ydb/tests/tools/kqprun/src/kqp_runner.h @@ -15,7 +15,9 @@ class TKqpRunner { bool ExecuteQuery(const TString& query, NKikimrKqp::EQueryAction action, const TString& traceId) const; - bool WriteScriptResults() const; + bool FetchScriptResults(); + + void PrintScriptResults() const; private: class TImpl; diff --git a/ydb/tests/tools/kqprun/src/ydb_setup.cpp b/ydb/tests/tools/kqprun/src/ydb_setup.cpp index 7340de37bbe2..031522a744f0 100644 --- a/ydb/tests/tools/kqprun/src/ydb_setup.cpp +++ b/ydb/tests/tools/kqprun/src/ydb_setup.cpp @@ -104,7 +104,7 @@ class TYdbSetup::TImpl { } auto functionRegistryFactory = [this](const NKikimr::NScheme::TTypeRegistry&) { - return Settings_.FunctionRegistry; + return Settings_.FunctionRegistry.Get(); }; serverSettings.SetFrFactory(functionRegistryFactory); @@ -140,7 +140,7 @@ class TYdbSetup::TImpl { } void InitializeYqlLogger() { - if (!Settings_.TraceOpt) { + if (!Settings_.TraceOptEnabled) { return; } @@ -159,7 +159,7 @@ class TYdbSetup::TImpl { entry->SetLevel(NActors::NLog::PRI_TRACE); } - NYql::NLog::InitLogger(CreateLogBackend()); + NYql::NLog::InitLogger(NActors::CreateNullBackend()); } public: @@ -184,12 +184,14 @@ class TYdbSetup::TImpl { return RunKqpProxyRequest(std::move(event)); } - NKikimr::NKqp::TEvKqp::TEvQueryResponse::TPtr QueryRequest(const TString& query, NKikimrKqp::EQueryAction action, const TString& traceId) const { + NKikimr::NKqp::TEvKqp::TEvQueryResponse::TPtr QueryRequest(const TString& query, NKikimrKqp::EQueryAction action, const TString& traceId, std::vector& resultSets) const { auto event = MakeHolder(); FillScriptRequest(query, action, traceId, event->Record); auto promise = NThreading::NewPromise(); - GetRuntime()->Register(CreateRunScriptActorMock(std::move(event), promise, Settings_.AppConfig.GetQueryServiceConfig().GetScriptResultSizeLimit())); + auto rowsLimit = Settings_.AppConfig.GetQueryServiceConfig().GetScriptResultRowsLimit(); + auto sizeLimit = Settings_.AppConfig.GetQueryServiceConfig().GetScriptResultSizeLimit(); + GetRuntime()->Register(CreateRunScriptActorMock(std::move(event), promise, rowsLimit, sizeLimit, resultSets)); return promise.GetFuture().GetValueSync(); } @@ -201,17 +203,30 @@ class TYdbSetup::TImpl { return RunKqpProxyRequest(std::move(event)); } - NKikimr::NKqp::TEvKqp::TEvFetchScriptResultsResponse::TPtr FetchScriptExecutionResultsRequest(const TString& operation, i32 resultSetId, i64 limit) const { + NKikimr::NKqp::TEvKqp::TEvFetchScriptResultsResponse::TPtr FetchScriptExecutionResultsRequest(const TString& operation, i32 resultSetId) const { TString executionId = *NKikimr::NKqp::ScriptExecutionIdFromOperation(operation); NActors::TActorId edgeActor = GetRuntime()->AllocateEdgeActor(); - NActors::IActor* fetchActor = NKikimr::NKqp::CreateGetScriptExecutionResultActor(edgeActor, Settings_.DomainName, executionId, resultSetId, 0, limit); + auto rowsLimit = Settings_.AppConfig.GetQueryServiceConfig().GetScriptResultRowsLimit(); + NActors::IActor* fetchActor = NKikimr::NKqp::CreateGetScriptExecutionResultActor(edgeActor, Settings_.DomainName, executionId, resultSetId, 0, rowsLimit ? rowsLimit : std::numeric_limits::max()); GetRuntime()->Register(fetchActor); return GetRuntime()->GrabEdgeEvent(edgeActor); } + void StartTraceOpt() const { + if (!Settings_.TraceOptEnabled) { + ythrow yexception() << "Trace opt was disabled"; + } + + NYql::NLog::YqlLogger().ResetBackend(CreateLogBackend()); + } + + static void StopTraceOpt() { + NYql::NLog::YqlLogger().ResetBackend(NActors::CreateNullBackend()); + } + private: NActors::TTestActorRuntime* GetRuntime() const { return Server_->GetRuntime(); @@ -308,8 +323,8 @@ TRequestResult TYdbSetup::ScriptRequest(const TString& script, NKikimrKqp::EQuer return TRequestResult(scriptExecutionOperation->Get()->Status, scriptExecutionOperation->Get()->Issues); } -TRequestResult TYdbSetup::QueryRequest(const TString& query, NKikimrKqp::EQueryAction action, const TString& traceId, TQueryMeta& meta) const { - auto queryOperationResponse = Impl_->QueryRequest(query, action, traceId)->Get()->Record.GetRef(); +TRequestResult TYdbSetup::QueryRequest(const TString& query, NKikimrKqp::EQueryAction action, const TString& traceId, TQueryMeta& meta, std::vector& resultSets) const { + auto queryOperationResponse = Impl_->QueryRequest(query, action, traceId, resultSets)->Get()->Record.GetRef(); meta.Ast = queryOperationResponse.GetResponse().GetQueryAst(); meta.Plan = queryOperationResponse.GetResponse().GetQueryPlan(); @@ -339,8 +354,8 @@ TRequestResult TYdbSetup::GetScriptExecutionOperationRequest(const TString& oper return TRequestResult(scriptExecutionOperation->Get()->Status, scriptExecutionOperation->Get()->Issues); } -TRequestResult TYdbSetup::FetchScriptExecutionResultsRequest(const TString& operation, i32 resultSetId, i64 limit, Ydb::ResultSet& resultSet) const { - auto scriptExecutionResults = Impl_->FetchScriptExecutionResultsRequest(operation, resultSetId, limit)->Get()->Record; +TRequestResult TYdbSetup::FetchScriptExecutionResultsRequest(const TString& operation, i32 resultSetId, Ydb::ResultSet& resultSet) const { + auto scriptExecutionResults = Impl_->FetchScriptExecutionResultsRequest(operation, resultSetId)->Get()->Record; resultSet = scriptExecutionResults.GetResultSet(); @@ -350,4 +365,12 @@ TRequestResult TYdbSetup::FetchScriptExecutionResultsRequest(const TString& oper return TRequestResult(scriptExecutionResults.GetStatus(), issues); } +void TYdbSetup::StartTraceOpt() const { + Impl_->StartTraceOpt(); +} + +void TYdbSetup::StopTraceOpt() { + TYdbSetup::TImpl::StopTraceOpt(); +} + } // namespace NKqpRun diff --git a/ydb/tests/tools/kqprun/src/ydb_setup.h b/ydb/tests/tools/kqprun/src/ydb_setup.h index c375d4f3326a..68a00058a3fd 100644 --- a/ydb/tests/tools/kqprun/src/ydb_setup.h +++ b/ydb/tests/tools/kqprun/src/ydb_setup.h @@ -51,11 +51,15 @@ class TYdbSetup { TRequestResult ScriptRequest(const TString& script, NKikimrKqp::EQueryAction action, const TString& traceId, TString& operation) const; - TRequestResult QueryRequest(const TString& query, NKikimrKqp::EQueryAction action, const TString& traceId, TQueryMeta& meta) const; + TRequestResult QueryRequest(const TString& query, NKikimrKqp::EQueryAction action, const TString& traceId, TQueryMeta& meta, std::vector& resultSets) const; TRequestResult GetScriptExecutionOperationRequest(const TString& operation, TExecutionMeta& meta) const; - TRequestResult FetchScriptExecutionResultsRequest(const TString& operation, i32 resultSetId, i64 limit, Ydb::ResultSet& resultSet) const; + TRequestResult FetchScriptExecutionResultsRequest(const TString& operation, i32 resultSetId, Ydb::ResultSet& resultSet) const; + + void StartTraceOpt() const; + + static void StopTraceOpt(); private: class TImpl;