aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorulya-sidorina <yulia@ydb.tech>2023-04-18 15:47:14 +0300
committerulya-sidorina <yulia@ydb.tech>2023-04-18 15:47:14 +0300
commit1bee262f7c4849ea77c887f75a9eb7e995fec477 (patch)
tree80abbea9a9efc4ec33c842d2b0c2b7995dac33ae
parent273a2b5fdbfaebcc7b9994a87c7b8ece8f1990be (diff)
downloadydb-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.cpp59
-rw-r--r--ydb/core/tx/schemeshard/schemeshard_utils.cpp1
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);