Skip to content

Commit 4cff3b4

Browse files
authored
Support alter sequence (#4180)
1 parent 4c31460 commit 4cff3b4

14 files changed

+310
-24
lines changed

ydb/core/kqp/executer_actor/kqp_scheme_executer.cpp

+6
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,12 @@ class TKqpSchemeExecuter : public TActorBootstrapped<TKqpSchemeExecuter> {
265265
break;
266266
}
267267

268+
case NKqpProto::TKqpSchemeOperation::kAlterSequence: {
269+
const auto& modifyScheme = schemeOp.GetAlterSequence();
270+
ev->Record.MutableTransaction()->MutableModifyScheme()->CopyFrom(modifyScheme);
271+
break;
272+
}
273+
268274
default:
269275
InternalError(TStringBuilder() << "Unexpected scheme operation: "
270276
<< (ui32) schemeOp.GetOperationCase());

ydb/core/kqp/gateway/kqp_ic_gateway.cpp

+8
Original file line numberDiff line numberDiff line change
@@ -966,6 +966,14 @@ class TKikimrIcGateway : public IKqpGateway {
966966
return NotImplemented<TGenericResult>();
967967
}
968968

969+
TFuture<TGenericResult> AlterSequence(const TString& cluster,
970+
const NYql::TAlterSequenceSettings& settings, bool missingOk) override {
971+
Y_UNUSED(cluster);
972+
Y_UNUSED(settings);
973+
Y_UNUSED(missingOk);
974+
return NotImplemented<TGenericResult>();
975+
}
976+
969977
TFuture<TGenericResult> CreateTopic(const TString& cluster, Ydb::Topic::CreateTopicRequest&& request) override {
970978
try {
971979
if (!CheckCluster(cluster)) {

ydb/core/kqp/host/kqp_gateway_proxy.cpp

+77
Original file line numberDiff line numberDiff line change
@@ -1468,6 +1468,13 @@ class TKqpGatewayProxy : public IKikimrGateway {
14681468
const NYql::TDropSequenceSettings& settings, bool missingOk) override {
14691469
CHECK_PREPARED_DDL(DropSequence);
14701470

1471+
if (!SessionCtx->Config().EnableSequences) {
1472+
IKqpGateway::TGenericResult errResult;
1473+
errResult.AddIssue(NYql::TIssue("Sequences are not supported yet."));
1474+
errResult.SetStatus(NYql::YqlStatusFromYdbStatus(Ydb::StatusIds::UNSUPPORTED));
1475+
return MakeFuture(std::move(errResult));
1476+
}
1477+
14711478
try {
14721479
if (cluster != SessionCtx->GetCluster()) {
14731480
return MakeFuture(ResultFromError<TGenericResult>("Invalid cluster: " + cluster));
@@ -1507,6 +1514,76 @@ class TKqpGatewayProxy : public IKikimrGateway {
15071514
}
15081515
}
15091516

1517+
TFuture<TGenericResult> AlterSequence(const TString& cluster,
1518+
const TAlterSequenceSettings& settings, bool missingOk) override {
1519+
CHECK_PREPARED_DDL(AlterSequence);
1520+
1521+
if (!SessionCtx->Config().EnableSequences) {
1522+
IKqpGateway::TGenericResult errResult;
1523+
errResult.AddIssue(NYql::TIssue("Sequences are not supported yet."));
1524+
errResult.SetStatus(NYql::YqlStatusFromYdbStatus(Ydb::StatusIds::UNSUPPORTED));
1525+
return MakeFuture(std::move(errResult));
1526+
}
1527+
1528+
try {
1529+
1530+
if (cluster != SessionCtx->GetCluster()) {
1531+
return MakeFuture(ResultFromError<TGenericResult>("Invalid cluster: " + cluster));
1532+
}
1533+
1534+
std::pair<TString, TString> pathPair;
1535+
{
1536+
TString error;
1537+
if (!NSchemeHelpers::SplitTablePath(settings.Name, GetDatabase(), pathPair, error, false)) {
1538+
return MakeFuture(ResultFromError<TGenericResult>(error));
1539+
}
1540+
}
1541+
1542+
NKikimrSchemeOp::TModifyScheme schemeTx;
1543+
schemeTx.SetWorkingDir(pathPair.first);
1544+
schemeTx.SetOperationType(NKikimrSchemeOp::ESchemeOpAlterSequence);
1545+
schemeTx.SetSuccessOnNotExist(missingOk);
1546+
1547+
NKikimrSchemeOp::TSequenceDescription* seqDesc = schemeTx.MutableSequence();
1548+
seqDesc->SetName(pathPair.second);
1549+
1550+
if (settings.SequenceSettings.MinValue) {
1551+
seqDesc->SetMinValue(*settings.SequenceSettings.MinValue);
1552+
}
1553+
if (settings.SequenceSettings.MaxValue) {
1554+
seqDesc->SetMaxValue(*settings.SequenceSettings.MaxValue);
1555+
}
1556+
if (settings.SequenceSettings.Increment) {
1557+
seqDesc->SetIncrement(*settings.SequenceSettings.Increment);
1558+
}
1559+
if (settings.SequenceSettings.StartValue) {
1560+
seqDesc->SetStartValue(*settings.SequenceSettings.StartValue);
1561+
}
1562+
if (settings.SequenceSettings.Cache) {
1563+
seqDesc->SetCache(*settings.SequenceSettings.Cache);
1564+
}
1565+
if (settings.SequenceSettings.Cycle) {
1566+
seqDesc->SetCycle(*settings.SequenceSettings.Cycle);
1567+
}
1568+
1569+
if (IsPrepare()) {
1570+
auto& phyQuery = *SessionCtx->Query().PreparingQuery->MutablePhysicalQuery();
1571+
auto& phyTx = *phyQuery.AddTransactions();
1572+
phyTx.SetType(NKqpProto::TKqpPhyTx::TYPE_SCHEME);
1573+
phyTx.MutableSchemeOperation()->MutableAlterSequence()->Swap(&schemeTx);
1574+
1575+
TGenericResult result;
1576+
result.SetSuccess();
1577+
return MakeFuture(result);
1578+
} else {
1579+
return Gateway->ModifyScheme(std::move(schemeTx));
1580+
}
1581+
}
1582+
catch (yexception& e) {
1583+
return MakeFuture(ResultFromException<TGenericResult>(e));
1584+
}
1585+
}
1586+
15101587
TFuture<TGenericResult> CreateTableStore(const TString& cluster,
15111588
const TCreateTableStoreSettings& settings, bool existingOk) override
15121589
{

ydb/core/kqp/provider/yql_kikimr_datasink.cpp

+39-3
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,12 @@ class TKiSinkIntentDeterminationTransformer: public TKiSinkVisitorTransformer {
127127
return TStatus::Ok;
128128
}
129129

130+
TStatus HandleAlterSequence(NNodes::TKiAlterSequence node, TExprContext& ctx) override {
131+
Y_UNUSED(ctx);
132+
Y_UNUSED(node);
133+
return TStatus::Ok;
134+
}
135+
130136
TStatus HandleModifyPermissions(TKiModifyPermissions node, TExprContext& ctx) override {
131137
ctx.AddError(TIssue(ctx.GetPosition(node.Pos()), TStringBuilder()
132138
<< "ModifyPermissions is not yet implemented for intent determination transformer"));
@@ -515,7 +521,8 @@ class TKikimrDataSink : public TDataProviderBase
515521
}
516522

517523
if (node.IsCallable(TKiCreateSequence::CallableName())
518-
|| node.IsCallable(TKiDropSequence::CallableName())) {
524+
|| node.IsCallable(TKiDropSequence::CallableName())
525+
|| node.IsCallable(TKiAlterSequence::CallableName())) {
519526
return true;
520527
}
521528

@@ -707,15 +714,14 @@ class TKikimrDataSink : public TDataProviderBase
707714
const NCommon::TWriteSequenceSettings& settings, const TKikimrKey& key, TExprContext& ctx)
708715
{
709716
YQL_ENSURE(settings.Mode);
710-
auto mode = settings.Mode.Cast();
711717
if (node->Child(3)->Content() != "Void") {
712718
ctx.AddError(TIssue(ctx.GetPosition(node->Pos()), "Creating sequence with data is not supported."));
713719
return nullptr;
714720
}
715721

716722
auto valueType = settings.ValueType.IsValid()
717723
? settings.ValueType.Cast()
718-
: Build<TCoAtom>(ctx, node->Pos()).Value("bigint").Done();
724+
: Build<TCoAtom>(ctx, node->Pos()).Value("int8").Done();
719725

720726
auto temporary = settings.Temporary.IsValid()
721727
? settings.Temporary.Cast()
@@ -755,6 +761,30 @@ class TKikimrDataSink : public TDataProviderBase
755761
.Ptr();
756762
}
757763

764+
static TExprNode::TPtr MakeAlterSequence(const TExprNode::TPtr& node,
765+
const NCommon::TWriteSequenceSettings& settings, const TKikimrKey& key, TExprContext& ctx)
766+
{
767+
YQL_ENSURE(settings.Mode);
768+
bool missingOk = (settings.Mode.Cast().Value() == "alter_if_exists");
769+
770+
if (node->Child(3)->Content() != "Void") {
771+
ctx.AddError(TIssue(ctx.GetPosition(node->Pos()), "Alter sequence with data is not supported."));
772+
return nullptr;
773+
}
774+
775+
return Build<TKiAlterSequence>(ctx, node->Pos())
776+
.World(node->Child(0))
777+
.DataSink(node->Child(1))
778+
.Sequence().Build(key.GetPGObjectId())
779+
.SequenceSettings(settings.SequenceSettings.Cast())
780+
.Settings(settings.Other)
781+
.MissingOk<TCoAtom>()
782+
.Value(missingOk)
783+
.Build()
784+
.Done()
785+
.Ptr();
786+
}
787+
758788
bool RewriteIOExternal(const TKikimrKey& key, const TExprNode::TPtr& node, const TCoAtom& mode, TExprContext& ctx, TExprNode::TPtr& resultNode) {
759789
TKiDataSink dataSink(node->ChildPtr(1));
760790
auto& tableDesc = SessionCtx->Tables().GetTable(TString{dataSink.Cluster()}, key.GetTablePath());
@@ -1305,6 +1335,8 @@ class TKikimrDataSink : public TDataProviderBase
13051335
return MakeCreateSequence(node, settings, key, ctx);
13061336
} else if (mode == "drop" || mode == "drop_if_exists") {
13071337
return MakeDropSequence(node, settings, key, ctx);
1338+
} else if (mode == "alter" || mode == "alter_if_exists") {
1339+
return MakeAlterSequence(node, settings, key, ctx);
13081340
} else {
13091341
YQL_ENSURE(false, "unknown Sequence mode \"" << TString(mode) << "\"");
13101342
}
@@ -1544,6 +1576,10 @@ IGraphTransformer::TStatus TKiSinkVisitorTransformer::DoTransform(TExprNode::TPt
15441576
return HandleDropSequence(node.Cast(), ctx);
15451577
}
15461578

1579+
if (auto node = callable.Maybe<TKiAlterSequence>()) {
1580+
return HandleAlterSequence(node.Cast(), ctx);
1581+
}
1582+
15471583
ctx.AddError(TIssue(ctx.GetPosition(input->Pos()), TStringBuilder() << "(Kikimr DataSink) Unsupported function: "
15481584
<< callable.CallableName()));
15491585
return TStatus::Error;

ydb/core/kqp/provider/yql_kikimr_exec.cpp

+45-11
Original file line numberDiff line numberDiff line change
@@ -285,27 +285,33 @@ namespace {
285285
};
286286
}
287287

288-
TCreateSequenceSettings ParseCreateSequenceSettings(TKiCreateSequence createSequence) {
289-
TCreateSequenceSettings createSequenceSettings;
290-
createSequenceSettings.Name = TString(createSequence.Sequence());
291-
createSequenceSettings.Temporary = TString(createSequence.Temporary()) == "true" ? true : false;
292-
for (const auto& setting: createSequence.SequenceSettings()) {
288+
TSequenceSettings ParseSequenceSettings(const TCoNameValueTupleList& sequenceSettings) {
289+
TSequenceSettings result;
290+
for (const auto& setting: sequenceSettings) {
293291
auto name = setting.Name().Value();
294292
auto value = TString(setting.Value().template Cast<TCoAtom>().Value());
295293
if (name == "start") {
296-
createSequenceSettings.SequenceSettings.StartValue = FromString<i64>(value);
294+
result.StartValue = FromString<i64>(value);
297295
} else if (name == "maxvalue") {
298-
createSequenceSettings.SequenceSettings.MaxValue = FromString<i64>(value);
296+
result.MaxValue = FromString<i64>(value);
299297
} else if (name == "minvalue") {
300-
createSequenceSettings.SequenceSettings.MinValue = FromString<i64>(value);
298+
result.MinValue = FromString<i64>(value);
301299
} else if (name == "cache") {
302-
createSequenceSettings.SequenceSettings.Cache = FromString<ui64>(value);
300+
result.Cache = FromString<ui64>(value);
303301
} else if (name == "cycle") {
304-
createSequenceSettings.SequenceSettings.Cycle = value == "1" ? true : false;
302+
result.Cycle = value == "1" ? true : false;
305303
} else if (name == "increment") {
306-
createSequenceSettings.SequenceSettings.Increment = FromString<i64>(value);
304+
result.Increment = FromString<i64>(value);
307305
}
308306
}
307+
return result;
308+
}
309+
310+
TCreateSequenceSettings ParseCreateSequenceSettings(TKiCreateSequence createSequence) {
311+
TCreateSequenceSettings createSequenceSettings;
312+
createSequenceSettings.Name = TString(createSequence.Sequence());
313+
createSequenceSettings.Temporary = TString(createSequence.Temporary()) == "true" ? true : false;
314+
createSequenceSettings.SequenceSettings = ParseSequenceSettings(createSequence.SequenceSettings());
309315

310316
return createSequenceSettings;
311317
}
@@ -316,6 +322,14 @@ namespace {
316322
};
317323
}
318324

325+
TAlterSequenceSettings ParseAlterSequenceSettings(TKiAlterSequence alterSequence) {
326+
TAlterSequenceSettings alterSequenceSettings;
327+
alterSequenceSettings.Name = TString(alterSequence.Sequence());
328+
alterSequenceSettings.SequenceSettings = ParseSequenceSettings(alterSequence.SequenceSettings());
329+
330+
return alterSequenceSettings;
331+
}
332+
319333
[[nodiscard]] TString AddConsumerToTopicRequest(
320334
Ydb::Topic::Consumer* protoConsumer, const TCoTopicConsumer& consumer
321335
) {
@@ -1722,6 +1736,26 @@ class TKiSinkCallableExecutionTransformer : public TAsyncCallbackTransformer<TKi
17221736
}, "Executing DROP SEQUENCE");
17231737
}
17241738

1739+
if (auto maybeAlterSequence = TMaybeNode<TKiAlterSequence>(input)) {
1740+
auto requireStatus = RequireChild(*input, 0);
1741+
if (requireStatus.Level != TStatus::Ok) {
1742+
return SyncStatus(requireStatus);
1743+
}
1744+
1745+
auto cluster = TString(maybeAlterSequence.Cast().DataSink().Cluster());
1746+
TAlterSequenceSettings alterSequenceSettings = ParseAlterSequenceSettings(maybeAlterSequence.Cast());
1747+
bool missingOk = (maybeAlterSequence.MissingOk().Cast().Value() == "1");
1748+
1749+
auto future = Gateway->AlterSequence(cluster, alterSequenceSettings, missingOk);
1750+
1751+
return WrapFuture(future,
1752+
[](const IKikimrGateway::TGenericResult& res, const TExprNode::TPtr& input, TExprContext& ctx) {
1753+
Y_UNUSED(res);
1754+
auto resultNode = ctx.NewWorld(input->Pos());
1755+
return resultNode;
1756+
}, "Executing CREATE SEQUENCE");
1757+
}
1758+
17251759
if (auto maybeAlter = TMaybeNode<TKiAlterTopic>(input)) {
17261760
auto requireStatus = RequireChild(*input, 0);
17271761
if (requireStatus.Level != TStatus::Ok) {

ydb/core/kqp/provider/yql_kikimr_expr_nodes.json

+13
Original file line numberDiff line numberDiff line change
@@ -445,6 +445,19 @@
445445
{"Index": 4, "Name": "MissingOk", "Type": "TCoAtom"}
446446
]
447447
},
448+
{
449+
"Name": "TKiAlterSequence",
450+
"Base": "TCallable",
451+
"Match": {"Type": "Callable", "Name": "KiAlterSequence!"},
452+
"Children": [
453+
{"Index": 0, "Name": "World", "Type": "TExprBase"},
454+
{"Index": 1, "Name": "DataSink", "Type": "TKiDataSink"},
455+
{"Index": 2, "Name": "Sequence", "Type": "TCoAtom"},
456+
{"Index": 3, "Name": "SequenceSettings", "Type": "TCoNameValueTupleList"},
457+
{"Index": 4, "Name": "Settings", "Type": "TCoNameValueTupleList"},
458+
{"Index": 5, "Name": "MissingOk", "Type": "TCoAtom"}
459+
]
460+
},
448461
{
449462
"Name": "TKiCreateReplication",
450463
"Base": "TCallable",

ydb/core/kqp/provider/yql_kikimr_gateway.h

+7
Original file line numberDiff line numberDiff line change
@@ -678,6 +678,11 @@ struct TDropSequenceSettings {
678678
TString Name;
679679
};
680680

681+
struct TAlterSequenceSettings {
682+
TString Name;
683+
TSequenceSettings SequenceSettings;
684+
};
685+
681686
struct TAlterExternalTableSettings {
682687
TString ExternalTable;
683688
};
@@ -936,6 +941,8 @@ class IKikimrGateway : public TThrRefBase {
936941
const TCreateSequenceSettings& settings, bool existingOk) = 0;
937942
virtual NThreading::TFuture<TGenericResult> DropSequence(const TString& cluster,
938943
const TDropSequenceSettings& settings, bool missingOk) = 0;
944+
virtual NThreading::TFuture<TGenericResult> AlterSequence(const TString& cluster,
945+
const TAlterSequenceSettings& settings, bool missingOk) = 0;
939946

940947
virtual NThreading::TFuture<TGenericResult> CreateColumnTable(
941948
TKikimrTableMetadataPtr metadata, bool createDir, bool existingOk = false) = 0;

ydb/core/kqp/provider/yql_kikimr_provider.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ struct TKikimrData {
7070
DataSinkNames.insert(TKiReturningList::CallableName());
7171
DataSinkNames.insert(TKiCreateSequence::CallableName());
7272
DataSinkNames.insert(TKiDropSequence::CallableName());
73+
DataSinkNames.insert(TKiAlterSequence::CallableName());
7374

7475
CommitModes.insert(CommitModeFlush);
7576
CommitModes.insert(CommitModeRollback);

ydb/core/kqp/provider/yql_kikimr_provider_impl.h

+1
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ class TKiSinkVisitorTransformer : public TSyncTransformerBase {
6969

7070
virtual TStatus HandleCreateSequence(NNodes::TKiCreateSequence node, TExprContext& ctx) = 0;
7171
virtual TStatus HandleDropSequence(NNodes::TKiDropSequence node, TExprContext& ctx) = 0;
72+
virtual TStatus HandleAlterSequence(NNodes::TKiAlterSequence node, TExprContext& ctx) = 0;
7273

7374
virtual TStatus HandleModifyPermissions(NNodes::TKiModifyPermissions node, TExprContext& ctx) = 0;
7475

ydb/core/kqp/provider/yql_kikimr_type_ann.cpp

+17-2
Original file line numberDiff line numberDiff line change
@@ -1480,7 +1480,7 @@ virtual TStatus HandleCreateTable(TKiCreateTable create, TExprContext& ctx) over
14801480
return true;
14811481
}
14821482

1483-
static bool CheckCreateSequenceSettings(const TCoNameValueTupleList& settings, TExprContext& ctx) {
1483+
static bool CheckSequenceSettings(const TCoNameValueTupleList& settings, TExprContext& ctx) {
14841484
const static std::unordered_set<TString> sequenceSettingNames =
14851485
{"start", "increment", "cache", "minvalue", "maxvalue", "cycle"};
14861486
for (const auto& setting : settings) {
@@ -1509,7 +1509,7 @@ virtual TStatus HandleCreateTable(TKiCreateTable create, TExprContext& ctx) over
15091509
}
15101510

15111511
virtual TStatus HandleCreateSequence(TKiCreateSequence node, TExprContext& ctx) override {
1512-
if(!CheckCreateSequenceSettings(node.SequenceSettings(), ctx)) {
1512+
if(!CheckSequenceSettings(node.SequenceSettings(), ctx)) {
15131513
return TStatus::Error;
15141514
}
15151515

@@ -1548,6 +1548,21 @@ virtual TStatus HandleCreateTable(TKiCreateTable create, TExprContext& ctx) over
15481548
return TStatus::Ok;
15491549
}
15501550

1551+
virtual TStatus HandleAlterSequence(TKiAlterSequence node, TExprContext& ctx) override {
1552+
if(!CheckSequenceSettings(node.SequenceSettings(), ctx)) {
1553+
return TStatus::Error;
1554+
}
1555+
1556+
if (!node.Settings().Empty()) {
1557+
ctx.AddError(TIssue(ctx.GetPosition(node.Pos()), TStringBuilder()
1558+
<< "Unsupported sequence settings"));
1559+
return TStatus::Error;
1560+
}
1561+
1562+
node.Ptr()->SetTypeAnn(node.World().Ref().GetTypeAnn());
1563+
return TStatus::Ok;
1564+
}
1565+
15511566
virtual TStatus HandleAlterTopic(TKiAlterTopic node, TExprContext& ctx) override {
15521567
if (!CheckTopicSettings(node.Settings(), ctx)) {
15531568
return TStatus::Error;

0 commit comments

Comments
 (0)