From 8bf6572e9e05bb20488773acb11a245b507bae11 Mon Sep 17 00:00:00 2001 From: JeanArhancet Date: Fri, 13 Dec 2024 02:05:31 +0100 Subject: [PATCH] feat: support unary positive --- core/translate/expr.rs | 24 +++++++++++++++++++----- testing/agg-functions.test | 11 +++++++++-- testing/scalar-functions.test | 2 +- 3 files changed, 29 insertions(+), 8 deletions(-) diff --git a/core/translate/expr.rs b/core/translate/expr.rs index be12a8f41..8f4de5c13 100644 --- a/core/translate/expr.rs +++ b/core/translate/expr.rs @@ -1665,23 +1665,37 @@ pub fn translate_expr( ast::Expr::Raise(_, _) => todo!(), ast::Expr::Subquery(_) => todo!(), ast::Expr::Unary(op, expr) => match (op, expr.as_ref()) { - (UnaryOperator::Negative, ast::Expr::Literal(ast::Literal::Numeric(numeric_value))) => { + ( + UnaryOperator::Negative | UnaryOperator::Positive, + ast::Expr::Literal(ast::Literal::Numeric(numeric_value)), + ) => { let maybe_int = numeric_value.parse::(); + let multiplier = if let UnaryOperator::Negative = op { + -1 + } else { + 1 + }; if let Ok(value) = maybe_int { program.emit_insn(Insn::Integer { - value: -value, + value: value * multiplier, dest: target_register, }); } else { program.emit_insn(Insn::Real { - value: -numeric_value.parse::()?, + value: multiplier as f64 * numeric_value.parse::()?, dest: target_register, }); } program.mark_last_insn_constant(); Ok(target_register) } - (UnaryOperator::Negative, _) => { + (UnaryOperator::Negative | UnaryOperator::Positive, _) => { + let value = if let UnaryOperator::Negative = op { + -1 + } else { + 1 + }; + let reg = program.alloc_register(); translate_expr( program, @@ -1692,7 +1706,7 @@ pub fn translate_expr( )?; let zero_reg = program.alloc_register(); program.emit_insn(Insn::Integer { - value: -1, + value, dest: zero_reg, }); program.mark_last_insn_constant(); diff --git a/testing/agg-functions.test b/testing/agg-functions.test index e5594efa5..d06176271 100755 --- a/testing/agg-functions.test +++ b/testing/agg-functions.test @@ -75,11 +75,18 @@ do_execsql_test select-string-agg-with-column-delimiter { SELECT string_agg(name, id) FROM products; } {hat2cap3shirt4sweater5sweatshirt6shorts7jeans8sneakers9boots10coat11accessories} -do_execsql_test select-agg-unary { +do_execsql_test select-agg-unary-negative { SELECT -max(age) FROM users; } {-100} -do_execsql_test select-agg-binary-unary { +do_execsql_test select-agg-unary-positive { + SELECT +max(age) FROM users; +} {100} + +do_execsql_test select-agg-binary-unary-negative { SELECT min(age) + -max(age) FROM users; } {-99} +do_execsql_test select-agg-binary-unary-positive { + SELECT min(age) + +max(age) FROM users; +} {101} diff --git a/testing/scalar-functions.test b/testing/scalar-functions.test index 80878cba8..f7af9843a 100755 --- a/testing/scalar-functions.test +++ b/testing/scalar-functions.test @@ -400,7 +400,7 @@ do_execsql_test octet-length-date-binary-expr { } {1} do_execsql_test min-number { - select min(-10,2,3) + select min(-10,2,3,+4) } {-10} do_execsql_test min-str {