diff options
author | pilik <pudge1000-7@ydb.tech> | 2024-09-19 14:31:12 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-09-19 14:31:12 +0300 |
commit | 698ad50972aabe4481fcae516da92dc103984b56 (patch) | |
tree | 02589cf3da68a1cbe59561aacc81396670617308 | |
parent | a119eea40ebc31dd74b0341a1ee857df4769281d (diff) | |
download | ydb-698ad50972aabe4481fcae516da92dc103984b56.tar.gz |
[CBO] hints parser fixes (#9463)
-rw-r--r-- | ydb/core/kqp/opt/kqp_opt.h | 4 | ||||
-rw-r--r-- | ydb/core/kqp/provider/yql_kikimr_settings.cpp | 3 | ||||
-rw-r--r-- | ydb/core/kqp/provider/yql_kikimr_settings.h | 3 | ||||
-rw-r--r-- | ydb/library/yql/core/cbo/cbo_hints.cpp | 19 |
4 files changed, 23 insertions, 6 deletions
diff --git a/ydb/core/kqp/opt/kqp_opt.h b/ydb/core/kqp/opt/kqp_opt.h index 731b94368f..409a1b787c 100644 --- a/ydb/core/kqp/opt/kqp_opt.h +++ b/ydb/core/kqp/opt/kqp_opt.h @@ -50,9 +50,7 @@ struct TKqpOptimizeContext : public TSimpleRefCount<TKqpOptimizeContext> { NYql::TOptimizerHints GetOptimizerHints() { if (Config->OptimizerHints.Get()) { if (!Hints) { - Hints = std::make_shared<NYql::TOptimizerHints>( - NYql::TOptimizerHints::Parse(*Config->OptimizerHints.Get()) - ); + Hints = std::make_shared<NYql::TOptimizerHints>(*Config->OptimizerHints.Get()); } return *Hints; } diff --git a/ydb/core/kqp/provider/yql_kikimr_settings.cpp b/ydb/core/kqp/provider/yql_kikimr_settings.cpp index 3b74b8ecd7..e417c40bc3 100644 --- a/ydb/core/kqp/provider/yql_kikimr_settings.cpp +++ b/ydb/core/kqp/provider/yql_kikimr_settings.cpp @@ -5,6 +5,7 @@ #include <util/generic/size_literals.h> #include <util/string/split.h> #include <ydb/library/yql/providers/dq/common/yql_dq_settings.h> +#include <ydb/library/yql/core/cbo/cbo_optimizer_new.h> namespace NYql { @@ -82,7 +83,7 @@ TKikimrConfiguration::TKikimrConfiguration() { REGISTER_SETTING(*this, OptEnableOlapPushdown); REGISTER_SETTING(*this, OptEnableOlapProvideComputeSharding); REGISTER_SETTING(*this, OptOverrideStatistics); - REGISTER_SETTING(*this, OptimizerHints); + REGISTER_SETTING(*this, OptimizerHints).Parser([](const TString& v) { return NYql::TOptimizerHints::Parse(v); }); REGISTER_SETTING(*this, OverridePlanner); REGISTER_SETTING(*this, UseGraceJoinCoreForMap); diff --git a/ydb/core/kqp/provider/yql_kikimr_settings.h b/ydb/core/kqp/provider/yql_kikimr_settings.h index 10eecc0fbc..ad4d9dc178 100644 --- a/ydb/core/kqp/provider/yql_kikimr_settings.h +++ b/ydb/core/kqp/provider/yql_kikimr_settings.h @@ -5,6 +5,7 @@ #include <ydb/library/yql/providers/common/config/yql_setting.h> #include <ydb/library/yql/sql/settings/translation_settings.h> #include <ydb/core/protos/feature_flags.pb.h> +#include <ydb/library/yql/core/cbo/cbo_optimizer_new.h> namespace NKikimrConfig { enum TTableServiceConfig_EIndexAutoChooseMode : int; @@ -55,7 +56,7 @@ struct TKikimrSettings { NCommon::TConfSetting<bool, false> UseGraceJoinCoreForMap; NCommon::TConfSetting<TString, false> OptOverrideStatistics; - NCommon::TConfSetting<TString, false> OptimizerHints; + NCommon::TConfSetting<NYql::TOptimizerHints, false> OptimizerHints; /* Disable optimizer rules */ NCommon::TConfSetting<bool, false> OptDisableTopSort; diff --git a/ydb/library/yql/core/cbo/cbo_hints.cpp b/ydb/library/yql/core/cbo/cbo_hints.cpp index 4d598c2fd7..2efa74242f 100644 --- a/ydb/library/yql/core/cbo/cbo_hints.cpp +++ b/ydb/library/yql/core/cbo/cbo_hints.cpp @@ -130,7 +130,8 @@ private: private: // Expressions void ParseError(const TString& err, i32 pos) { - Y_ENSURE(false, Sprintf("Optimizer hints parser error position:%d, msg: %s", pos, err.c_str())); + auto [line, linePos] = GetLineAndLinePosFromTextPos(pos); + Y_ENSURE(false, Sprintf("Optimizer hints parser error at [line:%d, pos:%d], msg: %s", line, linePos, err.c_str())); } TString Label() { @@ -282,6 +283,22 @@ private: } } + std::pair<i32, i32> GetLineAndLinePosFromTextPos(i32 pos) { + i32 Line = 0; + i32 LinePos = 0; + + for (i32 i = 0; i <= pos && i < static_cast<i32>(Text.Size()); ++i) { + if (Text[i] == '\n') { + LinePos = 0; + ++Line; + } else { + ++LinePos; + } + } + + return {Line, LinePos}; + } + private: i32 Pos; const i32 Size; |