Skip to content

Commit d3f5abd

Browse files
authored
Merge 7d84e96 into 4d73159
2 parents 4d73159 + 7d84e96 commit d3f5abd

13 files changed

Lines changed: 240 additions & 5 deletions

File tree

ydb/core/protos/flat_tx_scheme.proto

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,8 @@ message TSchemeLimits {
190190

191191
optional uint64 MaxExports = 16;
192192
optional uint64 MaxImports = 17;
193+
194+
optional uint64 MaxColumnTableColumns = 18;
193195
}
194196

195197
message TEvInitTenantSchemeShard {

ydb/core/tx/schemeshard/olap/operations/alter/standalone/update.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,21 @@ NKikimr::TConclusionStatus TStandaloneSchemaUpdate::DoInitializeImpl(const TUpda
3636
return TConclusionStatus::Fail("schema update error: " + collector->GetErrorMessage() + ". in alter constructor STANDALONE_UPDATE");
3737
}
3838
}
39+
40+
const TString& parentPathStr = context.GetModification()->GetWorkingDir();
41+
if (parentPathStr) { // Not empty only if called from Propose, not from ProgressState
42+
NSchemeShard::TPath parentPath = NSchemeShard::TPath::Resolve(parentPathStr, context.GetSSOperationContext()->SS);
43+
auto domainInfo = parentPath.DomainInfo();
44+
const TSchemeLimits& limits = domainInfo->GetSchemeLimits();
45+
if (targetSchema.GetColumns().GetColumns().size() > limits.MaxColumnTableColumns) {
46+
TString errStr = TStringBuilder()
47+
<< "Too many columns"
48+
<< ": new: " << targetSchema.GetColumns().GetColumns().size()
49+
<< ". Limit: " << limits.MaxColumnTableColumns;
50+
return TConclusionStatus::Fail(errStr);
51+
}
52+
}
53+
3954
auto description = originalTable.GetTableInfoVerified().Description;
4055
targetSchema.Serialize(*description.MutableSchema());
4156
auto ttl = originalTable.GetTableTTLOptional() ? *originalTable.GetTableTTLOptional() : TOlapTTL();

ydb/core/tx/schemeshard/olap/operations/alter_store.cpp

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
#include <ydb/core/tx/schemeshard/schemeshard__operation_common.h>
33
#include <ydb/core/tx/schemeshard/schemeshard_impl.h>
44

5+
#include "checks.h"
6+
57
namespace {
68

79
using namespace NKikimr;
@@ -458,7 +460,8 @@ class TAlterOlapStore: public TSubOperation {
458460
return result;
459461
}
460462

461-
TPath path = TPath::Resolve(parentPathStr, context.SS).Dive(name);
463+
TPath parentPath = TPath::Resolve(parentPathStr, context.SS);
464+
TPath path = parentPath.Dive(name);
462465
{
463466
TPath::TChecker checks = path.Check();
464467
checks
@@ -504,6 +507,15 @@ class TAlterOlapStore: public TSubOperation {
504507
if (!alterData) {
505508
return result;
506509
}
510+
511+
auto domainInfo = parentPath.DomainInfo();
512+
const TSchemeLimits& limits = domainInfo->GetSchemeLimits();
513+
514+
if (!NKikimr::NSchemeShard::NOlap::CheckLimits(limits, alterData, errStr)) {
515+
result->SetError(NKikimrScheme::StatusSchemeError, errStr);
516+
return result;
517+
}
518+
507519
storeInfo->AlterData = alterData;
508520

509521
NIceDb::TNiceDb db(context.GetDB());
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
#pragma once
2+
3+
namespace NKikimr::NSchemeShard::NOlap {
4+
inline bool CheckLimits(const TSchemeLimits& limits, TOlapStoreInfo::TPtr alterData, TString& errStr) {
5+
for (auto& [_, preset]: alterData->SchemaPresets) {
6+
ui64 columnCount = preset.GetColumns().GetColumns().size();
7+
if (columnCount > limits.MaxColumnTableColumns) {
8+
errStr = TStringBuilder()
9+
<< "Too many columns"
10+
<< ". new: " << columnCount
11+
<< ". Limit: " << limits.MaxColumnTableColumns;
12+
return false;
13+
}
14+
}
15+
return true;
16+
}
17+
}
18+
19+

ydb/core/tx/schemeshard/olap/operations/create_store.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
#include <ydb/core/tx/columnshard/columnshard.h>
88
#include <ydb/core/mind/hive/hive.h>
99

10+
#include "checks.h"
11+
1012
using namespace NKikimr;
1113
using namespace NKikimr::NSchemeShard;
1214

@@ -394,12 +396,20 @@ class TCreateOlapStore: public TSubOperation {
394396
return result;
395397
}
396398

399+
auto domainInfo = parentPath.DomainInfo();
400+
const TSchemeLimits& limits = domainInfo->GetSchemeLimits();
401+
397402
TProposeErrorCollector errors(*result);
398403
TOlapStoreInfo::TPtr storeInfo = std::make_shared<TOlapStoreInfo>();
399404
if (!storeInfo->ParseFromRequest(createDescription, errors)) {
400405
return result;
401406
}
402407

408+
if (!NKikimr::NSchemeShard::NOlap::CheckLimits(limits, storeInfo, errStr)) {
409+
result->SetError(NKikimrScheme::StatusSchemeError, errStr);
410+
return result;
411+
}
412+
403413
// Construct channels bindings for columnshards
404414
TChannelsBindings channelsBindings;
405415
if (!context.SS->GetOlapChannelsBindings(dstPath.GetPathIdForDomain(), storeInfo->GetStorageConfig(), channelsBindings, errStr)) {

ydb/core/tx/schemeshard/olap/operations/create_table.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -681,11 +681,23 @@ class TCreateColumnTable: public TSubOperation {
681681
TProposeErrorCollector errors(*result);
682682
TColumnTableInfo::TPtr tableInfo;
683683
bool needUpdateObject = false;
684+
auto domainInfo = parentPath.DomainInfo();
685+
const TSchemeLimits& limits = domainInfo->GetSchemeLimits();
686+
684687
if (storeInfo) {
685688
TOlapPresetConstructor tableConstructor(*storeInfo);
686689
tableInfo = tableConstructor.BuildTableInfo(createDescription, context, errors);
687690
needUpdateObject = tableConstructor.GetNeedUpdateObject();
688691
} else {
692+
ui64 columnCount = createDescription.schema().columns().size();
693+
if (columnCount > limits.MaxColumnTableColumns) {
694+
TString errStr = TStringBuilder()
695+
<< "Too many columns"
696+
<< ". new: " << columnCount
697+
<< ". Limit: " << limits.MaxColumnTableColumns;
698+
result->SetError(NKikimrScheme::StatusSchemeError, errStr);
699+
return result;
700+
}
689701
TOlapTableConstructor tableConstructor;
690702
tableInfo = tableConstructor.BuildTableInfo(createDescription, context, errors);
691703
}

ydb/core/tx/schemeshard/schemeshard__init.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1243,6 +1243,7 @@ struct TSchemeShard::TTxInit : public TTransactionBase<TSchemeShard> {
12431243
.MaxPathElementLength = rowSet.template GetValueOrDefault<Schema::SubDomains::PathElementLength>(defaults.MaxPathElementLength),
12441244
.ExtraPathSymbolsAllowed = rowSet.template GetValueOrDefault<Schema::SubDomains::ExtraPathSymbolsAllowed>(defaults.ExtraPathSymbolsAllowed),
12451245
.MaxTableColumns = rowSet.template GetValueOrDefault<Schema::SubDomains::TableColumnsLimit>(defaults.MaxTableColumns),
1246+
.MaxColumnTableColumns = rowSet.template GetValueOrDefault<Schema::SubDomains::ColumnTableColumnsLimit>(defaults.MaxColumnTableColumns),
12461247
.MaxTableColumnNameLength = rowSet.template GetValueOrDefault<Schema::SubDomains::TableColumnNameLengthLimit>(defaults.MaxTableColumnNameLength),
12471248
.MaxTableKeyColumns = rowSet.template GetValueOrDefault<Schema::SubDomains::TableKeyColumnsLimit>(defaults.MaxTableKeyColumns),
12481249
.MaxTableIndices = rowSet.template GetValueOrDefault<Schema::SubDomains::TableIndicesLimit>(defaults.MaxTableIndices),

ydb/core/tx/schemeshard/schemeshard_schema.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -768,6 +768,7 @@ struct Schema : NIceDb::Schema {
768768
struct ImportsLimit : Column<29, NScheme::NTypeIds::Uint64> {};
769769
struct AuditSettings : Column<30, NScheme::NTypeIds::String> {};
770770
struct ServerlessComputeResourcesMode : Column<31, NScheme::NTypeIds::Uint32> { using Type = EServerlessComputeResourcesMode; };
771+
struct ColumnTableColumnsLimit : Column<32, NScheme::NTypeIds::Uint64> {};
771772

772773
using TKey = TableKey<PathId>;
773774
using TColumns = TableColumns<
@@ -801,7 +802,8 @@ struct Schema : NIceDb::Schema {
801802
ExportsLimit,
802803
ImportsLimit,
803804
AuditSettings,
804-
ServerlessComputeResourcesMode
805+
ServerlessComputeResourcesMode,
806+
ColumnTableColumnsLimit
805807
>;
806808
};
807809

ydb/core/tx/schemeshard/schemeshard_types.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ TSchemeLimits TSchemeLimits::FromProto(const NKikimrScheme::TSchemeLimits& proto
2020
if (proto.HasMaxTableColumns()) {
2121
result.MaxTableColumns = proto.GetMaxTableColumns();
2222
}
23+
if (proto.HasMaxColumnTableColumns()) {
24+
result.MaxColumnTableColumns = proto.GetMaxColumnTableColumns();
25+
}
2326
if (proto.HasMaxTableColumnNameLength()) {
2427
result.MaxTableColumnNameLength = proto.GetMaxTableColumnNameLength();
2528
}
@@ -69,6 +72,7 @@ NKikimrScheme::TSchemeLimits TSchemeLimits::AsProto() const {
6972
result.SetMaxAclBytesSize(MaxAclBytesSize);
7073

7174
result.SetMaxTableColumns(MaxTableColumns);
75+
result.SetMaxColumnTableColumns(MaxColumnTableColumns);
7276
result.SetMaxTableColumnNameLength(MaxTableColumnNameLength);
7377
result.SetMaxTableKeyColumns(MaxTableKeyColumns);
7478
result.SetMaxTableIndices(MaxTableIndices);

ydb/core/tx/schemeshard/schemeshard_types.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ struct TSchemeLimits {
3939

4040
// table
4141
ui64 MaxTableColumns = 200;
42+
ui64 MaxColumnTableColumns = 10000;
4243
ui64 MaxTableColumnNameLength = 255;
4344
ui64 MaxTableKeyColumns = 20;
4445
ui64 MaxTableIndices = 20;

0 commit comments

Comments
 (0)