From bd8ffd3db9c3d6c68627dfbd501428251c155286 Mon Sep 17 00:00:00 2001 From: Ning Sun Date: Mon, 22 Dec 2025 13:13:39 +0800 Subject: [PATCH] feat: pgwire 0.37 (#7443) --- Cargo.lock | 35 ++++++++++++++++++++++------ src/servers/Cargo.toml | 2 +- src/servers/src/postgres/fixtures.rs | 4 ++-- src/servers/src/postgres/handler.rs | 20 ++++++++++++++++ src/servers/src/postgres/types.rs | 4 ++-- 5 files changed, 53 insertions(+), 12 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 830ff1a9b8..4cf1583019 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -9320,9 +9320,9 @@ dependencies = [ [[package]] name = "pgwire" -version = "0.36.3" +version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70a2bcdcc4b20a88e0648778ecf00415bbd5b447742275439c22176835056f99" +checksum = "02d86d57e732d40382ceb9bfea80901d839bae8571aa11c06af9177aed9dfb6c" dependencies = [ "async-trait", "base64 0.22.1", @@ -9341,6 +9341,7 @@ dependencies = [ "ryu", "serde", "serde_json", + "smol_str", "stringprep", "thiserror 2.0.17", "tokio", @@ -11505,10 +11506,11 @@ checksum = "1bc711410fbe7399f390ca1c3b60ad0f53f80e95c5eb935e52268a0e2cd49acc" [[package]] name = "serde" -version = "1.0.219" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" dependencies = [ + "serde_core", "serde_derive", ] @@ -11523,10 +11525,19 @@ dependencies = [ ] [[package]] -name = "serde_derive" -version = "1.0.219" +name = "serde_core" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", @@ -12001,6 +12012,16 @@ dependencies = [ "serde", ] +[[package]] +name = "smol_str" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3498b0a27f93ef1402f20eefacfaa1691272ac4eca1cdc8c596cb0a245d6cbf5" +dependencies = [ + "borsh", + "serde_core", +] + [[package]] name = "snafu" version = "0.7.5" diff --git a/src/servers/Cargo.toml b/src/servers/Cargo.toml index 42ab4d1cd0..40cac587d7 100644 --- a/src/servers/Cargo.toml +++ b/src/servers/Cargo.toml @@ -87,7 +87,7 @@ operator.workspace = true otel-arrow-rust.workspace = true parking_lot.workspace = true pg_interval = "0.4" -pgwire = { version = "0.36.3", default-features = false, features = [ +pgwire = { version = "0.37", default-features = false, features = [ "server-api-ring", "pg-ext-types", ] } diff --git a/src/servers/src/postgres/fixtures.rs b/src/servers/src/postgres/fixtures.rs index dcd7842c95..c06684ad5d 100644 --- a/src/servers/src/postgres/fixtures.rs +++ b/src/servers/src/postgres/fixtures.rs @@ -28,13 +28,13 @@ fn build_string_data_rows( schema: Arc>, rows: Vec>, ) -> Vec> { + let mut encoder = DataRowEncoder::new(schema.clone()); rows.iter() .map(|row| { - let mut encoder = DataRowEncoder::new(schema.clone()); for value in row { encoder.encode_field(&Some(value))?; } - encoder.finish() + Ok(encoder.take_row()) }) .collect() } diff --git a/src/servers/src/postgres/handler.rs b/src/servers/src/postgres/handler.rs index ad242390ec..b8fb115501 100644 --- a/src/servers/src/postgres/handler.rs +++ b/src/servers/src/postgres/handler.rs @@ -262,6 +262,26 @@ impl QueryParser for DefaultQueryParser { }) } } + + fn get_parameter_types(&self, _stmt: &Self::Statement) -> PgWireResult> { + // we have our own implementation of describes in ExtendedQueryHandler + // so we don't use these methods + Err(PgWireError::ApiError( + "get_parameter_types is not expected to be called".into(), + )) + } + + fn get_result_schema( + &self, + _stmt: &Self::Statement, + _column_format: Option<&Format>, + ) -> PgWireResult> { + // we have our own implementation of describes in ExtendedQueryHandler + // so we don't use these methods + Err(PgWireError::ApiError( + "get_result_schema is not expected to be called".into(), + )) + } } #[async_trait] diff --git a/src/servers/src/postgres/types.rs b/src/servers/src/postgres/types.rs index 96a2105d44..a2f9e219ad 100644 --- a/src/servers/src/postgres/types.rs +++ b/src/servers/src/postgres/types.rs @@ -395,13 +395,13 @@ impl Iterator for RecordBatchRowIterator { type Item = PgWireResult; fn next(&mut self) -> Option { + let mut encoder = DataRowEncoder::new(self.pg_schema.clone()); if self.i < self.record_batch.num_rows() { - let mut encoder = DataRowEncoder::new(self.pg_schema.clone()); if let Err(e) = self.encode_row(self.i, &mut encoder) { return Some(Err(e)); } self.i += 1; - Some(encoder.finish()) + Some(Ok(encoder.take_row())) } else { None }