aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorchertus <azuikov@ydb.tech>2022-11-22 20:29:23 +0300
committerchertus <azuikov@ydb.tech>2022-11-22 20:29:23 +0300
commit1ddb2b4f00e412e37019b2e00bf1b1a910fa4c11 (patch)
tree8621db02265e83131bf771c1b640166bdc40ab92
parente753c972bc3483c506767cda66f6daee10543434 (diff)
downloadydb-1ddb2b4f00e412e37019b2e00bf1b1a910fa4c11.tar.gz
description for ColumnTable
-rw-r--r--ydb/core/grpc_services/rpc_describe_table.cpp11
-rw-r--r--ydb/core/kqp/gateway/kqp_ic_gateway.cpp18
-rw-r--r--ydb/core/kqp/ut/kqp_scheme_ut.cpp141
-rw-r--r--ydb/core/protos/flat_scheme_op.proto4
-rw-r--r--ydb/core/tx/schemeshard/ut_olap.cpp44
-rw-r--r--ydb/core/ydb_convert/table_description.cpp134
-rw-r--r--ydb/core/ydb_convert/table_description.h2
-rw-r--r--ydb/library/yql/sql/v1/sql.cpp15
-rw-r--r--ydb/public/api/protos/ydb_table.proto4
9 files changed, 297 insertions, 76 deletions
diff --git a/ydb/core/grpc_services/rpc_describe_table.cpp b/ydb/core/grpc_services/rpc_describe_table.cpp
index 71a6970736e..16a58a86217 100644
--- a/ydb/core/grpc_services/rpc_describe_table.cpp
+++ b/ydb/core/grpc_services/rpc_describe_table.cpp
@@ -57,6 +57,17 @@ private:
selfEntry->set_type(static_cast<Ydb::Scheme::Entry::Type>(pathDescription.GetSelf().GetPathType()));
ConvertDirectoryEntry(pathDescription.GetSelf(), selfEntry, true);
+ if (pathDescription.HasColumnTableDescription()) {
+ const auto& tableDescription = pathDescription.GetColumnTableDescription();
+ FillColumnDescription(describeTableResult, tableDescription);
+
+ if (GetProtoRequest()->include_table_stats()) {
+ FillColumnTableStats(describeTableResult, pathDescription);
+ }
+
+ return ReplyWithResult(Ydb::StatusIds::SUCCESS, describeTableResult, ctx);
+ }
+
const auto& tableDescription = pathDescription.GetTable();
NKikimrMiniKQL::TType splitKeyType;
diff --git a/ydb/core/kqp/gateway/kqp_ic_gateway.cpp b/ydb/core/kqp/gateway/kqp_ic_gateway.cpp
index fc1043d3db5..aa484309013 100644
--- a/ydb/core/kqp/gateway/kqp_ic_gateway.cpp
+++ b/ydb/core/kqp/gateway/kqp_ic_gateway.cpp
@@ -2463,15 +2463,17 @@ private:
tableDesc.SetSchemaPresetName("default");
}
- // TODO: not first PK column
- if (metadata->KeyColumnNames.empty()) {
- code = Ydb::StatusIds::BAD_REQUEST;
- error = TStringBuilder() << "No sharding columns to partition by";
- return false;
- }
-
auto& hashSharding = *tableDesc.MutableSharding()->MutableHashSharding();
- hashSharding.AddColumns(metadata->KeyColumnNames[0]);
+
+ for (const TString& column : metadata->TableSettings.PartitionBy) {
+ if (!metadata->Columns.count(column)) {
+ code = Ydb::StatusIds::BAD_REQUEST;
+ error = TStringBuilder() << "Unknown column '" << column << "' in partition by key";
+ return false;
+ }
+
+ hashSharding.AddColumns(column);
+ }
if (metadata->TableSettings.PartitionByHashFunction) {
if (to_lower(metadata->TableSettings.PartitionByHashFunction.GetRef()) == "cloud_logs") {
diff --git a/ydb/core/kqp/ut/kqp_scheme_ut.cpp b/ydb/core/kqp/ut/kqp_scheme_ut.cpp
index 8466b74a075..6fcaebae4c3 100644
--- a/ydb/core/kqp/ut/kqp_scheme_ut.cpp
+++ b/ydb/core/kqp/ut/kqp_scheme_ut.cpp
@@ -2804,7 +2804,9 @@ Y_UNIT_TEST_SUITE(KqpScheme) {
}
Y_UNIT_TEST(CreateAlterDropTableStore) {
- TKikimrRunner kikimr;
+ TKikimrSettings runnerSettings;
+ runnerSettings.WithSampleTables = false;
+ TKikimrRunner kikimr(runnerSettings);
auto db = kikimr.GetTableClient();
auto session = db.CreateSession().GetValueSync().GetSession();
TString tableStoreName = "/Root/TableStoreTest";
@@ -2840,7 +2842,9 @@ Y_UNIT_TEST_SUITE(KqpScheme) {
#if 0 // TODO
Y_UNIT_TEST(CreateDropInheritedColumnTable) {
- TKikimrRunner kikimr;
+ TKikimrSettings runnerSettings;
+ runnerSettings.WithSampleTables = false;
+ TKikimrRunner kikimr(runnerSettings);
auto db = kikimr.GetTableClient();
auto session = db.CreateSession().GetValueSync().GetSession();
TString tableName = "/Root/TableTest";
@@ -2903,7 +2907,9 @@ Y_UNIT_TEST_SUITE(KqpScheme) {
#endif
Y_UNIT_TEST(CreateTableStoreNegative) {
- TKikimrRunner kikimr;
+ TKikimrSettings runnerSettings;
+ runnerSettings.WithSampleTables = false;
+ TKikimrRunner kikimr(runnerSettings);
auto db = kikimr.GetTableClient();
auto session = db.CreateSession().GetValueSync().GetSession();
TString tableStoreName = "/Root/TableStoreTest";
@@ -2949,7 +2955,9 @@ Y_UNIT_TEST_SUITE(KqpScheme) {
}
Y_UNIT_TEST(CreateAlterDropColumnTableInStore) {
- TKikimrRunner kikimr;
+ TKikimrSettings runnerSettings;
+ runnerSettings.WithSampleTables = false;
+ TKikimrRunner kikimr(runnerSettings);
auto db = kikimr.GetTableClient();
auto session = db.CreateSession().GetValueSync().GetSession();
TString tableStoreName = "/Root/TableStoreTest";
@@ -3003,18 +3011,22 @@ Y_UNIT_TEST_SUITE(KqpScheme) {
}
Y_UNIT_TEST(CreateDropColumnTable) {
- TKikimrRunner kikimr;
+ TKikimrSettings runnerSettings;
+ runnerSettings.WithSampleTables = false;
+ TKikimrRunner kikimr(runnerSettings);
auto db = kikimr.GetTableClient();
auto session = db.CreateSession().GetValueSync().GetSession();
TString tableName = "/Root/ColumnTableTest";
+
auto query = TStringBuilder() << R"(
--!syntax_v1
CREATE TABLE `)" << tableName << R"(` (
- Key Uint64,
+ Key Uint64 NOT NULL,
Value1 String,
+ Value2 Int64 NOT NULL,
PRIMARY KEY (Key)
)
- PARTITION BY HASH(Key)
+ PARTITION BY HASH(Value1, Value2)
WITH (
STORE = COLUMN,
AUTO_PARTITIONING_MIN_PARTITIONS_COUNT = 10
@@ -3022,6 +3034,29 @@ Y_UNIT_TEST_SUITE(KqpScheme) {
auto result = session.ExecuteSchemeQuery(query).GetValueSync();
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString());
+ {
+ auto settings = TDescribeTableSettings()
+ .WithTableStatistics(true);
+ auto describeResult = session.DescribeTable("/Root/ColumnTableTest", settings).GetValueSync();
+ UNIT_ASSERT_C(describeResult.IsSuccess(), describeResult.GetIssues().ToString());
+
+ const auto& description = describeResult.GetTableDescription();
+ // TODO: table type
+ UNIT_ASSERT_VALUES_EQUAL(description.GetTableColumns().size(), 3);
+ // TODO: NOT NULL
+ UNIT_ASSERT_VALUES_EQUAL(description.GetPartitionsCount(), 10);
+ UNIT_ASSERT_VALUES_EQUAL(description.GetPrimaryKeyColumns().size(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(description.GetPrimaryKeyColumns()[0], "Key");
+
+ auto partSettings = description.GetPartitioningSettings().GetProto();
+ auto& partition_by = partSettings.partition_by();
+
+ UNIT_ASSERT_VALUES_EQUAL(partition_by.size(), 2);
+ UNIT_ASSERT_VALUES_EQUAL(partition_by[0], "Value1");
+ UNIT_ASSERT_VALUES_EQUAL(partition_by[1], "Value2");
+ // TODO: TTL
+ }
+
auto query2 = TStringBuilder() << R"(
--!syntax_v1
DROP TABLE `)" << tableName << R"(`;)";
@@ -3030,24 +3065,108 @@ Y_UNIT_TEST_SUITE(KqpScheme) {
}
Y_UNIT_TEST(CreateDropColumnTableNegative) {
- TKikimrRunner kikimr;
+ TKikimrSettings runnerSettings;
+ runnerSettings.WithSampleTables = false;
+ TKikimrRunner kikimr(runnerSettings);
auto db = kikimr.GetTableClient();
auto session = db.CreateSession().GetValueSync().GetSession();
TString tableName = "/Root/ColumnTableTest";
+
+ { // zero partitions count
+ auto query = TStringBuilder() << R"(
+ --!syntax_v1
+ CREATE TABLE `)" << tableName << R"(` (
+ Key Uint64 NOT NULL,
+ Value1 String,
+ PRIMARY KEY (Key)
+ )
+ PARTITION BY HASH (Key)
+ WITH (
+ STORE = COLUMN,
+ AUTO_PARTITIONING_MIN_PARTITIONS_COUNT = 0
+ );)";
+ auto result = session.ExecuteSchemeQuery(query).GetValueSync();
+ UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::GENERIC_ERROR, result.GetIssues().ToString());
+ }
+
+ { // no partition by
+ auto query = TStringBuilder() << R"(
+ --!syntax_v1
+ CREATE TABLE `)" << tableName << R"(` (
+ Key Uint64,
+ Value1 String,
+ PRIMARY KEY (Key)
+ )
+ WITH (
+ STORE = COLUMN,
+ AUTO_PARTITIONING_MIN_PARTITIONS_COUNT = 1
+ );)";
+ auto result = session.ExecuteSchemeQuery(query).GetValueSync();
+ UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::GENERIC_ERROR, result.GetIssues().ToString());
+ }
+#if 0
+ { // disallow nullable key
+ auto query = TStringBuilder() << R"(
+ --!syntax_v1
+ CREATE TABLE `)" << tableName << R"(` (
+ Key Uint64,
+ Value1 String,
+ PRIMARY KEY (Key)
+ )
+ PARTITION BY HASH (Key)
+ WITH (
+ STORE = COLUMN,
+ AUTO_PARTITIONING_MIN_PARTITIONS_COUNT = 1
+ );)";
+ auto result = session.ExecuteSchemeQuery(query).GetValueSync();
+ UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::GENERIC_ERROR, result.GetIssues().ToString());
+ }
+#endif
+ }
+#if 0
+ Y_UNIT_TEST(AlterColumnTableTtl) {
+ TKikimrSettings runnerSettings;
+ runnerSettings.WithSampleTables = false;
+ TKikimrRunner kikimr(runnerSettings);
+ auto db = kikimr.GetTableClient();
+ auto session = db.CreateSession().GetValueSync().GetSession();
+ TString tableName = "/Root/ColumnTableTest";
+
auto query = TStringBuilder() << R"(
--!syntax_v1
CREATE TABLE `)" << tableName << R"(` (
- Key Uint64,
+ Key Uint64 NOT NULL,
Value1 String,
+ Value2 Int64 NOT NULL,
PRIMARY KEY (Key)
)
+ PARTITION BY HASH(Value1, Value2)
WITH (
STORE = COLUMN,
- AUTO_PARTITIONING_MIN_PARTITIONS_COUNT = 0
+ AUTO_PARTITIONING_MIN_PARTITIONS_COUNT = 10
);)";
auto result = session.ExecuteSchemeQuery(query).GetValueSync();
- UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::GENERIC_ERROR, result.GetIssues().ToString());
+ UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString());
+
+ auto query2 = TStringBuilder() << R"(
+ --!syntax_v1
+ ALTER TABLE `)" << tableName << R"(` SET(TTL Interval("P1D") ON Key);)";
+ result = session.ExecuteSchemeQuery(query2).GetValueSync();
+ UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString());
+
+ auto query3 = TStringBuilder() << R"(
+ --!syntax_v1
+ ALTER TABLE `)" << tableName << R"(` RESET (TTL);)";
+ result = session.ExecuteSchemeQuery(query3).GetValueSync();
+ UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString());
+
+ auto query4 = TStringBuilder() << R"(
+ --!syntax_v1
+ DROP TABLE `)" << tableName << R"(`;)";
+ result = session.ExecuteSchemeQuery(query4).GetValueSync();
+ UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString());
}
+#endif
}
} // namespace NKqp
diff --git a/ydb/core/protos/flat_scheme_op.proto b/ydb/core/protos/flat_scheme_op.proto
index dedaf77ad64..1cc87172440 100644
--- a/ydb/core/protos/flat_scheme_op.proto
+++ b/ydb/core/protos/flat_scheme_op.proto
@@ -375,9 +375,7 @@ message TOlapColumnDescription {
optional string Type = 3;
optional uint32 TypeId = 4; // TypeId cannot be set explicitly, use Type
optional NKikimrProto.TTypeInfo TypeInfo = 6;
-
- // TODO: Intermediate codecs such as Delta, DubleDelta, dictionary encoding, etc.
- //TCompressionOptions Compression = 5;
+ optional bool NotNull = 7;
}
message TAlterOlapColumn {
diff --git a/ydb/core/tx/schemeshard/ut_olap.cpp b/ydb/core/tx/schemeshard/ut_olap.cpp
index 86c57b5de28..6b98e69e8b4 100644
--- a/ydb/core/tx/schemeshard/ut_olap.cpp
+++ b/ydb/core/tx/schemeshard/ut_olap.cpp
@@ -408,6 +408,50 @@ Y_UNIT_TEST_SUITE(TOlap) {
TestLs(runtime, "/MyRoot/MyDir/ColumnTable", false, NLs::PathNotExist);
TestLsPathId(runtime, 3, NLs::PathStringEqual(""));
+
+ // PARTITION BY ()
+
+ TString otherSchema = R"(
+ Name: "ColumnTable"
+ ColumnShardCount: 4
+ Schema {
+ Columns { Name: "timestamp" Type: "Timestamp" }
+ Columns { Name: "some" Type: "Uint64" }
+ Columns { Name: "data" Type: "Utf8" }
+ KeyColumnNames: "some"
+ Engine: COLUMN_ENGINE_REPLACING_TIMESERIES
+ }
+ Sharding {
+ HashSharding {
+ Columns: ["some", "data"]
+ }
+ }
+ )";
+
+ TestCreateColumnTable(runtime, ++txId, "/MyRoot/MyDir", otherSchema);
+ env.TestWaitNotification(runtime, txId);
+
+ auto checkFn = [&](const NKikimrScheme::TEvDescribeSchemeResult& record) {
+ UNIT_ASSERT_VALUES_EQUAL(record.GetPath(), "/MyRoot/MyDir/ColumnTable");
+
+ auto& sharding = record.GetPathDescription().GetColumnTableDescription().GetSharding();
+ UNIT_ASSERT_VALUES_EQUAL(sharding.ColumnShardsSize(), 4);
+ UNIT_ASSERT(sharding.HasHashSharding());
+ auto& hashSharding = sharding.GetHashSharding();
+ UNIT_ASSERT_VALUES_EQUAL(hashSharding.ColumnsSize(), 2);
+ UNIT_ASSERT_EQUAL(hashSharding.GetFunction(),
+ NKikimrSchemeOp::TColumnTableSharding::THashSharding::HASH_FUNCTION_MODULO_N);
+ UNIT_ASSERT_VALUES_EQUAL(hashSharding.GetColumns()[0], "some");
+ UNIT_ASSERT_VALUES_EQUAL(hashSharding.GetColumns()[1], "data");
+ };
+
+ TestLsPathId(runtime, 4, checkFn);
+
+ TestDropColumnTable(runtime, ++txId, "/MyRoot/MyDir", "ColumnTable");
+ env.TestWaitNotification(runtime, txId);
+
+ TestLs(runtime, "/MyRoot/MyDir/ColumnTable", false, NLs::PathNotExist);
+ TestLsPathId(runtime, 4, NLs::PathStringEqual(""));
}
Y_UNIT_TEST(CreateTableTtl) {
diff --git a/ydb/core/ydb_convert/table_description.cpp b/ydb/core/ydb_convert/table_description.cpp
index bddbc72a64f..5f81cfa2c57 100644
--- a/ydb/core/ydb_convert/table_description.cpp
+++ b/ydb/core/ydb_convert/table_description.cpp
@@ -33,6 +33,61 @@ static void FillStoragePool(TStoragePoolHolder* out, TAddStoragePoolFunc<TStorag
std::invoke(func, out)->set_media(in.GetPreferredPoolKind());
}
+template <typename TColumn>
+static Ydb::Type* AddColumn(Ydb::Table::ColumnMeta* newColumn, const TColumn& column) {
+ NYql::NProto::TypeIds protoType;
+ if (!NYql::NProto::TypeIds_Parse(column.GetType(), &protoType)) {
+ throw NYql::TErrorException(NKikimrIssues::TIssuesIds::DEFAULT_ERROR)
+ << "Got invalid type: " << column.GetType() << " for column: " << column.GetName();
+ }
+
+ newColumn->set_name(column.GetName());
+
+ Ydb::Type* columnType = nullptr;
+ if (column.GetNotNull()) {
+ columnType = newColumn->mutable_type();
+ } else {
+ columnType = newColumn->mutable_type()->mutable_optional_type()->mutable_item();
+ }
+
+ Y_ENSURE(columnType);
+ if (protoType == NYql::NProto::TypeIds::Decimal) {
+ auto typeParams = columnType->mutable_decimal_type();
+ // TODO: Change TEvDescribeSchemeResult to return decimal params
+ typeParams->set_precision(22);
+ typeParams->set_scale(9);
+ } else {
+ NMiniKQL::ExportPrimitiveTypeToProto(protoType, *columnType);
+ }
+ return columnType;
+}
+
+template <typename TYdbProto, typename TTtl>
+static void AddTtl(TYdbProto& out, const TTtl& inTTL) {
+ switch (inTTL.GetColumnUnit()) {
+ case NKikimrSchemeOp::TTTLSettings::UNIT_AUTO: {
+ auto& outTTL = *out.mutable_ttl_settings()->mutable_date_type_column();
+ outTTL.set_column_name(inTTL.GetColumnName());
+ outTTL.set_expire_after_seconds(inTTL.GetExpireAfterSeconds());
+ break;
+ }
+
+ case NKikimrSchemeOp::TTTLSettings::UNIT_SECONDS:
+ case NKikimrSchemeOp::TTTLSettings::UNIT_MILLISECONDS:
+ case NKikimrSchemeOp::TTTLSettings::UNIT_MICROSECONDS:
+ case NKikimrSchemeOp::TTTLSettings::UNIT_NANOSECONDS: {
+ auto& outTTL = *out.mutable_ttl_settings()->mutable_value_since_unix_epoch();
+ outTTL.set_column_name(inTTL.GetColumnName());
+ outTTL.set_column_unit(static_cast<Ydb::Table::ValueSinceUnixEpochModeSettings::Unit>(inTTL.GetColumnUnit()));
+ outTTL.set_expire_after_seconds(inTTL.GetExpireAfterSeconds());
+ break;
+ }
+
+ default:
+ break;
+ }
+}
+
template <typename TYdbProto>
void FillColumnDescriptionImpl(TYdbProto& out,
NKikimrMiniKQL::TType& splitKeyType, const NKikimrSchemeOp::TTableDescription& in) {
@@ -47,31 +102,8 @@ void FillColumnDescriptionImpl(TYdbProto& out,
}
for (const auto& column : in.GetColumns()) {
- NYql::NProto::TypeIds protoType;
- if (!NYql::NProto::TypeIds_Parse(column.GetType(), &protoType)) {
- throw NYql::TErrorException(NKikimrIssues::TIssuesIds::DEFAULT_ERROR)
- << "Got invalid type: " << column.GetType() << " for column: " << column.GetName();
- }
-
auto newColumn = out.add_columns();
- newColumn->set_name(column.GetName());
-
- Ydb::Type* columnType = nullptr;
- if (column.GetNotNull()) {
- columnType = newColumn->mutable_type();
- } else {
- columnType = newColumn->mutable_type()->mutable_optional_type()->mutable_item();
- }
-
- Y_ENSURE(columnType);
- if (protoType == NYql::NProto::TypeIds::Decimal) {
- auto typeParams = columnType->mutable_decimal_type();
- // TODO: Change TEvDescribeSchemeResult to return decimal params
- typeParams->set_precision(22);
- typeParams->set_scale(9);
- } else {
- NMiniKQL::ExportPrimitiveTypeToProto(protoType, *columnType);
- }
+ Ydb::Type* columnType = AddColumn(newColumn, column);
if (columnIdToKeyPos.count(column.GetId())) {
size_t keyPos = columnIdToKeyPos[column.GetId()];
@@ -86,30 +118,7 @@ void FillColumnDescriptionImpl(TYdbProto& out,
}
if (in.HasTTLSettings() && in.GetTTLSettings().HasEnabled()) {
- const auto& inTTL = in.GetTTLSettings().GetEnabled();
-
- switch (inTTL.GetColumnUnit()) {
- case NKikimrSchemeOp::TTTLSettings::UNIT_AUTO: {
- auto& outTTL = *out.mutable_ttl_settings()->mutable_date_type_column();
- outTTL.set_column_name(inTTL.GetColumnName());
- outTTL.set_expire_after_seconds(inTTL.GetExpireAfterSeconds());
- break;
- }
-
- case NKikimrSchemeOp::TTTLSettings::UNIT_SECONDS:
- case NKikimrSchemeOp::TTTLSettings::UNIT_MILLISECONDS:
- case NKikimrSchemeOp::TTTLSettings::UNIT_MICROSECONDS:
- case NKikimrSchemeOp::TTTLSettings::UNIT_NANOSECONDS: {
- auto& outTTL = *out.mutable_ttl_settings()->mutable_value_since_unix_epoch();
- outTTL.set_column_name(inTTL.GetColumnName());
- outTTL.set_column_unit(static_cast<Ydb::Table::ValueSinceUnixEpochModeSettings::Unit>(inTTL.GetColumnUnit()));
- outTTL.set_expire_after_seconds(inTTL.GetExpireAfterSeconds());
- break;
- }
-
- default:
- break;
- }
+ AddTtl(out, in.GetTTLSettings().GetEnabled());
}
}
@@ -123,6 +132,30 @@ void FillColumnDescription(Ydb::Table::CreateTableRequest& out,
FillColumnDescriptionImpl(out, splitKeyType, in);
}
+void FillColumnDescription(Ydb::Table::DescribeTableResult& out, const NKikimrSchemeOp::TColumnTableDescription& in) {
+ auto& schema = in.GetSchema();
+
+ for (const auto& column : schema.GetColumns()) {
+ auto newColumn = out.add_columns();
+ AddColumn(newColumn, column);
+ }
+
+ for (auto& name : schema.GetKeyColumnNames()) {
+ out.add_primary_key(name);
+ }
+
+ if (in.HasSharding() && in.GetSharding().HasHashSharding()) {
+ auto * partitioning = out.mutable_partitioning_settings();
+ for (auto& column : in.GetSharding().GetHashSharding().GetColumns()) {
+ partitioning->add_partition_by(column);
+ }
+ }
+
+ if (in.HasTtlSettings() && in.GetTtlSettings().HasEnabled()) {
+ AddTtl(out, in.GetTtlSettings().GetEnabled());
+ }
+}
+
bool ExtractColumnTypeInfo(NScheme::TTypeInfo& outTypeInfo, const Ydb::Type& inType, Ydb::StatusIds::StatusCode& status, TString& error) {
ui32 typeId = 0;
auto itemType = inType.has_optional_type() ? inType.optional_type().item() : inType;
@@ -467,6 +500,11 @@ void FillTableStats(Ydb::Table::DescribeTableResult& out,
}
}
+void FillColumnTableStats(Ydb::Table::DescribeTableResult& out, const NKikimrSchemeOp::TPathDescription& in) {
+ auto stats = out.mutable_table_stats();
+ stats->set_partitions(in.GetColumnTableDescription().GetColumnShardCount());
+}
+
static bool IsDefaultFamily(const NKikimrSchemeOp::TFamilyDescription& family) {
if (family.HasId() && family.GetId() == 0) {
return true; // explicit id 0
diff --git a/ydb/core/ydb_convert/table_description.h b/ydb/core/ydb_convert/table_description.h
index 198171f57c5..2752101bcf4 100644
--- a/ydb/core/ydb_convert/table_description.h
+++ b/ydb/core/ydb_convert/table_description.h
@@ -14,6 +14,7 @@ void FillColumnDescription(Ydb::Table::DescribeTableResult& out,
NKikimrMiniKQL::TType& splitKeyType, const NKikimrSchemeOp::TTableDescription& in);
void FillColumnDescription(Ydb::Table::CreateTableRequest& out,
NKikimrMiniKQL::TType& splitKeyType, const NKikimrSchemeOp::TTableDescription& in);
+void FillColumnDescription(Ydb::Table::DescribeTableResult& out, const NKikimrSchemeOp::TColumnTableDescription& in);
// in
bool FillColumnDescription(NKikimrSchemeOp::TTableDescription& out,
const google::protobuf::RepeatedPtrField<Ydb::Table::ColumnMeta>& in, Ydb::StatusIds::StatusCode& status, TString& error);
@@ -44,6 +45,7 @@ bool FillChangefeedDescription(NKikimrSchemeOp::TCdcStreamDescription& out,
// out
void FillTableStats(Ydb::Table::DescribeTableResult& out,
const NKikimrSchemeOp::TPathDescription& in, bool withPartitionStatistic);
+void FillColumnTableStats(Ydb::Table::DescribeTableResult& out, const NKikimrSchemeOp::TPathDescription& in);
// out
void FillStorageSettings(Ydb::Table::DescribeTableResult& out,
diff --git a/ydb/library/yql/sql/v1/sql.cpp b/ydb/library/yql/sql/v1/sql.cpp
index 97c35ff30bd..6cc3554001b 100644
--- a/ydb/library/yql/sql/v1/sql.cpp
+++ b/ydb/library/yql/sql/v1/sql.cpp
@@ -8675,10 +8675,17 @@ bool TSqlQuery::Statement(TVector<TNodePtr>& blocks, const TRule_sql_stmt_core&
return false;
}
- if (rule.HasBlock9() && isTablestore) {
- Context().Error(GetPos(rule.GetBlock9().GetRule_table_partition_by1().GetToken1()))
- << "PARTITION BY is not supported for TABLESTORE";
- return false;
+ if (rule.HasBlock9()) {
+ if (isTablestore) {
+ Context().Error(GetPos(rule.GetBlock9().GetRule_table_partition_by1().GetToken1()))
+ << "PARTITION BY is not supported for TABLESTORE";
+ return false;
+ }
+ const auto list = rule.GetBlock9().GetRule_table_partition_by1().GetRule_pure_column_list4();
+ params.PartitionByColumns.push_back(IdEx(list.GetRule_an_id2(), *this));
+ for (auto& node : list.GetBlock3()) {
+ params.PartitionByColumns.push_back(IdEx(node.GetRule_an_id2(), *this));
+ }
}
if (rule.HasBlock10()) {
diff --git a/ydb/public/api/protos/ydb_table.proto b/ydb/public/api/protos/ydb_table.proto
index 90c02428812..1f66b44cdcb 100644
--- a/ydb/public/api/protos/ydb_table.proto
+++ b/ydb/public/api/protos/ydb_table.proto
@@ -405,8 +405,8 @@ message ColumnFamily {
}
message PartitioningSettings {
- // List of columns (primary key prefix) to partition by
- reserved 1; // partition_by
+ // List of columns to partition by
+ repeated string partition_by = 1;
// Enable auto partitioning on reaching upper or lower partition size bound
Ydb.FeatureFlag.Status partitioning_by_size = 2;
// Preferred partition size for auto partitioning by size, Mb