diff --git hplsql/src/main/antlr4/org/apache/hive/hplsql/Hplsql.g4 hplsql/src/main/antlr4/org/apache/hive/hplsql/Hplsql.g4 index 77c2e2c419..d25e8c57df 100644 --- hplsql/src/main/antlr4/org/apache/hive/hplsql/Hplsql.g4 +++ hplsql/src/main/antlr4/org/apache/hive/hplsql/Hplsql.g4 @@ -1183,7 +1183,7 @@ timestamp_literal : // TIMESTAMP 'YYYY-MM-DD HH:MI:SS.FFF' ; ident : - (L_ID | non_reserved_words) ('.' (L_ID | non_reserved_words))* + '-'? (L_ID | non_reserved_words) ('.' (L_ID | non_reserved_words))* ; string : // String literal (single or double quoted) diff --git hplsql/src/main/java/org/apache/hive/hplsql/Exec.java hplsql/src/main/java/org/apache/hive/hplsql/Exec.java index 9e27ba1e4d..47f5cef7d9 100644 --- hplsql/src/main/java/org/apache/hive/hplsql/Exec.java +++ hplsql/src/main/java/org/apache/hive/hplsql/Exec.java @@ -2129,12 +2129,26 @@ public Integer visitLabel(HplsqlParser.LabelContext ctx) { * Identifier */ @Override - public Integer visitIdent(HplsqlParser.IdentContext ctx) { + public Integer visitIdent(HplsqlParser.IdentContext ctx) { + boolean hasSub = false; String ident = ctx.getText(); - Var var = findVariable(ident); + String actualIdent = ident; + if (ident.startsWith("-")) { + hasSub = true; + actualIdent = ident.substring(1, ident.length()); + } + + Var var = findVariable(actualIdent); if (var != null) { if (!exec.buildSql) { - exec.stackPush(var); + if (hasSub) { + Var var1 = new Var(var); + var1.negate(); + exec.stackPush(var1); + } + else { + exec.stackPush(var); + } } else { exec.stackPush(new Var(ident, Var.Type.STRING, var.toSqlString())); diff --git hplsql/src/main/java/org/apache/hive/hplsql/Var.java hplsql/src/main/java/org/apache/hive/hplsql/Var.java index a117cb6d79..06b0e9bb57 100644 --- hplsql/src/main/java/org/apache/hive/hplsql/Var.java +++ hplsql/src/main/java/org/apache/hive/hplsql/Var.java @@ -552,13 +552,31 @@ public boolean isTrue() { } /** - * Negate the boolean value + * Negate the value */ public void negate() { - if(type == Type.BOOL && value != null) { + if (value == null){ + return; + } + if (type == Type.BOOL) { boolean v = ((Boolean)value).booleanValue(); value = Boolean.valueOf(!v); } + else if (type == Type.DECIMAL) { + BigDecimal v = (BigDecimal)value; + value = v.negate(); + } + else if (type == Type.DOUBLE) { + Double v = (Double)value; + value = -v; + } + else if (type == Type.BIGINT) { + Long v = (Long)value; + value = -v; + } + else { + throw new NumberFormatException("invalid type " + type); + } } /** diff --git hplsql/src/test/queries/local/declare2.sql hplsql/src/test/queries/local/declare2.sql index 992d09ea10..96220338b8 100644 --- hplsql/src/test/queries/local/declare2.sql +++ hplsql/src/test/queries/local/declare2.sql @@ -11,3 +11,12 @@ declare begin null; end; + +declare + num1 int := 1; + num2 int := 2; +begin + print num1; + print -num1; + print -num1*2+num2; +end; \ No newline at end of file diff --git hplsql/src/test/results/local/declare2.out.txt hplsql/src/test/results/local/declare2.out.txt index e22ca78084..6a0ac18fe2 100644 --- hplsql/src/test/results/local/declare2.out.txt +++ hplsql/src/test/results/local/declare2.out.txt @@ -4,4 +4,12 @@ Ln:5 PRINT a Ln:6 PRINT 1 -Ln:10 DECLARE code char = 'a' \ No newline at end of file +Ln:10 DECLARE code char = 'a' +Ln:16 DECLARE num1 int = 1 +Ln:17 DECLARE num2 int = 2 +Ln:19 PRINT +1 +Ln:20 PRINT +-1 +Ln:21 PRINT +0 \ No newline at end of file