diff --git a/Cargo.lock b/Cargo.lock index a8e8270c..02d2665a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2838,9 +2838,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.15" +version = "0.4.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6cb093c84e8bd9b188d4c4a8cb6579fc016968d14c99882163cd3ff402a4f155" +checksum = "a9f37a958b41b3b19ee2707c06439c0e9e547e847223eb791ecb0cb821c65e27" dependencies = [ "atomic-waker", "bytes", diff --git a/DEPENDENCIES.rust.tsv b/DEPENDENCIES.rust.tsv index 912dea88..5b708be8 100644 --- a/DEPENDENCIES.rust.tsv +++ b/DEPENDENCIES.rust.tsv @@ -236,7 +236,7 @@ getrandom@0.3.4 X X getrandom@0.4.3 X X glob@0.3.3 X X gloo-timers@0.3.0 X X -h2@0.4.15 X +h2@0.4.16 X half@2.7.1 X X hashbrown@0.14.5 X X hashbrown@0.15.5 X X diff --git a/benchmarks/tpcds/DEPENDENCIES.rust.tsv b/benchmarks/tpcds/DEPENDENCIES.rust.tsv index a871ab1e..6824acf6 100644 --- a/benchmarks/tpcds/DEPENDENCIES.rust.tsv +++ b/benchmarks/tpcds/DEPENDENCIES.rust.tsv @@ -165,7 +165,7 @@ getrandom@0.3.4 X X getrandom@0.4.3 X X glob@0.3.3 X X gloo-timers@0.3.0 X X -h2@0.4.15 X +h2@0.4.16 X half@2.7.1 X X hashbrown@0.14.5 X X hashbrown@0.15.5 X X diff --git a/bindings/c/DEPENDENCIES.rust.tsv b/bindings/c/DEPENDENCIES.rust.tsv index 9f5c62a9..eaafce63 100644 --- a/bindings/c/DEPENDENCIES.rust.tsv +++ b/bindings/c/DEPENDENCIES.rust.tsv @@ -110,7 +110,7 @@ getrandom@0.2.17 X X getrandom@0.3.4 X X getrandom@0.4.3 X X gloo-timers@0.3.0 X X -h2@0.4.15 X +h2@0.4.16 X half@2.7.1 X X hashbrown@0.14.5 X X hashbrown@0.17.1 X X diff --git a/bindings/go/DEPENDENCIES.rust.tsv b/bindings/go/DEPENDENCIES.rust.tsv index 9f5c62a9..eaafce63 100644 --- a/bindings/go/DEPENDENCIES.rust.tsv +++ b/bindings/go/DEPENDENCIES.rust.tsv @@ -110,7 +110,7 @@ getrandom@0.2.17 X X getrandom@0.3.4 X X getrandom@0.4.3 X X gloo-timers@0.3.0 X X -h2@0.4.15 X +h2@0.4.16 X half@2.7.1 X X hashbrown@0.14.5 X X hashbrown@0.17.1 X X diff --git a/bindings/python/DEPENDENCIES.rust.tsv b/bindings/python/DEPENDENCIES.rust.tsv index e3ec6090..568d06c6 100644 --- a/bindings/python/DEPENDENCIES.rust.tsv +++ b/bindings/python/DEPENDENCIES.rust.tsv @@ -189,7 +189,7 @@ getrandom@0.3.4 X X getrandom@0.4.3 X X glob@0.3.3 X X gloo-timers@0.3.0 X X -h2@0.4.15 X +h2@0.4.16 X half@2.7.1 X X hashbrown@0.14.5 X X hashbrown@0.15.5 X X diff --git a/crates/integration_tests/DEPENDENCIES.rust.tsv b/crates/integration_tests/DEPENDENCIES.rust.tsv index 73588751..8a8add7b 100644 --- a/crates/integration_tests/DEPENDENCIES.rust.tsv +++ b/crates/integration_tests/DEPENDENCIES.rust.tsv @@ -110,7 +110,7 @@ getrandom@0.2.17 X X getrandom@0.3.4 X X getrandom@0.4.3 X X gloo-timers@0.3.0 X X -h2@0.4.15 X +h2@0.4.16 X half@2.7.1 X X hashbrown@0.14.5 X X hashbrown@0.17.1 X X diff --git a/crates/integrations/datafusion/DEPENDENCIES.rust.tsv b/crates/integrations/datafusion/DEPENDENCIES.rust.tsv index 3089ed33..de5d60d6 100644 --- a/crates/integrations/datafusion/DEPENDENCIES.rust.tsv +++ b/crates/integrations/datafusion/DEPENDENCIES.rust.tsv @@ -202,7 +202,7 @@ getrandom@0.3.4 X X getrandom@0.4.3 X X glob@0.3.3 X X gloo-timers@0.3.0 X X -h2@0.4.15 X +h2@0.4.16 X half@2.7.1 X X hashbrown@0.14.5 X X hashbrown@0.15.5 X X diff --git a/crates/paimon-rest-server/DEPENDENCIES.rust.tsv b/crates/paimon-rest-server/DEPENDENCIES.rust.tsv index 80ae8801..6b36f7ef 100644 --- a/crates/paimon-rest-server/DEPENDENCIES.rust.tsv +++ b/crates/paimon-rest-server/DEPENDENCIES.rust.tsv @@ -113,7 +113,7 @@ getrandom@0.2.17 X X getrandom@0.3.4 X X getrandom@0.4.3 X X gloo-timers@0.3.0 X X -h2@0.4.15 X +h2@0.4.16 X half@2.7.1 X X hashbrown@0.14.5 X X hashbrown@0.17.1 X X diff --git a/crates/paimon/DEPENDENCIES.rust.tsv b/crates/paimon/DEPENDENCIES.rust.tsv index 89b76f4f..d8dceab8 100644 --- a/crates/paimon/DEPENDENCIES.rust.tsv +++ b/crates/paimon/DEPENDENCIES.rust.tsv @@ -175,7 +175,7 @@ getrandom@0.3.4 X X getrandom@0.4.3 X X glob@0.3.3 X X gloo-timers@0.3.0 X X -h2@0.4.15 X +h2@0.4.16 X half@2.7.1 X X hashbrown@0.14.5 X X hashbrown@0.16.1 X X diff --git a/crates/paimon/src/spec/types.rs b/crates/paimon/src/spec/types.rs index 6401415d..46d664db 100644 --- a/crates/paimon/src/spec/types.rs +++ b/crates/paimon/src/spec/types.rs @@ -1537,7 +1537,11 @@ pub struct VarCharType { impl Display for VarCharType { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { - write!(f, "VARCHAR({})", self.length)?; + if self.length == Self::MAX_LENGTH { + write!(f, "{STRING_TYPE_NAME}")?; + } else { + write!(f, "VARCHAR({})", self.length)?; + } if !self.nullable { write!(f, " NOT NULL")?; } @@ -2534,24 +2538,32 @@ mod tests { } } - /// Regression: `MAX_LENGTH` for `VarCharType`/`VarBinaryType` must fit in a - /// Java `int`, otherwise `DataTypeJsonParser` rejects the `CreateTableRequest` - /// REST payload with `NumberFormatException` on `Integer.parseInt`. #[test] - fn test_max_length_fits_java_integer() { + fn test_string_type_serializes_like_java() { + let nullable = DataType::VarChar(VarCharType::string_type()); + assert_eq!(serde_json::to_string(&nullable).unwrap(), r#""STRING""#); + + let not_null = + DataType::VarChar(VarCharType::with_nullable(false, VarCharType::MAX_LENGTH).unwrap()); + assert_eq!( + serde_json::to_string(¬_null).unwrap(), + r#""STRING NOT NULL""# + ); + + let bounded = DataType::VarChar(VarCharType::new(42).unwrap()); + assert_eq!(serde_json::to_string(&bounded).unwrap(), r#""VARCHAR(42)""#); + } + + /// Regression: `MAX_LENGTH` must match Java's `Integer.MAX_VALUE` even though + /// an unbounded `VarCharType` is serialized through Java's `STRING` alias. + #[test] + fn test_max_length_matches_java_integer() { const JAVA_INTEGER_MAX_VALUE: u32 = i32::MAX as u32; assert_eq!(VarCharType::MAX_LENGTH, JAVA_INTEGER_MAX_VALUE); assert_eq!(VarBinaryType::MAX_LENGTH, JAVA_INTEGER_MAX_VALUE); - let varchar = VarCharType::string_type().to_string(); - let length_token = varchar - .strip_prefix("VARCHAR(") - .and_then(|s| s.split(')').next()) - .expect("VARCHAR display format"); - length_token - .parse::() - .expect("VARCHAR length must parse as Java int"); + assert_eq!(VarCharType::string_type().to_string(), STRING_TYPE_NAME); let varbinary = VarBinaryType::try_new(true, VarBinaryType::MAX_LENGTH) .unwrap()