Skip to content

Commit 727f04f

Browse files
luohahaclaude
authored andcommitted
[BugFix] Fix num_short_key_columns mismatch in partial tablet schema (StarRocks#70586)
Signed-off-by: luohaha <18810541851@163.com> Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 560d95b commit 727f04f

2 files changed

Lines changed: 72 additions & 1 deletion

File tree

be/src/storage/tablet_schema.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -402,7 +402,13 @@ std::shared_ptr<TabletSchema> TabletSchema::create(const TabletSchemaCSPtr& src_
402402
index.to_schema_pb(index_pb);
403403
}
404404
partial_tablet_schema_pb.mutable_sort_key_idxes()->Add(sort_key_idxes.begin(), sort_key_idxes.end());
405-
return std::make_shared<TabletSchema>(partial_tablet_schema_pb);
405+
auto partial_schema = std::make_shared<TabletSchema>(partial_tablet_schema_pb);
406+
// _init_from_pb may fallback sort_key_idxes to key columns when the PB's sort_key_idxes is empty,
407+
// making it inconsistent with num_short_key_columns copied from the source schema. Fix up here.
408+
if (partial_schema->num_short_key_columns() > partial_schema->sort_key_idxes().size()) {
409+
partial_schema->set_num_short_key_columns(partial_schema->sort_key_idxes().size());
410+
}
411+
return partial_schema;
406412
}
407413

408414
std::shared_ptr<TabletSchema> TabletSchema::create_with_uid(const TabletSchemaCSPtr& tablet_schema,

be/test/storage/tablet_schema_test.cpp

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -338,4 +338,69 @@ TEST(TabletSchemaTest, test_partial_schema_create_keeps_pk_encoding_type) {
338338
ASSERT_EQ(partial_pb.primary_key_encoding_type(), PrimaryKeyEncodingTypePB::PK_ENCODING_TYPE_V2);
339339
}
340340

341+
// Test that partial schema has consistent num_short_key_columns when sort key columns
342+
// are not in the referenced columns (e.g. column-mode partial update on table with ORDER BY).
343+
TEST(TabletSchemaTest, test_partial_schema_short_key_consistency_with_separate_sort_key) {
344+
// Build a PK table schema: pk=k0, ORDER BY(k3, k2), num_short_key_columns=2
345+
TabletSchemaPB schema_pb;
346+
schema_pb.set_keys_type(PRIMARY_KEYS);
347+
schema_pb.set_num_short_key_columns(2);
348+
349+
auto c0 = schema_pb.add_column();
350+
c0->set_unique_id(0);
351+
c0->set_name("k0");
352+
c0->set_type("INT");
353+
c0->set_is_key(true);
354+
c0->set_is_nullable(false);
355+
356+
auto c1 = schema_pb.add_column();
357+
c1->set_unique_id(1);
358+
c1->set_name("k1");
359+
c1->set_type("INT");
360+
c1->set_is_key(false);
361+
362+
auto c2 = schema_pb.add_column();
363+
c2->set_unique_id(2);
364+
c2->set_name("k2");
365+
c2->set_type("INT");
366+
c2->set_is_key(false);
367+
368+
auto c3 = schema_pb.add_column();
369+
c3->set_unique_id(3);
370+
c3->set_name("k3");
371+
c3->set_type("INT");
372+
c3->set_is_key(false);
373+
374+
auto c4 = schema_pb.add_column();
375+
c4->set_unique_id(4);
376+
c4->set_name("k4");
377+
c4->set_type("INT");
378+
c4->set_is_key(false);
379+
380+
// Set sort key to (k3, k2) — separate from primary key (k0)
381+
schema_pb.add_sort_key_idxes(3);
382+
schema_pb.add_sort_key_idxes(2);
383+
384+
auto src_schema = TabletSchema::create(schema_pb);
385+
ASSERT_NE(src_schema, nullptr);
386+
ASSERT_EQ(src_schema->num_short_key_columns(), 2);
387+
ASSERT_EQ(src_schema->sort_key_idxes().size(), 2);
388+
389+
// Create partial schema with only [k0, k4] — no sort key columns included
390+
auto partial_schema = TabletSchema::create(src_schema, {0, 4});
391+
ASSERT_NE(partial_schema, nullptr);
392+
// num_short_key_columns must not exceed sort_key_idxes.size()
393+
ASSERT_LE(partial_schema->num_short_key_columns(), partial_schema->sort_key_idxes().size());
394+
395+
// Create partial schema with [k0, k2] — one of two sort key columns included
396+
auto partial_schema2 = TabletSchema::create(src_schema, {0, 2});
397+
ASSERT_NE(partial_schema2, nullptr);
398+
ASSERT_LE(partial_schema2->num_short_key_columns(), partial_schema2->sort_key_idxes().size());
399+
400+
// Create partial schema with all sort keys [k0, k2, k3] — both sort key columns included
401+
auto partial_schema3 = TabletSchema::create(src_schema, {0, 2, 3});
402+
ASSERT_NE(partial_schema3, nullptr);
403+
ASSERT_LE(partial_schema3->num_short_key_columns(), partial_schema3->sort_key_idxes().size());
404+
}
405+
341406
} // namespace starrocks

0 commit comments

Comments
 (0)