Skip to content

Commit dc2ef5c

Browse files
authored
[backups][yql] Implement entries handling for backup collections (#9338)
1 parent 1ccec89 commit dc2ef5c

File tree

15 files changed

+641
-52
lines changed

15 files changed

+641
-52
lines changed

ydb/library/yql/sql/v1/SQLv1.g.in

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -651,15 +651,25 @@ create_table_entry:
651651
| an_id_schema
652652
;
653653

654-
create_backup_collection_stmt: CREATE backup_collection WITH LPAREN backup_collection_settings RPAREN;
655-
alter_backup_collection_stmt: ALTER backup_collection alter_backup_collection_actions;
654+
create_backup_collection_stmt: CREATE backup_collection WITH LPAREN backup_collection_settings RPAREN database_or_table_list?;
655+
alter_backup_collection_stmt: ALTER backup_collection (alter_backup_collection_actions | alter_backup_collection_entries);
656656
drop_backup_collection_stmt: DROP backup_collection;
657657

658+
database_or_table_list: DATABASE | table_list;
659+
table_list: TABLE an_id_table (COMMA TABLE an_id_table)*;
660+
658661
alter_backup_collection_actions: alter_backup_collection_action (COMMA alter_backup_collection_action)*;
659662
alter_backup_collection_action:
660663
alter_table_set_table_setting_compat
661664
| alter_table_reset_table_setting
662665
;
666+
alter_backup_collection_entries: alter_backup_collection_entry (COMMA alter_backup_collection_entry)*;
667+
alter_backup_collection_entry:
668+
ADD DATABASE
669+
| DROP DATABASE
670+
| ADD TABLE an_id_table
671+
| DROP TABLE an_id_table
672+
;
663673
backup_collection: BACKUP COLLECTION object_ref;
664674
backup_collection_settings: backup_collection_settings_entry (COMMA backup_collection_settings_entry)*;
665675
backup_collection_settings_entry: an_id EQUALS table_setting_value;

ydb/library/yql/sql/v1/SQLv1Antlr4.g.in

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -650,15 +650,25 @@ create_table_entry:
650650
| an_id_schema
651651
;
652652

653-
create_backup_collection_stmt: CREATE backup_collection WITH LPAREN backup_collection_settings RPAREN;
654-
alter_backup_collection_stmt: ALTER backup_collection alter_backup_collection_actions;
653+
create_backup_collection_stmt: CREATE backup_collection WITH LPAREN backup_collection_settings RPAREN database_or_table_list?;
654+
alter_backup_collection_stmt: ALTER backup_collection (alter_backup_collection_actions | alter_backup_collection_entries);
655655
drop_backup_collection_stmt: DROP backup_collection;
656656

657+
database_or_table_list: DATABASE | table_list;
658+
table_list: TABLE an_id_table (COMMA TABLE an_id_table)*;
659+
657660
alter_backup_collection_actions: alter_backup_collection_action (COMMA alter_backup_collection_action)*;
658661
alter_backup_collection_action:
659662
alter_table_set_table_setting_compat
660663
| alter_table_reset_table_setting
661664
;
665+
alter_backup_collection_entries: alter_backup_collection_entry (COMMA alter_backup_collection_entry)*;
666+
alter_backup_collection_entry:
667+
ADD DATABASE
668+
| DROP DATABASE
669+
| ADD TABLE an_id_table
670+
| DROP TABLE an_id_table
671+
;
662672
backup_collection: BACKUP COLLECTION object_ref;
663673
backup_collection_settings: backup_collection_settings_entry (COMMA backup_collection_settings_entry)*;
664674
backup_collection_settings_entry: an_id EQUALS table_setting_value;

ydb/library/yql/sql/v1/format/sql_format.cpp

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1549,11 +1549,27 @@ friend struct TStaticData;
15491549

15501550
NewLine();
15511551
PushCurrentIndent();
1552-
Visit(msg.GetRule_alter_backup_collection_actions3().GetRule_alter_backup_collection_action1());
1553-
for (const auto& action : msg.GetRule_alter_backup_collection_actions3().GetBlock2()) {
1554-
Visit(action.GetToken1()); // comma
1555-
NewLine();
1556-
Visit(action.GetRule_alter_backup_collection_action2());
1552+
switch (msg.GetBlock3().Alt_case()) {
1553+
case TRule_alter_backup_collection_stmt_TBlock3::kAlt1: {
1554+
Visit(msg.GetBlock3().GetAlt1().GetRule_alter_backup_collection_actions1().GetRule_alter_backup_collection_action1());
1555+
for (const auto& action : msg.GetBlock3().GetAlt1().GetRule_alter_backup_collection_actions1().GetBlock2()) {
1556+
Visit(action.GetToken1()); // comma
1557+
NewLine();
1558+
Visit(action.GetRule_alter_backup_collection_action2());
1559+
}
1560+
break;
1561+
}
1562+
case TRule_alter_backup_collection_stmt_TBlock3::kAlt2: {
1563+
Visit(msg.GetBlock3().GetAlt2().GetRule_alter_backup_collection_entries1().GetRule_alter_backup_collection_entry1());
1564+
for (const auto& entry : msg.GetBlock3().GetAlt2().GetRule_alter_backup_collection_entries1().GetBlock2()) {
1565+
Visit(entry.GetToken1()); // comma
1566+
NewLine();
1567+
Visit(entry.GetRule_alter_backup_collection_entry2());
1568+
}
1569+
break;
1570+
}
1571+
default:
1572+
ythrow yexception() << "Alt is not supported";
15571573
}
15581574

15591575
PopCurrentIndent();

ydb/library/yql/sql/v1/format/sql_format_ut.h

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1577,8 +1577,18 @@ Y_UNIT_TEST(BackupCollectionOperations) {
15771577
TCases cases = {
15781578
{"creAte BackuP colLection `-naMe` wIth (a = \"b\")",
15791579
"CREATE BACKUP COLLECTION `-naMe` WITH (a = \"b\");\n"},
1580-
{"alTer bACKuP coLLECTION naMe resEt (b, c), seT (x=y, z=false)",
1580+
{"creAte BackuP colLection `-naMe` wIth (a = \"b\") DATabase",
1581+
"CREATE BACKUP COLLECTION `-naMe` WITH (a = \"b\") DATABASE;\n"},
1582+
{"creAte BackuP colLection `-naMe` wIth (a = \"b\") tabLe `tbl1` , TablE `tbl2`",
1583+
"CREATE BACKUP COLLECTION `-naMe` WITH (a = \"b\") TABLE `tbl1`, TABLE `tbl2`;\n"},
1584+
{"alTer bACKuP coLLECTION naMe resEt (b, c), seT (x=y, z=false)",
15811585
"ALTER BACKUP COLLECTION naMe\n\tRESET (b, c),\n\tSET (x = y, z = FALSE);\n"},
1586+
{"alTer bACKuP coLLECTION naMe aDD DATAbase",
1587+
"ALTER BACKUP COLLECTION naMe\n\tADD DATABASE;\n"},
1588+
{"alTer bACKuP coLLECTION naMe DRoP \n\n DaTAbase",
1589+
"ALTER BACKUP COLLECTION naMe\n\tDROP DATABASE;\n"},
1590+
{"alTer bACKuP coLLECTION naMe add \n\n tablE\n\tsometable,drOp TABle `other`",
1591+
"ALTER BACKUP COLLECTION naMe\n\tADD TABLE sometable,\n\tDROP TABLE `other`;\n"},
15821592
{"DROP backup collectiOn `/some/path`",
15831593
"DROP BACKUP COLLECTION `/some/path`;\n"},
15841594
};
@@ -1615,4 +1625,4 @@ Y_UNIT_TEST(ResourcePoolClassifierOperations) {
16151625

16161626
TSetup setup;
16171627
setup.Run(cases);
1618-
}
1628+
}

ydb/library/yql/sql/v1/node.h

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1335,6 +1335,7 @@ namespace NSQLTranslationV1 {
13351335
}
13361336
};
13371337

1338+
13381339
struct TCreateTopicParameters {
13391340
TVector<TTopicConsumerDescription> Consumers;
13401341
TTopicSettings TopicSettings;
@@ -1353,6 +1354,36 @@ namespace NSQLTranslationV1 {
13531354
bool MissingOk;
13541355
};
13551356

1357+
struct TCreateBackupCollectionParameters {
1358+
std::map<TString, TDeferredAtom> Settings;
1359+
1360+
bool Database;
1361+
TVector<TDeferredAtom> Tables;
1362+
1363+
bool ExistingOk;
1364+
};
1365+
1366+
struct TAlterBackupCollectionParameters {
1367+
enum class EDatabase {
1368+
Unchanged,
1369+
Add,
1370+
Drop,
1371+
};
1372+
1373+
std::map<TString, TDeferredAtom> Settings;
1374+
std::set<TString> SettingsToReset;
1375+
1376+
EDatabase Database = EDatabase::Unchanged;
1377+
TVector<TDeferredAtom> TablesToAdd;
1378+
TVector<TDeferredAtom> TablesToDrop;
1379+
1380+
bool MissingOk;
1381+
};
1382+
1383+
struct TDropBackupCollectionParameters {
1384+
bool MissingOk;
1385+
};
1386+
13561387
TString IdContent(TContext& ctx, const TString& str);
13571388
TString IdContentFromString(TContext& ctx, const TString& str);
13581389
TTableHints GetContextHints(TContext& ctx);
@@ -1488,6 +1519,16 @@ namespace NSQLTranslationV1 {
14881519
TNodePtr BuildDropTopic(TPosition pos, const TTopicRef& topic, const TDropTopicParameters& params,
14891520
TScopedStatePtr scoped);
14901521

1522+
TNodePtr BuildCreateBackupCollection(TPosition pos, const TString& id,
1523+
const TCreateBackupCollectionParameters& params,
1524+
const TObjectOperatorContext& context);
1525+
TNodePtr BuildAlterBackupCollection(TPosition pos, const TString& id,
1526+
const TAlterBackupCollectionParameters& params,
1527+
const TObjectOperatorContext& context);
1528+
TNodePtr BuildDropBackupCollection(TPosition pos, const TString& id,
1529+
const TDropBackupCollectionParameters& params,
1530+
const TObjectOperatorContext& context);
1531+
14911532
template<class TContainer>
14921533
TMaybe<TString> FindMistypeIn(const TContainer& container, const TString& name) {
14931534
for (auto& item: container) {

ydb/library/yql/sql/v1/query.cpp

Lines changed: 179 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3259,4 +3259,183 @@ TNodePtr BuildAnalyze(TPosition pos, const TString& service, const TDeferredAtom
32593259
return new TAnalyzeNode(pos, service, cluster, params, scoped);
32603260
}
32613261

3262+
class TBaseBackupCollectionNode
3263+
: public TAstListNode
3264+
, public TObjectOperatorContext
3265+
{
3266+
using TBase = TAstListNode;
3267+
public:
3268+
TBaseBackupCollectionNode(
3269+
TPosition pos,
3270+
const TString& objectId,
3271+
const TObjectOperatorContext& context)
3272+
: TBase(pos)
3273+
, TObjectOperatorContext(context)
3274+
, Id(objectId)
3275+
{}
3276+
3277+
bool DoInit(TContext& ctx, ISource* src) final {
3278+
auto keys = Y("Key");
3279+
keys = L(keys, Q(Y(Q("backupCollection"), Y("String", BuildQuotedAtom(Pos, Id)))));
3280+
auto options = this->FillOptions(ctx, Y());
3281+
3282+
Add("block", Q(Y(
3283+
Y("let", "sink", Y("DataSink", BuildQuotedAtom(Pos, ServiceId), Scoped->WrapCluster(Cluster, ctx))),
3284+
Y("let", "world", Y(TString(WriteName), "world", "sink", keys, Y("Void"), Q(options))),
3285+
Y("return", ctx.PragmaAutoCommit ? Y(TString(CommitName), "world", "sink") : AstNode("world"))
3286+
)));
3287+
3288+
return TAstListNode::DoInit(ctx, src);
3289+
}
3290+
3291+
virtual INode::TPtr FillOptions(TContext& ctx, INode::TPtr options) const = 0;
3292+
3293+
protected:
3294+
TString Id;
3295+
};
3296+
3297+
class TCreateBackupCollectionNode
3298+
: public TBaseBackupCollectionNode
3299+
{
3300+
using TBase = TBaseBackupCollectionNode;
3301+
public:
3302+
TCreateBackupCollectionNode(
3303+
TPosition pos,
3304+
const TString& objectId,
3305+
const TCreateBackupCollectionParameters& params,
3306+
const TObjectOperatorContext& context)
3307+
: TBase(pos, objectId, context)
3308+
, Params(params)
3309+
{}
3310+
3311+
virtual INode::TPtr FillOptions(TContext& ctx, INode::TPtr options) const final {
3312+
options->Add(Q(Y(Q("mode"), Q("create"))));
3313+
3314+
auto settings = Y();
3315+
for (auto& [key, value] : Params.Settings) {
3316+
settings->Add(Q(Y(BuildQuotedAtom(Pos, key), value.Build())));
3317+
}
3318+
options->Add(Q(Y(Q("settings"), Q(settings))));
3319+
3320+
auto entries = Y();
3321+
if (Params.Database) {
3322+
entries->Add(Q(Y(Q(Y(Q("type"), Q("database"))))));
3323+
}
3324+
for (auto& table : Params.Tables) {
3325+
auto path = ctx.GetPrefixedPath(ServiceId, Cluster, table);
3326+
entries->Add(Q(Y(Q(Y(Q("type"), Q("table"))), Q(Y(Q("path"), path)))));
3327+
}
3328+
options->Add(Q(Y(Q("entries"), Q(entries))));
3329+
3330+
return options;
3331+
}
3332+
3333+
TPtr DoClone() const final {
3334+
return new TCreateBackupCollectionNode(GetPos(), Id, Params, *this);
3335+
}
3336+
3337+
private:
3338+
TCreateBackupCollectionParameters Params;
3339+
};
3340+
3341+
class TAlterBackupCollectionNode
3342+
: public TBaseBackupCollectionNode
3343+
{
3344+
using TBase = TBaseBackupCollectionNode;
3345+
public:
3346+
TAlterBackupCollectionNode(
3347+
TPosition pos,
3348+
const TString& objectId,
3349+
const TAlterBackupCollectionParameters& params,
3350+
const TObjectOperatorContext& context)
3351+
: TBase(pos, objectId, context)
3352+
, Params(params)
3353+
{}
3354+
3355+
virtual INode::TPtr FillOptions(TContext& ctx, INode::TPtr options) const final {
3356+
options->Add(Q(Y(Q("mode"), Q("alter"))));
3357+
3358+
auto settings = Y();
3359+
for (auto& [key, value] : Params.Settings) {
3360+
settings->Add(Q(Y(BuildQuotedAtom(Pos, key), value.Build())));
3361+
}
3362+
options->Add(Q(Y(Q("settings"), Q(settings))));
3363+
3364+
auto resetSettings = Y();
3365+
for (auto& key : Params.SettingsToReset) {
3366+
resetSettings->Add(BuildQuotedAtom(Pos, key));
3367+
}
3368+
options->Add(Q(Y(Q("resetSettings"), Q(resetSettings))));
3369+
3370+
auto entries = Y();
3371+
if (Params.Database != TAlterBackupCollectionParameters::EDatabase::Unchanged) {
3372+
entries->Add(Q(Y(Q(Y(Q("type"), Q("database"))), Q(Y(Q("action"), Q(Params.Database == TAlterBackupCollectionParameters::EDatabase::Add ? "add" : "drop"))))));
3373+
}
3374+
for (auto& table : Params.TablesToAdd) {
3375+
auto path = ctx.GetPrefixedPath(ServiceId, Cluster, table);
3376+
entries->Add(Q(Y(Q(Y(Q("type"), Q("table"))), Q(Y(Q("path"), path)), Q(Y(Q("action"), Q("add"))))));
3377+
}
3378+
for (auto& table : Params.TablesToDrop) {
3379+
auto path = ctx.GetPrefixedPath(ServiceId, Cluster, table);
3380+
entries->Add(Q(Y(Q(Y(Q("type"), Q("table"))), Q(Y(Q("path"), path)), Q(Y(Q("action"), Q("drop"))))));
3381+
}
3382+
options->Add(Q(Y(Q("alterEntries"), Q(entries))));
3383+
3384+
return options;
3385+
}
3386+
3387+
TPtr DoClone() const final {
3388+
return new TAlterBackupCollectionNode(GetPos(), Id, Params, *this);
3389+
}
3390+
3391+
private:
3392+
TAlterBackupCollectionParameters Params;
3393+
};
3394+
3395+
class TDropBackupCollectionNode
3396+
: public TBaseBackupCollectionNode
3397+
{
3398+
using TBase = TBaseBackupCollectionNode;
3399+
public:
3400+
TDropBackupCollectionNode(
3401+
TPosition pos,
3402+
const TString& objectId,
3403+
const TDropBackupCollectionParameters&,
3404+
const TObjectOperatorContext& context)
3405+
: TBase(pos, objectId, context)
3406+
{}
3407+
3408+
virtual INode::TPtr FillOptions(TContext&, INode::TPtr options) const final {
3409+
options->Add(Q(Y(Q("mode"), Q("drop"))));
3410+
3411+
return options;
3412+
}
3413+
3414+
TPtr DoClone() const final {
3415+
TDropBackupCollectionParameters params;
3416+
return new TDropBackupCollectionNode(GetPos(), Id, params, *this);
3417+
}
3418+
};
3419+
3420+
TNodePtr BuildCreateBackupCollection(TPosition pos, const TString& id,
3421+
const TCreateBackupCollectionParameters& params,
3422+
const TObjectOperatorContext& context)
3423+
{
3424+
return new TCreateBackupCollectionNode(pos, id, params, context);
3425+
}
3426+
3427+
TNodePtr BuildAlterBackupCollection(TPosition pos, const TString& id,
3428+
const TAlterBackupCollectionParameters& params,
3429+
const TObjectOperatorContext& context)
3430+
{
3431+
return new TAlterBackupCollectionNode(pos, id, params, context);
3432+
}
3433+
3434+
TNodePtr BuildDropBackupCollection(TPosition pos, const TString& id,
3435+
const TDropBackupCollectionParameters& params,
3436+
const TObjectOperatorContext& context)
3437+
{
3438+
return new TDropBackupCollectionNode(pos, id, params, context);
3439+
}
3440+
32623441
} // namespace NSQLTranslationV1

0 commit comments

Comments
 (0)