diff options
author | nsofya <[email protected]> | 2023-12-11 19:10:54 +0300 |
---|---|---|
committer | nsofya <[email protected]> | 2023-12-11 19:54:57 +0300 |
commit | b881dd49f80073cf4e78ce7a30d342254252e40b (patch) | |
tree | 8c85c59be787276fc924aea1b4833444157c1486 | |
parent | 82012a1422c2b7c6f43962131628d8f4e1d7467f (diff) |
KIKIMR-20451: Pass TTLSettings on column table create
-rw-r--r-- | ydb/core/kqp/gateway/kqp_ic_gateway.cpp | 10 | ||||
-rw-r--r-- | ydb/core/kqp/ut/common/columnshard.cpp | 7 | ||||
-rw-r--r-- | ydb/core/kqp/ut/common/columnshard.h | 7 | ||||
-rw-r--r-- | ydb/core/kqp/ut/scheme/kqp_scheme_ut.cpp | 57 | ||||
-rw-r--r-- | ydb/core/tx/columnshard/columnshard_impl.cpp | 8 |
5 files changed, 86 insertions, 3 deletions
diff --git a/ydb/core/kqp/gateway/kqp_ic_gateway.cpp b/ydb/core/kqp/gateway/kqp_ic_gateway.cpp index bcf3a2023da..f8ae594b03f 100644 --- a/ydb/core/kqp/gateway/kqp_ic_gateway.cpp +++ b/ydb/core/kqp/gateway/kqp_ic_gateway.cpp @@ -2398,6 +2398,16 @@ private: tableDesc.SetColumnShardCount(*metadata->TableSettings.MinPartitions); } + if (metadata->TableSettings.TtlSettings.Defined() && metadata->TableSettings.TtlSettings.IsSet()) { + const auto& inputSettings = metadata->TableSettings.TtlSettings.GetValueSet(); + auto& resultSettings = *tableDesc.MutableTtlSettings(); + resultSettings.MutableEnabled()->SetColumnName(inputSettings.ColumnName); + resultSettings.MutableEnabled()->SetExpireAfterSeconds(inputSettings.ExpireAfter.Seconds()); + if (inputSettings.ColumnUnit) { + resultSettings.MutableEnabled()->SetColumnUnit(static_cast<NKikimrSchemeOp::TTTLSettings::EUnit>(*inputSettings.ColumnUnit)); + } + } + return true; } diff --git a/ydb/core/kqp/ut/common/columnshard.cpp b/ydb/core/kqp/ut/common/columnshard.cpp index dede16e2878..10f162f8baa 100644 --- a/ydb/core/kqp/ut/common/columnshard.cpp +++ b/ydb/core/kqp/ut/common/columnshard.cpp @@ -100,7 +100,12 @@ namespace NKqp { if (!Sharding.empty()) { str << " PARTITION BY HASH(" << JoinStrings(Sharding, ", ") << ")"; } - str << " WITH (STORE = COLUMN, AUTO_PARTITIONING_MIN_PARTITIONS_COUNT =" << MinPartitionsCount << ");"; + str << " WITH (STORE = COLUMN"; + str << ", AUTO_PARTITIONING_MIN_PARTITIONS_COUNT =" << MinPartitionsCount; + if (TTLConf) { + str << ", TTL = " << TTLConf->second << " ON " << TTLConf->first; + } + str << ");"; return str; } diff --git a/ydb/core/kqp/ut/common/columnshard.h b/ydb/core/kqp/ut/common/columnshard.h index e4d9cdd6464..e374b973edb 100644 --- a/ydb/core/kqp/ut/common/columnshard.h +++ b/ydb/core/kqp/ut/common/columnshard.h @@ -34,10 +34,17 @@ namespace NKqp { YDB_ACCESSOR_DEF(TVector<TString>, PrimaryKey); YDB_ACCESSOR_DEF(TVector<TString>, Sharding); YDB_ACCESSOR(ui32, MinPartitionsCount, 1); + + std::optional<std::pair<TString, TString>> TTLConf; public: TString BuildQuery() const; std::shared_ptr<arrow::Schema> GetArrowSchema(const TVector<TColumnSchema>& columns); + TColumnTableBase& SetTTL(const TString& columnName, const TString& ttlConf) { + TTLConf = std::make_pair(columnName, ttlConf); + return *this; + } + private: virtual TString GetObjectType() const = 0; TString BuildColumnsStr(const TVector<TColumnSchema>& clumns) const; diff --git a/ydb/core/kqp/ut/scheme/kqp_scheme_ut.cpp b/ydb/core/kqp/ut/scheme/kqp_scheme_ut.cpp index d5390fbcc67..766ac20bee5 100644 --- a/ydb/core/kqp/ut/scheme/kqp_scheme_ut.cpp +++ b/ydb/core/kqp/ut/scheme/kqp_scheme_ut.cpp @@ -5149,6 +5149,63 @@ Y_UNIT_TEST_SUITE(KqpOlapScheme) { } } + Y_UNIT_TEST(CreateTableWithTtl) { + TKikimrSettings runnerSettings; + runnerSettings.WithSampleTables = false; + TTestHelper testHelper(runnerSettings); + + TVector<TTestHelper::TColumnSchema> schema = { + TTestHelper::TColumnSchema().SetName("id").SetType(NScheme::NTypeIds::Int32).SetNullable(false), + TTestHelper::TColumnSchema().SetName("id_second").SetType(NScheme::NTypeIds::Int32).SetNullable(false), + TTestHelper::TColumnSchema().SetName("level").SetType(NScheme::NTypeIds::Int32), + TTestHelper::TColumnSchema().SetName("created_at").SetType(NScheme::NTypeIds::Timestamp).SetNullable(false) + }; + + TTestHelper::TColumnTable testTable; + testTable.SetName("/Root/ColumnTableTest").SetPrimaryKey({"id", "id_second"}).SetSharding({"id"}).SetSchema(schema).SetTTL("created_at", "Interval(\"PT1H\")"); + testHelper.CreateTable(testTable); + + { + auto settings = TDescribeTableSettings().WithTableStatistics(true); + auto describeResult = testHelper.GetSession().DescribeTable("/Root/ColumnTableTest", settings).GetValueSync(); + UNIT_ASSERT_C(describeResult.IsSuccess(), describeResult.GetIssues().ToString()); + + const auto& description = describeResult.GetTableDescription(); + auto columns = description.GetTableColumns(); + UNIT_ASSERT_VALUES_EQUAL(columns.size(), 4); + UNIT_ASSERT(description.GetTtlSettings()); + UNIT_ASSERT_VALUES_EQUAL(description.GetTtlSettings()->GetDateTypeColumn().GetExpireAfter(), TDuration::Hours(1)); + } + } + + Y_UNIT_TEST(CreateTableWithoutTtl) { + TKikimrSettings runnerSettings; + runnerSettings.WithSampleTables = false; + TTestHelper testHelper(runnerSettings); + + TVector<TTestHelper::TColumnSchema> schema = { + TTestHelper::TColumnSchema().SetName("id").SetType(NScheme::NTypeIds::Int32).SetNullable(false), + TTestHelper::TColumnSchema().SetName("id_second").SetType(NScheme::NTypeIds::Int32).SetNullable(false), + TTestHelper::TColumnSchema().SetName("level").SetType(NScheme::NTypeIds::Int32), + TTestHelper::TColumnSchema().SetName("created_at").SetType(NScheme::NTypeIds::Timestamp).SetNullable(false) + }; + + TTestHelper::TColumnTable testTable; + testTable.SetName("/Root/ColumnTableTest").SetPrimaryKey({"id", "id_second"}).SetSharding({"id"}).SetSchema(schema); + testHelper.CreateTable(testTable); + + { + auto settings = TDescribeTableSettings().WithTableStatistics(true); + auto describeResult = testHelper.GetSession().DescribeTable("/Root/ColumnTableTest", settings).GetValueSync(); + UNIT_ASSERT_C(describeResult.IsSuccess(), describeResult.GetIssues().ToString()); + + const auto& description = describeResult.GetTableDescription(); + auto columns = description.GetTableColumns(); + UNIT_ASSERT_VALUES_EQUAL(columns.size(), 4); + UNIT_ASSERT(!description.GetTtlSettings()); + } + } + Y_UNIT_TEST(AddColumnWithTtl) { TKikimrSettings runnerSettings; runnerSettings.WithSampleTables = false; diff --git a/ydb/core/tx/columnshard/columnshard_impl.cpp b/ydb/core/tx/columnshard/columnshard_impl.cpp index b815b0926c7..c79a3ee4081 100644 --- a/ydb/core/tx/columnshard/columnshard_impl.cpp +++ b/ydb/core/tx/columnshard/columnshard_impl.cpp @@ -84,11 +84,15 @@ bool ValidateTableSchema(const NKikimrSchemeOp::TColumnTableSchema& schema) { for (const NKikimrSchemeOp::TOlapColumnDescription& column : schema.GetColumns()) { TString name = column.GetName(); - keyColumns.erase(name); - + /* + if (column.GetNotNull() && keyColumns.contains(name)) { + return false; + } + */ if (name == firstKeyColumn && !supportedTypes.contains(column.GetTypeId())) { return false; } + keyColumns.erase(name); } if (!keyColumns.empty()) { |