From cf78472d6d511a1e0f941d77cefe1c45ca7995fb Mon Sep 17 00:00:00 2001 From: Ryan Leckey Date: Mon, 20 Jul 2020 21:49:30 -0700 Subject: [PATCH] fix(mysql): gate com_stmt_execute encode on non-empty params, not non-null params --- .../src/mysql/protocol/statement/execute.rs | 2 +- tests/mysql/mysql.rs | 35 +++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/sqlx-core/src/mysql/protocol/statement/execute.rs b/sqlx-core/src/mysql/protocol/statement/execute.rs index e97cc121..5eb67f3f 100644 --- a/sqlx-core/src/mysql/protocol/statement/execute.rs +++ b/sqlx-core/src/mysql/protocol/statement/execute.rs @@ -18,7 +18,7 @@ impl<'q> Encode<'_, Capabilities> for Execute<'q> { buf.push(0); // NO_CURSOR buf.extend(&0_u32.to_le_bytes()); // iterations (always 1): int<4> - if !self.arguments.values.is_empty() { + if !self.arguments.types.is_empty() { buf.extend(&*self.arguments.null_bitmap); buf.push(1); // send type to server diff --git a/tests/mysql/mysql.rs b/tests/mysql/mysql.rs index a6ae64ce..bbd414c2 100644 --- a/tests/mysql/mysql.rs +++ b/tests/mysql/mysql.rs @@ -200,3 +200,38 @@ async fn it_caches_statements() -> anyhow::Result<()> { Ok(()) } + +#[sqlx_macros::test] +async fn it_can_bind_null_and_non_null_issue_540() -> anyhow::Result<()> { + let mut conn = new::().await?; + + let row = sqlx::query("SELECT ?, ?") + .bind(50_i32) + .bind(None::) + .fetch_one(&mut conn) + .await?; + + let v0: Option = row.get(0); + let v1: Option = row.get(1); + + assert_eq!(v0, Some(50)); + assert_eq!(v1, None); + + Ok(()) +} + +#[sqlx_macros::test] +async fn it_can_bind_only_null_issue_540() -> anyhow::Result<()> { + let mut conn = new::().await?; + + let row = sqlx::query("SELECT ?") + .bind(None::) + .fetch_one(&mut conn) + .await?; + + let v0: Option = row.get(0); + + assert_eq!(v0, None); + + Ok(()) +}