Skip to content

Commit 0def87b

Browse files
committed
fix(derives): lift requirement of Copy + Clone on weak enums
1 parent 6a251ef commit 0def87b

File tree

2 files changed

+28
-7
lines changed

2 files changed

+28
-7
lines changed

sqlx-macros/src/derives/encode.rs

+13-6
Original file line numberDiff line numberDiff line change
@@ -98,21 +98,27 @@ fn expand_derive_encode_weak_enum(
9898
) -> syn::Result<proc_macro2::TokenStream> {
9999
let attr = check_weak_enum_attributes(input, &variants)?;
100100
let repr = attr.repr.unwrap();
101-
102101
let ident = &input.ident;
103102

103+
let mut values = Vec::new();
104+
105+
for v in variants {
106+
let id = &v.ident;
107+
values.push(quote!(#ident :: #id => (#ident :: #id as #repr),));
108+
}
109+
104110
Ok(quote!(
105111
impl<'q, DB: sqlx::Database> sqlx::encode::Encode<'q, DB> for #ident where #repr: sqlx::encode::Encode<'q, DB> {
106112
fn encode_by_ref(&self, buf: &mut <DB as sqlx::database::HasArguments<'q>>::ArgumentBuffer) -> sqlx::encode::IsNull {
107-
<#repr as sqlx::encode::Encode<DB>>::encode_by_ref(&(*self as #repr), buf)
108-
}
113+
let value = match self {
114+
#(#values)*
115+
};
109116

110-
fn produces(&self) -> Option<DB::TypeInfo> {
111-
<#repr as sqlx::encode::Encode<DB>>::produces(&(*self as #repr))
117+
<#repr as sqlx::encode::Encode<DB>>::encode_by_ref(&value, buf)
112118
}
113119

114120
fn size_hint(&self) -> usize {
115-
<#repr as sqlx::encode::Encode<DB>>::size_hint(&(*self as #repr))
121+
<#repr as sqlx::encode::Encode<DB>>::size_hint(&Default::default())
116122
}
117123
}
118124
))
@@ -127,6 +133,7 @@ fn expand_derive_encode_strong_enum(
127133
let ident = &input.ident;
128134

129135
let mut value_arms = Vec::new();
136+
130137
for v in variants {
131138
let id = &v.ident;
132139
let attributes = parse_child_attributes(&v.attrs)?;

tests/mysql/macros.rs

+15-1
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,14 @@ enum MyEnum {
132132
Blue,
133133
}
134134

135+
#[derive(PartialEq, Eq, Debug, sqlx::Type)]
136+
#[repr(i32)]
137+
enum MyCEnum {
138+
Red = 0,
139+
Green,
140+
Blue,
141+
}
142+
135143
#[sqlx_macros::test]
136144
async fn test_column_override_wildcard() -> anyhow::Result<()> {
137145
struct Record {
@@ -172,7 +180,13 @@ async fn test_column_override_exact_enum() -> anyhow::Result<()> {
172180

173181
assert_eq!(record.color, MyEnum::Red);
174182

183+
let record = sqlx::query!("select * from (select 2 as `color: MyCEnum`) records")
184+
.fetch_one(&mut conn)
185+
.await?;
186+
187+
assert_eq!(record.color, MyCEnum::Blue);
188+
175189
Ok(())
176190
}
177191

178-
// we don't emit bind parameter typechecks for MySQL so testing the overrides is redundant
192+
// we don't emit bind parameter type-checks for MySQL so testing the overrides is redundant

0 commit comments

Comments
 (0)