diff options
author | shumkovnd <shumkovnd@yandex-team.com> | 2024-11-21 22:29:26 +0300 |
---|---|---|
committer | shumkovnd <shumkovnd@yandex-team.com> | 2024-11-21 22:51:14 +0300 |
commit | 74e7baa2f49d69b2f0385db557749750b6121a20 (patch) | |
tree | 6e7f4732613e61769184fa4aeaca53dc8913c761 /yql/essentials/sql/v1/sql_query.cpp | |
parent | 56de0f56882d2401ca734478ff95d91878e5bdbd (diff) | |
download | ydb-74e7baa2f49d69b2f0385db557749750b6121a20.tar.gz |
Support ALTER SEQUENCE command
<https://github.com/ydb-platform/ydb/issues/11763>
commit_hash:5611cbe2f0e09543749e9866c5db8d427649e754
Diffstat (limited to 'yql/essentials/sql/v1/sql_query.cpp')
-rw-r--r-- | yql/essentials/sql/v1/sql_query.cpp | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/yql/essentials/sql/v1/sql_query.cpp b/yql/essentials/sql/v1/sql_query.cpp index 5f2f31d776..4d9f30a452 100644 --- a/yql/essentials/sql/v1/sql_query.cpp +++ b/yql/essentials/sql/v1/sql_query.cpp @@ -1674,6 +1674,50 @@ bool TSqlQuery::Statement(TVector<TNodePtr>& blocks, const TRule_sql_stmt_core& context)); break; } + case TRule_sql_stmt_core::kAltSqlStmtCore57: { + // alter_sequence_stmt: ALTER SEQUENCE (IF EXISTS)? object_ref alter_sequence_action (COMMA alter_sequence_action)*; + Ctx.BodyPart(); + auto& node = core.GetAlt_sql_stmt_core57().GetRule_alter_sequence_stmt1(); + + Ctx.Token(node.GetToken1()); + const TPosition pos = Ctx.Pos(); + + TString service = Ctx.Scoped->CurrService; + TDeferredAtom cluster = Ctx.Scoped->CurrCluster; + if (cluster.Empty()) { + Error() << "USE statement is missing - no default cluster is selected"; + return false; + } + TObjectOperatorContext context(Ctx.Scoped); + + if (node.GetRule_object_ref4().HasBlock1()) { + if (!ClusterExpr(node.GetRule_object_ref4().GetBlock1().GetRule_cluster_expr1(), + false, context.ServiceId, context.Cluster)) { + return false; + } + } + + const TString id = Id(node.GetRule_object_ref4().GetRule_id_or_at2(), *this).second; + + TSequenceParameters params; + + if (node.HasBlock3()) { // IF EXISTS + params.MissingOk = true; + Y_DEBUG_ABORT_UNLESS( + IS_TOKEN(node.GetBlock3().GetToken1().GetId(), IF) && + IS_TOKEN(node.GetBlock3().GetToken2().GetId(), EXISTS) + ); + } + + for (const auto& block : node.GetBlock5()) { + if (!AlterSequenceAction(block.GetRule_alter_sequence_action1(), params)) { + return false; + } + } + + AddStatementToBlocks(blocks, BuildAlterSequence(pos, service, cluster, id, params, Ctx.Scoped)); + break; + } case TRule_sql_stmt_core::ALT_NOT_SET: Ctx.IncrementMonCounter("sql_errors", "UnknownStatement" + internalStatementName); AltNotImplemented("sql_stmt_core", core); @@ -2177,6 +2221,63 @@ bool TSqlQuery::AlterTableAlterIndex(const TRule_alter_table_alter_index& node, return true; } +bool TSqlQuery::AlterSequenceAction(const TRule_alter_sequence_action& node, TSequenceParameters& params) { + switch (node.Alt_case()) { + case TRule_alter_sequence_action::kAltAlterSequenceAction1: { + if (params.StartValue) { + Ctx.Error(Ctx.Pos()) << "Start value defined more than once"; + return false; + } + auto literalNumber = LiteralNumber(Ctx, node.GetAlt_alter_sequence_action1().GetRule_integer3()); + if (literalNumber) { + params.StartValue = TDeferredAtom(literalNumber, Ctx); + } else { + return false; + } + break; + } + case TRule_alter_sequence_action::kAltAlterSequenceAction2: { + if (params.IsRestart) { + Ctx.Error(Ctx.Pos()) << "Restart value defined more than once"; + return false; + } + auto literalNumber = LiteralNumber(Ctx, node.GetAlt_alter_sequence_action2().GetRule_integer3()); + if (literalNumber) { + params.IsRestart = true; + params.RestartValue = TDeferredAtom(literalNumber, Ctx); + } else { + return false; + } + break; + } + case TRule_alter_sequence_action::kAltAlterSequenceAction3: { + if (params.IsRestart) { + Ctx.Error(Ctx.Pos()) << "Restart value defined more than once"; + return false; + } + params.IsRestart = true; + break; + } + case TRule_alter_sequence_action::kAltAlterSequenceAction4: { + if (params.Increment) { + Ctx.Error(Ctx.Pos()) << "Increment defined more than once"; + return false; + } + auto literalNumber = LiteralNumber(Ctx, node.GetAlt_alter_sequence_action4().GetRule_integer3()); + if (literalNumber) { + params.Increment = TDeferredAtom(literalNumber, Ctx); + } else { + return false; + } + break; + } + case TRule_alter_sequence_action::ALT_NOT_SET: + Y_ABORT("You should change implementation according to grammar changes"); + } + + return true; +} + bool TSqlQuery::AlterTableAlterColumnDropNotNull(const TRule_alter_table_alter_column_drop_not_null& node, TAlterTableParameters& params) { TString name = Id(node.GetRule_an_id3(), *this); const TPosition pos(Context().Pos()); |