diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/ASTBuilder.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/ASTBuilder.java index 98723a3..276ce89 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/ASTBuilder.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/ASTBuilder.java @@ -136,6 +136,10 @@ static ASTNode selectExpr(ASTNode expr, String alias) { } static ASTNode literal(RexLiteral literal) { + return literal(literal, false); + } + + static ASTNode literal(RexLiteral literal, boolean useTypeQualInLiteral) { Object val = null; int type = 0; SqlTypeName sqlType = literal.getType().getSqlTypeName(); @@ -147,24 +151,44 @@ static ASTNode literal(RexLiteral literal) { type = HiveParser.BigintLiteral; break; case TINYINT: - val = literal.getValue3(); + if (useTypeQualInLiteral) { + val = literal.getValue3() + "Y"; + } else { + val = literal.getValue3(); + } type = HiveParser.TinyintLiteral; break; case SMALLINT: - val = literal.getValue3(); + if (useTypeQualInLiteral) { + val = literal.getValue3() + "S"; + } else { + val = literal.getValue3(); + } type = HiveParser.SmallintLiteral; break; case INTEGER: case BIGINT: - val = literal.getValue3(); + if (useTypeQualInLiteral) { + val = literal.getValue3() + "L"; + } else { + val = literal.getValue3(); + } type = HiveParser.BigintLiteral; break; case DOUBLE: - val = literal.getValue3() + "D"; + if (useTypeQualInLiteral) { + val = literal.getValue3() + "D"; + } else { + val = literal.getValue3(); + } type = HiveParser.Number; break; case DECIMAL: - val = literal.getValue3() + "BD"; + if (useTypeQualInLiteral) { + val = literal.getValue3() + "BD"; + } else { + val = literal.getValue3(); + } type = HiveParser.DecimalLiteral; break; case FLOAT: diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/ASTConverter.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/ASTConverter.java index f5a704f..0428263 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/ASTConverter.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/ASTConverter.java @@ -149,8 +149,9 @@ private ASTNode convert() { int i = 0; for (RexNode r : select.getChildExps()) { - ASTNode selectExpr = ASTBuilder.selectExpr(r.accept(new RexVisitor(schema)), select - .getRowType().getFieldNames().get(i++)); + ASTNode selectExpr = ASTBuilder.selectExpr(r.accept( + new RexVisitor(schema, r instanceof RexLiteral)), + select.getRowType().getFieldNames().get(i++)); b.add(selectExpr); } } @@ -329,10 +330,16 @@ public void visit(RelNode node, int ordinal, RelNode parent) { static class RexVisitor extends RexVisitorImpl { private final Schema schema; + private boolean useTypeQualInLiteral; protected RexVisitor(Schema schema) { + this(schema, false); + } + + protected RexVisitor(Schema schema, boolean useTypeQualInLiteral) { super(true); this.schema = schema; + this.useTypeQualInLiteral = useTypeQualInLiteral; } @Override @@ -357,7 +364,7 @@ public ASTNode visitInputRef(RexInputRef inputRef) { @Override public ASTNode visitLiteral(RexLiteral literal) { - return ASTBuilder.literal(literal); + return ASTBuilder.literal(literal, useTypeQualInLiteral); } private ASTNode getPSpecAST(RexWindow window) { diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/RexNodeConverter.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/RexNodeConverter.java index ec85603..7b97eca 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/RexNodeConverter.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/RexNodeConverter.java @@ -314,7 +314,7 @@ protected RexNode convert(ExprNodeConstantDesc literal) throws OptiqSemanticExce optiqLiteral = rexBuilder.makeBinaryLiteral(bs); break; case SHORT: - optiqLiteral = rexBuilder.makeExactLiteral(new BigDecimal((Short) value)); + optiqLiteral = rexBuilder.makeExactLiteral(new BigDecimal((Short) value), optiqDataType); break; case INT: optiqLiteral = rexBuilder.makeExactLiteral(new BigDecimal((Integer) value));