Skip to content

Commit 2f0ac38

Browse files
committed
Reject vector index settings with unknown protobuf fields
1 parent 70510f5 commit 2f0ac38

File tree

3 files changed

+103
-1
lines changed

3 files changed

+103
-1
lines changed

ydb/core/base/kmeans_clusters.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -514,6 +514,11 @@ std::unique_ptr<IClusters> CreateClustersAutoDetect(Ydb::Table::VectorIndexSetti
514514
bool ValidateSettings(const Ydb::Table::KMeansTreeSettings& settings, TString& error) {
515515
error = "";
516516

517+
if (auto unknownCount = settings.GetReflection()->GetUnknownFields(settings).field_count(); unknownCount > 0) {
518+
error = TStringBuilder() << "vector index settings contain " << unknownCount << " unsupported parameter(s)";
519+
return false;
520+
}
521+
517522
if (!settings.has_settings()) {
518523
error = TStringBuilder() << "vector index settings should be set";
519524
return false;
@@ -558,7 +563,10 @@ bool ValidateSettings(const Ydb::Table::KMeansTreeSettings& settings, TString& e
558563
}
559564

560565
bool ValidateSettings(const Ydb::Table::VectorIndexSettings& settings, TString& error) {
561-
error = "";
566+
if (auto unknownCount = settings.GetReflection()->GetUnknownFields(settings).field_count(); unknownCount > 0) {
567+
error = TStringBuilder() << "vector index settings contain " << unknownCount << " unsupported parameter(s)";
568+
return false;
569+
}
562570

563571
if (!settings.has_metric() || settings.metric() == Ydb::Table::VectorIndexSettings::METRIC_UNSPECIFIED) {
564572
error = TStringBuilder() << "either distance or similarity should be set";

ydb/core/base/ut/kmeans_ut.cpp

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
#include "kmeans_clusters.h"
2+
3+
#include <ydb/public/api/protos/ydb_table.pb.h>
4+
5+
#include <library/cpp/testing/unittest/registar.h>
6+
#include <util/generic/xrange.h>
7+
8+
namespace NKikimr::NKMeans {
9+
10+
Y_UNIT_TEST_SUITE(NKMeans) {
11+
12+
Y_UNIT_TEST(ValidateSettings) {
13+
Ydb::Table::KMeansTreeSettings settings;
14+
TString error;
15+
16+
UNIT_ASSERT(!ValidateSettings(settings, error));
17+
UNIT_ASSERT_VALUES_EQUAL(error, "vector index settings should be set");
18+
19+
auto& vectorIndex = *settings.mutable_settings();
20+
21+
UNIT_ASSERT(!ValidateSettings(settings, error));
22+
UNIT_ASSERT_VALUES_EQUAL(error, "either distance or similarity should be set");
23+
24+
vectorIndex.set_metric((::Ydb::Table::VectorIndexSettings_Metric)UINT32_MAX);
25+
UNIT_ASSERT(!ValidateSettings(settings, error));
26+
UNIT_ASSERT_STRING_CONTAINS(error, "Invalid metric");
27+
28+
vectorIndex.set_metric(Ydb::Table::VectorIndexSettings::DISTANCE_COSINE);
29+
UNIT_ASSERT(!ValidateSettings(settings, error));
30+
UNIT_ASSERT_VALUES_EQUAL(error, "vector_type should be set");
31+
32+
vectorIndex.set_vector_type((::Ydb::Table::VectorIndexSettings_VectorType)UINT32_MAX);
33+
UNIT_ASSERT(!ValidateSettings(settings, error));
34+
UNIT_ASSERT_STRING_CONTAINS(error, "Invalid vector_type");
35+
36+
vectorIndex.set_vector_type(Ydb::Table::VectorIndexSettings::VECTOR_TYPE_BIT);
37+
UNIT_ASSERT(!ValidateSettings(settings, error));
38+
UNIT_ASSERT_STRING_CONTAINS(error, "vector_dimension should be set");
39+
40+
vectorIndex.set_vector_dimension(UINT32_MAX);
41+
UNIT_ASSERT(!ValidateSettings(settings, error));
42+
UNIT_ASSERT_STRING_CONTAINS(error, "Invalid vector_dimension");
43+
44+
vectorIndex.set_vector_dimension(16384);
45+
vectorIndex.GetReflection()->MutableUnknownFields(&vectorIndex)->AddVarint(10000, 100000);
46+
UNIT_ASSERT(!ValidateSettings(settings, error));
47+
UNIT_ASSERT_STRING_CONTAINS(error, "vector index settings contain 1 unsupported parameter(s)");
48+
49+
vectorIndex.GetReflection()->MutableUnknownFields(&vectorIndex)->DeleteByNumber(10000);
50+
settings.GetReflection()->MutableUnknownFields(&settings)->AddVarint(10000, 100000);
51+
UNIT_ASSERT(!ValidateSettings(settings, error));
52+
UNIT_ASSERT_STRING_CONTAINS(error, "vector index settings contain 1 unsupported parameter(s)");
53+
54+
settings.GetReflection()->MutableUnknownFields(&settings)->DeleteByNumber(10000);
55+
UNIT_ASSERT(!ValidateSettings(settings, error));
56+
UNIT_ASSERT_STRING_CONTAINS(error, "levels should be set");
57+
58+
settings.set_levels(UINT32_MAX);
59+
UNIT_ASSERT(!ValidateSettings(settings, error));
60+
UNIT_ASSERT_STRING_CONTAINS(error, "Invalid levels");
61+
62+
settings.set_levels(16);
63+
UNIT_ASSERT(!ValidateSettings(settings, error));
64+
UNIT_ASSERT_STRING_CONTAINS(error, "clusters should be set");
65+
66+
settings.set_clusters(UINT32_MAX);
67+
UNIT_ASSERT(!ValidateSettings(settings, error));
68+
UNIT_ASSERT_STRING_CONTAINS(error, "Invalid clusters");
69+
70+
settings.set_clusters(2048);
71+
UNIT_ASSERT(!ValidateSettings(settings, error));
72+
UNIT_ASSERT_STRING_CONTAINS(error, "Invalid clusters^levels");
73+
74+
settings.set_clusters(4);
75+
settings.set_levels(16);
76+
UNIT_ASSERT(!ValidateSettings(settings, error));
77+
UNIT_ASSERT_STRING_CONTAINS(error, "Invalid clusters^levels");
78+
79+
settings.set_clusters(1024);
80+
settings.set_levels(3);
81+
UNIT_ASSERT(!ValidateSettings(settings, error));
82+
UNIT_ASSERT_STRING_CONTAINS(error, "Invalid vector_dimension*clusters");
83+
84+
settings.set_clusters(50);
85+
settings.set_levels(3);
86+
UNIT_ASSERT(ValidateSettings(settings, error));
87+
}
88+
}
89+
90+
}

ydb/core/base/ut/ya.make

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,15 @@ SIZE(MEDIUM)
66
PEERDIR(
77
library/cpp/getopt
88
library/cpp/svnversion
9+
ydb/core/scheme
10+
yql/essentials/public/udf/service/stub
11+
yql/essentials/sql/pg_dummy
912
)
1013

1114
SRCS(
1215
path_ut.cpp
1316
blobstorage_grouptype_ut.cpp
17+
kmeans_ut.cpp
1418
localdb_ut.cpp
1519
logoblob_ut.cpp
1620
memory_stats_ut.cpp

0 commit comments

Comments
 (0)