summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornsofya <[email protected]>2023-12-11 19:10:54 +0300
committernsofya <[email protected]>2023-12-11 19:54:57 +0300
commitb881dd49f80073cf4e78ce7a30d342254252e40b (patch)
tree8c85c59be787276fc924aea1b4833444157c1486
parent82012a1422c2b7c6f43962131628d8f4e1d7467f (diff)
KIKIMR-20451: Pass TTLSettings on column table create
-rw-r--r--ydb/core/kqp/gateway/kqp_ic_gateway.cpp10
-rw-r--r--ydb/core/kqp/ut/common/columnshard.cpp7
-rw-r--r--ydb/core/kqp/ut/common/columnshard.h7
-rw-r--r--ydb/core/kqp/ut/scheme/kqp_scheme_ut.cpp57
-rw-r--r--ydb/core/tx/columnshard/columnshard_impl.cpp8
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()) {