diff --git a/core/translate/expr.rs b/core/translate/expr.rs index 9e003ba37..a214613db 100644 --- a/core/translate/expr.rs +++ b/core/translate/expr.rs @@ -2040,19 +2040,14 @@ pub fn translate_expr( ast::Expr::Raise(_, _) => todo!(), ast::Expr::Subquery(_) => todo!(), ast::Expr::Unary(op, expr) => match (op, expr.as_ref()) { - ( - UnaryOperator::Negative | UnaryOperator::Positive, - ast::Expr::Literal(ast::Literal::Numeric(numeric_value)), - ) => { - let multiplier = if let UnaryOperator::Negative = op { - -1 - } else { - 1 - }; - + (UnaryOperator::Positive, expr) => { + translate_expr(program, referenced_tables, expr, target_register, resolver) + } + (UnaryOperator::Negative, ast::Expr::Literal(ast::Literal::Numeric(numeric_value))) => { // Special case: if we're negating "9223372036854775808", this is exactly MIN_INT64 - // If we don't do this -1 * 9223372036854775808 will overflow and parse will fail and trigger conversion to Real. - if multiplier == -1 && numeric_value == "9223372036854775808" { + // If we don't do this -1 * 9223372036854775808 will overflow and parse will fail + // and trigger conversion to Real. + if numeric_value == "9223372036854775808" { program.emit_insn(Insn::Integer { value: i64::MIN, dest: target_register, @@ -2061,25 +2056,21 @@ pub fn translate_expr( let maybe_int = numeric_value.parse::(); if let Ok(value) = maybe_int { program.emit_insn(Insn::Integer { - value: value * multiplier, + value: value * -1, dest: target_register, }); } else { let value = numeric_value.parse::()?; program.emit_insn(Insn::Real { - value: value * multiplier as f64, + value: value * -1 as f64, dest: target_register, }); } } Ok(target_register) } - (UnaryOperator::Negative | UnaryOperator::Positive, _) => { - let value = if let UnaryOperator::Negative = op { - -1 - } else { - 1 - }; + (UnaryOperator::Negative, _) => { + let value = -1; let reg = program.alloc_register(); translate_expr(program, referenced_tables, expr, reg, resolver)?; diff --git a/testing/math.test b/testing/math.test index 847f94f9a..e014483b2 100755 --- a/testing/math.test +++ b/testing/math.test @@ -1383,4 +1383,12 @@ do_execsql_test comp-blog-string { do_execsql_test comp-blog-blog { SELECT cast('0' as BLOB) = cast('0' as BLOB) -} { 1 } \ No newline at end of file +} { 1 } + +do_execsql_test unary-plus-noop-string { + SELECT +'000' +} { 000 } + +do_execsql_test unary-plus-noop-blob { + SELECT typeof(+x'00') = 'blob' +} { 1 }