diff --git a/ydb/core/kqp/opt/kqp_opt.h b/ydb/core/kqp/opt/kqp_opt.h index 731b94368f02..409a1b787c25 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 { NYql::TOptimizerHints GetOptimizerHints() { if (Config->OptimizerHints.Get()) { if (!Hints) { - Hints = std::make_shared( - NYql::TOptimizerHints::Parse(*Config->OptimizerHints.Get()) - ); + Hints = std::make_shared(*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 3b74b8ecd76f..e417c40bc3f1 100644 --- a/ydb/core/kqp/provider/yql_kikimr_settings.cpp +++ b/ydb/core/kqp/provider/yql_kikimr_settings.cpp @@ -5,6 +5,7 @@ #include #include #include +#include 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 8e6e706de43e..cfe092ae8fe5 100644 --- a/ydb/core/kqp/provider/yql_kikimr_settings.h +++ b/ydb/core/kqp/provider/yql_kikimr_settings.h @@ -5,6 +5,7 @@ #include #include #include +#include namespace NKikimrConfig { enum TTableServiceConfig_EIndexAutoChooseMode : int; @@ -55,7 +56,7 @@ struct TKikimrSettings { NCommon::TConfSetting UseGraceJoinCoreForMap; NCommon::TConfSetting OptOverrideStatistics; - NCommon::TConfSetting OptimizerHints; + NCommon::TConfSetting OptimizerHints; /* Disable optimizer rules */ NCommon::TConfSetting OptDisableTopSort; diff --git a/ydb/library/yql/core/cbo/cbo_hints.cpp b/ydb/library/yql/core/cbo/cbo_hints.cpp index 4d598c2fd72b..2efa74242f71 100644 --- a/ydb/library/yql/core/cbo/cbo_hints.cpp +++ b/ydb/library/yql/core/cbo/cbo_hints.cpp @@ -130,7 +130,8 @@ class TOptimizerHintsParser { 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 @@ class TOptimizerHintsParser { } } + std::pair GetLineAndLinePosFromTextPos(i32 pos) { + i32 Line = 0; + i32 LinePos = 0; + + for (i32 i = 0; i <= pos && i < static_cast(Text.Size()); ++i) { + if (Text[i] == '\n') { + LinePos = 0; + ++Line; + } else { + ++LinePos; + } + } + + return {Line, LinePos}; + } + private: i32 Pos; const i32 Size;