Skip to content

Commit 63f5e6e

Browse files
committed
fix issue #325: defaults with negative values
`default!(i32, -1)` now works correctly. The `-` causes syn to emit a `UnaryExpr` with a `Neg` op value.
1 parent a4c6308 commit 63f5e6e

File tree

2 files changed

+34
-0
lines changed

2 files changed

+34
-0
lines changed

pgx-tests/src/tests/default_arg_value_tests.rs

+12
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@
33

44
use pgx::*;
55

6+
#[pg_extern]
7+
fn negative_default_argument(i: default!(i32, -1)) -> i32 {
8+
i
9+
}
10+
611
#[pg_extern]
712
fn default_argument(a: default!(i32, 99)) -> i32 {
813
a
@@ -27,6 +32,13 @@ mod tests {
2732
#[test]
2833
fn make_idea_happy() {}
2934

35+
#[pg_test]
36+
fn test_negative_default_argument() {
37+
let result = Spi::get_one::<i32>("SELECT negative_default_argument();")
38+
.expect("didn't get SPI result");
39+
assert_eq!(result, -1);
40+
}
41+
3042
#[pg_test]
3143
fn test_default_argument() {
3244
let result =

pgx-utils/src/sql_entity_graph/pg_extern/argument.rs

+22
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,28 @@ fn handle_default(
192192
let value = def.value();
193193
Ok((true_ty, Some(value.to_string())))
194194
}
195+
syn::Expr::Unary(syn::ExprUnary {
196+
op: syn::UnOp::Neg(_),
197+
ref expr,
198+
..
199+
}) => match &**expr {
200+
syn::Expr::Lit(syn::ExprLit {
201+
lit: syn::Lit::Int(def),
202+
..
203+
}) => {
204+
let value = def.base10_digits();
205+
Ok((true_ty, Some("-".to_owned() + value)))
206+
}
207+
_ => {
208+
return Err(syn::Error::new(
209+
Span::call_site(),
210+
format!(
211+
"Unrecognized UnaryExpr in `default!()` macro, got: {:?}",
212+
out.expr
213+
),
214+
))
215+
}
216+
},
195217
syn::Expr::Type(syn::ExprType { ref ty, .. }) => match ty.deref() {
196218
syn::Type::Path(syn::TypePath {
197219
path: syn::Path { segments, .. },

0 commit comments

Comments
 (0)