From 8b7eb046f0d027815a466c092b568c48c4b50cb0 Mon Sep 17 00:00:00 2001 From: Andrey Neporada Date: Thu, 21 Dec 2023 00:27:29 +0300 Subject: [PATCH 1/2] initial --- ydb/core/kqp/host/kqp_host.cpp | 1 + .../peephole/kqp_opt_peephole_wide_read.cpp | 2 +- .../yql_opt_peephole_physical.cpp | 4 +-- .../yql/core/type_ann/type_ann_list.cpp | 2 +- .../yql/core/yql_aggregate_expander.cpp | 14 ++++---- ydb/library/yql/core/yql_type_annotation.h | 12 ++++++- ydb/library/yql/dq/opt/dq_opt_log.cpp | 2 +- ydb/library/yql/dq/opt/dq_opt_peephole.cpp | 2 +- .../providers/config/yql_config_provider.cpp | 12 +++++++ .../yql/providers/dq/opt/logical_optimize.cpp | 2 +- .../yt/provider/yql_yt_logical_optimize.cpp | 2 +- ydb/library/yql/sql/pg/pg_sql.cpp | 35 ++++++++++++++----- .../yql/sql/settings/translation_settings.cpp | 1 + .../yql/sql/settings/translation_settings.h | 1 + ydb/library/yql/sql/v1/context.cpp | 3 ++ ydb/library/yql/sql/v1/context.h | 2 ++ ydb/library/yql/sql/v1/query.cpp | 6 ++++ ydb/library/yql/sql/v1/sql_query.cpp | 17 +++++---- 18 files changed, 89 insertions(+), 31 deletions(-) diff --git a/ydb/core/kqp/host/kqp_host.cpp b/ydb/core/kqp/host/kqp_host.cpp index 7560fb9be217..70bca19d12f3 100644 --- a/ydb/core/kqp/host/kqp_host.cpp +++ b/ydb/core/kqp/host/kqp_host.cpp @@ -1558,6 +1558,7 @@ class TKqpHost : public IKqpHost { || settingName == "DisableOrderedColumns" || settingName == "Warning" || settingName == "UseBlocks" + || settingName == "BlockEngine" ; }; auto configProvider = CreateConfigProvider(*TypesCtx, gatewaysConfig, {}, allowSettings); diff --git a/ydb/core/kqp/opt/peephole/kqp_opt_peephole_wide_read.cpp b/ydb/core/kqp/opt/peephole/kqp_opt_peephole_wide_read.cpp index 41d26d3e3020..a18d3e477b30 100644 --- a/ydb/core/kqp/opt/peephole/kqp_opt_peephole_wide_read.cpp +++ b/ydb/core/kqp/opt/peephole/kqp_opt_peephole_wide_read.cpp @@ -58,7 +58,7 @@ TExprBase KqpBuildWideReadTable(const TExprBase& node, TExprContext& ctx, TTypeA } else if (auto maybeRead = node.Maybe()) { auto read = maybeRead.Cast(); - if (typesCtx.UseBlocks) { + if (typesCtx.IsBlockEngineEnabled()) { wideRead = Build(ctx, node.Pos()) .Input() .Table(read.Table()) diff --git a/ydb/library/yql/core/peephole_opt/yql_opt_peephole_physical.cpp b/ydb/library/yql/core/peephole_opt/yql_opt_peephole_physical.cpp index 9899691d7169..8f9f11e59782 100644 --- a/ydb/library/yql/core/peephole_opt/yql_opt_peephole_physical.cpp +++ b/ydb/library/yql/core/peephole_opt/yql_opt_peephole_physical.cpp @@ -7774,7 +7774,7 @@ THolder CreatePeepHoleFinalStageTransformer(TTypeAnnotationCo pipeline.Add( CreateFunctorTransformer( [&types](const TExprNode::TPtr& input, TExprNode::TPtr& output, TExprContext& ctx) -> IGraphTransformer::TStatus { - if (types.UseBlocks) { + if (types.IsBlockEngineEnabled()) { const auto& extStageRules = TPeepHoleRules::Instance().BlockStageExtRules; return PeepHoleBlockStage(input, output, ctx, types, extStageRules); } else { @@ -7789,7 +7789,7 @@ THolder CreatePeepHoleFinalStageTransformer(TTypeAnnotationCo pipeline.Add( CreateFunctorTransformer( [&types](const TExprNode::TPtr& input, TExprNode::TPtr& output, TExprContext& ctx) -> IGraphTransformer::TStatus { - if (types.UseBlocks) { + if (types.IsBlockEngineEnabled()) { const auto& extStageRules = TPeepHoleRules::Instance().BlockStageExtFinalRules; return PeepHoleBlockStage(input, output, ctx, types, extStageRules); } else { diff --git a/ydb/library/yql/core/type_ann/type_ann_list.cpp b/ydb/library/yql/core/type_ann/type_ann_list.cpp index 25631f77aae3..117881fcad50 100644 --- a/ydb/library/yql/core/type_ann/type_ann_list.cpp +++ b/ydb/library/yql/core/type_ann/type_ann_list.cpp @@ -4689,7 +4689,7 @@ namespace { return IGraphTransformer::TStatus::Repeat; } - if (isMany && ctx.Types.UseBlocks) { + if (isMany && ctx.Types.IsBlockEngineEnabled()) { auto streamIndex = inputStructType->FindItem("_yql_group_stream_index"); if (streamIndex) { const TTypeAnnotationNode* streamIndexType = inputStructType->GetItems()[*streamIndex]->GetItemType(); diff --git a/ydb/library/yql/core/yql_aggregate_expander.cpp b/ydb/library/yql/core/yql_aggregate_expander.cpp index e6b4be3c8f28..d88364fd8aea 100644 --- a/ydb/library/yql/core/yql_aggregate_expander.cpp +++ b/ydb/library/yql/core/yql_aggregate_expander.cpp @@ -25,7 +25,7 @@ TExprNode::TPtr TAggregateExpander::ExpandAggregate() HaveDistinct = AnyOf(AggregatedColumns->ChildrenList(), [](const auto& child) { return child->ChildrenSize() == 3; }); - EffectiveCompact = (HaveDistinct && CompactForDistinct && !TypesCtx.UseBlocks) || ForceCompact || HasSetting(*settings, "compact"); + EffectiveCompact = (HaveDistinct && CompactForDistinct && !TypesCtx.IsBlockEngineEnabled()) || ForceCompact || HasSetting(*settings, "compact"); for (const auto& trait : Traits) { auto mergeLambda = trait->Child(5); if (mergeLambda->Tail().IsCallable("Void")) { @@ -56,7 +56,7 @@ TExprNode::TPtr TAggregateExpander::ExpandAggregate() return GeneratePhases(); } - if (TypesCtx.UseBlocks) { + if (TypesCtx.IsBlockEngineEnabled()) { if (Suffix == "Combine") { auto ret = TryGenerateBlockCombine(); if (ret) { @@ -2776,7 +2776,7 @@ TExprNode::TPtr TAggregateExpander::GeneratePhases() { streams.push_back(SerializeIdxSet(indicies)); } - if (TypesCtx.UseBlocks) { + if (TypesCtx.IsBlockEngineEnabled()) { for (ui32 i = 0; i < unionAllInputs.size(); ++i) { unionAllInputs[i] = Ctx.Builder(Node->Pos()) .Callable("Map") @@ -2797,7 +2797,7 @@ TExprNode::TPtr TAggregateExpander::GeneratePhases() { } auto settings = Node->ChildPtr(3); - if (TypesCtx.UseBlocks) { + if (TypesCtx.IsBlockEngineEnabled()) { settings = AddSetting(*settings, Node->Pos(), "many_streams", Ctx.NewList(Node->Pos(), std::move(streams)), Ctx); } @@ -2830,7 +2830,7 @@ TExprNode::TPtr TAggregateExpander::TryGenerateBlockCombine() { } TExprNode::TPtr TAggregateExpander::TryGenerateBlockMergeFinalize() { - if (UsePartitionsByKeys || !TypesCtx.UseBlocks) { + if (UsePartitionsByKeys || !TypesCtx.IsBlockEngineEnabled()) { return nullptr; } @@ -2919,13 +2919,13 @@ TExprNode::TPtr TAggregateExpander::TryGenerateBlockMergeFinalizeHashed() { TExprNode::TPtr ExpandAggregatePeephole(const TExprNode::TPtr& node, TExprContext& ctx, TTypeAnnotationContext& typesCtx) { if (NNodes::TCoAggregate::Match(node.Get())) { NNodes::TCoAggregate self(node); - auto ret = TAggregateExpander::CountAggregateRewrite(self, ctx, typesCtx.UseBlocks); + auto ret = TAggregateExpander::CountAggregateRewrite(self, ctx, typesCtx.IsBlockEngineEnabled()); if (ret != node) { YQL_CLOG(DEBUG, Core) << "CountAggregateRewrite on peephole"; return ret; } } - return ExpandAggregatePeepholeImpl(node, ctx, typesCtx, false, typesCtx.UseBlocks); + return ExpandAggregatePeepholeImpl(node, ctx, typesCtx, false, typesCtx.IsBlockEngineEnabled()); } } // namespace NYql diff --git a/ydb/library/yql/core/yql_type_annotation.h b/ydb/library/yql/core/yql_type_annotation.h index 369af2ee0619..4b70a01540a7 100644 --- a/ydb/library/yql/core/yql_type_annotation.h +++ b/ydb/library/yql/core/yql_type_annotation.h @@ -193,6 +193,12 @@ enum class EMatchRecognizeStreamingMode { Force, }; +enum class EBlockEngineMode { + Disable /* "disable" */, + Auto /* "auto" */, + Force /* "force" */, +}; + struct TUdfCachedInfo { const TTypeAnnotationNode* FunctionType = nullptr; const TTypeAnnotationNode* RunConfigType = nullptr; @@ -251,6 +257,7 @@ struct TTypeAnnotationContext: public TThrRefBase { bool YsonCastToString = true; ui32 FolderSubDirsLimit = 1000; bool UseBlocks = false; + EBlockEngineMode BlockEngineMode = EBlockEngineMode::Disable; bool PgEmitAggApply = false; IArrowResolver::TPtr ArrowResolver; ECostBasedOptimizerType CostBasedOptimizer = ECostBasedOptimizerType::Disable; @@ -350,7 +357,10 @@ struct TTypeAnnotationContext: public TThrRefBase { void SetStats(const TExprNode* input, std::shared_ptr stats) { StatisticsMap[input] = stats; } - + + bool IsBlockEngineEnabled() const { + return BlockEngineMode != EBlockEngineMode::Disable || UseBlocks; + } }; template <> inline diff --git a/ydb/library/yql/dq/opt/dq_opt_log.cpp b/ydb/library/yql/dq/opt/dq_opt_log.cpp index bcaf1019231d..ea6746b5d77e 100644 --- a/ydb/library/yql/dq/opt/dq_opt_log.cpp +++ b/ydb/library/yql/dq/opt/dq_opt_log.cpp @@ -21,7 +21,7 @@ TExprBase DqRewriteAggregate(TExprBase node, TExprContext& ctx, TTypeAnnotationC if (!node.Maybe()) { return node; } - TAggregateExpander aggExpander(true, !typesCtx.UseBlocks && !useFinalizeByKey, useFinalizeByKey, node.Ptr(), ctx, typesCtx, false, compactForDistinct, usePhases); + TAggregateExpander aggExpander(true, !typesCtx.IsBlockEngineEnabled() && !useFinalizeByKey, useFinalizeByKey, node.Ptr(), ctx, typesCtx, false, compactForDistinct, usePhases); auto result = aggExpander.ExpandAggregate(); YQL_ENSURE(result); diff --git a/ydb/library/yql/dq/opt/dq_opt_peephole.cpp b/ydb/library/yql/dq/opt/dq_opt_peephole.cpp index b81721174354..f89670fe4ee8 100644 --- a/ydb/library/yql/dq/opt/dq_opt_peephole.cpp +++ b/ydb/library/yql/dq/opt/dq_opt_peephole.cpp @@ -681,7 +681,7 @@ NNodes::TExprBase DqPeepholeRewriteLength(const NNodes::TExprBase& node, TExprCo } auto dqPhyLength = node.Cast(); - if (typesCtx.UseBlocks) { + if (typesCtx.IsBlockEngineEnabled()) { return NNodes::TExprBase(ctx.Builder(node.Pos()) .Callable("NarrowMap") .Callable(0, "BlockCombineAll") diff --git a/ydb/library/yql/providers/config/yql_config_provider.cpp b/ydb/library/yql/providers/config/yql_config_provider.cpp index ff58a53f8963..19dd4313ed25 100644 --- a/ydb/library/yql/providers/config/yql_config_provider.cpp +++ b/ydb/library/yql/providers/config/yql_config_provider.cpp @@ -888,6 +888,18 @@ namespace { return false; } } + else if (name == "BlockEngine") { + if (args.size() != 1) { + ctx.AddError(TIssue(pos, TStringBuilder() << "Expected at most 1 argument, but got " << args.size())); + return false; + } + + auto arg = TString{args[0]}; + if (!TryFromString(arg, Types.BlockEngineMode)) { + ctx.AddError(TIssue(pos, TStringBuilder() << "Expected `disable|auto|force', but got: " << args[0])); + return false; + } + } else { ctx.AddError(TIssue(pos, TStringBuilder() << "Unsupported command: " << name)); return false; diff --git a/ydb/library/yql/providers/dq/opt/logical_optimize.cpp b/ydb/library/yql/providers/dq/opt/logical_optimize.cpp index d5bee60d8701..b294d57a6180 100644 --- a/ydb/library/yql/providers/dq/opt/logical_optimize.cpp +++ b/ydb/library/yql/providers/dq/opt/logical_optimize.cpp @@ -324,7 +324,7 @@ class TDqsLogicalOptProposalTransformer : public TOptimizeTransformerBase { auto input = aggregate.Input().Maybe(); if (input) { - auto newNode = TAggregateExpander::CountAggregateRewrite(aggregate, ctx, TypesCtx.UseBlocks); + auto newNode = TAggregateExpander::CountAggregateRewrite(aggregate, ctx, TypesCtx.IsBlockEngineEnabled()); if (node.Ptr() != newNode) { return TExprBase(newNode); } diff --git a/ydb/library/yql/providers/yt/provider/yql_yt_logical_optimize.cpp b/ydb/library/yql/providers/yt/provider/yql_yt_logical_optimize.cpp index 9e4c86d6b401..19632907f4f5 100644 --- a/ydb/library/yql/providers/yt/provider/yql_yt_logical_optimize.cpp +++ b/ydb/library/yql/providers/yt/provider/yql_yt_logical_optimize.cpp @@ -2512,7 +2512,7 @@ class TYtLogicalOptProposalTransformer : public TOptimizeTransformerBase { return node; } - return TAggregateExpander::CountAggregateRewrite(aggregate, ctx, State_->Types->UseBlocks); + return TAggregateExpander::CountAggregateRewrite(aggregate, ctx, State_->Types->IsBlockEngineEnabled()); } TMaybeNode ZeroSampleToZeroLimit(TExprBase node, TExprContext& ctx) const { diff --git a/ydb/library/yql/sql/pg/pg_sql.cpp b/ydb/library/yql/sql/pg/pg_sql.cpp index 4275f09b0ffa..8960419e1cce 100644 --- a/ydb/library/yql/sql/pg/pg_sql.cpp +++ b/ydb/library/yql/sql/pg/pg_sql.cpp @@ -272,6 +272,7 @@ class TConverter : public IPGParseEvents { : AstParseResult(astParseResult) , Settings(settings) , DqEngineEnabled(Settings.DqDefaultAuto->Allow()) + , BlockEngineEnabled(Settings.BlockDefaultAuto->Allow()) { Positions.push_back({}); ScanRows(query); @@ -281,6 +282,10 @@ class TConverter : public IPGParseEvents { DqEngineEnabled = true; } else if (flag == "DqEngineForce") { DqEngineForce = true; + } else if (flag == "BlockEngineEnable") { + BlockEngineEnabled = true; + } else if (flag == "BlockEngineForce") { + BlockEngineForce = true; } } @@ -320,6 +325,8 @@ class TConverter : public IPGParseEvents { Statements.push_back(L(A("let"), A("world"), L(A(TString(NYql::ConfigureName)), A("world"), configSource, QA("OrderedColumns")))); + ui32 blockEnginePgmPos = Statements.size(); + Statements.push_back(configSource); ui32 costBasedOptimizerPos = Statements.size(); Statements.push_back(configSource); ui32 dqEnginePgmPos = Statements.size(); @@ -359,6 +366,13 @@ class TConverter : public IPGParseEvents { Statements.erase(Statements.begin() + costBasedOptimizerPos); } + if (BlockEngineEnabled) { + Statements[blockEnginePgmPos] = L(A("let"), A("world"), L(A(TString(NYql::ConfigureName)), A("world"), configSource, + QA("BlockEngine"), QA(BlockEngineForce ? "force" : "auto"))); + } else { + Statements.erase(Statements.begin() + blockEnginePgmPos); + } + return VL(Statements.data(), Statements.size()); } @@ -2001,7 +2015,7 @@ class TConverter : public IPGParseEvents { AddError(TStringBuilder() << "VariableSetStmt, expected string literal for " << value->name << " option"); return nullptr; } - } else if (name == "dqengine") { + } else if (name == "dqengine" || name == "blockengine") { if (ListLength(value->args) != 1) { AddError(TStringBuilder() << "VariableSetStmt, expected 1 arg, but got: " << ListLength(value->args)); return nullptr; @@ -2011,17 +2025,20 @@ class TConverter : public IPGParseEvents { if (NodeTag(arg) == T_A_Const && (NodeTag(CAST_NODE(A_Const, arg)->val) == T_String)) { auto rawStr = StrVal(CAST_NODE(A_Const, arg)->val); auto str = to_lower(TString(rawStr)); + const bool isDqEngine = name == "dqengine"; + auto& enable = isDqEngine ? DqEngineEnabled : BlockEngineEnabled; + auto& force = isDqEngine ? DqEngineForce : BlockEngineForce; if (str == "auto") { - DqEngineEnabled = true; - DqEngineForce = false; + enable = true; + force = false; } else if (str == "force") { - DqEngineEnabled = true; - DqEngineForce = true; + enable = true; + force = true; } else if (str == "disable") { - DqEngineEnabled = false; - DqEngineForce = false; + enable = false; + force = false; } else { - AddError(TStringBuilder() << "VariableSetStmt, not supported DqEngine option value: " << rawStr); + AddError(TStringBuilder() << "VariableSetStmt, not supported " << value->name << " option value: " << rawStr); return nullptr; } } else { @@ -4247,6 +4264,8 @@ class TConverter : public IPGParseEvents { bool DqEngineEnabled = false; bool DqEngineForce = false; TString CostBasedOptimizer; + bool BlockEngineEnabled = false; + bool BlockEngineForce = false; TVector Statements; ui32 ReadIndex = 0; TViews Views; diff --git a/ydb/library/yql/sql/settings/translation_settings.cpp b/ydb/library/yql/sql/settings/translation_settings.cpp index 0564225d9fc6..6fddf1fbe716 100644 --- a/ydb/library/yql/sql/settings/translation_settings.cpp +++ b/ydb/library/yql/sql/settings/translation_settings.cpp @@ -56,6 +56,7 @@ namespace NSQLTranslation { , WarnOnV0(true) , V0WarnAsError(ISqlFeaturePolicy::MakeAlwaysDisallow()) , DqDefaultAuto(ISqlFeaturePolicy::MakeAlwaysDisallow()) + , BlockDefaultAuto(ISqlFeaturePolicy::MakeAlwaysDisallow()) , AssumeYdbOnClusterWithSlash(false) {} diff --git a/ydb/library/yql/sql/settings/translation_settings.h b/ydb/library/yql/sql/settings/translation_settings.h index cb3d4da92c1f..4ec571a9328e 100644 --- a/ydb/library/yql/sql/settings/translation_settings.h +++ b/ydb/library/yql/sql/settings/translation_settings.h @@ -101,6 +101,7 @@ namespace NSQLTranslation { bool WarnOnV0; ISqlFeaturePolicy::TPtr V0WarnAsError; ISqlFeaturePolicy::TPtr DqDefaultAuto; + ISqlFeaturePolicy::TPtr BlockDefaultAuto; bool AssumeYdbOnClusterWithSlash; TString DynamicClusterProvider; TString FileAliasPrefix; diff --git a/ydb/library/yql/sql/v1/context.cpp b/ydb/library/yql/sql/v1/context.cpp index 366992aebe11..b85e015789e6 100644 --- a/ydb/library/yql/sql/v1/context.cpp +++ b/ydb/library/yql/sql/v1/context.cpp @@ -58,6 +58,8 @@ THashMap CTX_PRAGMA_FIELDS = { {"EmitAggApply", &TContext::EmitAggApply}, {"AnsiLike", &TContext::AnsiLike}, {"UseBlocks", &TContext::UseBlocks}, + {"BlockEngineEnable", &TContext::BlockEngineEnable}, + {"BlockEngineForce", &TContext::BlockEngineForce}, }; typedef TMaybe TContext::*TPragmaMaybeField; @@ -84,6 +86,7 @@ TContext::TContext(const NSQLTranslation::TTranslationSettings& settings, , HasPendingErrors(false) , DqEngineEnable(Settings.DqDefaultAuto->Allow()) , AnsiQuotedIdentifiers(settings.AnsiLexer) + , BlockEngineEnable(Settings.BlockDefaultAuto->Allow()) { for (auto lib : settings.Libraries) { Libraries.emplace(lib, TLibraryStuff()); diff --git a/ydb/library/yql/sql/v1/context.h b/ydb/library/yql/sql/v1/context.h index 5120d49f09bc..2fea56385184 100644 --- a/ydb/library/yql/sql/v1/context.h +++ b/ydb/library/yql/sql/v1/context.h @@ -308,6 +308,8 @@ namespace NSQLTranslationV1 { bool AnsiLike = false; bool FeatureR010 = false; //Row pattern recognition: FROM clause TMaybe CompactGroupBy; + bool BlockEngineEnable = false; + bool BlockEngineForce = false; }; class TColumnRefScope { diff --git a/ydb/library/yql/sql/v1/query.cpp b/ydb/library/yql/sql/v1/query.cpp index 56d2f68506b6..68258837a7c2 100644 --- a/ydb/library/yql/sql/v1/query.cpp +++ b/ydb/library/yql/sql/v1/query.cpp @@ -2691,6 +2691,12 @@ class TYqlProgramNode: public TAstListNode { if (ctx.UseBlocks) { Add(Y("let", "world", Y(TString(ConfigureName), "world", configSource, BuildQuotedAtom(Pos, "UseBlocks")))); } + + if (ctx.BlockEngineEnable) { + TString mode = ctx.BlockEngineForce ? "force" : "auto"; + Add(Y("let", "world", Y(TString(ConfigureName), "world", configSource, + BuildQuotedAtom(Pos, "BlockEngine"), BuildQuotedAtom(Pos, mode)))); + } } } diff --git a/ydb/library/yql/sql/v1/sql_query.cpp b/ydb/library/yql/sql/v1/sql_query.cpp index a5f3b0b61752..2f8650e9c779 100644 --- a/ydb/library/yql/sql/v1/sql_query.cpp +++ b/ydb/library/yql/sql/v1/sql_query.cpp @@ -1847,7 +1847,7 @@ TNodePtr TSqlQuery::PragmaStatement(const TRule_pragma_stmt& stmt, bool& success } else if (normalizedPragma == "disableansiinforemptyornullableitemscollections") { Ctx.AnsiInForEmptyOrNullableItemsCollections = false; Ctx.IncrementMonCounter("sql_pragma", "DisableAnsiInForEmptyOrNullableItemsCollections"); - } else if (normalizedPragma == "dqengine") { + } else if (normalizedPragma == "dqengine" || normalizedPragma == "blockengine") { Ctx.IncrementMonCounter("sql_pragma", "DqEngine"); if (values.size() != 1 || !values[0].GetLiteral() || ! (*values[0].GetLiteral() == "disable" || *values[0].GetLiteral() == "auto" || *values[0].GetLiteral() == "force")) @@ -1856,15 +1856,18 @@ TNodePtr TSqlQuery::PragmaStatement(const TRule_pragma_stmt& stmt, bool& success Ctx.IncrementMonCounter("sql_errors", "BadPragmaValue"); return {}; } + const bool isDqEngine = normalizedPragma == "dqengine"; + auto& enable = isDqEngine ? Ctx.DqEngineEnable : Ctx.BlockEngineEnable; + auto& force = isDqEngine ? Ctx.DqEngineForce : Ctx.BlockEngineForce; if (*values[0].GetLiteral() == "disable") { - Ctx.DqEngineEnable = false; - Ctx.DqEngineForce = false; + enable = false; + force = false; } else if (*values[0].GetLiteral() == "force") { - Ctx.DqEngineEnable = true; - Ctx.DqEngineForce = true; + enable = true; + force = true; } else if (*values[0].GetLiteral() == "auto") { - Ctx.DqEngineEnable = true; - Ctx.DqEngineForce = false; + enable = true; + force = false; } } else if (normalizedPragma == "ansirankfornullablekeys") { Ctx.AnsiRankForNullableKeys = true; From 18f2f22d0c1814cd0ff5cb7d330b5bcac3a8fc83 Mon Sep 17 00:00:00 2001 From: Andrey Neporada Date: Thu, 21 Dec 2023 19:03:49 +0300 Subject: [PATCH 2/2] add tests --- ydb/library/yql/sql/pg/pg_sql_ut.cpp | 21 +++++++++++++++++++++ ydb/library/yql/sql/v1/sql_ut.cpp | 25 +++++++++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/ydb/library/yql/sql/pg/pg_sql_ut.cpp b/ydb/library/yql/sql/pg/pg_sql_ut.cpp index 864bddff97ba..10011b7f62a5 100644 --- a/ydb/library/yql/sql/pg/pg_sql_ut.cpp +++ b/ydb/library/yql/sql/pg/pg_sql_ut.cpp @@ -435,4 +435,25 @@ SELECT COUNT(*) FROM public.t;"); UNIT_ASSERT_C(res.Root, "Failed to parse statement, root is nullptr"); UNIT_ASSERT_STRINGS_EQUAL(res.Root->ToString(), expectedAst.Root->ToString()); } + + Y_UNIT_TEST(BlockEngine) { + auto res = PgSqlToYql("set blockEngine='auto'; select 1;"); + UNIT_ASSERT(res.Root); + UNIT_ASSERT_STRING_CONTAINS(res.Root->ToString(), "(let world (Configure! world (DataSource 'config) 'BlockEngine 'auto))"); + + res = PgSqlToYql("set Blockengine='force'; select 1;"); + UNIT_ASSERT(res.Root); + UNIT_ASSERT_STRING_CONTAINS(res.Root->ToString(), "(let world (Configure! world (DataSource 'config) 'BlockEngine 'force))"); + + res = PgSqlToYql("set BlockEngine='disable'; select 1;"); + UNIT_ASSERT(res.Root); + UNIT_ASSERT(!res.Root->ToString().Contains("BlockEngine")); + + res = PgSqlToYql("set BlockEngine='foo'; select 1;"); + UNIT_ASSERT(!res.Root); + UNIT_ASSERT_EQUAL(res.Issues.Size(), 1); + + auto issue = *(res.Issues.begin()); + UNIT_ASSERT(issue.GetMessage().Contains("VariableSetStmt, not supported BlockEngine option value: foo")); + } } diff --git a/ydb/library/yql/sql/v1/sql_ut.cpp b/ydb/library/yql/sql/v1/sql_ut.cpp index 9b0b0aca4360..93c78c88d74c 100644 --- a/ydb/library/yql/sql/v1/sql_ut.cpp +++ b/ydb/library/yql/sql/v1/sql_ut.cpp @@ -5918,3 +5918,28 @@ Y_UNIT_TEST_SUITE(TopicsDDL) { )", false); } } + +Y_UNIT_TEST_SUITE(BlockEnginePragma) { + Y_UNIT_TEST(Basic) { + const TVector values = {"auto", "force", "disable"}; + for (const auto& value : values) { + const auto query = TStringBuilder() << "pragma Blockengine='" << value << "'; select 1;"; + NYql::TAstParseResult res = SqlToYql(query); + UNIT_ASSERT(res.Root); + + TVerifyLineFunc verifyLine = [&](const TString& word, const TString& line) { + Y_UNUSED(word); + UNIT_ASSERT_STRING_CONTAINS(line, TStringBuilder() << R"(Configure! world (DataSource '"config") '"BlockEngine" '")" << value << "\""); + }; + + TWordCountHive elementStat({"BlockEngine"}); + VerifyProgram(res, elementStat, verifyLine); + UNIT_ASSERT(elementStat["BlockEngine"] == ((value == "disable") ? 0 : 1)); + } + } + + Y_UNIT_TEST(UnknownSetting) { + ExpectFailWithError("use plato; pragma BlockEngine='foo';", + "
:1:31: Error: Expected `disable|auto|force' argument for: BlockEngine\n"); + } +}