aboutsummaryrefslogtreecommitdiffstats
path: root/yql/essentials/sql/v1/sql_query.cpp
diff options
context:
space:
mode:
authorshumkovnd <shumkovnd@yandex-team.com>2024-11-21 22:29:26 +0300
committershumkovnd <shumkovnd@yandex-team.com>2024-11-21 22:51:14 +0300
commit74e7baa2f49d69b2f0385db557749750b6121a20 (patch)
tree6e7f4732613e61769184fa4aeaca53dc8913c761 /yql/essentials/sql/v1/sql_query.cpp
parent56de0f56882d2401ca734478ff95d91878e5bdbd (diff)
downloadydb-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.cpp101
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());