From ff93aa017ac25252367d66496751cb7025c81af8 Mon Sep 17 00:00:00 2001
From: iamjpotts <8704475+iamjpotts@users.noreply.github.com>
Date: Tue, 19 Aug 2025 16:59:37 -0400
Subject: [PATCH] refactor(sqlite): do not borrow bound values, delete lifetime
on `SqliteArguments` (#3957)
* bug(sqlite): query macro argument lifetime use inconsistent with other db platforms
Signed-off-by: Joshua Potts <8704475+iamjpotts@users.noreply.github.com>
* refactor(sqlite): Improve support for references as query macro bind arguments by removing lifetime parameter from SqliteArguments
Signed-off-by: Joshua Potts <8704475+iamjpotts@users.noreply.github.com>
Signed-off-by: Joshua Potts <8704475+iamjpotts@users.noreply.github.com>
* refactor(sqlite): Introduce SqliteArgumentsBuffer type
Signed-off-by: Joshua Potts <8704475+iamjpotts@users.noreply.github.com>
* refactor(sqlite): Improve cloning of SqliteArgumentValue, SqliteArguments, and SqliteArgumentsBuffer
Signed-off-by: Joshua Potts <8704475+iamjpotts@users.noreply.github.com>
* refactor(any): Simplify AnyArguments::convert_to to convert_into
Signed-off-by: Joshua Potts <8704475+iamjpotts@users.noreply.github.com>
---------
Signed-off-by: Joshua Potts <8704475+iamjpotts@users.noreply.github.com>
---
sqlx-core/src/any/arguments.rs | 12 ++--
sqlx-mysql/src/any.rs | 5 +-
sqlx-postgres/src/any.rs | 5 +-
sqlx-sqlite/src/any.rs | 44 +++++++-------
sqlx-sqlite/src/arguments.rs | 69 ++++++++++------------
sqlx-sqlite/src/connection/execute.rs | 14 ++---
sqlx-sqlite/src/connection/worker.rs | 6 +-
sqlx-sqlite/src/database.rs | 10 ++--
sqlx-sqlite/src/lib.rs | 4 +-
sqlx-sqlite/src/statement/mod.rs | 19 +-----
sqlx-sqlite/src/types/bool.rs | 8 +--
sqlx-sqlite/src/types/bytes.rs | 63 +++++++-------------
sqlx-sqlite/src/types/chrono.rs | 10 ++--
sqlx-sqlite/src/types/float.rs | 15 ++---
sqlx-sqlite/src/types/int.rs | 29 +++-------
sqlx-sqlite/src/types/json.rs | 5 +-
sqlx-sqlite/src/types/str.rs | 83 ++++++++++++---------------
sqlx-sqlite/src/types/text.rs | 7 ++-
sqlx-sqlite/src/types/time.rs | 11 ++--
sqlx-sqlite/src/types/uint.rs | 22 +++----
sqlx-sqlite/src/types/uuid.rs | 30 ++++------
tests/sqlite/macros.rs | 25 ++++++++
22 files changed, 221 insertions(+), 275 deletions(-)
diff --git a/sqlx-core/src/any/arguments.rs b/sqlx-core/src/any/arguments.rs
index 2c05e3fd..5a617c14 100644
--- a/sqlx-core/src/any/arguments.rs
+++ b/sqlx-core/src/any/arguments.rs
@@ -42,7 +42,7 @@ impl Default for AnyArguments<'_> {
impl<'q> AnyArguments<'q> {
#[doc(hidden)]
- pub fn convert_to<'a, A: Arguments<'a>>(&'a self) -> Result
+ pub fn convert_into<'a, A: Arguments<'a>>(self) -> Result
where
'q: 'a,
Option: Type + Encode<'a, A::Database>,
@@ -60,12 +60,12 @@ impl<'q> AnyArguments<'q> {
i64: Type + Encode<'a, A::Database>,
f32: Type + Encode<'a, A::Database>,
f64: Type + Encode<'a, A::Database>,
- &'a str: Type + Encode<'a, A::Database>,
- &'a [u8]: Type + Encode<'a, A::Database>,
+ String: Type + Encode<'a, A::Database>,
+ Vec: Type + Encode<'a, A::Database>,
{
let mut out = A::default();
- for arg in &self.values.0 {
+ for arg in self.values.0 {
match arg {
AnyValueKind::Null(AnyTypeInfoKind::Null) => out.add(Option::::None),
AnyValueKind::Null(AnyTypeInfoKind::Bool) => out.add(Option::::None),
@@ -82,8 +82,8 @@ impl<'q> AnyArguments<'q> {
AnyValueKind::BigInt(i) => out.add(i),
AnyValueKind::Real(r) => out.add(r),
AnyValueKind::Double(d) => out.add(d),
- AnyValueKind::Text(t) => out.add(&**t),
- AnyValueKind::Blob(b) => out.add(&**b),
+ AnyValueKind::Text(t) => out.add(String::from(t)),
+ AnyValueKind::Blob(b) => out.add(Vec::from(b)),
}?
}
Ok(out)
diff --git a/sqlx-mysql/src/any.rs b/sqlx-mysql/src/any.rs
index 028b6c55..70b7ad45 100644
--- a/sqlx-mysql/src/any.rs
+++ b/sqlx-mysql/src/any.rs
@@ -84,7 +84,7 @@ impl AnyConnectionBackend for MySqlConnection {
arguments: Option>,
) -> BoxStream<'q, sqlx_core::Result>> {
let persistent = persistent && arguments.is_some();
- let arguments = match arguments.as_ref().map(AnyArguments::convert_to).transpose() {
+ let arguments = match arguments.map(AnyArguments::convert_into).transpose() {
Ok(arguments) => arguments,
Err(error) => {
return stream::once(future::ready(Err(sqlx_core::Error::Encode(error)))).boxed()
@@ -111,8 +111,7 @@ impl AnyConnectionBackend for MySqlConnection {
) -> BoxFuture<'q, sqlx_core::Result