diff options
author | ulya-sidorina <yulia@ydb.tech> | 2023-04-18 15:47:14 +0300 |
---|---|---|
committer | ulya-sidorina <yulia@ydb.tech> | 2023-04-18 15:47:14 +0300 |
commit | 1bee262f7c4849ea77c887f75a9eb7e995fec477 (patch) | |
tree | 80abbea9a9efc4ec33c842d2b0c2b7995dac33ae | |
parent | 273a2b5fdbfaebcc7b9994a87c7b8ece8f1990be (diff) | |
download | ydb-1bee262f7c4849ea77c887f75a9eb7e995fec477.tar.gz |
fix index building on not null columns
fix(schemeshard): build index using column types from main table (nullable or not null)
-rw-r--r-- | ydb/core/kqp/ut/opt/kqp_not_null_ut.cpp | 59 | ||||
-rw-r--r-- | ydb/core/tx/schemeshard/schemeshard_utils.cpp | 1 |
2 files changed, 60 insertions, 0 deletions
diff --git a/ydb/core/kqp/ut/opt/kqp_not_null_ut.cpp b/ydb/core/kqp/ut/opt/kqp_not_null_ut.cpp index b7ee6f8dd24..e2a95cdafec 100644 --- a/ydb/core/kqp/ut/opt/kqp_not_null_ut.cpp +++ b/ydb/core/kqp/ut/opt/kqp_not_null_ut.cpp @@ -1,4 +1,6 @@ #include <ydb/core/kqp/ut/common/kqp_ut_common.h> +#include <ydb/core/tx/tx_proxy/proxy.h> +#include <ydb/core/tx/schemeshard/schemeshard.h> namespace NKikimr { namespace NKqp { @@ -950,6 +952,63 @@ Y_UNIT_TEST_SUITE(KqpNotNullColumns) { UNIT_ASSERT_VALUES_EQUAL(column.Type.ToString(), columnTypes.at(column.Name)); } } + + Y_UNIT_TEST(AlterAddIndex) { + TKikimrRunner kikimr; + auto client = kikimr.GetTableClient(); + auto session = client.CreateSession().GetValueSync().GetSession(); + auto server = &kikimr.GetTestServer(); + + { + auto result = session.ExecuteSchemeQuery(R"( + CREATE TABLE `/Root/TestTable` ( + Key1 Int64 NOT NULL, + Key2 Utf8 NOT NULL, + Value1 Utf8, + Value2 Bool, + PRIMARY KEY (Key1, Key2)); + )").ExtractValueSync(); + UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString()); + } + + { + auto result = session.ExecuteSchemeQuery(R"( + ALTER TABLE `/Root/TestTable` ADD INDEX Index GLOBAL SYNC ON (Key2, Value1, Value2); + )").ExtractValueSync(); + UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString()); + } + + auto describeTable = [&server](const TString& path) { + auto& runtime = *server->GetRuntime(); + auto sender = runtime.AllocateEdgeActor(); + TAutoPtr<IEventHandle> handle; + + auto request = MakeHolder<TEvTxUserProxy::TEvNavigate>(); + request->Record.MutableDescribePath()->SetPath(path); + request->Record.MutableDescribePath()->MutableOptions()->SetShowPrivateTable(true); + runtime.Send(new IEventHandle(MakeTxProxyID(), sender, request.Release())); + auto reply = runtime.GrabEdgeEventRethrow<NSchemeShard::TEvSchemeShard::TEvDescribeSchemeResult>(handle); + + return *reply->MutableRecord(); + }; + + auto extractNotNullColumns = [](const auto& desc) { + THashSet<TString> notNullColumns; + for (const auto& column : desc.GetPathDescription().GetTable().GetColumns()) { + if (column.GetNotNull()) { + notNullColumns.insert(column.GetName()); + } + } + + return notNullColumns; + }; + + { + auto mainTableNotNullColumns = extractNotNullColumns(describeTable("/Root/TestTable")); + auto indexTableNotNullColumns = extractNotNullColumns(describeTable("/Root/TestTable/Index/indexImplTable")); + UNIT_ASSERT_VALUES_EQUAL_C(mainTableNotNullColumns, indexTableNotNullColumns, "Not null columns mismatch"); + } + } } } // namespace NKqp diff --git a/ydb/core/tx/schemeshard/schemeshard_utils.cpp b/ydb/core/tx/schemeshard/schemeshard_utils.cpp index b2392abfda6..6b604381c08 100644 --- a/ydb/core/tx/schemeshard/schemeshard_utils.cpp +++ b/ydb/core/tx/schemeshard/schemeshard_utils.cpp @@ -293,6 +293,7 @@ NKikimrSchemeOp::TTableDescription CalcImplTableDesc( auto item = result.AddColumns(); item->SetName(column.Name); item->SetType(NScheme::TypeName(column.PType, column.PTypeMod)); + item->SetNotNull(column.NotNull); ui32 order = Max<ui32>(); if (implKeyToImplColumn.contains(column.Name)) { order = implKeyToImplColumn.at(column.Name); |