diff --git a/src/barabadb/query/executor.nim b/src/barabadb/query/executor.nim index 5288b07..bcba66e 100644 --- a/src/barabadb/query/executor.nim +++ b/src/barabadb/query/executor.nim @@ -651,6 +651,15 @@ proc evalExpr*(expr: IRExpr, row: Table[string, string], ctx: ExecutionContext = of irIsNotNull: let v = evalExpr(expr.unExpr, row) return if not isNull(v): "true" else: "false" + of irNeg: + let v = evalExpr(expr.unExpr, row) + try: + let f = -parseFloat(v) + let s = $f + if s.endsWith(".0"): + return s[0..^3] + return s + except: return "0" else: return "false" of irekExists: if ctx != nil: diff --git a/tests/test_all.nim b/tests/test_all.nim index 20e332d..498f228 100644 --- a/tests/test_all.nim +++ b/tests/test_all.nim @@ -2564,6 +2564,18 @@ suite "Parameterized queries": check r.success check r.rows.len >= 2 + test "Unary minus in SELECT expression": + let r = qexec.executeQuery(ctx, parse("SELECT -age AS neg_age FROM users WHERE id = 1")) + check r.success + check r.rows.len == 1 + check r.rows[0]["neg_age"] == "-30" + + test "Unary minus in WHERE condition": + let r = qexec.executeQuery(ctx, parse("SELECT name FROM users WHERE id = 2 AND -age = -25")) + check r.success + check r.rows.len == 1 + check r.rows[0]["name"] == "Bob" + # JOIN tests include "join_tests"