From 24317d5eab40fbc33caf1142946e2f39caad73ea Mon Sep 17 00:00:00 2001 From: Joey de Waal <99046430+joeydewaal@users.noreply.github.com> Date: Thu, 17 Jul 2025 23:58:36 +0200 Subject: [PATCH] Fix logger regression (#3938) --- sqlx-core/src/logger.rs | 4 ++++ sqlx-mysql/src/connection/executor.rs | 11 +++++++---- sqlx-postgres/src/connection/executor.rs | 14 +++++--------- 3 files changed, 16 insertions(+), 13 deletions(-) diff --git a/sqlx-core/src/logger.rs b/sqlx-core/src/logger.rs index 61148543..424639ed 100644 --- a/sqlx-core/src/logger.rs +++ b/sqlx-core/src/logger.rs @@ -87,6 +87,10 @@ impl QueryLogger { self.rows_affected += n; } + pub fn sql(&self) -> &SqlStr { + &self.sql + } + pub fn finish(&self) { let elapsed = self.start.elapsed(); diff --git a/sqlx-mysql/src/connection/executor.rs b/sqlx-mysql/src/connection/executor.rs index 4eae4bc5..2b660b94 100644 --- a/sqlx-mysql/src/connection/executor.rs +++ b/sqlx-mysql/src/connection/executor.rs @@ -108,10 +108,14 @@ impl MySqlConnection { persistent: bool, ) -> Result, Error>> + 'e, Error> { + let mut logger = QueryLogger::new(sql, self.inner.log_settings.clone()); + self.inner.stream.wait_until_ready().await?; self.inner.stream.waiting.push_back(Waiting::Result); Ok(try_stream! { + let sql = logger.sql().as_str(); + // make a slot for the shared column data // as long as a reference to a row is not held past one iteration, this enables us // to re-use this memory freely between result sets @@ -120,7 +124,7 @@ impl MySqlConnection { let (mut column_names, format, mut needs_metadata) = if let Some(arguments) = arguments { if persistent && self.inner.cache_statement.is_enabled() { let (id, metadata) = self - .get_or_prepare_statement(sql.as_str()) + .get_or_prepare_statement(sql) .await?; if arguments.types.len() != metadata.parameters { @@ -144,7 +148,7 @@ impl MySqlConnection { (metadata.column_names, MySqlValueFormat::Binary, false) } else { let (id, metadata) = self - .prepare_statement(sql.as_str()) + .prepare_statement(sql) .await?; if arguments.types.len() != metadata.parameters { @@ -171,11 +175,10 @@ impl MySqlConnection { } } else { // https://dev.mysql.com/doc/internals/en/com-query.html - self.inner.stream.send_packet(Query(sql.as_str())).await?; + self.inner.stream.send_packet(Query(sql)).await?; (Arc::default(), MySqlValueFormat::Text, true) }; - let mut logger = QueryLogger::new(sql, self.inner.log_settings.clone()); loop { // query response is a meta-packet which may be one of: diff --git a/sqlx-postgres/src/connection/executor.rs b/sqlx-postgres/src/connection/executor.rs index c3862a3f..ba4cffa6 100644 --- a/sqlx-postgres/src/connection/executor.rs +++ b/sqlx-postgres/src/connection/executor.rs @@ -215,6 +215,9 @@ impl PgConnection { persistent: bool, metadata_opt: Option>, ) -> Result, Error>> + 'e, Error> { + let mut logger = QueryLogger::new(query, self.inner.log_settings.clone()); + let sql = logger.sql().as_str(); + // before we continue, wait until we are "ready" to accept more queries self.wait_until_ready().await?; @@ -237,13 +240,7 @@ impl PgConnection { // prepare the statement if this our first time executing it // always return the statement ID here let (statement, metadata_) = self - .get_or_prepare( - query.as_str(), - &arguments.types, - persistent, - metadata_opt, - false, - ) + .get_or_prepare(sql, &arguments.types, persistent, metadata_opt, false) .await?; metadata = metadata_; @@ -296,7 +293,7 @@ impl PgConnection { PgValueFormat::Binary } else { // Query will trigger a ReadyForQuery - self.inner.stream.write_msg(Query(query.as_str()))?; + self.inner.stream.write_msg(Query(sql))?; self.inner.pending_ready_for_query_count += 1; // metadata starts out as "nothing" @@ -307,7 +304,6 @@ impl PgConnection { }; self.inner.stream.flush().await?; - let mut logger = QueryLogger::new(query, self.inner.log_settings.clone()); Ok(try_stream! { loop {