diff --git data/files/floatdouble.txt data/files/floatdouble.txt new file mode 100644 index 0000000..5148c65 --- /dev/null +++ data/files/floatdouble.txt @@ -0,0 +1,4 @@ +1 3.14 123.234 +2 2.50 345.678 +3 -1.74 -980345.12323 +4 0.0 -0.0 diff --git ql/src/java/org/apache/hadoop/hive/ql/parse/Hive.g ql/src/java/org/apache/hadoop/hive/ql/parse/Hive.g index eecd9e7..9575b05 100644 --- ql/src/java/org/apache/hadoop/hive/ql/parse/Hive.g +++ ql/src/java/org/apache/hadoop/hive/ql/parse/Hive.g @@ -1863,6 +1863,8 @@ constant | TinyintLiteral | charSetStringLiteral | booleanValue + | Float + | Double ; stringLiteralSequence @@ -2435,6 +2437,16 @@ TinyintLiteral (Digit)+ 'Y' ; +Float + : + Number 'F' | Number 'f' + ; + +Double + : + Number 'D' | Number 'd' + ; + Number : (Digit)+ ( DOT (Digit)* (Exponent)? | Exponent)? 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 59e55ae..87cb5ce 100644 --- ql/src/java/org/apache/hadoop/hive/ql/parse/TypeCheckProcFactory.java +++ ql/src/java/org/apache/hadoop/hive/ql/parse/TypeCheckProcFactory.java @@ -130,6 +130,8 @@ public final class TypeCheckProcFactory { opRules.put(new RuleRegExp("R1", HiveParser.TOK_NULL + "%"), getNullExprProcessor()); opRules.put(new RuleRegExp("R2", HiveParser.Number + "%|" + + HiveParser.Float + "%|" + + HiveParser.Double + "%|" + HiveParser.TinyintLiteral + "%|" + HiveParser.SmallintLiteral + "%|" + HiveParser.BigintLiteral + "%"), @@ -233,6 +235,16 @@ public final class TypeCheckProcFactory { // Literal tinyint. v = Byte.valueOf(expr.getText().substring( 0, expr.getText().length() - 1)); + } else if (expr.getText().endsWith("F") + | expr.getText().endsWith("f")) { + // Literal float. + v = Float.valueOf(expr.getText().substring( + 0, expr.getText().length() - 1)); + } else if (expr.getText().endsWith("D") + | expr.getText().endsWith("d")) { + // Literal double. + v = Double.valueOf(expr.getText().substring( + 0, expr.getText().length() - 1)); } else { v = Double.valueOf(expr.getText()); v = Long.valueOf(expr.getText()); diff --git ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFBaseCompare.java ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFBaseCompare.java index 3fb3879..aae1758 100644 --- ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFBaseCompare.java +++ ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFBaseCompare.java @@ -31,6 +31,8 @@ import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorConverters.C import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorUtils; import org.apache.hadoop.hive.serde2.objectinspector.primitive.BooleanObjectInspector; import org.apache.hadoop.hive.serde2.objectinspector.primitive.ByteObjectInspector; +import org.apache.hadoop.hive.serde2.objectinspector.primitive.DoubleObjectInspector; +import org.apache.hadoop.hive.serde2.objectinspector.primitive.FloatObjectInspector; import org.apache.hadoop.hive.serde2.objectinspector.primitive.IntObjectInspector; import org.apache.hadoop.hive.serde2.objectinspector.primitive.LongObjectInspector; import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory; @@ -50,7 +52,7 @@ public abstract class GenericUDFBaseCompare extends GenericUDF { // treated as special cases. // For other types, we reuse ObjectInspectorUtils.compare() COMPARE_STRING, COMPARE_TEXT, COMPARE_INT, COMPARE_LONG, COMPARE_BYTE, - COMPARE_BOOL, SAME_TYPE, NEED_CONVERT + COMPARE_BOOL, COMPARE_FLOAT, COMPARE_DOUBLE, SAME_TYPE, NEED_CONVERT } protected String opName; @@ -67,6 +69,8 @@ public abstract class GenericUDFBaseCompare extends GenericUDF { protected LongObjectInspector loi0, loi1; protected ByteObjectInspector byoi0, byoi1; protected BooleanObjectInspector boi0,boi1; + protected FloatObjectInspector foi0, foi1; + protected DoubleObjectInspector doi0, doi1; protected final BooleanWritable result = new BooleanWritable(); @Override @@ -129,7 +133,21 @@ public abstract class GenericUDFBaseCompare extends GenericUDF { compareType = CompareType.COMPARE_BOOL; boi0 = (BooleanObjectInspector) arguments[0]; boi1 = (BooleanObjectInspector) arguments[1]; - } else { + } else if (TypeInfoUtils.getTypeInfoFromObjectInspector(arguments[0]).equals( + TypeInfoFactory.floatTypeInfo) && + TypeInfoUtils.getTypeInfoFromObjectInspector(arguments[1]).equals( + TypeInfoFactory.floatTypeInfo)) { + compareType = CompareType.COMPARE_FLOAT; + foi0 = (FloatObjectInspector) arguments[0]; + foi1 = (FloatObjectInspector) arguments[1]; + } else if (TypeInfoUtils.getTypeInfoFromObjectInspector(arguments[0]).equals( + TypeInfoFactory.doubleTypeInfo) && + TypeInfoUtils.getTypeInfoFromObjectInspector(arguments[1]).equals( + TypeInfoFactory.doubleTypeInfo)) { + compareType = CompareType.COMPARE_DOUBLE; + doi0 = (DoubleObjectInspector) arguments[0]; + doi1 = (DoubleObjectInspector) arguments[1]; + } else { TypeInfo oiTypeInfo0 = TypeInfoUtils.getTypeInfoFromObjectInspector(arguments[0]); TypeInfo oiTypeInfo1 = TypeInfoUtils.getTypeInfoFromObjectInspector(arguments[1]); diff --git ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFOPEqual.java ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFOPEqual.java index dc4670e..bc487aa 100644 --- ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFOPEqual.java +++ ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFOPEqual.java @@ -61,6 +61,12 @@ public class GenericUDFOPEqual extends GenericUDFBaseCompare { case COMPARE_BOOL: result.set(boi0.get(o0) == boi1.get(o1)); break; + case COMPARE_FLOAT: + result.set(foi0.get(o0) == foi1.get(o1)); + break; + case COMPARE_DOUBLE: + result.set(doi0.get(o0) == doi1.get(o1)); + break; case COMPARE_STRING: result.set(soi0.getPrimitiveJavaObject(o0).equals( soi1.getPrimitiveJavaObject(o1))); diff --git ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFOPEqualOrGreaterThan.java ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFOPEqualOrGreaterThan.java index f44f353..7845c13 100644 --- ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFOPEqualOrGreaterThan.java +++ ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFOPEqualOrGreaterThan.java @@ -67,6 +67,12 @@ public class GenericUDFOPEqualOrGreaterThan extends GenericUDFBaseCompare { boolean b1 = boi1.get(o1); result.set(b0 || !b1); break; + case COMPARE_FLOAT: + result.set(foi0.get(o0) >= foi1.get(o1)); + break; + case COMPARE_DOUBLE: + result.set(doi0.get(o0) >= doi1.get(o1)); + break; case COMPARE_STRING: String s0, s1; s0 = soi0.getPrimitiveJavaObject(o0); diff --git ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFOPEqualOrLessThan.java ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFOPEqualOrLessThan.java index 7d74e82..d652d85 100644 --- ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFOPEqualOrLessThan.java +++ ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFOPEqualOrLessThan.java @@ -67,6 +67,12 @@ public class GenericUDFOPEqualOrLessThan extends GenericUDFBaseCompare { boolean b1 = boi1.get(o1); result.set(!b0 || b1); break; + case COMPARE_FLOAT: + result.set(foi0.get(o0) <= foi1.get(o1)); + break; + case COMPARE_DOUBLE: + result.set(doi0.get(o0) <= doi1.get(o1)); + break; case COMPARE_STRING: String s0, s1; s0 = soi0.getPrimitiveJavaObject(o0); diff --git ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFOPGreaterThan.java ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFOPGreaterThan.java index 47fceb1..f9522a0 100644 --- ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFOPGreaterThan.java +++ ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFOPGreaterThan.java @@ -67,6 +67,12 @@ public class GenericUDFOPGreaterThan extends GenericUDFBaseCompare { boolean b1 = boi1.get(o1); result.set(b0 && !b1); break; + case COMPARE_FLOAT: + result.set(foi0.get(o0) > foi1.get(o1)); + break; + case COMPARE_DOUBLE: + result.set(doi0.get(o0) > doi1.get(o1)); + break; case COMPARE_STRING: String s0, s1; s0 = soi0.getPrimitiveJavaObject(o0); diff --git ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFOPLessThan.java ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFOPLessThan.java index 12369a8..8044680 100644 --- ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFOPLessThan.java +++ ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFOPLessThan.java @@ -67,6 +67,12 @@ public class GenericUDFOPLessThan extends GenericUDFBaseCompare { boolean b1 = boi1.get(o1); result.set(!b0 && b1); break; + case COMPARE_FLOAT: + result.set(foi0.get(o0) < foi1.get(o1)); + break; + case COMPARE_DOUBLE: + result.set(doi0.get(o0) < doi1.get(o1)); + break; case COMPARE_STRING: String s0, s1; s0 = soi0.getPrimitiveJavaObject(o0); diff --git ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFOPNotEqual.java ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFOPNotEqual.java index 22b3bef..ef09e50 100644 --- ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFOPNotEqual.java +++ ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFOPNotEqual.java @@ -61,6 +61,12 @@ public class GenericUDFOPNotEqual extends GenericUDFBaseCompare { case COMPARE_BOOL: result.set(boi0.get(o0) != boi1.get(o1)); break; + case COMPARE_FLOAT: + result.set(foi0.get(o0) != foi1.get(o1)); + break; + case COMPARE_DOUBLE: + result.set(doi0.get(o0) != doi1.get(o1)); + break; case COMPARE_STRING: result.set(!soi0.getPrimitiveJavaObject(o0).equals( soi1.getPrimitiveJavaObject(o1))); diff --git ql/src/test/queries/clientpositive/compare_float_double.q ql/src/test/queries/clientpositive/compare_float_double.q new file mode 100644 index 0000000..6ed0cc3 --- /dev/null +++ ql/src/test/queries/clientpositive/compare_float_double.q @@ -0,0 +1,12 @@ +create table test (id int, val_f float, val_d double) row format delimited fields terminated by ' ' lines terminated by '\n' stored as textfile; +load data local inpath '../data/files/floatdouble.txt' INTO TABLE test; + +select val_f=-1.74f, val_f=3.14f, val_f=0f, + val_f=-1.74d, val_f=3.14d, val_f=0d, + val_f=-1.74, val_f=3.14, val_f=0 from test; + +select val_d=123.234f, val_d=-980345.12323f, val_d=0f, + val_d=123.234d, val_d=-980345.12323d, val_d=0d, + val_d=123.234, val_d=-980345.12323, val_d=0 from test; + +drop table test; diff --git ql/src/test/results/clientpositive/compare_float_double.q.out ql/src/test/results/clientpositive/compare_float_double.q.out new file mode 100644 index 0000000..834e819 --- /dev/null +++ ql/src/test/results/clientpositive/compare_float_double.q.out @@ -0,0 +1,51 @@ +PREHOOK: query: create table test (id int, val_f float, val_d double) row format delimited fields terminated by ' ' lines terminated by '\n' stored as textfile +PREHOOK: type: CREATETABLE +POSTHOOK: query: create table test (id int, val_f float, val_d double) row format delimited fields terminated by ' ' lines terminated by '\n' stored as textfile +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: default@test +PREHOOK: query: load data local inpath '../data/files/floatdouble.txt' INTO TABLE test +PREHOOK: type: LOAD +PREHOOK: Output: default@test +POSTHOOK: query: load data local inpath '../data/files/floatdouble.txt' INTO TABLE test +POSTHOOK: type: LOAD +POSTHOOK: Output: default@test +PREHOOK: query: select val_f=-1.74f, val_f=3.14f, val_f=0f, + val_f=-1.74d, val_f=3.14d, val_f=0d, + val_f=-1.74, val_f=3.14, val_f=0 from test +PREHOOK: type: QUERY +PREHOOK: Input: default@test +PREHOOK: Output: file:/tmp/navis/hive_2011-12-08_01-30-24_052_8478570016227978497/-mr-10000 +POSTHOOK: query: select val_f=-1.74f, val_f=3.14f, val_f=0f, + val_f=-1.74d, val_f=3.14d, val_f=0d, + val_f=-1.74, val_f=3.14, val_f=0 from test +POSTHOOK: type: QUERY +POSTHOOK: Input: default@test +POSTHOOK: Output: file:/tmp/navis/hive_2011-12-08_01-30-24_052_8478570016227978497/-mr-10000 +false true false false false false false false false +false false false false false false false false false +true false false false false false false false false +false false true false false true false false true +PREHOOK: query: select val_d=123.234f, val_d=-980345.12323f, val_d=0f, + val_d=123.234d, val_d=-980345.12323d, val_d=0d, + val_d=123.234, val_d=-980345.12323, val_d=0 from test +PREHOOK: type: QUERY +PREHOOK: Input: default@test +PREHOOK: Output: file:/tmp/navis/hive_2011-12-08_01-30-26_952_6909298996014146701/-mr-10000 +POSTHOOK: query: select val_d=123.234f, val_d=-980345.12323f, val_d=0f, + val_d=123.234d, val_d=-980345.12323d, val_d=0d, + val_d=123.234, val_d=-980345.12323, val_d=0 from test +POSTHOOK: type: QUERY +POSTHOOK: Input: default@test +POSTHOOK: Output: file:/tmp/navis/hive_2011-12-08_01-30-26_952_6909298996014146701/-mr-10000 +false false false true false false true false false +false false false false false false false false false +false false false false true false false true false +false false false false false true false false false +PREHOOK: query: drop table test +PREHOOK: type: DROPTABLE +PREHOOK: Input: default@test +PREHOOK: Output: default@test +POSTHOOK: query: drop table test +POSTHOOK: type: DROPTABLE +POSTHOOK: Input: default@test +POSTHOOK: Output: default@test