Index: ql/src/java/org/apache/hadoop/hive/ql/parse/Hive.g =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/parse/Hive.g +++ ql/src/java/org/apache/hadoop/hive/ql/parse/Hive.g @@ -1846,6 +1846,9 @@ : Number | StringLiteral + | BigintLiteral + | SmallintLiteral + | TinyintLiteral | charSetStringLiteral | booleanValue ; @@ -2400,6 +2403,21 @@ | '0' 'X' (HexDigit|Digit)+ ; +BigintLiteral + : + (Digit)+ 'L' + ; + +SmallintLiteral + : + (Digit)+ 'S' + ; + +TinyintLiteral + : + (Digit)+ 'Y' + ; + Number : (Digit)+ ( DOT (Digit)* (Exponent)? | Exponent)? Index: ql/src/java/org/apache/hadoop/hive/ql/parse/TypeCheckProcFactory.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/parse/TypeCheckProcFactory.java +++ ql/src/java/org/apache/hadoop/hive/ql/parse/TypeCheckProcFactory.java @@ -129,7 +129,10 @@ opRules.put(new RuleRegExp("R1", HiveParser.TOK_NULL + "%"), getNullExprProcessor()); - opRules.put(new RuleRegExp("R2", HiveParser.Number + "%"), + opRules.put(new RuleRegExp("R2", HiveParser.Number + "%|" + + HiveParser.TinyintLiteral + "%|" + + HiveParser.SmallintLiteral + "%|" + + HiveParser.BigintLiteral + "%"), getNumExprProcessor()); opRules .put(new RuleRegExp("R3", HiveParser.Identifier + "%|" @@ -217,9 +220,23 @@ // try to parse the expression in that order to ensure that the // most specific type is used for conversion. try { - v = Double.valueOf(expr.getText()); - v = Long.valueOf(expr.getText()); - v = Integer.valueOf(expr.getText()); + if (expr.getText().endsWith("L")) { + // Literal bigint. + v = Long.valueOf(expr.getText().substring( + 0, expr.getText().length() - 1)); + } else if (expr.getText().endsWith("S")) { + // Literal smallint. + v = Short.valueOf(expr.getText().substring( + 0, expr.getText().length() - 1)); + } else if (expr.getText().endsWith("Y")) { + // Literal tinyint. + v = Byte.valueOf(expr.getText().substring( + 0, expr.getText().length() - 1)); + } else { + v = Double.valueOf(expr.getText()); + v = Long.valueOf(expr.getText()); + v = Integer.valueOf(expr.getText()); + } } catch (NumberFormatException e) { // do nothing here, we will throw an exception in the following block } Index: ql/src/test/queries/clientpositive/literal_ints.q =================================================================== --- /dev/null +++ ql/src/test/queries/clientpositive/literal_ints.q @@ -0,0 +1,3 @@ +EXPLAIN SELECT 100, 100Y, 100S, 100L FROM src LIMIT 1; + +SELECT 100, 100Y, 100S, 100L FROM src LIMIT 1; Index: ql/src/test/results/clientpositive/literal_ints.q.out =================================================================== --- /dev/null +++ ql/src/test/results/clientpositive/literal_ints.q.out @@ -0,0 +1,51 @@ +PREHOOK: query: EXPLAIN SELECT 100, 100Y, 100S, 100L FROM src LIMIT 1 +PREHOOK: type: QUERY +POSTHOOK: query: EXPLAIN SELECT 100, 100Y, 100S, 100L 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 100) (TOK_SELEXPR 100Y) (TOK_SELEXPR 100S) (TOK_SELEXPR 100L)) (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: 100 + type: int + expr: 100 + type: tinyint + expr: 100 + type: smallint + expr: 100 + type: bigint + outputColumnNames: _col0, _col1, _col2, _col3 + 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 100, 100Y, 100S, 100L FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: file:/var/folders/71/h_j6fpg10r33hvx1lcxlgttcw61_4s/T/jonchang/hive_2011-10-21_11-16-07_740_3692263834720831080/-mr-10000 +POSTHOOK: query: SELECT 100, 100Y, 100S, 100L FROM src LIMIT 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: file:/var/folders/71/h_j6fpg10r33hvx1lcxlgttcw61_4s/T/jonchang/hive_2011-10-21_11-16-07_740_3692263834720831080/-mr-10000 +100 100 100 100