You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@vxquery.apache.org by pr...@apache.org on 2012/08/21 01:16:12 UTC

svn commit: r1375303 - in /incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/arithmetic: AddOperation.java DivideOperation.java MultiplyOperation.java SubtractOperation.java

Author: prestonc
Date: Mon Aug 20 23:16:11 2012
New Revision: 1375303

URL: http://svn.apache.org/viewvc?rev=1375303&view=rev
Log:
Update the error reporting and fixed the array backed value store references.

Modified:
    incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/arithmetic/AddOperation.java
    incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/arithmetic/DivideOperation.java
    incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/arithmetic/MultiplyOperation.java
    incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/arithmetic/SubtractOperation.java

Modified: incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/arithmetic/AddOperation.java
URL: http://svn.apache.org/viewvc/incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/arithmetic/AddOperation.java?rev=1375303&r1=1375302&r2=1375303&view=diff
==============================================================================
--- incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/arithmetic/AddOperation.java (original)
+++ incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/arithmetic/AddOperation.java Mon Aug 20 23:16:11 2012
@@ -145,7 +145,9 @@ public class AddOperation extends Abstra
     @Override
     public void operateDecimalInteger(XSDecimalPointable decp1, LongPointable longp2, DataOutput dOut)
             throws SystemException, IOException {
+        abvsInner.reset();
         XSDecimalPointable decp2 = new XSDecimalPointable();
+        decp2.set(abvsInner.getByteArray(), abvsInner.getStartOffset(), XSDecimalPointable.TYPE_TRAITS.getFixedLength());
         decp2.setDecimal(longp2.longValue(), (byte) 0);
         operateDecimalDecimal(decp1, decp2, dOut);
     }
@@ -419,7 +421,9 @@ public class AddOperation extends Abstra
     }
 
     public int operateIntDecimal(int intValue, XSDecimalPointable decp2) throws SystemException, IOException {
+        abvsInner.reset();
         XSDecimalPointable decp1 = new XSDecimalPointable();
+        decp1.set(abvsInner.getByteArray(), abvsInner.getStartOffset(), XSDecimalPointable.TYPE_TRAITS.getFixedLength());
         decp1.setDecimal(intValue, (byte) 0);
         // Prepare
         long value1 = decp1.getDecimalValue();

Modified: incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/arithmetic/DivideOperation.java
URL: http://svn.apache.org/viewvc/incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/arithmetic/DivideOperation.java?rev=1375303&r1=1375302&r2=1375303&view=diff
==============================================================================
--- incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/arithmetic/DivideOperation.java (original)
+++ incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/arithmetic/DivideOperation.java Mon Aug 20 23:16:11 2012
@@ -11,13 +11,17 @@ import org.apache.vxquery.datamodel.acce
 import org.apache.vxquery.datamodel.values.ValueTag;
 import org.apache.vxquery.exceptions.ErrorCode;
 import org.apache.vxquery.exceptions.SystemException;
+import org.apache.vxquery.runtime.functions.cast.CastToDecimalOperation;
 
 import edu.uci.ics.hyracks.data.std.primitive.DoublePointable;
 import edu.uci.ics.hyracks.data.std.primitive.FloatPointable;
 import edu.uci.ics.hyracks.data.std.primitive.IntegerPointable;
 import edu.uci.ics.hyracks.data.std.primitive.LongPointable;
+import edu.uci.ics.hyracks.data.std.util.ArrayBackedValueStorage;
 
 public class DivideOperation extends AbstractArithmeticOperation {
+    protected final ArrayBackedValueStorage abvsInner = new ArrayBackedValueStorage();
+
     @Override
     public void operateDateDate(XSDatePointable datep, XSDatePointable datep2, DynamicContext dCtx, DataOutput dOut)
             throws SystemException, IOException {
@@ -62,6 +66,9 @@ public class DivideOperation extends Abs
         long value2 = decp2.getDecimalValue();
         byte place1 = decp1.getDecimalPlace();
         byte place2 = decp2.getDecimalPlace();
+        if (value2 == 0) {
+            throw new SystemException(ErrorCode.FOAR0001);
+        }
         // Divide
         if (value1 > Long.MAX_VALUE * value2) {
             throw new SystemException(ErrorCode.XPDY0002);
@@ -86,9 +93,7 @@ public class DivideOperation extends Abs
     @Override
     public void operateDecimalDTDuration(XSDecimalPointable decp1, IntegerPointable intp2, DataOutput dOut)
             throws SystemException, IOException {
-        int value = operateDecimalInt(decp1, intp2.intValue());
-        dOut.write(ValueTag.XS_DAY_TIME_DURATION_TAG);
-        dOut.writeInt(value);
+        throw new UnsupportedOperationException();
     }
 
     @Override
@@ -103,8 +108,13 @@ public class DivideOperation extends Abs
     @Override
     public void operateDecimalInteger(XSDecimalPointable decp1, LongPointable longp2, DataOutput dOut)
             throws SystemException, IOException {
+        if (longp2.getLong() == 0) {
+            throw new SystemException(ErrorCode.FOAR0001);
+        }
         // Convert
+        abvsInner.reset();
         XSDecimalPointable decp2 = new XSDecimalPointable();
+        decp2.set(abvsInner.getByteArray(), abvsInner.getStartOffset(), XSDecimalPointable.TYPE_TRAITS.getFixedLength());
         decp2.setDecimal(longp2.longValue(), (byte) 0);
         operateDecimalDecimal(decp1, decp2, dOut);
     }
@@ -120,6 +130,9 @@ public class DivideOperation extends Abs
     @Override
     public void operateDoubleDecimal(DoublePointable doublep, XSDecimalPointable decp, DataOutput dOut)
             throws SystemException, IOException {
+        if (decp.getDecimalValue() == 0) {
+            throw new SystemException(ErrorCode.FOAR0001);
+        }
         double value = doublep.doubleValue();
         value /= decp.doubleValue();
         dOut.write(ValueTag.XS_DOUBLE_TAG);
@@ -138,10 +151,7 @@ public class DivideOperation extends Abs
     @Override
     public void operateDoubleDTDuration(DoublePointable doublep, IntegerPointable intp, DataOutput dOut)
             throws SystemException, IOException {
-        double value = doublep.doubleValue();
-        value /= intp.intValue();
-        dOut.write(ValueTag.XS_DAY_TIME_DURATION_TAG);
-        dOut.writeInt((int) value);
+        throw new UnsupportedOperationException();
     }
 
     @Override
@@ -156,6 +166,9 @@ public class DivideOperation extends Abs
     @Override
     public void operateDoubleInteger(DoublePointable doublep, LongPointable longp, DataOutput dOut)
             throws SystemException, IOException {
+        if (longp.getLong() == 0) {
+            throw new SystemException(ErrorCode.FOAR0001);
+        }
         double value = doublep.doubleValue();
         value /= longp.doubleValue();
         dOut.write(ValueTag.XS_DOUBLE_TAG);
@@ -165,10 +178,7 @@ public class DivideOperation extends Abs
     @Override
     public void operateDoubleYMDuration(DoublePointable doublep, IntegerPointable intp, DataOutput dOut)
             throws SystemException, IOException {
-        double value = doublep.doubleValue();
-        value /= intp.intValue();
-        dOut.write(ValueTag.XS_YEAR_MONTH_DURATION_TAG);
-        dOut.writeInt((int) value);
+        throw new UnsupportedOperationException();
     }
 
     @Override
@@ -186,6 +196,9 @@ public class DivideOperation extends Abs
     @Override
     public void operateDTDurationDecimal(IntegerPointable intp, XSDecimalPointable decp, DataOutput dOut)
             throws SystemException, IOException {
+        if (decp.getDecimalValue() == 0) {
+            throw new SystemException(ErrorCode.FOAR0001);
+        }
         int value = intp.intValue();
         value /= decp.intValue();
         dOut.write(ValueTag.XS_DAY_TIME_DURATION_TAG);
@@ -204,10 +217,15 @@ public class DivideOperation extends Abs
     @Override
     public void operateDTDurationDTDuration(IntegerPointable intp, IntegerPointable intp2, DataOutput dOut)
             throws SystemException, IOException {
-        int value = intp.intValue();
+        double value = intp.intValue();
         value /= intp2.intValue();
-        dOut.write(ValueTag.XS_DAY_TIME_DURATION_TAG);
-        dOut.writeInt(value);
+
+        abvsInner.reset();
+        DoublePointable doublep = new DoublePointable();
+        doublep.set(abvsInner.getByteArray(), abvsInner.getStartOffset(), DoublePointable.TYPE_TRAITS.getFixedLength());
+        doublep.setDouble(value);
+        CastToDecimalOperation castToDecmial = new CastToDecimalOperation();
+        castToDecmial.convertDouble(doublep, dOut);
     }
 
     @Override
@@ -222,6 +240,9 @@ public class DivideOperation extends Abs
     @Override
     public void operateDTDurationInteger(IntegerPointable intp, LongPointable longp, DataOutput dOut)
             throws SystemException, IOException {
+        if (longp.getLong() == 0) {
+            throw new SystemException(ErrorCode.FOAR0001);
+        }
         int value = intp.intValue();
         value /= longp.intValue();
         dOut.write(ValueTag.XS_DAY_TIME_DURATION_TAG);
@@ -237,6 +258,9 @@ public class DivideOperation extends Abs
     @Override
     public void operateFloatDecimal(FloatPointable floatp1, XSDecimalPointable decp2, DataOutput dOut)
             throws SystemException, IOException {
+        if (decp2.getDecimalValue() == 0) {
+            throw new SystemException(ErrorCode.FOAR0001);
+        }
         float value = floatp1.floatValue();
         value /= decp2.floatValue();
         dOut.write(ValueTag.XS_FLOAT_TAG);
@@ -255,10 +279,7 @@ public class DivideOperation extends Abs
     @Override
     public void operateFloatDTDuration(FloatPointable floatp1, IntegerPointable intp2, DataOutput dOut)
             throws SystemException, IOException {
-        int value = floatp1.intValue();
-        value /= intp2.intValue();
-        dOut.write(ValueTag.XS_DAY_TIME_DURATION_TAG);
-        dOut.writeInt(value);
+        throw new UnsupportedOperationException();
     }
 
     @Override
@@ -273,6 +294,9 @@ public class DivideOperation extends Abs
     @Override
     public void operateFloatInteger(FloatPointable floatp1, LongPointable longp2, DataOutput dOut)
             throws SystemException, IOException {
+        if (longp2.getLong() == 0) {
+            throw new SystemException(ErrorCode.FOAR0001);
+        }
         float value = floatp1.floatValue();
         value /= longp2.floatValue();
         dOut.write(ValueTag.XS_FLOAT_TAG);
@@ -282,16 +306,18 @@ public class DivideOperation extends Abs
     @Override
     public void operateFloatYMDuration(FloatPointable floatp1, IntegerPointable intp2, DataOutput dOut)
             throws SystemException, IOException {
-        long value = floatp1.longValue();
-        value /= intp2.longValue();
-        dOut.write(ValueTag.XS_YEAR_MONTH_DURATION_TAG);
-        dOut.writeLong(value);
+        throw new UnsupportedOperationException();
     }
 
     @Override
     public void operateIntegerDecimal(LongPointable longp1, XSDecimalPointable decp2, DataOutput dOut)
             throws SystemException, IOException {
+        if (decp2.getDecimalValue() == 0) {
+            throw new SystemException(ErrorCode.FOAR0001);
+        }
+        abvsInner.reset();
         XSDecimalPointable decp1 = new XSDecimalPointable();
+        decp1.set(abvsInner.getByteArray(), abvsInner.getStartOffset(), XSDecimalPointable.TYPE_TRAITS.getFixedLength());
         decp1.setDecimal(longp1.longValue(), (byte) 0);
         operateDecimalDecimal(decp1, decp2, dOut);
     }
@@ -308,10 +334,7 @@ public class DivideOperation extends Abs
     @Override
     public void operateIntegerDTDuration(LongPointable longp, IntegerPointable intp, DataOutput dOut)
             throws SystemException, IOException {
-        int value = longp.intValue();
-        value /= intp.intValue();
-        dOut.write(ValueTag.XS_DAY_TIME_DURATION_TAG);
-        dOut.writeInt(value);
+        throw new UnsupportedOperationException();
     }
 
     @Override
@@ -326,20 +349,25 @@ public class DivideOperation extends Abs
     @Override
     public void operateIntegerInteger(LongPointable longp, LongPointable longp2, DataOutput dOut)
             throws SystemException, IOException {
+        if (longp.getLong() == 0) {
+            throw new SystemException(ErrorCode.FOAR0001);
+        }
         // This is an exception for integer integer operations. The divide operation returns a decimal.
         double value = longp.doubleValue();
         value /= longp2.doubleValue();
-        dOut.write(ValueTag.XS_DECIMAL_TAG);
-        dOut.writeDouble(value);
+
+        abvsInner.reset();
+        DoublePointable doublep = new DoublePointable();
+        doublep.set(abvsInner.getByteArray(), abvsInner.getStartOffset(), DoublePointable.TYPE_TRAITS.getFixedLength());
+        doublep.setDouble(value);
+        CastToDecimalOperation castToDecmial = new CastToDecimalOperation();
+        castToDecmial.convertDouble(doublep, dOut);
     }
 
     @Override
     public void operateIntegerYMDuration(LongPointable longp, IntegerPointable intp, DataOutput dOut)
             throws SystemException, IOException {
-        int value = longp.intValue();
-        value /= intp.intValue();
-        dOut.write(ValueTag.XS_YEAR_MONTH_DURATION_TAG);
-        dOut.writeInt(value);
+        throw new UnsupportedOperationException();
     }
 
     @Override
@@ -395,6 +423,9 @@ public class DivideOperation extends Abs
     @Override
     public void operateYMDurationInteger(IntegerPointable intp, LongPointable longp, DataOutput dOut)
             throws SystemException, IOException {
+        if (longp.getLong() == 0) {
+            throw new SystemException(ErrorCode.FOAR0001);
+        }
         int value = intp.intValue();
         value /= longp.intValue();
         dOut.write(ValueTag.XS_YEAR_MONTH_DURATION_TAG);
@@ -404,20 +435,33 @@ public class DivideOperation extends Abs
     @Override
     public void operateYMDurationYMDuration(IntegerPointable intp, IntegerPointable intp2, DataOutput dOut)
             throws SystemException, IOException {
-        int value = intp.intValue();
+        if (intp2.getInteger() == 0) {
+            throw new SystemException(ErrorCode.FOAR0001);
+        }
+        double value = intp.intValue();
         value /= intp2.intValue();
-        dOut.write(ValueTag.XS_YEAR_MONTH_DURATION_TAG);
-        dOut.writeInt(value);
+
+        abvsInner.reset();
+        DoublePointable doublep = new DoublePointable();
+        doublep.set(abvsInner.getByteArray(), abvsInner.getStartOffset(), DoublePointable.TYPE_TRAITS.getFixedLength());
+        doublep.setDouble(value);
+        CastToDecimalOperation castToDecmial = new CastToDecimalOperation();
+        castToDecmial.convertDouble(doublep, dOut);
     }
 
     public int operateIntDecimal(int intValue, XSDecimalPointable decp2) throws SystemException, IOException {
+        abvsInner.reset();
         XSDecimalPointable decp1 = new XSDecimalPointable();
+        decp1.set(abvsInner.getByteArray(), abvsInner.getStartOffset(), XSDecimalPointable.TYPE_TRAITS.getFixedLength());
         decp1.setDecimal(intValue, (byte) 0);
         // Prepare
         long value1 = decp1.getDecimalValue();
         long value2 = decp2.getDecimalValue();
         byte place1 = decp1.getDecimalPlace();
         byte place2 = decp2.getDecimalPlace();
+        if (value2 == 0) {
+            throw new SystemException(ErrorCode.FOAR0001);
+        }
         // Divide
         if (value1 > Long.MAX_VALUE * value2) {
             throw new SystemException(ErrorCode.XPDY0002);
@@ -430,13 +474,18 @@ public class DivideOperation extends Abs
     }
 
     public int operateDecimalInt(XSDecimalPointable decp1, int intValue) throws SystemException, IOException {
+        abvsInner.reset();
         XSDecimalPointable decp2 = new XSDecimalPointable();
+        decp2.set(abvsInner.getByteArray(), abvsInner.getStartOffset(), XSDecimalPointable.TYPE_TRAITS.getFixedLength());
         decp2.setDecimal(intValue, (byte) 0);
         // Prepare
         long value1 = decp1.getDecimalValue();
         long value2 = decp2.getDecimalValue();
         byte place1 = decp1.getDecimalPlace();
         byte place2 = decp2.getDecimalPlace();
+        if (value2 == 0) {
+            throw new SystemException(ErrorCode.FOAR0001);
+        }
         // Divide
         if (value1 > Long.MAX_VALUE * value2) {
             throw new SystemException(ErrorCode.XPDY0002);

Modified: incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/arithmetic/MultiplyOperation.java
URL: http://svn.apache.org/viewvc/incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/arithmetic/MultiplyOperation.java?rev=1375303&r1=1375302&r2=1375303&view=diff
==============================================================================
--- incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/arithmetic/MultiplyOperation.java (original)
+++ incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/arithmetic/MultiplyOperation.java Mon Aug 20 23:16:11 2012
@@ -16,8 +16,11 @@ import edu.uci.ics.hyracks.data.std.prim
 import edu.uci.ics.hyracks.data.std.primitive.FloatPointable;
 import edu.uci.ics.hyracks.data.std.primitive.IntegerPointable;
 import edu.uci.ics.hyracks.data.std.primitive.LongPointable;
+import edu.uci.ics.hyracks.data.std.util.ArrayBackedValueStorage;
 
 public class MultiplyOperation extends AbstractArithmeticOperation {
+    protected final ArrayBackedValueStorage abvsInner = new ArrayBackedValueStorage();
+
     @Override
     public void operateDateDate(XSDatePointable datep, XSDatePointable datep2, DynamicContext dCtx, DataOutput dOut)
             throws SystemException, IOException {
@@ -100,7 +103,9 @@ public class MultiplyOperation extends A
     @Override
     public void operateDecimalInteger(XSDecimalPointable decp1, LongPointable longp2, DataOutput dOut)
             throws SystemException, IOException {
+        abvsInner.reset();
         XSDecimalPointable decp2 = new XSDecimalPointable();
+        decp2.set(abvsInner.getByteArray(), abvsInner.getStartOffset(), XSDecimalPointable.TYPE_TRAITS.getFixedLength());
         decp2.setDecimal(longp2.getLong(), (byte) 0);
         operateDecimalDecimal(decp1, decp2, dOut);
     }
@@ -363,7 +368,9 @@ public class MultiplyOperation extends A
     }
 
     public int operateIntDecimal(int intValue, XSDecimalPointable decp2) throws SystemException, IOException {
+        abvsInner.reset();
         XSDecimalPointable decp1 = new XSDecimalPointable();
+        decp1.set(abvsInner.getByteArray(), abvsInner.getStartOffset(), XSDecimalPointable.TYPE_TRAITS.getFixedLength());
         decp1.setDecimal(intValue, (byte) 0);
         // Prepare
         long value1 = decp1.getDecimalValue();

Modified: incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/arithmetic/SubtractOperation.java
URL: http://svn.apache.org/viewvc/incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/arithmetic/SubtractOperation.java?rev=1375303&r1=1375302&r2=1375303&view=diff
==============================================================================
--- incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/arithmetic/SubtractOperation.java (original)
+++ incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/arithmetic/SubtractOperation.java Mon Aug 20 23:16:11 2012
@@ -20,20 +20,22 @@ import edu.uci.ics.hyracks.data.std.prim
 import edu.uci.ics.hyracks.data.std.util.ArrayBackedValueStorage;
 
 public class SubtractOperation extends AbstractArithmeticOperation {
-    protected final ArrayBackedValueStorage abvs = new ArrayBackedValueStorage();
-    protected final DataOutput dataOutput = abvs.getDataOutput();
+    protected final ArrayBackedValueStorage abvsInner1 = new ArrayBackedValueStorage();
+    protected final DataOutput dOutInner1 = abvsInner1.getDataOutput();
+    protected final ArrayBackedValueStorage abvsInner2 = new ArrayBackedValueStorage();
+    protected final DataOutput dOutInner2 = abvsInner2.getDataOutput();
 
     public void operateDateDate(XSDatePointable datep1, XSDatePointable datep2, DynamicContext dCtx, DataOutput dOut)
             throws SystemException, IOException {
-        abvs.reset();
-        DateTime.getTimezoneDateTime(datep1, dCtx, dataOutput);
+        abvsInner1.reset();
+        DateTime.getTimezoneDateTime(datep1, dCtx, dOutInner1);
         XSDateTimePointable datetimep1 = new XSDateTimePointable();
-        datetimep1.set(abvs.getByteArray(), 0, abvs.getLength());
+        datetimep1.set(abvsInner1.getByteArray(), abvsInner1.getStartOffset(), abvsInner1.getLength());
 
-        abvs.reset();
-        DateTime.getTimezoneDateTime(datep2, dCtx, dataOutput);
+        abvsInner2.reset();
+        DateTime.getTimezoneDateTime(datep2, dCtx, dOutInner2);
         XSDateTimePointable datetimep2 = new XSDateTimePointable();
-        datetimep1.set(abvs.getByteArray(), 0, abvs.getLength());
+        datetimep2.set(abvsInner2.getByteArray(), abvsInner2.getStartOffset(), abvsInner2.getLength());
 
         operateDatetimeDatetime(datetimep1, datetimep2, dCtx, dOut);
     }
@@ -42,9 +44,9 @@ public class SubtractOperation extends A
     public void operateDateDTDuration(XSDatePointable datep1, IntegerPointable intp2, DataOutput dOut)
             throws SystemException, IOException {
         // Add duration.
-        abvs.reset();
-        DateTime.normalizeDateTime(datep1.getYearMonth(), datep1.getDayTime() - intp2.getInteger(), dataOutput);
-        byte[] bytes = abvs.getByteArray();
+        abvsInner1.reset();
+        DateTime.normalizeDateTime(datep1.getYearMonth(), datep1.getDayTime() - intp2.getInteger(), dOutInner1);
+        byte[] bytes = abvsInner1.getByteArray();
         // Convert to date.
         bytes[XSDatePointable.TIMEZONE_HOUR_OFFSET] = bytes[XSDateTimePointable.TIMEZONE_HOUR_OFFSET];
         bytes[XSDatePointable.TIMEZONE_MINUTE_OFFSET] = bytes[XSDateTimePointable.TIMEZONE_MINUTE_OFFSET];
@@ -55,13 +57,13 @@ public class SubtractOperation extends A
     @Override
     public void operateDatetimeDatetime(XSDateTimePointable datetimep1, XSDateTimePointable datetimep2,
             DynamicContext dCtx, DataOutput dOut) throws SystemException, IOException {
-        abvs.reset();
-        DateTime.getTimezoneDateTime(datetimep1, dCtx, dataOutput);
-        byte[] bytes1 = abvs.getByteArray();
-
-        abvs.reset();
-        DateTime.getTimezoneDateTime(datetimep2, dCtx, dataOutput);
-        byte[] bytes2 = abvs.getByteArray();
+        abvsInner1.reset();
+        DateTime.getTimezoneDateTime(datetimep1, dCtx, dOutInner1);
+        byte[] bytes1 = abvsInner1.getByteArray();
+
+        abvsInner2.reset();
+        DateTime.getTimezoneDateTime(datetimep2, dCtx, dOutInner2);
+        byte[] bytes2 = abvsInner2.getByteArray();
 
         long dayTime1 = XSDateTimePointable.getDayTime(bytes1, 0);
         long dayTime2 = XSDateTimePointable.getDayTime(bytes2, 0);
@@ -101,29 +103,29 @@ public class SubtractOperation extends A
     public void operateDatetimeDTDuration(XSDateTimePointable datetimep, IntegerPointable intp, DataOutput dOut)
             throws SystemException, IOException {
         // Add duration.
-        abvs.reset();
-        DateTime.normalizeDateTime(datetimep.getYearMonth(), datetimep.getDayTime() - intp.getInteger(), dataOutput);
+        abvsInner1.reset();
+        DateTime.normalizeDateTime(datetimep.getYearMonth(), datetimep.getDayTime() - intp.getInteger(), dOutInner1);
         dOut.write(ValueTag.XS_DATETIME_TAG);
-        dOut.write(abvs.getByteArray());
+        dOut.write(abvsInner1.getByteArray());
     }
 
     @Override
     public void operateDatetimeYMDuration(XSDateTimePointable datetimep, IntegerPointable intp, DataOutput dOut)
             throws SystemException, IOException {
         // Add duration.
-        abvs.reset();
-        DateTime.normalizeDateTime(datetimep.getYearMonth() - intp.getInteger(), datetimep.getDayTime(), dataOutput);
+        abvsInner1.reset();
+        DateTime.normalizeDateTime(datetimep.getYearMonth() - intp.getInteger(), datetimep.getDayTime(), dOutInner1);
         dOut.write(ValueTag.XS_DATE_TAG);
-        dOut.write(abvs.getByteArray());
+        dOut.write(abvsInner1.getByteArray());
     }
 
     @Override
     public void operateDateYMDuration(XSDatePointable datep, IntegerPointable intp, DataOutput dOut)
             throws SystemException, IOException {
         // Add duration.
-        abvs.reset();
-        DateTime.normalizeDateTime(datep.getYearMonth() - intp.getInteger(), datep.getDayTime(), dataOutput);
-        byte[] bytes = abvs.getByteArray();
+        abvsInner1.reset();
+        DateTime.normalizeDateTime(datep.getYearMonth() - intp.getInteger(), datep.getDayTime(), dOutInner1);
+        byte[] bytes = abvsInner1.getByteArray();
         // Convert to date.
         bytes[XSDatePointable.TIMEZONE_HOUR_OFFSET] = bytes[XSDateTimePointable.TIMEZONE_HOUR_OFFSET];
         bytes[XSDatePointable.TIMEZONE_MINUTE_OFFSET] = bytes[XSDateTimePointable.TIMEZONE_MINUTE_OFFSET];
@@ -192,7 +194,9 @@ public class SubtractOperation extends A
     @Override
     public void operateDecimalInteger(XSDecimalPointable decp1, LongPointable longp2, DataOutput dOut)
             throws SystemException, IOException {
+        abvsInner1.reset();
         XSDecimalPointable decp2 = new XSDecimalPointable();
+        decp2.set(abvsInner1.getByteArray(), abvsInner1.getStartOffset(), XSDecimalPointable.TYPE_TRAITS.getFixedLength());
         decp2.setDecimal(longp2.longValue(), (byte) 0);
         operateDecimalDecimal(decp1, decp2, dOut);
     }
@@ -434,9 +438,9 @@ public class SubtractOperation extends A
     public void operateTimeDTDuration(XSTimePointable timep1, IntegerPointable intp2, DataOutput dOut)
             throws SystemException, IOException {
         // Add duration.
-        abvs.reset();
-        DateTime.normalizeDateTime(0, timep1.getDayTime() - intp2.getInteger(), dataOutput);
-        byte[] bytes = abvs.getByteArray();
+        abvsInner1.reset();
+        DateTime.normalizeDateTime(0, timep1.getDayTime() - intp2.getInteger(), dOutInner1);
+        byte[] bytes = abvsInner1.getByteArray();
         // Convert to date.
         bytes[XSTimePointable.HOUR_OFFSET] = bytes[XSDateTimePointable.HOUR_OFFSET];
         bytes[XSTimePointable.MINUTE_OFFSET] = bytes[XSDateTimePointable.MINUTE_OFFSET];
@@ -450,15 +454,15 @@ public class SubtractOperation extends A
     @Override
     public void operateTimeTime(XSTimePointable timep1, XSTimePointable timep2, DynamicContext dCtx, DataOutput dOut)
             throws SystemException, IOException {
-        abvs.reset();
-        DateTime.getTimezoneDateTime(timep1, dCtx, dataOutput);
+        abvsInner1.reset();
+        DateTime.getTimezoneDateTime(timep1, dCtx, dOutInner1);
         XSDateTimePointable datetimep1 = new XSDateTimePointable();
-        datetimep1.set(abvs.getByteArray(), 0, abvs.getLength());
+        datetimep1.set(abvsInner1.getByteArray(), abvsInner1.getStartOffset(), abvsInner1.getLength());
 
-        abvs.reset();
-        DateTime.getTimezoneDateTime(timep2, dCtx, dataOutput);
+        abvsInner2.reset();
+        DateTime.getTimezoneDateTime(timep2, dCtx, dOutInner2);
         XSDateTimePointable datetimep2 = new XSDateTimePointable();
-        datetimep1.set(abvs.getByteArray(), 0, abvs.getLength());
+        datetimep2.set(abvsInner2.getByteArray(), abvsInner2.getStartOffset(), abvsInner2.getLength());
 
         operateDatetimeDatetime(datetimep1, datetimep2, dCtx, dOut);
     }
@@ -521,7 +525,9 @@ public class SubtractOperation extends A
     }
 
     public int operateIntDecimal(int intValue, XSDecimalPointable decp2) throws SystemException, IOException {
+        abvsInner1.reset();
         XSDecimalPointable decp1 = new XSDecimalPointable();
+        decp1.set(abvsInner1.getByteArray(), abvsInner1.getStartOffset(), XSDecimalPointable.TYPE_TRAITS.getFixedLength());
         decp1.setDecimal(intValue, (byte) 0);
         // Prepare
         long value1 = decp1.getDecimalValue();
@@ -552,7 +558,9 @@ public class SubtractOperation extends A
     }
 
     public int operateDecimalInt(XSDecimalPointable decp1, int intValue) throws SystemException, IOException {
+        abvsInner1.reset();
         XSDecimalPointable decp2 = new XSDecimalPointable();
+        decp2.set(abvsInner1.getByteArray(), abvsInner1.getStartOffset(), XSDecimalPointable.TYPE_TRAITS.getFixedLength());
         decp2.setDecimal(intValue, (byte) 0);
         // Prepare
         long value1 = decp1.getDecimalValue();