Skip to content

Commit

Permalink
FEATURE_FLAG EnableTableDatetime64 (#5540)
Browse files Browse the repository at this point in the history
  • Loading branch information
azevaykin authored Jun 15, 2024
1 parent d7ebbb6 commit a98e984
Show file tree
Hide file tree
Showing 11 changed files with 92 additions and 3 deletions.
68 changes: 68 additions & 0 deletions ydb/core/kqp/ut/query/kqp_types_ut.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
#include <ydb/core/kqp/ut/common/kqp_ut_common.h>
#include <ydb/core/testlib/test_client.h>

namespace NKikimr {
namespace NKqp {

using namespace NYdb;
using namespace NYdb::NTable;

Y_UNIT_TEST_SUITE(KqpTypes) {
Y_UNIT_TEST_TWIN(Time64Columns, EnableTableDatetime64) {
NKikimrConfig::TFeatureFlags featureFlags;
featureFlags.SetEnableTableDatetime64(EnableTableDatetime64);

auto settings = TKikimrSettings()
.SetWithSampleTables(false)
.SetFeatureFlags(featureFlags);

TKikimrRunner kikimr(settings);
auto client = kikimr.GetTableClient();
auto session = client.CreateSession().GetValueSync().GetSession();

{
const auto query = Q_(R"(
CREATE TABLE `/Root/TestTime64` (
DatetimePK Datetime64,
IntervalPK Interval64,
TimestampPK Timestamp64,
Datetime Datetime64,
Interval Interval64,
Timestamp Timestamp64,
PRIMARY KEY (DatetimePK, IntervalPK, TimestampPK))
)");

auto result = session.ExecuteSchemeQuery(query).ExtractValueSync();

if constexpr (EnableTableDatetime64) {
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString());
}
else {
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SCHEME_ERROR, result.GetIssues().ToString());
UNIT_ASSERT(result.GetIssues().ToString().Contains("Type 'Datetime64' specified for column 'DatetimePK', but support for new date/time 64 types is disabled (EnableTableDatetime64 feature flag is off)"));
return;
}
}

{
const auto query = Q_(R"(
UPSERT INTO `/Root/TestTime64` (DatetimePK, IntervalPK, TimestampPK, Datetime, Interval, Timestamp) VALUES
(Datetime64('1970-01-01T01:01:01Z'), Interval64('P222D'), Timestamp64('1970-03-03T03:03:03Z')
,Datetime64('1970-04-04T04:04:04Z'), Interval64('P555D'), Timestamp64('1970-06-06T06:06:06Z'));
)");

auto result = session.ExecuteDataQuery(query, TTxControl::BeginTx().CommitTx()).ExtractValueSync();
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString());
}

{
const auto query = Q_("SELECT * FROM `/Root/TestTime64`");
auto result = session.ExecuteDataQuery(query, TTxControl::BeginTx().CommitTx()).ExtractValueSync();
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString());
CompareYson(R"([[[8049844];[3661];[47952000000000];[19180800000000];[13500366000000];[5281383000000]]])", FormatResultSetYson(result.GetResultSet(0)));
}
}
}

} // namespace NKqp
} // namespace NKikimr
1 change: 1 addition & 0 deletions ydb/core/kqp/ut/query/ya.make
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ SRCS(
kqp_params_ut.cpp
kqp_query_ut.cpp
kqp_stats_ut.cpp
kqp_types_ut.cpp
)

PEERDIR(
Expand Down
1 change: 1 addition & 0 deletions ydb/core/protos/feature_flags.proto
Original file line number Diff line number Diff line change
Expand Up @@ -140,4 +140,5 @@ message TFeatureFlags {
optional bool EnableGraphShard = 125 [default = false];
optional bool EnableExternalSourceSchemaInference = 126 [default = false];
optional bool EnableDbMetadataCache = 127 [default = false];
optional bool EnableTableDatetime64 = 128 [default = false];
}
1 change: 1 addition & 0 deletions ydb/core/testlib/basics/feature_flags.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ class TTestFeatureFlagsHolder {
FEATURE_FLAG_SETTER(EnableAddColumsWithDefaults)
FEATURE_FLAG_SETTER(EnableReplaceIfExistsForExternalEntities)
FEATURE_FLAG_SETTER(EnableCMSRequestPriorities)
FEATURE_FLAG_SETTER(EnableTableDatetime64)

#undef FEATURE_FLAG_SETTER
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@ TTableInfo::TAlterDataPtr ParseParams(const TPath& path, TTableInfo::TPtr table,

TTableInfo::TAlterDataPtr alterData = TTableInfo::CreateAlterData(
table, copyAlter, *appData->TypeRegistry, limits, subDomain,
context.SS->EnableTablePgTypes, errStr, localSequences);
context.SS->EnableTablePgTypes, context.SS->EnableTableDatetime64, errStr, localSequences);
if (!alterData) {
status = NKikimrScheme::StatusInvalidParameter;
return nullptr;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -526,7 +526,7 @@ class TCopyTable: public TSubOperation {
const NScheme::TTypeRegistry* typeRegistry = AppData()->TypeRegistry;
const TSchemeLimits& limits = domainInfo->GetSchemeLimits();
TTableInfo::TAlterDataPtr alterData = TTableInfo::CreateAlterData(nullptr, schema, *typeRegistry,
limits, *domainInfo, context.SS->EnableTablePgTypes, errStr, LocalSequences);
limits, *domainInfo, context.SS->EnableTablePgTypes, context.SS->EnableTableDatetime64, errStr, LocalSequences);
if (!alterData.Get()) {
result->SetError(NKikimrScheme::StatusSchemeError, errStr);
return result;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -564,7 +564,7 @@ class TCreateTable: public TSubOperation {

const NScheme::TTypeRegistry* typeRegistry = AppData()->TypeRegistry;
const TSchemeLimits& limits = domainInfo->GetSchemeLimits();
TTableInfo::TAlterDataPtr alterData = TTableInfo::CreateAlterData(nullptr, schema, *typeRegistry, limits, *domainInfo, context.SS->EnableTablePgTypes, errStr, LocalSequences);
TTableInfo::TAlterDataPtr alterData = TTableInfo::CreateAlterData(nullptr, schema, *typeRegistry, limits, *domainInfo, context.SS->EnableTablePgTypes, context.SS->EnableTableDatetime64, errStr, LocalSequences);
if (!alterData.Get()) {
result->SetError(NKikimrScheme::StatusSchemeError, errStr);
return result;
Expand Down
2 changes: 2 additions & 0 deletions ydb/core/tx/schemeshard/schemeshard_impl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4413,6 +4413,7 @@ void TSchemeShard::OnActivateExecutor(const TActorContext &ctx) {
EnableAddColumsWithDefaults = appData->FeatureFlags.GetEnableAddColumsWithDefaults();
EnableReplaceIfExistsForExternalEntities = appData->FeatureFlags.GetEnableReplaceIfExistsForExternalEntities();
EnableTempTables = appData->FeatureFlags.GetEnableTempTables();
EnableTableDatetime64 = appData->FeatureFlags.GetEnableTableDatetime64();

ConfigureCompactionQueues(appData->CompactionConfig, ctx);
ConfigureStatsBatching(appData->SchemeShardConfig, ctx);
Expand Down Expand Up @@ -6962,6 +6963,7 @@ void TSchemeShard::ApplyConsoleConfigs(const NKikimrConfig::TFeatureFlags& featu
EnableAddColumsWithDefaults = featureFlags.GetEnableAddColumsWithDefaults();
EnableTempTables = featureFlags.GetEnableTempTables();
EnableReplaceIfExistsForExternalEntities = featureFlags.GetEnableReplaceIfExistsForExternalEntities();
EnableTableDatetime64 = featureFlags.GetEnableTableDatetime64();
}

void TSchemeShard::ConfigureStatsBatching(const NKikimrConfig::TSchemeShardConfig& config, const TActorContext& ctx) {
Expand Down
1 change: 1 addition & 0 deletions ydb/core/tx/schemeshard/schemeshard_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -313,6 +313,7 @@ class TSchemeShard
bool EnableAddColumsWithDefaults = false;
bool EnableReplaceIfExistsForExternalEntities = false;
bool EnableTempTables = false;
bool EnableTableDatetime64 = false;

TShardDeleter ShardDeleter;

Expand Down
14 changes: 14 additions & 0 deletions ydb/core/tx/schemeshard/schemeshard_info_types.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -261,6 +261,7 @@ TTableInfo::TAlterDataPtr TTableInfo::CreateAlterData(
const NScheme::TTypeRegistry& typeRegistry,
const TSchemeLimits& limits, const TSubDomainInfo& subDomain,
bool pgTypesEnabled,
bool datetime64TypesEnabled,
TString& errStr, const THashSet<TString>& localSequences)
{
TAlterDataPtr alterData = new TTableInfo::TAlterTableInfo();
Expand Down Expand Up @@ -399,6 +400,19 @@ TTableInfo::TAlterDataPtr TTableInfo::CreateAlterData(
return nullptr;
}
typeInfo = NScheme::TTypeInfo(type->GetTypeId());

if (!datetime64TypesEnabled) {
switch (type->GetTypeId()) {
case NScheme::NTypeIds::Date32:
case NScheme::NTypeIds::Datetime64:
case NScheme::NTypeIds::Timestamp64:
case NScheme::NTypeIds::Interval64:
errStr = Sprintf("Type '%s' specified for column '%s', but support for new date/time 64 types is disabled (EnableTableDatetime64 feature flag is off)", col.GetType().data(), colName.data());
return nullptr;
default:
break;
}
}
} else {
auto* typeDesc = NPg::TypeDescFromPgTypeName(typeName);
if (!typeDesc) {
Expand Down
1 change: 1 addition & 0 deletions ydb/core/tx/schemeshard/schemeshard_info_types.h
Original file line number Diff line number Diff line change
Expand Up @@ -550,6 +550,7 @@ struct TTableInfo : public TSimpleRefCount<TTableInfo> {
const NScheme::TTypeRegistry& typeRegistry,
const TSchemeLimits& limits, const TSubDomainInfo& subDomain,
bool pgTypesEnabled,
bool datetime64TypesEnabled,
TString& errStr, const THashSet<TString>& localSequences = {});

static ui32 ShardsToCreate(const NKikimrSchemeOp::TTableDescription& descr) {
Expand Down

0 comments on commit a98e984

Please sign in to comment.