@@ -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