You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lens.apache.org by pr...@apache.org on 2015/04/28 10:43:03 UTC
[2/2] incubator-lens git commit: LENS-433: Fix HQLParser issues
regarding cast statement and types like DOLLAR, DIGIT
LENS-433: Fix HQLParser issues regarding cast statement and types like DOLLAR, DIGIT
Project: http://git-wip-us.apache.org/repos/asf/incubator-lens/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-lens/commit/32fb7589
Tree: http://git-wip-us.apache.org/repos/asf/incubator-lens/tree/32fb7589
Diff: http://git-wip-us.apache.org/repos/asf/incubator-lens/diff/32fb7589
Branch: refs/heads/master
Commit: 32fb758984f3f249e8322cf9b2758fbc1f1088c5
Parents: aca5ced
Author: Rajat Khandelwal <ra...@gmail.com>
Authored: Tue Apr 28 14:12:51 2015 +0530
Committer: Rajat Khandelwal <ra...@gmail.com>
Committed: Tue Apr 28 14:12:51 2015 +0530
----------------------------------------------------------------------
.../org/apache/lens/cube/parse/HQLParser.java | 114 ++++++++++++++++---
.../apache/lens/cube/parse/TestHQLParser.java | 28 +++++
2 files changed, 127 insertions(+), 15 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/32fb7589/lens-cube/src/main/java/org/apache/lens/cube/parse/HQLParser.java
----------------------------------------------------------------------
diff --git a/lens-cube/src/main/java/org/apache/lens/cube/parse/HQLParser.java b/lens-cube/src/main/java/org/apache/lens/cube/parse/HQLParser.java
index 25e6353..11eb345 100644
--- a/lens-cube/src/main/java/org/apache/lens/cube/parse/HQLParser.java
+++ b/lens-cube/src/main/java/org/apache/lens/cube/parse/HQLParser.java
@@ -19,7 +19,6 @@
package org.apache.lens.cube.parse;
import static org.apache.hadoop.hive.ql.parse.HiveParser.*;
-import static org.apache.hadoop.hive.ql.parse.HiveParser.Number;
import java.io.IOException;
import java.lang.reflect.Field;
@@ -67,6 +66,7 @@ public final class HQLParser {
public static final Set<Integer> BINARY_OPERATORS;
public static final Set<Integer> ARITHMETIC_OPERATORS;
public static final Set<Integer> UNARY_OPERATORS;
+ public static final Set<Integer> PRIMITIVE_TYPES;
static {
HashSet<Integer> ops = new HashSet<Integer>();
@@ -105,6 +105,24 @@ public final class HQLParser {
unaryOps.add(KW_NOT);
unaryOps.add(TILDE);
UNARY_OPERATORS = Collections.unmodifiableSet(unaryOps);
+
+ HashSet<Integer> primitiveTypes = new HashSet<Integer>();
+ primitiveTypes.add(TOK_TINYINT);
+ primitiveTypes.add(TOK_SMALLINT);
+ primitiveTypes.add(TOK_INT);
+ primitiveTypes.add(TOK_BIGINT);
+ primitiveTypes.add(TOK_BOOLEAN);
+ primitiveTypes.add(TOK_FLOAT);
+ primitiveTypes.add(TOK_DOUBLE);
+ primitiveTypes.add(TOK_DATE);
+ primitiveTypes.add(TOK_DATETIME);
+ primitiveTypes.add(TOK_TIMESTAMP);
+ primitiveTypes.add(TOK_STRING);
+ primitiveTypes.add(TOK_BINARY);
+ primitiveTypes.add(TOK_DECIMAL);
+ primitiveTypes.add(TOK_VARCHAR);
+ primitiveTypes.add(TOK_CHAR);
+ PRIMITIVE_TYPES = Collections.unmodifiableSet(primitiveTypes);
}
public static boolean isArithmeticOp(int tokenType) {
@@ -382,7 +400,53 @@ public final class HQLParser {
buf.append("[");
toInfixString((ASTNode) root.getChild(1), buf);
buf.append("]");
-
+ } else if (PRIMITIVE_TYPES.contains(rootType)) {
+ if (rootType == TOK_TINYINT) {
+ buf.append("tinyint");
+ } else if (rootType == TOK_SMALLINT) {
+ buf.append("smallint");
+ } else if (rootType == TOK_INT) {
+ buf.append("int");
+ } else if (rootType == TOK_BIGINT) {
+ buf.append("bigint");
+ } else if (rootType == TOK_BOOLEAN) {
+ buf.append("boolean");
+ } else if (rootType == TOK_FLOAT) {
+ buf.append("float");
+ } else if (rootType == TOK_DOUBLE) {
+ buf.append("double");
+ } else if (rootType == TOK_DATE) {
+ buf.append("date");
+ } else if (rootType == TOK_DATETIME) {
+ buf.append("datetime");
+ } else if (rootType == TOK_TIMESTAMP) {
+ buf.append("timestamp");
+ } else if (rootType == TOK_STRING) {
+ buf.append("string");
+ } else if (rootType == TOK_BINARY) {
+ buf.append("binary");
+ } else if (rootType == TOK_DECIMAL) {
+ buf.append("decimal");
+ if (root.getChildCount() >= 1) {
+ buf.append("(").append(root.getChild(0).getText());
+ if (root.getChildCount() == 2) {
+ buf.append(",").append(root.getChild(1).getText());
+ }
+ buf.append(")");
+ }
+ } else if (rootType == TOK_VARCHAR) {
+ buf.append("varchar");
+ if (root.getChildCount() >= 1) {
+ buf.append("(").append(root.getChild(0).getText()).append(")");
+ }
+ } else if (rootType == TOK_CHAR) {
+ buf.append("char");
+ if (root.getChildCount() >= 1) {
+ buf.append("(").append(root.getChild(0).getText()).append(")");
+ }
+ } else {
+ buf.append(rootText);
+ }
} else if (TOK_FUNCTION == root.getToken().getType()) {
// Handle UDFs, conditional operators.
functionString(root, buf);
@@ -456,8 +520,13 @@ public final class HQLParser {
}
} else {
- for (int i = 0; i < root.getChildCount(); i++) {
- toInfixString((ASTNode) root.getChild(i), buf);
+ if (root.getChildCount() > 0) {
+ for (int i = 0; i < root.getChildCount(); i++) {
+ toInfixString((ASTNode) root.getChild(i), buf);
+ }
+ } else {
+ // for other types which are not handled above
+ buf.append(rootText);
}
}
}
@@ -566,20 +635,35 @@ public final class HQLParser {
}
buf.append(")");
-
+ } else if (findNodeByPath(root, KW_CAST) != null) {
+ buf.append("cast");
+ toInfixString((ASTNode) root.getChild(1), buf);
+ buf.append(" as ");
+ toInfixString((ASTNode) root.getChild(0), buf);
} else {
- // Normal UDF
- String fname = ((ASTNode) root.getChild(0)).getText();
- // Function name
- buf.append(fname.toLowerCase()).append("(");
- // Arguments separated by comma
- for (int i = 1; i < root.getChildCount(); i++) {
- toInfixString((ASTNode) root.getChild(i), buf);
- if (i != root.getChildCount() - 1) {
- buf.append(", ");
+ int rootType = ((ASTNode) root.getChild(0)).getToken().getType();
+ if (PRIMITIVE_TYPES.contains(rootType)) {
+ // cast expression maps to the following ast
+ // KW_CAST LPAREN expression KW_AS primitiveType RPAREN -> ^(TOK_FUNCTION primitiveType expression)
+ buf.append("cast(");
+ toInfixString((ASTNode) root.getChild(1), buf);
+ buf.append(" as ");
+ toInfixString((ASTNode) root.getChild(0), buf);
+ buf.append(")");
+ } else {
+ // Normal UDF
+ String fname = ((ASTNode) root.getChild(0)).getText();
+ // Function name
+ buf.append(fname.toLowerCase()).append("(");
+ // Arguments separated by comma
+ for (int i = 1; i < root.getChildCount(); i++) {
+ toInfixString((ASTNode) root.getChild(i), buf);
+ if (i != root.getChildCount() - 1) {
+ buf.append(", ");
+ }
}
+ buf.append(")");
}
- buf.append(")");
}
}
http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/32fb7589/lens-cube/src/test/java/org/apache/lens/cube/parse/TestHQLParser.java
----------------------------------------------------------------------
diff --git a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestHQLParser.java b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestHQLParser.java
index bb332dc..8761c51 100644
--- a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestHQLParser.java
+++ b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestHQLParser.java
@@ -24,6 +24,7 @@ import static org.apache.hadoop.hive.ql.parse.HiveParser.*;
import org.apache.hadoop.hive.conf.HiveConf;
import org.apache.hadoop.hive.ql.parse.ASTNode;
import org.apache.hadoop.hive.ql.parse.HiveParser;
+import org.apache.hadoop.hive.ql.parse.ParseException;
import org.testng.Assert;
import org.testng.annotations.Test;
@@ -313,4 +314,31 @@ public class TestHQLParser {
Assert.assertFalse(HQLParser.equalsAST(literalExpr1, literalExpr4));
}
+ @Test
+ public void testCastStatement() throws ParseException {
+ String castSelect = "cast(( a + b ) as tinyint), cast(( a + b ) as smallint), cast(( a + b ) as int),"
+ + " cast(( a + b ) as bigint), cast(( a + b ) as float), cast(( a + b ) as double),"
+ + " cast(( a + b ) as boolean), cast( a as date), cast( b as datetime), cast( a as timestamp),"
+ + " cast(( a + b ) as string), cast(( a + b ) as binary), cast(( a + b ) as decimal(3,6)),"
+ + " cast(( a + b ) as decimal(5)), cast(( a + b ) as varchar(10)), cast(( a + b ) as char(20)),"
+ + " cast( '17.29' as decimal(4,2))";
+ castSelect = "3.1415926BD";
+ String query = "select " + castSelect + " from table limit 1";
+ ASTNode tree = HQLParser.parseHQL(query, conf);
+ System.out.println(tree.dump());
+ ASTNode selectAST = HQLParser.findNodeByPath(tree, TOK_INSERT, TOK_SELECT);
+ String genQuery = HQLParser.getString(selectAST);
+ Assert.assertEquals(genQuery, castSelect);
+ }
+
+ @Test
+ public void testOtherStatements() throws ParseException {
+ String select = "3.1415926BD";
+ String query = "select " + select + " from table limit 1";
+ ASTNode tree = HQLParser.parseHQL(query, conf);
+ ASTNode selectAST = HQLParser.findNodeByPath(tree, TOK_INSERT, TOK_SELECT);
+ String genQuery = HQLParser.getString(selectAST);
+ Assert.assertEquals(genQuery, select);
+ }
+
}