diff --git ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java index 1218caf..3defc68 100644 --- ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java +++ ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java @@ -2989,6 +2989,9 @@ private boolean isConstant(ASTNode node) { case HiveParser.TinyintLiteral: result = true; break; + case HiveParser.DecimalLiteral: + result = true; + break; case HiveParser.CharSetName: result = true; break; diff --git ql/src/java/org/apache/hadoop/hive/ql/parse/HiveLexer.g ql/src/java/org/apache/hadoop/hive/ql/parse/HiveLexer.g index 2271627..ad0b3b2 100644 --- ql/src/java/org/apache/hadoop/hive/ql/parse/HiveLexer.g +++ ql/src/java/org/apache/hadoop/hive/ql/parse/HiveLexer.g @@ -345,6 +345,11 @@ TinyintLiteral (Digit)+ 'Y' ; +DecimalLiteral + : + Number 'B' 'D' + ; + ByteLengthLiteral : (Digit)+ ('b' | 'B' | 'k' | 'K' | 'm' | 'M' | 'g' | 'G') diff --git ql/src/java/org/apache/hadoop/hive/ql/parse/IdentifiersParser.g ql/src/java/org/apache/hadoop/hive/ql/parse/IdentifiersParser.g index fe35d2e..eb34c0e 100644 --- ql/src/java/org/apache/hadoop/hive/ql/parse/IdentifiersParser.g +++ ql/src/java/org/apache/hadoop/hive/ql/parse/IdentifiersParser.g @@ -216,6 +216,7 @@ constant | BigintLiteral | SmallintLiteral | TinyintLiteral + | DecimalLiteral | charSetStringLiteral | booleanValue ; diff --git ql/src/java/org/apache/hadoop/hive/ql/parse/TypeCheckProcFactory.java ql/src/java/org/apache/hadoop/hive/ql/parse/TypeCheckProcFactory.java index cecc621..80b42ba 100644 --- ql/src/java/org/apache/hadoop/hive/ql/parse/TypeCheckProcFactory.java +++ ql/src/java/org/apache/hadoop/hive/ql/parse/TypeCheckProcFactory.java @@ -138,7 +138,8 @@ public static ExprNodeDesc processGByExpr(Node nd, Object procCtx) opRules.put(new RuleRegExp("R2", HiveParser.Number + "%|" + HiveParser.TinyintLiteral + "%|" + HiveParser.SmallintLiteral + "%|" + - HiveParser.BigintLiteral + "%"), + HiveParser.BigintLiteral + "%|" + + HiveParser.DecimalLiteral + "%"), getNumExprProcessor()); opRules .put(new RuleRegExp("R3", HiveParser.Identifier + "%|" @@ -252,6 +253,10 @@ public Object process(Node nd, Stack stack, NodeProcessorCtx procCtx, // Literal tinyint. v = Byte.valueOf(expr.getText().substring( 0, expr.getText().length() - 1)); + } else if (expr.getText().endsWith("BD")) { + // Literal decimal + return new ExprNodeConstantDesc(TypeInfoFactory.decimalTypeInfo, + expr.getText().substring(0, expr.getText().length() - 2)); } else { v = Double.valueOf(expr.getText()); v = Long.valueOf(expr.getText()); diff --git ql/src/test/queries/clientpositive/literal_decimal.q ql/src/test/queries/clientpositive/literal_decimal.q new file mode 100644 index 0000000..a6ad4b8 --- /dev/null +++ ql/src/test/queries/clientpositive/literal_decimal.q @@ -0,0 +1,3 @@ +EXPLAIN SELECT -1BD, 0BD, 1BD, 3.14BD, -3.14BD, 99999999999999999BD, 99999999999999999.9999999999999BD, 1E-99BD, 1E99BD FROM src LIMIT 1; + +SELECT -1BD, 0BD, 1BD, 3.14BD, -3.14BD, 99999999999999999BD, 99999999999999999.9999999999999BD, 1E-99BD, 1E99BD FROM src LIMIT 1; diff --git ql/src/test/results/clientpositive/literal_decimal.q.out ql/src/test/results/clientpositive/literal_decimal.q.out new file mode 100644 index 0000000..dd13922 --- /dev/null +++ ql/src/test/results/clientpositive/literal_decimal.q.out @@ -0,0 +1,61 @@ +PREHOOK: query: EXPLAIN SELECT -1BD, 0BD, 1BD, 3.14BD, -3.14BD, 99999999999999999BD, 99999999999999999.9999999999999BD, 1E-99BD, 1E99BD FROM src LIMIT 1 +PREHOOK: type: QUERY +POSTHOOK: query: EXPLAIN SELECT -1BD, 0BD, 1BD, 3.14BD, -3.14BD, 99999999999999999BD, 99999999999999999.9999999999999BD, 1E-99BD, 1E99BD FROM src LIMIT 1 +POSTHOOK: type: QUERY +ABSTRACT SYNTAX TREE: + (TOK_QUERY (TOK_FROM (TOK_TABREF (TOK_TABNAME src))) (TOK_INSERT (TOK_DESTINATION (TOK_DIR TOK_TMP_FILE)) (TOK_SELECT (TOK_SELEXPR (- 1BD)) (TOK_SELEXPR 0BD) (TOK_SELEXPR 1BD) (TOK_SELEXPR 3.14BD) (TOK_SELEXPR (- 3.14BD)) (TOK_SELEXPR 99999999999999999BD) (TOK_SELEXPR 99999999999999999.9999999999999BD) (TOK_SELEXPR 1E-99BD) (TOK_SELEXPR 1E99BD)) (TOK_LIMIT 1))) + +STAGE DEPENDENCIES: + Stage-1 is a root stage + Stage-0 is a root stage + +STAGE PLANS: + Stage: Stage-1 + Map Reduce + Alias -> Map Operator Tree: + src + TableScan + alias: src + Select Operator + expressions: + expr: (- 1) + type: decimal + expr: 0 + type: decimal + expr: 1 + type: decimal + expr: 3.14 + type: decimal + expr: (- 3.14) + type: decimal + expr: 99999999999999999 + type: decimal + expr: 99999999999999999.9999999999999 + type: decimal + expr: 1E-99 + type: decimal + expr: 1E99 + type: decimal + outputColumnNames: _col0, _col1, _col2, _col3, _col4, _col5, _col6, _col7, _col8 + Limit + File Output Operator + compressed: false + GlobalTableId: 0 + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + + Stage: Stage-0 + Fetch Operator + limit: 1 + + +PREHOOK: query: SELECT -1BD, 0BD, 1BD, 3.14BD, -3.14BD, 99999999999999999BD, 99999999999999999.9999999999999BD, 1E-99BD, 1E99BD FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +#### A masked pattern was here #### +POSTHOOK: query: SELECT -1BD, 0BD, 1BD, 3.14BD, -3.14BD, 99999999999999999BD, 99999999999999999.9999999999999BD, 1E-99BD, 1E99BD FROM src LIMIT 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +#### A masked pattern was here #### +-1 0 1 3.14 -3.14 99999999999999999 99999999999999999.9999999999999 1E-99 1E+99 diff --git serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/JavaBigDecimalObjectInspector.java serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/JavaBigDecimalObjectInspector.java index 382d7e8..5070a0a 100644 --- serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/JavaBigDecimalObjectInspector.java +++ serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/JavaBigDecimalObjectInspector.java @@ -32,7 +32,14 @@ protected JavaBigDecimalObjectInspector() { @Override public BigDecimalWritable getPrimitiveWritableObject(Object o) { - return o == null ? null : new BigDecimalWritable((BigDecimal) o); + if (o == null) { + return null; + } + + if (o instanceof String) { + o = new BigDecimal((String)o); + } + return new BigDecimalWritable((BigDecimal) o); } @Override