Skip to content

Commit a83a06f

Browse files
[BugFix] Fix num_short_key_columns mismatch in partial tablet schema (backport #70586) (backport #70602) (#70610)
Signed-off-by: luohaha <18810541851@163.com> Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> Co-authored-by: Yixin Luo <18810541851@163.com>
1 parent 79c9ab0 commit a83a06f

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
@@ -398,7 +398,13 @@ std::shared_ptr<TabletSchema> TabletSchema::create(const TabletSchemaCSPtr& src_
398398
index.to_schema_pb(index_pb);
399399
}
400400
partial_tablet_schema_pb.mutable_sort_key_idxes()->Add(sort_key_idxes.begin(), sort_key_idxes.end());
401-
return std::make_shared<TabletSchema>(partial_tablet_schema_pb);
401+
auto partial_schema = std::make_shared<TabletSchema>(partial_tablet_schema_pb);
402+
// _init_from_pb may fallback sort_key_idxes to key columns when the PB's sort_key_idxes is empty,
403+
// making it inconsistent with num_short_key_columns copied from the source schema. Fix up here.
404+
if (partial_schema->num_short_key_columns() > partial_schema->sort_key_idxes().size()) {
405+
partial_schema->set_num_short_key_columns(partial_schema->sort_key_idxes().size());
406+
}
407+
return partial_schema;
402408
}
403409

404410
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
@@ -170,4 +170,69 @@ TEST(TabletSchemaTest, test_is_support_checksum) {
170170
ASSERT_FALSE(map_column2.is_support_checksum());
171171
}
172172

173+
// Test that partial schema has consistent num_short_key_columns when sort key columns
174+
// are not in the referenced columns (e.g. column-mode partial update on table with ORDER BY).
175+
TEST(TabletSchemaTest, test_partial_schema_short_key_consistency_with_separate_sort_key) {
176+
// Build a PK table schema: pk=k0, ORDER BY(k3, k2), num_short_key_columns=2
177+
TabletSchemaPB schema_pb;
178+
schema_pb.set_keys_type(PRIMARY_KEYS);
179+
schema_pb.set_num_short_key_columns(2);
180+
181+
auto c0 = schema_pb.add_column();
182+
c0->set_unique_id(0);
183+
c0->set_name("k0");
184+
c0->set_type("INT");
185+
c0->set_is_key(true);
186+
c0->set_is_nullable(false);
187+
188+
auto c1 = schema_pb.add_column();
189+
c1->set_unique_id(1);
190+
c1->set_name("k1");
191+
c1->set_type("INT");
192+
c1->set_is_key(false);
193+
194+
auto c2 = schema_pb.add_column();
195+
c2->set_unique_id(2);
196+
c2->set_name("k2");
197+
c2->set_type("INT");
198+
c2->set_is_key(false);
199+
200+
auto c3 = schema_pb.add_column();
201+
c3->set_unique_id(3);
202+
c3->set_name("k3");
203+
c3->set_type("INT");
204+
c3->set_is_key(false);
205+
206+
auto c4 = schema_pb.add_column();
207+
c4->set_unique_id(4);
208+
c4->set_name("k4");
209+
c4->set_type("INT");
210+
c4->set_is_key(false);
211+
212+
// Set sort key to (k3, k2) — separate from primary key (k0)
213+
schema_pb.add_sort_key_idxes(3);
214+
schema_pb.add_sort_key_idxes(2);
215+
216+
auto src_schema = TabletSchema::create(schema_pb);
217+
ASSERT_NE(src_schema, nullptr);
218+
ASSERT_EQ(src_schema->num_short_key_columns(), 2);
219+
ASSERT_EQ(src_schema->sort_key_idxes().size(), 2);
220+
221+
// Create partial schema with only [k0, k4] — no sort key columns included
222+
auto partial_schema = TabletSchema::create(src_schema, {0, 4});
223+
ASSERT_NE(partial_schema, nullptr);
224+
// num_short_key_columns must not exceed sort_key_idxes.size()
225+
ASSERT_LE(partial_schema->num_short_key_columns(), partial_schema->sort_key_idxes().size());
226+
227+
// Create partial schema with [k0, k2] — one of two sort key columns included
228+
auto partial_schema2 = TabletSchema::create(src_schema, {0, 2});
229+
ASSERT_NE(partial_schema2, nullptr);
230+
ASSERT_LE(partial_schema2->num_short_key_columns(), partial_schema2->sort_key_idxes().size());
231+
232+
// Create partial schema with all sort keys [k0, k2, k3] — both sort key columns included
233+
auto partial_schema3 = TabletSchema::create(src_schema, {0, 2, 3});
234+
ASSERT_NE(partial_schema3, nullptr);
235+
ASSERT_LE(partial_schema3->num_short_key_columns(), partial_schema3->sort_key_idxes().size());
236+
}
237+
173238
} // namespace starrocks

0 commit comments

Comments
 (0)