diff --git ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFOPDTIMinus.java ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFOPDTIMinus.java index 076ca51901..b62e22b97d 100644 --- ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFOPDTIMinus.java +++ ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFOPDTIMinus.java @@ -71,7 +71,8 @@ TIMESTAMP_MINUS_INTERVALYM, INTERVALDT_MINUS_INTERVALDT, TIMESTAMP_MINUS_INTERVALDT, - TIMESTAMP_MINUS_TIMESTAMP + TIMESTAMP_MINUS_TIMESTAMP, + INTERVALDT_MINUS_INT }; public GenericUDFOPDTIMinus() { @@ -117,6 +118,7 @@ public ObjectInspector initialize(ObjectInspector[] arguments) // Timestamp - Timestamp = IntervalDayTime // Date - Date = IntervalDayTime // Timestamp - Date = IntervalDayTime (operands reversible) + // Date - Int = Date if (checkArgs(PrimitiveCategory.INTERVAL_YEAR_MONTH, PrimitiveCategory.INTERVAL_YEAR_MONTH)) { minusOpType = OperationType.INTERVALYM_MINUS_INTERVALYM; intervalArg1Idx = 0; @@ -161,6 +163,14 @@ public ObjectInspector initialize(ObjectInspector[] arguments) TypeInfoFactory.intervalDayTimeTypeInfo); dt1Converter = ObjectInspectorConverters.getConverter(leftOI, resultOI); dt2Converter = ObjectInspectorConverters.getConverter(leftOI, resultOI); + } else if (checkArgs(PrimitiveCategory.DATE, PrimitiveCategory.INT) + || checkArgs(PrimitiveCategory.TIMESTAMP, PrimitiveCategory.INT)) { + minusOpType = OperationType.INTERVALDT_MINUS_INT; + intervalArg1Idx = 1; + dtArg1Idx = 0; + resultOI = PrimitiveObjectInspectorFactory.getPrimitiveWritableObjectInspector( + TypeInfoFactory.timestampTypeInfo); + dt1Converter = ObjectInspectorConverters.getConverter(leftOI, resultOI); } else { // Unsupported types - error List argTypeInfos = new ArrayList(2); @@ -217,8 +227,16 @@ public Object evaluate(DeferredObject[] arguments) throws HiveException { arguments[dtArg2Idx].get(), inputOIs[dtArg2Idx]); return handleIntervalDayTimeResult(dtm.subtract(ts1, ts2)); } + case INTERVALDT_MINUS_INT: { + int intVal = PrimitiveObjectInspectorUtils.getInt(arguments[intervalArg1Idx].get(), + inputOIs[intervalArg1Idx]); + HiveIntervalDayTime idt1 = new HiveIntervalDayTime(intVal, 0, 0, 0, 0); + Timestamp ts1 = PrimitiveObjectInspectorUtils.getTimestamp( + arguments[dtArg1Idx].get(), inputOIs[dtArg1Idx]); + return handleTimestampResult(dtm.subtract(ts1, idt1)); + } default: - throw new HiveException("Unknown PlusOpType " + minusOpType); + throw new HiveException("Unknown MinusOpType " + minusOpType); } } diff --git ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFOPDTIPlus.java ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFOPDTIPlus.java index 9295c8fdfb..c1d7d4509f 100644 --- ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFOPDTIPlus.java +++ ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFOPDTIPlus.java @@ -69,6 +69,7 @@ INTERVALYM_PLUS_TIMESTAMP, INTERVALDT_PLUS_INTERVALDT, INTERVALDT_PLUS_TIMESTAMP, + INTERVALDT_PLUS_INT, }; public GenericUDFOPDTIPlus() { @@ -111,6 +112,7 @@ public ObjectInspector initialize(ObjectInspector[] arguments) // IntervalDayTime + IntervalDayTime = IntervalDayTime // IntervalDayTime + Date = Timestamp (operands reversible) // IntervalDayTime + Timestamp = Timestamp (operands reversible) + // Date + Int = Date if (checkArgs(PrimitiveCategory.INTERVAL_YEAR_MONTH, PrimitiveCategory.INTERVAL_YEAR_MONTH)) { plusOpType = OperationType.INTERVALYM_PLUS_INTERVALYM; intervalArg1Idx = 0; @@ -163,6 +165,14 @@ public ObjectInspector initialize(ObjectInspector[] arguments) resultOI = PrimitiveObjectInspectorFactory.getPrimitiveWritableObjectInspector( TypeInfoFactory.timestampTypeInfo); dtConverter = ObjectInspectorConverters.getConverter(leftOI, resultOI); + } else if (checkArgs(PrimitiveCategory.DATE, PrimitiveCategory.INT) + || checkArgs(PrimitiveCategory.TIMESTAMP, PrimitiveCategory.INT)) { + plusOpType = OperationType.INTERVALDT_PLUS_INT; + intervalArg1Idx = 1; + dtArgIdx = 0; + resultOI = PrimitiveObjectInspectorFactory.getPrimitiveWritableObjectInspector( + TypeInfoFactory.timestampTypeInfo); + dtConverter = ObjectInspectorConverters.getConverter(leftOI, resultOI); } else { // Unsupported types - error List argTypeInfos = new ArrayList(2); @@ -212,6 +222,14 @@ public Object evaluate(DeferredObject[] arguments) throws HiveException { arguments[dtArgIdx].get(), inputOIs[dtArgIdx]); return handleTimestampResult(dtm.add(ts1, idt1)); } + case INTERVALDT_PLUS_INT: { + int intVal = PrimitiveObjectInspectorUtils.getInt(arguments[intervalArg1Idx].get(), + inputOIs[intervalArg1Idx]); + HiveIntervalDayTime idt1 = new HiveIntervalDayTime(intVal, 0, 0, 0, 0); + Timestamp ts1 = PrimitiveObjectInspectorUtils.getTimestamp( + arguments[dtArgIdx].get(), inputOIs[dtArgIdx]); + return handleTimestampResult(dtm.add(ts1, idt1)); + } default: throw new HiveException("Unknown PlusOpType " + plusOpType); } diff --git ql/src/test/queries/clientpositive/date_int_operation_test.q ql/src/test/queries/clientpositive/date_int_operation_test.q new file mode 100644 index 0000000000..05d97d75d7 --- /dev/null +++ ql/src/test/queries/clientpositive/date_int_operation_test.q @@ -0,0 +1,5 @@ +--! qt:dataset:srcpart +--! qt:dataset:src +--! qt:dataset:alltypesorc +select date('2001-01-28') + 3; +select date('2001-01-28') - 3; diff --git ql/src/test/results/clientpositive/date_int_operation_test.q.out ql/src/test/results/clientpositive/date_int_operation_test.q.out new file mode 100644 index 0000000000..c6e40b9ad3 --- /dev/null +++ ql/src/test/results/clientpositive/date_int_operation_test.q.out @@ -0,0 +1,18 @@ +PREHOOK: query: select date('2001-01-28') + 3 +PREHOOK: type: QUERY +PREHOOK: Input: _dummy_database@_dummy_table +#### A masked pattern was here #### +POSTHOOK: query: select date('2001-01-28') + 3 +POSTHOOK: type: QUERY +POSTHOOK: Input: _dummy_database@_dummy_table +#### A masked pattern was here #### +2001-01-31 00:00:00 +PREHOOK: query: select date('2001-01-28') - 3 +PREHOOK: type: QUERY +PREHOOK: Input: _dummy_database@_dummy_table +#### A masked pattern was here #### +POSTHOOK: query: select date('2001-01-28') - 3 +POSTHOOK: type: QUERY +POSTHOOK: Input: _dummy_database@_dummy_table +#### A masked pattern was here #### +2001-01-25 00:00:00