diff --git a/sqlx-core/src/mysql/protocol/statement/execute.rs b/sqlx-core/src/mysql/protocol/statement/execute.rs index e97cc1213..5eb67f3f4 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 a6ae64ced..bbd414c29 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(()) +}