From c8596657bb886099680cef6deb96206afc5bcfed Mon Sep 17 00:00:00 2001 From: Randolf Jung Date: Mon, 13 Apr 2026 18:41:55 -0700 Subject: [PATCH] feat: derive Copy and Clone on Queries Queries now implements Copy when E: Copy and Clone when E: Clone, enabling ergonomic use with cheap-to-clone executors like &Pool. Co-Authored-By: Claude Opus 4.6 (1M context) --- examples/advanced-types/src/queries.rs | 8 +++----- examples/basic/src/queries.rs | 16 +++++----------- examples/batch/src/queries.rs | 12 ++++++------ examples/enums/src/queries.rs | 13 +++++++------ src/codegen/mod.rs | 1 + .../codegen__batch_dynamic_slice_param.snap | 1 + tests/snapshots/codegen__batchexec.snap | 1 + tests/snapshots/codegen__batchmany.snap | 1 + tests/snapshots/codegen__batchone.snap | 1 + tests/snapshots/codegen__composite_types.snap | 1 + tests/snapshots/codegen__copyfrom.snap | 1 + .../snapshots/codegen__dynamic_slice_param.snap | 1 + tests/snapshots/codegen__embed.snap | 1 + tests/snapshots/codegen__enum_types.snap | 1 + tests/snapshots/codegen__exec.snap | 1 + tests/snapshots/codegen__execlastid.snap | 1 + tests/snapshots/codegen__execresult.snap | 1 + tests/snapshots/codegen__execrows.snap | 1 + tests/snapshots/codegen__many.snap | 1 + .../codegen__multidimensional_array_types.snap | 1 + tests/snapshots/codegen__named_params.snap | 1 + .../snapshots/codegen__nullable_named_param.snap | 1 + tests/snapshots/codegen__one.snap | 1 + tests/snapshots/codegen__range_types.snap | 1 + tests/snapshots/codegen__slice_param.snap | 1 + 25 files changed, 42 insertions(+), 28 deletions(-) diff --git a/examples/advanced-types/src/queries.rs b/examples/advanced-types/src/queries.rs index 24e64a4..5906e87 100644 --- a/examples/advanced-types/src/queries.rs +++ b/examples/advanced-types/src/queries.rs @@ -1,10 +1,7 @@ -// Code generated by sqlc-gen-sqlx v0.1.1. DO NOT EDIT. +// Code generated by sqlc-gen-sqlx v0.1.4. DO NOT EDIT. // sqlc version: v1.30.0 -#![allow( - dead_code, - reason = "generated queries may expose items a caller does not use" -)] +#![allow(dead_code, reason = "generated queries may expose items a caller does not use")] const GET_EVENT: &str = "SELECT id, name, flags, event_window FROM events WHERE id = $1"; #[derive(Debug, Clone, sqlx::FromRow)] @@ -55,6 +52,7 @@ impl AsExecutor for &mut T { (**self).as_executor() } } +#[derive(Copy, Clone)] pub struct Queries { db: E, } diff --git a/examples/basic/src/queries.rs b/examples/basic/src/queries.rs index b46b19b..667512a 100644 --- a/examples/basic/src/queries.rs +++ b/examples/basic/src/queries.rs @@ -1,10 +1,7 @@ -// Code generated by sqlc-gen-sqlx v0.1.1. DO NOT EDIT. +// Code generated by sqlc-gen-sqlx v0.1.4. DO NOT EDIT. // sqlc version: v1.30.0 -#![allow( - dead_code, - reason = "generated queries may expose items a caller does not use" -)] +#![allow(dead_code, reason = "generated queries may expose items a caller does not use")] const GET_AUTHOR: &str = "SELECT id, name, bio FROM authors WHERE id = $1"; #[derive(Debug, Clone, sqlx::FromRow)] @@ -25,8 +22,7 @@ pub struct CreateAuthorParams { pub name: String, pub bio: Option, } -const CREATE_AUTHOR: &str = - "INSERT INTO authors (name, bio) VALUES ($1, $2) RETURNING id, name, bio"; +const CREATE_AUTHOR: &str = "INSERT INTO authors (name, bio) VALUES ($1, $2) RETURNING id, name, bio"; #[derive(Debug, Clone, sqlx::FromRow)] pub struct CreateAuthorRow { pub id: i64, @@ -68,6 +64,7 @@ impl AsExecutor for &mut T { (**self).as_executor() } } +#[derive(Copy, Clone)] pub struct Queries { db: E, } @@ -102,10 +99,7 @@ impl Queries { .await } pub async fn delete_author(&mut self, id: i64) -> Result<(), sqlx::Error> { - sqlx::query(DELETE_AUTHOR) - .bind(id) - .execute(self.db.as_executor()) - .await?; + sqlx::query(DELETE_AUTHOR).bind(id).execute(self.db.as_executor()).await?; Ok(()) } pub async fn delete_author_rows(&mut self, id: i64) -> Result { diff --git a/examples/batch/src/queries.rs b/examples/batch/src/queries.rs index 2fd8a97..a109180 100644 --- a/examples/batch/src/queries.rs +++ b/examples/batch/src/queries.rs @@ -1,10 +1,7 @@ -// Code generated by sqlc-gen-sqlx v0.1.1. DO NOT EDIT. +// Code generated by sqlc-gen-sqlx v0.1.4. DO NOT EDIT. // sqlc version: v1.30.0 -#![allow( - dead_code, - reason = "generated queries may expose items a caller does not use" -)] +#![allow(dead_code, reason = "generated queries may expose items a caller does not use")] const BATCH_GET_AUTHOR: &str = "SELECT id, name, bio FROM authors WHERE id = $1"; #[derive(Debug, Clone, sqlx::FromRow)] @@ -47,6 +44,7 @@ impl AsExecutor for &mut T { (**self).as_executor() } } +#[derive(Copy, Clone)] pub struct Queries { db: E, } @@ -62,7 +60,9 @@ impl Queries { pub fn batch_get_author<'a, I>( &'a mut self, items: I, - ) -> impl futures_core::stream::Stream> + 'a + ) -> impl futures_core::stream::Stream< + Item = Result, + > + 'a where I: IntoIterator + 'a, I::IntoIter: 'a, diff --git a/examples/enums/src/queries.rs b/examples/enums/src/queries.rs index a5f35a9..34110fa 100644 --- a/examples/enums/src/queries.rs +++ b/examples/enums/src/queries.rs @@ -1,10 +1,7 @@ -// Code generated by sqlc-gen-sqlx v0.1.1. DO NOT EDIT. +// Code generated by sqlc-gen-sqlx v0.1.4. DO NOT EDIT. // sqlc version: v1.30.0 -#![allow( - dead_code, - reason = "generated queries may expose items a caller does not use" -)] +#![allow(dead_code, reason = "generated queries may expose items a caller does not use")] #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, sqlx::Type)] #[sqlx(type_name = "status")] @@ -69,6 +66,7 @@ impl AsExecutor for &mut T { (**self).as_executor() } } +#[derive(Copy, Clone)] pub struct Queries { db: E, } @@ -96,7 +94,10 @@ impl Queries { .fetch_all(self.db.as_executor()) .await } - pub async fn create_user(&mut self, arg: CreateUserParams) -> Result<(), sqlx::Error> { + pub async fn create_user( + &mut self, + arg: CreateUserParams, + ) -> Result<(), sqlx::Error> { sqlx::query(CREATE_USER) .bind(arg.name) .bind(arg.status) diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index 2d96991..05a2729 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -92,6 +92,7 @@ pub fn generate(request: &GenerateRequestView<'_>, config: &Config) -> Result { db: E, } diff --git a/tests/snapshots/codegen__batch_dynamic_slice_param.snap b/tests/snapshots/codegen__batch_dynamic_slice_param.snap index caa3ddd..03cfafc 100644 --- a/tests/snapshots/codegen__batch_dynamic_slice_param.snap +++ b/tests/snapshots/codegen__batch_dynamic_slice_param.snap @@ -47,6 +47,7 @@ impl AsExecutor for &mut T { (**self).as_executor() } } +#[derive(Copy, Clone)] pub struct Queries { db: E, } diff --git a/tests/snapshots/codegen__batchexec.snap b/tests/snapshots/codegen__batchexec.snap index d3650ce..5f41d89 100644 --- a/tests/snapshots/codegen__batchexec.snap +++ b/tests/snapshots/codegen__batchexec.snap @@ -41,6 +41,7 @@ impl AsExecutor for &mut T { (**self).as_executor() } } +#[derive(Copy, Clone)] pub struct Queries { db: E, } diff --git a/tests/snapshots/codegen__batchmany.snap b/tests/snapshots/codegen__batchmany.snap index e71f4ed..caf03ae 100644 --- a/tests/snapshots/codegen__batchmany.snap +++ b/tests/snapshots/codegen__batchmany.snap @@ -47,6 +47,7 @@ impl AsExecutor for &mut T { (**self).as_executor() } } +#[derive(Copy, Clone)] pub struct Queries { db: E, } diff --git a/tests/snapshots/codegen__batchone.snap b/tests/snapshots/codegen__batchone.snap index 7fffa9b..6d289bc 100644 --- a/tests/snapshots/codegen__batchone.snap +++ b/tests/snapshots/codegen__batchone.snap @@ -47,6 +47,7 @@ impl AsExecutor for &mut T { (**self).as_executor() } } +#[derive(Copy, Clone)] pub struct Queries { db: E, } diff --git a/tests/snapshots/codegen__composite_types.snap b/tests/snapshots/codegen__composite_types.snap index 6d32a6a..2b9458e 100644 --- a/tests/snapshots/codegen__composite_types.snap +++ b/tests/snapshots/codegen__composite_types.snap @@ -47,6 +47,7 @@ impl AsExecutor for &mut T { (**self).as_executor() } } +#[derive(Copy, Clone)] pub struct Queries { db: E, } diff --git a/tests/snapshots/codegen__copyfrom.snap b/tests/snapshots/codegen__copyfrom.snap index 79fbfa1..ccddb38 100644 --- a/tests/snapshots/codegen__copyfrom.snap +++ b/tests/snapshots/codegen__copyfrom.snap @@ -47,6 +47,7 @@ impl AsExecutor for &mut T { (**self).as_executor() } } +#[derive(Copy, Clone)] pub struct Queries { db: E, } diff --git a/tests/snapshots/codegen__dynamic_slice_param.snap b/tests/snapshots/codegen__dynamic_slice_param.snap index 1e892f4..6fcf73c 100644 --- a/tests/snapshots/codegen__dynamic_slice_param.snap +++ b/tests/snapshots/codegen__dynamic_slice_param.snap @@ -47,6 +47,7 @@ impl AsExecutor for &mut T { (**self).as_executor() } } +#[derive(Copy, Clone)] pub struct Queries { db: E, } diff --git a/tests/snapshots/codegen__embed.snap b/tests/snapshots/codegen__embed.snap index 43f8da4..b60bc57 100644 --- a/tests/snapshots/codegen__embed.snap +++ b/tests/snapshots/codegen__embed.snap @@ -52,6 +52,7 @@ impl AsExecutor for &mut T { (**self).as_executor() } } +#[derive(Copy, Clone)] pub struct Queries { db: E, } diff --git a/tests/snapshots/codegen__enum_types.snap b/tests/snapshots/codegen__enum_types.snap index f5ce1af..6d66dd3 100644 --- a/tests/snapshots/codegen__enum_types.snap +++ b/tests/snapshots/codegen__enum_types.snap @@ -55,6 +55,7 @@ impl AsExecutor for &mut T { (**self).as_executor() } } +#[derive(Copy, Clone)] pub struct Queries { db: E, } diff --git a/tests/snapshots/codegen__exec.snap b/tests/snapshots/codegen__exec.snap index 0795765..64694c8 100644 --- a/tests/snapshots/codegen__exec.snap +++ b/tests/snapshots/codegen__exec.snap @@ -41,6 +41,7 @@ impl AsExecutor for &mut T { (**self).as_executor() } } +#[derive(Copy, Clone)] pub struct Queries { db: E, } diff --git a/tests/snapshots/codegen__execlastid.snap b/tests/snapshots/codegen__execlastid.snap index 877855f..81accc2 100644 --- a/tests/snapshots/codegen__execlastid.snap +++ b/tests/snapshots/codegen__execlastid.snap @@ -41,6 +41,7 @@ impl AsExecutor for &mut T { (**self).as_executor() } } +#[derive(Copy, Clone)] pub struct Queries { db: E, } diff --git a/tests/snapshots/codegen__execresult.snap b/tests/snapshots/codegen__execresult.snap index bcc6f3b..ee80266 100644 --- a/tests/snapshots/codegen__execresult.snap +++ b/tests/snapshots/codegen__execresult.snap @@ -41,6 +41,7 @@ impl AsExecutor for &mut T { (**self).as_executor() } } +#[derive(Copy, Clone)] pub struct Queries { db: E, } diff --git a/tests/snapshots/codegen__execrows.snap b/tests/snapshots/codegen__execrows.snap index f4b81a8..99cf300 100644 --- a/tests/snapshots/codegen__execrows.snap +++ b/tests/snapshots/codegen__execrows.snap @@ -41,6 +41,7 @@ impl AsExecutor for &mut T { (**self).as_executor() } } +#[derive(Copy, Clone)] pub struct Queries { db: E, } diff --git a/tests/snapshots/codegen__many.snap b/tests/snapshots/codegen__many.snap index e74b8ff..703df4f 100644 --- a/tests/snapshots/codegen__many.snap +++ b/tests/snapshots/codegen__many.snap @@ -47,6 +47,7 @@ impl AsExecutor for &mut T { (**self).as_executor() } } +#[derive(Copy, Clone)] pub struct Queries { db: E, } diff --git a/tests/snapshots/codegen__multidimensional_array_types.snap b/tests/snapshots/codegen__multidimensional_array_types.snap index c8e0fea..3f229c4 100644 --- a/tests/snapshots/codegen__multidimensional_array_types.snap +++ b/tests/snapshots/codegen__multidimensional_array_types.snap @@ -45,6 +45,7 @@ impl AsExecutor for &mut T { (**self).as_executor() } } +#[derive(Copy, Clone)] pub struct Queries { db: E, } diff --git a/tests/snapshots/codegen__named_params.snap b/tests/snapshots/codegen__named_params.snap index 884cd2b..082682a 100644 --- a/tests/snapshots/codegen__named_params.snap +++ b/tests/snapshots/codegen__named_params.snap @@ -46,6 +46,7 @@ impl AsExecutor for &mut T { (**self).as_executor() } } +#[derive(Copy, Clone)] pub struct Queries { db: E, } diff --git a/tests/snapshots/codegen__nullable_named_param.snap b/tests/snapshots/codegen__nullable_named_param.snap index 1d58aa8..33dcce2 100644 --- a/tests/snapshots/codegen__nullable_named_param.snap +++ b/tests/snapshots/codegen__nullable_named_param.snap @@ -47,6 +47,7 @@ impl AsExecutor for &mut T { (**self).as_executor() } } +#[derive(Copy, Clone)] pub struct Queries { db: E, } diff --git a/tests/snapshots/codegen__one.snap b/tests/snapshots/codegen__one.snap index 3d1b6b8..49d1a6d 100644 --- a/tests/snapshots/codegen__one.snap +++ b/tests/snapshots/codegen__one.snap @@ -47,6 +47,7 @@ impl AsExecutor for &mut T { (**self).as_executor() } } +#[derive(Copy, Clone)] pub struct Queries { db: E, } diff --git a/tests/snapshots/codegen__range_types.snap b/tests/snapshots/codegen__range_types.snap index 0def427..bf32749 100644 --- a/tests/snapshots/codegen__range_types.snap +++ b/tests/snapshots/codegen__range_types.snap @@ -47,6 +47,7 @@ impl AsExecutor for &mut T { (**self).as_executor() } } +#[derive(Copy, Clone)] pub struct Queries { db: E, } diff --git a/tests/snapshots/codegen__slice_param.snap b/tests/snapshots/codegen__slice_param.snap index 8999907..70cd6a9 100644 --- a/tests/snapshots/codegen__slice_param.snap +++ b/tests/snapshots/codegen__slice_param.snap @@ -47,6 +47,7 @@ impl AsExecutor for &mut T { (**self).as_executor() } } +#[derive(Copy, Clone)] pub struct Queries { db: E, }