Skip to content

Commit e49fbcc

Browse files
committed
Enable altering indexImplTable partitioning settings through YQL
1 parent e2c4226 commit e49fbcc

File tree

10 files changed

+143
-6
lines changed

10 files changed

+143
-6
lines changed

ydb/core/kqp/provider/yql_kikimr_exec.cpp

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
#include <ydb/library/yql/minikql/mkql_program_builder.h>
2828

2929
#include <ydb/core/kqp/provider/yql_kikimr_results.h>
30+
#include <ydb/core/kqp/gateway/utils/scheme_helpers.h>
3031

3132
namespace NYql {
3233
namespace {
@@ -1505,6 +1506,49 @@ class TKiSinkCallableExecutionTransformer : public TAsyncCallbackTransformer<TKi
15051506
default:
15061507
YQL_ENSURE(false, "Unknown index type: " << (ui32)add_index->type_case());
15071508
}
1509+
} else if (name == "alterIndex") {
1510+
if (maybeAlter.Cast().Actions().Size() > 1) {
1511+
ctx.AddError(
1512+
TIssue(ctx.GetPosition(action.Name().Pos()),
1513+
"ALTER INDEX action cannot be combined with any other ALTER TABLE action"
1514+
)
1515+
);
1516+
return SyncError();
1517+
}
1518+
auto listNode = action.Value().Cast<TCoNameValueTupleList>();
1519+
for (const auto& indexSetting : listNode) {
1520+
auto settingName = indexSetting.Name().Value();
1521+
if (settingName == "indexName") {
1522+
auto indexName = indexSetting.Value().Cast<TCoAtom>().StringValue();
1523+
auto indexTablePath = NKikimr::NKqp::NSchemeHelpers::CreateIndexTablePath(table.Metadata->Name, indexName);
1524+
alterTableRequest.set_path(std::move(indexTablePath));
1525+
} else if (settingName == "tableSettings") {
1526+
auto tableSettings = indexSetting.Value().Cast<TCoNameValueTupleList>();
1527+
for (const auto& tableSetting : tableSettings) {
1528+
if (IsPartitioningSetting(tableSetting.Name().Value())) {
1529+
if (!ParsePartitioningSettings(
1530+
*alterTableRequest.mutable_alter_partitioning_settings(), tableSetting, ctx
1531+
)) {
1532+
return SyncError();
1533+
}
1534+
} else {
1535+
ctx.AddError(
1536+
TIssue(ctx.GetPosition(tableSetting.Name().Pos()),
1537+
TStringBuilder() << "Unknown index table setting: " << name
1538+
)
1539+
);
1540+
return SyncError();
1541+
}
1542+
}
1543+
} else {
1544+
ctx.AddError(
1545+
TIssue(ctx.GetPosition(indexSetting.Name().Pos()),
1546+
TStringBuilder() << "Unknown alter index setting: " << settingName
1547+
)
1548+
);
1549+
return SyncError();
1550+
}
1551+
}
15081552
} else if (name == "dropIndex") {
15091553
auto nameNode = action.Value().Cast<TCoAtom>();
15101554
alterTableRequest.add_drop_indexes(TString(nameNode.Value()));

ydb/core/kqp/provider/yql_kikimr_type_ann.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1411,7 +1411,8 @@ virtual TStatus HandleCreateTable(TKiCreateTable create, TExprContext& ctx) over
14111411
&& name != "setTableSettings"
14121412
&& name != "addChangefeed"
14131413
&& name != "dropChangefeed"
1414-
&& name != "renameIndexTo")
1414+
&& name != "renameIndexTo"
1415+
&& name != "alterIndex")
14151416
{
14161417
ctx.AddError(TIssue(ctx.GetPosition(action.Name().Pos()),
14171418
TStringBuilder() << "Unknown alter table action: " << name));

ydb/core/tx/schemeshard/schemeshard__operation_alter_table.cpp

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -682,10 +682,18 @@ TVector<ISubOperation::TPtr> CreateConsistentAlterTable(TOperationId id, const T
682682
return {CreateAlterTable(id, tx)};
683683
}
684684

685-
// only for super user use
686-
// until correct and safe altering index api is released
685+
// Admins can alter indexImplTable unconditionally.
686+
// Regular users can only alter allowed fields.
687687
if (!IsSuperUser(context.UserToken.Get())) {
688-
return {CreateAlterTable(id, tx)};
688+
std::vector<const google::protobuf::FieldDescriptor*> fields;
689+
alter.GetReflection()->ListFields(alter, &fields);
690+
for (const auto* field : fields) {
691+
if (field->name() != "Name"
692+
&& field->name() != "PartitionConfig"
693+
) {
694+
return {CreateAlterTable(id, tx)};
695+
}
696+
}
689697
}
690698

691699
TVector<ISubOperation::TPtr> result;

ydb/library/yql/core/expr_nodes/yql_expr_nodes.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,8 @@
4242
{"Index": 0, "Name": "Name", "Type": "TCoAtom"},
4343
{"Index": 1, "Name": "Type", "Type": "TCoAtom"},
4444
{"Index": 2, "Name": "Columns", "Type": "TCoAtomList"},
45-
{"Index": 3, "Name": "DataColumns", "Type": "TCoAtomList"}
45+
{"Index": 3, "Name": "DataColumns", "Type": "TCoAtomList"},
46+
{"Index": 4, "Name": "TableSettings", "Type": "TCoNameValueTupleList"}
4647
]
4748
},
4849
{

ydb/library/yql/providers/common/provider/yql_provider.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,8 @@ TWriteTableSettings ParseWriteTableSettings(TExprList node, TExprContext& ctx) {
286286
index.Columns(item.Value().Cast<TCoAtomList>());
287287
} else if (indexItemName == "dataColumns") {
288288
index.DataColumns(item.Value().Cast<TCoAtomList>());
289+
} else if (indexItemName == "tableSettings") {
290+
index.TableSettings(item.Value().Cast<TCoNameValueTupleList>());
289291
} else {
290292
YQL_ENSURE(false, "unknown index item");
291293
}

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -665,6 +665,7 @@ alter_table_action:
665665
| alter_table_alter_changefeed
666666
| alter_table_drop_changefeed
667667
| alter_table_rename_index_to
668+
| alter_table_alter_index
668669
;
669670

670671
alter_external_table_stmt: ALTER EXTERNAL TABLE simple_table_ref alter_external_table_action (COMMA alter_external_table_action)*;
@@ -698,6 +699,7 @@ alter_table_rename_index_to: RENAME INDEX an_id TO an_id;
698699
alter_table_add_changefeed: ADD changefeed;
699700
alter_table_alter_changefeed: ALTER CHANGEFEED an_id changefeed_alter_settings;
700701
alter_table_drop_changefeed: DROP CHANGEFEED an_id;
702+
alter_table_alter_index: ALTER INDEX an_id alter_table_alter_index_action;
701703

702704
column_schema: an_id_schema type_name_or_bind family_relation? opt_column_constraints;
703705
family_relation: FAMILY an_id;
@@ -755,6 +757,12 @@ split_boundaries:
755757

756758
literal_value_list: LPAREN literal_value (COMMA literal_value)* RPAREN;
757759

760+
alter_table_alter_index_action:
761+
alter_table_set_table_setting_uncompat
762+
| alter_table_set_table_setting_compat
763+
| alter_table_reset_table_setting
764+
;
765+
758766
drop_table_stmt: DROP (TABLE | TABLESTORE | EXTERNAL TABLE) (IF EXISTS)? simple_table_ref;
759767

760768
create_user_stmt: CREATE USER role_name create_user_option?;

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1022,6 +1022,7 @@ namespace NSQLTranslationV1 {
10221022
EType Type;
10231023
TVector<TIdentifier> IndexColumns;
10241024
TVector<TIdentifier> DataColumns;
1025+
TTableSettings TableSettings;
10251026
};
10261027

10271028
struct TChangefeedSettings {
@@ -1072,6 +1073,7 @@ namespace NSQLTranslationV1 {
10721073
TVector<TFamilyEntry> AlterColumnFamilies;
10731074
TTableSettings TableSettings;
10741075
TVector<TIndexDescription> AddIndexes;
1076+
TVector<TIndexDescription> AlterIndexes;
10751077
TVector<TIdentifier> DropIndexes;
10761078
TMaybe<std::pair<TIdentifier, TIdentifier>> RenameIndexTo;
10771079
TMaybe<TIdentifier> RenameTo;
@@ -1084,7 +1086,7 @@ namespace NSQLTranslationV1 {
10841086
return AddColumns.empty() && DropColumns.empty() && AlterColumns.empty()
10851087
&& AddColumnFamilies.empty() && AlterColumnFamilies.empty()
10861088
&& !TableSettings.IsSet()
1087-
&& AddIndexes.empty() && DropIndexes.empty() && !RenameIndexTo.Defined()
1089+
&& AddIndexes.empty() && AlterIndexes.empty() && DropIndexes.empty() && !RenameIndexTo.Defined()
10881090
&& !RenameTo.Defined()
10891091
&& AddChangefeeds.empty() && AlterChangefeeds.empty() && DropChangefeeds.empty();
10901092
}

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

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,11 +281,28 @@ static INode::TPtr CreateIndexDesc(const TIndexDescription& index, ETableSetting
281281
}
282282
const auto& indexType = node.Y(node.Q("indexType"), CreateIndexType(index.Type, node));
283283
const auto& indexName = node.Y(node.Q("indexName"), BuildQuotedAtom(index.Name.Pos, index.Name.Name));
284+
const auto& tableSettings = node.Y(
285+
node.Q("tableSettings"),
286+
node.Q(CreateTableSettings(index.TableSettings, parsingMode, node))
287+
);
284288
return node.Y(
285289
node.Q(indexName),
286290
node.Q(indexType),
287291
node.Q(node.Y(node.Q("indexColumns"), node.Q(indexColumns))),
288292
node.Q(node.Y(node.Q("dataColumns"), node.Q(dataColumns))),
293+
node.Q(tableSettings)
294+
);
295+
}
296+
297+
static INode::TPtr CreateAlterIndex(const TIndexDescription& index, const INode& node) {
298+
const auto& indexName = node.Y(node.Q("indexName"), BuildQuotedAtom(index.Name.Pos, index.Name.Name));
299+
const auto& tableSettings = node.Y(
300+
node.Q("tableSettings"),
301+
node.Q(CreateTableSettings(index.TableSettings, ETableSettingsParsingMode::Alter, node))
302+
);
303+
return node.Y(
304+
node.Q(indexName),
305+
node.Q(tableSettings)
289306
);
290307
}
291308

@@ -1364,6 +1381,11 @@ class TAlterTableNode final: public TAstListNode {
13641381
actions = L(actions, Q(Y(Q("addIndex"), Q(desc))));
13651382
}
13661383

1384+
for (const auto& index : Params.AlterIndexes) {
1385+
const auto& desc = CreateAlterIndex(index, *this);
1386+
actions = L(actions, Q(Y(Q("alterIndex"), Q(desc))));
1387+
}
1388+
13671389
for (const auto& id : Params.DropIndexes) {
13681390
auto indexName = BuildQuotedAtom(id.Pos, id.Name);
13691391
actions = L(actions, Q(Y(Q("dropIndex"), indexName)));

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

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1460,6 +1460,14 @@ bool TSqlQuery::AlterTableAction(const TRule_alter_table_action& node, TAlterTab
14601460
AlterTableRenameIndexTo(renameTo, params);
14611461
break;
14621462
}
1463+
case TRule_alter_table_action::kAltAlterTableAction16: {
1464+
// ALTER INDEX
1465+
const auto& rule = node.GetAlt_alter_table_action16().GetRule_alter_table_alter_index1();
1466+
if (!AlterTableAlterIndex(rule, params)) {
1467+
return false;
1468+
}
1469+
break;
1470+
}
14631471

14641472
case TRule_alter_table_action::ALT_NOT_SET:
14651473
AltNotImplemented("alter_table_action", node);
@@ -1683,6 +1691,46 @@ void TSqlQuery::AlterTableRenameIndexTo(const TRule_alter_table_rename_index_to&
16831691
params.RenameIndexTo = std::make_pair(src, dst);
16841692
}
16851693

1694+
bool TSqlQuery::AlterTableAlterIndex(const TRule_alter_table_alter_index& node, TAlterTableParameters& params) {
1695+
const auto indexName = IdEx(node.GetRule_an_id3(), *this);
1696+
params.AlterIndexes.emplace_back(indexName);
1697+
TTableSettings& indexTableSettings = params.AlterIndexes.back().TableSettings;
1698+
1699+
const auto& action = node.GetRule_alter_table_alter_index_action4();
1700+
1701+
switch (action.Alt_case()) {
1702+
case TRule_alter_table_alter_index_action::kAltAlterTableAlterIndexAction1: {
1703+
// SET setting value
1704+
const auto& rule = action.GetAlt_alter_table_alter_index_action1().GetRule_alter_table_set_table_setting_uncompat1();
1705+
if (!AlterTableSetTableSetting(rule, indexTableSettings, params.TableType)) {
1706+
return false;
1707+
}
1708+
break;
1709+
}
1710+
case TRule_alter_table_alter_index_action::kAltAlterTableAlterIndexAction2: {
1711+
// SET (setting1 = value1, ...)
1712+
const auto& rule = action.GetAlt_alter_table_alter_index_action2().GetRule_alter_table_set_table_setting_compat1();
1713+
if (!AlterTableSetTableSetting(rule, indexTableSettings, params.TableType)) {
1714+
return false;
1715+
}
1716+
break;
1717+
}
1718+
case TRule_alter_table_alter_index_action::kAltAlterTableAlterIndexAction3: {
1719+
// RESET (setting1, ...)
1720+
const auto& rule = action.GetAlt_alter_table_alter_index_action3().GetRule_alter_table_reset_table_setting1();
1721+
if (!AlterTableResetTableSetting(rule, indexTableSettings, params.TableType)) {
1722+
return false;
1723+
}
1724+
break;
1725+
}
1726+
case TRule_alter_table_alter_index_action::ALT_NOT_SET:
1727+
AltNotImplemented("alter_table_alter_index_action", action);
1728+
return false;
1729+
}
1730+
1731+
return true;
1732+
}
1733+
16861734
bool TSqlQuery::AlterTableAddChangefeed(const TRule_alter_table_add_changefeed& node, TAlterTableParameters& params) {
16871735
TSqlExpression expr(Ctx, Mode);
16881736
return CreateChangefeed(node.GetRule_changefeed2(), expr, params.AddChangefeeds);

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ class TSqlQuery: public TSqlTranslation {
4141
bool AlterTableAlterChangefeed(const TRule_alter_table_alter_changefeed& node, TAlterTableParameters& params);
4242
void AlterTableDropChangefeed(const TRule_alter_table_drop_changefeed& node, TAlterTableParameters& params);
4343
void AlterTableRenameIndexTo(const TRule_alter_table_rename_index_to& node, TAlterTableParameters& params);
44+
bool AlterTableAlterIndex(const TRule_alter_table_alter_index& node, TAlterTableParameters& params);
4445
TNodePtr PragmaStatement(const TRule_pragma_stmt& stmt, bool& success);
4546
void AddStatementToBlocks(TVector<TNodePtr>& blocks, TNodePtr node);
4647
bool ParseTableStoreFeatures(std::map<TString, TDeferredAtom> & result, const TRule_alter_table_store_action & actions);

0 commit comments

Comments
 (0)