summaryrefslogtreecommitdiffstats
path: root/yql/essentials/sql
diff options
context:
space:
mode:
authorlucius <[email protected]>2025-10-09 13:01:25 +0300
committerlucius <[email protected]>2025-10-09 13:33:39 +0300
commite7c5ac7fc2f710e8fe0223ec4ed56ecda316b9c4 (patch)
treeb7dc4fb5d2693c5be545e14831c2eb802f8f62df /yql/essentials/sql
parent65e378dec032b5dde3099702f121524cf022b9e6 (diff)
YT-25914: [cbo] use column DataWeight + update cost function + add version pragma
Новая кост-функция для cbo. Под флагом чтобы удобнее сравнивать со старой. 2 изменения: - Для оценки размера входных таблиц используется поколоночный dataweight (если есть), а не таблица целиком - В самой кост-функции убран outputSize, чтобы он не учитывался дважды: он неявно учтен в каждом следующем джоине как левый либо правый inputSize, а размер результата последнего джоина не зависит от перестановки джоинов commit_hash:d130848393114b1b4383035381dba7767aac62fb
Diffstat (limited to 'yql/essentials/sql')
-rw-r--r--yql/essentials/sql/v1/context.h1
-rw-r--r--yql/essentials/sql/v1/query.cpp5
-rw-r--r--yql/essentials/sql/v1/sql_query.cpp16
3 files changed, 22 insertions, 0 deletions
diff --git a/yql/essentials/sql/v1/context.h b/yql/essentials/sql/v1/context.h
index 1f6d660c7fb..49041cd11b2 100644
--- a/yql/essentials/sql/v1/context.h
+++ b/yql/essentials/sql/v1/context.h
@@ -328,6 +328,7 @@ public:
bool DqEngineEnable = false;
bool DqEngineForce = false;
TString CostBasedOptimizer;
+ TMaybe<ui32> CostBasedOptimizerVersion;
TMaybe<bool> JsonQueryReturnsJsonDocument;
TMaybe<bool> AnsiInForEmptyOrNullableItemsCollections;
TMaybe<bool> AnsiRankForNullableKeys = true;
diff --git a/yql/essentials/sql/v1/query.cpp b/yql/essentials/sql/v1/query.cpp
index e88f03b0c3c..f106b9344d4 100644
--- a/yql/essentials/sql/v1/query.cpp
+++ b/yql/essentials/sql/v1/query.cpp
@@ -3324,6 +3324,11 @@ public:
BuildQuotedAtom(Pos_, "CostBasedOptimizer"), BuildQuotedAtom(Pos_, ctx.CostBasedOptimizer))));
}
+ if (ctx.CostBasedOptimizerVersion) {
+ currentWorlds->Add(Y("let", "world", Y(TString(ConfigureName), "world", configSource,
+ BuildQuotedAtom(Pos_, "CostBasedOptimizerVersion"), BuildQuotedAtom(Pos_, ToString(*ctx.CostBasedOptimizerVersion)))));
+ }
+
if (ctx.JsonQueryReturnsJsonDocument.Defined()) {
TString pragmaName = "DisableJsonQueryReturnsJsonDocument";
if (*ctx.JsonQueryReturnsJsonDocument) {
diff --git a/yql/essentials/sql/v1/sql_query.cpp b/yql/essentials/sql/v1/sql_query.cpp
index bb846e93012..813423b0540 100644
--- a/yql/essentials/sql/v1/sql_query.cpp
+++ b/yql/essentials/sql/v1/sql_query.cpp
@@ -3388,6 +3388,22 @@ THashMap<TString, TPragmaDescr> PragmaDescrs{
}
return TNodePtr{};
}),
+ TableElemExt("CostBasedOptimizerVersion", [](CB_SIG) -> TMaybe<TNodePtr> {
+ auto& ctx = query.Context();
+ if (values.size() == 1 && values[0].GetLiteral()) {
+ ui32 version;
+ if (!TryFromString(*values[0].GetLiteral(), version)) {
+ query.Error() << "Expected integer argument for: " << pragma;
+ return {};
+ }
+ const ui32 maxCBOVersion = 1;
+ if (version > maxCBOVersion) {
+ query.Error() << "Expected value <= " << maxCBOVersion << " for: " << pragma;
+ }
+ ctx.CostBasedOptimizerVersion = version;
+ }
+ return TNodePtr{};
+ }),
TableElemExt("DisableCompactNamedExprs", [](CB_SIG) -> TMaybe<TNodePtr> {
auto& ctx = query.Context();
if (!ctx.Warning(ctx.Pos(), TIssuesIds::YQL_DEPRECATED_PRAGMA, [](auto& out) {