Skip to content

Commit a0fb41e

Browse files
authored
Merge f0d5467 into ca86b07
2 parents ca86b07 + f0d5467 commit a0fb41e

File tree

15 files changed

+608
-396
lines changed

15 files changed

+608
-396
lines changed

ydb/core/kqp/provider/yql_kikimr_exec.cpp

Lines changed: 138 additions & 65 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 {
@@ -505,6 +506,96 @@ namespace {
505506
}
506507
}
507508
}
509+
510+
bool IsPartitioningSetting(TStringBuf name) {
511+
return name == "autoPartitioningBySize"
512+
|| name == "partitionSizeMb"
513+
|| name == "autoPartitioningByLoad"
514+
|| name == "minPartitions"
515+
|| name == "maxPartitions";
516+
}
517+
518+
[[nodiscard]] bool ParsePartitioningSettings(
519+
Ydb::Table::PartitioningSettings& partitioningSettings,
520+
const TCoNameValueTuple& setting,
521+
TExprContext& ctx
522+
) {
523+
auto name = setting.Name().Value();
524+
if (name == "autoPartitioningBySize") {
525+
auto val = to_lower(setting.Value().Cast<TCoAtom>().StringValue());
526+
if (val == "enabled") {
527+
partitioningSettings.set_partitioning_by_size(Ydb::FeatureFlag::ENABLED);
528+
} else if (val == "disabled") {
529+
partitioningSettings.set_partitioning_by_size(Ydb::FeatureFlag::DISABLED);
530+
} else {
531+
ctx.AddError(
532+
TIssue(ctx.GetPosition(setting.Value().Cast<TCoAtom>().Pos()),
533+
TStringBuilder() << "Unknown feature flag '" << val << "' for auto partitioning by size"
534+
)
535+
);
536+
return false;
537+
}
538+
} else if (name == "partitionSizeMb") {
539+
ui64 value = FromString<ui64>(
540+
setting.Value().Cast<TCoDataCtor>().Literal().Cast<TCoAtom>().Value()
541+
);
542+
if (value) {
543+
partitioningSettings.set_partition_size_mb(value);
544+
} else {
545+
ctx.AddError(
546+
TIssue(ctx.GetPosition(setting.Name().Pos()),
547+
"Can't set preferred partition size to 0. "
548+
"To disable auto partitioning by size use 'SET AUTO_PARTITIONING_BY_SIZE DISABLED'"
549+
)
550+
);
551+
return false;
552+
}
553+
} else if (name == "autoPartitioningByLoad") {
554+
auto val = to_lower(setting.Value().Cast<TCoAtom>().StringValue());
555+
if (val == "enabled") {
556+
partitioningSettings.set_partitioning_by_load(Ydb::FeatureFlag::ENABLED);
557+
} else if (val == "disabled") {
558+
partitioningSettings.set_partitioning_by_load(Ydb::FeatureFlag::DISABLED);
559+
} else {
560+
ctx.AddError(
561+
TIssue(ctx.GetPosition(setting.Value().Cast<TCoAtom>().Pos()),
562+
TStringBuilder() << "Unknown feature flag '" << val << "' for auto partitioning by load"
563+
)
564+
);
565+
return false;
566+
}
567+
} else if (name == "minPartitions") {
568+
ui64 value = FromString<ui64>(
569+
setting.Value().Cast<TCoDataCtor>().Literal().Cast<TCoAtom>().Value()
570+
);
571+
if (value) {
572+
partitioningSettings.set_min_partitions_count(value);
573+
} else {
574+
ctx.AddError(
575+
TIssue(ctx.GetPosition(setting.Name().Pos()),
576+
"Can't set min partition count to 0"
577+
)
578+
);
579+
return false;
580+
}
581+
} else if (name == "maxPartitions") {
582+
ui64 value = FromString<ui64>(
583+
setting.Value().Cast<TCoDataCtor>().Literal().Cast<TCoAtom>().Value()
584+
);
585+
if (value) {
586+
partitioningSettings.set_max_partitions_count(value);
587+
} else {
588+
ctx.AddError(
589+
TIssue(ctx.GetPosition(setting.Name().Pos()),
590+
"Can't set max partition count to 0"
591+
)
592+
);
593+
return false;
594+
}
595+
}
596+
597+
return true;
598+
}
508599
}
509600

510601
class TKiSinkPlanInfoTransformer : public TGraphTransformerBase {
@@ -1290,71 +1381,10 @@ class TKiSinkCallableExecutionTransformer : public TAsyncCallbackTransformer<TKi
12901381
alterTableRequest.set_set_compaction_policy(TString(
12911382
setting.Value().Cast<TCoDataCtor>().Literal().Cast<TCoAtom>().Value()
12921383
));
1293-
} else if (name == "autoPartitioningBySize") {
1294-
auto partitioningSettings = alterTableRequest.mutable_alter_partitioning_settings();
1295-
auto val = to_lower(TString(setting.Value().Cast<TCoAtom>().Value()));
1296-
if (val == "enabled") {
1297-
partitioningSettings->set_partitioning_by_size(Ydb::FeatureFlag::ENABLED);
1298-
} else if (val == "disabled") {
1299-
partitioningSettings->set_partitioning_by_size(Ydb::FeatureFlag::DISABLED);
1300-
} else {
1301-
auto errText = TStringBuilder() << "Unknown feature flag '"
1302-
<< val
1303-
<< "' for auto partitioning by size";
1304-
ctx.AddError(TIssue(ctx.GetPosition(setting.Value().Cast<TCoAtom>().Pos()),
1305-
errText));
1306-
return SyncError();
1307-
}
1308-
} else if (name == "partitionSizeMb") {
1309-
ui64 value = FromString<ui64>(
1310-
setting.Value().Cast<TCoDataCtor>().Literal().Cast<TCoAtom>().Value()
1311-
);
1312-
if (value) {
1313-
auto partitioningSettings = alterTableRequest.mutable_alter_partitioning_settings();
1314-
partitioningSettings->set_partition_size_mb(value);
1315-
} else {
1316-
ctx.AddError(TIssue(ctx.GetPosition(setting.Name().Pos()),
1317-
"Can't set preferred partition size to 0. "
1318-
"To disable auto partitioning by size use 'SET AUTO_PARTITIONING_BY_SIZE DISABLED'"));
1319-
return SyncError();
1320-
}
1321-
} else if (name == "autoPartitioningByLoad") {
1322-
auto partitioningSettings = alterTableRequest.mutable_alter_partitioning_settings();
1323-
TString val = to_lower(TString(setting.Value().Cast<TCoAtom>().Value()));
1324-
if (val == "enabled") {
1325-
partitioningSettings->set_partitioning_by_load(Ydb::FeatureFlag::ENABLED);
1326-
} else if (val == "disabled") {
1327-
partitioningSettings->set_partitioning_by_load(Ydb::FeatureFlag::DISABLED);
1328-
} else {
1329-
auto errText = TStringBuilder() << "Unknown feature flag '"
1330-
<< val
1331-
<< "' for auto partitioning by load";
1332-
ctx.AddError(TIssue(ctx.GetPosition(setting.Value().Cast<TCoAtom>().Pos()),
1333-
errText));
1334-
return SyncError();
1335-
}
1336-
} else if (name == "minPartitions") {
1337-
ui64 value = FromString<ui64>(
1338-
setting.Value().Cast<TCoDataCtor>().Literal().Cast<TCoAtom>().Value()
1339-
);
1340-
if (value) {
1341-
auto partitioningSettings = alterTableRequest.mutable_alter_partitioning_settings();
1342-
partitioningSettings->set_min_partitions_count(value);
1343-
} else {
1344-
ctx.AddError(TIssue(ctx.GetPosition(setting.Name().Pos()),
1345-
"Can't set min partition count to 0"));
1346-
return SyncError();
1347-
}
1348-
} else if (name == "maxPartitions") {
1349-
ui64 value = FromString<ui64>(
1350-
setting.Value().Cast<TCoDataCtor>().Literal().Cast<TCoAtom>().Value()
1351-
);
1352-
if (value) {
1353-
auto partitioningSettings = alterTableRequest.mutable_alter_partitioning_settings();
1354-
partitioningSettings->set_max_partitions_count(value);
1355-
} else {
1356-
ctx.AddError(TIssue(ctx.GetPosition(setting.Name().Pos()),
1357-
"Can't set max partition count to 0"));
1384+
} else if (IsPartitioningSetting(name)) {
1385+
if (!ParsePartitioningSettings(
1386+
*alterTableRequest.mutable_alter_partitioning_settings(), setting, ctx
1387+
)) {
13581388
return SyncError();
13591389
}
13601390
} else if (name == "keyBloomFilter") {
@@ -1476,6 +1506,49 @@ class TKiSinkCallableExecutionTransformer : public TAsyncCallbackTransformer<TKi
14761506
default:
14771507
YQL_ENSURE(false, "Unknown index type: " << (ui32)add_index->type_case());
14781508
}
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+
}
14791552
} else if (name == "dropIndex") {
14801553
auto nameNode = action.Value().Cast<TCoAtom>();
14811554
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/kqp/ut/indexes/kqp_indexes_multishard_ut.cpp

Lines changed: 11 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -1605,29 +1605,7 @@ Y_UNIT_TEST_SUITE(KqpMultishardIndex) {
16051605

16061606
FillTable(session);
16071607

1608-
kikimr.GetTestServer().GetRuntime()->GetAppData().AdministrationAllowedSIDs.push_back("root@builtin");
1609-
1610-
{ // without token request is forbidded
1611-
Tests::TClient& client = kikimr.GetTestClient();
1612-
const TString scheme = R"(
1613-
Name: "indexImplTable"
1614-
PartitionConfig {
1615-
PartitioningPolicy {
1616-
MinPartitionsCount: 1
1617-
SizeToSplit: 100500
1618-
FastSplitSettings {
1619-
SizeThreshold: 100500
1620-
RowCountThreshold: 100500
1621-
}
1622-
}
1623-
}
1624-
)";
1625-
auto result = client.AlterTable("/Root/MultiShardIndexed/index", scheme, "user@builtin");
1626-
UNIT_ASSERT_VALUES_EQUAL_C(result->Record.GetStatus(), NMsgBusProxy::MSTATUS_ERROR, "User must not be able to alter index impl table");
1627-
UNIT_ASSERT_VALUES_EQUAL(result->Record.GetErrorReason(), "Administrative access denied");
1628-
}
1629-
1630-
{ // with root token request is accepted
1608+
{ // regular users should be able to alter indexImplTable's PartitionConfig
16311609
Tests::TClient& client = kikimr.GetTestClient();
16321610
const TString scheme = R"(
16331611
Name: "indexImplTable"
@@ -1642,53 +1620,24 @@ Y_UNIT_TEST_SUITE(KqpMultishardIndex) {
16421620
}
16431621
}
16441622
)";
1645-
auto result = client.AlterTable("/Root/MultiShardIndexed/index", scheme, "root@builtin");
1646-
UNIT_ASSERT_VALUES_EQUAL_C(result->Record.GetStatus(), NMsgBusProxy::MSTATUS_OK, "Super user must be able to alter partition config");
1623+
auto result = client.AlterTable("/Root/MultiShardIndexed/index", scheme, {});
1624+
UNIT_ASSERT_VALUES_EQUAL_C(result->Record.GetStatus(), NMsgBusProxy::MSTATUS_OK,
1625+
result->Record.ShortDebugString()
1626+
);
16471627
}
16481628

1649-
{ // after alter yql works fine
1650-
const TString query(R"(
1629+
{ // yql works fine after alter
1630+
const TString query = R"(
16511631
SELECT * FROM `/Root/MultiShardIndexed` VIEW index ORDER BY fk DESC LIMIT 1;
1652-
)");
1632+
)";
16531633

16541634
auto result = session.ExecuteDataQuery(
1655-
query,
1656-
TTxControl::BeginTx(TTxSettings::SerializableRW()).CommitTx())
1657-
.ExtractValueSync();
1635+
query,
1636+
TTxControl::BeginTx(TTxSettings::SerializableRW()).CommitTx()
1637+
).ExtractValueSync();
16581638
UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
16591639
UNIT_ASSERT_VALUES_EQUAL(NYdb::FormatResultSetYson(result.GetResultSet(0)), "[[[4294967295u];[4u];[\"v4\"]]]");
16601640
}
1661-
1662-
FillTable(session);
1663-
1664-
{ // just for sure, public api got error when alter index
1665-
auto settings = NYdb::NTable::TAlterTableSettings()
1666-
.BeginAlterPartitioningSettings()
1667-
.SetPartitionSizeMb(50)
1668-
.SetMinPartitionsCount(4)
1669-
.SetMaxPartitionsCount(5)
1670-
.EndAlterPartitioningSettings();
1671-
1672-
auto result = session.AlterTable("/Root/MultiShardIndexed/index/indexImplTable", settings).ExtractValueSync();
1673-
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SCHEME_ERROR, result.GetIssues().ToString());
1674-
}
1675-
1676-
{ // however public api is able to perform alter index if user has AlterSchema right and user is a member of the list AdministrationAllowedSIDs
1677-
auto clSettings = NYdb::NTable::TClientSettings().AuthToken("root@builtin").UseQueryCache(false);
1678-
auto client = NYdb::NTable::TTableClient(kikimr.GetDriver(), clSettings);
1679-
auto session = client.CreateSession().GetValueSync().GetSession();
1680-
1681-
auto settings = NYdb::NTable::TAlterTableSettings()
1682-
.BeginAlterPartitioningSettings()
1683-
.SetPartitionSizeMb(50)
1684-
.SetMinPartitionsCount(4)
1685-
.SetMaxPartitionsCount(5)
1686-
.EndAlterPartitioningSettings();
1687-
1688-
auto result = session.AlterTable("/Root/MultiShardIndexed/index/indexImplTable", settings).ExtractValueSync();
1689-
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString());
1690-
}
1691-
16921641
}
16931642

16941643
Y_UNIT_TEST_TWIN(DataColumnUpsertMixedSemantic, StreamLookup) {

0 commit comments

Comments
 (0)