Skip to content

Commit d299ffe

Browse files
authored
Support alter sequence in yql (#12413)
1 parent d8e21cd commit d299ffe

File tree

6 files changed

+310
-1
lines changed

6 files changed

+310
-1
lines changed

ydb/core/kqp/provider/yql_kikimr_datasink.cpp

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -391,6 +391,8 @@ class TKiSinkIntentDeterminationTransformer: public TKiSinkVisitorTransformer {
391391
return TStatus::Ok;
392392
case TKikimrKey::Type::BackupCollection:
393393
return TStatus::Ok;
394+
case TKikimrKey::Type::Sequence:
395+
return TStatus::Ok;
394396
}
395397

396398
ctx.AddError(TIssue(ctx.GetPosition(node.Pos()), "Invalid table key type."));
@@ -845,10 +847,21 @@ class TKikimrDataSink : public TDataProviderBase
845847
? settings.ValueType.Cast()
846848
: Build<TCoAtom>(ctx, node->Pos()).Value("Null").Done();
847849

850+
TString sequence;
851+
852+
if (key.GetKeyType() == TKikimrKey::Type::Sequence) {
853+
sequence = key.GetSequencePath();
854+
} else if (key.GetKeyType() == TKikimrKey::Type::PGObject) {
855+
sequence = key.GetPGObjectId();
856+
} else {
857+
YQL_ENSURE(false, "Invalid key type for sequence");
858+
}
859+
860+
848861
return Build<TKiAlterSequence>(ctx, node->Pos())
849862
.World(node->Child(0))
850863
.DataSink(node->Child(1))
851-
.Sequence().Build(key.GetPGObjectId())
864+
.Sequence().Build(sequence)
852865
.ValueType(valueType)
853866
.SequenceSettings(settings.SequenceSettings.Cast())
854867
.Settings(settings.Other)
@@ -1267,6 +1280,21 @@ class TKikimrDataSink : public TDataProviderBase
12671280
}
12681281
break;
12691282
}
1283+
case TKikimrKey::Type::Sequence: {
1284+
NCommon::TWriteSequenceSettings settings = NCommon::ParseSequenceSettings(TExprList(node->Child(4)), ctx);
1285+
1286+
YQL_ENSURE(settings.Mode);
1287+
auto mode = settings.Mode.Cast();
1288+
1289+
if (mode == "alter" || mode == "alter_if_exists") {
1290+
return MakeAlterSequence(node, settings, key, ctx);
1291+
} else {
1292+
ctx.AddError(TIssue(ctx.GetPosition(node->Pos()), "Unknown operation type for sequence"));
1293+
return nullptr;
1294+
}
1295+
1296+
break;
1297+
}
12701298
case TKikimrKey::Type::Object:
12711299
{
12721300
NCommon::TWriteObjectSettings settings = NCommon::ParseWriteObjectSettings(TExprList(node->Child(4)), ctx);

ydb/core/kqp/provider/yql_kikimr_datasource.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,8 @@ class TKiSourceIntentDeterminationTransformer: public TKiSourceVisitorTransforme
166166
return TStatus::Ok;
167167
case TKikimrKey::Type::BackupCollection:
168168
return TStatus::Ok;
169+
case TKikimrKey::Type::Sequence:
170+
return TStatus::Ok;
169171
}
170172

171173
return TStatus::Error;

ydb/core/kqp/provider/yql_kikimr_provider.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -440,6 +440,9 @@ bool TKikimrKey::Extract(const TExprNode& key) {
440440
} else if(tagName == "permission") {
441441
KeyType = Type::Permission;
442442
Target = key.Child(0)->Child(1)->Child(0)->Content();
443+
} else if (tagName == "sequence") {
444+
KeyType = Type::Sequence;
445+
Target = key.Child(0)->Child(1)->Child(0)->Content();
443446
} else if (tagName == "pgObject") {
444447
KeyType = Type::PGObject;
445448
Target = key.Child(0)->Child(1)->Child(0)->Content();

ydb/core/kqp/provider/yql_kikimr_provider_impl.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ class TKikimrKey {
9797
PGObject,
9898
Replication,
9999
BackupCollection,
100+
Sequence,
100101
};
101102

102103
struct TViewDescription {
@@ -130,6 +131,12 @@ class TKikimrKey {
130131
return Target;
131132
}
132133

134+
TString GetSequencePath() const {
135+
Y_DEBUG_ABORT_UNLESS(KeyType.Defined());
136+
Y_DEBUG_ABORT_UNLESS(KeyType == Type::Sequence);
137+
return Target;
138+
}
139+
133140
TString GetReplicationPath() const {
134141
Y_DEBUG_ABORT_UNLESS(KeyType.Defined());
135142
Y_DEBUG_ABORT_UNLESS(KeyType == Type::Replication);

ydb/core/kqp/provider/yql_kikimr_type_ann.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,10 @@ class TKiSourceTypeAnnotationTransformer : public TKiSourceVisitorTransformer {
227227
{
228228
return TStatus::Ok;
229229
}
230+
case TKikimrKey::Type::Sequence:
231+
{
232+
return TStatus::Ok;
233+
}
230234
}
231235

232236
return TStatus::Error;

ydb/core/kqp/ut/scheme/kqp_scheme_ut.cpp

Lines changed: 265 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5511,6 +5511,271 @@ Y_UNIT_TEST_SUITE(KqpScheme) {
55115511
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString());
55125512
}
55135513

5514+
Y_UNIT_TEST(AlterSequence) {
5515+
TKikimrSettings runnerSettings;
5516+
runnerSettings.WithSampleTables = false;
5517+
TKikimrRunner kikimr(runnerSettings);
5518+
auto client = kikimr.GetQueryClient();
5519+
5520+
TString tableName = "/Root/TableTest";
5521+
5522+
{
5523+
auto session = client.GetSession().GetValueSync().GetSession();
5524+
auto id = session.GetId();
5525+
5526+
auto query = TStringBuilder() << R"(
5527+
--!syntax_v1
5528+
CREATE TABLE `)" << tableName << R"(` (
5529+
Key Serial,
5530+
Value String,
5531+
PRIMARY KEY (Key)
5532+
);
5533+
)";
5534+
5535+
auto result = session.ExecuteQuery(query, NYdb::NQuery::TTxControl::NoTx()).ExtractValueSync();
5536+
UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
5537+
}
5538+
5539+
TString sequencePath = "/Root/TableTest/_serial_column_Key";
5540+
5541+
{
5542+
auto session = client.GetSession().GetValueSync().GetSession();
5543+
auto id = session.GetId();
5544+
5545+
auto query = TStringBuilder() << R"(
5546+
--!syntax_v1
5547+
ALTER SEQUENCE IF EXISTS `)" << sequencePath << R"(`
5548+
START WITH 50
5549+
INCREMENT BY 11;
5550+
)";
5551+
5552+
auto result = session.ExecuteQuery(query, NYdb::NQuery::TTxControl::NoTx()).ExtractValueSync();
5553+
UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
5554+
}
5555+
5556+
{
5557+
auto runtime = kikimr.GetTestServer().GetRuntime();
5558+
TActorId sender = runtime->AllocateEdgeActor();
5559+
auto describeResult = DescribeTable(&kikimr.GetTestServer(), sender, sequencePath);
5560+
UNIT_ASSERT_VALUES_EQUAL(describeResult.GetStatus(), NKikimrScheme::StatusSuccess);
5561+
auto& sequenceDescription = describeResult.GetPathDescription().GetSequenceDescription();
5562+
UNIT_ASSERT_VALUES_EQUAL(sequenceDescription.GetName(), "_serial_column_Key");
5563+
UNIT_ASSERT_VALUES_EQUAL(sequenceDescription.GetMinValue(), 1);
5564+
UNIT_ASSERT_VALUES_EQUAL(sequenceDescription.GetMaxValue(), 9223372036854775807);
5565+
UNIT_ASSERT_VALUES_EQUAL(sequenceDescription.GetStartValue(), 50);
5566+
UNIT_ASSERT_VALUES_EQUAL(sequenceDescription.GetCache(), 1);
5567+
UNIT_ASSERT_VALUES_EQUAL(sequenceDescription.GetIncrement(), 11);
5568+
UNIT_ASSERT_VALUES_EQUAL(sequenceDescription.GetCycle(), false);
5569+
UNIT_ASSERT_VALUES_EQUAL(sequenceDescription.GetDataType(), "Int64");
5570+
}
5571+
5572+
{
5573+
auto session = client.GetSession().GetValueSync().GetSession();
5574+
auto id = session.GetId();
5575+
5576+
auto query = TStringBuilder() << R"(
5577+
--!syntax_v1
5578+
ALTER SEQUENCE IF EXISTS `)" << sequencePath << R"(`
5579+
RESTART WITH 1000;
5580+
)";
5581+
5582+
auto result = session.ExecuteQuery(query, NYdb::NQuery::TTxControl::NoTx()).ExtractValueSync();
5583+
UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
5584+
}
5585+
5586+
{
5587+
auto session = client.GetSession().GetValueSync().GetSession();
5588+
auto id = session.GetId();
5589+
5590+
auto query = TStringBuilder() << R"(
5591+
--!syntax_v1
5592+
ALTER SEQUENCE IF EXISTS `/Root/seq`
5593+
RESTART WITH 1000;
5594+
)";
5595+
5596+
auto result = session.ExecuteQuery(query, NYdb::NQuery::TTxControl::NoTx()).ExtractValueSync();
5597+
UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
5598+
}
5599+
5600+
{
5601+
auto session = client.GetSession().GetValueSync().GetSession();
5602+
auto id = session.GetId();
5603+
5604+
auto query = TStringBuilder() << R"(
5605+
--!syntax_v1
5606+
ALTER SEQUENCE `/Root/seq`
5607+
START WITH 2000;
5608+
)";
5609+
5610+
auto result = session.ExecuteQuery(query, NYdb::NQuery::TTxControl::NoTx()).ExtractValueSync();
5611+
UNIT_ASSERT(!result.IsSuccess());
5612+
}
5613+
}
5614+
5615+
Y_UNIT_TEST(AlterSequenceRestartWith) {
5616+
TKikimrSettings runnerSettings;
5617+
runnerSettings.WithSampleTables = false;
5618+
TKikimrRunner kikimr(runnerSettings);
5619+
auto client = kikimr.GetQueryClient();
5620+
5621+
TString tableName = "/Root/TableTest";
5622+
5623+
auto session = client.GetSession().GetValueSync().GetSession();
5624+
5625+
auto tableClient = kikimr.GetTableClient();
5626+
auto tableClientSession = tableClient.CreateSession().GetValueSync().GetSession();
5627+
5628+
{
5629+
auto query = TStringBuilder() << R"(
5630+
--!syntax_v1
5631+
CREATE TABLE `)" << tableName << R"(` (
5632+
Key Int64,
5633+
Value Serial,
5634+
PRIMARY KEY (Key)
5635+
);
5636+
)";
5637+
5638+
auto result = session.ExecuteQuery(query, NYdb::NQuery::TTxControl::NoTx()).ExtractValueSync();
5639+
UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
5640+
}
5641+
5642+
{
5643+
const auto query = TStringBuilder() << R"(
5644+
--!syntax_v1
5645+
INSERT INTO `)" << tableName << R"(` (Key, Value) VALUES (1, 1);
5646+
)";
5647+
5648+
auto result = tableClientSession.ExecuteDataQuery(query, TTxControl::BeginTx().CommitTx()).ExtractValueSync();
5649+
UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
5650+
}
5651+
5652+
{
5653+
const auto query = TStringBuilder() << R"(
5654+
--!syntax_v1
5655+
SELECT * FROM `)" << tableName << R"(`;
5656+
)";
5657+
5658+
auto result = tableClientSession.ExecuteDataQuery(query, TTxControl::BeginTx().CommitTx()).ExtractValueSync();
5659+
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString());
5660+
5661+
UNIT_ASSERT_C(!result.GetResultSets().empty(), "results are empty");
5662+
CompareYson(R"(
5663+
[[[1];1]]
5664+
)", FormatResultSetYson(result.GetResultSet(0)));
5665+
}
5666+
5667+
{
5668+
const auto query = TStringBuilder() << R"(
5669+
--!syntax_v1
5670+
INSERT INTO `)" << tableName << R"(` (Key) VALUES (2), (3);
5671+
)";
5672+
5673+
auto result = tableClientSession.ExecuteDataQuery(query, TTxControl::BeginTx().CommitTx()).ExtractValueSync();
5674+
UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
5675+
}
5676+
5677+
{
5678+
const auto query = TStringBuilder() << R"(
5679+
--!syntax_v1
5680+
SELECT * FROM `)" << tableName << R"(`;
5681+
)";
5682+
5683+
auto result = tableClientSession.ExecuteDataQuery(query, TTxControl::BeginTx().CommitTx()).ExtractValueSync();
5684+
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString());
5685+
5686+
UNIT_ASSERT_C(!result.GetResultSets().empty(), "results are empty");
5687+
CompareYson(R"(
5688+
[[[1];1];[[2];1];[[3];2]]
5689+
)", FormatResultSetYson(result.GetResultSet(0)));
5690+
}
5691+
5692+
TString sequencePath = "/Root/TableTest/_serial_column_Value";
5693+
5694+
{
5695+
const auto queryAlter = TStringBuilder() << R"(
5696+
--!syntax_v1
5697+
ALTER SEQUENCE IF EXISTS `)" << sequencePath << R"(`
5698+
RESTART 105
5699+
INCREMENT 2;
5700+
)";
5701+
5702+
auto resultAlter = session.ExecuteQuery(queryAlter, NYdb::NQuery::TTxControl::NoTx()).ExtractValueSync();
5703+
UNIT_ASSERT_C(resultAlter.IsSuccess(), resultAlter.GetIssues().ToString());
5704+
}
5705+
5706+
{
5707+
const auto query = TStringBuilder() << R"(
5708+
--!syntax_v1
5709+
INSERT INTO `)" << tableName << R"(` (Key) VALUES (105), (107);
5710+
)";
5711+
5712+
auto result = tableClientSession.ExecuteDataQuery(query, TTxControl::BeginTx().CommitTx()).ExtractValueSync();
5713+
UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
5714+
}
5715+
5716+
{
5717+
const auto query = TStringBuilder() << R"(
5718+
--!syntax_v1
5719+
SELECT * FROM `)" << tableName << R"(`;
5720+
)";
5721+
5722+
auto result = tableClientSession.ExecuteDataQuery(query, TTxControl::BeginTx().CommitTx()).ExtractValueSync();
5723+
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString());
5724+
5725+
UNIT_ASSERT_C(!result.GetResultSets().empty(), "results are empty");
5726+
CompareYson(R"(
5727+
[[[1];1];[[2];1];[[3];2];[[105];105];[[107];107]]
5728+
)", FormatResultSetYson(result.GetResultSet(0)));
5729+
}
5730+
5731+
{
5732+
const auto queryAlter = TStringBuilder() << R"(
5733+
--!syntax_v1
5734+
ALTER SEQUENCE IF EXISTS `)" << sequencePath << R"(`
5735+
START 206;
5736+
)";
5737+
5738+
auto resultAlter = session.ExecuteQuery(queryAlter, NYdb::NQuery::TTxControl::NoTx()).ExtractValueSync();
5739+
UNIT_ASSERT_C(resultAlter.IsSuccess(), resultAlter.GetIssues().ToString());
5740+
}
5741+
5742+
{
5743+
const auto queryAlter = TStringBuilder() << R"(
5744+
--!syntax_v1
5745+
ALTER SEQUENCE IF EXISTS `)" << sequencePath << R"(`
5746+
RESTART;
5747+
)";
5748+
5749+
auto resultAlter = session.ExecuteQuery(queryAlter, NYdb::NQuery::TTxControl::NoTx()).ExtractValueSync();
5750+
UNIT_ASSERT_C(resultAlter.IsSuccess(), resultAlter.GetIssues().ToString());
5751+
}
5752+
5753+
{
5754+
const auto query = TStringBuilder() << R"(
5755+
--!syntax_v1
5756+
INSERT INTO `)" << tableName << R"(` (Key) VALUES (206), (208);
5757+
)";
5758+
5759+
auto result = tableClientSession.ExecuteDataQuery(query, TTxControl::BeginTx().CommitTx()).ExtractValueSync();
5760+
UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
5761+
}
5762+
5763+
{
5764+
const auto query = TStringBuilder() << R"(
5765+
--!syntax_v1
5766+
SELECT * FROM `)" << tableName << R"(`;
5767+
)";
5768+
5769+
auto result = tableClientSession.ExecuteDataQuery(query, TTxControl::BeginTx().CommitTx()).ExtractValueSync();
5770+
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString());
5771+
5772+
UNIT_ASSERT_C(!result.GetResultSets().empty(), "results are empty");
5773+
CompareYson(R"(
5774+
[[[1];1];[[2];1];[[3];2];[[105];105];[[107];107];[[206];206];[[208];208]]
5775+
)", FormatResultSetYson(result.GetResultSet(0)));
5776+
}
5777+
}
5778+
55145779
Y_UNIT_TEST(Int8Int16) {
55155780
TKikimrRunner kikimr;
55165781

0 commit comments

Comments
 (0)