From 234fea812fd2b0406cf148806aa8566a74a3fcd6 Mon Sep 17 00:00:00 2001 From: discord9 Date: Thu, 20 Aug 2026 12:50:10 +0800 Subject: [PATCH] test(query): cover legacy JSON2 remote schema identity Signed-off-by: discord9 --- src/query/src/dist_plan/merge_scan.rs | 42 ++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/src/query/src/dist_plan/merge_scan.rs b/src/query/src/dist_plan/merge_scan.rs index 82331a9f522..b3726dca2ef 100644 --- a/src/query/src/dist_plan/merge_scan.rs +++ b/src/query/src/dist_plan/merge_scan.rs @@ -1231,7 +1231,10 @@ mod tests { use std::pin::Pin; use std::task::{Context, Poll}; - use arrow_schema::{DataType as TestArrowDataType, Field}; + use arrow_schema::extension::{ + EXTENSION_TYPE_METADATA_KEY, EXTENSION_TYPE_NAME_KEY, ExtensionType, + }; + use arrow_schema::{DataType as TestArrowDataType, Field, Fields}; use async_trait::async_trait; use common_query::request::INITIAL_REMOTE_DYN_FILTER_REGISTRATIONS_EXTENSION_KEY; use common_recordbatch::adapter::{PlanMetrics, RecordBatchMetrics}; @@ -1325,6 +1328,43 @@ mod tests { metadata } + #[test] + fn test_amend_legacy_json2_field_preserves_json2_identity() { + let field = Field::new("j", TestArrowDataType::Struct(Fields::empty()), true) + .with_metadata(StdHashMap::from([ + ( + EXTENSION_TYPE_NAME_KEY.to_string(), + "greptime.json".to_string(), + ), + ( + EXTENSION_TYPE_METADATA_KEY.to_string(), + serde_json::json!({ + "json_structure_settings": { "Structured": null } + }) + .to_string(), + ), + ])); + + let legacy_schema = ArrowSchema::new(vec![field]); + let amended = maybe_amend_json2_field(&legacy_schema); + let amended_field = amended.field(0); + assert_eq!(&TestArrowDataType::Binary, amended_field.data_type()); + assert_eq!( + Some(Json2ExtensionType::NAME), + amended_field.extension_type_name() + ); + assert!(is_json2_extension_type(amended_field)); + + // The remote wire schema is Binary, while the legacy advertised schema + // still carries the greptime.json identity. MergeScan must accept the + // amended JSON2 field as the corresponding remote column. + let wire_schema = ArrowSchema::new(vec![ + Field::new("j", TestArrowDataType::Binary, true) + .with_metadata(legacy_schema.field(0).metadata().clone()), + ]); + assert!(validate_remote_schema(&wire_schema, amended.as_ref(), "legacy json2").is_ok()); + } + #[test] fn merge_scan_validates_remote_schema_semantics() { let expected = expected_int64_schema();