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 42e8120..c9724d6 100644 --- ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java +++ ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java @@ -2932,6 +2932,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..0288184 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 '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 e053ebf..74a39cb 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 c267ad5..69befc7 100644 --- ql/src/java/org/apache/hadoop/hive/ql/parse/TypeCheckProcFactory.java +++ ql/src/java/org/apache/hadoop/hive/ql/parse/TypeCheckProcFactory.java @@ -137,7 +137,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 + "%|" @@ -238,6 +239,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("D")) { + // Literal decimal + return new ExprNodeConstantDesc(TypeInfoFactory.decimalTypeInfo, + expr.getText().substring(0, expr.getText().length() - 1)); } 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..d05c48a --- /dev/null +++ ql/src/test/queries/clientpositive/literal_decimal.q @@ -0,0 +1,3 @@ +EXPLAIN SELECT -1D, 0D, 1D, 3.14D, -3.14D, 99999999999999999D, 99999999999999999.9999999999999D, 1E-99D, 1E99D FROM src LIMIT 1; + +SELECT -1D, 0D, 1D, 3.14D, -3.14D, 99999999999999999D, 99999999999999999.9999999999999D, 1E-99D, 1E99D 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..2d130a3 --- /dev/null +++ ql/src/test/results/clientpositive/literal_decimal.q.out @@ -0,0 +1,61 @@ +PREHOOK: query: EXPLAIN SELECT -1D, 0D, 1D, 3.14D, -3.14D, 99999999999999999D, 99999999999999999.9999999999999D, 1E-99D, 1E99D FROM src LIMIT 1 +PREHOOK: type: QUERY +POSTHOOK: query: EXPLAIN SELECT -1D, 0D, 1D, 3.14D, -3.14D, 99999999999999999D, 99999999999999999.9999999999999D, 1E-99D, 1E99D 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 (- 1D)) (TOK_SELEXPR 0D) (TOK_SELEXPR 1D) (TOK_SELEXPR 3.14D) (TOK_SELEXPR (- 3.14D)) (TOK_SELEXPR 99999999999999999D) (TOK_SELEXPR 99999999999999999.9999999999999D) (TOK_SELEXPR 1E-99D) (TOK_SELEXPR 1E99D)) (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 -1D, 0D, 1D, 3.14D, -3.14D, 99999999999999999D, 99999999999999999.9999999999999D, 1E-99D, 1E99D FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +#### A masked pattern was here #### +POSTHOOK: query: SELECT -1D, 0D, 1D, 3.14D, -3.14D, 99999999999999999D, 99999999999999999.9999999999999D, 1E-99D, 1E99D 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