Skip to content

Commit 74e7baa

Browse files
committed
Support ALTER SEQUENCE command
<#11763> commit_hash:5611cbe2f0e09543749e9866c5db8d427649e754
1 parent 56de0f5 commit 74e7baa

File tree

12 files changed

+584
-14
lines changed

12 files changed

+584
-14
lines changed

yql/essentials/sql/v1/SQLv1.g.in

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ sql_stmt_core:
7575
| drop_resource_pool_classifier_stmt
7676
| backup_stmt
7777
| restore_stmt
78+
| alter_sequence_stmt
7879
;
7980

8081
expr:
@@ -1054,6 +1055,14 @@ analyze_table: simple_table_ref (LPAREN column_list RPAREN)?;
10541055
analyze_table_list: analyze_table (COMMA analyze_table)* COMMA?;
10551056
analyze_stmt: ANALYZE analyze_table_list;
10561057

1058+
alter_sequence_stmt: ALTER SEQUENCE (IF EXISTS)? object_ref alter_sequence_action+;
1059+
alter_sequence_action:
1060+
START WITH? integer
1061+
| RESTART WITH? integer
1062+
| RESTART
1063+
| INCREMENT BY? integer
1064+
;
1065+
10571066
// Special rules that allow to use certain keywords as identifiers.
10581067
identifier: ID_PLAIN | ID_QUOTED;
10591068
id: identifier | keyword;
@@ -1339,6 +1348,7 @@ keyword_as_compat:
13391348
| IMMEDIATE
13401349
| IMPORT
13411350
| IN
1351+
| INCREMENT
13421352
| INCREMENTAL
13431353
| INDEX
13441354
| INDEXED
@@ -1413,6 +1423,7 @@ keyword_as_compat:
14131423
| REPLICATION
14141424
| RESET
14151425
| RESPECT
1426+
| RESTART
14161427
| RESTORE
14171428
| RESTRICT
14181429
// | RESULT
@@ -1430,7 +1441,9 @@ keyword_as_compat:
14301441
| SETS
14311442
| SHOW
14321443
| SKIP
1444+
| SEQUENCE
14331445
| SOURCE
1446+
| START
14341447
| SUBQUERY
14351448
| SUBSET
14361449
| SYMBOLS
@@ -1557,6 +1570,7 @@ keyword_compat: (
15571570
| IMMEDIATE
15581571
| IMPORT
15591572
| IN
1573+
| INCREMENT
15601574
| INCREMENTAL
15611575
| INDEX
15621576
| INDEXED
@@ -1631,6 +1645,7 @@ keyword_compat: (
16311645
| REPLICATION
16321646
| RESET
16331647
| RESPECT
1648+
| RESTART
16341649
| RESTORE
16351650
| RESTRICT
16361651
| RESULT
@@ -1648,7 +1663,9 @@ keyword_compat: (
16481663
| SETS
16491664
| SHOW
16501665
| SKIP
1666+
| SEQUENCE
16511667
| SOURCE
1668+
| START
16521669
| SUBQUERY
16531670
| SUBSET
16541671
| SYMBOLS
@@ -1903,6 +1920,7 @@ ILIKE: I L I K E;
19031920
IMMEDIATE: I M M E D I A T E;
19041921
IMPORT: I M P O R T;
19051922
IN: I N;
1923+
INCREMENT: I N C R E M E N T;
19061924
INCREMENTAL: I N C R E M E N T A L;
19071925
INDEX: I N D E X;
19081926
INDEXED: I N D E X E D;
@@ -1992,6 +2010,7 @@ REPLICATION: R E P L I C A T I O N;
19922010
RESET: R E S E T;
19932011
RESOURCE: R E S O U R C E;
19942012
RESPECT: R E S P E C T;
2013+
RESTART: R E S T A R T;
19952014
RESTORE: R E S T O R E;
19962015
RESTRICT: R E S T R I C T;
19972016
RESULT: R E S U L T;
@@ -2016,7 +2035,9 @@ SET: S E T;
20162035
SETS: S E T S;
20172036
SHOW: S H O W;
20182037
SKIP: S K I P;
2038+
SEQUENCE: S E Q U E N C E;
20192039
SOURCE: S O U R C E;
2040+
START: S T A R T;
20202041
STREAM: S T R E A M;
20212042
STRUCT: S T R U C T;
20222043
SUBQUERY: S U B Q U E R Y;

yql/essentials/sql/v1/SQLv1Antlr4.g.in

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ sql_stmt_core:
7474
| drop_resource_pool_classifier_stmt
7575
| backup_stmt
7676
| restore_stmt
77+
| alter_sequence_stmt
7778
;
7879

7980
expr:
@@ -1053,6 +1054,14 @@ analyze_table: simple_table_ref (LPAREN column_list RPAREN)?;
10531054
analyze_table_list: analyze_table (COMMA analyze_table)* COMMA?;
10541055
analyze_stmt: ANALYZE analyze_table_list;
10551056

1057+
alter_sequence_stmt: ALTER SEQUENCE (IF EXISTS)? object_ref alter_sequence_action+;
1058+
alter_sequence_action:
1059+
START WITH? integer
1060+
| RESTART WITH? integer
1061+
| RESTART
1062+
| INCREMENT BY? integer
1063+
;
1064+
10561065
// Special rules that allow to use certain keywords as identifiers.
10571066
identifier: ID_PLAIN | ID_QUOTED;
10581067
id: identifier | keyword;
@@ -1338,6 +1347,7 @@ keyword_as_compat:
13381347
| IMMEDIATE
13391348
| IMPORT
13401349
| IN
1350+
| INCREMENT
13411351
| INCREMENTAL
13421352
| INDEX
13431353
| INDEXED
@@ -1412,6 +1422,7 @@ keyword_as_compat:
14121422
| REPLICATION
14131423
| RESET
14141424
| RESPECT
1425+
| RESTART
14151426
| RESTORE
14161427
| RESTRICT
14171428
// | RESULT
@@ -1429,7 +1440,9 @@ keyword_as_compat:
14291440
| SETS
14301441
| SHOW
14311442
| TSKIP
1443+
| SEQUENCE
14321444
| SOURCE
1445+
| START
14331446
| SUBQUERY
14341447
| SUBSET
14351448
| SYMBOLS
@@ -1556,6 +1569,7 @@ keyword_compat: (
15561569
| IMMEDIATE
15571570
| IMPORT
15581571
| IN
1572+
| INCREMENT
15591573
| INCREMENTAL
15601574
| INDEX
15611575
| INDEXED
@@ -1630,6 +1644,7 @@ keyword_compat: (
16301644
| REPLICATION
16311645
| RESET
16321646
| RESPECT
1647+
| RESTART
16331648
| RESTORE
16341649
| RESTRICT
16351650
| RESULT
@@ -1647,7 +1662,9 @@ keyword_compat: (
16471662
| SETS
16481663
| SHOW
16491664
| TSKIP
1665+
| SEQUENCE
16501666
| SOURCE
1667+
| START
16511668
| SUBQUERY
16521669
| SUBSET
16531670
| SYMBOLS
@@ -1902,6 +1919,7 @@ ILIKE: I L I K E;
19021919
IMMEDIATE: I M M E D I A T E;
19031920
IMPORT: I M P O R T;
19041921
IN: I N;
1922+
INCREMENT: I N C R E M E N T;
19051923
INCREMENTAL: I N C R E M E N T A L;
19061924
INDEX: I N D E X;
19071925
INDEXED: I N D E X E D;
@@ -1991,6 +2009,7 @@ REPLICATION: R E P L I C A T I O N;
19912009
RESET: R E S E T;
19922010
RESOURCE: R E S O U R C E;
19932011
RESPECT: R E S P E C T;
2012+
RESTART: R E S T A R T;
19942013
RESTORE: R E S T O R E;
19952014
RESTRICT: R E S T R I C T;
19962015
RESULT: R E S U L T;
@@ -2015,7 +2034,9 @@ SET: S E T;
20152034
SETS: S E T S;
20162035
SHOW: S H O W;
20172036
TSKIP: S K I P;
2037+
SEQUENCE: S E Q U E N C E;
20182038
SOURCE: S O U R C E;
2039+
START: S T A R T;
20192040
STREAM: S T R E A M;
20202041
STRUCT: S T R U C T;
20212042
SUBQUERY: S U B Q U E R Y;

yql/essentials/sql/v1/format/sql_format.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -962,6 +962,12 @@ friend struct TStaticData;
962962
VisitAllFields(TRule_use_stmt::GetDescriptor(), msg);
963963
}
964964

965+
void VisitAlterSequence(const TRule_alter_sequence_stmt& msg) {
966+
PosFromToken(msg.GetToken1());
967+
NewLine();
968+
VisitAllFields(TRule_alter_sequence_stmt::GetDescriptor(), msg);
969+
}
970+
965971
void VisitIntoTable(const TRule_into_table_stmt& msg) {
966972
switch (msg.GetBlock1().Alt_case()) {
967973
case TRule_into_table_stmt_TBlock1::AltCase::kAlt1:
@@ -2915,6 +2921,7 @@ TStaticData::TStaticData()
29152921
{TRule_drop_resource_pool_classifier_stmt::GetDescriptor(), MakePrettyFunctor(&TPrettyVisitor::VisitDropResourcePoolClassifier)},
29162922
{TRule_backup_stmt::GetDescriptor(), MakePrettyFunctor(&TPrettyVisitor::VisitBackup)},
29172923
{TRule_restore_stmt::GetDescriptor(), MakePrettyFunctor(&TPrettyVisitor::VisitRestore)},
2924+
{TRule_alter_sequence_stmt::GetDescriptor(), MakePrettyFunctor(&TPrettyVisitor::VisitAlterSequence)},
29182925
})
29192926
, ObfuscatingVisitDispatch({
29202927
{TToken::GetDescriptor(), MakeObfuscatingFunctor(&TObfuscatingVisitor::VisitToken)},

yql/essentials/sql/v1/format/sql_format_ut.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,17 @@ Y_UNIT_TEST(AlterGroup) {
115115
setup.Run(cases);
116116
}
117117

118+
Y_UNIT_TEST(AlterSequence) {
119+
TCases cases = {
120+
{"use plato;alter sequence sequence start with 10 increment 2 restart with 5;","USE plato;\n\nALTER SEQUENCE sequence START WITH 10 INCREMENT 2 RESTART WITH 5;\n"},
121+
{"use plato;alter sequence if exists sequence increment 1000 start 100 restart;","USE plato;\n\nALTER SEQUENCE IF EXISTS sequence INCREMENT 1000 START 100 RESTART;\n"},
122+
};
123+
124+
TSetup setup;
125+
setup.Run(cases);
126+
}
127+
128+
118129
Y_UNIT_TEST(Use) {
119130
TCases cases = {
120131
{"use user;","USE user;\n"},

yql/essentials/sql/v1/node.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1300,6 +1300,14 @@ namespace NSQLTranslationV1 {
13001300
TVector<TDeferredAtom> Roles;
13011301
};
13021302

1303+
struct TSequenceParameters {
1304+
bool MissingOk = false;
1305+
TMaybe<TDeferredAtom> StartValue;
1306+
bool IsRestart = false;
1307+
TMaybe<TDeferredAtom> RestartValue;
1308+
TMaybe<TDeferredAtom> Increment;
1309+
};
1310+
13031311
struct TTopicConsumerSettings {
13041312
struct TLocalSinkSettings {
13051313
// no special settings

yql/essentials/sql/v1/query.cpp

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2049,6 +2049,110 @@ TNodePtr BuildAlterUser(TPosition pos, const TString& service, const TDeferredAt
20492049
return new TAlterUser(pos, service, cluster, name, params, scoped);
20502050
}
20512051

2052+
class TAlterSequence final: public TAstListNode {
2053+
public:
2054+
TAlterSequence(TPosition pos, const TString& service, const TDeferredAtom& cluster, const TString& id, const TSequenceParameters& params, TScopedStatePtr scoped)
2055+
: TAstListNode(pos)
2056+
, Service(service)
2057+
, Cluster(cluster)
2058+
, Id(id)
2059+
, Params(params)
2060+
, Scoped(scoped)
2061+
{
2062+
FakeSource = BuildFakeSource(pos);
2063+
scoped->UseCluster(service, cluster);
2064+
}
2065+
2066+
bool DoInit(TContext& ctx, ISource* src) override {
2067+
Y_UNUSED(src);
2068+
2069+
TNodePtr cluster = Scoped->WrapCluster(Cluster, ctx);
2070+
2071+
if (!cluster->Init(ctx, FakeSource.Get())) {
2072+
return false;
2073+
}
2074+
2075+
auto options = Y();
2076+
TString mode = Params.MissingOk ? "alter_if_exists" : "alter";
2077+
options = L(options, Q(Y(Q("mode"), Q(mode))));
2078+
2079+
if (Params.IsRestart) {
2080+
if (Params.RestartValue) {
2081+
TString strValue = Params.RestartValue->Build()->GetLiteralValue();
2082+
ui64 value = FromString<ui64>(strValue);
2083+
ui64 maxValue = ui64(std::numeric_limits<i64>::max());
2084+
ui64 minValue = 1;
2085+
if (value > maxValue) {
2086+
ctx.Error(Pos) << "Restart value: " << value << " cannot be greater than max value: " << maxValue;
2087+
return false;
2088+
}
2089+
if (value < minValue) {
2090+
ctx.Error(Pos) << "Restart value: " << value << " cannot be less than min value: " << minValue;
2091+
return false;
2092+
}
2093+
options = L(options, Q(Y(Q("restart"), Q(ToString(value)))));
2094+
} else {
2095+
options = L(options, Q(Y(Q("restart"), Q(TString()))));
2096+
}
2097+
}
2098+
if (Params.StartValue) {
2099+
TString strValue = Params.StartValue->Build()->GetLiteralValue();
2100+
ui64 value = FromString<ui64>(strValue);
2101+
ui64 maxValue = ui64(std::numeric_limits<i64>::max());
2102+
ui64 minValue = 1;
2103+
if (value > maxValue) {
2104+
ctx.Error(Pos) << "Start value: " << value << " cannot be greater than max value: " << maxValue;
2105+
return false;
2106+
}
2107+
if (value < minValue) {
2108+
ctx.Error(Pos) << "Start value: " << value << " cannot be less than min value: " << minValue;
2109+
return false;
2110+
}
2111+
options = L(options, Q(Y(Q("start"), Q(ToString(value)))));
2112+
}
2113+
2114+
if (Params.Increment) {
2115+
TString strValue = Params.Increment->Build()->GetLiteralValue();
2116+
ui64 value = FromString<ui64>(strValue);
2117+
ui64 maxValue = ui64(std::numeric_limits<i64>::max());
2118+
if (value > maxValue) {
2119+
ctx.Error(Pos) << "Increment: " << value << " cannot be greater than max value: " << maxValue;
2120+
return false;
2121+
}
2122+
if (value == 0) {
2123+
ctx.Error(Pos) << "Increment must not be zero";
2124+
return false;
2125+
}
2126+
options = L(options, Q(Y(Q("increment"), Q(ToString(value)))));
2127+
}
2128+
2129+
Add("block", Q(Y(
2130+
Y("let", "sink", Y("DataSink", BuildQuotedAtom(Pos, TString(KikimrProviderName)),
2131+
Scoped->WrapCluster(Cluster, ctx))),
2132+
Y("let", "world", Y(TString(WriteName), "world", "sink", Y("Key", Q(Y(Q("sequence"), Y("String", BuildQuotedAtom(Pos, Id))))), Y("Void"), Q(options))),
2133+
Y("return", ctx.PragmaAutoCommit ? Y(TString(CommitName), "world", "sink") : AstNode("world"))
2134+
)));
2135+
2136+
return TAstListNode::DoInit(ctx, src);
2137+
}
2138+
2139+
TPtr DoClone() const final {
2140+
return {};
2141+
}
2142+
private:
2143+
const TString Service;
2144+
TDeferredAtom Cluster;
2145+
TString Id;
2146+
const TSequenceParameters Params;
2147+
2148+
TScopedStatePtr Scoped;
2149+
TSourcePtr FakeSource;
2150+
};
2151+
2152+
TNodePtr BuildAlterSequence(TPosition pos, const TString& service, const TDeferredAtom& cluster, const TString& id, const TSequenceParameters& params, TScopedStatePtr scoped) {
2153+
return new TAlterSequence(pos, service, cluster, id, params, scoped);
2154+
}
2155+
20522156
class TRenameRole final: public TAstListNode {
20532157
public:
20542158
TRenameRole(TPosition pos, bool isUser, const TString& service, const TDeferredAtom& cluster, const TDeferredAtom& name, const TDeferredAtom& newName, TScopedStatePtr scoped)

yql/essentials/sql/v1/source.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,7 @@ namespace NSQLTranslationV1 {
312312
TNodePtr BuildWriteTable(TPosition pos, const TString& label, const TTableRef& table, EWriteColumnMode mode, TNodePtr options,
313313
TScopedStatePtr scoped);
314314
TNodePtr BuildAnalyze(TPosition pos, const TString& service, const TDeferredAtom& cluster, const TAnalyzeParams& params, TScopedStatePtr scoped);
315+
TNodePtr BuildAlterSequence(TPosition pos, const TString& service, const TDeferredAtom& cluster, const TString& id, const TSequenceParameters& params, TScopedStatePtr scoped);
315316
TSourcePtr TryMakeSourceFromExpression(TPosition pos, TContext& ctx, const TString& currService, const TDeferredAtom& currCluster,
316317
TNodePtr node, const TString& view = {});
317318
void MakeTableFromExpression(TPosition pos, TContext& ctx, TNodePtr node, TDeferredAtom& table, const TString& prefix = {});

0 commit comments

Comments
 (0)