Skip to content

Commit 9f0b790

Browse files
author
Vladislav Gogov
authored
AlterColumnTable (#10672)
1 parent 2038471 commit 9f0b790

File tree

8 files changed

+115
-34
lines changed

8 files changed

+115
-34
lines changed

ydb/core/kqp/gateway/kqp_ic_gateway.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1071,10 +1071,9 @@ class TKikimrIcGateway : public IKqpGateway {
10711071
return NotImplemented<TGenericResult>();
10721072
}
10731073

1074-
TFuture<TGenericResult> AlterColumnTable(const TString& cluster,
1075-
const NYql::TAlterColumnTableSettings& settings) override {
1074+
TFuture<TGenericResult> AlterColumnTable(const TString& cluster, Ydb::Table::AlterTableRequest&& req) override {
10761075
Y_UNUSED(cluster);
1077-
Y_UNUSED(settings);
1076+
Y_UNUSED(req);
10781077
return NotImplemented<TGenericResult>();
10791078
}
10801079

ydb/core/kqp/gateway/kqp_metadata_loader.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,10 +149,14 @@ TTableMetadataResult GetTableMetadataResult(const NSchemeCache::TSchemeCacheNavi
149149
switch (entry.Kind) {
150150
case EKind::KindTable:
151151
tableMeta->Kind = NYql::EKikimrTableKind::Datashard;
152+
tableMeta->TableType = NYql::ETableType::Table;
153+
tableMeta->StoreType = NYql::EStoreType::Row;
152154
break;
153155

154156
case EKind::KindColumnTable:
155157
tableMeta->Kind = NYql::EKikimrTableKind::Olap;
158+
tableMeta->TableType = NYql::ETableType::Table;
159+
tableMeta->StoreType = NYql::EStoreType::Column;
156160
break;
157161

158162
default:

ydb/core/kqp/host/kqp_gateway_proxy.cpp

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1524,30 +1524,24 @@ class TKqpGatewayProxy : public IKikimrGateway {
15241524
}
15251525
}
15261526

1527-
TFuture<TGenericResult> AlterColumnTable(const TString& cluster,
1528-
const TAlterColumnTableSettings& settings) override
1529-
{
1527+
TFuture<TGenericResult> AlterColumnTable(const TString& cluster, Ydb::Table::AlterTableRequest&& req) override {
15301528
CHECK_PREPARED_DDL(AlterColumnTable);
15311529

15321530
try {
15331531
if (cluster != SessionCtx->GetCluster()) {
15341532
return MakeFuture(ResultFromError<TGenericResult>("Invalid cluster: " + cluster));
15351533
}
15361534

1537-
std::pair<TString, TString> pathPair;
1538-
{
1539-
TString error;
1540-
if (!NSchemeHelpers::SplitTablePath(settings.Table, GetDatabase(), pathPair, error, false)) {
1541-
return MakeFuture(ResultFromError<TGenericResult>(error));
1542-
}
1543-
}
1544-
15451535
NKikimrSchemeOp::TModifyScheme schemeTx;
1546-
schemeTx.SetWorkingDir(pathPair.first);
15471536

1548-
schemeTx.SetOperationType(NKikimrSchemeOp::ESchemeOpAlterColumnTable);
1549-
NKikimrSchemeOp::TAlterColumnTable* alter = schemeTx.MutableAlterColumnTable();
1550-
alter->SetName(settings.Table);
1537+
Ydb::StatusIds::StatusCode code;
1538+
TString error;
1539+
if (!BuildAlterColumnTableModifyScheme(&req, &schemeTx, code, error)) {
1540+
IKqpGateway::TGenericResult errResult;
1541+
errResult.AddIssue(NYql::TIssue(error));
1542+
errResult.SetStatus(NYql::YqlStatusFromYdbStatus(code));
1543+
return MakeFuture(errResult);
1544+
}
15511545

15521546
if (IsPrepare()) {
15531547
auto& phyQuery = *SessionCtx->Query().PreparingQuery->MutablePhysicalQuery();

ydb/core/kqp/provider/yql_kikimr_exec.cpp

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -292,12 +292,6 @@ namespace {
292292
};
293293
}
294294

295-
TAlterColumnTableSettings ParseAlterColumnTableSettings(TKiAlterTable alter) {
296-
return TAlterColumnTableSettings{
297-
.Table = TString(alter.Table())
298-
};
299-
}
300-
301295
TSequenceSettings ParseSequenceSettings(const TCoNameValueTupleList& sequenceSettings) {
302296
TSequenceSettings result;
303297
for (const auto& setting: sequenceSettings) {
@@ -1979,18 +1973,19 @@ class TKiSinkCallableExecutionTransformer : public TAsyncCallbackTransformer<TKi
19791973
}
19801974

19811975
NThreading::TFuture<IKikimrGateway::TGenericResult> future;
1982-
bool isTableStore = (table.Metadata->TableType == ETableType::TableStore);
1976+
bool isTableStore = (table.Metadata->TableType == ETableType::TableStore); // Doesn't set, so always false
19831977
bool isColumn = (table.Metadata->StoreType == EStoreType::Column);
19841978

19851979
if (isTableStore) {
1980+
AFL_VERIFY(false);
19861981
if (!isColumn) {
19871982
ctx.AddError(TIssue(ctx.GetPosition(input->Pos()),
19881983
TStringBuilder() << "TABLESTORE with not COLUMN store"));
19891984
return SyncError();
19901985
}
19911986
future = Gateway->AlterTableStore(cluster, ParseAlterTableStoreSettings(maybeAlter.Cast()));
19921987
} else if (isColumn) {
1993-
future = Gateway->AlterColumnTable(cluster, ParseAlterColumnTableSettings(maybeAlter.Cast()));
1988+
future = Gateway->AlterColumnTable(cluster, std::move(alterTableRequest));
19941989
} else {
19951990
TMaybe<TString> requestType;
19961991
if (!SessionCtx->Query().DocumentApiRestricted) {

ydb/core/kqp/provider/yql_kikimr_gateway.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1061,7 +1061,7 @@ class IKikimrGateway : public TThrRefBase {
10611061
virtual NThreading::TFuture<TGenericResult> CreateColumnTable(
10621062
TKikimrTableMetadataPtr metadata, bool createDir, bool existingOk = false) = 0;
10631063

1064-
virtual NThreading::TFuture<TGenericResult> AlterColumnTable(const TString& cluster, const TAlterColumnTableSettings& settings) = 0;
1064+
virtual NThreading::TFuture<TGenericResult> AlterColumnTable(const TString& cluster, Ydb::Table::AlterTableRequest&& req) = 0;
10651065

10661066
virtual NThreading::TFuture<TGenericResult> CreateTableStore(const TString& cluster,
10671067
const TCreateTableStoreSettings& settings, bool existingOk = false) = 0;

ydb/core/kqp/ut/scheme/kqp_scheme_ut.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5116,6 +5116,7 @@ Y_UNIT_TEST_SUITE(KqpScheme) {
51165116
Y_UNIT_TEST(AlterColumnTableTiering) {
51175117
TKikimrSettings runnerSettings;
51185118
runnerSettings.WithSampleTables = false;
5119+
runnerSettings.SetEnableTieringInColumnShard(true);
51195120
TKikimrRunner kikimr(runnerSettings);
51205121
auto db = kikimr.GetTableClient();
51215122
auto session = db.CreateSession().GetValueSync().GetSession();

ydb/core/ydb_convert/table_description.cpp

Lines changed: 87 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -733,18 +733,25 @@ bool FillColumnDescription(NKikimrSchemeOp::TTableDescription& out,
733733
return true;
734734
}
735735

736-
bool FillColumnDescription(NKikimrSchemeOp::TColumnTableDescription& out,
737-
const google::protobuf::RepeatedPtrField<Ydb::Table::ColumnMeta>& in, Ydb::StatusIds::StatusCode& status, TString& error) {
738-
auto* schema = out.MutableSchema();
736+
NKikimrSchemeOp::TOlapColumnDescription* GetAddColumn(NKikimrSchemeOp::TColumnTableDescription& out) {
737+
return out.MutableSchema()->AddColumns();
738+
}
739+
740+
NKikimrSchemeOp::TOlapColumnDescription* GetAddColumn(NKikimrSchemeOp::TAlterColumnTable& out) {
741+
return out.MutableAlterSchema()->AddAddColumns();
742+
}
739743

744+
template <typename TColumnTable>
745+
bool FillColumnDescriptionImpl(TColumnTable& out, const google::protobuf::RepeatedPtrField<Ydb::Table::ColumnMeta>& in,
746+
Ydb::StatusIds::StatusCode& status, TString& error) {
740747
for (const auto& column : in) {
741748
if (column.type().has_pg_type()) {
742749
status = Ydb::StatusIds::BAD_REQUEST;
743750
error = "Unsupported column type for column: " + column.name();
744751
return false;
745752
}
746753

747-
auto* columnDesc = schema->AddColumns();
754+
auto* columnDesc = GetAddColumn(out);
748755
columnDesc->SetName(column.name());
749756

750757
NScheme::TTypeInfo typeInfo;
@@ -763,6 +770,81 @@ bool FillColumnDescription(NKikimrSchemeOp::TColumnTableDescription& out,
763770
return true;
764771
}
765772

773+
bool FillColumnDescription(NKikimrSchemeOp::TColumnTableDescription& out, const google::protobuf::RepeatedPtrField<Ydb::Table::ColumnMeta>& in,
774+
Ydb::StatusIds::StatusCode& status, TString& error) {
775+
return FillColumnDescriptionImpl(out, in, status, error);
776+
}
777+
778+
bool FillColumnDescription(NKikimrSchemeOp::TAlterColumnTable& out, const google::protobuf::RepeatedPtrField<Ydb::Table::ColumnMeta>& in,
779+
Ydb::StatusIds::StatusCode& status, TString& error) {
780+
return FillColumnDescriptionImpl(out, in, status, error);
781+
}
782+
783+
bool BuildAlterColumnTableModifyScheme(const TString& path, const Ydb::Table::AlterTableRequest* req,
784+
NKikimrSchemeOp::TModifyScheme* modifyScheme, Ydb::StatusIds::StatusCode& status, TString& error) {
785+
const auto ops = GetAlterOperationKinds(req);
786+
if (ops.empty()) {
787+
status = Ydb::StatusIds::BAD_REQUEST;
788+
error = "Empty alter";
789+
return false;
790+
}
791+
792+
if (ops.size() > 1) {
793+
status = Ydb::StatusIds::UNSUPPORTED;
794+
error = "Mixed alter is unsupported";
795+
return false;
796+
}
797+
798+
const auto OpType = *ops.begin();
799+
800+
std::pair<TString, TString> pathPair;
801+
try {
802+
pathPair = SplitPathIntoWorkingDirAndName(path);
803+
} catch (const std::exception&) {
804+
status = Ydb::StatusIds::BAD_REQUEST;
805+
return false;
806+
}
807+
808+
const auto& workingDir = pathPair.first;
809+
const auto& name = pathPair.second;
810+
modifyScheme->SetWorkingDir(workingDir);
811+
812+
if (OpType == EAlterOperationKind::Common) {
813+
auto alterColumnTable = modifyScheme->MutableAlterColumnTable();
814+
alterColumnTable->SetName(name);
815+
modifyScheme->SetOperationType(NKikimrSchemeOp::EOperationType::ESchemeOpAlterColumnTable);
816+
817+
for (const auto& drop : req->drop_columns()) {
818+
alterColumnTable->MutableAlterSchema()->AddDropColumns()->SetName(drop);
819+
}
820+
821+
if (!FillColumnDescription(*alterColumnTable, req->add_columns(), status, error)) {
822+
return false;
823+
}
824+
825+
if (req->has_set_ttl_settings()) {
826+
if (!FillTtlSettings(*alterColumnTable->MutableAlterTtlSettings()->MutableEnabled(), req->Getset_ttl_settings(), status, error)) {
827+
return false;
828+
}
829+
} else if (req->has_drop_ttl_settings()) {
830+
alterColumnTable->MutableAlterTtlSettings()->MutableDisabled();
831+
}
832+
833+
if (req->has_set_tiering()) {
834+
alterColumnTable->MutableAlterTtlSettings()->SetUseTiering(req->set_tiering());
835+
} else if (req->has_drop_tiering()) {
836+
alterColumnTable->MutableAlterTtlSettings()->SetUseTiering("");
837+
}
838+
}
839+
840+
return true;
841+
}
842+
843+
bool BuildAlterColumnTableModifyScheme(
844+
const Ydb::Table::AlterTableRequest* req, NKikimrSchemeOp::TModifyScheme* modifyScheme, Ydb::StatusIds::StatusCode& code, TString& error) {
845+
return BuildAlterColumnTableModifyScheme(req->path(), req, modifyScheme, code, error);
846+
}
847+
766848
template <typename TYdbProto>
767849
void FillTableBoundaryImpl(TYdbProto& out,
768850
const NKikimrSchemeOp::TTableDescription& in, const NKikimrMiniKQL::TType& splitKeyType) {
@@ -1667,4 +1749,4 @@ bool FillSequenceDescription(NKikimrSchemeOp::TSequenceDescription& out, const Y
16671749
return true;
16681750
}
16691751

1670-
} // namespace NKikimr
1752+
} // namespace NKikimr

ydb/core/ydb_convert/table_description.h

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,10 @@ bool BuildAlterTableModifyScheme(const TString& path, const Ydb::Table::AlterTab
3737
bool BuildAlterTableModifyScheme(const Ydb::Table::AlterTableRequest* req, NKikimrSchemeOp::TModifyScheme* modifyScheme,
3838
const TTableProfiles& profiles, const TPathId& resolvedPathId,
3939
Ydb::StatusIds::StatusCode& status, TString& error);
40+
bool BuildAlterColumnTableModifyScheme(const TString& path, const Ydb::Table::AlterTableRequest* req,
41+
NKikimrSchemeOp::TModifyScheme* modifyScheme, Ydb::StatusIds::StatusCode& status, TString& error);
42+
bool BuildAlterColumnTableModifyScheme(
43+
const Ydb::Table::AlterTableRequest* req, NKikimrSchemeOp::TModifyScheme* modifyScheme, Ydb::StatusIds::StatusCode& status, TString& error);
4044

4145
bool FillAlterTableSettingsDesc(NKikimrSchemeOp::TTableDescription& out,
4246
const Ydb::Table::AlterTableRequest& in, const TTableProfiles& profiles,
@@ -55,8 +59,10 @@ void FillColumnDescription(Ydb::Table::DescribeTableResult& out, const NKikimrSc
5559
// in
5660
bool FillColumnDescription(NKikimrSchemeOp::TTableDescription& out,
5761
const google::protobuf::RepeatedPtrField<Ydb::Table::ColumnMeta>& in, Ydb::StatusIds::StatusCode& status, TString& error);
58-
bool FillColumnDescription(NKikimrSchemeOp::TColumnTableDescription& out,
59-
const google::protobuf::RepeatedPtrField<Ydb::Table::ColumnMeta>& in, Ydb::StatusIds::StatusCode& status, TString& error);
62+
bool FillColumnDescription(NKikimrSchemeOp::TColumnTableDescription& out, const google::protobuf::RepeatedPtrField<Ydb::Table::ColumnMeta>& in,
63+
Ydb::StatusIds::StatusCode& status, TString& error);
64+
bool FillColumnDescription(NKikimrSchemeOp::TAlterColumnTable& out, const google::protobuf::RepeatedPtrField<Ydb::Table::ColumnMeta>& in,
65+
Ydb::StatusIds::StatusCode& status, TString& error);
6066
bool ExtractColumnTypeInfo(NScheme::TTypeInfo& outTypeInfo, TString& outTypeMod,
6167
const Ydb::Type& inType, Ydb::StatusIds::StatusCode& status, TString& error);
6268

0 commit comments

Comments
 (0)