You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by da...@apache.org on 2019/02/22 17:42:06 UTC
[hive] branch master updated: HIVE-21308: Negative forms of
variables are not supported in HPL/SQL (Baoning He, reviewed by Daniel Dai)
This is an automated email from the ASF dual-hosted git repository.
daijy pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hive.git
The following commit(s) were added to refs/heads/master by this push:
new 49fe5fc HIVE-21308: Negative forms of variables are not supported in HPL/SQL (Baoning He, reviewed by Daniel Dai)
49fe5fc is described below
commit 49fe5fc50a97c9fbd08c74aa4ee6e7e30fe22ec8
Author: Daniel Dai <da...@gmail.com>
AuthorDate: Fri Feb 22 09:41:43 2019 -0800
HIVE-21308: Negative forms of variables are not supported in HPL/SQL (Baoning He, reviewed by Daniel Dai)
---
.../main/antlr4/org/apache/hive/hplsql/Hplsql.g4 | 2 +-
.../src/main/java/org/apache/hive/hplsql/Exec.java | 20 +++++++++++++++++---
.../src/main/java/org/apache/hive/hplsql/Var.java | 22 ++++++++++++++++++++--
hplsql/src/test/queries/local/declare2.sql | 9 +++++++++
hplsql/src/test/results/local/declare2.out.txt | 10 +++++++++-
5 files changed, 56 insertions(+), 7 deletions(-)
diff --git a/hplsql/src/main/antlr4/org/apache/hive/hplsql/Hplsql.g4 b/hplsql/src/main/antlr4/org/apache/hive/hplsql/Hplsql.g4
index 77c2e2c..d25e8c5 100644
--- a/hplsql/src/main/antlr4/org/apache/hive/hplsql/Hplsql.g4
+++ b/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 a/hplsql/src/main/java/org/apache/hive/hplsql/Exec.java b/hplsql/src/main/java/org/apache/hive/hplsql/Exec.java
index 9e27ba1..47f5cef 100644
--- a/hplsql/src/main/java/org/apache/hive/hplsql/Exec.java
+++ b/hplsql/src/main/java/org/apache/hive/hplsql/Exec.java
@@ -2129,12 +2129,26 @@ public class Exec extends HplsqlBaseVisitor<Integer> {
* 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 a/hplsql/src/main/java/org/apache/hive/hplsql/Var.java b/hplsql/src/main/java/org/apache/hive/hplsql/Var.java
index a117cb6..06b0e9b 100644
--- a/hplsql/src/main/java/org/apache/hive/hplsql/Var.java
+++ b/hplsql/src/main/java/org/apache/hive/hplsql/Var.java
@@ -552,13 +552,31 @@ public class Var {
}
/**
- * 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 a/hplsql/src/test/queries/local/declare2.sql b/hplsql/src/test/queries/local/declare2.sql
index 992d09e..9622033 100644
--- a/hplsql/src/test/queries/local/declare2.sql
+++ b/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 a/hplsql/src/test/results/local/declare2.out.txt b/hplsql/src/test/results/local/declare2.out.txt
index e22ca78..6a0ac18 100644
--- a/hplsql/src/test/results/local/declare2.out.txt
+++ b/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