aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpilik <pudge1000-7@ydb.tech>2024-09-19 14:31:12 +0300
committerGitHub <noreply@github.com>2024-09-19 14:31:12 +0300
commit698ad50972aabe4481fcae516da92dc103984b56 (patch)
tree02589cf3da68a1cbe59561aacc81396670617308
parenta119eea40ebc31dd74b0341a1ee857df4769281d (diff)
downloadydb-698ad50972aabe4481fcae516da92dc103984b56.tar.gz
[CBO] hints parser fixes (#9463)
-rw-r--r--ydb/core/kqp/opt/kqp_opt.h4
-rw-r--r--ydb/core/kqp/provider/yql_kikimr_settings.cpp3
-rw-r--r--ydb/core/kqp/provider/yql_kikimr_settings.h3
-rw-r--r--ydb/library/yql/core/cbo/cbo_hints.cpp19
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;