diff --git a/ydb/library/yql/yt/bridge/interface.h b/ydb/library/yql/yt/bridge/interface.h index d1e277fe69db..d69249ffcba8 100644 --- a/ydb/library/yql/yt/bridge/interface.h +++ b/ydb/library/yql/yt/bridge/interface.h @@ -96,8 +96,10 @@ using TFuncBridgeRun = TBridgeQueryResult*( const char* impersonationUser, const char* queryText, const char* settings, + int settingsLength, const TBridgeQueryFile* files, - int fileCount); + int fileCount, + int executeMode); using TFuncBridgeGetProgress = TBridgeQueryResult*(TBridgeYqlPlugin* plugin, const char* queryId); using TFuncBridgeAbort = TBridgeAbortResult*(TBridgeYqlPlugin* plugin, const char* queryId); using TFuncBridgeFreeAbortResult = void(TBridgeAbortResult* result); diff --git a/ydb/library/yql/yt/dynamic/impl.cpp b/ydb/library/yql/yt/dynamic/impl.cpp index 818575745a6e..aee2d4724ccd 100644 --- a/ydb/library/yql/yt/dynamic/impl.cpp +++ b/ydb/library/yql/yt/dynamic/impl.cpp @@ -12,7 +12,7 @@ extern "C" { ssize_t BridgeGetAbiVersion() { - return 1; // EYqlPluginAbiVersion::AbortQuery + return 2; // EYqlPluginAbiVersion } TBridgeYqlPlugin* BridgeCreateYqlPlugin(const TBridgeYqlPluginOptions* bridgeOptions) @@ -74,8 +74,10 @@ TBridgeQueryResult* BridgeRun( const char* impersonationUser, const char* queryText, const char* settings, + int settingsLength, const TBridgeQueryFile* bridgeFiles, - int bridgeFileCount) + int bridgeFileCount, + int executeMode) { static const auto EmptyMap = TYsonString(TString("{}")); @@ -96,8 +98,9 @@ TBridgeQueryResult* BridgeRun( NYT::TGuid::FromString(queryId), TString(impersonationUser), TString(queryText), - settings ? TYsonString(TString(settings)) : EmptyMap, - files); + settings ? TYsonString(TString(settings, settingsLength)) : EmptyMap, + files, + executeMode); FillString(bridgeResult->YsonResult, bridgeResult->YsonResultLength, result.YsonResult); FillString(bridgeResult->Plan, bridgeResult->PlanLength, result.Plan); FillString(bridgeResult->Statistics, bridgeResult->StatisticsLength, result.Statistics); diff --git a/ydb/library/yql/yt/native/plugin.cpp b/ydb/library/yql/yt/native/plugin.cpp index 60a0284aa741..2df2c5748d4c 100644 --- a/ydb/library/yql/yt/native/plugin.cpp +++ b/ydb/library/yql/yt/native/plugin.cpp @@ -254,7 +254,8 @@ class TYqlPlugin TString impersonationUser, TString queryText, TYsonString settings, - std::vector files) + std::vector files, + int executeMode) { auto program = ProgramFactory_->Create("-memory-", queryText); { @@ -314,7 +315,23 @@ class TYqlPlugin } NYql::TProgram::TStatus status = NYql::TProgram::TStatus::Error; - status = program->RunWithConfig(impersonationUser, pipelineConfigurator); + + // NYT::NYqlClient::EExecuteMode (yt/yt/ytlib/yql_client/public.h) + switch (executeMode) { + case 0: // Validate. + status = program->Validate(impersonationUser, nullptr); + break; + case 1: // Optimize. + status = program->OptimizeWithConfig(impersonationUser, pipelineConfigurator); + break; + case 2: // Run. + status = program->RunWithConfig(impersonationUser, pipelineConfigurator); + break; + default: // Unknown. + return TQueryResult{ + .YsonError = MessageToYtErrorYson(Format("Unknown execution mode: %v", executeMode)), + }; + } if (status == NYql::TProgram::TStatus::Error) { return TQueryResult{ @@ -354,10 +371,11 @@ class TYqlPlugin TString impersonationUser, TString queryText, TYsonString settings, - std::vector files) noexcept override + std::vector files, + int executeMode) noexcept override { try { - return GuardedRun(queryId, impersonationUser, queryText, settings, files); + return GuardedRun(queryId, impersonationUser, queryText, settings, files, executeMode); } catch (const std::exception& ex) { { auto guard = WriterGuard(ProgressSpinLock); diff --git a/ydb/library/yql/yt/plugin.h b/ydb/library/yql/yt/plugin.h index 520a9fe2358e..1810b727bee3 100644 --- a/ydb/library/yql/yt/plugin.h +++ b/ydb/library/yql/yt/plugin.h @@ -75,7 +75,8 @@ struct IYqlPlugin TString impersonationUser, TString queryText, NYson::TYsonString settings, - std::vector files) noexcept = 0; + std::vector files, + int executeMode) noexcept = 0; virtual TQueryResult GetProgress(TQueryId queryId) noexcept = 0; virtual TAbortResult Abort(TQueryId queryId) noexcept = 0;