diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/om/lazy/LazyVisitablePointableTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/om/lazy/LazyVisitablePointableTest.java
index d981be1..d6cf026 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/om/lazy/LazyVisitablePointableTest.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/om/lazy/LazyVisitablePointableTest.java
@@ -29,12 +29,10 @@
 import org.apache.asterix.om.lazy.TypedRecordLazyVisitablePointable;
 import org.apache.asterix.om.pointables.ARecordVisitablePointable;
 import org.apache.asterix.om.pointables.base.DefaultOpenFieldType;
-import org.apache.asterix.om.pointables.base.IVisitablePointable;
 import org.apache.asterix.om.pointables.cast.ACastVisitor;
+import org.apache.asterix.om.pointables.cast.CastResult;
 import org.apache.asterix.om.types.ARecordType;
-import org.apache.asterix.om.types.IAType;
 import org.apache.asterix.runtime.evaluators.comparisons.DeepEqualAssessor;
-import org.apache.hyracks.algebricks.common.utils.Triple;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
 import org.junit.Assert;
@@ -55,7 +53,7 @@
     private final RecordLazyVisitablePointable openLazyPointable;
     private final ARecordVisitablePointable openPointable;
     private final ArrayBackedValueStorage recordStorage;
-    private final Triple<IVisitablePointable, IAType, Boolean> arg;
+    private final CastResult castResult;
 
     static {
         BASE_DIR = "data";
@@ -74,8 +72,7 @@
         openLazyPointable = new RecordLazyVisitablePointable(true);
         openPointable = new ARecordVisitablePointable(DefaultOpenFieldType.NESTED_OPEN_RECORD_TYPE);
         recordStorage = new ArrayBackedValueStorage();
-        arg = new Triple<>(null, null, null);
-        arg.third = Boolean.FALSE;
+        castResult = new CastResult(null, null);
     }
 
     private void prepareParser(String path) throws IOException {
@@ -91,12 +88,12 @@
             //Infer the schema
             ARecordType inferredFromOpen = (ARecordType) openLazyPointable.accept(schemaInference, "fromOpen");
             ARecordVisitablePointable closedPointable = new ARecordVisitablePointable(inferredFromOpen);
-            arg.first = closedPointable;
-            arg.second = inferredFromOpen;
+            castResult.setOutPointable(closedPointable);
+            castResult.setOutType(inferredFromOpen);
 
             //Cast to closed using the inferred type
             openPointable.set(recordStorage);
-            openPointable.accept(castVisitor, arg);
+            openPointable.accept(castVisitor, castResult);
             //Ensure both closed and open records are the same
             Assert.assertTrue(deepEqualAssessor.isEqual(openPointable, closedPointable));
 
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/cast/ACastVisitor.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/cast/ACastVisitor.java
index 993edee..2dd7bfe 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/cast/ACastVisitor.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/cast/ACastVisitor.java
@@ -37,9 +37,9 @@
 import org.apache.asterix.om.types.EnumDeserializer;
 import org.apache.asterix.om.types.IAType;
 import org.apache.asterix.om.types.hierachy.ATypeHierarchy;
-import org.apache.hyracks.algebricks.common.utils.Triple;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.api.exceptions.SourceLocation;
+import org.apache.hyracks.data.std.api.IPointable;
 import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
 
 /**
@@ -53,7 +53,7 @@
  * memory/storage layout, the visitor will change the layout as specified at
  * runtime.
  */
-public class ACastVisitor implements IVisitablePointableVisitor<Void, Triple<IVisitablePointable, IAType, Boolean>> {
+public class ACastVisitor implements IVisitablePointableVisitor<Void, CastResult> {
 
     private final Map<IVisitablePointable, ARecordCaster> raccessorToCaster = new HashMap<>();
     private final Map<IVisitablePointable, AListCaster> laccessorToCaster = new HashMap<>();
@@ -76,8 +76,7 @@
     }
 
     @Override
-    public Void visit(AListVisitablePointable accessor, Triple<IVisitablePointable, IAType, Boolean> arg)
-            throws HyracksDataException {
+    public Void visit(AListVisitablePointable accessor, CastResult castResult) throws HyracksDataException {
         AListCaster caster = laccessorToCaster.get(accessor);
         if (caster == null) {
             caster = new AListCaster();
@@ -85,27 +84,26 @@
         }
 
         AbstractCollectionType resultType;
-        switch (arg.second.getTypeTag()) {
+        switch (castResult.getOutType().getTypeTag()) {
             case ANY:
                 resultType = accessor.ordered() ? DefaultOpenFieldType.NESTED_OPEN_AORDERED_LIST_TYPE
                         : DefaultOpenFieldType.NESTED_OPEN_AUNORDERED_LIST_TYPE;
                 break;
             case ARRAY:
             case MULTISET:
-                resultType = (AbstractCollectionType) arg.second;
+                resultType = (AbstractCollectionType) castResult.getOutType();
                 break;
             default:
                 throw new RuntimeDataException(ErrorCode.TYPE_CONVERT, sourceLoc,
-                        accessor.ordered() ? ATypeTag.ARRAY : ATypeTag.MULTISET, arg.second.getTypeTag());
+                        accessor.ordered() ? ATypeTag.ARRAY : ATypeTag.MULTISET, castResult.getOutType().getTypeTag());
         }
 
-        caster.castList(accessor, arg.first, resultType, this);
+        caster.castList(accessor, castResult.getOutPointable(), resultType, this);
         return null;
     }
 
     @Override
-    public Void visit(ARecordVisitablePointable accessor, Triple<IVisitablePointable, IAType, Boolean> arg)
-            throws HyracksDataException {
+    public Void visit(ARecordVisitablePointable accessor, CastResult castResult) throws HyracksDataException {
         ARecordCaster caster = raccessorToCaster.get(accessor);
         if (caster == null) {
             caster = new ARecordCaster();
@@ -113,47 +111,48 @@
         }
 
         ARecordType resultType;
-        switch (arg.second.getTypeTag()) {
+        IAType oType = castResult.getOutType();
+        switch (oType.getTypeTag()) {
             case ANY:
                 resultType = DefaultOpenFieldType.NESTED_OPEN_RECORD_TYPE;
                 break;
             case OBJECT:
-                resultType = (ARecordType) arg.second;
+                resultType = (ARecordType) oType;
                 break;
             default:
-                throw new RuntimeDataException(ErrorCode.TYPE_CONVERT, sourceLoc, ATypeTag.OBJECT,
-                        arg.second.getTypeTag());
+                throw new RuntimeDataException(ErrorCode.TYPE_CONVERT, sourceLoc, ATypeTag.OBJECT, oType.getTypeTag());
         }
 
-        caster.castRecord(accessor, arg.first, resultType, this);
+        caster.castRecord(accessor, castResult.getOutPointable(), resultType, this);
         return null;
     }
 
     @Override
-    public Void visit(AFlatValuePointable accessor, Triple<IVisitablePointable, IAType, Boolean> arg)
-            throws HyracksDataException {
-        if (arg.second == null) {
+    public Void visit(AFlatValuePointable accessor, CastResult castResult) throws HyracksDataException {
+        IAType oType = castResult.getOutType();
+        IPointable outPointable = castResult.getOutPointable();
+        if (oType == null) {
             // for open type case
-            arg.first.set(accessor);
+            outPointable.set(accessor);
             return null;
         }
         // set the pointer for result
-        ATypeTag reqTypeTag = (arg.second).getTypeTag();
+        ATypeTag reqTypeTag = oType.getTypeTag();
         if (reqTypeTag == ATypeTag.ANY) {
             // for open type case
-            arg.first.set(accessor);
+            outPointable.set(accessor);
             return null;
         }
         ATypeTag inputTypeTag =
                 EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(accessor.getByteArray()[accessor.getStartOffset()]);
         if (!needPromote(inputTypeTag, reqTypeTag)) {
-            arg.first.set(accessor);
+            outPointable.set(accessor);
         } else {
             try {
                 castBuffer.reset();
                 ATypeHierarchy.convertNumericTypeByteArray(accessor.getByteArray(), accessor.getStartOffset(),
                         accessor.getLength(), reqTypeTag, castBuffer.getDataOutput(), strictDemote);
-                arg.first.set(castBuffer);
+                outPointable.set(castBuffer);
             } catch (HyracksDataException e) {
                 throw e;
             } catch (IOException e) {
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/cast/AListCaster.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/cast/AListCaster.java
index 492a9d3..96c7db1 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/cast/AListCaster.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/cast/AListCaster.java
@@ -26,7 +26,6 @@
 import org.apache.asterix.builders.OrderedListBuilder;
 import org.apache.asterix.builders.UnorderedListBuilder;
 import org.apache.asterix.om.pointables.AListVisitablePointable;
-import org.apache.asterix.om.pointables.PointableAllocator;
 import org.apache.asterix.om.pointables.base.DefaultOpenFieldType;
 import org.apache.asterix.om.pointables.base.IVisitablePointable;
 import org.apache.asterix.om.types.ATypeTag;
@@ -34,8 +33,9 @@
 import org.apache.asterix.om.types.EnumDeserializer;
 import org.apache.asterix.om.types.IAType;
 import org.apache.asterix.om.utils.ResettableByteArrayOutputStream;
-import org.apache.hyracks.algebricks.common.utils.Triple;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.data.std.api.IPointable;
+import org.apache.hyracks.data.std.primitive.VoidPointable;
 
 /**
  * This class is to do the runtime type cast for a list. It is ONLY visible to
@@ -43,20 +43,15 @@
  */
 class AListCaster {
 
-    // for storing the cast result
-    private final IVisitablePointable itemTempReference = PointableAllocator.allocateUnrestableEmpty();
-    private final Triple<IVisitablePointable, IAType, Boolean> itemVisitorArg =
-            new Triple<>(itemTempReference, null, null);
-
+    private final CastResult itemCastResult = new CastResult(new VoidPointable(), null);
     private final UnorderedListBuilder unOrderedListBuilder = new UnorderedListBuilder();
     private final OrderedListBuilder orderedListBuilder = new OrderedListBuilder();
-
     private final ResettableByteArrayOutputStream dataBos = new ResettableByteArrayOutputStream();
     private final DataOutput dataDos = new DataOutputStream(dataBos);
     private IAType reqItemType;
 
-    public void castList(AListVisitablePointable listAccessor, IVisitablePointable resultAccessor,
-            AbstractCollectionType reqType, ACastVisitor visitor) throws HyracksDataException {
+    public void castList(AListVisitablePointable listAccessor, IPointable castOutResult, AbstractCollectionType reqType,
+            ACastVisitor visitor) throws HyracksDataException {
         if (reqType.getTypeTag().equals(ATypeTag.MULTISET)) {
             unOrderedListBuilder.reset(reqType);
             reqItemType = reqType.getItemType();
@@ -77,16 +72,16 @@
             ATypeTag typeTag = EnumDeserializer.ATYPETAGDESERIALIZER
                     .deserialize(itemTypeTag.getByteArray()[itemTypeTag.getStartOffset()]);
             if (reqItemType == null || reqItemType.getTypeTag().equals(ATypeTag.ANY)) {
-                itemVisitorArg.second = DefaultOpenFieldType.getDefaultOpenFieldType(typeTag);
+                itemCastResult.setOutType(DefaultOpenFieldType.getDefaultOpenFieldType(typeTag));
             } else {
-                itemVisitorArg.second = reqItemType;
+                itemCastResult.setOutType(reqItemType);
             }
-            item.accept(visitor, itemVisitorArg);
+            item.accept(visitor, itemCastResult);
             if (reqType.getTypeTag().equals(ATypeTag.ARRAY)) {
-                orderedListBuilder.addItem(itemVisitorArg.first);
+                orderedListBuilder.addItem(itemCastResult.getOutPointable());
             }
             if (reqType.getTypeTag().equals(ATypeTag.MULTISET)) {
-                unOrderedListBuilder.addItem(itemVisitorArg.first);
+                unOrderedListBuilder.addItem(itemCastResult.getOutPointable());
             }
         }
         if (reqType.getTypeTag().equals(ATypeTag.ARRAY)) {
@@ -96,6 +91,6 @@
             unOrderedListBuilder.write(dataDos, true);
         }
         int end = dataBos.size();
-        resultAccessor.set(dataBos.getByteArray(), start, end - start);
+        castOutResult.set(dataBos.getByteArray(), start, end - start);
     }
 }
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/cast/ARecordCaster.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/cast/ARecordCaster.java
index c6e1423..6dda563 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/cast/ARecordCaster.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/cast/ARecordCaster.java
@@ -45,11 +45,12 @@
 import org.apache.asterix.om.utils.NonTaggedFormatUtil;
 import org.apache.asterix.om.utils.ResettableByteArrayOutputStream;
 import org.apache.hyracks.algebricks.common.utils.Pair;
-import org.apache.hyracks.algebricks.common.utils.Triple;
 import org.apache.hyracks.api.dataflow.value.IBinaryComparator;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.data.std.accessors.UTF8StringBinaryComparatorFactory;
+import org.apache.hyracks.data.std.api.IPointable;
 import org.apache.hyracks.data.std.api.IValueReference;
+import org.apache.hyracks.data.std.primitive.VoidPointable;
 import org.apache.hyracks.data.std.util.ByteArrayAccessibleOutputStream;
 import org.apache.hyracks.util.string.UTF8StringWriter;
 
@@ -73,9 +74,7 @@
             UTF8StringBinaryComparatorFactory.INSTANCE.createBinaryComparator();
     private final ByteArrayAccessibleOutputStream outputBos = new ByteArrayAccessibleOutputStream();
     private final DataOutputStream outputDos = new DataOutputStream(outputBos);
-    private final IVisitablePointable fieldTempReference = PointableAllocator.allocateUnrestableEmpty();
-    private final Triple<IVisitablePointable, IAType, Boolean> nestedVisitorArg =
-            new Triple<>(fieldTempReference, null, null);
+    private final CastResult fieldCastResult = new CastResult(new VoidPointable(), null);
     private int numInputFields = 0;
     // describe closed fields in the required type
     private int[] fieldPermutation;
@@ -102,8 +101,8 @@
         }
     }
 
-    public void castRecord(ARecordVisitablePointable recordAccessor, IVisitablePointable resultAccessor,
-            ARecordType reqType, ACastVisitor visitor) throws HyracksDataException {
+    public void castRecord(ARecordVisitablePointable recordAccessor, IPointable castOutResult, ARecordType reqType,
+            ACastVisitor visitor) throws HyracksDataException {
         List<IVisitablePointable> fieldNames = recordAccessor.getFieldNames();
         List<IVisitablePointable> fieldTypeTags = recordAccessor.getFieldTypeTags();
         List<IVisitablePointable> fieldValues = recordAccessor.getFieldValues();
@@ -125,7 +124,7 @@
         reset();
         matchClosedPart(fieldNames, fieldTypeTags);
         writeOutput(fieldNames, fieldTypeTags, fieldValues, outputDos, visitor);
-        resultAccessor.set(outputBos.getByteArray(), 0, outputBos.size());
+        castOutResult.set(outputBos.getByteArray(), 0, outputBos.size());
     }
 
     private void reset() {
@@ -289,7 +288,7 @@
             final int pos = fieldPermutation[i];
             final IVisitablePointable field = pos >= 0 ? fieldValues.get(pos) : missingTypeTag;
             final IAType fType = cachedReqType.getFieldTypes()[i];
-            nestedVisitorArg.second = fType;
+            fieldCastResult.setOutType(fType);
 
             // recursively casting, the result of casting can always be thought
             // as flat
@@ -297,15 +296,15 @@
                 //the field is optional in the input record
                 IVisitablePointable fieldTypeTag = pos >= 0 ? fieldTypeTags.get(pos) : null;
                 if (fieldTypeTag == null || fieldTypeTag.equals(missingTypeTag)) {
-                    nestedVisitorArg.second = BuiltinType.AMISSING;
+                    fieldCastResult.setOutType(BuiltinType.AMISSING);
                 } else if (fieldTypeTag.equals(nullTypeTag)) {
-                    nestedVisitorArg.second = BuiltinType.ANULL;
+                    fieldCastResult.setOutType(BuiltinType.ANULL);
                 } else {
-                    nestedVisitorArg.second = ((AUnionType) fType).getActualType();
+                    fieldCastResult.setOutType(((AUnionType) fType).getActualType());
                 }
             }
-            field.accept(visitor, nestedVisitorArg);
-            recBuilder.addField(i, nestedVisitorArg.first);
+            field.accept(visitor, fieldCastResult);
+            recBuilder.addField(i, fieldCastResult.getOutPointable());
         }
 
         // write the open part
@@ -317,9 +316,9 @@
 
                 ATypeTag typeTag = EnumDeserializer.ATYPETAGDESERIALIZER
                         .deserialize(fieldTypeTag.getByteArray()[fieldTypeTag.getStartOffset()]);
-                nestedVisitorArg.second = DefaultOpenFieldType.getDefaultOpenFieldType(typeTag);
-                field.accept(visitor, nestedVisitorArg);
-                recBuilder.addField(name, nestedVisitorArg.first);
+                fieldCastResult.setOutType(DefaultOpenFieldType.getDefaultOpenFieldType(typeTag));
+                field.accept(visitor, fieldCastResult);
+                recBuilder.addField(name, fieldCastResult.getOutPointable());
             }
         }
         recBuilder.write(output, true);
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/cast/CastResult.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/cast/CastResult.java
new file mode 100644
index 0000000..cc156aa
--- /dev/null
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/cast/CastResult.java
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.asterix.om.pointables.cast;
+
+import org.apache.asterix.om.types.IAType;
+import org.apache.hyracks.data.std.api.IPointable;
+
+public class CastResult {
+
+    private IPointable outPointable;
+    private IAType outType;
+
+    public CastResult(IPointable outPointable, IAType outType) {
+        this.outPointable = outPointable;
+        this.outType = outType;
+    }
+
+    public IPointable getOutPointable() {
+        return outPointable;
+    }
+
+    public void setOutPointable(IPointable outPointable) {
+        this.outPointable = outPointable;
+    }
+
+    public IAType getOutType() {
+        return outType;
+    }
+
+    public void setOutType(IAType outType) {
+        this.outType = outType;
+    }
+}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/aggregates/collections/ListifyAggregateFunctionEvalFactory.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/aggregates/collections/ListifyAggregateFunctionEvalFactory.java
index 838285c..2518d5d 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/aggregates/collections/ListifyAggregateFunctionEvalFactory.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/aggregates/collections/ListifyAggregateFunctionEvalFactory.java
@@ -67,7 +67,7 @@
             // create caster to open up input item if the list item type is ANY but the received item is not fully open
             private final CastTypeEvaluator caster =
                     orderedListType.getItemType().getTypeTag() == ATypeTag.ANY && !TypeHelper.isFullyOpen(itemType)
-                            ? new CastTypeEvaluator(BuiltinType.ANY, itemType, eval) : null;
+                            ? new CastTypeEvaluator(BuiltinType.ANY, itemType, eval, sourceLoc) : null;
 
             @Override
             public void init() throws HyracksDataException {
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractArrayAddRemoveEval.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractArrayAddRemoveEval.java
index 175ec0e..f65bf30 100755
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractArrayAddRemoveEval.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractArrayAddRemoveEval.java
@@ -71,7 +71,7 @@
         orderedListBuilder = null;
         unorderedListBuilder = null;
         listAccessor = new ListAccessor();
-        caster = new CastTypeEvaluator();
+        caster = new CastTypeEvaluator(null);
         storage = new ArrayBackedValueStorage();
         listArg = new VoidPointable();
         tempList = new VoidPointable();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractArrayProcessArraysEval.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractArrayProcessArraysEval.java
index ddcb113..052b79d 100755
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractArrayProcessArraysEval.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractArrayProcessArraysEval.java
@@ -68,7 +68,7 @@
         storageAllocator = new ListObjectPool<>(ObjectFactories.STORAGE_FACTORY);
         finalResult = new ArrayBackedValueStorage();
         listAccessor = new ListAccessor();
-        caster = new CastTypeEvaluator();
+        caster = new CastTypeEvaluator(null);
         tempList = new VoidPointable();
         listsArgs = new IPointable[args.length];
         listsEval = new IScalarEvaluator[args.length];
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayFlattenDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayFlattenDescriptor.java
index 2b4e210..72d6c3d 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayFlattenDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayFlattenDescriptor.java
@@ -141,7 +141,7 @@
             depthEval = args[1].createScalarEvaluator(ctx);
             list = new VoidPointable();
             pointable = new VoidPointable();
-            caster = new CastTypeEvaluator();
+            caster = new CastTypeEvaluator(null);
             depthArg = new TaggedValuePointable();
             orderedListBuilder = null;
             unorderedListBuilder = null;
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayIntersectDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayIntersectDescriptor.java
index ac192ef..c33222d 100755
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayIntersectDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayIntersectDescriptor.java
@@ -194,7 +194,7 @@
             hashes = new Int2ObjectOpenHashMap<>();
             finalResult = new ArrayBackedValueStorage();
             listAccessor = new ListAccessor();
-            caster = new CastTypeEvaluator();
+            caster = new CastTypeEvaluator(null);
             // for functions that accept multiple lists arguments, they will be casted to open, hence item is ANY
             comp = BinaryComparatorFactoryProvider.INSTANCE
                     .getBinaryComparatorFactory(BuiltinType.ANY, BuiltinType.ANY, true).createBinaryComparator();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayReplaceEvaluator.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayReplaceEvaluator.java
index 329fa78..aeda168 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayReplaceEvaluator.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayReplaceEvaluator.java
@@ -108,7 +108,7 @@
         tempVal = new VoidPointable();
         item = new VoidPointable();
         listAccessor = new ListAccessor();
-        caster = new CastTypeEvaluator();
+        caster = new CastTypeEvaluator(null);
         orderedListBuilder = null;
         unorderedListBuilder = null;
 
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayStarDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayStarDescriptor.java
index f6d8d12..78d8d36 100755
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayStarDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayStarDescriptor.java
@@ -198,7 +198,7 @@
             list = new VoidPointable();
             tempList = new VoidPointable();
             listEval = args[0].createScalarEvaluator(ctx);
-            caster = new CastTypeEvaluator();
+            caster = new CastTypeEvaluator(null);
             listAccessor = new ListAccessor();
             recordBuilder = new RecordBuilder();
             listBuilder = new OrderedListBuilder();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CastTypeEvaluator.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CastTypeEvaluator.java
index 210149c..eb5275a 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CastTypeEvaluator.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CastTypeEvaluator.java
@@ -23,10 +23,10 @@
 import org.apache.asterix.om.pointables.base.DefaultOpenFieldType;
 import org.apache.asterix.om.pointables.base.IVisitablePointable;
 import org.apache.asterix.om.pointables.cast.ACastVisitor;
+import org.apache.asterix.om.pointables.cast.CastResult;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.om.types.IAType;
-import org.apache.hyracks.algebricks.common.utils.Triple;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.api.exceptions.SourceLocation;
@@ -41,24 +41,14 @@
     private final IPointable argPointable = new VoidPointable();
     private final PointableAllocator allocator = new PointableAllocator();
     private IVisitablePointable inputPointable;
-    private IVisitablePointable resultPointable;
     private final ACastVisitor castVisitor = createCastVisitor();
-    private final Triple<IVisitablePointable, IAType, Boolean> arg = new Triple<>(null, null, null);
-
-    public CastTypeEvaluator() {
-        this(null);
-        // reset() should be called after using this constructor before calling any method
-    }
+    private final CastResult castResult = new CastResult(new VoidPointable(), null);
 
     public CastTypeEvaluator(SourceLocation sourceLoc) {
         this.sourceLoc = sourceLoc;
         // reset() should be called after using this constructor before calling any method
     }
 
-    public CastTypeEvaluator(IAType reqType, IAType inputType, IScalarEvaluator argEvaluator) {
-        this(reqType, inputType, argEvaluator, null);
-    }
-
     public CastTypeEvaluator(IAType reqType, IAType inputType, IScalarEvaluator argEvaluator,
             SourceLocation sourceLoc) {
         this.sourceLoc = sourceLoc;
@@ -68,10 +58,7 @@
     public void resetAndAllocate(IAType reqType, IAType inputType, IScalarEvaluator argEvaluator) {
         this.argEvaluator = argEvaluator;
         this.inputPointable = allocatePointable(inputType, reqType);
-        this.resultPointable = allocatePointable(reqType, inputType);
-        this.arg.first = resultPointable;
-        this.arg.second = reqType;
-        this.arg.third = Boolean.FALSE;
+        this.castResult.setOutType(reqType);
     }
 
     protected ACastVisitor createCastVisitor() {
@@ -86,19 +73,18 @@
             return;
         }
 
-        inputPointable.set(argPointable);
-        cast(result);
+        cast(argPointable, result);
     }
 
-    protected void cast(IPointable result) throws HyracksDataException {
-        inputPointable.accept(castVisitor, arg);
-        result.set(resultPointable);
-    }
-
-    // TODO: refactor in a better way
+    // TODO(ali): refactor in a better way
     protected void cast(IPointable argPointable, IPointable result) throws HyracksDataException {
         inputPointable.set(argPointable);
-        cast(result);
+        castInto(result);
+    }
+
+    protected void castInto(IPointable result) throws HyracksDataException {
+        inputPointable.accept(castVisitor, castResult);
+        result.set(castResult.getOutPointable());
     }
 
     // Allocates the result pointable.
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CastTypeLaxEvaluator.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CastTypeLaxEvaluator.java
index be74580..56035a5 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CastTypeLaxEvaluator.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CastTypeLaxEvaluator.java
@@ -46,9 +46,9 @@
     }
 
     @Override
-    protected void cast(IPointable result) {
+    protected void castInto(IPointable result) {
         try {
-            super.cast(result);
+            super.castInto(result);
         } catch (HyracksDataException e) {
             if (LOGGER.isTraceEnabled()) {
                 LOGGER.log(Level.TRACE, e.toString(), e);
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ToObjectVarStrDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ToObjectVarStrDescriptor.java
index 6b72fc9..f9cf5a0 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ToObjectVarStrDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ToObjectVarStrDescriptor.java
@@ -29,15 +29,14 @@
 import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.functions.IFunctionTypeInferer;
 import org.apache.asterix.om.pointables.ARecordVisitablePointable;
-import org.apache.asterix.om.pointables.base.IVisitablePointable;
 import org.apache.asterix.om.pointables.cast.ACastVisitor;
+import org.apache.asterix.om.pointables.cast.CastResult;
 import org.apache.asterix.om.types.ARecordType;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.IAType;
 import org.apache.asterix.om.types.TypeHelper;
 import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
 import org.apache.asterix.runtime.functions.FunctionTypeInferers;
-import org.apache.hyracks.algebricks.common.utils.Triple;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
 import org.apache.hyracks.algebricks.runtime.base.IEvaluatorContext;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
@@ -95,7 +94,7 @@
                 private final ARecordVisitablePointable argRec;
                 private final boolean castRequired;
                 private ACastVisitor castVisitor;
-                private Triple<IVisitablePointable, IAType, Boolean> castVisitorArg;
+                private CastResult castResult;
                 private boolean wroteEmpty;
 
                 private ToObjectVarStrEvaluator(final IEvaluatorContext ctx) throws HyracksDataException {
@@ -103,9 +102,8 @@
                     if (!TypeHelper.isFullyOpen(argType) && TypeHelper.isFullyOpen(outType)) {
                         castRequired = true;
                         argRec = new ARecordVisitablePointable(argType);
-                        ARecordVisitablePointable openRec = new ARecordVisitablePointable(NESTED_OPEN_RECORD_TYPE);
                         castVisitor = new ACastVisitor();
-                        castVisitorArg = new Triple<>(openRec, openRec.getInputRecordType(), Boolean.FALSE);
+                        castResult = new CastResult(new VoidPointable(), NESTED_OPEN_RECORD_TYPE);
                     } else {
                         castRequired = false;
                         argRec = null;
@@ -119,8 +117,8 @@
                     if (arg0.getByteArray()[arg0.getStartOffset()] == ATypeTag.SERIALIZED_RECORD_TYPE_TAG) {
                         if (castRequired) {
                             argRec.set(arg0);
-                            argRec.accept(castVisitor, castVisitorArg);
-                            resultPointable.set(castVisitorArg.first);
+                            argRec.accept(castVisitor, castResult);
+                            resultPointable.set(castResult.getOutPointable());
                         } else {
                             resultPointable.set(arg0);
                         }
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/AbstractRecordPairsEvaluator.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/AbstractRecordPairsEvaluator.java
index e324230..974d621 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/AbstractRecordPairsEvaluator.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/AbstractRecordPairsEvaluator.java
@@ -43,7 +43,7 @@
     AbstractRecordPairsEvaluator(IScalarEvaluator eval0, IAType inputType) {
         this.eval0 = eval0;
         if (inputType != null) {
-            inputCaster = new CastTypeEvaluator(BuiltinType.ANY, inputType, eval0);
+            inputCaster = new CastTypeEvaluator(BuiltinType.ANY, inputType, eval0, null);
         }
     }
 
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordConcatEvalFactory.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordConcatEvalFactory.java
index 890bb13..68e089b 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordConcatEvalFactory.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordConcatEvalFactory.java
@@ -31,13 +31,13 @@
 import org.apache.asterix.om.pointables.base.DefaultOpenFieldType;
 import org.apache.asterix.om.pointables.base.IVisitablePointable;
 import org.apache.asterix.om.pointables.cast.ACastVisitor;
+import org.apache.asterix.om.pointables.cast.CastResult;
 import org.apache.asterix.om.types.ARecordType;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.IAType;
 import org.apache.asterix.runtime.evaluators.common.ListAccessor;
 import org.apache.asterix.runtime.evaluators.functions.BinaryHashMap;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
-import org.apache.hyracks.algebricks.common.utils.Triple;
 import org.apache.hyracks.algebricks.runtime.base.IEvaluatorContext;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
@@ -100,11 +100,11 @@
         private final IScalarEvaluator[] argEvals;
         private IPointable[] argPointables;
         private ARecordVisitablePointable[] argRecordPointables;
-        private final ARecordVisitablePointable openRecordPointable;
+        private final ARecordVisitablePointable openRecord;
 
         private final BitSet castRequired;
         private ACastVisitor castVisitor;
-        private Triple<IVisitablePointable, IAType, Boolean> castVisitorArg;
+        private CastResult castResult;
 
         private final RecordBuilder outRecordBuilder;
         private final ArrayBackedValueStorage resultStorage;
@@ -123,12 +123,12 @@
             this.warningCollector = warningCollector;
 
             firstArg = new VoidPointable();
-            openRecordPointable = new ARecordVisitablePointable(DefaultOpenFieldType.NESTED_OPEN_RECORD_TYPE);
+            openRecord = new ARecordVisitablePointable(DefaultOpenFieldType.NESTED_OPEN_RECORD_TYPE);
 
             resultStorage = new ArrayBackedValueStorage();
             resultOutput = resultStorage.getDataOutput();
             outRecordBuilder = new RecordBuilder();
-            outRecordBuilder.reset(openRecordPointable.getInputRecordType());
+            outRecordBuilder.reset(openRecord.getInputRecordType());
 
             fieldMap = new BinaryHashMap(TABLE_SIZE, TABLE_FRAME_SIZE, outRecordBuilder.getFieldNameHashFunction(),
                     outRecordBuilder.getFieldNameHashFunction(), outRecordBuilder.getFieldNameComparator());
@@ -166,8 +166,7 @@
         private void initCastVisitor() {
             if (castVisitor == null) {
                 castVisitor = new ACastVisitor();
-                castVisitorArg =
-                        new Triple<>(openRecordPointable, openRecordPointable.getInputRecordType(), Boolean.FALSE);
+                castResult = new CastResult(openRecord, openRecord.getInputRecordType());
             }
         }
 
@@ -300,14 +299,14 @@
             if (argVisitablePointable != null) {
                 argVisitablePointable.set(recordPtr);
                 if (argCastRequired) {
-                    argVisitablePointable.accept(castVisitor, castVisitorArg);
-                    recordPointable = openRecordPointable;
+                    argVisitablePointable.accept(castVisitor, castResult);
+                    recordPointable = openRecord;
                 } else {
                     recordPointable = argVisitablePointable;
                 }
             } else {
-                openRecordPointable.set(recordPtr);
-                recordPointable = openRecordPointable;
+                openRecord.set(recordPtr);
+                recordPointable = openRecord;
             }
 
             List<IVisitablePointable> fieldNames = recordPointable.getFieldNames();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordReplaceEvaluator.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordReplaceEvaluator.java
index 550a84e..b2b8500 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordReplaceEvaluator.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordReplaceEvaluator.java
@@ -62,8 +62,8 @@
         this.eval1 = eval1;
         this.eval2 = eval2;
         openRecordPointable = new ARecordVisitablePointable(DefaultOpenFieldType.NESTED_OPEN_RECORD_TYPE);
-        inputRecordCaster = new CastTypeEvaluator(BuiltinType.ANY, argTypes[0], eval0);
-        newValueRecordCaster = new CastTypeEvaluator(BuiltinType.ANY, argTypes[2], eval2);
+        inputRecordCaster = new CastTypeEvaluator(BuiltinType.ANY, argTypes[0], eval0, null);
+        newValueRecordCaster = new CastTypeEvaluator(BuiltinType.ANY, argTypes[2], eval2, null);
         // comp compares a value existing in the input record with the provided value. the input record is casted open
         comp = BinaryComparatorFactoryProvider.INSTANCE.getBinaryComparatorFactory(BuiltinType.ANY, argTypes[1], true)
                 .createBinaryComparator();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordUnwrapEvaluator.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordUnwrapEvaluator.java
index 522aa54..329f5b2 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordUnwrapEvaluator.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordUnwrapEvaluator.java
@@ -27,11 +27,11 @@
 import org.apache.asterix.om.pointables.base.DefaultOpenFieldType;
 import org.apache.asterix.om.pointables.base.IVisitablePointable;
 import org.apache.asterix.om.pointables.cast.ACastVisitor;
+import org.apache.asterix.om.pointables.cast.CastResult;
 import org.apache.asterix.om.types.ARecordType;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.IAType;
 import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
-import org.apache.hyracks.algebricks.common.utils.Triple;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.data.std.api.IPointable;
@@ -44,23 +44,22 @@
     private final IPointable inputRecordPointable = new VoidPointable();
     private final IScalarEvaluator eval0;
     private ARecordVisitablePointable inputRecordVisitable;
-    private ARecordVisitablePointable openRecordVisitablePointable;
+    private final ARecordVisitablePointable openRecord;
     private boolean requiresCast = false;
     private ACastVisitor castVisitor;
-    private Triple<IVisitablePointable, IAType, Boolean> castVisitorArg;
+    private CastResult castResult;
     private final ArrayBackedValueStorage resultStorage = new ArrayBackedValueStorage();
     private final DataOutput resultOutput = resultStorage.getDataOutput();
 
     RecordUnwrapEvaluator(IScalarEvaluator eval0, ARecordType recordType) {
         this.eval0 = eval0;
-        openRecordVisitablePointable = new ARecordVisitablePointable(DefaultOpenFieldType.NESTED_OPEN_RECORD_TYPE);
+        openRecord = new ARecordVisitablePointable(DefaultOpenFieldType.NESTED_OPEN_RECORD_TYPE);
         if (recordType != null) {
             inputRecordVisitable = new ARecordVisitablePointable(recordType);
             if (hasDerivedType(recordType.getFieldTypes())) {
                 requiresCast = true;
                 castVisitor = new ACastVisitor();
-                castVisitorArg = new Triple<>(openRecordVisitablePointable,
-                        openRecordVisitablePointable.getInputRecordType(), Boolean.FALSE);
+                castResult = new CastResult(openRecord, openRecord.getInputRecordType());
             }
         }
     }
@@ -109,8 +108,8 @@
     }
 
     private ARecordVisitablePointable castToOpenRecord() throws HyracksDataException {
-        inputRecordVisitable.accept(castVisitor, castVisitorArg);
-        return openRecordVisitablePointable;
+        inputRecordVisitable.accept(castVisitor, castResult);
+        return openRecord;
     }
 
     private void writeValue(IVisitablePointable value) throws HyracksDataException {
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordValuesEvaluator.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordValuesEvaluator.java
index 106a899..5e179f6 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordValuesEvaluator.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordValuesEvaluator.java
@@ -60,7 +60,7 @@
         if (recordType != null) {
             inputRecordOpen = recordType.isOpen() && recordType.getFieldTypes().length == 0;
             openRecordPointable = new ARecordVisitablePointable(DefaultOpenFieldType.NESTED_OPEN_RECORD_TYPE);
-            inputRecordCaster = new CastTypeEvaluator(BuiltinType.ANY, recordType, eval0);
+            inputRecordCaster = new CastTypeEvaluator(BuiltinType.ANY, recordType, eval0, null);
             listBuilder = new OrderedListBuilder();
         } else {
             inputRecordOpen = true;
