aboutsummaryrefslogtreecommitdiffstats
path: root/yql/essentials/sql/v1/sql_translation.cpp
diff options
context:
space:
mode:
authorMaxim Yurchuk <maxim-yurchuk@ydb.tech>2024-11-22 11:56:33 +0000
committerGitHub <noreply@github.com>2024-11-22 11:56:33 +0000
commit15c910fd43eeda6a8bda8248f49535098843485e (patch)
treebbc563312f96145dc93d08893c0677a65529f8d4 /yql/essentials/sql/v1/sql_translation.cpp
parent36d42e52673b3cd4cd2e9ce8e0a7fa0c41f35e16 (diff)
parent7f465731d583429b39c34b3ac1fae617d6dba7fd (diff)
downloadydb-15c910fd43eeda6a8bda8248f49535098843485e.tar.gz
Merge pull request #11877 from ydb-platform/mergelibs-241122-0919
Library import 241122-0919
Diffstat (limited to 'yql/essentials/sql/v1/sql_translation.cpp')
-rw-r--r--yql/essentials/sql/v1/sql_translation.cpp65
1 files changed, 57 insertions, 8 deletions
diff --git a/yql/essentials/sql/v1/sql_translation.cpp b/yql/essentials/sql/v1/sql_translation.cpp
index b298eb8abb..61a273b260 100644
--- a/yql/essentials/sql/v1/sql_translation.cpp
+++ b/yql/essentials/sql/v1/sql_translation.cpp
@@ -1963,19 +1963,68 @@ namespace {
return true;
}
- bool StoreTtlSettings(const TRule_table_setting_value& from, TResetableSetting<TTtlSettings, void>& to,
- TSqlExpression& expr, TContext& ctx, TTranslation& txc) {
+ bool FillTieringInterval(const TRule_expr& from, TNodePtr& tieringInterval, TSqlExpression& expr, TContext& ctx) {
+ auto exprNode = expr.Build(from);
+ if (!exprNode) {
+ return false;
+ }
+
+ if (exprNode->GetOpName() != "Interval") {
+ ctx.Error() << "Literal of Interval type is expected for TTL";
+ return false;
+ }
+
+ tieringInterval = exprNode;
+ return true;
+ }
+
+ bool FillTierAction(const TRule_ttl_tier_action& from, std::optional<TIdentifier>& storageName, TTranslation& txc) {
+ switch (from.GetAltCase()) {
+ case TRule_ttl_tier_action::kAltTtlTierAction1:
+ storageName = IdEx(from.GetAlt_ttl_tier_action1().GetRule_an_id5(), txc);
+ break;
+ case TRule_ttl_tier_action::kAltTtlTierAction2:
+ storageName.reset();
+ break;
+ case TRule_ttl_tier_action::ALT_NOT_SET:
+ Y_ABORT("You should change implementation according to grammar changes");
+ }
+ return true;
+ }
+
+ bool StoreTtlSettings(const TRule_table_setting_value& from, TResetableSetting<TTtlSettings, void>& to, TSqlExpression& expr, TContext& ctx,
+ TTranslation& txc) {
switch (from.Alt_case()) {
case TRule_table_setting_value::kAltTableSettingValue5: {
auto columnName = IdEx(from.GetAlt_table_setting_value5().GetRule_an_id3(), txc);
- auto exprNode = expr.Build(from.GetAlt_table_setting_value5().GetRule_expr1());
- if (!exprNode) {
+ auto tiersLiteral = from.GetAlt_table_setting_value5().GetRule_ttl_tier_list1();
+
+ TNodePtr firstInterval;
+ if (!FillTieringInterval(tiersLiteral.GetRule_expr1(), firstInterval, expr, ctx)) {
return false;
}
- if (exprNode->GetOpName() != "Interval") {
- ctx.Error() << "Literal of Interval type is expected for TTL";
- return false;
+ std::vector<TTtlSettings::TTierSettings> tiers;
+ if (!tiersLiteral.HasBlock2()) {
+ tiers.emplace_back(firstInterval);
+ } else {
+ std::optional<TIdentifier> firstStorageName;
+ if (!FillTierAction(tiersLiteral.GetBlock2().GetRule_ttl_tier_action1(), firstStorageName, txc)) {
+ return false;
+ }
+ tiers.emplace_back(firstInterval, firstStorageName);
+
+ for (const auto& tierLiteral : tiersLiteral.GetBlock2().GetBlock2()) {
+ TNodePtr intervalExpr;
+ if (!FillTieringInterval(tierLiteral.GetRule_expr2(), intervalExpr, expr, ctx)) {
+ return false;
+ }
+ std::optional<TIdentifier> storageName;
+ if (!FillTierAction(tierLiteral.GetRule_ttl_tier_action3(), storageName, txc)) {
+ return false;
+ }
+ tiers.emplace_back(intervalExpr, storageName);
+ }
}
TMaybe<TTtlSettings::EUnit> columnUnit;
@@ -1988,7 +2037,7 @@ namespace {
}
}
- to.Set(TTtlSettings(columnName, exprNode, columnUnit));
+ to.Set(TTtlSettings(columnName, tiers, columnUnit));
break;
}
default: