diff --git a/ydb/library/yql/public/purecalc/common/interface.cpp b/ydb/library/yql/public/purecalc/common/interface.cpp index b22c65e482da..32e7f088705c 100644 --- a/ydb/library/yql/public/purecalc/common/interface.cpp +++ b/ydb/library/yql/public/purecalc/common/interface.cpp @@ -27,6 +27,7 @@ TProgramFactoryOptions::TProgramFactoryOptions() : UdfsDir_("") , UserData_() , LLVMSettings("OFF") + , BlockEngineSettings("disable") , CountersProvider(nullptr) , NativeYtTypeFlags(0) , UseSystemColumns(false) @@ -77,6 +78,11 @@ TProgramFactoryOptions& TProgramFactoryOptions::SetLLVMSettings(TStringBuf llvm_ return *this; } +TProgramFactoryOptions& TProgramFactoryOptions::SetBlockEngineSettings(TStringBuf blockEngineSettings) { + BlockEngineSettings = blockEngineSettings; + return *this; +} + TProgramFactoryOptions& TProgramFactoryOptions::SetCountersProvider(NKikimr::NUdf::ICountersProvider* countersProvider) { CountersProvider = countersProvider; return *this; diff --git a/ydb/library/yql/public/purecalc/common/interface.h b/ydb/library/yql/public/purecalc/common/interface.h index b489aeda9455..02862dd16cb1 100644 --- a/ydb/library/yql/public/purecalc/common/interface.h +++ b/ydb/library/yql/public/purecalc/common/interface.h @@ -245,6 +245,11 @@ namespace NYql { /// LLVM settings. Assign "OFF" to disable LLVM, empty string for default settings. TString LLVMSettings; + /// Block engine settings. Assign "force" to unconditionally enable + /// it, "disable" for turn it off and "auto" to left the final + /// decision to the platform heuristics. + TString BlockEngineSettings; + /// Provider for generic counters which can be used to export statistics from UDFs. NKikimr::NUdf::ICountersProvider* CountersProvider; @@ -311,6 +316,13 @@ namespace NYql { */ TProgramFactoryOptions& SetLLVMSettings(TStringBuf llvm_settings); + /** + * Set new block engine settings. + * + * @return reference to self, to allow method chaining. + */ + TProgramFactoryOptions& SetBlockEngineSettings(TStringBuf blockEngineSettings); + /** * Set new counters provider. Passed pointer should stay alive for as long as the processor factory * stays alive. diff --git a/ydb/library/yql/public/purecalc/common/program_factory.cpp b/ydb/library/yql/public/purecalc/common/program_factory.cpp index 53b30f884b43..266aab1c3778 100644 --- a/ydb/library/yql/public/purecalc/common/program_factory.cpp +++ b/ydb/library/yql/public/purecalc/common/program_factory.cpp @@ -14,6 +14,13 @@ TProgramFactory::TProgramFactory(const TProgramFactoryOptions& options) { EnsureLoggingInitialized(); + if (!TryFromString(Options_.BlockEngineSettings, BlockEngineMode_)) { + ythrow TCompileError("", "") << "Unknown BlockEngineSettings value: expected " + << GetEnumAllNames() + << ", but got: " + << Options_.BlockEngineSettings; + } + NUserData::TUserData::UserDataToLibraries(Options_.UserData_, Modules_); UserData_ = GetYqlModuleResolver(ExprContext_, ModuleResolver_, Options_.UserData_, {}, {}); @@ -75,6 +82,7 @@ IPullStreamWorkerFactoryPtr TProgramFactory::MakePullStreamWorkerFactory( UserData_, Modules_, Options_.LLVMSettings, + BlockEngineMode_, CountersProvider_, mode, syntaxVersion, @@ -102,6 +110,7 @@ IPullListWorkerFactoryPtr TProgramFactory::MakePullListWorkerFactory( UserData_, Modules_, Options_.LLVMSettings, + BlockEngineMode_, CountersProvider_, mode, syntaxVersion, @@ -133,6 +142,7 @@ IPushStreamWorkerFactoryPtr TProgramFactory::MakePushStreamWorkerFactory( UserData_, Modules_, Options_.LLVMSettings, + BlockEngineMode_, CountersProvider_, mode, syntaxVersion, diff --git a/ydb/library/yql/public/purecalc/common/program_factory.h b/ydb/library/yql/public/purecalc/common/program_factory.h index d1402c21fdf2..9fe7d432b824 100644 --- a/ydb/library/yql/public/purecalc/common/program_factory.h +++ b/ydb/library/yql/public/purecalc/common/program_factory.h @@ -23,6 +23,7 @@ namespace NYql { TIntrusivePtr FuncRegistry_; IModuleResolver::TPtr ModuleResolver_; TUserDataTable UserData_; + EBlockEngineMode BlockEngineMode_; THashMap Modules_; NKikimr::NUdf::ICountersProvider* CountersProvider_; diff --git a/ydb/library/yql/public/purecalc/common/worker_factory.cpp b/ydb/library/yql/public/purecalc/common/worker_factory.cpp index 965331b33848..ee2000c0037a 100644 --- a/ydb/library/yql/public/purecalc/common/worker_factory.cpp +++ b/ydb/library/yql/public/purecalc/common/worker_factory.cpp @@ -38,6 +38,7 @@ TWorkerFactory::TWorkerFactory(TWorkerFactoryOptions options, EProcessorM , FuncRegistry_(std::move(options.FuncRegistry)) , UserData_(std::move(options.UserData)) , LLVMSettings_(std::move(options.LLVMSettings)) + , BlockEngineMode_(options.BlockEngineMode) , CountersProvider_(options.CountersProvider_) , NativeYtTypeFlags_(options.NativeYtTypeFlags_) , DeterministicTimeProviderSeed_(options.DeterministicTimeProviderSeed_) @@ -134,6 +135,7 @@ TExprNode::TPtr TWorkerFactory::Compile( typeContext->UdfResolver = NCommon::CreateSimpleUdfResolver(FuncRegistry_.Get()); typeContext->UserDataStorage = MakeIntrusive(nullptr, UserData_, nullptr, nullptr); typeContext->Modules = moduleResolver; + typeContext->BlockEngineMode = BlockEngineMode_; auto configProvider = CreateConfigProvider(*typeContext, nullptr, ""); typeContext->AddDataSource(ConfigProviderName, configProvider); typeContext->Initialize(ExprContext_); diff --git a/ydb/library/yql/public/purecalc/common/worker_factory.h b/ydb/library/yql/public/purecalc/common/worker_factory.h index bf4f3599a0be..eab658c21355 100644 --- a/ydb/library/yql/public/purecalc/common/worker_factory.h +++ b/ydb/library/yql/public/purecalc/common/worker_factory.h @@ -23,6 +23,7 @@ namespace NYql { const TUserDataTable& UserData; const THashMap& Modules; TString LLVMSettings; + EBlockEngineMode BlockEngineMode; NKikimr::NUdf::ICountersProvider* CountersProvider_; ETranslationMode TranslationMode_; ui16 SyntaxVersion_; @@ -41,6 +42,7 @@ namespace NYql { const TUserDataTable& UserData, const THashMap& Modules, TString LLVMSettings, + EBlockEngineMode BlockEngineMode, NKikimr::NUdf::ICountersProvider* CountersProvider, ETranslationMode translationMode, ui16 syntaxVersion, @@ -58,6 +60,7 @@ namespace NYql { , UserData(UserData) , Modules(Modules) , LLVMSettings(std::move(LLVMSettings)) + , BlockEngineMode(BlockEngineMode) , CountersProvider_(CountersProvider) , TranslationMode_(translationMode) , SyntaxVersion_(syntaxVersion) @@ -86,6 +89,7 @@ namespace NYql { TVector> AllColumns_; TVector> UsedColumns_; TString LLVMSettings_; + EBlockEngineMode BlockEngineMode_; NKikimr::NUdf::ICountersProvider* CountersProvider_; ui64 NativeYtTypeFlags_; TMaybe DeterministicTimeProviderSeed_; diff --git a/ydb/library/yql/public/purecalc/examples/skiff_pull_list/main.cpp b/ydb/library/yql/public/purecalc/examples/skiff_pull_list/main.cpp index 57aa4e0f26c7..4e00dc7d4b3a 100644 --- a/ydb/library/yql/public/purecalc/examples/skiff_pull_list/main.cpp +++ b/ydb/library/yql/public/purecalc/examples/skiff_pull_list/main.cpp @@ -56,6 +56,7 @@ int main() { auto factoryOptions = TProgramFactoryOptions(); factoryOptions.SetNativeYtTypeFlags(0); factoryOptions.SetLLVMSettings("OFF"); + factoryOptions.SetBlockEngineSettings("disable"); auto factory = MakeProgramFactory(factoryOptions); auto program = factory->MakePullListProgram( inputSpec, diff --git a/ydb/library/yql/tools/purebench/purebench.cpp b/ydb/library/yql/tools/purebench/purebench.cpp index b601ffdc2be9..00c2305b65a8 100644 --- a/ydb/library/yql/tools/purebench/purebench.cpp +++ b/ydb/library/yql/tools/purebench/purebench.cpp @@ -32,8 +32,10 @@ int Main(int argc, const char *argv[]) bool showResults; TString udfsDir; TString LLVMSettings; + TString blockEngineSettings; opts.AddHelpOption(); opts.AddLongOption("ndebug", "should be at first argument, do not show debug info in error output").NoArgument(); + opts.AddLongOption('b', "blocks-engine", "Block engine settings").StoreResult(&blockEngineSettings).DefaultValue("disable"); opts.AddLongOption('c', "count", "count of input rows").StoreResult(&count).DefaultValue(1000000); opts.AddLongOption('g', "gen-sql", "SQL query to generate data").StoreResult(&genSql).DefaultValue("select index from Input"); opts.AddLongOption('t', "test-sql", "SQL query to test").StoreResult(&testSql).DefaultValue("select count(*) as count from Input"); @@ -49,6 +51,7 @@ int Main(int argc, const char *argv[]) auto factoryOptions = TProgramFactoryOptions(); factoryOptions.SetUDFsDir(udfsDir); factoryOptions.SetLLVMSettings(LLVMSettings); + factoryOptions.SetBlockEngineSettings(blockEngineSettings); auto factory = MakeProgramFactory(factoryOptions); NYT::TNode members{NYT::TNode::CreateList()}; @@ -140,7 +143,7 @@ int main(int argc, const char *argv[]) { try { return Main(argc, argv); } catch (const TCompileError& e) { - Cerr << e.GetIssues(); + Cerr << e.what() << "\n" << e.GetIssues(); } catch (...) { Cerr << CurrentExceptionMessage() << Endl; return 1;