diff options
author | chertus <azuikov@ydb.tech> | 2022-11-22 20:29:23 +0300 |
---|---|---|
committer | chertus <azuikov@ydb.tech> | 2022-11-22 20:29:23 +0300 |
commit | 1ddb2b4f00e412e37019b2e00bf1b1a910fa4c11 (patch) | |
tree | 8621db02265e83131bf771c1b640166bdc40ab92 | |
parent | e753c972bc3483c506767cda66f6daee10543434 (diff) | |
download | ydb-1ddb2b4f00e412e37019b2e00bf1b1a910fa4c11.tar.gz |
description for ColumnTable
-rw-r--r-- | ydb/core/grpc_services/rpc_describe_table.cpp | 11 | ||||
-rw-r--r-- | ydb/core/kqp/gateway/kqp_ic_gateway.cpp | 18 | ||||
-rw-r--r-- | ydb/core/kqp/ut/kqp_scheme_ut.cpp | 141 | ||||
-rw-r--r-- | ydb/core/protos/flat_scheme_op.proto | 4 | ||||
-rw-r--r-- | ydb/core/tx/schemeshard/ut_olap.cpp | 44 | ||||
-rw-r--r-- | ydb/core/ydb_convert/table_description.cpp | 134 | ||||
-rw-r--r-- | ydb/core/ydb_convert/table_description.h | 2 | ||||
-rw-r--r-- | ydb/library/yql/sql/v1/sql.cpp | 15 | ||||
-rw-r--r-- | ydb/public/api/protos/ydb_table.proto | 4 |
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 |