Skip to content

Commit 0a90392

Browse files
authored
Stable 25 3 critical fixes (#26185)
2 parents 7c55262 + bde7a00 commit 0a90392

File tree

6 files changed

+97
-3
lines changed

6 files changed

+97
-3
lines changed

ydb/core/formats/arrow/program/filter.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,8 +104,8 @@ TConclusion<IResourceProcessor::EExecutionResult> TFilterProcessor::DoExecute(
104104
AFL_VERIFY(filter.GetRecordsCountVerified() == inputColumns.front()->GetRecordsCount())("filter", filter.GetRecordsCountVerified())(
105105
"input", inputColumns.front()->GetRecordsCount());
106106
if (context.GetLimit()) {
107-
context.MutableResources().AddFilter(
108-
filter.Cut(context.GetResources().GetRecordsCountRobustVerified(), *context.GetLimit(), context.GetReverse()));
107+
context.MutableResources().AddFilter(filter);
108+
context.MutableResources().CutFilter(context.GetResources().GetRecordsCountRobustVerified(), *context.GetLimit(), context.GetReverse());
109109
} else {
110110
context.MutableResources().AddFilter(filter);
111111
}

ydb/core/kqp/ut/olap/kqp_olap_ut.cpp

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4703,5 +4703,46 @@ Y_UNIT_TEST_SUITE(KqpOlap) {
47034703
UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
47044704
}
47054705
}
4706+
4707+
Y_UNIT_TEST(PredicateWithLimitLostRecords) {
4708+
auto settings = TKikimrSettings().SetWithSampleTables(false);
4709+
settings.AppConfig.MutableTableServiceConfig()->SetEnableOlapSink(true);
4710+
TKikimrRunner kikimr(settings);
4711+
4712+
auto queryClient = kikimr.GetQueryClient();
4713+
{
4714+
auto status = queryClient.ExecuteQuery(R"(
4715+
CREATE TABLE IF NOT EXISTS `olap_table` (
4716+
id Uint64 NOT NULL,
4717+
message Utf8,
4718+
PRIMARY KEY (id)
4719+
)
4720+
WITH (
4721+
STORE = COLUMN,
4722+
PARTITION_COUNT = 1
4723+
);
4724+
)", NYdb::NQuery::TTxControl::NoTx()).GetValueSync();
4725+
UNIT_ASSERT_C(status.IsSuccess(), status.GetIssues().ToString());
4726+
}
4727+
4728+
{
4729+
TString query = "UPSERT INTO `olap_table` (id, message) VALUES (1, '2'), (2, '2');";
4730+
auto status = queryClient.ExecuteQuery(query, NYdb::NQuery::TTxControl::BeginTx().CommitTx()).GetValueSync();
4731+
UNIT_ASSERT_C(status.IsSuccess(), status.GetIssues().ToString());
4732+
}
4733+
4734+
{
4735+
auto status = queryClient.ExecuteQuery(R"(
4736+
SELECT id FROM `olap_table`
4737+
WHERE id = 2 AND message = '2'
4738+
LIMIT 1;
4739+
)", NYdb::NQuery::TTxControl::BeginTx().CommitTx()).GetValueSync();
4740+
4741+
UNIT_ASSERT_C(status.IsSuccess(), status.GetIssues().ToString());
4742+
TString result = FormatResultSetYson(status.GetResultSet(0));
4743+
4744+
CompareYson(result, R"([[2u]])");
4745+
}
4746+
}
47064747
}
47074748
}

ydb/core/kqp/ut/service/kqp_qs_queries_ut.cpp

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3660,6 +3660,48 @@ Y_UNIT_TEST_SUITE(KqpQueryService) {
36603660
}
36613661
}
36623662

3663+
Y_UNIT_TEST_TWIN(CTAS_BadKey, IsOlap) {
3664+
auto setting = NKikimrKqp::TKqpSetting();
3665+
auto serverSettings = TKikimrSettings()
3666+
.SetKqpSettings({setting})
3667+
.SetWithSampleTables(false)
3668+
.SetEnableTempTables(true);
3669+
serverSettings.AppConfig.MutableTableServiceConfig()->SetEnableOlapSink(true);
3670+
serverSettings.AppConfig.MutableTableServiceConfig()->SetEnableCreateTableAs(true);
3671+
serverSettings.AppConfig.MutableTableServiceConfig()->SetEnableDataShardCreateTableAs(true);
3672+
3673+
TKikimrRunner kikimr(serverSettings);
3674+
auto db = kikimr.GetQueryClient();
3675+
3676+
{
3677+
auto result = db.ExecuteQuery(Sprintf(R"(
3678+
CREATE TABLE Table (
3679+
PRIMARY KEY (Key2, Key)
3680+
) WITH (STORE=%s)
3681+
AS SELECT 1u AS Key, "1" AS Value1, "1" AS Value2;
3682+
)", IsOlap ? "COLUMN" : "ROW"), TTxControl::NoTx(), TExecuteQuerySettings()).ExtractValueSync();
3683+
3684+
UNIT_ASSERT_C(!result.IsSuccess(), result.GetIssues().ToString());
3685+
UNIT_ASSERT_C(
3686+
result.GetIssues().ToString().contains("Unknown column 'Key2' specified in key column list"),
3687+
result.GetIssues().ToString());
3688+
}
3689+
3690+
{
3691+
auto result = db.ExecuteQuery(Sprintf(R"(
3692+
CREATE TABLE Table (
3693+
PRIMARY KEY (Key, Key2)
3694+
) WITH (STORE=%s)
3695+
AS SELECT 1u AS Key, "1" AS Value1, "1" AS Value2;
3696+
)", IsOlap ? "COLUMN" : "ROW"), TTxControl::NoTx(), TExecuteQuerySettings()).ExtractValueSync();
3697+
3698+
UNIT_ASSERT_C(!result.IsSuccess(), result.GetIssues().ToString());
3699+
UNIT_ASSERT_C(
3700+
result.GetIssues().ToString().contains("Unknown column 'Key2' specified in key column list"),
3701+
result.GetIssues().ToString());
3702+
}
3703+
}
3704+
36633705
Y_UNIT_TEST(CheckIsolationLevelFroPerStatementMode) {
36643706
auto setting = NKikimrKqp::TKqpSetting();
36653707
auto serverSettings = TKikimrSettings().SetKqpSettings({setting});

ydb/core/tx/schemeshard/olap/columns/schema.cpp

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,16 @@ bool TOlapColumnsDescription::ApplyUpdate(
8484
auto it = orderedKeyColumnIds.begin();
8585
for (ui32 i = 0; i < orderedKeyColumnIds.size(); ++i, ++it) {
8686
KeyColumnIds.emplace_back(it->second);
87-
Y_ABORT_UNLESS(i == it->first);
87+
if (i != it->first) {
88+
const TString missedColumnName = i < schemaUpdate.GetPrimaryKeyColumnNames().size() ? schemaUpdate.GetPrimaryKeyColumnNames()[i] : "@unknown";
89+
errors.AddError(NKikimrScheme::StatusSchemeError, Sprintf("Unknown column '%s' specified in key column list", missedColumnName.data()));
90+
return false;
91+
}
92+
}
93+
if (orderedKeyColumnIds.size() < schemaUpdate.GetPrimaryKeyColumnNames().size()) {
94+
const TString missedColumnName = schemaUpdate.GetPrimaryKeyColumnNames()[orderedKeyColumnIds.size()];
95+
errors.AddError(NKikimrScheme::StatusSchemeError, Sprintf("Unknown column '%s' specified in key column list", missedColumnName.data()));
96+
return false;
8897
}
8998
if (KeyColumnIds.empty()) {
9099
errors.AddError(NKikimrScheme::StatusSchemeError, "No primary key specified");

ydb/core/tx/schemeshard/olap/columns/update.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -405,6 +405,7 @@ void TOlapColumnAdd::ParseFromLocalDB(const NKikimrSchemeOp::TOlapColumnDescript
405405
errors.AddError(NKikimrScheme::StatusSchemeError, TStringBuilder() << "Duplicate key column '" << pkKey << "'");
406406
return false;
407407
}
408+
PrimaryKeyColumnNames.emplace_back(pkKey);
408409
}
409410

410411
TSet<TString> columnNames;

ydb/core/tx/schemeshard/olap/columns/update.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ class TOlapColumnsUpdate {
8080
YDB_READONLY_DEF(TVector<TOlapColumnAdd>, AddColumns);
8181
YDB_READONLY_DEF(TSet<TString>, DropColumns);
8282
YDB_READONLY_DEF(TVector<TOlapColumnDiff>, AlterColumns);
83+
YDB_READONLY_DEF(TVector<TString>, PrimaryKeyColumnNames);
8384
public:
8485
bool Parse(const NKikimrSchemeOp::TColumnTableSchema& tableSchema, IErrorCollector& errors, bool allowNullKeys = false);
8586
bool Parse(const NKikimrSchemeOp::TAlterColumnTableSchema& alterRequest, IErrorCollector& errors);

0 commit comments

Comments
 (0)